From 39cc3fec95f3782316910590bb86993918c9dcdf Mon Sep 17 00:00:00 2001 From: Karl Berry Date: Fri, 12 Jan 2018 18:35:28 +0000 Subject: icu-60.2 git-svn-id: svn://tug.org/texlive/trunk@46290 c570f23f-e606-0410-a88d-b1316a301751 --- Build/source/libs/README | 2 +- Build/source/libs/icu/ChangeLog | 4 + Build/source/libs/icu/TLpatches/TL-Changes | 27 +- Build/source/libs/icu/TLpatches/patch-14-xopen | 10 +- Build/source/libs/icu/TLpatches/patch-16-putil | 52 +- .../libs/icu/TLpatches/patch-17-cygwin-no-w32api | 3 + Build/source/libs/icu/TLpatches/patch-19-netbsd | 8 +- Build/source/libs/icu/configure | 20 +- Build/source/libs/icu/icu-src/APIChangeReport.html | 3089 +- Build/source/libs/icu/icu-src/LICENSE | 4 +- Build/source/libs/icu/icu-src/license.html | 4 +- Build/source/libs/icu/icu-src/readme.html | 248 +- Build/source/libs/icu/icu-src/source/Doxyfile.in | 2 +- Build/source/libs/icu/icu-src/source/Makefile.in | 17 +- .../libs/icu/icu-src/source/allinone/allinone.sln | 132 +- .../libs/icu/icu-src/source/allinone/icucheck.bat | 262 +- .../libs/icu/icu-src/source/common/Makefile.in | 5 +- .../libs/icu/icu-src/source/common/appendable.cpp | 4 +- .../libs/icu/icu-src/source/common/bmpset.cpp | 112 +- .../source/libs/icu/icu-src/source/common/bmpset.h | 19 +- .../libs/icu/icu-src/source/common/brkeng.cpp | 31 +- .../source/libs/icu/icu-src/source/common/brkeng.h | 15 +- .../libs/icu/icu-src/source/common/brkiter.cpp | 25 +- .../icu/icu-src/source/common/bytesinkutil.cpp | 123 + .../libs/icu/icu-src/source/common/bytesinkutil.h | 53 + .../libs/icu/icu-src/source/common/bytestream.cpp | 8 +- .../libs/icu/icu-src/source/common/bytestrie.cpp | 4 +- .../icu/icu-src/source/common/bytestriebuilder.cpp | 4 +- .../icu-src/source/common/bytestrieiterator.cpp | 4 +- .../libs/icu/icu-src/source/common/caniter.cpp | 8 +- .../libs/icu/icu-src/source/common/chariter.cpp | 2 +- .../libs/icu/icu-src/source/common/charstr.cpp | 5 +- .../libs/icu/icu-src/source/common/charstr.h | 2 +- .../libs/icu/icu-src/source/common/cmemory.c | 162 - .../libs/icu/icu-src/source/common/cmemory.cpp | 162 + .../libs/icu/icu-src/source/common/cmemory.h | 14 +- .../libs/icu/icu-src/source/common/common.vcxproj | 174 +- .../icu-src/source/common/common.vcxproj.filters | 126 +- .../icu/icu-src/source/common/common_uwp.vcxproj | 949 + .../libs/icu/icu-src/source/common/cpputils.h | 4 +- .../source/libs/icu/icu-src/source/common/cstr.cpp | 2 +- Build/source/libs/icu/icu-src/source/common/cstr.h | 2 +- .../libs/icu/icu-src/source/common/cstring.c | 341 - .../libs/icu/icu-src/source/common/cstring.cpp | 341 + .../libs/icu/icu-src/source/common/cstring.h | 2 +- .../source/libs/icu/icu-src/source/common/cwchar.c | 55 - .../libs/icu/icu-src/source/common/cwchar.cpp | 55 + .../source/libs/icu/icu-src/source/common/cwchar.h | 4 +- .../libs/icu/icu-src/source/common/dictbe.cpp | 76 +- .../source/libs/icu/icu-src/source/common/dictbe.h | 24 +- .../icu/icu-src/source/common/dictionarydata.cpp | 2 +- .../icu/icu-src/source/common/dictionarydata.h | 2 +- .../libs/icu/icu-src/source/common/dtintrv.cpp | 2 +- .../libs/icu/icu-src/source/common/edits.cpp | 776 + .../libs/icu/icu-src/source/common/errorcode.cpp | 4 +- .../libs/icu/icu-src/source/common/filteredbrk.cpp | 6 +- .../icu-src/source/common/filterednormalizer2.cpp | 77 +- Build/source/libs/icu/icu-src/source/common/hash.h | 50 +- .../libs/icu/icu-src/source/common/icudataver.c | 31 - .../libs/icu/icu-src/source/common/icudataver.cpp | 31 + .../libs/icu/icu-src/source/common/icuplug.cpp | 2 +- .../libs/icu/icu-src/source/common/icuplugimp.h | 2 +- .../icu/icu-src/source/common/listformatter.cpp | 130 +- .../source/common/loadednormalizer2impl.cpp | 7 +- .../libs/icu/icu-src/source/common/localsvc.h | 2 +- .../icu/icu-src/source/common/locavailable.cpp | 10 +- .../libs/icu/icu-src/source/common/locbased.cpp | 2 +- .../libs/icu/icu-src/source/common/locbased.h | 2 +- .../icu/icu-src/source/common/locdispnames.cpp | 12 +- .../libs/icu/icu-src/source/common/locdspnm.cpp | 8 +- .../libs/icu/icu-src/source/common/locid.cpp | 3 +- .../libs/icu/icu-src/source/common/loclikely.cpp | 9 +- .../source/libs/icu/icu-src/source/common/locmap.c | 1175 - .../libs/icu/icu-src/source/common/locmap.cpp | 1320 + .../source/libs/icu/icu-src/source/common/locmap.h | 5 +- .../libs/icu/icu-src/source/common/locresdata.cpp | 4 +- .../libs/icu/icu-src/source/common/locutil.cpp | 2 +- .../libs/icu/icu-src/source/common/locutil.h | 2 +- .../libs/icu/icu-src/source/common/messageimpl.h | 4 +- .../icu/icu-src/source/common/messagepattern.cpp | 4 +- .../libs/icu/icu-src/source/common/msvcres.h | 2 +- .../source/libs/icu/icu-src/source/common/mutex.h | 2 +- .../icu/icu-src/source/common/norm2_nfc_data.h | 1868 +- .../libs/icu/icu-src/source/common/norm2allmodes.h | 56 +- .../libs/icu/icu-src/source/common/normalizer2.cpp | 70 +- .../icu/icu-src/source/common/normalizer2impl.cpp | 1680 +- .../icu/icu-src/source/common/normalizer2impl.h | 310 +- .../libs/icu/icu-src/source/common/normlzr.cpp | 12 +- .../libs/icu/icu-src/source/common/parsepos.cpp | 2 +- .../icu/icu-src/source/common/patternprops.cpp | 4 +- .../libs/icu/icu-src/source/common/patternprops.h | 4 +- .../libs/icu/icu-src/source/common/pluralmap.cpp | 2 +- .../libs/icu/icu-src/source/common/pluralmap.h | 2 +- .../libs/icu/icu-src/source/common/propname.cpp | 2 +- .../libs/icu/icu-src/source/common/propname.h | 2 +- .../libs/icu/icu-src/source/common/propname_data.h | 1726 +- .../libs/icu/icu-src/source/common/propsvec.c | 527 - .../libs/icu/icu-src/source/common/propsvec.cpp | 529 + .../libs/icu/icu-src/source/common/propsvec.h | 4 +- .../libs/icu/icu-src/source/common/punycode.cpp | 4 +- .../libs/icu/icu-src/source/common/punycode.h | 4 +- .../libs/icu/icu-src/source/common/putil.cpp | 387 +- .../libs/icu/icu-src/source/common/putilimp.h | 43 +- .../source/libs/icu/icu-src/source/common/rbbi.cpp | 1036 +- .../libs/icu/icu-src/source/common/rbbi_cache.cpp | 630 + .../libs/icu/icu-src/source/common/rbbi_cache.h | 203 + .../libs/icu/icu-src/source/common/rbbidata.cpp | 78 +- .../libs/icu/icu-src/source/common/rbbidata.h | 21 +- .../libs/icu/icu-src/source/common/rbbinode.cpp | 2 +- .../libs/icu/icu-src/source/common/rbbinode.h | 2 +- .../libs/icu/icu-src/source/common/rbbirb.cpp | 68 +- .../source/libs/icu/icu-src/source/common/rbbirb.h | 8 +- .../libs/icu/icu-src/source/common/rbbirpt.h | 2 +- .../libs/icu/icu-src/source/common/rbbiscan.cpp | 14 +- .../libs/icu/icu-src/source/common/rbbiscan.h | 2 +- .../libs/icu/icu-src/source/common/rbbisetb.cpp | 94 +- .../libs/icu/icu-src/source/common/rbbisetb.h | 15 +- .../libs/icu/icu-src/source/common/rbbistbl.cpp | 2 +- .../libs/icu/icu-src/source/common/rbbitblb.cpp | 2 +- .../libs/icu/icu-src/source/common/rbbitblb.h | 2 +- .../libs/icu/icu-src/source/common/resbund.cpp | 2 +- .../libs/icu/icu-src/source/common/resbund_cnv.cpp | 4 +- .../libs/icu/icu-src/source/common/resource.cpp | 2 +- .../libs/icu/icu-src/source/common/resource.h | 2 +- .../libs/icu/icu-src/source/common/ruleiter.cpp | 2 +- .../libs/icu/icu-src/source/common/ruleiter.h | 2 +- .../libs/icu/icu-src/source/common/schriter.cpp | 2 +- .../source/libs/icu/icu-src/source/common/serv.cpp | 2 +- Build/source/libs/icu/icu-src/source/common/serv.h | 2 +- .../libs/icu/icu-src/source/common/servlk.cpp | 2 +- .../libs/icu/icu-src/source/common/servlkf.cpp | 2 +- .../libs/icu/icu-src/source/common/servloc.h | 2 +- .../libs/icu/icu-src/source/common/servls.cpp | 2 +- .../libs/icu/icu-src/source/common/servnotf.cpp | 2 +- .../libs/icu/icu-src/source/common/servnotf.h | 2 +- .../libs/icu/icu-src/source/common/servrbf.cpp | 2 +- .../libs/icu/icu-src/source/common/servslkf.cpp | 2 +- .../icu/icu-src/source/common/sharedobject.cpp | 2 +- .../libs/icu/icu-src/source/common/sharedobject.h | 2 +- .../icu/icu-src/source/common/simpleformatter.cpp | 2 +- .../libs/icu/icu-src/source/common/sprpimpl.h | 4 +- .../libs/icu/icu-src/source/common/stringpiece.cpp | 2 +- .../icu-src/source/common/stringtriebuilder.cpp | 4 +- .../libs/icu/icu-src/source/common/uarrsort.c | 285 - .../libs/icu/icu-src/source/common/uarrsort.cpp | 288 + .../libs/icu/icu-src/source/common/uarrsort.h | 4 +- .../libs/icu/icu-src/source/common/uassert.h | 2 +- .../source/libs/icu/icu-src/source/common/ubidi.c | 3015 -- .../libs/icu/icu-src/source/common/ubidi.cpp | 3042 ++ .../libs/icu/icu-src/source/common/ubidi_props.c | 265 - .../libs/icu/icu-src/source/common/ubidi_props.cpp | 267 + .../libs/icu/icu-src/source/common/ubidi_props.h | 4 +- .../icu/icu-src/source/common/ubidi_props_data.h | 879 +- .../libs/icu/icu-src/source/common/ubidiimp.h | 4 +- .../libs/icu/icu-src/source/common/ubidiln.c | 1349 - .../libs/icu/icu-src/source/common/ubidiln.cpp | 1349 + .../icu/icu-src/source/common/ubiditransform.c | 528 - .../icu/icu-src/source/common/ubiditransform.cpp | 530 + .../libs/icu/icu-src/source/common/ubidiwrt.c | 640 - .../libs/icu/icu-src/source/common/ubidiwrt.cpp | 640 + .../source/libs/icu/icu-src/source/common/ubrk.cpp | 62 +- .../libs/icu/icu-src/source/common/ubrkimpl.h | 2 +- .../libs/icu/icu-src/source/common/ucase.cpp | 372 +- .../source/libs/icu/icu-src/source/common/ucase.h | 73 +- .../icu/icu-src/source/common/ucase_props_data.h | 599 +- .../libs/icu/icu-src/source/common/ucasemap.cpp | 768 +- .../libs/icu/icu-src/source/common/ucasemap_imp.h | 291 + .../source/common/ucasemap_titlecase_brkiter.cpp | 99 +- Build/source/libs/icu/icu-src/source/common/ucat.c | 78 - .../source/libs/icu/icu-src/source/common/ucat.cpp | 78 + .../source/libs/icu/icu-src/source/common/uchar.c | 733 - .../libs/icu/icu-src/source/common/uchar.cpp | 733 + .../icu/icu-src/source/common/uchar_props_data.h | 6562 ++-- .../libs/icu/icu-src/source/common/ucharstrie.cpp | 7 +- .../icu-src/source/common/ucharstriebuilder.cpp | 6 +- .../icu-src/source/common/ucharstrieiterator.cpp | 6 +- .../libs/icu/icu-src/source/common/uchriter.cpp | 10 +- Build/source/libs/icu/icu-src/source/common/ucln.h | 4 +- .../libs/icu/icu-src/source/common/ucln_cmn.cpp | 4 +- .../libs/icu/icu-src/source/common/ucln_cmn.h | 6 +- .../libs/icu/icu-src/source/common/ucln_imp.h | 6 +- .../libs/icu/icu-src/source/common/ucmndata.c | 384 - .../libs/icu/icu-src/source/common/ucmndata.cpp | 389 + .../libs/icu/icu-src/source/common/ucmndata.h | 2 +- Build/source/libs/icu/icu-src/source/common/ucnv.c | 2918 -- .../source/libs/icu/icu-src/source/common/ucnv.cpp | 2918 ++ .../libs/icu/icu-src/source/common/ucnv2022.cpp | 4 +- .../libs/icu/icu-src/source/common/ucnv_bld.cpp | 2 +- .../libs/icu/icu-src/source/common/ucnv_bld.h | 2 +- .../libs/icu/icu-src/source/common/ucnv_cb.c | 261 - .../libs/icu/icu-src/source/common/ucnv_cb.cpp | 261 + .../libs/icu/icu-src/source/common/ucnv_cnv.c | 176 - .../libs/icu/icu-src/source/common/ucnv_cnv.cpp | 182 + .../libs/icu/icu-src/source/common/ucnv_cnv.h | 2 +- .../libs/icu/icu-src/source/common/ucnv_ct.c | 637 - .../libs/icu/icu-src/source/common/ucnv_ct.cpp | 646 + .../libs/icu/icu-src/source/common/ucnv_err.c | 481 - .../libs/icu/icu-src/source/common/ucnv_err.cpp | 496 + .../libs/icu/icu-src/source/common/ucnv_ext.cpp | 5 +- .../libs/icu/icu-src/source/common/ucnv_ext.h | 4 +- .../libs/icu/icu-src/source/common/ucnv_imp.h | 2 +- .../libs/icu/icu-src/source/common/ucnv_io.cpp | 2 +- .../libs/icu/icu-src/source/common/ucnv_io.h | 2 +- .../libs/icu/icu-src/source/common/ucnv_lmb.c | 1378 - .../libs/icu/icu-src/source/common/ucnv_lmb.cpp | 1386 + .../libs/icu/icu-src/source/common/ucnv_set.c | 70 - .../libs/icu/icu-src/source/common/ucnv_set.cpp | 70 + .../libs/icu/icu-src/source/common/ucnv_u16.c | 1563 - .../libs/icu/icu-src/source/common/ucnv_u16.cpp | 1579 + .../libs/icu/icu-src/source/common/ucnv_u32.c | 1251 - .../libs/icu/icu-src/source/common/ucnv_u32.cpp | 1253 + .../libs/icu/icu-src/source/common/ucnv_u7.c | 1484 - .../libs/icu/icu-src/source/common/ucnv_u7.cpp | 1491 + .../libs/icu/icu-src/source/common/ucnv_u8.c | 1098 - .../libs/icu/icu-src/source/common/ucnv_u8.cpp | 968 + .../libs/icu/icu-src/source/common/ucnvbocu.cpp | 4 +- .../libs/icu/icu-src/source/common/ucnvdisp.c | 88 - .../libs/icu/icu-src/source/common/ucnvdisp.cpp | 88 + .../source/libs/icu/icu-src/source/common/ucnvhz.c | 631 - .../libs/icu/icu-src/source/common/ucnvhz.cpp | 633 + .../libs/icu/icu-src/source/common/ucnvisci.c | 1625 - .../libs/icu/icu-src/source/common/ucnvisci.cpp | 1635 + .../libs/icu/icu-src/source/common/ucnvlat1.c | 740 - .../libs/icu/icu-src/source/common/ucnvlat1.cpp | 752 + .../libs/icu/icu-src/source/common/ucnvmbcs.cpp | 175 +- .../libs/icu/icu-src/source/common/ucnvmbcs.h | 4 +- .../libs/icu/icu-src/source/common/ucnvscsu.c | 2043 -- .../libs/icu/icu-src/source/common/ucnvscsu.cpp | 2045 ++ .../libs/icu/icu-src/source/common/ucnvsel.cpp | 2 +- .../libs/icu/icu-src/source/common/ucol_data.h | 4 +- .../libs/icu/icu-src/source/common/ucol_swp.cpp | 4 +- .../libs/icu/icu-src/source/common/ucol_swp.h | 4 +- .../libs/icu/icu-src/source/common/ucurr.cpp | 178 +- .../libs/icu/icu-src/source/common/ucurrimp.h | 2 +- .../libs/icu/icu-src/source/common/udata.cpp | 29 +- .../libs/icu/icu-src/source/common/udatamem.c | 161 - .../libs/icu/icu-src/source/common/udatamem.cpp | 161 + .../libs/icu/icu-src/source/common/udatamem.h | 2 +- .../libs/icu/icu-src/source/common/udataswp.c | 473 - .../libs/icu/icu-src/source/common/udataswp.cpp | 473 + .../libs/icu/icu-src/source/common/udataswp.h | 4 +- .../libs/icu/icu-src/source/common/uelement.h | 4 +- .../source/libs/icu/icu-src/source/common/uenum.c | 189 - .../libs/icu/icu-src/source/common/uenum.cpp | 189 + .../libs/icu/icu-src/source/common/uenumimp.h | 4 +- .../source/libs/icu/icu-src/source/common/uhash.c | 975 - .../libs/icu/icu-src/source/common/uhash.cpp | 991 + .../source/libs/icu/icu-src/source/common/uhash.h | 109 +- .../libs/icu/icu-src/source/common/uhash_us.cpp | 2 +- .../libs/icu/icu-src/source/common/uidna.cpp | 4 +- .../libs/icu/icu-src/source/common/uinit.cpp | 4 +- .../libs/icu/icu-src/source/common/uinvchar.c | 613 - .../libs/icu/icu-src/source/common/uinvchar.cpp | 615 + .../libs/icu/icu-src/source/common/uinvchar.h | 6 +- .../libs/icu/icu-src/source/common/uiter.cpp | 4 +- .../source/libs/icu/icu-src/source/common/ulist.c | 275 - .../libs/icu/icu-src/source/common/ulist.cpp | 270 + .../source/libs/icu/icu-src/source/common/ulist.h | 2 +- .../icu/icu-src/source/common/ulistformatter.cpp | 2 +- .../source/libs/icu/icu-src/source/common/uloc.cpp | 456 +- .../icu/icu-src/source/common/uloc_keytype.cpp | 2 +- .../libs/icu/icu-src/source/common/uloc_tag.c | 2531 -- .../libs/icu/icu-src/source/common/uloc_tag.cpp | 2532 ++ .../libs/icu/icu-src/source/common/ulocimp.h | 2 +- .../libs/icu/icu-src/source/common/umapfile.c | 466 - .../libs/icu/icu-src/source/common/umapfile.cpp | 498 + .../libs/icu/icu-src/source/common/umapfile.h | 2 +- .../source/libs/icu/icu-src/source/common/umath.c | 26 - .../libs/icu/icu-src/source/common/umath.cpp | 26 + .../libs/icu/icu-src/source/common/umutex.cpp | 4 +- .../source/libs/icu/icu-src/source/common/umutex.h | 8 +- .../libs/icu/icu-src/source/common/unames.cpp | 4 +- .../icu/icu-src/source/common/unicode/appendable.h | 50 +- .../icu/icu-src/source/common/unicode/brkiter.h | 28 +- .../icu/icu-src/source/common/unicode/bytestream.h | 39 +- .../icu/icu-src/source/common/unicode/bytestrie.h | 4 +- .../source/common/unicode/bytestriebuilder.h | 8 +- .../icu/icu-src/source/common/unicode/caniter.h | 6 +- .../icu/icu-src/source/common/unicode/casemap.h | 496 + .../icu/icu-src/source/common/unicode/char16ptr.h | 306 + .../icu/icu-src/source/common/unicode/chariter.h | 38 +- .../libs/icu/icu-src/source/common/unicode/dbbi.h | 2 +- .../icu/icu-src/source/common/unicode/docmain.h | 9 +- .../icu/icu-src/source/common/unicode/dtintrv.h | 2 +- .../libs/icu/icu-src/source/common/unicode/edits.h | 422 + .../icu/icu-src/source/common/unicode/enumset.h | 2 +- .../icu/icu-src/source/common/unicode/errorcode.h | 4 +- .../icu-src/source/common/unicode/filteredbrk.h | 44 +- .../icu/icu-src/source/common/unicode/icudataver.h | 2 +- .../icu/icu-src/source/common/unicode/icuplug.h | 2 +- .../libs/icu/icu-src/source/common/unicode/idna.h | 4 +- .../icu-src/source/common/unicode/listformatter.h | 6 +- .../icu-src/source/common/unicode/localpointer.h | 49 +- .../icu/icu-src/source/common/unicode/locdspnm.h | 3 +- .../libs/icu/icu-src/source/common/unicode/locid.h | 9 +- .../icu-src/source/common/unicode/messagepattern.h | 4 +- .../icu-src/source/common/unicode/normalizer2.h | 146 +- .../icu/icu-src/source/common/unicode/normlzr.h | 10 +- .../icu/icu-src/source/common/unicode/parseerr.h | 2 +- .../icu/icu-src/source/common/unicode/parsepos.h | 2 +- .../icu/icu-src/source/common/unicode/platform.h | 117 +- .../icu/icu-src/source/common/unicode/ptypes.h | 2 +- .../libs/icu/icu-src/source/common/unicode/putil.h | 2 +- .../libs/icu/icu-src/source/common/unicode/rbbi.h | 137 +- .../libs/icu/icu-src/source/common/unicode/rep.h | 8 +- .../icu/icu-src/source/common/unicode/resbund.h | 4 +- .../icu/icu-src/source/common/unicode/schriter.h | 4 +- .../source/common/unicode/simpleformatter.h | 56 +- .../icu/icu-src/source/common/unicode/std_string.h | 14 +- .../icu/icu-src/source/common/unicode/strenum.h | 10 +- .../icu-src/source/common/unicode/stringoptions.h | 198 + .../icu-src/source/common/unicode/stringpiece.h | 4 +- .../source/common/unicode/stringtriebuilder.h | 38 +- .../icu/icu-src/source/common/unicode/symtable.h | 2 +- .../libs/icu/icu-src/source/common/unicode/ubidi.h | 15 +- .../icu-src/source/common/unicode/ubiditransform.h | 35 +- .../libs/icu/icu-src/source/common/unicode/ubrk.h | 67 +- .../icu/icu-src/source/common/unicode/ucasemap.h | 54 +- .../libs/icu/icu-src/source/common/unicode/ucat.h | 2 +- .../libs/icu/icu-src/source/common/unicode/uchar.h | 92 +- .../icu/icu-src/source/common/unicode/ucharstrie.h | 96 +- .../source/common/unicode/ucharstriebuilder.h | 24 +- .../icu/icu-src/source/common/unicode/uchriter.h | 62 +- .../icu/icu-src/source/common/unicode/uclean.h | 12 +- .../libs/icu/icu-src/source/common/unicode/ucnv.h | 14 +- .../icu/icu-src/source/common/unicode/ucnv_cb.h | 2 +- .../icu/icu-src/source/common/unicode/ucnv_err.h | 2 +- .../icu/icu-src/source/common/unicode/ucnvsel.h | 2 +- .../icu/icu-src/source/common/unicode/uconfig.h | 13 +- .../libs/icu/icu-src/source/common/unicode/ucurr.h | 2 +- .../libs/icu/icu-src/source/common/unicode/udata.h | 4 +- .../source/common/unicode/udisplaycontext.h | 12 +- .../libs/icu/icu-src/source/common/unicode/uenum.h | 8 +- .../libs/icu/icu-src/source/common/unicode/uidna.h | 4 +- .../libs/icu/icu-src/source/common/unicode/uiter.h | 4 +- .../icu/icu-src/source/common/unicode/uldnames.h | 2 +- .../icu-src/source/common/unicode/ulistformatter.h | 8 +- .../libs/icu/icu-src/source/common/unicode/uloc.h | 45 +- .../icu/icu-src/source/common/unicode/umachine.h | 115 +- .../libs/icu/icu-src/source/common/unicode/umisc.h | 4 +- .../icu/icu-src/source/common/unicode/unifilt.h | 4 +- .../icu/icu-src/source/common/unicode/unifunct.h | 2 +- .../icu/icu-src/source/common/unicode/unimatch.h | 2 +- .../icu/icu-src/source/common/unicode/uniset.h | 8 +- .../icu/icu-src/source/common/unicode/unistr.h | 566 +- .../libs/icu/icu-src/source/common/unicode/unorm.h | 18 +- .../icu/icu-src/source/common/unicode/unorm2.h | 29 +- .../icu/icu-src/source/common/unicode/uobject.h | 4 +- .../icu/icu-src/source/common/unicode/urename.h | 32 +- .../libs/icu/icu-src/source/common/unicode/urep.h | 2 +- .../libs/icu/icu-src/source/common/unicode/ures.h | 2 +- .../icu/icu-src/source/common/unicode/uscript.h | 11 +- .../libs/icu/icu-src/source/common/unicode/uset.h | 4 +- .../icu/icu-src/source/common/unicode/usetiter.h | 2 +- .../icu/icu-src/source/common/unicode/ushape.h | 4 +- .../icu/icu-src/source/common/unicode/usprep.h | 4 +- .../icu/icu-src/source/common/unicode/ustring.h | 12 +- .../icu-src/source/common/unicode/ustringtrie.h | 4 +- .../libs/icu/icu-src/source/common/unicode/utext.h | 24 +- .../libs/icu/icu-src/source/common/unicode/utf.h | 38 +- .../libs/icu/icu-src/source/common/unicode/utf16.h | 136 +- .../libs/icu/icu-src/source/common/unicode/utf32.h | 4 +- .../libs/icu/icu-src/source/common/unicode/utf8.h | 170 +- .../icu/icu-src/source/common/unicode/utf_old.h | 47 +- .../icu/icu-src/source/common/unicode/utrace.h | 4 +- .../icu/icu-src/source/common/unicode/utypes.h | 6 +- .../icu/icu-src/source/common/unicode/uvernum.h | 14 +- .../icu/icu-src/source/common/unicode/uversion.h | 4 +- .../icu/icu-src/source/common/unifiedcache.cpp | 6 +- .../libs/icu/icu-src/source/common/unifiedcache.h | 4 +- .../libs/icu/icu-src/source/common/unifilt.cpp | 2 +- .../libs/icu/icu-src/source/common/unifunct.cpp | 2 +- .../libs/icu/icu-src/source/common/uniset.cpp | 2 +- .../icu/icu-src/source/common/uniset_closure.cpp | 18 +- .../icu/icu-src/source/common/uniset_props.cpp | 29 +- .../libs/icu/icu-src/source/common/unisetspan.cpp | 25 +- .../libs/icu/icu-src/source/common/unisetspan.h | 4 +- .../libs/icu/icu-src/source/common/unistr.cpp | 25 +- .../libs/icu/icu-src/source/common/unistr_case.cpp | 148 +- .../icu-src/source/common/unistr_case_locale.cpp | 40 +- .../libs/icu/icu-src/source/common/unistr_cnv.cpp | 4 +- .../icu/icu-src/source/common/unistr_props.cpp | 4 +- .../source/common/unistr_titlecase_brkiter.cpp | 71 +- .../icu/icu-src/source/common/unistrappender.h | 2 +- .../libs/icu/icu-src/source/common/unorm.cpp | 2 +- .../libs/icu/icu-src/source/common/unormcmp.cpp | 14 +- .../libs/icu/icu-src/source/common/unormimp.h | 4 +- .../libs/icu/icu-src/source/common/uobject.cpp | 4 +- .../libs/icu/icu-src/source/common/uposixdefs.h | 24 +- .../libs/icu/icu-src/source/common/uprops.cpp | 18 +- .../source/libs/icu/icu-src/source/common/uprops.h | 13 +- .../libs/icu/icu-src/source/common/ures_cnv.c | 78 - .../libs/icu/icu-src/source/common/ures_cnv.cpp | 78 + .../libs/icu/icu-src/source/common/uresbund.cpp | 3 +- .../libs/icu/icu-src/source/common/uresdata.cpp | 18 +- .../libs/icu/icu-src/source/common/uresdata.h | 4 +- .../libs/icu/icu-src/source/common/uresimp.h | 2 +- .../libs/icu/icu-src/source/common/ureslocs.h | 2 +- .../libs/icu/icu-src/source/common/usc_impl.c | 361 - .../libs/icu/icu-src/source/common/usc_impl.cpp | 361 + .../libs/icu/icu-src/source/common/usc_impl.h | 2 +- .../libs/icu/icu-src/source/common/uscript.c | 144 - .../libs/icu/icu-src/source/common/uscript.cpp | 144 + .../icu/icu-src/source/common/uscript_props.cpp | 21 +- .../source/libs/icu/icu-src/source/common/uset.cpp | 4 +- .../libs/icu/icu-src/source/common/uset_imp.h | 4 +- .../libs/icu/icu-src/source/common/uset_props.cpp | 4 +- .../libs/icu/icu-src/source/common/usetiter.cpp | 2 +- .../libs/icu/icu-src/source/common/ushape.cpp | 4 +- .../libs/icu/icu-src/source/common/usprep.cpp | 4 +- .../libs/icu/icu-src/source/common/ustack.cpp | 2 +- .../libs/icu/icu-src/source/common/ustr_cnv.cpp | 4 +- .../libs/icu/icu-src/source/common/ustr_cnv.h | 4 +- .../libs/icu/icu-src/source/common/ustr_imp.h | 285 +- .../source/common/ustr_titlecase_brkiter.cpp | 224 +- .../libs/icu/icu-src/source/common/ustr_wcs.cpp | 8 +- .../libs/icu/icu-src/source/common/ustrcase.cpp | 555 +- .../icu/icu-src/source/common/ustrcase_locale.cpp | 110 +- .../libs/icu/icu-src/source/common/ustrenum.cpp | 2 +- .../libs/icu/icu-src/source/common/ustrenum.h | 2 +- .../libs/icu/icu-src/source/common/ustrfmt.c | 59 - .../libs/icu/icu-src/source/common/ustrfmt.cpp | 59 + .../libs/icu/icu-src/source/common/ustrfmt.h | 2 +- .../libs/icu/icu-src/source/common/ustring.cpp | 3 +- .../libs/icu/icu-src/source/common/ustrtrns.cpp | 671 +- .../libs/icu/icu-src/source/common/utext.cpp | 25 +- .../libs/icu/icu-src/source/common/utf_impl.c | 328 - .../libs/icu/icu-src/source/common/utf_impl.cpp | 332 + .../source/libs/icu/icu-src/source/common/util.cpp | 2 +- Build/source/libs/icu/icu-src/source/common/util.h | 2 +- .../libs/icu/icu-src/source/common/util_props.cpp | 2 +- .../source/libs/icu/icu-src/source/common/utrace.c | 490 - .../libs/icu/icu-src/source/common/utrace.cpp | 493 + .../libs/icu/icu-src/source/common/utracimp.h | 18 +- .../libs/icu/icu-src/source/common/utrie.cpp | 4 +- .../source/libs/icu/icu-src/source/common/utrie.h | 4 +- .../libs/icu/icu-src/source/common/utrie2.cpp | 8 +- .../source/libs/icu/icu-src/source/common/utrie2.h | 42 +- .../icu/icu-src/source/common/utrie2_builder.cpp | 4 +- .../libs/icu/icu-src/source/common/utrie2_impl.h | 4 +- .../libs/icu/icu-src/source/common/uts46.cpp | 18 +- .../libs/icu/icu-src/source/common/utypeinfo.h | 4 +- .../source/libs/icu/icu-src/source/common/utypes.c | 224 - .../libs/icu/icu-src/source/common/utypes.cpp | 224 + .../libs/icu/icu-src/source/common/uvector.cpp | 2 +- .../libs/icu/icu-src/source/common/uvector.h | 2 +- .../libs/icu/icu-src/source/common/uvectr32.cpp | 2 +- .../libs/icu/icu-src/source/common/uvectr32.h | 2 +- .../libs/icu/icu-src/source/common/uvectr64.cpp | 2 +- .../libs/icu/icu-src/source/common/uvectr64.h | 2 +- .../source/libs/icu/icu-src/source/common/wintz.c | 441 - .../libs/icu/icu-src/source/common/wintz.cpp | 384 + .../source/libs/icu/icu-src/source/common/wintz.h | 8 +- .../source/libs/icu/icu-src/source/config/dist.mk | 42 +- .../libs/icu/icu-src/source/config/make2sh.sed | 1 + .../libs/icu/icu-src/source/config/mh-aix-va | 28 +- .../libs/icu/icu-src/source/config/mh-cygwin | 2 +- .../libs/icu/icu-src/source/config/mh-cygwin-msvc | 5 +- .../libs/icu/icu-src/source/config/mh-cygwin64 | 2 +- .../source/libs/icu/icu-src/source/config/mh-mingw | 4 + .../libs/icu/icu-src/source/config/mh-mingw64 | 4 + .../libs/icu/icu-src/source/config/mh-msys-msvc | 5 +- .../source/libs/icu/icu-src/source/config/mh-os390 | 19 +- .../libs/icu/icu-src/source/config/mh-solaris | 25 +- Build/source/libs/icu/icu-src/source/configure | 171 +- Build/source/libs/icu/icu-src/source/configure.ac | 42 +- .../source/libs/icu/icu-src/source/data/build.xml | 1 + .../icu/icu-src/source/data/cldr-icu-readme.txt | 34 +- .../icu-src/source/data/icu-coll-deprecates.xml | 4 + .../libs/icu/icu-src/source/data/icu-config.xml | 17 +- .../icu-src/source/data/icu-locale-deprecates.xml | 3 + .../icu-src/source/data/icu-rbnf-deprecates.xml | 1 + .../source/data/in/coll/ucadata-implicithan.icu | Bin 172678 -> 175244 bytes .../icu-src/source/data/in/coll/ucadata-unihan.icu | Bin 481962 -> 515968 bytes .../libs/icu/icu-src/source/data/in/icudt58l.dat | Bin 18328144 -> 0 bytes .../libs/icu/icu-src/source/data/in/icudt60l.dat | Bin 0 -> 26899984 bytes .../source/libs/icu/icu-src/source/data/in/nfc.nrm | Bin 35116 -> 35384 bytes .../libs/icu/icu-src/source/data/in/nfkc.nrm | Bin 54008 -> 54300 bytes .../libs/icu/icu-src/source/data/in/nfkc_cf.nrm | Bin 51704 -> 51928 bytes .../libs/icu/icu-src/source/data/in/pnames.icu | Bin 36533 -> 37595 bytes .../libs/icu/icu-src/source/data/in/ubidi.icu | Bin 24080 -> 24648 bytes .../libs/icu/icu-src/source/data/in/ucase.icu | Bin 27788 -> 28188 bytes .../libs/icu/icu-src/source/data/in/unames.icu | Bin 256536 -> 264500 bytes .../libs/icu/icu-src/source/data/in/uprops.icu | Bin 123936 -> 126792 bytes .../libs/icu/icu-src/source/data/in/uts46.nrm | Bin 60668 -> 61068 bytes .../libs/icu/icu-src/source/data/makedata.mak | 166 +- .../libs/icu/icu-src/source/data/makedata.vcxproj | 439 +- .../icu/icu-src/source/data/makedata_uwp.vcxproj | 137 + .../source/data/misc/currencyNumericCodes.txt | 279 - .../icu/icu-src/source/data/misc/dayPeriods.txt | 3662 -- .../icu/icu-src/source/data/misc/genderList.txt | 60 - .../libs/icu/icu-src/source/data/misc/icudata.rc | 69 - .../libs/icu/icu-src/source/data/misc/icustd.txt | 11 - .../libs/icu/icu-src/source/data/misc/icuver.txt | 13 - .../icu/icu-src/source/data/misc/keyTypeData.txt | 700 - .../icu/icu-src/source/data/misc/likelySubtags.txt | 1803 - .../icu/icu-src/source/data/misc/metaZones.txt | 4315 --- .../libs/icu/icu-src/source/data/misc/metadata.txt | 4363 --- .../libs/icu/icu-src/source/data/misc/miscfiles.mk | 31 - .../icu-src/source/data/misc/numberingSystems.txt | 391 - .../libs/icu/icu-src/source/data/misc/plurals.txt | 903 - .../icu-src/source/data/misc/supplementalData.txt | 35552 ------------------- .../icu/icu-src/source/data/misc/timezoneTypes.txt | 610 - .../icu/icu-src/source/data/misc/windowsZones.txt | 791 - .../icu/icu-src/source/data/misc/zoneinfo64.txt | 3807 -- .../icu-src/source/data/unidata/CaseFolding.txt | 8 +- .../source/data/unidata/DerivedCoreProperties.txt | 328 +- .../data/unidata/DerivedNormalizationProps.txt | 6 +- .../icu-src/source/data/unidata/FractionalUCA.txt | 15580 ++++---- .../data/unidata/NormalizationCorrections.txt | 10 +- .../source/data/unidata/NormalizationTest.txt | 30 +- .../icu-src/source/data/unidata/SpecialCasing.txt | 8 +- .../icu/icu-src/source/data/unidata/UCARules.txt | 644 +- .../icu-src/source/data/unidata/UnicodeData.txt | 1028 +- .../icu/icu-src/source/data/unidata/changes.txt | 488 + .../icu-src/source/data/unidata/confusables.txt | 420 +- .../icu/icu-src/source/data/unidata/norm2/nfc.txt | 13 +- .../icu/icu-src/source/data/unidata/norm2/nfkc.txt | 4 +- .../icu-src/source/data/unidata/norm2/nfkc_cf.txt | 10 +- .../icu-src/source/data/unidata/norm2/uts46.txt | 121 +- .../libs/icu/icu-src/source/data/unidata/ppucd.txt | 9813 ++--- .../libs/icu/icu-src/source/data/unit/af.txt | 1697 - .../libs/icu/icu-src/source/data/unit/agq.txt | 5 - .../libs/icu/icu-src/source/data/unit/ak.txt | 5 - .../libs/icu/icu-src/source/data/unit/am.txt | 1702 - .../libs/icu/icu-src/source/data/unit/ar.txt | 2925 -- .../libs/icu/icu-src/source/data/unit/as.txt | 5 - .../libs/icu/icu-src/source/data/unit/asa.txt | 5 - .../libs/icu/icu-src/source/data/unit/ast.txt | 2239 -- .../libs/icu/icu-src/source/data/unit/az.txt | 1710 - .../libs/icu/icu-src/source/data/unit/az_AZ.txt | 5 - .../libs/icu/icu-src/source/data/unit/az_Cyrl.txt | 6 - .../libs/icu/icu-src/source/data/unit/az_Latn.txt | 5 - .../icu/icu-src/source/data/unit/az_Latn_AZ.txt | 8 - .../libs/icu/icu-src/source/data/unit/bas.txt | 5 - .../libs/icu/icu-src/source/data/unit/be.txt | 2127 -- .../libs/icu/icu-src/source/data/unit/bem.txt | 5 - .../libs/icu/icu-src/source/data/unit/bez.txt | 5 - .../libs/icu/icu-src/source/data/unit/bg.txt | 1697 - .../libs/icu/icu-src/source/data/unit/bm.txt | 5 - .../libs/icu/icu-src/source/data/unit/bn.txt | 1697 - .../libs/icu/icu-src/source/data/unit/bo.txt | 5 - .../libs/icu/icu-src/source/data/unit/br.txt | 2599 -- .../libs/icu/icu-src/source/data/unit/brx.txt | 37 - .../libs/icu/icu-src/source/data/unit/bs.txt | 1849 - .../libs/icu/icu-src/source/data/unit/bs_BA.txt | 5 - .../libs/icu/icu-src/source/data/unit/bs_Cyrl.txt | 84 - .../libs/icu/icu-src/source/data/unit/bs_Latn.txt | 5 - .../icu/icu-src/source/data/unit/bs_Latn_BA.txt | 8 - .../libs/icu/icu-src/source/data/unit/ca.txt | 1738 - .../libs/icu/icu-src/source/data/unit/ce.txt | 258 - .../libs/icu/icu-src/source/data/unit/cgg.txt | 5 - .../libs/icu/icu-src/source/data/unit/chr.txt | 1575 - .../libs/icu/icu-src/source/data/unit/ckb.txt | 5 - .../libs/icu/icu-src/source/data/unit/cs.txt | 2959 -- .../libs/icu/icu-src/source/data/unit/cy.txt | 3527 -- .../libs/icu/icu-src/source/data/unit/da.txt | 1705 - .../libs/icu/icu-src/source/data/unit/dav.txt | 5 - .../libs/icu/icu-src/source/data/unit/de.txt | 2059 -- .../libs/icu/icu-src/source/data/unit/de_CH.txt | 48 - .../libs/icu/icu-src/source/data/unit/dje.txt | 5 - .../libs/icu/icu-src/source/data/unit/dsb.txt | 2045 -- .../libs/icu/icu-src/source/data/unit/dua.txt | 5 - .../libs/icu/icu-src/source/data/unit/dyo.txt | 5 - .../libs/icu/icu-src/source/data/unit/dz.txt | 30 - .../libs/icu/icu-src/source/data/unit/ebu.txt | 5 - .../libs/icu/icu-src/source/data/unit/ee.txt | 119 - .../libs/icu/icu-src/source/data/unit/el.txt | 1699 - .../libs/icu/icu-src/source/data/unit/en.txt | 2159 -- .../libs/icu/icu-src/source/data/unit/en_001.txt | 464 - .../libs/icu/icu-src/source/data/unit/en_150.txt | 6 - .../libs/icu/icu-src/source/data/unit/en_AG.txt | 6 - .../libs/icu/icu-src/source/data/unit/en_AI.txt | 6 - .../libs/icu/icu-src/source/data/unit/en_AT.txt | 6 - .../libs/icu/icu-src/source/data/unit/en_AU.txt | 321 - .../libs/icu/icu-src/source/data/unit/en_BB.txt | 6 - .../libs/icu/icu-src/source/data/unit/en_BE.txt | 6 - .../libs/icu/icu-src/source/data/unit/en_BM.txt | 6 - .../libs/icu/icu-src/source/data/unit/en_BS.txt | 18 - .../libs/icu/icu-src/source/data/unit/en_BW.txt | 6 - .../libs/icu/icu-src/source/data/unit/en_BZ.txt | 18 - .../libs/icu/icu-src/source/data/unit/en_CA.txt | 120 - .../libs/icu/icu-src/source/data/unit/en_CC.txt | 6 - .../libs/icu/icu-src/source/data/unit/en_CH.txt | 6 - .../libs/icu/icu-src/source/data/unit/en_CK.txt | 6 - .../libs/icu/icu-src/source/data/unit/en_CM.txt | 6 - .../libs/icu/icu-src/source/data/unit/en_CX.txt | 6 - .../libs/icu/icu-src/source/data/unit/en_CY.txt | 6 - .../libs/icu/icu-src/source/data/unit/en_DE.txt | 6 - .../libs/icu/icu-src/source/data/unit/en_DG.txt | 6 - .../libs/icu/icu-src/source/data/unit/en_DK.txt | 6 - .../libs/icu/icu-src/source/data/unit/en_DM.txt | 6 - .../libs/icu/icu-src/source/data/unit/en_ER.txt | 6 - .../libs/icu/icu-src/source/data/unit/en_FI.txt | 6 - .../libs/icu/icu-src/source/data/unit/en_FJ.txt | 6 - .../libs/icu/icu-src/source/data/unit/en_FK.txt | 6 - .../libs/icu/icu-src/source/data/unit/en_FM.txt | 6 - .../libs/icu/icu-src/source/data/unit/en_GB.txt | 6 - .../libs/icu/icu-src/source/data/unit/en_GD.txt | 6 - .../libs/icu/icu-src/source/data/unit/en_GG.txt | 6 - .../libs/icu/icu-src/source/data/unit/en_GH.txt | 6 - .../libs/icu/icu-src/source/data/unit/en_GI.txt | 6 - .../libs/icu/icu-src/source/data/unit/en_GM.txt | 6 - .../libs/icu/icu-src/source/data/unit/en_GY.txt | 6 - .../libs/icu/icu-src/source/data/unit/en_HK.txt | 6 - .../libs/icu/icu-src/source/data/unit/en_IE.txt | 6 - .../libs/icu/icu-src/source/data/unit/en_IL.txt | 6 - .../libs/icu/icu-src/source/data/unit/en_IM.txt | 6 - .../libs/icu/icu-src/source/data/unit/en_IN.txt | 6 - .../libs/icu/icu-src/source/data/unit/en_IO.txt | 6 - .../libs/icu/icu-src/source/data/unit/en_JE.txt | 6 - .../libs/icu/icu-src/source/data/unit/en_JM.txt | 6 - .../libs/icu/icu-src/source/data/unit/en_KE.txt | 6 - .../libs/icu/icu-src/source/data/unit/en_KI.txt | 6 - .../libs/icu/icu-src/source/data/unit/en_KN.txt | 6 - .../libs/icu/icu-src/source/data/unit/en_KY.txt | 18 - .../libs/icu/icu-src/source/data/unit/en_LC.txt | 6 - .../libs/icu/icu-src/source/data/unit/en_LR.txt | 6 - .../libs/icu/icu-src/source/data/unit/en_LS.txt | 6 - .../libs/icu/icu-src/source/data/unit/en_MG.txt | 6 - .../libs/icu/icu-src/source/data/unit/en_MO.txt | 6 - .../libs/icu/icu-src/source/data/unit/en_MS.txt | 6 - .../libs/icu/icu-src/source/data/unit/en_MT.txt | 6 - .../libs/icu/icu-src/source/data/unit/en_MU.txt | 6 - .../libs/icu/icu-src/source/data/unit/en_MW.txt | 6 - .../libs/icu/icu-src/source/data/unit/en_MY.txt | 6 - .../libs/icu/icu-src/source/data/unit/en_NA.txt | 6 - .../libs/icu/icu-src/source/data/unit/en_NF.txt | 6 - .../libs/icu/icu-src/source/data/unit/en_NG.txt | 6 - .../libs/icu/icu-src/source/data/unit/en_NH.txt | 5 - .../libs/icu/icu-src/source/data/unit/en_NL.txt | 6 - .../libs/icu/icu-src/source/data/unit/en_NR.txt | 6 - .../libs/icu/icu-src/source/data/unit/en_NU.txt | 6 - .../libs/icu/icu-src/source/data/unit/en_NZ.txt | 6 - .../libs/icu/icu-src/source/data/unit/en_PG.txt | 6 - .../libs/icu/icu-src/source/data/unit/en_PH.txt | 6 - .../libs/icu/icu-src/source/data/unit/en_PK.txt | 6 - .../libs/icu/icu-src/source/data/unit/en_PN.txt | 6 - .../libs/icu/icu-src/source/data/unit/en_PW.txt | 18 - .../libs/icu/icu-src/source/data/unit/en_RH.txt | 5 - .../libs/icu/icu-src/source/data/unit/en_RW.txt | 6 - .../libs/icu/icu-src/source/data/unit/en_SB.txt | 6 - .../libs/icu/icu-src/source/data/unit/en_SC.txt | 6 - .../libs/icu/icu-src/source/data/unit/en_SD.txt | 6 - .../libs/icu/icu-src/source/data/unit/en_SE.txt | 6 - .../libs/icu/icu-src/source/data/unit/en_SG.txt | 6 - .../libs/icu/icu-src/source/data/unit/en_SH.txt | 6 - .../libs/icu/icu-src/source/data/unit/en_SI.txt | 6 - .../libs/icu/icu-src/source/data/unit/en_SL.txt | 6 - .../libs/icu/icu-src/source/data/unit/en_SS.txt | 6 - .../libs/icu/icu-src/source/data/unit/en_SX.txt | 6 - .../libs/icu/icu-src/source/data/unit/en_SZ.txt | 6 - .../libs/icu/icu-src/source/data/unit/en_TC.txt | 6 - .../libs/icu/icu-src/source/data/unit/en_TK.txt | 6 - .../libs/icu/icu-src/source/data/unit/en_TO.txt | 6 - .../libs/icu/icu-src/source/data/unit/en_TT.txt | 6 - .../libs/icu/icu-src/source/data/unit/en_TV.txt | 6 - .../libs/icu/icu-src/source/data/unit/en_TZ.txt | 6 - .../libs/icu/icu-src/source/data/unit/en_UG.txt | 6 - .../libs/icu/icu-src/source/data/unit/en_VC.txt | 6 - .../libs/icu/icu-src/source/data/unit/en_VG.txt | 6 - .../libs/icu/icu-src/source/data/unit/en_VU.txt | 6 - .../libs/icu/icu-src/source/data/unit/en_WS.txt | 6 - .../libs/icu/icu-src/source/data/unit/en_ZA.txt | 6 - .../libs/icu/icu-src/source/data/unit/en_ZM.txt | 6 - .../libs/icu/icu-src/source/data/unit/en_ZW.txt | 6 - .../libs/icu/icu-src/source/data/unit/eo.txt | 13 - .../libs/icu/icu-src/source/data/unit/es.txt | 1697 - .../libs/icu/icu-src/source/data/unit/es_419.txt | 243 - .../libs/icu/icu-src/source/data/unit/es_AR.txt | 91 - .../libs/icu/icu-src/source/data/unit/es_BO.txt | 6 - .../libs/icu/icu-src/source/data/unit/es_BR.txt | 6 - .../libs/icu/icu-src/source/data/unit/es_CL.txt | 44 - .../libs/icu/icu-src/source/data/unit/es_CO.txt | 76 - .../libs/icu/icu-src/source/data/unit/es_CR.txt | 6 - .../libs/icu/icu-src/source/data/unit/es_CU.txt | 6 - .../libs/icu/icu-src/source/data/unit/es_DO.txt | 62 - .../libs/icu/icu-src/source/data/unit/es_EC.txt | 6 - .../libs/icu/icu-src/source/data/unit/es_GT.txt | 102 - .../libs/icu/icu-src/source/data/unit/es_HN.txt | 6 - .../libs/icu/icu-src/source/data/unit/es_MX.txt | 283 - .../libs/icu/icu-src/source/data/unit/es_NI.txt | 6 - .../libs/icu/icu-src/source/data/unit/es_PA.txt | 6 - .../libs/icu/icu-src/source/data/unit/es_PE.txt | 6 - .../libs/icu/icu-src/source/data/unit/es_PR.txt | 14 - .../libs/icu/icu-src/source/data/unit/es_PY.txt | 84 - .../libs/icu/icu-src/source/data/unit/es_SV.txt | 6 - .../libs/icu/icu-src/source/data/unit/es_US.txt | 138 - .../libs/icu/icu-src/source/data/unit/es_UY.txt | 6 - .../libs/icu/icu-src/source/data/unit/es_VE.txt | 6 - .../libs/icu/icu-src/source/data/unit/et.txt | 1736 - .../libs/icu/icu-src/source/data/unit/eu.txt | 1697 - .../libs/icu/icu-src/source/data/unit/ewo.txt | 5 - .../libs/icu/icu-src/source/data/unit/fa.txt | 1757 - .../libs/icu/icu-src/source/data/unit/ff.txt | 5 - .../libs/icu/icu-src/source/data/unit/fi.txt | 2239 -- .../libs/icu/icu-src/source/data/unit/fil.txt | 1697 - .../libs/icu/icu-src/source/data/unit/fil_PH.txt | 8 - .../libs/icu/icu-src/source/data/unit/fo.txt | 1641 - .../libs/icu/icu-src/source/data/unit/fr.txt | 1794 - .../libs/icu/icu-src/source/data/unit/fr_CA.txt | 282 - .../libs/icu/icu-src/source/data/unit/fr_HT.txt | 47 - .../libs/icu/icu-src/source/data/unit/fur.txt | 69 - .../libs/icu/icu-src/source/data/unit/fy.txt | 735 - .../libs/icu/icu-src/source/data/unit/ga.txt | 3097 -- .../libs/icu/icu-src/source/data/unit/gd.txt | 2929 -- .../libs/icu/icu-src/source/data/unit/gl.txt | 1581 - .../libs/icu/icu-src/source/data/unit/gsw.txt | 130 - .../libs/icu/icu-src/source/data/unit/gu.txt | 1698 - .../libs/icu/icu-src/source/data/unit/guz.txt | 5 - .../libs/icu/icu-src/source/data/unit/gv.txt | 5 - .../libs/icu/icu-src/source/data/unit/ha.txt | 5 - .../libs/icu/icu-src/source/data/unit/haw.txt | 49 - .../libs/icu/icu-src/source/data/unit/he.txt | 2307 -- .../libs/icu/icu-src/source/data/unit/he_IL.txt | 8 - .../libs/icu/icu-src/source/data/unit/hi.txt | 1697 - .../libs/icu/icu-src/source/data/unit/hr.txt | 2444 -- .../libs/icu/icu-src/source/data/unit/hsb.txt | 2045 -- .../libs/icu/icu-src/source/data/unit/hu.txt | 1697 - .../libs/icu/icu-src/source/data/unit/hy.txt | 1697 - .../libs/icu/icu-src/source/data/unit/id.txt | 1390 - .../libs/icu/icu-src/source/data/unit/id_ID.txt | 8 - .../libs/icu/icu-src/source/data/unit/ig.txt | 5 - .../libs/icu/icu-src/source/data/unit/ii.txt | 5 - .../libs/icu/icu-src/source/data/unit/in.txt | 5 - .../libs/icu/icu-src/source/data/unit/in_ID.txt | 5 - .../libs/icu/icu-src/source/data/unit/is.txt | 1645 - .../libs/icu/icu-src/source/data/unit/it.txt | 1695 - .../libs/icu/icu-src/source/data/unit/iw.txt | 5 - .../libs/icu/icu-src/source/data/unit/iw_IL.txt | 5 - .../libs/icu/icu-src/source/data/unit/ja.txt | 1655 - .../libs/icu/icu-src/source/data/unit/ja_JP.txt | 8 - .../icu-src/source/data/unit/ja_JP_TRADITIONAL.txt | 7 - .../libs/icu/icu-src/source/data/unit/jgo.txt | 29 - .../libs/icu/icu-src/source/data/unit/jmc.txt | 5 - .../libs/icu/icu-src/source/data/unit/ka.txt | 1697 - .../libs/icu/icu-src/source/data/unit/kab.txt | 5 - .../libs/icu/icu-src/source/data/unit/kam.txt | 5 - .../libs/icu/icu-src/source/data/unit/kde.txt | 5 - .../libs/icu/icu-src/source/data/unit/kea.txt | 1018 - .../libs/icu/icu-src/source/data/unit/khq.txt | 5 - .../libs/icu/icu-src/source/data/unit/ki.txt | 5 - .../libs/icu/icu-src/source/data/unit/kk.txt | 1697 - .../libs/icu/icu-src/source/data/unit/kkj.txt | 5 - .../libs/icu/icu-src/source/data/unit/kl.txt | 132 - .../libs/icu/icu-src/source/data/unit/kln.txt | 5 - .../libs/icu/icu-src/source/data/unit/km.txt | 1390 - .../libs/icu/icu-src/source/data/unit/kn.txt | 1697 - .../libs/icu/icu-src/source/data/unit/ko.txt | 1387 - .../libs/icu/icu-src/source/data/unit/kok.txt | 5 - .../libs/icu/icu-src/source/data/unit/ks.txt | 37 - .../libs/icu/icu-src/source/data/unit/ksb.txt | 5 - .../libs/icu/icu-src/source/data/unit/ksf.txt | 5 - .../libs/icu/icu-src/source/data/unit/ksh.txt | 815 - .../libs/icu/icu-src/source/data/unit/kw.txt | 5 - .../libs/icu/icu-src/source/data/unit/ky.txt | 1697 - .../libs/icu/icu-src/source/data/unit/lag.txt | 5 - .../libs/icu/icu-src/source/data/unit/lb.txt | 1684 - .../libs/icu/icu-src/source/data/unit/lg.txt | 5 - .../libs/icu/icu-src/source/data/unit/lkt.txt | 136 - .../libs/icu/icu-src/source/data/unit/ln.txt | 5 - .../libs/icu/icu-src/source/data/unit/lo.txt | 1397 - .../libs/icu/icu-src/source/data/unit/lrc.txt | 10 - .../libs/icu/icu-src/source/data/unit/lt.txt | 2433 -- .../libs/icu/icu-src/source/data/unit/lu.txt | 5 - .../libs/icu/icu-src/source/data/unit/luo.txt | 5 - .../libs/icu/icu-src/source/data/unit/luy.txt | 5 - .../libs/icu/icu-src/source/data/unit/lv.txt | 2005 -- .../libs/icu/icu-src/source/data/unit/mas.txt | 5 - .../libs/icu/icu-src/source/data/unit/mer.txt | 5 - .../libs/icu/icu-src/source/data/unit/mfe.txt | 5 - .../libs/icu/icu-src/source/data/unit/mg.txt | 5 - .../libs/icu/icu-src/source/data/unit/mgh.txt | 5 - .../libs/icu/icu-src/source/data/unit/mgo.txt | 29 - .../libs/icu/icu-src/source/data/unit/mk.txt | 1978 -- .../libs/icu/icu-src/source/data/unit/ml.txt | 1692 - .../libs/icu/icu-src/source/data/unit/mn.txt | 1697 - .../libs/icu/icu-src/source/data/unit/mo.txt | 5 - .../libs/icu/icu-src/source/data/unit/mr.txt | 1696 - .../libs/icu/icu-src/source/data/unit/ms.txt | 1390 - .../libs/icu/icu-src/source/data/unit/mt.txt | 152 - .../libs/icu/icu-src/source/data/unit/mua.txt | 5 - .../libs/icu/icu-src/source/data/unit/my.txt | 1390 - .../libs/icu/icu-src/source/data/unit/mzn.txt | 951 - .../libs/icu/icu-src/source/data/unit/naq.txt | 5 - .../libs/icu/icu-src/source/data/unit/nb.txt | 1719 - .../libs/icu/icu-src/source/data/unit/nb_NO.txt | 8 - .../libs/icu/icu-src/source/data/unit/nd.txt | 5 - .../libs/icu/icu-src/source/data/unit/nds.txt | 30 - .../libs/icu/icu-src/source/data/unit/ne.txt | 1699 - .../libs/icu/icu-src/source/data/unit/nl.txt | 2063 -- .../libs/icu/icu-src/source/data/unit/nmg.txt | 5 - .../libs/icu/icu-src/source/data/unit/nn.txt | 94 - .../libs/icu/icu-src/source/data/unit/nn_NO.txt | 8 - .../libs/icu/icu-src/source/data/unit/nnh.txt | 5 - .../libs/icu/icu-src/source/data/unit/no.txt | 5 - .../libs/icu/icu-src/source/data/unit/no_NO.txt | 5 - .../libs/icu/icu-src/source/data/unit/no_NO_NY.txt | 5 - .../libs/icu/icu-src/source/data/unit/nus.txt | 5 - .../libs/icu/icu-src/source/data/unit/nyn.txt | 5 - .../libs/icu/icu-src/source/data/unit/om.txt | 5 - .../libs/icu/icu-src/source/data/unit/or.txt | 5 - .../libs/icu/icu-src/source/data/unit/os.txt | 75 - .../libs/icu/icu-src/source/data/unit/pa.txt | 2029 -- .../libs/icu/icu-src/source/data/unit/pa_Arab.txt | 6 - .../icu/icu-src/source/data/unit/pa_Arab_PK.txt | 8 - .../libs/icu/icu-src/source/data/unit/pa_Guru.txt | 5 - .../icu/icu-src/source/data/unit/pa_Guru_IN.txt | 8 - .../libs/icu/icu-src/source/data/unit/pa_IN.txt | 5 - .../libs/icu/icu-src/source/data/unit/pa_PK.txt | 5 - .../libs/icu/icu-src/source/data/unit/pl.txt | 2311 -- .../libs/icu/icu-src/source/data/unit/pool.res | Bin 70500 -> 0 bytes .../libs/icu/icu-src/source/data/unit/ps.txt | 15 - .../libs/icu/icu-src/source/data/unit/pt.txt | 1698 - .../libs/icu/icu-src/source/data/unit/pt_AO.txt | 6 - .../libs/icu/icu-src/source/data/unit/pt_CH.txt | 6 - .../libs/icu/icu-src/source/data/unit/pt_CV.txt | 6 - .../libs/icu/icu-src/source/data/unit/pt_GQ.txt | 6 - .../libs/icu/icu-src/source/data/unit/pt_GW.txt | 6 - .../libs/icu/icu-src/source/data/unit/pt_LU.txt | 6 - .../libs/icu/icu-src/source/data/unit/pt_MO.txt | 6 - .../libs/icu/icu-src/source/data/unit/pt_MZ.txt | 6 - .../libs/icu/icu-src/source/data/unit/pt_PT.txt | 317 - .../libs/icu/icu-src/source/data/unit/pt_ST.txt | 6 - .../libs/icu/icu-src/source/data/unit/pt_TL.txt | 6 - .../libs/icu/icu-src/source/data/unit/qu.txt | 5 - .../libs/icu/icu-src/source/data/unit/resfiles.mk | 119 - .../libs/icu/icu-src/source/data/unit/rm.txt | 106 - .../libs/icu/icu-src/source/data/unit/rn.txt | 5 - .../libs/icu/icu-src/source/data/unit/ro.txt | 1997 -- .../libs/icu/icu-src/source/data/unit/ro_MD.txt | 49 - .../libs/icu/icu-src/source/data/unit/rof.txt | 5 - .../libs/icu/icu-src/source/data/unit/root.txt | 624 - .../libs/icu/icu-src/source/data/unit/ru.txt | 2312 -- .../libs/icu/icu-src/source/data/unit/rw.txt | 5 - .../libs/icu/icu-src/source/data/unit/rwk.txt | 5 - .../libs/icu/icu-src/source/data/unit/sah.txt | 536 - .../libs/icu/icu-src/source/data/unit/saq.txt | 5 - .../libs/icu/icu-src/source/data/unit/sbp.txt | 5 - .../libs/icu/icu-src/source/data/unit/se.txt | 873 - .../libs/icu/icu-src/source/data/unit/seh.txt | 5 - .../libs/icu/icu-src/source/data/unit/ses.txt | 5 - .../libs/icu/icu-src/source/data/unit/sg.txt | 5 - .../libs/icu/icu-src/source/data/unit/sh.txt | 5 - .../libs/icu/icu-src/source/data/unit/sh_BA.txt | 5 - .../libs/icu/icu-src/source/data/unit/sh_CS.txt | 5 - .../libs/icu/icu-src/source/data/unit/sh_YU.txt | 5 - .../libs/icu/icu-src/source/data/unit/shi.txt | 5 - .../libs/icu/icu-src/source/data/unit/shi_Latn.txt | 6 - .../libs/icu/icu-src/source/data/unit/shi_MA.txt | 5 - .../libs/icu/icu-src/source/data/unit/shi_Tfng.txt | 5 - .../icu/icu-src/source/data/unit/shi_Tfng_MA.txt | 8 - .../libs/icu/icu-src/source/data/unit/si.txt | 1697 - .../libs/icu/icu-src/source/data/unit/sk.txt | 2585 -- .../libs/icu/icu-src/source/data/unit/sl.txt | 2311 -- .../libs/icu/icu-src/source/data/unit/smn.txt | 42 - .../libs/icu/icu-src/source/data/unit/sn.txt | 5 - .../libs/icu/icu-src/source/data/unit/so.txt | 5 - .../libs/icu/icu-src/source/data/unit/sq.txt | 1727 - .../libs/icu/icu-src/source/data/unit/sr.txt | 2005 -- .../libs/icu/icu-src/source/data/unit/sr_BA.txt | 5 - .../libs/icu/icu-src/source/data/unit/sr_CS.txt | 5 - .../libs/icu/icu-src/source/data/unit/sr_Cyrl.txt | 5 - .../icu/icu-src/source/data/unit/sr_Cyrl_BA.txt | 8 - .../icu/icu-src/source/data/unit/sr_Cyrl_CS.txt | 5 - .../icu/icu-src/source/data/unit/sr_Cyrl_RS.txt | 8 - .../icu/icu-src/source/data/unit/sr_Cyrl_XK.txt | 8 - .../icu/icu-src/source/data/unit/sr_Cyrl_YU.txt | 5 - .../libs/icu/icu-src/source/data/unit/sr_Latn.txt | 2006 -- .../icu/icu-src/source/data/unit/sr_Latn_BA.txt | 8 - .../icu/icu-src/source/data/unit/sr_Latn_CS.txt | 5 - .../icu/icu-src/source/data/unit/sr_Latn_ME.txt | 8 - .../icu/icu-src/source/data/unit/sr_Latn_RS.txt | 8 - .../icu/icu-src/source/data/unit/sr_Latn_YU.txt | 5 - .../libs/icu/icu-src/source/data/unit/sr_ME.txt | 5 - .../libs/icu/icu-src/source/data/unit/sr_RS.txt | 5 - .../libs/icu/icu-src/source/data/unit/sr_XK.txt | 5 - .../libs/icu/icu-src/source/data/unit/sr_YU.txt | 5 - .../libs/icu/icu-src/source/data/unit/sv.txt | 2212 -- .../libs/icu/icu-src/source/data/unit/sv_FI.txt | 13 - .../libs/icu/icu-src/source/data/unit/sw.txt | 1704 - .../libs/icu/icu-src/source/data/unit/ta.txt | 1697 - .../libs/icu/icu-src/source/data/unit/te.txt | 1697 - .../libs/icu/icu-src/source/data/unit/teo.txt | 5 - .../libs/icu/icu-src/source/data/unit/th.txt | 1391 - .../libs/icu/icu-src/source/data/unit/th_TH.txt | 8 - .../icu-src/source/data/unit/th_TH_TRADITIONAL.txt | 7 - .../libs/icu/icu-src/source/data/unit/ti.txt | 5 - .../libs/icu/icu-src/source/data/unit/tl.txt | 5 - .../libs/icu/icu-src/source/data/unit/tl_PH.txt | 5 - .../libs/icu/icu-src/source/data/unit/to.txt | 1660 - .../libs/icu/icu-src/source/data/unit/tr.txt | 2053 -- .../libs/icu/icu-src/source/data/unit/twq.txt | 5 - .../libs/icu/icu-src/source/data/unit/tzm.txt | 5 - .../libs/icu/icu-src/source/data/unit/ug.txt | 603 - .../libs/icu/icu-src/source/data/unit/uk.txt | 2324 -- .../libs/icu/icu-src/source/data/unit/ur.txt | 1696 - .../libs/icu/icu-src/source/data/unit/ur_IN.txt | 14 - .../libs/icu/icu-src/source/data/unit/uz.txt | 1697 - .../libs/icu/icu-src/source/data/unit/uz_AF.txt | 5 - .../libs/icu/icu-src/source/data/unit/uz_Arab.txt | 6 - .../icu/icu-src/source/data/unit/uz_Arab_AF.txt | 8 - .../libs/icu/icu-src/source/data/unit/uz_Cyrl.txt | 644 - .../libs/icu/icu-src/source/data/unit/uz_Latn.txt | 5 - .../icu/icu-src/source/data/unit/uz_Latn_UZ.txt | 8 - .../libs/icu/icu-src/source/data/unit/uz_UZ.txt | 5 - .../libs/icu/icu-src/source/data/unit/vai.txt | 5 - .../libs/icu/icu-src/source/data/unit/vai_LR.txt | 5 - .../libs/icu/icu-src/source/data/unit/vai_Latn.txt | 6 - .../libs/icu/icu-src/source/data/unit/vai_Vaii.txt | 5 - .../icu/icu-src/source/data/unit/vai_Vaii_LR.txt | 8 - .../libs/icu/icu-src/source/data/unit/vi.txt | 1390 - .../libs/icu/icu-src/source/data/unit/vun.txt | 5 - .../libs/icu/icu-src/source/data/unit/wae.txt | 69 - .../libs/icu/icu-src/source/data/unit/xog.txt | 5 - .../libs/icu/icu-src/source/data/unit/yav.txt | 5 - .../libs/icu/icu-src/source/data/unit/yi.txt | 10 - .../libs/icu/icu-src/source/data/unit/yo.txt | 5 - .../libs/icu/icu-src/source/data/unit/yue.txt | 1623 - .../libs/icu/icu-src/source/data/unit/zgh.txt | 5 - .../libs/icu/icu-src/source/data/unit/zh.txt | 1438 - .../libs/icu/icu-src/source/data/unit/zh_CN.txt | 5 - .../libs/icu/icu-src/source/data/unit/zh_HK.txt | 5 - .../libs/icu/icu-src/source/data/unit/zh_Hans.txt | 5 - .../icu/icu-src/source/data/unit/zh_Hans_CN.txt | 8 - .../icu/icu-src/source/data/unit/zh_Hans_HK.txt | 28 - .../icu/icu-src/source/data/unit/zh_Hans_MO.txt | 28 - .../icu/icu-src/source/data/unit/zh_Hans_SG.txt | 28 - .../libs/icu/icu-src/source/data/unit/zh_Hant.txt | 1660 - .../icu/icu-src/source/data/unit/zh_Hant_HK.txt | 624 - .../icu/icu-src/source/data/unit/zh_Hant_MO.txt | 6 - .../icu/icu-src/source/data/unit/zh_Hant_TW.txt | 8 - .../libs/icu/icu-src/source/data/unit/zh_MO.txt | 5 - .../libs/icu/icu-src/source/data/unit/zh_SG.txt | 5 - .../libs/icu/icu-src/source/data/unit/zh_TW.txt | 5 - .../libs/icu/icu-src/source/data/unit/zu.txt | 1595 - .../icu/icu-src/source/extra/scrptrun/scrptrun.cpp | 2 +- .../icu/icu-src/source/extra/scrptrun/scrptrun.h | 2 +- .../icu/icu-src/source/extra/scrptrun/srtest.cpp | 2 +- .../icu/icu-src/source/extra/uconv/Makefile.in | 2 +- .../libs/icu/icu-src/source/extra/uconv/uconv.1.in | 14 +- .../libs/icu/icu-src/source/extra/uconv/uconv.cpp | 2 +- .../icu/icu-src/source/extra/uconv/uconv.vcxproj | 583 +- .../icu/icu-src/source/extra/uconv/unicode/uwmsg.h | 2 +- .../libs/icu/icu-src/source/extra/uconv/uwmsg.c | 2 +- .../libs/icu/icu-src/source/i18n/Makefile.in | 9 +- .../icu/icu-src/source/i18n/affixpatternparser.cpp | 18 +- .../icu/icu-src/source/i18n/affixpatternparser.h | 2 +- .../libs/icu/icu-src/source/i18n/alphaindex.cpp | 2 +- .../libs/icu/icu-src/source/i18n/anytrans.cpp | 16 +- .../source/libs/icu/icu-src/source/i18n/anytrans.h | 2 +- .../source/libs/icu/icu-src/source/i18n/astro.cpp | 2 +- Build/source/libs/icu/icu-src/source/i18n/astro.h | 2 +- .../libs/icu/icu-src/source/i18n/basictz.cpp | 2 +- .../source/libs/icu/icu-src/source/i18n/bocsu.cpp | 4 +- Build/source/libs/icu/icu-src/source/i18n/bocsu.h | 4 +- .../libs/icu/icu-src/source/i18n/brktrans.cpp | 2 +- .../source/libs/icu/icu-src/source/i18n/brktrans.h | 2 +- .../libs/icu/icu-src/source/i18n/buddhcal.cpp | 2 +- .../source/libs/icu/icu-src/source/i18n/buddhcal.h | 2 +- .../libs/icu/icu-src/source/i18n/calendar.cpp | 202 +- .../libs/icu/icu-src/source/i18n/casetrn.cpp | 12 +- .../source/libs/icu/icu-src/source/i18n/casetrn.h | 5 +- .../source/libs/icu/icu-src/source/i18n/cecal.cpp | 2 +- Build/source/libs/icu/icu-src/source/i18n/cecal.h | 2 +- .../libs/icu/icu-src/source/i18n/chnsecal.cpp | 2 +- .../source/libs/icu/icu-src/source/i18n/chnsecal.h | 2 +- .../libs/icu/icu-src/source/i18n/choicfmt.cpp | 2 +- .../libs/icu/icu-src/source/i18n/coleitr.cpp | 3 +- Build/source/libs/icu/icu-src/source/i18n/coll.cpp | 4 +- .../libs/icu/icu-src/source/i18n/collation.cpp | 2 +- .../libs/icu/icu-src/source/i18n/collation.h | 2 +- .../icu/icu-src/source/i18n/collationbuilder.cpp | 2 +- .../icu/icu-src/source/i18n/collationbuilder.h | 2 +- .../icu/icu-src/source/i18n/collationcompare.cpp | 2 +- .../icu/icu-src/source/i18n/collationcompare.h | 2 +- .../libs/icu/icu-src/source/i18n/collationdata.cpp | 2 +- .../libs/icu/icu-src/source/i18n/collationdata.h | 2 +- .../icu-src/source/i18n/collationdatabuilder.cpp | 2 +- .../icu/icu-src/source/i18n/collationdatabuilder.h | 2 +- .../icu-src/source/i18n/collationdatareader.cpp | 5 +- .../icu/icu-src/source/i18n/collationdatareader.h | 2 +- .../icu-src/source/i18n/collationdatawriter.cpp | 4 +- .../icu/icu-src/source/i18n/collationdatawriter.h | 2 +- .../icu/icu-src/source/i18n/collationfastlatin.cpp | 2 +- .../icu/icu-src/source/i18n/collationfastlatin.h | 2 +- .../source/i18n/collationfastlatinbuilder.cpp | 4 +- .../source/i18n/collationfastlatinbuilder.h | 2 +- .../libs/icu/icu-src/source/i18n/collationfcd.cpp | 108 +- .../libs/icu/icu-src/source/i18n/collationfcd.h | 2 +- .../icu/icu-src/source/i18n/collationiterator.cpp | 2 +- .../icu/icu-src/source/i18n/collationiterator.h | 21 +- .../libs/icu/icu-src/source/i18n/collationkeys.cpp | 2 +- .../libs/icu/icu-src/source/i18n/collationkeys.h | 2 +- .../libs/icu/icu-src/source/i18n/collationroot.cpp | 2 +- .../libs/icu/icu-src/source/i18n/collationroot.h | 2 +- .../icu-src/source/i18n/collationrootelements.cpp | 2 +- .../icu-src/source/i18n/collationrootelements.h | 2 +- .../icu-src/source/i18n/collationruleparser.cpp | 2 +- .../icu/icu-src/source/i18n/collationruleparser.h | 2 +- .../libs/icu/icu-src/source/i18n/collationsets.cpp | 2 +- .../libs/icu/icu-src/source/i18n/collationsets.h | 2 +- .../icu/icu-src/source/i18n/collationsettings.cpp | 2 +- .../icu/icu-src/source/i18n/collationsettings.h | 2 +- .../icu/icu-src/source/i18n/collationtailoring.cpp | 2 +- .../icu/icu-src/source/i18n/collationtailoring.h | 2 +- .../icu/icu-src/source/i18n/collationweights.cpp | 6 +- .../icu/icu-src/source/i18n/collationweights.h | 4 +- .../libs/icu/icu-src/source/i18n/collunsafe.h | 2 +- .../icu-src/source/i18n/compactdecimalformat.cpp | 21 +- .../libs/icu/icu-src/source/i18n/coptccal.cpp | 2 +- .../source/libs/icu/icu-src/source/i18n/coptccal.h | 2 +- .../libs/icu/icu-src/source/i18n/cpdtrans.cpp | 2 +- .../source/libs/icu/icu-src/source/i18n/cpdtrans.h | 2 +- .../libs/icu/icu-src/source/i18n/csdetect.cpp | 2 +- .../source/libs/icu/icu-src/source/i18n/csdetect.h | 2 +- .../libs/icu/icu-src/source/i18n/csmatch.cpp | 2 +- .../source/libs/icu/icu-src/source/i18n/csmatch.h | 2 +- .../libs/icu/icu-src/source/i18n/csr2022.cpp | 2 +- .../source/libs/icu/icu-src/source/i18n/csr2022.h | 2 +- .../libs/icu/icu-src/source/i18n/csrecog.cpp | 2 +- .../source/libs/icu/icu-src/source/i18n/csrecog.h | 2 +- .../libs/icu/icu-src/source/i18n/csrmbcs.cpp | 2 +- .../source/libs/icu/icu-src/source/i18n/csrmbcs.h | 2 +- .../libs/icu/icu-src/source/i18n/csrsbcs.cpp | 2 +- .../source/libs/icu/icu-src/source/i18n/csrsbcs.h | 2 +- .../libs/icu/icu-src/source/i18n/csrucode.cpp | 2 +- .../source/libs/icu/icu-src/source/i18n/csrucode.h | 2 +- .../libs/icu/icu-src/source/i18n/csrutf8.cpp | 2 +- .../source/libs/icu/icu-src/source/i18n/csrutf8.h | 2 +- .../libs/icu/icu-src/source/i18n/curramt.cpp | 6 +- .../libs/icu/icu-src/source/i18n/currfmt.cpp | 2 +- .../source/libs/icu/icu-src/source/i18n/currfmt.h | 2 +- .../libs/icu/icu-src/source/i18n/currpinf.cpp | 3 +- .../libs/icu/icu-src/source/i18n/currunit.cpp | 30 +- .../libs/icu/icu-src/source/i18n/dangical.cpp | 2 +- .../source/libs/icu/icu-src/source/i18n/dangical.h | 2 +- .../libs/icu/icu-src/source/i18n/datefmt.cpp | 7 +- .../icu/icu-src/source/i18n/dayperiodrules.cpp | 6 +- .../libs/icu/icu-src/source/i18n/dayperiodrules.h | 2 +- .../source/libs/icu/icu-src/source/i18n/dcfmtimp.h | 2 +- .../libs/icu/icu-src/source/i18n/dcfmtsym.cpp | 43 +- .../libs/icu/icu-src/source/i18n/decContext.c | 432 - .../libs/icu/icu-src/source/i18n/decContext.cpp | 432 + .../libs/icu/icu-src/source/i18n/decContext.h | 2 +- .../libs/icu/icu-src/source/i18n/decNumber.c | 8188 ----- .../libs/icu/icu-src/source/i18n/decNumber.cpp | 8188 +++++ .../libs/icu/icu-src/source/i18n/decNumber.h | 2 +- .../libs/icu/icu-src/source/i18n/decNumberLocal.h | 2 +- .../libs/icu/icu-src/source/i18n/decfmtst.cpp | 6 +- .../source/libs/icu/icu-src/source/i18n/decfmtst.h | 2 +- .../icu-src/source/i18n/decimalformatpattern.cpp | 2 +- .../icu/icu-src/source/i18n/decimalformatpattern.h | 2 +- .../icu-src/source/i18n/decimalformatpatternimpl.h | 2 +- .../libs/icu/icu-src/source/i18n/decimfmt.cpp | 27 +- .../libs/icu/icu-src/source/i18n/decimfmtimpl.cpp | 9 +- .../libs/icu/icu-src/source/i18n/decimfmtimpl.h | 2 +- .../libs/icu/icu-src/source/i18n/digitaffix.cpp | 2 +- .../libs/icu/icu-src/source/i18n/digitaffix.h | 2 +- .../icu-src/source/i18n/digitaffixesandpadding.cpp | 2 +- .../icu-src/source/i18n/digitaffixesandpadding.h | 2 +- .../icu/icu-src/source/i18n/digitformatter.cpp | 4 +- .../libs/icu/icu-src/source/i18n/digitformatter.h | 2 +- .../libs/icu/icu-src/source/i18n/digitgrouping.cpp | 2 +- .../libs/icu/icu-src/source/i18n/digitgrouping.h | 2 +- .../libs/icu/icu-src/source/i18n/digitinterval.cpp | 2 +- .../libs/icu/icu-src/source/i18n/digitinterval.h | 2 +- .../libs/icu/icu-src/source/i18n/digitlst.cpp | 9 +- .../source/libs/icu/icu-src/source/i18n/digitlst.h | 2 +- .../source/libs/icu/icu-src/source/i18n/dt_impl.h | 2 +- .../libs/icu/icu-src/source/i18n/dtfmtsym.cpp | 26 +- .../libs/icu/icu-src/source/i18n/dtitv_impl.h | 2 +- .../libs/icu/icu-src/source/i18n/dtitvfmt.cpp | 2 +- .../libs/icu/icu-src/source/i18n/dtitvinf.cpp | 2 +- .../libs/icu/icu-src/source/i18n/dtptngen.cpp | 262 +- .../libs/icu/icu-src/source/i18n/dtptngen_impl.h | 13 +- .../source/libs/icu/icu-src/source/i18n/dtrule.cpp | 2 +- .../source/libs/icu/icu-src/source/i18n/esctrn.cpp | 2 +- Build/source/libs/icu/icu-src/source/i18n/esctrn.h | 2 +- .../libs/icu/icu-src/source/i18n/ethpccal.cpp | 2 +- .../source/libs/icu/icu-src/source/i18n/ethpccal.h | 2 +- .../libs/icu/icu-src/source/i18n/fmtable.cpp | 2 +- .../libs/icu/icu-src/source/i18n/fmtable_cnv.cpp | 2 +- .../libs/icu/icu-src/source/i18n/fmtableimp.h | 5 +- .../source/libs/icu/icu-src/source/i18n/format.cpp | 2 +- .../libs/icu/icu-src/source/i18n/fphdlimp.cpp | 2 +- .../source/libs/icu/icu-src/source/i18n/fphdlimp.h | 2 +- .../libs/icu/icu-src/source/i18n/fpositer.cpp | 2 +- .../libs/icu/icu-src/source/i18n/funcrepl.cpp | 2 +- .../source/libs/icu/icu-src/source/i18n/funcrepl.h | 2 +- .../source/libs/icu/icu-src/source/i18n/gender.cpp | 2 +- .../libs/icu/icu-src/source/i18n/gregocal.cpp | 2 +- .../libs/icu/icu-src/source/i18n/gregoimp.cpp | 7 +- .../source/libs/icu/icu-src/source/i18n/gregoimp.h | 13 +- .../libs/icu/icu-src/source/i18n/hebrwcal.cpp | 2 +- .../source/libs/icu/icu-src/source/i18n/hebrwcal.h | 2 +- .../libs/icu/icu-src/source/i18n/i18n.vcxproj | 63 +- .../icu/icu-src/source/i18n/i18n.vcxproj.filters | 58 +- .../libs/icu/icu-src/source/i18n/i18n_uwp.vcxproj | 1054 + .../libs/icu/icu-src/source/i18n/indiancal.cpp | 2 +- .../libs/icu/icu-src/source/i18n/indiancal.h | 2 +- .../libs/icu/icu-src/source/i18n/inputext.cpp | 2 +- .../source/libs/icu/icu-src/source/i18n/inputext.h | 2 +- .../libs/icu/icu-src/source/i18n/islamcal.cpp | 2 +- .../source/libs/icu/icu-src/source/i18n/islamcal.h | 2 +- .../libs/icu/icu-src/source/i18n/japancal.cpp | 2 +- .../source/libs/icu/icu-src/source/i18n/japancal.h | 2 +- .../libs/icu/icu-src/source/i18n/measfmt.cpp | 58 +- .../libs/icu/icu-src/source/i18n/measunit.cpp | 242 +- .../libs/icu/icu-src/source/i18n/measure.cpp | 2 +- .../source/libs/icu/icu-src/source/i18n/msgfmt.cpp | 7 +- .../libs/icu/icu-src/source/i18n/msgfmt_impl.h | 2 +- .../libs/icu/icu-src/source/i18n/name2uni.cpp | 2 +- .../source/libs/icu/icu-src/source/i18n/name2uni.h | 2 +- .../source/libs/icu/icu-src/source/i18n/nfrlist.h | 4 +- Build/source/libs/icu/icu-src/source/i18n/nfrs.cpp | 31 +- Build/source/libs/icu/icu-src/source/i18n/nfrs.h | 9 +- .../source/libs/icu/icu-src/source/i18n/nfrule.cpp | 21 +- Build/source/libs/icu/icu-src/source/i18n/nfrule.h | 7 +- .../source/libs/icu/icu-src/source/i18n/nfsubs.cpp | 95 +- Build/source/libs/icu/icu-src/source/i18n/nfsubs.h | 6 +- .../libs/icu/icu-src/source/i18n/nortrans.cpp | 2 +- .../source/libs/icu/icu-src/source/i18n/nortrans.h | 2 +- .../source/libs/icu/icu-src/source/i18n/nounit.cpp | 42 + .../libs/icu/icu-src/source/i18n/nultrans.cpp | 2 +- .../source/libs/icu/icu-src/source/i18n/nultrans.h | 2 +- .../icu/icu-src/source/i18n/number_affixutils.cpp | 403 + .../icu/icu-src/source/i18n/number_affixutils.h | 224 + .../icu/icu-src/source/i18n/number_compact.cpp | 326 + .../libs/icu/icu-src/source/i18n/number_compact.h | 91 + .../icu-src/source/i18n/number_decimalquantity.cpp | 1011 + .../icu-src/source/i18n/number_decimalquantity.h | 438 + .../icu-src/source/i18n/number_decimfmtprops.cpp | 102 + .../icu/icu-src/source/i18n/number_decimfmtprops.h | 108 + .../libs/icu/icu-src/source/i18n/number_fluent.cpp | 369 + .../icu/icu-src/source/i18n/number_formatimpl.cpp | 464 + .../icu/icu-src/source/i18n/number_formatimpl.h | 125 + .../icu/icu-src/source/i18n/number_grouping.cpp | 55 + .../icu-src/source/i18n/number_integerwidth.cpp | 48 + .../icu/icu-src/source/i18n/number_longnames.cpp | 165 + .../icu/icu-src/source/i18n/number_longnames.h | 48 + .../icu/icu-src/source/i18n/number_modifiers.cpp | 303 + .../icu/icu-src/source/i18n/number_modifiers.h | 254 + .../icu/icu-src/source/i18n/number_notation.cpp | 75 + .../icu/icu-src/source/i18n/number_padding.cpp | 84 + .../icu-src/source/i18n/number_patternmodifier.cpp | 351 + .../icu-src/source/i18n/number_patternmodifier.h | 259 + .../icu-src/source/i18n/number_patternstring.cpp | 839 + .../icu/icu-src/source/i18n/number_patternstring.h | 266 + .../icu/icu-src/source/i18n/number_rounding.cpp | 347 + .../icu/icu-src/source/i18n/number_roundingutils.h | 141 + .../icu/icu-src/source/i18n/number_scientific.cpp | 138 + .../icu/icu-src/source/i18n/number_scientific.h | 62 + .../icu-src/source/i18n/number_stringbuilder.cpp | 460 + .../icu/icu-src/source/i18n/number_stringbuilder.h | 135 + .../libs/icu/icu-src/source/i18n/number_types.h | 293 + .../libs/icu/icu-src/source/i18n/number_utils.h | 130 + .../source/libs/icu/icu-src/source/i18n/numfmt.cpp | 26 +- .../source/libs/icu/icu-src/source/i18n/numsys.cpp | 11 +- .../libs/icu/icu-src/source/i18n/numsys_impl.h | 2 +- .../libs/icu/icu-src/source/i18n/olsontz.cpp | 2 +- .../source/libs/icu/icu-src/source/i18n/olsontz.h | 2 +- .../libs/icu/icu-src/source/i18n/persncal.cpp | 4 +- .../source/libs/icu/icu-src/source/i18n/persncal.h | 2 +- .../libs/icu/icu-src/source/i18n/pluralaffix.cpp | 2 +- .../libs/icu/icu-src/source/i18n/pluralaffix.h | 2 +- .../libs/icu/icu-src/source/i18n/plurfmt.cpp | 2 +- .../libs/icu/icu-src/source/i18n/plurrule.cpp | 102 +- .../libs/icu/icu-src/source/i18n/plurrule_impl.h | 91 +- .../libs/icu/icu-src/source/i18n/precision.cpp | 6 +- .../libs/icu/icu-src/source/i18n/precision.h | 2 +- .../source/libs/icu/icu-src/source/i18n/quant.cpp | 2 +- Build/source/libs/icu/icu-src/source/i18n/quant.h | 2 +- .../icu/icu-src/source/i18n/quantityformatter.cpp | 2 +- .../icu/icu-src/source/i18n/quantityformatter.h | 2 +- Build/source/libs/icu/icu-src/source/i18n/rbnf.cpp | 256 +- Build/source/libs/icu/icu-src/source/i18n/rbt.cpp | 2 +- Build/source/libs/icu/icu-src/source/i18n/rbt.h | 2 +- .../libs/icu/icu-src/source/i18n/rbt_data.cpp | 2 +- .../source/libs/icu/icu-src/source/i18n/rbt_data.h | 2 +- .../libs/icu/icu-src/source/i18n/rbt_pars.cpp | 2 +- .../source/libs/icu/icu-src/source/i18n/rbt_pars.h | 2 +- .../libs/icu/icu-src/source/i18n/rbt_rule.cpp | 2 +- .../source/libs/icu/icu-src/source/i18n/rbt_rule.h | 2 +- .../libs/icu/icu-src/source/i18n/rbt_set.cpp | 2 +- .../source/libs/icu/icu-src/source/i18n/rbt_set.h | 2 +- Build/source/libs/icu/icu-src/source/i18n/rbtz.cpp | 2 +- .../libs/icu/icu-src/source/i18n/regexcmp.cpp | 52 +- .../source/libs/icu/icu-src/source/i18n/regexcmp.h | 2 +- .../source/libs/icu/icu-src/source/i18n/regexcst.h | 2 +- .../libs/icu/icu-src/source/i18n/regeximp.cpp | 12 +- .../source/libs/icu/icu-src/source/i18n/regeximp.h | 4 +- .../libs/icu/icu-src/source/i18n/regexst.cpp | 2 +- .../source/libs/icu/icu-src/source/i18n/regexst.h | 2 +- .../libs/icu/icu-src/source/i18n/regextxt.cpp | 2 +- .../source/libs/icu/icu-src/source/i18n/regextxt.h | 2 +- .../source/libs/icu/icu-src/source/i18n/region.cpp | 2 +- .../libs/icu/icu-src/source/i18n/region_impl.h | 2 +- .../libs/icu/icu-src/source/i18n/reldatefmt.cpp | 5 +- .../libs/icu/icu-src/source/i18n/reldtfmt.cpp | 4 +- .../source/libs/icu/icu-src/source/i18n/reldtfmt.h | 2 +- .../libs/icu/icu-src/source/i18n/rematch.cpp | 26 +- .../libs/icu/icu-src/source/i18n/remtrans.cpp | 2 +- .../source/libs/icu/icu-src/source/i18n/remtrans.h | 2 +- .../libs/icu/icu-src/source/i18n/repattrn.cpp | 2 +- .../icu/icu-src/source/i18n/rulebasedcollator.cpp | 2 +- .../source/i18n/scientificnumberformatter.cpp | 2 +- .../libs/icu/icu-src/source/i18n/scriptset.cpp | 2 +- .../libs/icu/icu-src/source/i18n/scriptset.h | 2 +- .../source/libs/icu/icu-src/source/i18n/search.cpp | 2 +- .../source/libs/icu/icu-src/source/i18n/selfmt.cpp | 2 +- .../libs/icu/icu-src/source/i18n/selfmtimpl.h | 2 +- .../icu-src/source/i18n/sharedbreakiterator.cpp | 2 +- .../icu/icu-src/source/i18n/sharedbreakiterator.h | 2 +- .../libs/icu/icu-src/source/i18n/sharedcalendar.h | 2 +- .../icu-src/source/i18n/shareddateformatsymbols.h | 2 +- .../icu/icu-src/source/i18n/sharednumberformat.h | 2 +- .../icu/icu-src/source/i18n/sharedpluralrules.h | 2 +- .../icu-src/source/i18n/significantdigitinterval.h | 2 +- .../libs/icu/icu-src/source/i18n/simpletz.cpp | 15 +- .../icu/icu-src/source/i18n/smallintformatter.cpp | 2 +- .../icu/icu-src/source/i18n/smallintformatter.h | 2 +- .../libs/icu/icu-src/source/i18n/smpdtfmt.cpp | 34 +- .../libs/icu/icu-src/source/i18n/smpdtfst.cpp | 2 +- .../source/libs/icu/icu-src/source/i18n/smpdtfst.h | 3 +- .../libs/icu/icu-src/source/i18n/sortkey.cpp | 2 +- .../icu/icu-src/source/i18n/standardplural.cpp | 2 +- .../libs/icu/icu-src/source/i18n/standardplural.h | 2 +- .../libs/icu/icu-src/source/i18n/strmatch.cpp | 2 +- .../source/libs/icu/icu-src/source/i18n/strmatch.h | 2 +- .../libs/icu/icu-src/source/i18n/strrepl.cpp | 2 +- .../source/libs/icu/icu-src/source/i18n/strrepl.h | 2 +- .../libs/icu/icu-src/source/i18n/stsearch.cpp | 2 +- .../libs/icu/icu-src/source/i18n/taiwncal.cpp | 2 +- .../source/libs/icu/icu-src/source/i18n/taiwncal.h | 2 +- .../libs/icu/icu-src/source/i18n/timezone.cpp | 2 +- .../libs/icu/icu-src/source/i18n/titletrn.cpp | 12 +- .../source/libs/icu/icu-src/source/i18n/titletrn.h | 2 +- .../source/libs/icu/icu-src/source/i18n/tmunit.cpp | 2 +- .../libs/icu/icu-src/source/i18n/tmutamt.cpp | 2 +- .../libs/icu/icu-src/source/i18n/tmutfmt.cpp | 2 +- .../libs/icu/icu-src/source/i18n/tolowtrn.cpp | 2 +- .../source/libs/icu/icu-src/source/i18n/tolowtrn.h | 2 +- .../libs/icu/icu-src/source/i18n/toupptrn.cpp | 2 +- .../source/libs/icu/icu-src/source/i18n/toupptrn.h | 2 +- .../libs/icu/icu-src/source/i18n/translit.cpp | 2 +- .../libs/icu/icu-src/source/i18n/transreg.cpp | 155 +- .../source/libs/icu/icu-src/source/i18n/transreg.h | 12 +- .../libs/icu/icu-src/source/i18n/tridpars.cpp | 2 +- .../source/libs/icu/icu-src/source/i18n/tridpars.h | 2 +- .../source/libs/icu/icu-src/source/i18n/tzfmt.cpp | 49 +- .../libs/icu/icu-src/source/i18n/tzgnames.cpp | 13 +- .../source/libs/icu/icu-src/source/i18n/tzgnames.h | 2 +- .../libs/icu/icu-src/source/i18n/tznames.cpp | 2 +- .../libs/icu/icu-src/source/i18n/tznames_impl.cpp | 37 +- .../libs/icu/icu-src/source/i18n/tznames_impl.h | 7 +- .../source/libs/icu/icu-src/source/i18n/tzrule.cpp | 2 +- .../libs/icu/icu-src/source/i18n/tztrans.cpp | 2 +- Build/source/libs/icu/icu-src/source/i18n/ucal.cpp | 2 +- .../libs/icu/icu-src/source/i18n/ucln_in.cpp | 4 +- .../source/libs/icu/icu-src/source/i18n/ucln_in.h | 5 +- Build/source/libs/icu/icu-src/source/i18n/ucol.cpp | 4 +- .../source/libs/icu/icu-src/source/i18n/ucol_imp.h | 4 +- .../libs/icu/icu-src/source/i18n/ucol_res.cpp | 15 +- .../libs/icu/icu-src/source/i18n/ucol_sit.cpp | 15 +- .../libs/icu/icu-src/source/i18n/ucoleitr.cpp | 2 +- .../source/libs/icu/icu-src/source/i18n/ucsdet.cpp | 2 +- Build/source/libs/icu/icu-src/source/i18n/udat.cpp | 2 +- .../icu-src/source/i18n/udateintervalformat.cpp | 2 +- .../source/libs/icu/icu-src/source/i18n/udatpg.cpp | 4 +- .../libs/icu/icu-src/source/i18n/ufieldpositer.cpp | 2 +- .../icu-src/source/i18n/uitercollationiterator.cpp | 2 +- .../icu-src/source/i18n/uitercollationiterator.h | 2 +- .../source/libs/icu/icu-src/source/i18n/ulocdata.c | 386 - .../libs/icu/icu-src/source/i18n/ulocdata.cpp | 386 + Build/source/libs/icu/icu-src/source/i18n/umsg.cpp | 10 +- .../source/libs/icu/icu-src/source/i18n/umsg_imp.h | 4 +- .../libs/icu/icu-src/source/i18n/unesctrn.cpp | 2 +- .../source/libs/icu/icu-src/source/i18n/unesctrn.h | 2 +- .../libs/icu/icu-src/source/i18n/uni2name.cpp | 2 +- .../source/libs/icu/icu-src/source/i18n/uni2name.h | 2 +- .../icu/icu-src/source/i18n/unicode/alphaindex.h | 3 +- .../libs/icu/icu-src/source/i18n/unicode/basictz.h | 2 +- .../icu/icu-src/source/i18n/unicode/calendar.h | 22 +- .../icu/icu-src/source/i18n/unicode/choicfmt.h | 2 +- .../libs/icu/icu-src/source/i18n/unicode/coleitr.h | 3 +- .../libs/icu/icu-src/source/i18n/unicode/coll.h | 34 +- .../source/i18n/unicode/compactdecimalformat.h | 2 +- .../libs/icu/icu-src/source/i18n/unicode/curramt.h | 10 +- .../icu/icu-src/source/i18n/unicode/currpinf.h | 2 +- .../icu/icu-src/source/i18n/unicode/currunit.h | 30 +- .../libs/icu/icu-src/source/i18n/unicode/datefmt.h | 2 +- .../icu/icu-src/source/i18n/unicode/dcfmtsym.h | 35 +- .../icu/icu-src/source/i18n/unicode/decimfmt.h | 52 +- .../icu/icu-src/source/i18n/unicode/dtfmtsym.h | 13 +- .../icu/icu-src/source/i18n/unicode/dtitvfmt.h | 4 +- .../icu/icu-src/source/i18n/unicode/dtitvinf.h | 4 +- .../icu/icu-src/source/i18n/unicode/dtptngen.h | 42 +- .../libs/icu/icu-src/source/i18n/unicode/dtrule.h | 2 +- .../icu/icu-src/source/i18n/unicode/fieldpos.h | 2 +- .../libs/icu/icu-src/source/i18n/unicode/fmtable.h | 2 +- .../libs/icu/icu-src/source/i18n/unicode/format.h | 2 +- .../icu/icu-src/source/i18n/unicode/fpositer.h | 14 +- .../libs/icu/icu-src/source/i18n/unicode/gender.h | 2 +- .../icu/icu-src/source/i18n/unicode/gregocal.h | 2 +- .../libs/icu/icu-src/source/i18n/unicode/measfmt.h | 6 +- .../icu/icu-src/source/i18n/unicode/measunit.h | 89 +- .../libs/icu/icu-src/source/i18n/unicode/measure.h | 2 +- .../libs/icu/icu-src/source/i18n/unicode/msgfmt.h | 4 +- .../libs/icu/icu-src/source/i18n/unicode/nounit.h | 111 + .../icu-src/source/i18n/unicode/numberformatter.h | 1998 ++ .../libs/icu/icu-src/source/i18n/unicode/numfmt.h | 59 +- .../libs/icu/icu-src/source/i18n/unicode/numsys.h | 4 +- .../libs/icu/icu-src/source/i18n/unicode/plurfmt.h | 2 +- .../icu/icu-src/source/i18n/unicode/plurrule.h | 27 +- .../libs/icu/icu-src/source/i18n/unicode/rbnf.h | 68 +- .../libs/icu/icu-src/source/i18n/unicode/rbtz.h | 2 +- .../libs/icu/icu-src/source/i18n/unicode/regex.h | 34 +- .../libs/icu/icu-src/source/i18n/unicode/region.h | 2 +- .../icu/icu-src/source/i18n/unicode/reldatefmt.h | 9 +- .../i18n/unicode/scientificnumberformatter.h | 2 +- .../libs/icu/icu-src/source/i18n/unicode/search.h | 2 +- .../libs/icu/icu-src/source/i18n/unicode/selfmt.h | 2 +- .../icu/icu-src/source/i18n/unicode/simpletz.h | 2 +- .../icu/icu-src/source/i18n/unicode/smpdtfmt.h | 24 +- .../libs/icu/icu-src/source/i18n/unicode/sortkey.h | 2 +- .../icu/icu-src/source/i18n/unicode/stsearch.h | 2 +- .../libs/icu/icu-src/source/i18n/unicode/tblcoll.h | 26 +- .../icu/icu-src/source/i18n/unicode/timezone.h | 10 +- .../libs/icu/icu-src/source/i18n/unicode/tmunit.h | 2 +- .../libs/icu/icu-src/source/i18n/unicode/tmutamt.h | 2 +- .../libs/icu/icu-src/source/i18n/unicode/tmutfmt.h | 2 +- .../icu/icu-src/source/i18n/unicode/translit.h | 4 +- .../libs/icu/icu-src/source/i18n/unicode/tzfmt.h | 8 +- .../libs/icu/icu-src/source/i18n/unicode/tznames.h | 8 +- .../libs/icu/icu-src/source/i18n/unicode/tzrule.h | 2 +- .../libs/icu/icu-src/source/i18n/unicode/tztrans.h | 2 +- .../libs/icu/icu-src/source/i18n/unicode/ucal.h | 6 +- .../libs/icu/icu-src/source/i18n/unicode/ucol.h | 12 +- .../icu/icu-src/source/i18n/unicode/ucoleitr.h | 6 +- .../libs/icu/icu-src/source/i18n/unicode/ucsdet.h | 10 +- .../libs/icu/icu-src/source/i18n/unicode/udat.h | 80 +- .../source/i18n/unicode/udateintervalformat.h | 2 +- .../libs/icu/icu-src/source/i18n/unicode/udatpg.h | 8 +- .../icu-src/source/i18n/unicode/ufieldpositer.h | 2 +- .../icu/icu-src/source/i18n/unicode/uformattable.h | 4 +- .../libs/icu/icu-src/source/i18n/unicode/ugender.h | 2 +- .../icu/icu-src/source/i18n/unicode/ulocdata.h | 10 +- .../libs/icu/icu-src/source/i18n/unicode/umsg.h | 4 +- .../libs/icu/icu-src/source/i18n/unicode/unirepl.h | 2 +- .../libs/icu/icu-src/source/i18n/unicode/unum.h | 81 +- .../libs/icu/icu-src/source/i18n/unicode/unumsys.h | 2 +- .../icu/icu-src/source/i18n/unicode/upluralrules.h | 59 +- .../libs/icu/icu-src/source/i18n/unicode/uregex.h | 4 +- .../libs/icu/icu-src/source/i18n/unicode/uregion.h | 4 +- .../icu/icu-src/source/i18n/unicode/ureldatefmt.h | 72 +- .../libs/icu/icu-src/source/i18n/unicode/usearch.h | 6 +- .../libs/icu/icu-src/source/i18n/unicode/uspoof.h | 53 +- .../icu/icu-src/source/i18n/unicode/utmscale.h | 9 +- .../libs/icu/icu-src/source/i18n/unicode/utrans.h | 2 +- .../libs/icu/icu-src/source/i18n/unicode/vtzone.h | 2 +- Build/source/libs/icu/icu-src/source/i18n/unum.cpp | 126 +- .../libs/icu/icu-src/source/i18n/unumsys.cpp | 2 +- .../libs/icu/icu-src/source/i18n/upluralrules.cpp | 47 +- .../source/libs/icu/icu-src/source/i18n/uregex.cpp | 2 +- .../libs/icu/icu-src/source/i18n/uregexc.cpp | 2 +- .../libs/icu/icu-src/source/i18n/uregion.cpp | 2 +- .../libs/icu/icu-src/source/i18n/usearch.cpp | 2 +- .../source/libs/icu/icu-src/source/i18n/uspoof.cpp | 12 +- .../libs/icu/icu-src/source/i18n/uspoof_build.cpp | 4 +- .../libs/icu/icu-src/source/i18n/uspoof_conf.cpp | 5 +- .../libs/icu/icu-src/source/i18n/uspoof_conf.h | 6 +- .../libs/icu/icu-src/source/i18n/uspoof_impl.cpp | 2 +- .../libs/icu/icu-src/source/i18n/uspoof_impl.h | 2 +- .../source/libs/icu/icu-src/source/i18n/usrchimp.h | 2 +- .../icu-src/source/i18n/utf16collationiterator.cpp | 2 +- .../icu-src/source/i18n/utf16collationiterator.h | 2 +- .../icu-src/source/i18n/utf8collationiterator.cpp | 70 +- .../icu-src/source/i18n/utf8collationiterator.h | 2 +- .../source/libs/icu/icu-src/source/i18n/utmscale.c | 116 - .../libs/icu/icu-src/source/i18n/utmscale.cpp | 116 + .../source/libs/icu/icu-src/source/i18n/utrans.cpp | 2 +- .../icu/icu-src/source/i18n/valueformatter.cpp | 2 +- .../libs/icu/icu-src/source/i18n/valueformatter.h | 2 +- .../libs/icu/icu-src/source/i18n/visibledigits.cpp | 2 +- .../libs/icu/icu-src/source/i18n/visibledigits.h | 2 +- .../source/libs/icu/icu-src/source/i18n/vtzone.cpp | 30 +- .../source/libs/icu/icu-src/source/i18n/vzone.cpp | 2 +- Build/source/libs/icu/icu-src/source/i18n/vzone.h | 2 +- .../libs/icu/icu-src/source/i18n/windtfmt.cpp | 115 +- .../source/libs/icu/icu-src/source/i18n/windtfmt.h | 7 +- .../libs/icu/icu-src/source/i18n/winnmfmt.cpp | 177 +- .../source/libs/icu/icu-src/source/i18n/winnmfmt.h | 5 +- .../libs/icu/icu-src/source/i18n/wintzimpl.cpp | 32 +- .../libs/icu/icu-src/source/i18n/wintzimpl.h | 2 +- .../libs/icu/icu-src/source/i18n/zonemeta.cpp | 14 +- .../source/libs/icu/icu-src/source/i18n/zonemeta.h | 8 +- .../source/libs/icu/icu-src/source/i18n/zrule.cpp | 2 +- Build/source/libs/icu/icu-src/source/i18n/zrule.h | 2 +- .../source/libs/icu/icu-src/source/i18n/ztrans.cpp | 2 +- Build/source/libs/icu/icu-src/source/i18n/ztrans.h | 2 +- Build/source/libs/icu/icu-src/source/icudefs.mk.in | 1 + .../source/libs/icu/icu-src/source/io/Makefile.in | 2 +- Build/source/libs/icu/icu-src/source/io/io.vcxproj | 31 +- .../libs/icu/icu-src/source/io/io.vcxproj.filters | 16 +- .../source/libs/icu/icu-src/source/io/locbund.cpp | 2 +- Build/source/libs/icu/icu-src/source/io/locbund.h | 2 +- Build/source/libs/icu/icu-src/source/io/sprintf.c | 262 - .../source/libs/icu/icu-src/source/io/sprintf.cpp | 262 + Build/source/libs/icu/icu-src/source/io/sscanf.c | 130 - Build/source/libs/icu/icu-src/source/io/sscanf.cpp | 130 + .../source/libs/icu/icu-src/source/io/ucln_io.cpp | 4 +- Build/source/libs/icu/icu-src/source/io/ucln_io.h | 4 +- Build/source/libs/icu/icu-src/source/io/ufile.c | 362 - Build/source/libs/icu/icu-src/source/io/ufile.cpp | 343 + Build/source/libs/icu/icu-src/source/io/ufile.h | 4 +- Build/source/libs/icu/icu-src/source/io/ufmt_cmn.c | 259 - .../source/libs/icu/icu-src/source/io/ufmt_cmn.cpp | 259 + Build/source/libs/icu/icu-src/source/io/ufmt_cmn.h | 4 +- .../libs/icu/icu-src/source/io/unicode/ustdio.h | 2 +- .../libs/icu/icu-src/source/io/unicode/ustream.h | 11 +- .../source/libs/icu/icu-src/source/io/uprintf.cpp | 2 +- Build/source/libs/icu/icu-src/source/io/uprintf.h | 2 +- Build/source/libs/icu/icu-src/source/io/uprntf_p.c | 1593 - .../source/libs/icu/icu-src/source/io/uprntf_p.cpp | 1606 + Build/source/libs/icu/icu-src/source/io/uscanf.c | 108 - Build/source/libs/icu/icu-src/source/io/uscanf.cpp | 108 + Build/source/libs/icu/icu-src/source/io/uscanf.h | 2 +- Build/source/libs/icu/icu-src/source/io/uscanf_p.c | 1408 - .../source/libs/icu/icu-src/source/io/uscanf_p.cpp | 1450 + Build/source/libs/icu/icu-src/source/io/ustdio.c | 732 - Build/source/libs/icu/icu-src/source/io/ustdio.cpp | 732 + .../source/libs/icu/icu-src/source/io/ustream.cpp | 5 +- .../icu/icu-src/source/layoutex/LXUtilities.cpp | 2 +- .../libs/icu/icu-src/source/layoutex/LXUtilities.h | 2 +- .../icu-src/source/layoutex/ParagraphLayout.cpp | 2 +- .../libs/icu/icu-src/source/layoutex/RunArrays.cpp | 2 +- .../source/layoutex/layout/ParagraphLayout.h | 2 +- .../icu/icu-src/source/layoutex/layout/RunArrays.h | 2 +- .../icu/icu-src/source/layoutex/layout/playout.h | 2 +- .../icu/icu-src/source/layoutex/layout/plruns.h | 2 +- .../icu/icu-src/source/layoutex/layoutex.vcxproj | 14 +- .../libs/icu/icu-src/source/layoutex/playout.cpp | 2 +- .../libs/icu/icu-src/source/layoutex/plruns.cpp | 2 +- .../source/libs/icu/icu-src/source/runConfigureICU | 1 - .../icu/icu-src/source/samples/break/break.cpp | 2 +- .../icu/icu-src/source/samples/break/break.vcxproj | 528 +- .../libs/icu/icu-src/source/samples/break/ubreak.c | 2 +- .../libs/icu/icu-src/source/samples/cal/cal.c | 2 +- .../icu/icu-src/source/samples/cal/cal.vcxproj | 2 +- .../libs/icu/icu-src/source/samples/cal/uprint.c | 2 +- .../libs/icu/icu-src/source/samples/cal/uprint.h | 2 +- .../libs/icu/icu-src/source/samples/case/case.cpp | 2 +- .../icu/icu-src/source/samples/case/case.vcxproj | 500 +- .../libs/icu/icu-src/source/samples/case/ucase.c | 2 +- .../icu/icu-src/source/samples/citer/citer.cpp | 2 +- .../icu/icu-src/source/samples/citer/citer.vcxproj | 396 +- .../libs/icu/icu-src/source/samples/coll/coll.cpp | 2 +- .../icu/icu-src/source/samples/coll/coll.vcxproj | 502 +- .../libs/icu/icu-src/source/samples/csdet/csdet.c | 2 +- .../icu/icu-src/source/samples/csdet/csdet.vcxproj | 396 +- .../libs/icu/icu-src/source/samples/date/date.c | 2 +- .../icu/icu-src/source/samples/date/date.vcxproj | 526 +- .../libs/icu/icu-src/source/samples/date/uprint.c | 2 +- .../libs/icu/icu-src/source/samples/date/uprint.h | 2 +- .../icu/icu-src/source/samples/datecal/cal.cpp | 2 +- .../libs/icu/icu-src/source/samples/datecal/ccal.c | 2 +- .../source/samples/datefmt/answers/main_0.cpp | 2 +- .../source/samples/datefmt/answers/main_1.cpp | 2 +- .../source/samples/datefmt/answers/main_2.cpp | 2 +- .../source/samples/datefmt/answers/main_3.cpp | 2 +- .../icu-src/source/samples/datefmt/datefmt.vcxproj | 500 +- .../icu/icu-src/source/samples/datefmt/main.cpp | 2 +- .../icu/icu-src/source/samples/datefmt/util.cpp | 2 +- .../libs/icu/icu-src/source/samples/datefmt/util.h | 2 +- .../samples/dtitvfmtsample/dtitvfmtsample.cpp | 2 +- .../samples/dtitvfmtsample/dtitvfmtsample.vcxproj | 194 +- .../source/samples/dtptngsample/dtptngsample.cpp | 2 +- .../samples/dtptngsample/dtptngsample.vcxproj | 208 +- .../icu/icu-src/source/samples/layout/FontMap.cpp | 2 +- .../icu/icu-src/source/samples/layout/FontMap.h | 2 +- .../source/samples/layout/FontTableCache.cpp | 2 +- .../icu-src/source/samples/layout/FontTableCache.h | 2 +- .../source/samples/layout/GDIFontInstance.cpp | 2 +- .../source/samples/layout/GDIFontInstance.h | 2 +- .../icu-src/source/samples/layout/GDIFontMap.cpp | 2 +- .../icu/icu-src/source/samples/layout/GDIFontMap.h | 2 +- .../source/samples/layout/GDIGUISupport.cpp | 2 +- .../icu-src/source/samples/layout/GDIGUISupport.h | 2 +- .../icu/icu-src/source/samples/layout/GUISupport.h | 2 +- .../source/samples/layout/GnomeFontInstance.cpp | 2 +- .../source/samples/layout/GnomeFontInstance.h | 2 +- .../icu-src/source/samples/layout/GnomeFontMap.cpp | 2 +- .../icu-src/source/samples/layout/GnomeFontMap.h | 2 +- .../source/samples/layout/GnomeGUISupport.cpp | 2 +- .../source/samples/layout/GnomeGUISupport.h | 2 +- .../source/samples/layout/RenderingSurface.h | 2 +- .../samples/layout/ScriptCompositeFontInstance.cpp | 2 +- .../samples/layout/ScriptCompositeFontInstance.h | 2 +- .../icu/icu-src/source/samples/layout/Surface.cpp | 2 +- .../icu/icu-src/source/samples/layout/Surface.h | 2 +- .../source/samples/layout/UnicodeReader.cpp | 2 +- .../icu-src/source/samples/layout/UnicodeReader.h | 2 +- .../icu/icu-src/source/samples/layout/arraymem.h | 2 +- .../icu-src/source/samples/layout/cgnomelayout.c | 2 +- .../icu/icu-src/source/samples/layout/clayout.c | 2 +- .../icu/icu-src/source/samples/layout/cmaps.cpp | 2 +- .../libs/icu/icu-src/source/samples/layout/cmaps.h | 2 +- .../icu/icu-src/source/samples/layout/gdiglue.cpp | 2 +- .../icu/icu-src/source/samples/layout/gdiglue.h | 2 +- .../icu-src/source/samples/layout/gnomeglue.cpp | 2 +- .../icu/icu-src/source/samples/layout/gnomeglue.h | 2 +- .../icu-src/source/samples/layout/gnomelayout.cpp | 2 +- .../icu/icu-src/source/samples/layout/gsupport.h | 2 +- .../icu/icu-src/source/samples/layout/layout.cpp | 2 +- .../icu-src/source/samples/layout/layout.vcxproj | 544 +- .../icu-src/source/samples/layout/paragraph.cpp | 2 +- .../icu/icu-src/source/samples/layout/paragraph.h | 2 +- .../libs/icu/icu-src/source/samples/layout/pflow.c | 2 +- .../libs/icu/icu-src/source/samples/layout/pflow.h | 2 +- .../icu/icu-src/source/samples/layout/resource.h | 2 +- .../icu/icu-src/source/samples/layout/rsurface.cpp | 2 +- .../icu/icu-src/source/samples/layout/rsurface.h | 2 +- .../libs/icu/icu-src/source/samples/layout/sfnt.h | 2 +- .../icu/icu-src/source/samples/layout/ucreader.cpp | 2 +- .../icu/icu-src/source/samples/layout/ucreader.h | 2 +- .../icu/icu-src/source/samples/legacy/legacy.cpp | 4 +- .../icu-src/source/samples/legacy/legacy.vcxproj | 512 +- .../icu/icu-src/source/samples/legacy/newcol.cpp | 4 +- .../icu/icu-src/source/samples/legacy/oldcol.cpp | 4 +- .../source/samples/msgfmt/answers/main_0.cpp | 2 +- .../source/samples/msgfmt/answers/main_1.cpp | 2 +- .../source/samples/msgfmt/answers/main_2.cpp | 2 +- .../source/samples/msgfmt/answers/main_3.cpp | 2 +- .../icu/icu-src/source/samples/msgfmt/main.cpp | 2 +- .../icu-src/source/samples/msgfmt/msgfmt.vcxproj | 500 +- .../icu/icu-src/source/samples/msgfmt/util.cpp | 2 +- .../libs/icu/icu-src/source/samples/msgfmt/util.h | 2 +- .../libs/icu/icu-src/source/samples/numfmt/capi.c | 2 +- .../icu/icu-src/source/samples/numfmt/main.cpp | 2 +- .../icu-src/source/samples/numfmt/numfmt.vcxproj | 508 +- .../icu/icu-src/source/samples/numfmt/util.cpp | 2 +- .../libs/icu/icu-src/source/samples/numfmt/util.h | 6 +- .../source/samples/plurfmtsample/plurfmtsample.cpp | 2 +- .../samples/plurfmtsample/plurfmtsample.vcxproj | 196 +- .../icu/icu-src/source/samples/props/props.cpp | 4 +- .../icu/icu-src/source/samples/props/props.vcxproj | 498 +- .../icu/icu-src/source/samples/strsrch/strsrch.cpp | 2 +- .../icu-src/source/samples/strsrch/strsrch.vcxproj | 502 +- .../source/samples/translit/answers/main_1.cpp | 2 +- .../source/samples/translit/answers/main_2.cpp | 2 +- .../source/samples/translit/answers/main_3.cpp | 2 +- .../source/samples/translit/answers/main_4.cpp | 2 +- .../source/samples/translit/answers/unaccent.cpp | 2 +- .../source/samples/translit/answers/unaccent.h | 2 +- .../icu/icu-src/source/samples/translit/main.cpp | 2 +- .../source/samples/translit/translit.vcxproj | 508 +- .../icu-src/source/samples/translit/unaccent.cpp | 2 +- .../icu/icu-src/source/samples/translit/unaccent.h | 2 +- .../icu/icu-src/source/samples/translit/util.cpp | 2 +- .../icu/icu-src/source/samples/translit/util.h | 2 +- .../icu/icu-src/source/samples/uciter8/uciter8.c | 8 +- .../icu-src/source/samples/uciter8/uciter8.vcxproj | 506 +- .../icu/icu-src/source/samples/uciter8/uit_len8.c | 4 +- .../icu/icu-src/source/samples/uciter8/uit_len8.h | 4 +- .../icu/icu-src/source/samples/ucnv/convsamp.cpp | 6 +- .../libs/icu/icu-src/source/samples/ucnv/flagcb.c | 2 +- .../libs/icu/icu-src/source/samples/ucnv/flagcb.h | 2 +- .../icu/icu-src/source/samples/ucnv/ucnv.vcxproj | 506 +- .../libs/icu/icu-src/source/samples/udata/reader.c | 4 +- .../icu-src/source/samples/udata/reader.vcxproj | 504 +- .../libs/icu/icu-src/source/samples/udata/writer.c | 4 +- .../icu-src/source/samples/udata/writer.vcxproj | 498 +- .../icu/icu-src/source/samples/ufortune/ufortune.c | 2 +- .../source/samples/ufortune/ufortune.vcxproj | 536 +- .../icu/icu-src/source/samples/ugrep/ugrep.cpp | 2 +- .../icu/icu-src/source/samples/ugrep/ugrep.vcxproj | 552 +- .../libs/icu/icu-src/source/samples/uresb/Makefile | 2 +- .../libs/icu/icu-src/source/samples/uresb/uresb.c | 4 +- .../icu/icu-src/source/samples/uresb/uresb.vcxproj | 510 +- .../icu/icu-src/source/samples/ustring/ustring.cpp | 8 +- .../icu-src/source/samples/ustring/ustring.vcxproj | 498 +- .../libs/icu/icu-src/source/stubdata/stubdata.c | 76 - .../libs/icu/icu-src/source/stubdata/stubdata.cpp | 76 + .../icu/icu-src/source/stubdata/stubdata.vcxproj | 13 +- .../source/stubdata/stubdata.vcxproj.filters | 4 +- .../libs/icu/icu-src/source/test/Makefile.in | 5 +- .../icu/icu-src/source/test/cintltst/bocu1tst.c | 4 +- .../icu/icu-src/source/test/cintltst/callcoll.c | 2 +- .../icu/icu-src/source/test/cintltst/callcoll.h | 2 +- .../icu/icu-src/source/test/cintltst/calldata.h | 2 +- .../icu/icu-src/source/test/cintltst/calltest.c | 2 +- .../icu/icu-src/source/test/cintltst/capitst.c | 2 +- .../icu/icu-src/source/test/cintltst/capitst.h | 2 +- .../icu/icu-src/source/test/cintltst/cbiapts.c | 85 +- .../icu/icu-src/source/test/cintltst/cbiapts.h | 2 +- .../icu/icu-src/source/test/cintltst/cbididat.c | 4 +- .../source/test/cintltst/cbiditransformtst.c | 5 +- .../icu/icu-src/source/test/cintltst/cbiditst.c | 27 +- .../icu/icu-src/source/test/cintltst/cbiditst.h | 4 +- .../icu/icu-src/source/test/cintltst/cbkittst.c | 2 +- .../icu/icu-src/source/test/cintltst/ccaltst.c | 2 +- .../icu/icu-src/source/test/cintltst/ccaltst.h | 2 +- .../icu/icu-src/source/test/cintltst/ccapitst.c | 25 +- .../icu/icu-src/source/test/cintltst/ccapitst.h | 2 +- .../icu/icu-src/source/test/cintltst/ccolltst.c | 2 +- .../icu/icu-src/source/test/cintltst/ccolltst.h | 2 +- .../icu/icu-src/source/test/cintltst/cconvtst.c | 2 +- .../libs/icu/icu-src/source/test/cintltst/cctest.c | 2 +- .../icu/icu-src/source/test/cintltst/ccurrtst.c | 2 +- .../icu/icu-src/source/test/cintltst/ccurrtst.h | 2 +- .../source/test/cintltst/cdateintervalformattest.c | 2 +- .../icu/icu-src/source/test/cintltst/cdattst.c | 2 +- .../icu/icu-src/source/test/cintltst/cdattst.h | 2 +- .../libs/icu/icu-src/source/test/cintltst/cdetst.c | 2 +- .../libs/icu/icu-src/source/test/cintltst/cdetst.h | 2 +- .../icu/icu-src/source/test/cintltst/cdtdptst.c | 2 +- .../icu/icu-src/source/test/cintltst/cdtdptst.h | 2 +- .../icu/icu-src/source/test/cintltst/cdtrgtst.c | 2 +- .../icu/icu-src/source/test/cintltst/cdtrgtst.h | 2 +- .../libs/icu/icu-src/source/test/cintltst/cestst.c | 2 +- .../libs/icu/icu-src/source/test/cintltst/cestst.h | 2 +- .../icu/icu-src/source/test/cintltst/cfintst.c | 2 +- .../icu/icu-src/source/test/cintltst/cfintst.h | 2 +- .../icu/icu-src/source/test/cintltst/cformtst.c | 2 +- .../icu/icu-src/source/test/cintltst/cformtst.h | 2 +- .../libs/icu/icu-src/source/test/cintltst/cfrtst.c | 2 +- .../libs/icu/icu-src/source/test/cintltst/cfrtst.h | 2 +- .../icu/icu-src/source/test/cintltst/cg7coll.c | 2 +- .../icu/icu-src/source/test/cintltst/cg7coll.h | 2 +- .../icu/icu-src/source/test/cintltst/cgendtst.c | 2 +- .../icu/icu-src/source/test/cintltst/chashtst.c | 2 +- .../icu/icu-src/source/test/cintltst/cintltst.c | 2 +- .../icu/icu-src/source/test/cintltst/cintltst.h | 7 +- .../icu-src/source/test/cintltst/cintltst.vcxproj | 7 +- .../icu/icu-src/source/test/cintltst/citertst.c | 3 +- .../icu/icu-src/source/test/cintltst/citertst.h | 2 +- .../icu/icu-src/source/test/cintltst/cjaptst.c | 2 +- .../icu/icu-src/source/test/cintltst/cjaptst.h | 2 +- .../icu/icu-src/source/test/cintltst/cldrtest.c | 21 +- .../icu/icu-src/source/test/cintltst/cloctst.c | 175 +- .../icu/icu-src/source/test/cintltst/cloctst.h | 2 +- .../icu/icu-src/source/test/cintltst/cmsccoll.c | 11 +- .../icu/icu-src/source/test/cintltst/cmsgtst.c | 11 +- .../icu/icu-src/source/test/cintltst/cmsgtst.h | 2 +- .../icu/icu-src/source/test/cintltst/cnmdptst.c | 2 +- .../icu/icu-src/source/test/cintltst/cnmdptst.h | 2 +- .../icu/icu-src/source/test/cintltst/cnormtst.c | 9 +- .../icu/icu-src/source/test/cintltst/cnormtst.h | 2 +- .../icu/icu-src/source/test/cintltst/cnumtst.c | 165 +- .../icu/icu-src/source/test/cintltst/cnumtst.h | 2 +- .../source/test/cintltst/cpluralrulestest.c | 181 +- .../icu/icu-src/source/test/cintltst/cposxtst.c | 2 +- .../source/test/cintltst/crelativedateformattest.c | 2 +- .../icu/icu-src/source/test/cintltst/crestst.c | 3 +- .../icu/icu-src/source/test/cintltst/crestst.h | 2 +- .../icu/icu-src/source/test/cintltst/creststn.c | 6 +- .../icu/icu-src/source/test/cintltst/creststn.h | 2 +- .../icu/icu-src/source/test/cintltst/cstrcase.c | 12 +- .../icu/icu-src/source/test/cintltst/cstrtest.c | 2 +- .../icu/icu-src/source/test/cintltst/cturtst.c | 2 +- .../icu/icu-src/source/test/cintltst/cturtst.h | 2 +- .../icu/icu-src/source/test/cintltst/cucdapi.c | 17 +- .../icu/icu-src/source/test/cintltst/cucdapi.h | 2 +- .../icu/icu-src/source/test/cintltst/cucdtst.c | 159 +- .../icu/icu-src/source/test/cintltst/currtest.c | 2 +- .../icu/icu-src/source/test/cintltst/custrtrn.c | 21 +- .../icu/icu-src/source/test/cintltst/custrtst.c | 4 +- .../icu/icu-src/source/test/cintltst/cutiltst.c | 2 +- .../libs/icu/icu-src/source/test/cintltst/encoll.c | 2 +- .../libs/icu/icu-src/source/test/cintltst/encoll.h | 2 +- .../icu/icu-src/source/test/cintltst/eurocreg.c | 2 +- .../libs/icu/icu-src/source/test/cintltst/hpmufn.c | 2 +- .../icu/icu-src/source/test/cintltst/idnatest.c | 4 +- .../icu/icu-src/source/test/cintltst/nccbtst.c | 8 +- .../icu/icu-src/source/test/cintltst/nccbtst.h | 2 +- .../icu/icu-src/source/test/cintltst/ncnvfbts.c | 2 +- .../icu/icu-src/source/test/cintltst/ncnvfbts.h | 2 +- .../icu/icu-src/source/test/cintltst/ncnvtst.c | 16 +- .../icu/icu-src/source/test/cintltst/nfsprep.c | 4 +- .../icu/icu-src/source/test/cintltst/nfsprep.h | 4 +- .../icu/icu-src/source/test/cintltst/nucnvtst.c | 24 +- .../icu/icu-src/source/test/cintltst/nucnvtst.h | 2 +- .../icu/icu-src/source/test/cintltst/putiltst.c | 2 +- .../icu/icu-src/source/test/cintltst/reapits.c | 3 +- .../icu/icu-src/source/test/cintltst/sorttest.c | 4 +- .../icu/icu-src/source/test/cintltst/spooftest.c | 2 +- .../icu/icu-src/source/test/cintltst/spreptst.c | 4 +- .../icu/icu-src/source/test/cintltst/sprpdata.c | 4 +- .../icu/icu-src/source/test/cintltst/stdnmtst.c | 2 +- .../icu/icu-src/source/test/cintltst/tracetst.c | 4 +- .../icu/icu-src/source/test/cintltst/trie2test.c | 62 +- .../icu/icu-src/source/test/cintltst/trietest.c | 4 +- .../icu/icu-src/source/test/cintltst/ucnvseltst.c | 3 +- .../icu/icu-src/source/test/cintltst/ucnvseltst.h | 2 +- .../icu/icu-src/source/test/cintltst/ucsdetst.c | 2 +- .../icu/icu-src/source/test/cintltst/udatatst.c | 2 +- .../icu/icu-src/source/test/cintltst/udatpg_test.c | 4 +- .../icu/icu-src/source/test/cintltst/uenumtst.c | 4 +- .../icu-src/source/test/cintltst/ulistfmttest.c | 2 +- .../icu/icu-src/source/test/cintltst/uregiontest.c | 2 +- .../icu/icu-src/source/test/cintltst/usettest.c | 2 +- .../icu/icu-src/source/test/cintltst/usrchdat.c | 2 +- .../icu/icu-src/source/test/cintltst/usrchtst.c | 2 +- .../icu/icu-src/source/test/cintltst/utexttst.c | 2 +- .../icu/icu-src/source/test/cintltst/utf16tst.c | 234 +- .../icu/icu-src/source/test/cintltst/utf8tst.c | 531 +- .../icu/icu-src/source/test/cintltst/utmstest.c | 2 +- .../icu/icu-src/source/test/cintltst/utransts.c | 65 +- .../libs/icu/icu-src/source/test/compat/tzdate.c | 2 +- .../icu-src/source/test/depstest/dependencies.txt | 66 +- .../icu/icu-src/source/test/hdrtst/Makefile.in | 40 +- .../icu/icu-src/source/test/hdrtst/cxxfiles.txt | 5 + .../source/test/hdrtst/testinternalheaders.sh | 24 +- .../icu/icu-src/source/test/intltest/Makefile.in | 9 +- .../icu/icu-src/source/test/intltest/aliastst.cpp | 2 +- .../icu/icu-src/source/test/intltest/aliastst.h | 2 +- .../icu/icu-src/source/test/intltest/allcoll.cpp | 2 +- .../icu/icu-src/source/test/intltest/allcoll.h | 2 +- .../icu-src/source/test/intltest/alphaindextst.cpp | 2 +- .../icu-src/source/test/intltest/alphaindextst.h | 2 +- .../icu/icu-src/source/test/intltest/apicoll.cpp | 86 +- .../icu/icu-src/source/test/intltest/apicoll.h | 4 +- .../icu/icu-src/source/test/intltest/astrotst.cpp | 2 +- .../icu/icu-src/source/test/intltest/astrotst.h | 2 +- .../icu/icu-src/source/test/intltest/bidiconf.cpp | 4 +- .../icu-src/source/test/intltest/bytestrietest.cpp | 4 +- .../icu/icu-src/source/test/intltest/calcasts.cpp | 4 +- .../icu/icu-src/source/test/intltest/calcasts.h | 2 +- .../icu/icu-src/source/test/intltest/callimts.cpp | 6 +- .../icu/icu-src/source/test/intltest/callimts.h | 2 +- .../icu/icu-src/source/test/intltest/calregts.cpp | 465 +- .../icu/icu-src/source/test/intltest/calregts.h | 16 +- .../icu/icu-src/source/test/intltest/caltest.cpp | 2 +- .../icu/icu-src/source/test/intltest/caltest.h | 2 +- .../icu/icu-src/source/test/intltest/caltestdata.h | 2 +- .../icu/icu-src/source/test/intltest/caltztst.cpp | 2 +- .../icu/icu-src/source/test/intltest/caltztst.h | 2 +- .../icu/icu-src/source/test/intltest/canittst.cpp | 2 +- .../icu/icu-src/source/test/intltest/canittst.h | 2 +- .../icu/icu-src/source/test/intltest/citrtest.cpp | 12 +- .../icu/icu-src/source/test/intltest/citrtest.h | 2 +- .../icu-src/source/test/intltest/collationtest.cpp | 32 +- .../icu/icu-src/source/test/intltest/colldata.cpp | 2 +- .../icu/icu-src/source/test/intltest/colldata.h | 2 +- .../test/intltest/compactdecimalformattest.cpp | 2 +- .../icu/icu-src/source/test/intltest/convtest.cpp | 101 +- .../icu/icu-src/source/test/intltest/convtest.h | 5 +- .../icu/icu-src/source/test/intltest/cpdtrtst.cpp | 2 +- .../icu/icu-src/source/test/intltest/cpdtrtst.h | 2 +- .../icu/icu-src/source/test/intltest/csdetest.cpp | 4 +- .../icu/icu-src/source/test/intltest/csdetest.h | 2 +- .../icu/icu-src/source/test/intltest/currcoll.cpp | 2 +- .../icu/icu-src/source/test/intltest/currcoll.h | 2 +- .../icu/icu-src/source/test/intltest/dadrcal.cpp | 2 +- .../icu/icu-src/source/test/intltest/dadrcal.h | 2 +- .../icu/icu-src/source/test/intltest/dadrfmt.cpp | 2 +- .../icu/icu-src/source/test/intltest/dadrfmt.h | 2 +- .../intltest/datadrivennumberformattestsuite.cpp | 15 +- .../intltest/datadrivennumberformattestsuite.h | 2 +- .../icu/icu-src/source/test/intltest/dcfmapts.cpp | 8 +- .../icu/icu-src/source/test/intltest/dcfmapts.h | 2 +- .../icu/icu-src/source/test/intltest/dcfmtest.cpp | 4 +- .../icu/icu-src/source/test/intltest/dcfmtest.h | 2 +- .../icu/icu-src/source/test/intltest/decoll.cpp | 2 +- .../libs/icu/icu-src/source/test/intltest/decoll.h | 2 +- .../icu/icu-src/source/test/intltest/dtfmapts.cpp | 2 +- .../icu/icu-src/source/test/intltest/dtfmapts.h | 2 +- .../icu/icu-src/source/test/intltest/dtfmrgts.cpp | 19 +- .../icu/icu-src/source/test/intltest/dtfmrgts.h | 3 +- .../icu/icu-src/source/test/intltest/dtfmtrtts.cpp | 17 +- .../icu/icu-src/source/test/intltest/dtfmtrtts.h | 2 +- .../icu/icu-src/source/test/intltest/dtfmttst.cpp | 45 +- .../icu/icu-src/source/test/intltest/dtfmttst.h | 2 +- .../icu/icu-src/source/test/intltest/dtifmtts.cpp | 6 +- .../icu/icu-src/source/test/intltest/dtifmtts.h | 2 +- .../icu/icu-src/source/test/intltest/dtptngts.cpp | 188 +- .../icu/icu-src/source/test/intltest/dtptngts.h | 3 +- .../icu/icu-src/source/test/intltest/encoll.cpp | 2 +- .../libs/icu/icu-src/source/test/intltest/encoll.h | 2 +- .../icu/icu-src/source/test/intltest/escoll.cpp | 2 +- .../libs/icu/icu-src/source/test/intltest/escoll.h | 2 +- .../icu/icu-src/source/test/intltest/ficoll.cpp | 2 +- .../libs/icu/icu-src/source/test/intltest/ficoll.h | 2 +- .../icu/icu-src/source/test/intltest/fldset.cpp | 2 +- .../libs/icu/icu-src/source/test/intltest/fldset.h | 2 +- .../icu/icu-src/source/test/intltest/frcoll.cpp | 2 +- .../libs/icu/icu-src/source/test/intltest/frcoll.h | 2 +- .../icu/icu-src/source/test/intltest/g7coll.cpp | 2 +- .../libs/icu/icu-src/source/test/intltest/g7coll.h | 2 +- .../source/test/intltest/genderinfotest.cpp | 2 +- .../icu/icu-src/source/test/intltest/icusvtst.cpp | 2 +- .../icu/icu-src/source/test/intltest/icusvtst.h | 2 +- .../icu/icu-src/source/test/intltest/idnaconf.cpp | 4 +- .../icu/icu-src/source/test/intltest/idnaconf.h | 2 +- .../icu/icu-src/source/test/intltest/idnaref.cpp | 4 +- .../icu/icu-src/source/test/intltest/idnaref.h | 4 +- .../icu/icu-src/source/test/intltest/incaltst.cpp | 20 +- .../icu/icu-src/source/test/intltest/incaltst.h | 2 +- .../icu/icu-src/source/test/intltest/intltest.cpp | 23 +- .../icu/icu-src/source/test/intltest/intltest.h | 10 +- .../icu-src/source/test/intltest/intltest.vcxproj | 32 +- .../source/test/intltest/intltest.vcxproj.filters | 38 +- .../icu/icu-src/source/test/intltest/itercoll.cpp | 2 +- .../icu/icu-src/source/test/intltest/itercoll.h | 2 +- .../icu/icu-src/source/test/intltest/itformat.cpp | 27 +- .../icu/icu-src/source/test/intltest/itformat.h | 2 +- .../icu/icu-src/source/test/intltest/itmajor.cpp | 2 +- .../icu/icu-src/source/test/intltest/itmajor.h | 2 +- .../icu/icu-src/source/test/intltest/itrbbi.cpp | 2 +- .../libs/icu/icu-src/source/test/intltest/itrbbi.h | 2 +- .../icu/icu-src/source/test/intltest/itrbnf.cpp | 67 +- .../libs/icu/icu-src/source/test/intltest/itrbnf.h | 4 +- .../icu/icu-src/source/test/intltest/itrbnfp.cpp | 2 +- .../icu/icu-src/source/test/intltest/itrbnfp.h | 2 +- .../icu/icu-src/source/test/intltest/itrbnfrt.cpp | 2 +- .../icu/icu-src/source/test/intltest/itrbnfrt.h | 2 +- .../icu/icu-src/source/test/intltest/itspoof.cpp | 2 +- .../icu/icu-src/source/test/intltest/itspoof.h | 2 +- .../icu/icu-src/source/test/intltest/ittrans.cpp | 2 +- .../icu/icu-src/source/test/intltest/ittrans.h | 2 +- .../icu/icu-src/source/test/intltest/itutil.cpp | 14 +- .../libs/icu/icu-src/source/test/intltest/itutil.h | 2 +- .../icu/icu-src/source/test/intltest/jacoll.cpp | 2 +- .../libs/icu/icu-src/source/test/intltest/jacoll.h | 2 +- .../icu/icu-src/source/test/intltest/jamotest.cpp | 2 +- .../icu/icu-src/source/test/intltest/jamotest.h | 2 +- .../icu/icu-src/source/test/intltest/lcukocol.cpp | 2 +- .../icu/icu-src/source/test/intltest/lcukocol.h | 2 +- .../source/test/intltest/listformattertest.cpp | 51 +- .../source/test/intltest/listformattertest.h | 7 +- .../icu/icu-src/source/test/intltest/locnmtst.cpp | 3 +- .../icu/icu-src/source/test/intltest/locnmtst.h | 2 +- .../icu/icu-src/source/test/intltest/loctest.cpp | 40 +- .../icu/icu-src/source/test/intltest/loctest.h | 3 +- .../icu-src/source/test/intltest/measfmttest.cpp | 213 +- .../icu/icu-src/source/test/intltest/miscdtfm.cpp | 2 +- .../icu/icu-src/source/test/intltest/miscdtfm.h | 2 +- .../icu/icu-src/source/test/intltest/mnkytst.cpp | 2 +- .../icu/icu-src/source/test/intltest/mnkytst.h | 2 +- .../icu/icu-src/source/test/intltest/msfmrgts.cpp | 2 +- .../icu/icu-src/source/test/intltest/msfmrgts.h | 2 +- .../icu/icu-src/source/test/intltest/nmfmapts.cpp | 2 +- .../icu/icu-src/source/test/intltest/nmfmapts.h | 2 +- .../icu/icu-src/source/test/intltest/nmfmtrt.cpp | 12 +- .../icu/icu-src/source/test/intltest/nmfmtrt.h | 2 +- .../icu/icu-src/source/test/intltest/normconf.cpp | 218 +- .../icu/icu-src/source/test/intltest/normconf.h | 15 +- .../icu/icu-src/source/test/intltest/nptrans.cpp | 4 +- .../icu/icu-src/source/test/intltest/nptrans.h | 4 +- .../source/test/intltest/numberformat2test.cpp | 18 +- .../source/test/intltest/numberformattesttuple.cpp | 3 +- .../source/test/intltest/numberformattesttuple.h | 5 +- .../icu/icu-src/source/test/intltest/numbertest.h | 203 + .../source/test/intltest/numbertest_affixutils.cpp | 248 + .../source/test/intltest/numbertest_api.cpp | 1509 + .../test/intltest/numbertest_decimalquantity.cpp | 267 + .../source/test/intltest/numbertest_modifiers.cpp | 180 + .../test/intltest/numbertest_patternmodifier.cpp | 127 + .../test/intltest/numbertest_patternstring.cpp | 94 + .../test/intltest/numbertest_stringbuilder.cpp | 237 + .../source/test/intltest/numfmtspectest.cpp | 2 +- .../icu/icu-src/source/test/intltest/numfmtst.cpp | 201 +- .../icu/icu-src/source/test/intltest/numfmtst.h | 4 +- .../icu/icu-src/source/test/intltest/numrgts.cpp | 5 +- .../icu/icu-src/source/test/intltest/numrgts.h | 2 +- .../icu-src/source/test/intltest/pluralmaptest.cpp | 2 +- .../icu/icu-src/source/test/intltest/plurfmts.cpp | 2 +- .../icu/icu-src/source/test/intltest/plurfmts.h | 2 +- .../icu/icu-src/source/test/intltest/plurults.cpp | 2 +- .../icu/icu-src/source/test/intltest/plurults.h | 2 +- .../icu/icu-src/source/test/intltest/pptest.cpp | 2 +- .../libs/icu/icu-src/source/test/intltest/pptest.h | 2 +- .../icu/icu-src/source/test/intltest/punyref.c | 304 - .../icu/icu-src/source/test/intltest/punyref.cpp | 304 + .../icu/icu-src/source/test/intltest/punyref.h | 2 +- .../source/test/intltest/quantityformattertest.cpp | 2 +- .../icu/icu-src/source/test/intltest/rbbiapts.cpp | 141 +- .../icu/icu-src/source/test/intltest/rbbiapts.h | 2 +- .../source/test/intltest/rbbimonkeytest.cpp | 34 +- .../icu-src/source/test/intltest/rbbimonkeytest.h | 3 +- .../icu/icu-src/source/test/intltest/rbbitst.cpp | 599 +- .../icu/icu-src/source/test/intltest/rbbitst.h | 11 +- .../icu/icu-src/source/test/intltest/regcoll.cpp | 2 +- .../icu/icu-src/source/test/intltest/regcoll.h | 2 +- .../icu/icu-src/source/test/intltest/regextst.cpp | 168 +- .../icu/icu-src/source/test/intltest/regextst.h | 3 +- .../icu/icu-src/source/test/intltest/regiontst.cpp | 2 +- .../icu/icu-src/source/test/intltest/regiontst.h | 2 +- .../source/test/intltest/reldatefmttest.cpp | 2 +- .../icu/icu-src/source/test/intltest/reptest.cpp | 2 +- .../icu/icu-src/source/test/intltest/reptest.h | 2 +- .../icu/icu-src/source/test/intltest/restest.cpp | 2 +- .../icu/icu-src/source/test/intltest/restest.h | 2 +- .../icu/icu-src/source/test/intltest/restsnew.cpp | 2 +- .../icu/icu-src/source/test/intltest/restsnew.h | 2 +- .../intltest/scientificnumberformattertest.cpp | 2 +- .../icu/icu-src/source/test/intltest/sdtfmtts.cpp | 2 +- .../icu/icu-src/source/test/intltest/sdtfmtts.h | 2 +- .../icu/icu-src/source/test/intltest/selfmts.cpp | 2 +- .../icu/icu-src/source/test/intltest/selfmts.h | 2 +- .../icu/icu-src/source/test/intltest/sfwdchit.cpp | 4 +- .../icu/icu-src/source/test/intltest/sfwdchit.h | 2 +- .../source/test/intltest/simpleformattertest.cpp | 2 +- .../icu-src/source/test/intltest/simplethread.cpp | 2 +- .../icu-src/source/test/intltest/simplethread.h | 2 +- .../icu/icu-src/source/test/intltest/srchtest.cpp | 4 +- .../icu/icu-src/source/test/intltest/srchtest.h | 2 +- .../icu/icu-src/source/test/intltest/ssearch.cpp | 2 +- .../icu/icu-src/source/test/intltest/ssearch.h | 2 +- .../icu/icu-src/source/test/intltest/strcase.cpp | 853 +- .../icu/icu-src/source/test/intltest/strtest.cpp | 41 +- .../icu/icu-src/source/test/intltest/strtest.h | 4 +- .../icu/icu-src/source/test/intltest/svccoll.cpp | 2 +- .../icu/icu-src/source/test/intltest/svccoll.h | 2 +- .../icu/icu-src/source/test/intltest/tchcfmt.cpp | 2 +- .../icu/icu-src/source/test/intltest/tchcfmt.h | 2 +- .../icu/icu-src/source/test/intltest/testidn.cpp | 4 +- .../icu/icu-src/source/test/intltest/testidna.cpp | 5 +- .../icu/icu-src/source/test/intltest/testidna.h | 4 +- .../icu/icu-src/source/test/intltest/testutil.cpp | 258 +- .../icu/icu-src/source/test/intltest/testutil.h | 28 +- .../icu/icu-src/source/test/intltest/textfile.cpp | 2 +- .../icu/icu-src/source/test/intltest/textfile.h | 2 +- .../icu/icu-src/source/test/intltest/tfsmalls.cpp | 2 +- .../icu/icu-src/source/test/intltest/tfsmalls.h | 2 +- .../icu/icu-src/source/test/intltest/thcoll.cpp | 2 +- .../libs/icu/icu-src/source/test/intltest/thcoll.h | 2 +- .../icu/icu-src/source/test/intltest/tmsgfmt.cpp | 8 +- .../icu/icu-src/source/test/intltest/tmsgfmt.h | 2 +- .../icu/icu-src/source/test/intltest/tokiter.cpp | 2 +- .../icu/icu-src/source/test/intltest/tokiter.h | 2 +- .../icu/icu-src/source/test/intltest/transapi.cpp | 2 +- .../icu/icu-src/source/test/intltest/transapi.h | 2 +- .../icu/icu-src/source/test/intltest/transrt.cpp | 2 +- .../icu/icu-src/source/test/intltest/transrt.h | 2 +- .../icu/icu-src/source/test/intltest/transtst.cpp | 9 +- .../icu/icu-src/source/test/intltest/transtst.h | 2 +- .../icu/icu-src/source/test/intltest/trcoll.cpp | 2 +- .../libs/icu/icu-src/source/test/intltest/trcoll.h | 2 +- .../icu/icu-src/source/test/intltest/trnserr.cpp | 2 +- .../icu/icu-src/source/test/intltest/trnserr.h | 2 +- .../icu/icu-src/source/test/intltest/tscoll.cpp | 2 +- .../libs/icu/icu-src/source/test/intltest/tscoll.h | 2 +- .../icu/icu-src/source/test/intltest/tsdate.cpp | 3 +- .../libs/icu/icu-src/source/test/intltest/tsdate.h | 2 +- .../icu/icu-src/source/test/intltest/tsdcfmsy.cpp | 46 +- .../icu/icu-src/source/test/intltest/tsdcfmsy.h | 3 +- .../icu/icu-src/source/test/intltest/tsdtfmsy.cpp | 2 +- .../icu/icu-src/source/test/intltest/tsdtfmsy.h | 2 +- .../icu/icu-src/source/test/intltest/tsmthred.cpp | 2 +- .../icu/icu-src/source/test/intltest/tsmthred.h | 2 +- .../icu/icu-src/source/test/intltest/tsnmfmt.cpp | 2 +- .../icu/icu-src/source/test/intltest/tsnmfmt.h | 2 +- .../icu/icu-src/source/test/intltest/tsputil.cpp | 2 +- .../icu/icu-src/source/test/intltest/tsputil.h | 2 +- .../icu/icu-src/source/test/intltest/tstnorm.cpp | 321 +- .../icu/icu-src/source/test/intltest/tstnorm.h | 9 +- .../icu/icu-src/source/test/intltest/tstnrapi.cpp | 2 +- .../icu/icu-src/source/test/intltest/tufmtts.cpp | 2 +- .../icu/icu-src/source/test/intltest/tzbdtest.cpp | 2 +- .../icu/icu-src/source/test/intltest/tzbdtest.h | 2 +- .../icu/icu-src/source/test/intltest/tzfmttst.cpp | 104 +- .../icu/icu-src/source/test/intltest/tzfmttst.h | 4 +- .../icu/icu-src/source/test/intltest/tzoffloc.cpp | 2 +- .../icu/icu-src/source/test/intltest/tzoffloc.h | 2 +- .../icu/icu-src/source/test/intltest/tzregts.cpp | 2 +- .../icu/icu-src/source/test/intltest/tzregts.h | 2 +- .../icu/icu-src/source/test/intltest/tzrulets.cpp | 3 +- .../icu/icu-src/source/test/intltest/tzrulets.h | 2 +- .../icu/icu-src/source/test/intltest/tztest.cpp | 71 +- .../libs/icu/icu-src/source/test/intltest/tztest.h | 2 +- .../icu/icu-src/source/test/intltest/ucaconf.cpp | 2 +- .../icu/icu-src/source/test/intltest/ucaconf.h | 2 +- .../icu/icu-src/source/test/intltest/ucdtest.cpp | 20 +- .../icu/icu-src/source/test/intltest/ucdtest.h | 3 +- .../source/test/intltest/ucharstrietest.cpp | 5 +- .../source/test/intltest/unifiedcachetest.cpp | 2 +- .../icu/icu-src/source/test/intltest/uobjtest.cpp | 11 +- .../icu/icu-src/source/test/intltest/uobjtest.h | 2 +- .../icu/icu-src/source/test/intltest/usettest.cpp | 105 +- .../icu/icu-src/source/test/intltest/usettest.h | 4 +- .../icu/icu-src/source/test/intltest/ustrtest.cpp | 95 +- .../icu/icu-src/source/test/intltest/ustrtest.h | 30 +- .../icu/icu-src/source/test/intltest/uts46test.cpp | 136 +- .../icu/icu-src/source/test/intltest/utxttest.cpp | 66 +- .../icu/icu-src/source/test/intltest/utxttest.h | 3 +- .../icu/icu-src/source/test/intltest/uvectest.cpp | 2 +- .../icu/icu-src/source/test/intltest/uvectest.h | 2 +- .../icu/icu-src/source/test/intltest/v32test.cpp | 2 +- .../icu/icu-src/source/test/intltest/v32test.h | 2 +- .../icu/icu-src/source/test/intltest/windttst.cpp | 23 +- .../icu/icu-src/source/test/intltest/windttst.h | 6 +- .../icu/icu-src/source/test/intltest/winnmtst.cpp | 23 +- .../icu/icu-src/source/test/intltest/winnmtst.h | 6 +- .../icu/icu-src/source/test/intltest/winutil.cpp | 8 +- .../icu/icu-src/source/test/intltest/winutil.h | 6 +- .../icu/icu-src/source/test/iotest/Makefile.in | 2 +- .../libs/icu/icu-src/source/test/iotest/filetst.c | 4 +- .../libs/icu/icu-src/source/test/iotest/iotest.cpp | 6 +- .../libs/icu/icu-src/source/test/iotest/iotest.h | 4 +- .../icu/icu-src/source/test/iotest/iotest.vcxproj | 537 +- .../libs/icu/icu-src/source/test/iotest/stream.cpp | 10 +- .../libs/icu/icu-src/source/test/iotest/strtst.c | 4 +- .../libs/icu/icu-src/source/test/iotest/trnstst.c | 2 +- .../icu/icu-src/source/test/letest/FontObject.cpp | 2 +- .../icu/icu-src/source/test/letest/FontObject.h | 2 +- .../icu-src/source/test/letest/FontTableCache.cpp | 2 +- .../icu-src/source/test/letest/FontTableCache.h | 2 +- .../source/test/letest/PortableFontInstance.cpp | 2 +- .../source/test/letest/PortableFontInstance.h | 2 +- .../source/test/letest/SimpleFontInstance.cpp | 2 +- .../source/test/letest/SimpleFontInstance.h | 2 +- .../libs/icu/icu-src/source/test/letest/cfonts.cpp | 2 +- .../libs/icu/icu-src/source/test/letest/cfonts.h | 2 +- .../libs/icu/icu-src/source/test/letest/cletest.c | 2 +- .../icu/icu-src/source/test/letest/cletest.vcxproj | 382 +- .../libs/icu/icu-src/source/test/letest/cmaps.cpp | 2 +- .../libs/icu/icu-src/source/test/letest/cmaps.h | 2 +- .../icu/icu-src/source/test/letest/gendata.cpp | 2 +- .../icu/icu-src/source/test/letest/gendata.vcxproj | 516 +- .../libs/icu/icu-src/source/test/letest/letest.cpp | 2 +- .../libs/icu/icu-src/source/test/letest/letest.h | 2 +- .../icu/icu-src/source/test/letest/letest.vcxproj | 562 +- .../icu/icu-src/source/test/letest/letsutil.cpp | 2 +- .../libs/icu/icu-src/source/test/letest/letsutil.h | 2 +- .../libs/icu/icu-src/source/test/letest/sfnt.h | 2 +- .../icu/icu-src/source/test/letest/testdata.cpp | 2 +- .../icu/icu-src/source/test/letest/xmlreader.cpp | 2 +- .../icu/icu-src/source/test/letest/xmlreader.h | 2 +- .../source/test/perf/DateFmtPerf/DateFmtPerf.cpp | 2 +- .../source/test/perf/DateFmtPerf/DateFmtPerf.h | 2 +- .../test/perf/DateFmtPerf/DateFmtPerf.vcxproj | 238 +- .../source/test/perf/DateFmtPerf/breakdata.h | 2 +- .../source/test/perf/DateFmtPerf/collationdata.h | 2 +- .../source/test/perf/DateFmtPerf/datedata.h | 2 +- .../icu-src/source/test/perf/charperf/charperf.cpp | 2 +- .../icu-src/source/test/perf/charperf/charperf.h | 2 +- .../source/test/perf/charperf/charperf.vcxproj | 554 +- .../source/test/perf/collationperf/collperf.cpp | 2 +- .../icu-src/source/test/perf/collperf/collperf.cpp | 24 +- .../source/test/perf/collperf/collperf.vcxproj | 532 +- .../source/test/perf/collperf2/collperf2.cpp | 2 +- .../source/test/perf/collperf2/collperf2.vcxproj | 2 +- .../icu-src/source/test/perf/convperf/convperf.cpp | 2 +- .../icu-src/source/test/perf/convperf/convperf.h | 2 +- .../source/test/perf/convperf/convperf.vcxproj | 556 +- .../icu/icu-src/source/test/perf/convperf/data.h | 2 +- .../source/test/perf/dicttrieperf/dicttrieperf.cpp | 4 +- .../source/test/perf/howExpensiveIs/Makefile.in | 2 +- .../test/perf/howExpensiveIs/howExpensiveIs.cpp | 2 +- .../source/test/perf/howExpensiveIs/sieve.cpp | 2 +- .../source/test/perf/howExpensiveIs/sieve.h | 2 +- .../icu-src/source/test/perf/leperf/FontObject.cpp | 2 +- .../icu-src/source/test/perf/leperf/FontObject.h | 2 +- .../source/test/perf/leperf/FontTableCache.cpp | 2 +- .../source/test/perf/leperf/FontTableCache.h | 2 +- .../test/perf/leperf/PortableFontInstance.cpp | 2 +- .../source/test/perf/leperf/PortableFontInstance.h | 2 +- .../source/test/perf/leperf/SimpleFontInstance.cpp | 2 +- .../source/test/perf/leperf/SimpleFontInstance.h | 2 +- .../icu/icu-src/source/test/perf/leperf/cfonts.cpp | 2 +- .../icu/icu-src/source/test/perf/leperf/cfonts.h | 2 +- .../icu/icu-src/source/test/perf/leperf/cmaps.cpp | 2 +- .../icu/icu-src/source/test/perf/leperf/cmaps.h | 2 +- .../icu/icu-src/source/test/perf/leperf/leperf.cpp | 2 +- .../icu-src/source/test/perf/leperf/letrperf.cpp | 2 +- .../icu/icu-src/source/test/perf/leperf/sfnt.h | 2 +- .../icu-src/source/test/perf/leperf/xmlreader.cpp | 2 +- .../icu-src/source/test/perf/leperf/xmlreader.h | 2 +- .../source/test/perf/normperf/dtfmtrtperf.cpp | 2 +- .../source/test/perf/normperf/dtfmtrtperf.h | 2 +- .../source/test/perf/normperf/dtfmtrtperf.vcxproj | 2 +- .../icu-src/source/test/perf/normperf/normperf.cpp | 2 +- .../icu-src/source/test/perf/normperf/normperf.h | 4 +- .../source/test/perf/normperf/normperf.vcxproj | 554 +- .../source/test/perf/strsrchperf/strsrchperf.cpp | 2 +- .../source/test/perf/strsrchperf/strsrchperf.h | 2 +- .../test/perf/strsrchperf/strsrchperf.vcxproj | 554 +- .../icu-src/source/test/perf/ubrkperf/ubrkperf.cpp | 2 +- .../icu-src/source/test/perf/ubrkperf/ubrkperf.h | 2 +- .../source/test/perf/ubrkperf/ubrkperf.vcxproj | 538 +- .../source/test/perf/ubrkperf/ubrkperfold.cpp | 2 +- .../test/perf/ucnvavailperf/ucnvavailperf.cpp | 4 +- .../test/perf/ucnvavailperf/ucnvavailperf.vcxproj | 198 +- .../source/test/perf/unisetperf/draft/bitset.cpp | 4 +- .../source/test/perf/unisetperf/draft/trieset.cpp | 4 +- .../source/test/perf/unisetperf/draft/unicont.h | 4 +- .../source/test/perf/unisetperf/unisetperf.cpp | 4 +- .../source/test/perf/unisetperf/unisetperf.vcxproj | 496 +- .../icu-src/source/test/perf/usetperf/bitset.cpp | 2 +- .../icu/icu-src/source/test/perf/usetperf/bitset.h | 2 +- .../icu-src/source/test/perf/usetperf/usetperf.cpp | 2 +- .../source/test/perf/usetperf/usetperf.vcxproj | 564 +- .../source/test/perf/ustrperf/stringperf.cpp | 2 +- .../icu-src/source/test/perf/ustrperf/stringperf.h | 2 +- .../source/test/perf/ustrperf/stringperf.vcxproj | 554 +- .../icu-src/source/test/perf/utfperf/utfperf.cpp | 4 +- .../source/test/perf/utfperf/utfperf.vcxproj | 494 +- .../source/test/perf/utrie2perf/utrie2perf.cpp | 4 +- .../source/test/perf/utrie2perf/utrie2perf.vcxproj | 494 +- .../icu/icu-src/source/test/testdata/BidiTest.txt | 6 +- .../testdata/CollationTest_NON_IGNORABLE_SHORT.txt | 3307 +- .../test/testdata/CollationTest_SHIFTED_SHORT.txt | 3903 +- .../source/test/testdata/GraphemeBreakTest.txt | 182 +- .../icu/icu-src/source/test/testdata/IdnaTest.txt | 7848 ++++ .../icu-src/source/test/testdata/LineBreakTest.txt | 23 +- .../source/test/testdata/SentenceBreakTest.txt | 17 +- .../icu-src/source/test/testdata/WordBreakTest.txt | 268 +- .../source/test/testdata/break_rules/grapheme.txt | 8 +- .../source/test/testdata/break_rules/line.txt | 8 +- .../test/testdata/break_rules/line_loose.txt | 6 +- .../test/testdata/break_rules/line_loose_cj.txt | 6 +- .../test/testdata/break_rules/line_normal.txt | 6 +- .../test/testdata/break_rules/line_normal_cj.txt | 8 +- .../source/test/testdata/break_rules/readme.txt | 20 +- .../source/test/testdata/break_rules/word.txt | 15 +- .../test/testdata/break_rules/word_POSIX.txt | 15 +- .../icu-src/source/test/testdata/conversion.txt | 4 +- .../icu-src/source/test/testdata/emoji-test.txt | 3590 ++ .../testdata/numberformattestspecification.txt | 847 +- .../icu/icu-src/source/test/testdata/rbbitst.txt | 404 +- .../icu/icu-src/source/test/testdata/regextst.txt | 17 + .../libs/icu/icu-src/source/test/testdata/root.txt | 4 +- .../icu-src/source/test/testdata/structLocale.txt | 457 + .../libs/icu/icu-src/source/test/testmap/testmap.c | 2 +- .../icu/icu-src/source/test/thaitest/thaitest.cpp | 2 +- .../libs/icu/icu-src/source/tools/Makefile.in | 4 + .../libs/icu/icu-src/source/tools/ctestfw/ctest.c | 2 +- .../icu-src/source/tools/ctestfw/ctestfw.vcxproj | 575 +- .../icu/icu-src/source/tools/ctestfw/datamap.cpp | 5 +- .../icu/icu-src/source/tools/ctestfw/testdata.cpp | 2 +- .../icu/icu-src/source/tools/ctestfw/tstdtmod.cpp | 2 +- .../icu/icu-src/source/tools/ctestfw/ucln_ct.c | 2 +- .../icu-src/source/tools/ctestfw/unicode/ctest.h | 2 +- .../icu-src/source/tools/ctestfw/unicode/datamap.h | 2 +- .../source/tools/ctestfw/unicode/testdata.h | 2 +- .../icu-src/source/tools/ctestfw/unicode/testlog.h | 2 +- .../source/tools/ctestfw/unicode/testtype.h | 2 +- .../source/tools/ctestfw/unicode/tstdtmod.h | 2 +- .../icu-src/source/tools/ctestfw/unicode/uperf.h | 2 +- .../icu-src/source/tools/ctestfw/unicode/utimer.h | 2 +- .../icu/icu-src/source/tools/ctestfw/uperf.cpp | 8 +- .../icu/icu-src/source/tools/escapesrc/Makefile.in | 112 + .../icu/icu-src/source/tools/escapesrc/cptbl.h | 521 + .../icu-src/source/tools/escapesrc/escapesrc.cpp | 404 + .../source/tools/escapesrc/expect-simple.cpp | 17 + .../icu/icu-src/source/tools/escapesrc/tblgen.cpp | 80 + .../source/tools/escapesrc/test-nochange.cpp | 5 + .../icu-src/source/tools/escapesrc/test-simple.cpp | 17 + .../icu/icu-src/source/tools/genbrk/genbrk.cpp | 2 +- .../icu/icu-src/source/tools/genbrk/genbrk.vcxproj | 517 +- .../icu/icu-src/source/tools/genccode/genccode.c | 4 +- .../icu-src/source/tools/genccode/genccode.vcxproj | 509 +- .../icu/icu-src/source/tools/gencfu/gencfu.cpp | 2 +- .../icu/icu-src/source/tools/gencfu/gencfu.vcxproj | 491 +- .../libs/icu/icu-src/source/tools/gencmn/gencmn.c | 4 +- .../icu/icu-src/source/tools/gencmn/gencmn.vcxproj | 517 +- .../icu/icu-src/source/tools/gencnval/gencnval.c | 4 +- .../icu-src/source/tools/gencnval/gencnval.vcxproj | 517 +- .../tools/gencolusb/extract_unsafe_backwards.cpp | 2 +- .../icu-src/source/tools/gencolusb/verify_uset.cpp | 2 +- .../icu/icu-src/source/tools/gendict/gendict.cpp | 9 +- .../icu-src/source/tools/gendict/gendict.vcxproj | 517 +- .../icu/icu-src/source/tools/gennorm2/Makefile.in | 4 +- .../icu-src/source/tools/gennorm2/extradata.cpp | 253 + .../icu/icu-src/source/tools/gennorm2/extradata.h | 70 + .../icu/icu-src/source/tools/gennorm2/gennorm2.cpp | 86 +- .../icu-src/source/tools/gennorm2/gennorm2.vcxproj | 537 +- .../icu-src/source/tools/gennorm2/n2builder.cpp | 1426 +- .../icu/icu-src/source/tools/gennorm2/n2builder.h | 65 +- .../icu/icu-src/source/tools/gennorm2/norms.cpp | 332 + .../libs/icu/icu-src/source/tools/gennorm2/norms.h | 217 + .../icu/icu-src/source/tools/genrb/Makefile.in | 2 +- .../libs/icu/icu-src/source/tools/genrb/derb.cpp | 6 +- .../icu/icu-src/source/tools/genrb/derb.vcxproj | 563 +- .../libs/icu/icu-src/source/tools/genrb/errmsg.c | 2 +- .../libs/icu/icu-src/source/tools/genrb/errmsg.h | 2 +- .../libs/icu/icu-src/source/tools/genrb/genrb.cpp | 4 +- .../libs/icu/icu-src/source/tools/genrb/genrb.h | 2 +- .../icu/icu-src/source/tools/genrb/genrb.vcxproj | 3 +- .../libs/icu/icu-src/source/tools/genrb/parse.cpp | 12 +- .../libs/icu/icu-src/source/tools/genrb/parse.h | 2 +- .../icu/icu-src/source/tools/genrb/prscmnts.cpp | 2 +- .../libs/icu/icu-src/source/tools/genrb/prscmnts.h | 2 +- .../libs/icu/icu-src/source/tools/genrb/rbutil.c | 2 +- .../libs/icu/icu-src/source/tools/genrb/rbutil.h | 2 +- .../libs/icu/icu-src/source/tools/genrb/read.c | 2 +- .../libs/icu/icu-src/source/tools/genrb/read.h | 2 +- .../icu/icu-src/source/tools/genrb/reslist.cpp | 8 +- .../libs/icu/icu-src/source/tools/genrb/reslist.h | 4 +- .../libs/icu/icu-src/source/tools/genrb/rle.c | 2 +- .../libs/icu/icu-src/source/tools/genrb/rle.h | 2 +- .../libs/icu/icu-src/source/tools/genrb/ustr.c | 2 +- .../libs/icu/icu-src/source/tools/genrb/ustr.h | 2 +- .../icu/icu-src/source/tools/genrb/wrtjava.cpp | 24 +- .../libs/icu/icu-src/source/tools/genrb/wrtxml.cpp | 11 +- .../libs/icu/icu-src/source/tools/genren/Makefile | 2 +- .../libs/icu/icu-src/source/tools/genren/README | 17 +- .../libs/icu/icu-src/source/tools/genren/genren.pl | 10 +- .../icu/icu-src/source/tools/gensprep/gensprep.c | 6 +- .../icu/icu-src/source/tools/gensprep/gensprep.h | 4 +- .../icu-src/source/tools/gensprep/gensprep.vcxproj | 521 +- .../libs/icu/icu-src/source/tools/gensprep/store.c | 4 +- .../icu/icu-src/source/tools/gentest/genres32.c | 4 +- .../icu/icu-src/source/tools/gentest/gentest.c | 4 +- .../icu/icu-src/source/tools/gentest/gentest.h | 2 +- .../icu-src/source/tools/gentest/gentest.vcxproj | 503 +- .../icu/icu-src/source/tools/icu-svnprops-check.py | 108 +- .../icu/icu-src/source/tools/icuinfo/icuinfo.cpp | 4 +- .../icu-src/source/tools/icuinfo/icuinfo.vcxproj | 519 +- .../icu/icu-src/source/tools/icuinfo/testplug.c | 2 +- .../icu-src/source/tools/icuinfo/testplug.vcxproj | 525 +- .../icu/icu-src/source/tools/icupkg/icupkg.cpp | 4 +- .../icu/icu-src/source/tools/icupkg/icupkg.vcxproj | 495 +- .../icu/icu-src/source/tools/icuswap/icuswap.cpp | 4 +- .../icu-src/source/tools/icuswap/icuswap.vcxproj | 3 +- .../icu/icu-src/source/tools/makeconv/Makefile.in | 2 +- .../icu/icu-src/source/tools/makeconv/gencnvex.c | 4 +- .../icu/icu-src/source/tools/makeconv/genmbcs.cpp | 19 +- .../icu/icu-src/source/tools/makeconv/genmbcs.h | 4 +- .../icu-src/source/tools/makeconv/makeconv.1.in | 4 +- .../icu/icu-src/source/tools/makeconv/makeconv.cpp | 2 +- .../icu/icu-src/source/tools/makeconv/makeconv.h | 15 +- .../icu-src/source/tools/makeconv/makeconv.vcxproj | 3 +- .../icu/icu-src/source/tools/makeconv/ucnvstat.c | 2 +- .../icu/icu-src/source/tools/pkgdata/Makefile.in | 2 +- .../icu/icu-src/source/tools/pkgdata/pkgdata.cpp | 62 +- .../icu-src/source/tools/pkgdata/pkgdata.vcxproj | 549 +- .../icu/icu-src/source/tools/pkgdata/pkgtypes.c | 2 +- .../icu/icu-src/source/tools/pkgdata/pkgtypes.h | 2 +- .../icu/icu-src/source/tools/toolutil/Makefile.in | 2 +- .../source/tools/toolutil/collationinfo.cpp | 2 +- .../icu-src/source/tools/toolutil/collationinfo.h | 2 +- .../icu/icu-src/source/tools/toolutil/dbgutil.cpp | 6 +- .../icu/icu-src/source/tools/toolutil/dbgutil.h | 2 +- .../icu-src/source/tools/toolutil/denseranges.cpp | 4 +- .../icu-src/source/tools/toolutil/denseranges.h | 4 +- .../icu/icu-src/source/tools/toolutil/filestrm.c | 227 - .../icu/icu-src/source/tools/toolutil/filestrm.cpp | 227 + .../icu/icu-src/source/tools/toolutil/filestrm.h | 2 +- .../icu-src/source/tools/toolutil/filetools.cpp | 2 +- .../icu/icu-src/source/tools/toolutil/filetools.h | 4 +- .../icu/icu-src/source/tools/toolutil/flagparser.c | 180 - .../icu-src/source/tools/toolutil/flagparser.cpp | 180 + .../icu/icu-src/source/tools/toolutil/flagparser.h | 4 +- .../icu/icu-src/source/tools/toolutil/package.cpp | 14 +- .../icu/icu-src/source/tools/toolutil/package.h | 4 +- .../icu/icu-src/source/tools/toolutil/pkg_genc.c | 1199 - .../icu/icu-src/source/tools/toolutil/pkg_genc.cpp | 1214 + .../icu/icu-src/source/tools/toolutil/pkg_genc.h | 2 +- .../icu/icu-src/source/tools/toolutil/pkg_gencmn.c | 573 - .../icu-src/source/tools/toolutil/pkg_gencmn.cpp | 578 + .../icu/icu-src/source/tools/toolutil/pkg_gencmn.h | 2 +- .../icu/icu-src/source/tools/toolutil/pkg_icu.cpp | 2 +- .../icu/icu-src/source/tools/toolutil/pkg_icu.h | 2 +- .../icu/icu-src/source/tools/toolutil/pkg_imp.h | 4 +- .../icu/icu-src/source/tools/toolutil/pkgitems.cpp | 4 +- .../icu/icu-src/source/tools/toolutil/ppucd.cpp | 51 +- .../libs/icu/icu-src/source/tools/toolutil/ppucd.h | 11 +- .../icu/icu-src/source/tools/toolutil/swapimpl.cpp | 5 +- .../icu/icu-src/source/tools/toolutil/swapimpl.h | 4 +- .../icu/icu-src/source/tools/toolutil/toolutil.cpp | 4 +- .../icu/icu-src/source/tools/toolutil/toolutil.h | 4 +- .../icu-src/source/tools/toolutil/toolutil.vcxproj | 35 +- .../icu/icu-src/source/tools/toolutil/ucbuf.cpp | 2 +- .../libs/icu/icu-src/source/tools/toolutil/ucbuf.h | 2 +- .../icu/icu-src/source/tools/toolutil/ucln_tu.cpp | 2 +- .../libs/icu/icu-src/source/tools/toolutil/ucm.c | 1191 - .../libs/icu/icu-src/source/tools/toolutil/ucm.cpp | 1195 + .../libs/icu/icu-src/source/tools/toolutil/ucm.h | 4 +- .../icu/icu-src/source/tools/toolutil/ucmstate.c | 1049 - .../icu/icu-src/source/tools/toolutil/ucmstate.cpp | 1052 + .../icu/icu-src/source/tools/toolutil/udbgutil.cpp | 38 +- .../icu/icu-src/source/tools/toolutil/udbgutil.h | 2 +- .../icu/icu-src/source/tools/toolutil/unewdata.c | 276 - .../icu/icu-src/source/tools/toolutil/unewdata.cpp | 276 + .../icu/icu-src/source/tools/toolutil/unewdata.h | 4 +- .../icu/icu-src/source/tools/toolutil/uoptions.c | 133 - .../icu/icu-src/source/tools/toolutil/uoptions.cpp | 133 + .../icu/icu-src/source/tools/toolutil/uoptions.h | 4 +- .../icu/icu-src/source/tools/toolutil/uparse.c | 383 - .../icu/icu-src/source/tools/toolutil/uparse.cpp | 383 + .../icu/icu-src/source/tools/toolutil/uparse.h | 4 +- .../icu/icu-src/source/tools/toolutil/writesrc.c | 268 - .../icu/icu-src/source/tools/toolutil/writesrc.cpp | 268 + .../icu/icu-src/source/tools/toolutil/writesrc.h | 4 +- .../icu-src/source/tools/toolutil/xmlparser.cpp | 8 +- .../icu/icu-src/source/tools/toolutil/xmlparser.h | 4 +- .../icu/icu-src/source/tools/tzcode/Makefile.in | 6 +- .../icu/icu-src/source/tools/tzcode/icuregions | 1 + .../icu/icu-src/source/tools/tzcode/icuzdump.cpp | 4 +- .../icu-src/source/tools/tzcode/icuzdump.vcxproj | 3 +- .../libs/icu/icu-src/source/tools/tzcode/icuzones | 7 + .../icu/icu-src/source/tools/tzcode/tz2icu.cpp | 2 +- .../libs/icu/icu-src/source/tools/tzcode/tz2icu.h | 2 +- .../libs/icu/icu-src/source/tools/tzcode/zdump.c | 10 +- Build/source/libs/icu/version.ac | 4 +- 2298 files changed, 151505 insertions(+), 333528 deletions(-) create mode 100644 Build/source/libs/icu/icu-src/source/common/bytesinkutil.cpp create mode 100644 Build/source/libs/icu/icu-src/source/common/bytesinkutil.h delete mode 100644 Build/source/libs/icu/icu-src/source/common/cmemory.c create mode 100644 Build/source/libs/icu/icu-src/source/common/cmemory.cpp create mode 100644 Build/source/libs/icu/icu-src/source/common/common_uwp.vcxproj delete mode 100644 Build/source/libs/icu/icu-src/source/common/cstring.c create mode 100644 Build/source/libs/icu/icu-src/source/common/cstring.cpp delete mode 100644 Build/source/libs/icu/icu-src/source/common/cwchar.c create mode 100644 Build/source/libs/icu/icu-src/source/common/cwchar.cpp create mode 100644 Build/source/libs/icu/icu-src/source/common/edits.cpp delete mode 100644 Build/source/libs/icu/icu-src/source/common/icudataver.c create mode 100644 Build/source/libs/icu/icu-src/source/common/icudataver.cpp delete mode 100644 Build/source/libs/icu/icu-src/source/common/locmap.c create mode 100644 Build/source/libs/icu/icu-src/source/common/locmap.cpp delete mode 100644 Build/source/libs/icu/icu-src/source/common/propsvec.c create mode 100644 Build/source/libs/icu/icu-src/source/common/propsvec.cpp create mode 100644 Build/source/libs/icu/icu-src/source/common/rbbi_cache.cpp create mode 100644 Build/source/libs/icu/icu-src/source/common/rbbi_cache.h delete mode 100644 Build/source/libs/icu/icu-src/source/common/uarrsort.c create mode 100644 Build/source/libs/icu/icu-src/source/common/uarrsort.cpp delete mode 100644 Build/source/libs/icu/icu-src/source/common/ubidi.c create mode 100644 Build/source/libs/icu/icu-src/source/common/ubidi.cpp delete mode 100644 Build/source/libs/icu/icu-src/source/common/ubidi_props.c create mode 100644 Build/source/libs/icu/icu-src/source/common/ubidi_props.cpp delete mode 100644 Build/source/libs/icu/icu-src/source/common/ubidiln.c create mode 100644 Build/source/libs/icu/icu-src/source/common/ubidiln.cpp delete mode 100644 Build/source/libs/icu/icu-src/source/common/ubiditransform.c create mode 100644 Build/source/libs/icu/icu-src/source/common/ubiditransform.cpp delete mode 100644 Build/source/libs/icu/icu-src/source/common/ubidiwrt.c create mode 100644 Build/source/libs/icu/icu-src/source/common/ubidiwrt.cpp create mode 100644 Build/source/libs/icu/icu-src/source/common/ucasemap_imp.h delete mode 100644 Build/source/libs/icu/icu-src/source/common/ucat.c create mode 100644 Build/source/libs/icu/icu-src/source/common/ucat.cpp delete mode 100644 Build/source/libs/icu/icu-src/source/common/uchar.c create mode 100644 Build/source/libs/icu/icu-src/source/common/uchar.cpp delete mode 100644 Build/source/libs/icu/icu-src/source/common/ucmndata.c create mode 100644 Build/source/libs/icu/icu-src/source/common/ucmndata.cpp delete mode 100644 Build/source/libs/icu/icu-src/source/common/ucnv.c create mode 100644 Build/source/libs/icu/icu-src/source/common/ucnv.cpp delete mode 100644 Build/source/libs/icu/icu-src/source/common/ucnv_cb.c create mode 100644 Build/source/libs/icu/icu-src/source/common/ucnv_cb.cpp delete mode 100644 Build/source/libs/icu/icu-src/source/common/ucnv_cnv.c create mode 100644 Build/source/libs/icu/icu-src/source/common/ucnv_cnv.cpp delete mode 100644 Build/source/libs/icu/icu-src/source/common/ucnv_ct.c create mode 100644 Build/source/libs/icu/icu-src/source/common/ucnv_ct.cpp delete mode 100644 Build/source/libs/icu/icu-src/source/common/ucnv_err.c create mode 100644 Build/source/libs/icu/icu-src/source/common/ucnv_err.cpp delete mode 100644 Build/source/libs/icu/icu-src/source/common/ucnv_lmb.c create mode 100644 Build/source/libs/icu/icu-src/source/common/ucnv_lmb.cpp delete mode 100644 Build/source/libs/icu/icu-src/source/common/ucnv_set.c create mode 100644 Build/source/libs/icu/icu-src/source/common/ucnv_set.cpp delete mode 100644 Build/source/libs/icu/icu-src/source/common/ucnv_u16.c create mode 100644 Build/source/libs/icu/icu-src/source/common/ucnv_u16.cpp delete mode 100644 Build/source/libs/icu/icu-src/source/common/ucnv_u32.c create mode 100644 Build/source/libs/icu/icu-src/source/common/ucnv_u32.cpp delete mode 100644 Build/source/libs/icu/icu-src/source/common/ucnv_u7.c create mode 100644 Build/source/libs/icu/icu-src/source/common/ucnv_u7.cpp delete mode 100644 Build/source/libs/icu/icu-src/source/common/ucnv_u8.c create mode 100644 Build/source/libs/icu/icu-src/source/common/ucnv_u8.cpp delete mode 100644 Build/source/libs/icu/icu-src/source/common/ucnvdisp.c create mode 100644 Build/source/libs/icu/icu-src/source/common/ucnvdisp.cpp delete mode 100644 Build/source/libs/icu/icu-src/source/common/ucnvhz.c create mode 100644 Build/source/libs/icu/icu-src/source/common/ucnvhz.cpp delete mode 100644 Build/source/libs/icu/icu-src/source/common/ucnvisci.c create mode 100644 Build/source/libs/icu/icu-src/source/common/ucnvisci.cpp delete mode 100644 Build/source/libs/icu/icu-src/source/common/ucnvlat1.c create mode 100644 Build/source/libs/icu/icu-src/source/common/ucnvlat1.cpp delete mode 100644 Build/source/libs/icu/icu-src/source/common/ucnvscsu.c create mode 100644 Build/source/libs/icu/icu-src/source/common/ucnvscsu.cpp delete mode 100644 Build/source/libs/icu/icu-src/source/common/udatamem.c create mode 100644 Build/source/libs/icu/icu-src/source/common/udatamem.cpp delete mode 100644 Build/source/libs/icu/icu-src/source/common/udataswp.c create mode 100644 Build/source/libs/icu/icu-src/source/common/udataswp.cpp delete mode 100644 Build/source/libs/icu/icu-src/source/common/uenum.c create mode 100644 Build/source/libs/icu/icu-src/source/common/uenum.cpp delete mode 100644 Build/source/libs/icu/icu-src/source/common/uhash.c create mode 100644 Build/source/libs/icu/icu-src/source/common/uhash.cpp delete mode 100644 Build/source/libs/icu/icu-src/source/common/uinvchar.c create mode 100644 Build/source/libs/icu/icu-src/source/common/uinvchar.cpp delete mode 100644 Build/source/libs/icu/icu-src/source/common/ulist.c create mode 100644 Build/source/libs/icu/icu-src/source/common/ulist.cpp delete mode 100644 Build/source/libs/icu/icu-src/source/common/uloc_tag.c create mode 100644 Build/source/libs/icu/icu-src/source/common/uloc_tag.cpp delete mode 100644 Build/source/libs/icu/icu-src/source/common/umapfile.c create mode 100644 Build/source/libs/icu/icu-src/source/common/umapfile.cpp delete mode 100644 Build/source/libs/icu/icu-src/source/common/umath.c create mode 100644 Build/source/libs/icu/icu-src/source/common/umath.cpp create mode 100644 Build/source/libs/icu/icu-src/source/common/unicode/casemap.h create mode 100644 Build/source/libs/icu/icu-src/source/common/unicode/char16ptr.h create mode 100644 Build/source/libs/icu/icu-src/source/common/unicode/edits.h create mode 100644 Build/source/libs/icu/icu-src/source/common/unicode/stringoptions.h delete mode 100644 Build/source/libs/icu/icu-src/source/common/ures_cnv.c create mode 100644 Build/source/libs/icu/icu-src/source/common/ures_cnv.cpp delete mode 100644 Build/source/libs/icu/icu-src/source/common/usc_impl.c create mode 100644 Build/source/libs/icu/icu-src/source/common/usc_impl.cpp delete mode 100644 Build/source/libs/icu/icu-src/source/common/uscript.c create mode 100644 Build/source/libs/icu/icu-src/source/common/uscript.cpp delete mode 100644 Build/source/libs/icu/icu-src/source/common/ustrfmt.c create mode 100644 Build/source/libs/icu/icu-src/source/common/ustrfmt.cpp delete mode 100644 Build/source/libs/icu/icu-src/source/common/utf_impl.c create mode 100644 Build/source/libs/icu/icu-src/source/common/utf_impl.cpp delete mode 100644 Build/source/libs/icu/icu-src/source/common/utrace.c create mode 100644 Build/source/libs/icu/icu-src/source/common/utrace.cpp delete mode 100644 Build/source/libs/icu/icu-src/source/common/utypes.c create mode 100644 Build/source/libs/icu/icu-src/source/common/utypes.cpp delete mode 100644 Build/source/libs/icu/icu-src/source/common/wintz.c create mode 100644 Build/source/libs/icu/icu-src/source/common/wintz.cpp delete mode 100644 Build/source/libs/icu/icu-src/source/data/in/icudt58l.dat create mode 100644 Build/source/libs/icu/icu-src/source/data/in/icudt60l.dat create mode 100644 Build/source/libs/icu/icu-src/source/data/makedata_uwp.vcxproj delete mode 100644 Build/source/libs/icu/icu-src/source/data/misc/currencyNumericCodes.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/misc/dayPeriods.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/misc/genderList.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/misc/icudata.rc delete mode 100644 Build/source/libs/icu/icu-src/source/data/misc/icustd.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/misc/icuver.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/misc/keyTypeData.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/misc/likelySubtags.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/misc/metaZones.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/misc/metadata.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/misc/miscfiles.mk delete mode 100644 Build/source/libs/icu/icu-src/source/data/misc/numberingSystems.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/misc/plurals.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/misc/supplementalData.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/misc/timezoneTypes.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/misc/windowsZones.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/misc/zoneinfo64.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/af.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/agq.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/ak.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/am.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/ar.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/as.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/asa.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/ast.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/az.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/az_AZ.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/az_Cyrl.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/az_Latn.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/az_Latn_AZ.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/bas.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/be.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/bem.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/bez.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/bg.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/bm.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/bn.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/bo.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/br.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/brx.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/bs.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/bs_BA.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/bs_Cyrl.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/bs_Latn.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/bs_Latn_BA.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/ca.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/ce.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/cgg.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/chr.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/ckb.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/cs.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/cy.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/da.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/dav.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/de.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/de_CH.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/dje.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/dsb.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/dua.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/dyo.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/dz.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/ebu.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/ee.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/el.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/en.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/en_001.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/en_150.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/en_AG.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/en_AI.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/en_AT.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/en_AU.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/en_BB.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/en_BE.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/en_BM.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/en_BS.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/en_BW.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/en_BZ.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/en_CA.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/en_CC.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/en_CH.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/en_CK.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/en_CM.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/en_CX.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/en_CY.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/en_DE.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/en_DG.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/en_DK.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/en_DM.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/en_ER.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/en_FI.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/en_FJ.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/en_FK.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/en_FM.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/en_GB.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/en_GD.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/en_GG.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/en_GH.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/en_GI.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/en_GM.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/en_GY.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/en_HK.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/en_IE.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/en_IL.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/en_IM.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/en_IN.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/en_IO.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/en_JE.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/en_JM.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/en_KE.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/en_KI.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/en_KN.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/en_KY.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/en_LC.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/en_LR.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/en_LS.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/en_MG.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/en_MO.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/en_MS.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/en_MT.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/en_MU.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/en_MW.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/en_MY.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/en_NA.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/en_NF.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/en_NG.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/en_NH.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/en_NL.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/en_NR.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/en_NU.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/en_NZ.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/en_PG.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/en_PH.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/en_PK.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/en_PN.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/en_PW.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/en_RH.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/en_RW.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/en_SB.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/en_SC.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/en_SD.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/en_SE.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/en_SG.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/en_SH.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/en_SI.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/en_SL.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/en_SS.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/en_SX.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/en_SZ.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/en_TC.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/en_TK.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/en_TO.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/en_TT.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/en_TV.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/en_TZ.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/en_UG.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/en_VC.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/en_VG.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/en_VU.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/en_WS.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/en_ZA.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/en_ZM.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/en_ZW.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/eo.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/es.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/es_419.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/es_AR.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/es_BO.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/es_BR.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/es_CL.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/es_CO.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/es_CR.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/es_CU.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/es_DO.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/es_EC.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/es_GT.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/es_HN.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/es_MX.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/es_NI.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/es_PA.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/es_PE.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/es_PR.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/es_PY.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/es_SV.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/es_US.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/es_UY.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/es_VE.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/et.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/eu.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/ewo.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/fa.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/ff.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/fi.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/fil.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/fil_PH.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/fo.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/fr.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/fr_CA.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/fr_HT.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/fur.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/fy.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/ga.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/gd.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/gl.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/gsw.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/gu.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/guz.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/gv.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/ha.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/haw.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/he.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/he_IL.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/hi.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/hr.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/hsb.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/hu.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/hy.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/id.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/id_ID.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/ig.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/ii.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/in.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/in_ID.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/is.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/it.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/iw.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/iw_IL.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/ja.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/ja_JP.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/ja_JP_TRADITIONAL.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/jgo.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/jmc.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/ka.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/kab.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/kam.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/kde.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/kea.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/khq.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/ki.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/kk.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/kkj.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/kl.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/kln.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/km.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/kn.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/ko.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/kok.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/ks.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/ksb.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/ksf.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/ksh.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/kw.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/ky.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/lag.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/lb.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/lg.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/lkt.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/ln.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/lo.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/lrc.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/lt.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/lu.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/luo.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/luy.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/lv.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/mas.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/mer.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/mfe.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/mg.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/mgh.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/mgo.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/mk.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/ml.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/mn.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/mo.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/mr.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/ms.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/mt.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/mua.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/my.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/mzn.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/naq.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/nb.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/nb_NO.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/nd.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/nds.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/ne.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/nl.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/nmg.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/nn.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/nn_NO.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/nnh.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/no.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/no_NO.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/no_NO_NY.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/nus.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/nyn.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/om.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/or.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/os.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/pa.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/pa_Arab.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/pa_Arab_PK.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/pa_Guru.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/pa_Guru_IN.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/pa_IN.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/pa_PK.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/pl.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/pool.res delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/ps.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/pt.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/pt_AO.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/pt_CH.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/pt_CV.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/pt_GQ.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/pt_GW.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/pt_LU.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/pt_MO.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/pt_MZ.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/pt_PT.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/pt_ST.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/pt_TL.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/qu.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/resfiles.mk delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/rm.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/rn.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/ro.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/ro_MD.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/rof.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/root.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/ru.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/rw.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/rwk.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/sah.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/saq.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/sbp.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/se.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/seh.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/ses.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/sg.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/sh.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/sh_BA.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/sh_CS.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/sh_YU.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/shi.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/shi_Latn.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/shi_MA.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/shi_Tfng.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/shi_Tfng_MA.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/si.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/sk.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/sl.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/smn.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/sn.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/so.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/sq.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/sr.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/sr_BA.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/sr_CS.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/sr_Cyrl.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/sr_Cyrl_BA.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/sr_Cyrl_CS.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/sr_Cyrl_RS.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/sr_Cyrl_XK.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/sr_Cyrl_YU.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/sr_Latn.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/sr_Latn_BA.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/sr_Latn_CS.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/sr_Latn_ME.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/sr_Latn_RS.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/sr_Latn_YU.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/sr_ME.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/sr_RS.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/sr_XK.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/sr_YU.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/sv.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/sv_FI.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/sw.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/ta.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/te.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/teo.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/th.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/th_TH.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/th_TH_TRADITIONAL.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/ti.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/tl.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/tl_PH.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/to.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/tr.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/twq.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/tzm.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/ug.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/uk.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/ur.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/ur_IN.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/uz.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/uz_AF.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/uz_Arab.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/uz_Arab_AF.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/uz_Cyrl.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/uz_Latn.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/uz_Latn_UZ.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/uz_UZ.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/vai.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/vai_LR.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/vai_Latn.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/vai_Vaii.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/vai_Vaii_LR.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/vi.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/vun.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/wae.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/xog.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/yav.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/yi.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/yo.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/yue.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/zgh.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/zh.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/zh_CN.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/zh_HK.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/zh_Hans.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/zh_Hans_CN.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/zh_Hans_HK.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/zh_Hans_MO.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/zh_Hans_SG.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/zh_Hant.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/zh_Hant_HK.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/zh_Hant_MO.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/zh_Hant_TW.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/zh_MO.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/zh_SG.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/zh_TW.txt delete mode 100644 Build/source/libs/icu/icu-src/source/data/unit/zu.txt delete mode 100644 Build/source/libs/icu/icu-src/source/i18n/decContext.c create mode 100644 Build/source/libs/icu/icu-src/source/i18n/decContext.cpp delete mode 100644 Build/source/libs/icu/icu-src/source/i18n/decNumber.c create mode 100644 Build/source/libs/icu/icu-src/source/i18n/decNumber.cpp create mode 100644 Build/source/libs/icu/icu-src/source/i18n/i18n_uwp.vcxproj create mode 100644 Build/source/libs/icu/icu-src/source/i18n/nounit.cpp create mode 100644 Build/source/libs/icu/icu-src/source/i18n/number_affixutils.cpp create mode 100644 Build/source/libs/icu/icu-src/source/i18n/number_affixutils.h create mode 100644 Build/source/libs/icu/icu-src/source/i18n/number_compact.cpp create mode 100644 Build/source/libs/icu/icu-src/source/i18n/number_compact.h create mode 100644 Build/source/libs/icu/icu-src/source/i18n/number_decimalquantity.cpp create mode 100644 Build/source/libs/icu/icu-src/source/i18n/number_decimalquantity.h create mode 100644 Build/source/libs/icu/icu-src/source/i18n/number_decimfmtprops.cpp create mode 100644 Build/source/libs/icu/icu-src/source/i18n/number_decimfmtprops.h create mode 100644 Build/source/libs/icu/icu-src/source/i18n/number_fluent.cpp create mode 100644 Build/source/libs/icu/icu-src/source/i18n/number_formatimpl.cpp create mode 100644 Build/source/libs/icu/icu-src/source/i18n/number_formatimpl.h create mode 100644 Build/source/libs/icu/icu-src/source/i18n/number_grouping.cpp create mode 100644 Build/source/libs/icu/icu-src/source/i18n/number_integerwidth.cpp create mode 100644 Build/source/libs/icu/icu-src/source/i18n/number_longnames.cpp create mode 100644 Build/source/libs/icu/icu-src/source/i18n/number_longnames.h create mode 100644 Build/source/libs/icu/icu-src/source/i18n/number_modifiers.cpp create mode 100644 Build/source/libs/icu/icu-src/source/i18n/number_modifiers.h create mode 100644 Build/source/libs/icu/icu-src/source/i18n/number_notation.cpp create mode 100644 Build/source/libs/icu/icu-src/source/i18n/number_padding.cpp create mode 100644 Build/source/libs/icu/icu-src/source/i18n/number_patternmodifier.cpp create mode 100644 Build/source/libs/icu/icu-src/source/i18n/number_patternmodifier.h create mode 100644 Build/source/libs/icu/icu-src/source/i18n/number_patternstring.cpp create mode 100644 Build/source/libs/icu/icu-src/source/i18n/number_patternstring.h create mode 100644 Build/source/libs/icu/icu-src/source/i18n/number_rounding.cpp create mode 100644 Build/source/libs/icu/icu-src/source/i18n/number_roundingutils.h create mode 100644 Build/source/libs/icu/icu-src/source/i18n/number_scientific.cpp create mode 100644 Build/source/libs/icu/icu-src/source/i18n/number_scientific.h create mode 100644 Build/source/libs/icu/icu-src/source/i18n/number_stringbuilder.cpp create mode 100644 Build/source/libs/icu/icu-src/source/i18n/number_stringbuilder.h create mode 100644 Build/source/libs/icu/icu-src/source/i18n/number_types.h create mode 100644 Build/source/libs/icu/icu-src/source/i18n/number_utils.h delete mode 100644 Build/source/libs/icu/icu-src/source/i18n/ulocdata.c create mode 100644 Build/source/libs/icu/icu-src/source/i18n/ulocdata.cpp create mode 100644 Build/source/libs/icu/icu-src/source/i18n/unicode/nounit.h create mode 100644 Build/source/libs/icu/icu-src/source/i18n/unicode/numberformatter.h delete mode 100644 Build/source/libs/icu/icu-src/source/i18n/utmscale.c create mode 100644 Build/source/libs/icu/icu-src/source/i18n/utmscale.cpp delete mode 100644 Build/source/libs/icu/icu-src/source/io/sprintf.c create mode 100644 Build/source/libs/icu/icu-src/source/io/sprintf.cpp delete mode 100644 Build/source/libs/icu/icu-src/source/io/sscanf.c create mode 100644 Build/source/libs/icu/icu-src/source/io/sscanf.cpp delete mode 100644 Build/source/libs/icu/icu-src/source/io/ufile.c create mode 100644 Build/source/libs/icu/icu-src/source/io/ufile.cpp delete mode 100644 Build/source/libs/icu/icu-src/source/io/ufmt_cmn.c create mode 100644 Build/source/libs/icu/icu-src/source/io/ufmt_cmn.cpp delete mode 100644 Build/source/libs/icu/icu-src/source/io/uprntf_p.c create mode 100644 Build/source/libs/icu/icu-src/source/io/uprntf_p.cpp delete mode 100644 Build/source/libs/icu/icu-src/source/io/uscanf.c create mode 100644 Build/source/libs/icu/icu-src/source/io/uscanf.cpp delete mode 100644 Build/source/libs/icu/icu-src/source/io/uscanf_p.c create mode 100644 Build/source/libs/icu/icu-src/source/io/uscanf_p.cpp delete mode 100644 Build/source/libs/icu/icu-src/source/io/ustdio.c create mode 100644 Build/source/libs/icu/icu-src/source/io/ustdio.cpp delete mode 100644 Build/source/libs/icu/icu-src/source/stubdata/stubdata.c create mode 100644 Build/source/libs/icu/icu-src/source/stubdata/stubdata.cpp create mode 100644 Build/source/libs/icu/icu-src/source/test/intltest/numbertest.h create mode 100644 Build/source/libs/icu/icu-src/source/test/intltest/numbertest_affixutils.cpp create mode 100644 Build/source/libs/icu/icu-src/source/test/intltest/numbertest_api.cpp create mode 100644 Build/source/libs/icu/icu-src/source/test/intltest/numbertest_decimalquantity.cpp create mode 100644 Build/source/libs/icu/icu-src/source/test/intltest/numbertest_modifiers.cpp create mode 100644 Build/source/libs/icu/icu-src/source/test/intltest/numbertest_patternmodifier.cpp create mode 100644 Build/source/libs/icu/icu-src/source/test/intltest/numbertest_patternstring.cpp create mode 100644 Build/source/libs/icu/icu-src/source/test/intltest/numbertest_stringbuilder.cpp delete mode 100644 Build/source/libs/icu/icu-src/source/test/intltest/punyref.c create mode 100644 Build/source/libs/icu/icu-src/source/test/intltest/punyref.cpp create mode 100644 Build/source/libs/icu/icu-src/source/test/testdata/IdnaTest.txt create mode 100644 Build/source/libs/icu/icu-src/source/test/testdata/emoji-test.txt create mode 100644 Build/source/libs/icu/icu-src/source/tools/escapesrc/Makefile.in create mode 100644 Build/source/libs/icu/icu-src/source/tools/escapesrc/cptbl.h create mode 100644 Build/source/libs/icu/icu-src/source/tools/escapesrc/escapesrc.cpp create mode 100644 Build/source/libs/icu/icu-src/source/tools/escapesrc/expect-simple.cpp create mode 100644 Build/source/libs/icu/icu-src/source/tools/escapesrc/tblgen.cpp create mode 100644 Build/source/libs/icu/icu-src/source/tools/escapesrc/test-nochange.cpp create mode 100644 Build/source/libs/icu/icu-src/source/tools/escapesrc/test-simple.cpp create mode 100644 Build/source/libs/icu/icu-src/source/tools/gennorm2/extradata.cpp create mode 100644 Build/source/libs/icu/icu-src/source/tools/gennorm2/extradata.h create mode 100644 Build/source/libs/icu/icu-src/source/tools/gennorm2/norms.cpp create mode 100644 Build/source/libs/icu/icu-src/source/tools/gennorm2/norms.h delete mode 100644 Build/source/libs/icu/icu-src/source/tools/toolutil/filestrm.c create mode 100644 Build/source/libs/icu/icu-src/source/tools/toolutil/filestrm.cpp delete mode 100644 Build/source/libs/icu/icu-src/source/tools/toolutil/flagparser.c create mode 100644 Build/source/libs/icu/icu-src/source/tools/toolutil/flagparser.cpp delete mode 100644 Build/source/libs/icu/icu-src/source/tools/toolutil/pkg_genc.c create mode 100644 Build/source/libs/icu/icu-src/source/tools/toolutil/pkg_genc.cpp delete mode 100644 Build/source/libs/icu/icu-src/source/tools/toolutil/pkg_gencmn.c create mode 100644 Build/source/libs/icu/icu-src/source/tools/toolutil/pkg_gencmn.cpp delete mode 100644 Build/source/libs/icu/icu-src/source/tools/toolutil/ucm.c create mode 100644 Build/source/libs/icu/icu-src/source/tools/toolutil/ucm.cpp delete mode 100644 Build/source/libs/icu/icu-src/source/tools/toolutil/ucmstate.c create mode 100644 Build/source/libs/icu/icu-src/source/tools/toolutil/ucmstate.cpp delete mode 100644 Build/source/libs/icu/icu-src/source/tools/toolutil/unewdata.c create mode 100644 Build/source/libs/icu/icu-src/source/tools/toolutil/unewdata.cpp delete mode 100644 Build/source/libs/icu/icu-src/source/tools/toolutil/uoptions.c create mode 100644 Build/source/libs/icu/icu-src/source/tools/toolutil/uoptions.cpp delete mode 100644 Build/source/libs/icu/icu-src/source/tools/toolutil/uparse.c create mode 100644 Build/source/libs/icu/icu-src/source/tools/toolutil/uparse.cpp delete mode 100644 Build/source/libs/icu/icu-src/source/tools/toolutil/writesrc.c create mode 100644 Build/source/libs/icu/icu-src/source/tools/toolutil/writesrc.cpp (limited to 'Build/source/libs') diff --git a/Build/source/libs/README b/Build/source/libs/README index 9bffaa1b44a..e8ae0926dfe 100644 --- a/Build/source/libs/README +++ b/Build/source/libs/README @@ -27,7 +27,7 @@ graphite2 1.3.10 - checked 20jun17 harfbuzz 1.7.4 - checked 20dec17 http://www.freedesktop.org/software/harfbuzz/release/ -icu 58.2 - checked 13mar17 +icu 60.2 - checked 11jan18 http://download.icu-project.org/files/icu4c/ libpaper 1.1.24+nmu2 - checked 24oct13 diff --git a/Build/source/libs/icu/ChangeLog b/Build/source/libs/icu/ChangeLog index 196187e7fd6..c9f392c6926 100644 --- a/Build/source/libs/icu/ChangeLog +++ b/Build/source/libs/icu/ChangeLog @@ -1,3 +1,7 @@ +2018-01-12 Karl Berry + + * Import icu-60, now requiring C++11; reautoconf. + 2017-04-27 Karl Berry * Makefile.am (LDADD): link icutest with ICU_LIBS_EXTRA. diff --git a/Build/source/libs/icu/TLpatches/TL-Changes b/Build/source/libs/icu/TLpatches/TL-Changes index 6315dca3b62..6483b62cf3d 100644 --- a/Build/source/libs/icu/TLpatches/TL-Changes +++ b/Build/source/libs/icu/TLpatches/TL-Changes @@ -1,11 +1,11 @@ -Changes applied to the icu-58.2 tree as obtained from: - http://download.icu-project.org/files/icu4c/58.2/icu4c-58_2-src.tgz - and icu4c-58_2-data.zip - -cd /tmp # or wherever -tar xf icu4c-*-src.tgz # should unpack into icu/* -cd $Build/source/libs/icu/icu-src # for whatever $Build directory -\cp -arf /tmp/icu/* . +Changes applied to the icu-60.2 tree as obtained from: + http://download.icu-project.org/files/icu4c/60.2/icu4c-60_2-src.tgz + and icu4c-60_2-data.zip + +cd $Build/source/libs/icu # for whatever $Build directory +tar xf /tmp/icu4c-*-src.tgz # should unpack into icu/* +mv icu icu-src +cd icu-src rm -r as_is packaging # don't bother including these in our tree # # files to add: @@ -14,21 +14,22 @@ svn add `!!` svn status | sed -n 's/^\?//p' # rerun, should be empty now # # files to remove: -diff -qr . /tmp/icu/ | sed -n -e 's,^Only in \./\(.*\): ,\1/,p' +svn status | sed -n 's/^\!//p' svn rm `!!` -diff ... # rerun, should be empty now +svn status | sed -n 's/^\!//p' # rerun, should be empty now # update generic files (still in icu-src): aux=$Build/source/build-aux -cp -p $aux/config.guess $aux/config.sub $aux/install-sh source/ +cp -p $aux/config.guess $aux/config.sub $aux/install-sh source # patch -p0 for all ../TLpatches/patch-* files, as needed. -# Run svn diff after each, update patch-* file. +# Save original and diff after each, update patch-* file. # Don't lose our leading comments. # autoreconf in the TL directory; don't run autoreconf in the # icu-src/source/ directory, it fails due to missing pkg-config -# prerequisites. (Thus we must patch configure, not just configure.ac.) +# prerequisites. (Thus we must patch configure, not just configure.ac; +# not worth more effort for our small change of preferring gcc.) # # rebuild; must rerun configure (not just config.status), # so easiest is to just do a whole new build. diff --git a/Build/source/libs/icu/TLpatches/patch-14-xopen b/Build/source/libs/icu/TLpatches/patch-14-xopen index 853840ac955..78975642ef2 100644 --- a/Build/source/libs/icu/TLpatches/patch-14-xopen +++ b/Build/source/libs/icu/TLpatches/patch-14-xopen @@ -1,10 +1,8 @@ Do not define _XOPEN_SOURCE_EXTENDED on Solaris, notwithstanding comments in icu source. -Index: source/common/uposixdefs.h -=================================================================== ---- source/common/uposixdefs.h (revision 43491) -+++ source/common/uposixdefs.h (working copy) +--- /tmp/up 2018-01-11 11:05:06.218484133 -0800 ++++ source/common/uposixdefs.h 2018-01-11 11:07:11.006686446 -0800 @@ -51,10 +51,13 @@ * Make sure things like readlink and such functions work. * Poorly upgraded Solaris machines can't have this defined. @@ -15,8 +13,8 @@ Index: source/common/uposixdefs.h * * z/OS needs this definition for timeval and to get usleep. */ --#if !defined(_XOPEN_SOURCE_EXTENDED) -+#if !defined(_XOPEN_SOURCE_EXTENDED) && !defined(__sun) +-#if !defined(_XOPEN_SOURCE_EXTENDED) && defined(__TOS_MVS__) ++#if !defined(_XOPEN_SOURCE_EXTENDED) && defined(__TOS_MVS__) && !defined(sun) # define _XOPEN_SOURCE_EXTENDED 1 #endif diff --git a/Build/source/libs/icu/TLpatches/patch-16-putil b/Build/source/libs/icu/TLpatches/patch-16-putil index 9d2bce224ed..e8f9e1ee34d 100644 --- a/Build/source/libs/icu/TLpatches/patch-16-putil +++ b/Build/source/libs/icu/TLpatches/patch-16-putil @@ -1,49 +1,15 @@ tzset and mingw/cygwin. -Index: source/common/putil.cpp -=================================================================== ---- source/common/putil.cpp (revision 43491) -+++ source/common/putil.cpp (working copy) -@@ -43,6 +43,20 @@ - // Must be before any other #includes. - #include "uposixdefs.h" +--- /tmp/putil.cpp 2017-10-31 12:04:49.000000000 -0700 ++++ source/common/putil.cpp 2018-01-11 11:10:30.895806863 -0800 +@@ -46,8 +46,8 @@ + // First, the platform type. Need this for U_PLATFORM. + #include "unicode/platform.h" -+#if (U_PF_MINGW <= U_PLATFORM && U_PLATFORM <= U_PF_CYGWIN) && defined(__STRICT_ANSI__) +-#if U_PLATFORM == U_PF_MINGW && defined __STRICT_ANSI__ +-/* tzset isn't defined in strict ANSI on MinGW. */ ++#if (U_PF_CYGWIN <= U_PLATFORM && defined(__STRICT_ANSI__) +/* tzset isn't defined in strict ANSI on Cygwin and MinGW. */ -+#undef __STRICT_ANSI__ -+#endif -+ -+/* -+ * Cygwin with GCC requires inclusion of time.h after the above disabling strict asci mode statement. -+ */ -+#include -+ -+#if !U_PLATFORM_USES_ONLY_WIN32_API -+#include -+#endif -+ - /* include ICU headers */ - #include "unicode/utypes.h" - #include "unicode/putil.h" -@@ -104,21 +118,7 @@ - # include + #undef __STRICT_ANSI__ #endif --#if (U_PF_MINGW <= U_PLATFORM && U_PLATFORM <= U_PF_CYGWIN) && defined(__STRICT_ANSI__) --/* tzset isn't defined in strict ANSI on Cygwin and MinGW. */ --#undef __STRICT_ANSI__ --#endif -- - /* -- * Cygwin with GCC requires inclusion of time.h after the above disabling strict asci mode statement. -- */ --#include -- --#if !U_PLATFORM_USES_ONLY_WIN32_API --#include --#endif -- --/* - * Only include langinfo.h if we have a way to get the codeset. If we later - * depend on more feature, we can test on U_HAVE_NL_LANGINFO. - * diff --git a/Build/source/libs/icu/TLpatches/patch-17-cygwin-no-w32api b/Build/source/libs/icu/TLpatches/patch-17-cygwin-no-w32api index 89b6d67005c..2a83208c438 100644 --- a/Build/source/libs/icu/TLpatches/patch-17-cygwin-no-w32api +++ b/Build/source/libs/icu/TLpatches/patch-17-cygwin-no-w32api @@ -1,5 +1,8 @@ _HAS_ -> _USES_ONLY_ for WIN32_API and Cygwin. +Not applied for icu-60.2, since it seems some (but not all) of changes +have been installed upstream. + Index: source/common/umutex.h =================================================================== --- source/common/umutex.h (revision 43491) diff --git a/Build/source/libs/icu/TLpatches/patch-19-netbsd b/Build/source/libs/icu/TLpatches/patch-19-netbsd index 46b8b8a4349..3df67b21456 100644 --- a/Build/source/libs/icu/TLpatches/patch-19-netbsd +++ b/Build/source/libs/icu/TLpatches/patch-19-netbsd @@ -1,9 +1,9 @@ Per Marc Baudoin, tlbuild 17 Mar 2017 10:03:03. -Index: digitlst.cpp -=================================================================== ---- digitlst.cpp (revision 43522) -+++ digitlst.cpp (working copy) +Not applied for icu-60.2, since they have a new U_HAVE_XLOCALE_H. + +--- source/i18n/digitlst.cpp (revision 43522) ++++ source/i18n/digitlst.cpp (working copy) @@ -61,7 +61,7 @@ #endif diff --git a/Build/source/libs/icu/configure b/Build/source/libs/icu/configure index 3a253e0f2ca..5df67b7c9f3 100755 --- a/Build/source/libs/icu/configure +++ b/Build/source/libs/icu/configure @@ -1,6 +1,6 @@ #! /bin/sh # Guess values for system-dependent variables and create Makefiles. -# Generated by GNU Autoconf 2.69 for icu (TeX Live) 58.2. +# Generated by GNU Autoconf 2.69 for icu (TeX Live) 60.2. # # Report bugs to . # @@ -579,8 +579,8 @@ MAKEFLAGS= # Identity of this package. PACKAGE_NAME='icu (TeX Live)' PACKAGE_TARNAME='icu--tex-live-' -PACKAGE_VERSION='58.2' -PACKAGE_STRING='icu (TeX Live) 58.2' +PACKAGE_VERSION='60.2' +PACKAGE_STRING='icu (TeX Live) 60.2' PACKAGE_BUGREPORT='tex-k@tug.org' PACKAGE_URL='' @@ -1258,7 +1258,7 @@ if test "$ac_init_help" = "long"; then # Omit some internal or obsolete options to make the list less imposing. # This message is too long to be a string in the A/UX 3.1 sh. cat <<_ACEOF -\`configure' configures icu (TeX Live) 58.2 to adapt to many kinds of systems. +\`configure' configures icu (TeX Live) 60.2 to adapt to many kinds of systems. Usage: $0 [OPTION]... [VAR=VALUE]... @@ -1328,7 +1328,7 @@ fi if test -n "$ac_init_help"; then case $ac_init_help in - short | recursive ) echo "Configuration of icu (TeX Live) 58.2:";; + short | recursive ) echo "Configuration of icu (TeX Live) 60.2:";; esac cat <<\_ACEOF @@ -1426,7 +1426,7 @@ fi test -n "$ac_init_help" && exit $ac_status if $ac_init_version; then cat <<\_ACEOF -icu (TeX Live) configure 58.2 +icu (TeX Live) configure 60.2 generated by GNU Autoconf 2.69 Copyright (C) 2012 Free Software Foundation, Inc. @@ -1565,7 +1565,7 @@ cat >config.log <<_ACEOF This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake. -It was created by icu (TeX Live) $as_me 58.2, which was +It was created by icu (TeX Live) $as_me 60.2, which was generated by GNU Autoconf 2.69. Invocation command line was $ $0 $@ @@ -3488,7 +3488,7 @@ fi # Define the identity of the package. PACKAGE='icu--tex-live-' - VERSION='58.2' + VERSION='60.2' cat >>confdefs.h <<_ACEOF @@ -4866,7 +4866,7 @@ cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # report actual input values of CONFIG_FILES etc. instead of their # values after options handling. ac_log=" -This file was extended by icu (TeX Live) $as_me 58.2, which was +This file was extended by icu (TeX Live) $as_me 60.2, which was generated by GNU Autoconf 2.69. Invocation command line was CONFIG_FILES = $CONFIG_FILES @@ -4923,7 +4923,7 @@ _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" ac_cs_version="\\ -icu (TeX Live) config.status 58.2 +icu (TeX Live) config.status 60.2 configured by $0, generated by GNU Autoconf 2.69, with options \\"\$ac_cs_config\\" diff --git a/Build/source/libs/icu/icu-src/APIChangeReport.html b/Build/source/libs/icu/icu-src/APIChangeReport.html index 232f9b9c3a9..64f4390de64 100644 --- a/Build/source/libs/icu/icu-src/APIChangeReport.html +++ b/Build/source/libs/icu/icu-src/APIChangeReport.html @@ -5,31 +5,31 @@ --> -ICU4C API Comparison: ICU 57 with ICU 58 +ICU4C API Comparison: ICU 59 with ICU 60 -

ICU4C API Comparison: ICU 57 with ICU 58

+

ICU4C API Comparison: ICU 59 with ICU 60

-

Removed from ICU 57

+

Removed from ICU 59

- + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
FileAPIICU 57ICU 58FileAPIICU 59ICU 60
bytestrie.hconst StringPiece& icu::BytesTrie::Iterator::getString()Stable
ICU 4.8
(missing)
-
decimfmt.henum + icu::DecimalFormat::ERoundingMode {}Stable
ICU 2.4
(moved to numfmt.h)
bytestriebuilder.hBytesTrieBuilder& icu::BytesTrieBuilder::add(const StringPiece&, int32_t, UErrorCode&)Stable
ICU 4.8
(missing)
-
decimfmt.henum + icu::DecimalFormat::ERoundingMode::kRoundCeilingStable
ICU 2.4
(moved to numfmt.h)
compactdecimalformat.hUnicodeString& icu::CompactDecimalFormat::format(const StringPiece&, UnicodeString&, FieldPositionIterator*, UErrorCode&)Internal(missing)
-
decimfmt.henum + icu::DecimalFormat::ERoundingMode::kRoundDownStable
ICU 2.4
(moved to numfmt.h)
decimfmt.hUnicodeString& icu::DecimalFormat::format(const StringPiece&, UnicodeString&, FieldPositionIterator*, UErrorCode&)Stable(missing)
-
decimfmt.henum + icu::DecimalFormat::ERoundingMode::kRoundFloorStable
ICU 2.4
(moved to numfmt.h)
fmtable.hicu::Formattable::Formattable(const StringPiece&, UErrorCode&)Stable
ICU 4.4
(missing)
-
decimfmt.henum + icu::DecimalFormat::ERoundingMode::kRoundHalfDownStable
ICU 2.4
(moved to numfmt.h)
fmtable.hvoid icu::Formattable::setDecimalNumber(const StringPiece&, UErrorCode&)Stable
ICU 4.4
(missing)
-
decimfmt.henum + icu::DecimalFormat::ERoundingMode::kRoundHalfEvenStable
ICU 2.4
(moved to numfmt.h)
idna.hvoid icu::IDNA::labelToASCII_UTF8(const StringPiece&, ByteSink&, IDNAInfo&, UErrorCode&)Stable
ICU 4.6
(missing)
-
decimfmt.henum + icu::DecimalFormat::ERoundingMode::kRoundHalfUpStable
ICU 2.4
(moved to numfmt.h)
idna.hvoid icu::IDNA::labelToUnicodeUTF8(const StringPiece&, ByteSink&, IDNAInfo&, UErrorCode&)Stable
ICU 4.6
(missing)
-
decimfmt.henum + icu::DecimalFormat::ERoundingMode::kRoundUnnecessaryStable
ICU 4.8
(moved to numfmt.h)
idna.hvoid icu::IDNA::nameToASCII_UTF8(const StringPiece&, ByteSink&, IDNAInfo&, UErrorCode&)Stable
ICU 4.6
(missing)
-
decimfmt.henum + icu::DecimalFormat::ERoundingMode::kRoundUpStable
ICU 2.4
(moved to numfmt.h)
idna.hvoid icu::IDNA::nameToUnicodeUTF8(const StringPiece&, ByteSink&, IDNAInfo&, UErrorCode&)Stable
ICU 4.6
(missing)
-
platform.h#define U_IOSTREAM_SOURCEInternal(missing)
LayoutEngine.hUClassID icu::LayoutEngine::getDynamicClassID()Deprecated
ICU 54
(missing)
-
plurrule.hUnicodeString icu::PluralRules::select(const FixedDecimal&)Internal(missing)
LayoutEngine.hicu::LayoutEngine::~LayoutEngine()Deprecated
ICU 54
(missing)
-
ucasemap.h#define U_TITLECASE_NO_BREAK_ADJUSTMENTStable
ICU 3.8
(moved to new stringoptions.h)
LayoutEngine.hle_int32 icu::LayoutEngine::getGlyphCount()Deprecated
ICU 54
(missing)
-
ucasemap.h#define U_TITLECASE_NO_LOWERCASEStable
ICU 3.8
(moved to new stringoptions.h)
LayoutEngine.hle_int32 icu::LayoutEngine::layoutChars(const LEUnicode chars[], le_int32, le_int32, le_int32, le_bool, float, float, LEErrorCode&)Deprecated
ICU 54
(missing)
-
ucasemap.h#define UCASEMAP_OMIT_UNCHANGED_TEXTDraft
ICU 59
(missing)
LayoutEngine.hstatic LayoutEngine* icu::LayoutEngine::layoutEngineFactory(const LEFontInstance*, le_int32, le_int32, LEErrorCode&)Deprecated
ICU 54
(missing)
-
uchar.h#define U_FOLD_CASE_DEFAULTStable
ICU 2.0
(moved to new stringoptions.h)
LayoutEngine.hstatic LayoutEngine* icu::LayoutEngine::layoutEngineFactory(const LEFontInstance*, le_int32, le_int32, le_int32, LEErrorCode&)Deprecated
ICU 54
(missing)
-
uchar.h#define U_FOLD_CASE_EXCLUDE_SPECIAL_IStable
ICU 2.0
(moved to new stringoptions.h)
LayoutEngine.hstatic UClassID icu::LayoutEngine::getStaticClassID()Deprecated
ICU 54
(missing)
-
unorm2.h#define U_COMPARE_CODE_POINT_ORDERStable
ICU 2.2
(moved to new stringoptions.h)
LayoutEngine.hstatic const le_int32 icu::LayoutEngine::kTypoFlagKernInternal(missing)
-
unorm2.h#define U_COMPARE_IGNORE_CASEStable
ICU 2.2
(moved to new stringoptions.h)
LayoutEngine.hstatic const le_int32 icu::LayoutEngine::kTypoFlagLigaInternal(missing)
-
unorm2.h#define UNORM_INPUT_IS_FCDStable
ICU 2.2
(moved to new stringoptions.h)
LayoutEngine.hvoid icu::LayoutEngine::getCharIndices(le_int32 charIndices[], LEErrorCode&)Deprecated
ICU 54
(missing)
-
ustring.h#define U_COMPARE_CODE_POINT_ORDERStable
ICU 2.2
(moved to new stringoptions.h)
LayoutEngine.hvoid icu::LayoutEngine::getCharIndices(le_int32 charIndices[], le_int32, LEErrorCode&)Deprecated
ICU 54
(missing)
-
LayoutEngine.hvoid icu::LayoutEngine::getGlyphPosition(le_int32, float&, float&, LEErrorCode&)Deprecated
ICU 54
(missing)
-
LayoutEngine.hvoid icu::LayoutEngine::getGlyphPositions(float positions[], LEErrorCode&)Deprecated
ICU 54
(missing)
-
LayoutEngine.hvoid icu::LayoutEngine::getGlyphs(LEGlyphID glyphs[], LEErrorCode&)Deprecated
ICU 54
(missing)
-
LayoutEngine.hvoid icu::LayoutEngine::getGlyphs(le_uint32 glyphs[], le_uint32, LEErrorCode&)Deprecated
ICU 54
(missing)
-
LayoutEngine.hvoid icu::LayoutEngine::reset()Deprecated
ICU 54
(missing)
-
LEFontInstance.hLEGlyphID icu::LEFontInstance::mapCharToGlyph(LEUnicode32)Deprecated
ICU 54
(missing)
-
LEFontInstance.hLEGlyphID icu::LEFontInstance::mapCharToGlyph(LEUnicode32, const LECharMapper*)Deprecated
ICU 54
(missing)
-
LEFontInstance.hLEGlyphID icu::LEFontInstance::mapCharToGlyph(LEUnicode32, const LECharMapper*, le_bool)Deprecated
ICU 54
(missing)
-
LEFontInstance.hLEUnicode32 icu::LECharMapper::mapChar(LEUnicode32)Deprecated
ICU 54
(missing)
-
LEFontInstance.hUClassID icu::LEFontInstance::getDynamicClassID()Deprecated
ICU 54
(missing)
-
LEFontInstance.hconst LEFontInstance* icu::LEFontInstance::getSubFont(const LEUnicode chars[], le_int32*, le_int32, le_int32, LEErrorCode&)Deprecated
ICU 54
(missing)
-
LEFontInstance.hconst void* icu::LEFontInstance::getFontTable(LETag, size_t&)Deprecated
ICU 54
(missing)
-
LEFontInstance.hfloat icu::LEFontInstance::getScaleFactorX()Deprecated
ICU 54
(missing)
-
LEFontInstance.hfloat icu::LEFontInstance::getScaleFactorY()Deprecated
ICU 54
(missing)
-
LEFontInstance.hfloat icu::LEFontInstance::getXPixelsPerEm()Deprecated
ICU 54
(missing)
-
LEFontInstance.hfloat icu::LEFontInstance::getYPixelsPerEm()Deprecated
ICU 54
(missing)
-
LEFontInstance.hfloat icu::LEFontInstance::xPixelsToUnits(float)Deprecated
ICU 54
(missing)
-
LEFontInstance.hfloat icu::LEFontInstance::xUnitsToPoints(float)Deprecated
ICU 54
(missing)
-
LEFontInstance.hfloat icu::LEFontInstance::yPixelsToUnits(float)Deprecated
ICU 54
(missing)
-
LEFontInstance.hfloat icu::LEFontInstance::yUnitsToPoints(float)Deprecated
ICU 54
(missing)
-
LEFontInstance.hicu::LECharMapper::~LECharMapper()Deprecated
ICU 54
(missing)
-
LEFontInstance.hicu::LEFontInstance::~LEFontInstance()Deprecated
ICU 54
(missing)
-
LEFontInstance.hle_bool icu::LEFontInstance::canDisplay(LEUnicode32)Deprecated
ICU 54
(missing)
-
LEFontInstance.hle_bool icu::LEFontInstance::getGlyphPoint(LEGlyphID, le_int32, LEPoint&)Deprecated
ICU 54
(missing)
-
LEFontInstance.hle_int32 icu::LEFontInstance::getAscent()Deprecated
ICU 54
(missing)
-
LEFontInstance.hle_int32 icu::LEFontInstance::getDescent()Deprecated
ICU 54
(missing)
-
LEFontInstance.hle_int32 icu::LEFontInstance::getLeading()Deprecated
ICU 54
(missing)
-
LEFontInstance.hle_int32 icu::LEFontInstance::getLineHeight()Deprecated
ICU 54
(missing)
-
LEFontInstance.hle_int32 icu::LEFontInstance::getUnitsPerEM()Deprecated
ICU 54
(missing)
-
LEFontInstance.hstatic UClassID icu::LEFontInstance::getStaticClassID()Deprecated
ICU 54
(missing)
-
LEFontInstance.hstatic float icu::LEFontInstance::fixedToFloat(le_int32)Deprecated
ICU 54
(missing)
-
LEFontInstance.hstatic le_int32 icu::LEFontInstance::floatToFixed(float)Deprecated
ICU 54
(missing)
-
LEFontInstance.hvoid icu::LEFontInstance::getGlyphAdvance(LEGlyphID, LEPoint&)Deprecated
ICU 54
(missing)
-
LEFontInstance.hvoid icu::LEFontInstance::mapCharsToGlyphs(const LEUnicode chars[], le_int32, le_int32, le_bool, const LECharMapper*, le_bool, LEGlyphStorage&)Deprecated
ICU 54
(missing)
-
LEFontInstance.hvoid icu::LEFontInstance::pixelsToUnits(LEPoint&, LEPoint&)Deprecated
ICU 54
(missing)
-
LEFontInstance.hvoid icu::LEFontInstance::transformFunits(float, float, LEPoint&)Deprecated
ICU 54
(missing)
-
LEFontInstance.hvoid icu::LEFontInstance::unitsToPoints(LEPoint&, LEPoint&)Deprecated
ICU 54
(missing)
-
LEGlyphStorage.hLEGlyphID icu::LEGlyphStorage::getGlyphID(le_int32, LEErrorCode&)Deprecated
ICU 54
(missing)
-
LEGlyphStorage.hLEGlyphID& icu::LEGlyphStorage::operator[](le_int32)Deprecated
ICU 54
(missing)
-
LEGlyphStorage.hLEGlyphID* icu::LEGlyphStorage::insertGlyphs(le_int32, le_int32)Deprecated
ICU 54
(missing)
-
LEGlyphStorage.hLEGlyphID* icu::LEGlyphStorage::insertGlyphs(le_int32, le_int32, LEErrorCode&)Deprecated
ICU 54
(missing)
-
LEGlyphStorage.hUClassID icu::LEGlyphStorage::getDynamicClassID()Deprecated
ICU 54
(missing)
-
LEGlyphStorage.hicu::LEGlyphStorage::LEGlyphStorage()Deprecated
ICU 54
(missing)
-
LEGlyphStorage.hicu::LEGlyphStorage::~LEGlyphStorage()Deprecated
ICU 54
(missing)
-
LEGlyphStorage.hle_int32 icu::LEGlyphStorage::allocateAuxData(LEErrorCode&)Deprecated
ICU 54
(missing)
-
LEGlyphStorage.hle_int32 icu::LEGlyphStorage::allocatePositions(LEErrorCode&)Deprecated
ICU 54
(missing)
-
LEGlyphStorage.hle_int32 icu::LEGlyphStorage::applyInsertions()Deprecated
ICU 54
(missing)
-
LEGlyphStorage.hle_int32 icu::LEGlyphStorage::getCharIndex(le_int32, LEErrorCode&)Deprecated
ICU 54
(missing)
-
LEGlyphStorage.hle_int32 icu::LEGlyphStorage::getGlyphCount()Deprecated
ICU 54
(missing)
-
LEGlyphStorage.hle_uint32 icu::LEGlyphStorage::getAuxData(le_int32, LEErrorCode&)Deprecated
ICU 54
(missing)
-
LEGlyphStorage.hstatic UClassID icu::LEGlyphStorage::getStaticClassID()Deprecated
ICU 54
(missing)
-
LEGlyphStorage.hvoid icu::LEGlyphStorage::adjustPosition(le_int32, float, float, LEErrorCode&)Deprecated
ICU 54
(missing)
-
LEGlyphStorage.hvoid icu::LEGlyphStorage::adoptAuxDataArray(LEGlyphStorage&)Deprecated
ICU 54
(missing)
-
LEGlyphStorage.hvoid icu::LEGlyphStorage::adoptCharIndicesArray(LEGlyphStorage&)Deprecated
ICU 54
(missing)
-
LEGlyphStorage.hvoid icu::LEGlyphStorage::adoptGlyphArray(LEGlyphStorage&)Deprecated
ICU 54
(missing)
-
LEGlyphStorage.hvoid icu::LEGlyphStorage::adoptGlyphCount(LEGlyphStorage&)Deprecated
ICU 54
(missing)
-
LEGlyphStorage.hvoid icu::LEGlyphStorage::adoptGlyphCount(le_int32)Deprecated
ICU 54
(missing)
-
LEGlyphStorage.hvoid icu::LEGlyphStorage::adoptPositionArray(LEGlyphStorage&)Deprecated
ICU 54
(missing)
-
LEGlyphStorage.hvoid icu::LEGlyphStorage::allocateGlyphArray(le_int32, le_bool, LEErrorCode&)Deprecated
ICU 54
(missing)
-
LEGlyphStorage.hvoid icu::LEGlyphStorage::getAuxData(le_uint32 auxData[], LEErrorCode&)Deprecated
ICU 54
(missing)
-
LEGlyphStorage.hvoid icu::LEGlyphStorage::getCharIndices(le_int32 charIndices[], LEErrorCode&)Deprecated
ICU 54
(missing)
-
LEGlyphStorage.hvoid icu::LEGlyphStorage::getCharIndices(le_int32 charIndices[], le_int32, LEErrorCode&)Deprecated
ICU 54
(missing)
-
LEGlyphStorage.hvoid icu::LEGlyphStorage::getGlyphPosition(le_int32, float&, float&, LEErrorCode&)Deprecated
ICU 54
(missing)
-
LEGlyphStorage.hvoid icu::LEGlyphStorage::getGlyphPositions(float positions[], LEErrorCode&)Deprecated
ICU 54
(missing)
-
LEGlyphStorage.hvoid icu::LEGlyphStorage::getGlyphs(LEGlyphID glyphs[], LEErrorCode&)Deprecated
ICU 54
(missing)
-
LEGlyphStorage.hvoid icu::LEGlyphStorage::getGlyphs(le_uint32 glyphs[], le_uint32, LEErrorCode&)Deprecated
ICU 54
(missing)
-
LEGlyphStorage.hvoid icu::LEGlyphStorage::moveGlyph(le_int32, le_int32, le_uint32)Deprecated
ICU 54
(missing)
-
LEGlyphStorage.hvoid icu::LEGlyphStorage::reset()Deprecated
ICU 54
(missing)
-
LEGlyphStorage.hvoid icu::LEGlyphStorage::setAuxData(le_int32, le_uint32, LEErrorCode&)Deprecated
ICU 54
(missing)
-
LEGlyphStorage.hvoid icu::LEGlyphStorage::setCharIndex(le_int32, le_int32, LEErrorCode&)Deprecated
ICU 54
(missing)
-
LEGlyphStorage.hvoid icu::LEGlyphStorage::setGlyphID(le_int32, LEGlyphID, LEErrorCode&)Deprecated
ICU 54
(missing)
-
LEGlyphStorage.hvoid icu::LEGlyphStorage::setPosition(le_int32, float, float, LEErrorCode&)Deprecated
ICU 54
(missing)
-
LESwaps.h#define SWAPLDeprecated
ICU 54
(missing)
-
LESwaps.h#define SWAPWDeprecated
ICU 54
(missing)
-
LESwaps.hstatic le_uint16 icu::LESwaps::swapWord(le_uint16)Deprecated
ICU 54
(missing)
-
LESwaps.hstatic le_uint32 icu::LESwaps::swapLong(le_uint32)Deprecated
ICU 54
(missing)
-
LETypes.h#define LE_AFRC_FEATURE_FLAGInternal(missing)
-
LETypes.h#define LE_ARRAY_COPYInternal(missing)
-
LETypes.h#define LE_ARRAY_SIZEInternal(missing)
-
LETypes.h#define LE_ASSERT_BAD_FONT(untagged)(missing)
-
LETypes.h#define LE_CHAR_FILTER_FEATURE_FLAGInternal(missing)
-
LETypes.h#define LE_CLIENT_MASKDeprecated
ICU 54
(missing)
-
LETypes.h#define LE_CLIENT_SHIFTDeprecated
ICU 54
(missing)
-
LETypes.h#define LE_CLIG_FEATURE_FLAGInternal(missing)
-
LETypes.h#define LE_CSWH_FEATURE_FLAGInternal(missing)
-
LETypes.h#define LE_DEBUG_BAD_FONTInternal(missing)
-
LETypes.h#define LE_DEFAULT_FEATURE_FLAG(untagged)(missing)
-
LETypes.h#define LE_DELETE_ARRAYInternal(missing)
-
LETypes.h#define LE_DLIG_FEATURE_FLAGInternal(missing)
-
LETypes.h#define LE_FAILUREDeprecated
ICU 54
(missing)
-
LETypes.h#define LE_FRAC_FEATURE_FLAGInternal(missing)
-
LETypes.h#define LE_GET_CLIENTDeprecated
ICU 54
(missing)
-
LETypes.h#define LE_GET_GLYPHDeprecated
ICU 54
(missing)
-
LETypes.h#define LE_GET_SUB_FONTDeprecated
ICU 54
(missing)
-
LETypes.h#define LE_GLYPH_MASKDeprecated
ICU 54
(missing)
-
LETypes.h#define LE_GLYPH_SHIFTDeprecated
ICU 54
(missing)
-
LETypes.h#define LE_GROW_ARRAYInternal(missing)
-
LETypes.h#define LE_HLIG_FEATURE_FLAGInternal(missing)
-
LETypes.h#define LE_Kerning_FEATURE_FLAGInternal(missing)
-
LETypes.h#define LE_LIGA_FEATURE_FLAGInternal(missing)
-
LETypes.h#define LE_Ligatures_FEATURE_FLAGInternal(missing)
-
LETypes.h#define LE_MAKE_TAGDeprecated
ICU 54
(missing)
-
LETypes.h#define LE_NALT_FEATURE_FLAGInternal(missing)
-
LETypes.h#define LE_NEW_ARRAYInternal(missing)
-
LETypes.h#define LE_RANGE_CHECK(untagged)(missing)
-
LETypes.h#define LE_RLIG_FEATURE_FLAGInternal(missing)
-
LETypes.h#define LE_RUBY_FEATURE_FLAGInternal(missing)
-
LETypes.h#define LE_SALT_FEATURE_FLAGInternal(missing)
-
LETypes.h#define LE_SET_CLIENTDeprecated
ICU 54
(missing)
-
LETypes.h#define LE_SET_GLYPHDeprecated
ICU 54
(missing)
-
LETypes.h#define LE_SET_SUB_FONTDeprecated
ICU 54
(missing)
-
LETypes.h#define LE_SMCP_FEATURE_FLAGInternal(missing)
-
LETypes.h#define LE_SS01_FEATURE_FLAGInternal(missing)
-
LETypes.h#define LE_SS02_FEATURE_FLAGInternal(missing)
-
LETypes.h#define LE_SS03_FEATURE_FLAGInternal(missing)
-
LETypes.h#define LE_SS04_FEATURE_FLAGInternal(missing)
-
LETypes.h#define LE_SS05_FEATURE_FLAGInternal(missing)
-
LETypes.h#define LE_SS06_FEATURE_FLAGInternal(missing)
-
LETypes.h#define LE_SS07_FEATURE_FLAGInternal(missing)
-
LETypes.h#define LE_SUB_FONT_MASKDeprecated
ICU 54
(missing)
-
LETypes.h#define LE_SUB_FONT_SHIFTDeprecated
ICU 54
(missing)
-
LETypes.h#define LE_SUCCESSDeprecated
ICU 54
(missing)
-
LETypes.h#define LE_SWSH_FEATURE_FLAGInternal(missing)
-
LETypes.h#define LE_UINT32_MAX(untagged)(missing)
-
LETypes.h#define LE_UINTPTR_MAX(untagged)(missing)
-
LETypes.h#define LE_ZERO_FEATURE_FLAGInternal(missing)
-
LETypes.henum LEErrorCode::LE_FONT_FILE_NOT_FOUND_ERRORDeprecated
ICU 54
(missing)
-
LETypes.henum LEErrorCode::LE_ILLEGAL_ARGUMENT_ERRORDeprecated
ICU 54
(missing)
-
LETypes.henum LEErrorCode::LE_INDEX_OUT_OF_BOUNDS_ERRORDeprecated
ICU 54
(missing)
-
LETypes.henum LEErrorCode::LE_INTERNAL_ERRORDeprecated
ICU 54
(missing)
-
LETypes.henum LEErrorCode::LE_MEMORY_ALLOCATION_ERRORDeprecated
ICU 54
(missing)
-
LETypes.henum LEErrorCode::LE_MISSING_FONT_TABLE_ERRORDeprecated
ICU 54
(missing)
-
LETypes.henum LEErrorCode::LE_NO_ERRORDeprecated
ICU 54
(missing)
-
LETypes.henum LEErrorCode::LE_NO_LAYOUT_ERRORDeprecated
ICU 54
(missing)
-
LETypes.henum LEErrorCode::LE_NO_SUBFONT_WARNINGDeprecated
ICU 54
(missing)
-
LETypes.henum LEFeatureENUMs::LE_AFRC_FEATURE_ENUMInternal(missing)
-
LETypes.henum LEFeatureENUMs::LE_CHAR_FILTER_FEATURE_ENUMInternal(missing)
-
LETypes.henum LEFeatureENUMs::LE_CLIG_FEATURE_ENUMInternal(missing)
-
LETypes.henum LEFeatureENUMs::LE_CSWH_FEATURE_ENUMInternal(missing)
-
LETypes.henum LEFeatureENUMs::LE_DLIG_FEATURE_ENUMInternal(missing)
-
LETypes.henum LEFeatureENUMs::LE_FEATURE_ENUM_MAXInternal(missing)
-
LETypes.henum LEFeatureENUMs::LE_FRAC_FEATURE_ENUMInternal(missing)
-
LETypes.henum LEFeatureENUMs::LE_HLIG_FEATURE_ENUMInternal(missing)
-
LETypes.henum LEFeatureENUMs::LE_Kerning_FEATURE_ENUMInternal(missing)
-
LETypes.henum LEFeatureENUMs::LE_LIGA_FEATURE_ENUMInternal(missing)
-
LETypes.henum LEFeatureENUMs::LE_Ligatures_FEATURE_ENUMInternal(missing)
-
LETypes.henum LEFeatureENUMs::LE_NALT_FEATURE_ENUMInternal(missing)
-
LETypes.henum LEFeatureENUMs::LE_RLIG_FEATURE_ENUMInternal(missing)
-
LETypes.henum LEFeatureENUMs::LE_RUBY_FEATURE_ENUMInternal(missing)
-
LETypes.henum LEFeatureENUMs::LE_SALT_FEATURE_ENUMInternal(missing)
-
LETypes.henum LEFeatureENUMs::LE_SMCP_FEATURE_ENUMInternal(missing)
-
LETypes.henum LEFeatureENUMs::LE_SS01_FEATURE_ENUMInternal(missing)
-
LETypes.henum LEFeatureENUMs::LE_SS02_FEATURE_ENUMInternal(missing)
-
LETypes.henum LEFeatureENUMs::LE_SS03_FEATURE_ENUMInternal(missing)
-
LETypes.henum LEFeatureENUMs::LE_SS04_FEATURE_ENUMInternal(missing)
-
LETypes.henum LEFeatureENUMs::LE_SS05_FEATURE_ENUMInternal(missing)
-
LETypes.henum LEFeatureENUMs::LE_SS06_FEATURE_ENUMInternal(missing)
-
LETypes.henum LEFeatureENUMs::LE_SS07_FEATURE_ENUMInternal(missing)
-
LETypes.henum LEFeatureENUMs::LE_SWSH_FEATURE_ENUMInternal(missing)
-
LETypes.henum LEFeatureENUMs::LE_ZERO_FEATURE_ENUMInternal(missing)
-
LETypes.henum LEFeatureTags::LE_AALT_FEATURE_TAGDeprecated
ICU 54
(missing)
-
LETypes.henum LEFeatureTags::LE_ABVF_FEATURE_TAGDeprecated
ICU 54
(missing)
-
LETypes.henum LEFeatureTags::LE_ABVM_FEATURE_TAGDeprecated
ICU 54
(missing)
-
LETypes.henum LEFeatureTags::LE_ABVS_FEATURE_TAGDeprecated
ICU 54
(missing)
-
LETypes.henum LEFeatureTags::LE_AFRC_FEATURE_TAGDeprecated
ICU 54
(missing)
-
LETypes.henum LEFeatureTags::LE_AKHN_FEATURE_TAGDeprecated
ICU 54
(missing)
-
LETypes.henum LEFeatureTags::LE_BLWF_FEATURE_TAGDeprecated
ICU 54
(missing)
-
LETypes.henum LEFeatureTags::LE_BLWM_FEATURE_TAGDeprecated
ICU 54
(missing)
-
LETypes.henum LEFeatureTags::LE_BLWS_FEATURE_TAGDeprecated
ICU 54
(missing)
-
LETypes.henum LEFeatureTags::LE_C2PC_FEATURE_TAGDeprecated
ICU 54
(missing)
-
LETypes.henum LEFeatureTags::LE_C2SC_FEATURE_TAGDeprecated
ICU 54
(missing)
-
LETypes.henum LEFeatureTags::LE_CALT_FEATURE_TAGDeprecated
ICU 54
(missing)
-
LETypes.henum LEFeatureTags::LE_CASE_FEATURE_TAGDeprecated
ICU 54
(missing)
-
LETypes.henum LEFeatureTags::LE_CCMP_FEATURE_TAGDeprecated
ICU 54
(missing)
-
LETypes.henum LEFeatureTags::LE_CJCT_FEATURE_TAGDeprecated
ICU 54
(missing)
-
LETypes.henum LEFeatureTags::LE_CLIG_FEATURE_TAGDeprecated
ICU 54
(missing)
-
LETypes.henum LEFeatureTags::LE_CPSP_FEATURE_TAGDeprecated
ICU 54
(missing)
-
LETypes.henum LEFeatureTags::LE_CSWH_FEATURE_TAGDeprecated
ICU 54
(missing)
-
LETypes.henum LEFeatureTags::LE_CURS_FEATURE_TAGDeprecated
ICU 54
(missing)
-
LETypes.henum LEFeatureTags::LE_DIST_FEATURE_TAGDeprecated
ICU 54
(missing)
-
LETypes.henum LEFeatureTags::LE_DLIG_FEATURE_TAGDeprecated
ICU 54
(missing)
-
LETypes.henum LEFeatureTags::LE_DNOM_FEATURE_TAGDeprecated
ICU 54
(missing)
-
LETypes.henum LEFeatureTags::LE_EXPT_FEATURE_TAGDeprecated
ICU 54
(missing)
-
LETypes.henum LEFeatureTags::LE_FALT_FEATURE_TAGDeprecated
ICU 54
(missing)
-
LETypes.henum LEFeatureTags::LE_FIN2_FEATURE_TAGDeprecated
ICU 54
(missing)
-
LETypes.henum LEFeatureTags::LE_FIN3_FEATURE_TAGDeprecated
ICU 54
(missing)
-
LETypes.henum LEFeatureTags::LE_FINA_FEATURE_TAGDeprecated
ICU 54
(missing)
-
LETypes.henum LEFeatureTags::LE_FRAC_FEATURE_TAGDeprecated
ICU 54
(missing)
-
LETypes.henum LEFeatureTags::LE_FWID_FEATURE_TAGDeprecated
ICU 54
(missing)
-
LETypes.henum LEFeatureTags::LE_HALF_FEATURE_TAGDeprecated
ICU 54
(missing)
-
LETypes.henum LEFeatureTags::LE_HALN_FEATURE_TAGDeprecated
ICU 54
(missing)
-
LETypes.henum LEFeatureTags::LE_HALT_FEATURE_TAGDeprecated
ICU 54
(missing)
-
LETypes.henum LEFeatureTags::LE_HIST_FEATURE_TAGDeprecated
ICU 54
(missing)
-
LETypes.henum LEFeatureTags::LE_HKNA_FEATURE_TAGDeprecated
ICU 54
(missing)
-
LETypes.henum LEFeatureTags::LE_HLIG_FEATURE_TAGDeprecated
ICU 54
(missing)
-
LETypes.henum LEFeatureTags::LE_HNGL_FEATURE_TAGDeprecated
ICU 54
(missing)
-
LETypes.henum LEFeatureTags::LE_HWID_FEATURE_TAGDeprecated
ICU 54
(missing)
-
LETypes.henum LEFeatureTags::LE_INIT_FEATURE_TAGDeprecated
ICU 54
(missing)
-
LETypes.henum LEFeatureTags::LE_ISOL_FEATURE_TAGDeprecated
ICU 54
(missing)
-
LETypes.henum LEFeatureTags::LE_ITAL_FEATURE_TAGDeprecated
ICU 54
(missing)
-
LETypes.henum LEFeatureTags::LE_JALT_FEATURE_TAGDeprecated
ICU 54
(missing)
-
LETypes.henum LEFeatureTags::LE_JP78_FEATURE_TAGDeprecated
ICU 54
(missing)
-
LETypes.henum LEFeatureTags::LE_JP83_FEATURE_TAGDeprecated
ICU 54
(missing)
-
LETypes.henum LEFeatureTags::LE_JP90_FEATURE_TAGDeprecated
ICU 54
(missing)
-
LETypes.henum LEFeatureTags::LE_KERN_FEATURE_TAGDeprecated
ICU 54
(missing)
-
LETypes.henum LEFeatureTags::LE_LFBD_FEATURE_TAGDeprecated
ICU 54
(missing)
-
LETypes.henum LEFeatureTags::LE_LIGA_FEATURE_TAGDeprecated
ICU 54
(missing)
-
LETypes.henum LEFeatureTags::LE_LJMO_FEATURE_TAGDeprecated
ICU 54
(missing)
-
LETypes.henum LEFeatureTags::LE_LNUM_FEATURE_TAGDeprecated
ICU 54
(missing)
-
LETypes.henum LEFeatureTags::LE_LOCL_FEATURE_TAGDeprecated
ICU 54
(missing)
-
LETypes.henum LEFeatureTags::LE_MARK_FEATURE_TAGDeprecated
ICU 54
(missing)
-
LETypes.henum LEFeatureTags::LE_MED2_FEATURE_TAGDeprecated
ICU 54
(missing)
-
LETypes.henum LEFeatureTags::LE_MEDI_FEATURE_TAGDeprecated
ICU 54
(missing)
-
LETypes.henum LEFeatureTags::LE_MGRK_FEATURE_TAGDeprecated
ICU 54
(missing)
-
LETypes.henum LEFeatureTags::LE_MKMK_FEATURE_TAGDeprecated
ICU 54
(missing)
-
LETypes.henum LEFeatureTags::LE_MSET_FEATURE_TAGDeprecated
ICU 54
(missing)
-
LETypes.henum LEFeatureTags::LE_NALT_FEATURE_TAGDeprecated
ICU 54
(missing)
-
LETypes.henum LEFeatureTags::LE_NLCK_FEATURE_TAGDeprecated
ICU 54
(missing)
-
LETypes.henum LEFeatureTags::LE_NUKT_FEATURE_TAGDeprecated
ICU 54
(missing)
-
LETypes.henum LEFeatureTags::LE_NUMR_FEATURE_TAGDeprecated
ICU 54
(missing)
-
LETypes.henum LEFeatureTags::LE_ONUM_FEATURE_TAGDeprecated
ICU 54
(missing)
-
LETypes.henum LEFeatureTags::LE_OPBD_FEATURE_TAGDeprecated
ICU 54
(missing)
-
LETypes.henum LEFeatureTags::LE_ORDN_FEATURE_TAGDeprecated
ICU 54
(missing)
-
LETypes.henum LEFeatureTags::LE_ORNM_FEATURE_TAGDeprecated
ICU 54
(missing)
-
LETypes.henum LEFeatureTags::LE_PALT_FEATURE_TAGDeprecated
ICU 54
(missing)
-
LETypes.henum LEFeatureTags::LE_PCAP_FEATURE_TAGDeprecated
ICU 54
(missing)
-
LETypes.henum LEFeatureTags::LE_PNUM_FEATURE_TAGDeprecated
ICU 54
(missing)
-
LETypes.henum LEFeatureTags::LE_PREF_FEATURE_TAGDeprecated
ICU 54
(missing)
-
LETypes.henum LEFeatureTags::LE_PRES_FEATURE_TAGDeprecated
ICU 54
(missing)
-
LETypes.henum LEFeatureTags::LE_PSTF_FEATURE_TAGDeprecated
ICU 54
(missing)
-
LETypes.henum LEFeatureTags::LE_PSTS_FEATURE_TAGDeprecated
ICU 54
(missing)
-
LETypes.henum LEFeatureTags::LE_PWID_FEATURE_TAGDeprecated
ICU 54
(missing)
-
LETypes.henum LEFeatureTags::LE_QWID_FEATURE_TAGDeprecated
ICU 54
(missing)
-
LETypes.henum LEFeatureTags::LE_RAND_FEATURE_TAGDeprecated
ICU 54
(missing)
-
LETypes.henum LEFeatureTags::LE_RKRF_FEATURE_TAGDeprecated
ICU 54
(missing)
-
LETypes.henum LEFeatureTags::LE_RLIG_FEATURE_TAGDeprecated
ICU 54
(missing)
-
LETypes.henum LEFeatureTags::LE_RPHF_FEATURE_TAGDeprecated
ICU 54
(missing)
-
LETypes.henum LEFeatureTags::LE_RTBD_FEATURE_TAGDeprecated
ICU 54
(missing)
-
LETypes.henum LEFeatureTags::LE_RTLA_FEATURE_TAGDeprecated
ICU 54
(missing)
-
LETypes.henum LEFeatureTags::LE_RUBY_FEATURE_TAGDeprecated
ICU 54
(missing)
-
LETypes.henum LEFeatureTags::LE_SALT_FEATURE_TAGDeprecated
ICU 54
(missing)
-
LETypes.henum LEFeatureTags::LE_SINF_FEATURE_TAGDeprecated
ICU 54
(missing)
-
LETypes.henum LEFeatureTags::LE_SIZE_FEATURE_TAGDeprecated
ICU 54
(missing)
-
LETypes.henum LEFeatureTags::LE_SMCP_FEATURE_TAGDeprecated
ICU 54
(missing)
-
LETypes.henum LEFeatureTags::LE_SMPL_FEATURE_TAGDeprecated
ICU 54
(missing)
-
LETypes.henum LEFeatureTags::LE_SS01_FEATURE_TAGDeprecated
ICU 54
(missing)
-
LETypes.henum LEFeatureTags::LE_SS02_FEATURE_TAGDeprecated
ICU 54
(missing)
-
LETypes.henum LEFeatureTags::LE_SS03_FEATURE_TAGDeprecated
ICU 54
(missing)
-
LETypes.henum LEFeatureTags::LE_SS04_FEATURE_TAGDeprecated
ICU 54
(missing)
-
LETypes.henum LEFeatureTags::LE_SS05_FEATURE_TAGDeprecated
ICU 54
(missing)
-
LETypes.henum LEFeatureTags::LE_SS06_FEATURE_TAGDeprecated
ICU 54
(missing)
-
LETypes.henum LEFeatureTags::LE_SS07_FEATURE_TAGDeprecated
ICU 54
(missing)
-
LETypes.henum LEFeatureTags::LE_SS08_FEATURE_TAGDeprecated
ICU 54
(missing)
-
LETypes.henum LEFeatureTags::LE_SS09_FEATURE_TAGDeprecated
ICU 54
(missing)
-
LETypes.henum LEFeatureTags::LE_SS10_FEATURE_TAGDeprecated
ICU 54
(missing)
-
LETypes.henum LEFeatureTags::LE_SS11_FEATURE_TAGDeprecated
ICU 54
(missing)
-
LETypes.henum LEFeatureTags::LE_SS12_FEATURE_TAGDeprecated
ICU 54
(missing)
-
LETypes.henum LEFeatureTags::LE_SS13_FEATURE_TAGDeprecated
ICU 54
(missing)
-
LETypes.henum LEFeatureTags::LE_SS14_FEATURE_TAGDeprecated
ICU 54
(missing)
-
LETypes.henum LEFeatureTags::LE_SS15_FEATURE_TAGDeprecated
ICU 54
(missing)
-
LETypes.henum LEFeatureTags::LE_SS16_FEATURE_TAGDeprecated
ICU 54
(missing)
-
LETypes.henum LEFeatureTags::LE_SS17_FEATURE_TAGDeprecated
ICU 54
(missing)
-
LETypes.henum LEFeatureTags::LE_SS18_FEATURE_TAGDeprecated
ICU 54
(missing)
-
LETypes.henum LEFeatureTags::LE_SS19_FEATURE_TAGDeprecated
ICU 54
(missing)
-
LETypes.henum LEFeatureTags::LE_SS20_FEATURE_TAGDeprecated
ICU 54
(missing)
-
LETypes.henum LEFeatureTags::LE_SUBS_FEATURE_TAGDeprecated
ICU 54
(missing)
-
LETypes.henum LEFeatureTags::LE_SUPS_FEATURE_TAGDeprecated
ICU 54
(missing)
-
LETypes.henum LEFeatureTags::LE_SWSH_FEATURE_TAGDeprecated
ICU 54
(missing)
-
LETypes.henum LEFeatureTags::LE_TITL_FEATURE_TAGDeprecated
ICU 54
(missing)
-
LETypes.henum LEFeatureTags::LE_TJMO_FEATURE_TAGDeprecated
ICU 54
(missing)
-
LETypes.henum LEFeatureTags::LE_TNAM_FEATURE_TAGDeprecated
ICU 54
(missing)
-
LETypes.henum LEFeatureTags::LE_TNUM_FEATURE_TAGDeprecated
ICU 54
(missing)
-
LETypes.henum LEFeatureTags::LE_TRAD_FEATURE_TAGDeprecated
ICU 54
(missing)
-
LETypes.henum LEFeatureTags::LE_TWID_FEATURE_TAGDeprecated
ICU 54
(missing)
-
LETypes.henum LEFeatureTags::LE_UNIC_FEATURE_TAGDeprecated
ICU 54
(missing)
-
LETypes.henum LEFeatureTags::LE_VALT_FEATURE_TAGDeprecated
ICU 54
(missing)
-
LETypes.henum LEFeatureTags::LE_VATU_FEATURE_TAGDeprecated
ICU 54
(missing)
-
LETypes.henum LEFeatureTags::LE_VERT_FEATURE_TAGDeprecated
ICU 54
(missing)
-
LETypes.henum LEFeatureTags::LE_VHAL_FEATURE_TAGDeprecated
ICU 54
(missing)
-
LETypes.henum LEFeatureTags::LE_VJMO_FEATURE_TAGDeprecated
ICU 54
(missing)
-
LETypes.henum LEFeatureTags::LE_VKNA_FEATURE_TAGDeprecated
ICU 54
(missing)
-
LETypes.henum LEFeatureTags::LE_VKRN_FEATURE_TAGDeprecated
ICU 54
(missing)
-
LETypes.henum LEFeatureTags::LE_VPAL_FEATURE_TAGDeprecated
ICU 54
(missing)
-
LETypes.henum LEFeatureTags::LE_VRT2_FEATURE_TAGDeprecated
ICU 54
(missing)
-
LETypes.henum LEFeatureTags::LE_ZERO_FEATURE_TAGDeprecated
ICU 54
(missing)
-
LETypes.henum LETableTags::LE_ACNT_TABLE_TAGDeprecated
ICU 54
(missing)
-
LETypes.henum LETableTags::LE_AVAR_TABLE_TAGDeprecated
ICU 54
(missing)
-
LETypes.henum LETableTags::LE_BASE_TABLE_TAGDeprecated
ICU 54
(missing)
-
LETypes.henum LETableTags::LE_BDAT_TABLE_TAGDeprecated
ICU 54
(missing)
-
LETypes.henum LETableTags::LE_BHED_TABLE_TAGDeprecated
ICU 54
(missing)
-
LETypes.henum LETableTags::LE_BLOC_TABLE_TAGDeprecated
ICU 54
(missing)
-
LETypes.henum LETableTags::LE_BSLN_TABLE_TAGDeprecated
ICU 54
(missing)
-
LETypes.henum LETableTags::LE_CFF__TABLE_TAGDeprecated
ICU 54
(missing)
-
LETypes.henum LETableTags::LE_CMAP_TABLE_TAGDeprecated
ICU 54
(missing)
-
LETypes.henum LETableTags::LE_CVAR_TABLE_TAGDeprecated
ICU 54
(missing)
-
LETypes.henum LETableTags::LE_CVT__TABLE_TAGDeprecated
ICU 54
(missing)
-
LETypes.henum LETableTags::LE_DSIG_TABLE_TAGDeprecated
ICU 54
(missing)
-
LETypes.henum LETableTags::LE_EBDT_TABLE_TAGDeprecated
ICU 54
(missing)
-
LETypes.henum LETableTags::LE_EBLC_TABLE_TAGDeprecated
ICU 54
(missing)
-
LETypes.henum LETableTags::LE_EBSC_TABLE_TAGDeprecated
ICU 54
(missing)
-
LETypes.henum LETableTags::LE_FDSC_TABLE_TAGDeprecated
ICU 54
(missing)
-
LETypes.henum LETableTags::LE_FEAT_TABLE_TAGDeprecated
ICU 54
(missing)
-
LETypes.henum LETableTags::LE_FMTX_TABLE_TAGDeprecated
ICU 54
(missing)
-
LETypes.henum LETableTags::LE_FPGM_TABLE_TAGDeprecated
ICU 54
(missing)
-
LETypes.henum LETableTags::LE_FVAR_TABLE_TAGDeprecated
ICU 54
(missing)
-
LETypes.henum LETableTags::LE_GASP_TABLE_TAGDeprecated
ICU 54
(missing)
-
LETypes.henum LETableTags::LE_GDEF_TABLE_TAGDeprecated
ICU 54
(missing)
-
LETypes.henum LETableTags::LE_GLYF_TABLE_TAGDeprecated
ICU 54
(missing)
-
LETypes.henum LETableTags::LE_GPOS_TABLE_TAGDeprecated
ICU 54
(missing)
-
LETypes.henum LETableTags::LE_GSUB_TABLE_TAGDeprecated
ICU 54
(missing)
-
LETypes.henum LETableTags::LE_GVAR_TABLE_TAGDeprecated
ICU 54
(missing)
-
LETypes.henum LETableTags::LE_HDMX_TABLE_TAGDeprecated
ICU 54
(missing)
-
LETypes.henum LETableTags::LE_HEAD_TABLE_TAGDeprecated
ICU 54
(missing)
-
LETypes.henum LETableTags::LE_HHEA_TABLE_TAGDeprecated
ICU 54
(missing)
-
LETypes.henum LETableTags::LE_HMTX_TABLE_TAGDeprecated
ICU 54
(missing)
-
LETypes.henum LETableTags::LE_HSTY_TABLE_TAGDeprecated
ICU 54
(missing)
-
LETypes.henum LETableTags::LE_JSTF_TABLE_TAGDeprecated
ICU 54
(missing)
-
LETypes.henum LETableTags::LE_JUST_TABLE_TAGDeprecated
ICU 54
(missing)
-
LETypes.henum LETableTags::LE_KERN_TABLE_TAGDeprecated
ICU 54
(missing)
-
LETypes.henum LETableTags::LE_LCAR_TABLE_TAGDeprecated
ICU 54
(missing)
-
LETypes.henum LETableTags::LE_LOCA_TABLE_TAGDeprecated
ICU 54
(missing)
-
LETypes.henum LETableTags::LE_LTSH_TABLE_TAGDeprecated
ICU 54
(missing)
-
LETypes.henum LETableTags::LE_MAXP_TABLE_TAGDeprecated
ICU 54
(missing)
-
LETypes.henum LETableTags::LE_MORT_TABLE_TAGDeprecated
ICU 54
(missing)
-
LETypes.henum LETableTags::LE_MORX_TABLE_TAGDeprecated
ICU 54
(missing)
-
LETypes.henum LETableTags::LE_NAME_TABLE_TAGDeprecated
ICU 54
(missing)
-
LETypes.henum LETableTags::LE_OPBD_TABLE_TAGDeprecated
ICU 54
(missing)
-
LETypes.henum LETableTags::LE_OS_2_TABLE_TAGDeprecated
ICU 54
(missing)
-
LETypes.henum LETableTags::LE_PCLT_TABLE_TAGDeprecated
ICU 54
(missing)
-
LETypes.henum LETableTags::LE_POST_TABLE_TAGDeprecated
ICU 54
(missing)
-
LETypes.henum LETableTags::LE_PREP_TABLE_TAGDeprecated
ICU 54
(missing)
-
LETypes.henum LETableTags::LE_PROP_TABLE_TAGDeprecated
ICU 54
(missing)
-
LETypes.henum LETableTags::LE_TRAK_TABLE_TAGDeprecated
ICU 54
(missing)
-
LETypes.henum LETableTags::LE_VDMX_TABLE_TAGDeprecated
ICU 54
(missing)
-
LETypes.henum LETableTags::LE_VHEA_TABLE_TAGDeprecated
ICU 54
(missing)
-
LETypes.henum LETableTags::LE_VMTX_TABLE_TAGDeprecated
ICU 54
(missing)
-
LETypes.henum LETableTags::LE_VORG_TABLE_TAGDeprecated
ICU 54
(missing)
-
LETypes.henum LETableTags::LE_ZAPF_TABLE_TAGDeprecated
ICU 54
(missing)
-
numfmt.hUnicodeString& icu::NumberFormat::format(const StringPiece&, UnicodeString&, FieldPositionIterator*, UErrorCode&)Stable(missing)
-
unistr.hstatic UnicodeString icu::UnicodeString::fromUTF8(const StringPiece&)Stable
ICU 4.2
(missing)
-
utypes.h#define NULLStable
ICU 2.0
(missing)
-
-

-(jump back to top) -
- -

Deprecated or Obsoleted in ICU 58

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
FileAPIICU 57ICU 58
dtfmtsym.henum - icu::DateFormatSymbols::DtContextType::DT_CONTEXT_COUNTStable
ICU 3.6
Deprecated
-ICU 58
dtfmtsym.henum - icu::DateFormatSymbols::DtWidthType::DT_WIDTH_COUNTStable
ICU 3.6
Deprecated
-ICU 58
measfmt.henum UMeasureFormatWidth::UMEASFMT_WIDTH_COUNTStable
ICU 53
Deprecated
-ICU 58
reldatefmt.henum UDateAbsoluteUnit::UDAT_ABSOLUTE_UNIT_COUNTStable
ICU 53
Deprecated
-ICU 58
reldatefmt.henum UDateDirection::UDAT_DIRECTION_COUNTStable
ICU 53
Deprecated
-ICU 58
reldatefmt.henum UDateRelativeUnit::UDAT_RELATIVE_UNIT_COUNTStable
ICU 53
Deprecated
-ICU 58
tmunit.henum - icu::TimeUnit::UTimeUnitFields::UTIMEUNIT_FIELD_COUNTStable
ICU 4.2
Deprecated
-ICU 58
ubidi.h#define U_BIDI_CLASS_DEFAULTStable
ICU 3.6
Deprecated
-ICU 58
ubidi.henum UBiDiReorderingMode::UBIDI_REORDER_COUNTStable
ICU 3.6
Deprecated
-ICU 58
ubrk.henum UBreakIteratorType::UBRK_COUNTStable
ICU 2.0
Deprecated
-ICU 58
ucal.henum UCalendarDateFields::UCAL_FIELD_COUNTStable
ICU 2.6
Deprecated
-ICU 58
uchar.henum UBidiPairedBracketType::U_BPT_COUNTStable
ICU 52
Deprecated
-ICU 58
uchar.henum UBlockCode::UBLOCK_COUNTStable
ICU 2.0
Deprecated
-ICU 58
uchar.henum UCharDirection::U_CHAR_DIRECTION_COUNTStable
ICU 2.0
Deprecated
-ICU 58
uchar.henum UCharNameChoice::U_CHAR_NAME_CHOICE_COUNTStable
ICU 2.0
Deprecated
-ICU 58
uchar.henum UDecompositionType::U_DT_COUNTStable
ICU 2.2
Deprecated
-ICU 58
uchar.henum UEastAsianWidth::U_EA_COUNTStable
ICU 2.2
Deprecated
-ICU 58
uchar.henum UGraphemeClusterBreak::U_GCB_COUNTStable
ICU 3.4
Deprecated
-ICU 58
uchar.henum UHangulSyllableType::U_HST_COUNTStable
ICU 2.6
Deprecated
-ICU 58
uchar.henum UJoiningGroup::U_JG_COUNTStable
ICU 2.2
Deprecated
-ICU 58
uchar.henum UJoiningType::U_JT_COUNTStable
ICU 2.2
Deprecated
-ICU 58
uchar.henum ULineBreak::U_LB_COUNTStable
ICU 2.2
Deprecated
-ICU 58
uchar.henum UNumericType::U_NT_COUNTStable
ICU 2.2
Deprecated
-ICU 58
uchar.henum UProperty::UCHAR_BINARY_LIMITStable
ICU 2.1
Deprecated
-ICU 58
uchar.henum UProperty::UCHAR_DOUBLE_LIMITStable
ICU 2.4
Deprecated
-ICU 58
uchar.henum UProperty::UCHAR_INT_LIMITStable
ICU 2.2
Deprecated
-ICU 58
uchar.henum UProperty::UCHAR_MASK_LIMITStable
ICU 2.4
Deprecated
-ICU 58
uchar.henum UProperty::UCHAR_OTHER_PROPERTY_LIMITStable
ICU 4.6
Deprecated
-ICU 58
uchar.henum UProperty::UCHAR_STRING_LIMITStable
ICU 2.4
Deprecated
-ICU 58
uchar.henum UPropertyNameChoice::U_PROPERTY_NAME_CHOICE_COUNTStable
ICU 2.4
Deprecated
-ICU 58
uchar.henum USentenceBreak::U_SB_COUNTStable
ICU 3.4
Deprecated
-ICU 58
uchar.henum UWordBreakValues::U_WB_COUNTStable
ICU 3.4
Deprecated
-ICU 58
ucnv.henum UConverterUnicodeSet::UCNV_SET_COUNTStable
ICU 2.6
Deprecated
-ICU 58
ucol.henum UColAttribute::UCOL_ATTRIBUTE_COUNTStable
ICU 2.0
Deprecated
-ICU 58
ucol.henum UColAttributeValue::UCOL_ATTRIBUTE_VALUE_COUNTStable
ICU 2.0
Deprecated
-ICU 58
ucol.henum UColBoundMode::UCOL_BOUND_VALUE_COUNTStable
ICU 2.0
Deprecated
-ICU 58
ucol.henum UColReorderCode::UCOL_REORDER_CODE_LIMITStable
ICU 4.8
Deprecated
-ICU 58
ucurr.henum UCurrencyUsage::UCURR_USAGE_COUNTStable
ICU 54
Deprecated
-ICU 58
udat.henum UDateFormatBooleanAttribute::UDAT_BOOLEAN_ATTRIBUTE_COUNTStable
ICU 53
Deprecated
-ICU 58
udat.henum UDateFormatField::UDAT_FIELD_COUNTStable
ICU 3.0
Deprecated
-ICU 58
udata.henum UDataFileAccess::UDATA_FILE_ACCESS_COUNTStable
ICU 3.4
Deprecated
-ICU 58
udatpg.henum UDateTimePatternConflict::UDATPG_CONFLICT_COUNTStable
ICU 3.8
Deprecated
-ICU 58
udatpg.henum UDateTimePatternField::UDATPG_FIELD_COUNTStable
ICU 3.8
Deprecated
-ICU 58
uformattable.henum UFormattableType::UFMT_COUNTStable
ICU 52
Deprecated
-ICU 58
uloc.henum ULocDataLocaleType::ULOC_DATA_LOCALE_TYPE_LIMITStable
ICU 2.1
Deprecated
-ICU 58
ulocdata.henum ULocaleDataDelimiterType::ULOCDATA_DELIMITER_COUNTStable
ICU 3.4
Deprecated
-ICU 58
ulocdata.henum ULocaleDataExemplarSetType::ULOCDATA_ES_COUNTStable
ICU 3.4
Deprecated
-ICU 58
ulocdata.henum UMeasurementSystem::UMS_LIMITStable
ICU 2.8
Deprecated
-ICU 58
unum.henum UCurrencySpacing::UNUM_CURRENCY_SPACING_COUNTStable
ICU 4.8
Deprecated
-ICU 58
unum.henum UNumberFormatFields::UNUM_FIELD_COUNTStable
ICU 49
Deprecated
-ICU 58
unum.henum UNumberFormatStyle::UNUM_FORMAT_STYLE_COUNTStable
ICU 4.8
Deprecated
-ICU 58
unum.henum UNumberFormatSymbol::UNUM_FORMAT_SYMBOL_COUNTStable
ICU 2.0
Deprecated
-ICU 58
upluralrules.henum UPluralType::UPLURAL_TYPE_COUNTStable
ICU 50
Deprecated
-ICU 58
uregion.henum URegionType::URGN_LIMITStable
ICU 51
Deprecated
-ICU 58
ureldatefmt.henum UDateRelativeDateTimeFormatterStyle::UDAT_STYLE_COUNTStable
ICU 54
Deprecated
-ICU 58
ureldatefmt.henum URelativeDateTimeUnit::UDAT_REL_UNIT_COUNTDraft
ICU 57
Deprecated
-ICU 58
ures.henum UResType::URES_LIMITStable
ICU 2.0
Deprecated
-ICU 58
uscript.henum UScriptCode::USCRIPT_CODE_LIMITStable
ICU 2.2
Deprecated
-ICU 58
usearch.henum USearchAttribute::USEARCH_ATTRIBUTE_COUNTStable
ICU 2.4
Deprecated
-ICU 58
usearch.henum USearchAttributeValue::USEARCH_ATTRIBUTE_VALUE_COUNTStable
ICU 2.4
Deprecated
-ICU 58
uset.henum USetSpanCondition::USET_SPAN_CONDITION_COUNTStable
ICU 3.8
Deprecated
-ICU 58
uspoof.henum USpoofChecks::USPOOF_ANY_CASEStable
ICU 4.2
Deprecated
-ICU 58
utrace.henum UTraceFunctionNumber::UTRACE_COLLATION_LIMITStable
ICU 2.8
Deprecated
-ICU 58
utrace.henum UTraceFunctionNumber::UTRACE_CONVERSION_LIMITStable
ICU 2.8
Deprecated
-ICU 58
utrace.henum UTraceFunctionNumber::UTRACE_FUNCTION_LIMITStable
ICU 2.8
Deprecated
-ICU 58
utypes.henum UErrorCode::U_BRK_ERROR_LIMITStable
ICU 2.0
Deprecated
-ICU 58
utypes.henum UErrorCode::U_ERROR_LIMITStable
ICU 2.0
Deprecated
-ICU 58
utypes.henum UErrorCode::U_ERROR_WARNING_LIMITStable
ICU 2.0
Deprecated
-ICU 58
utypes.henum UErrorCode::U_FMT_PARSE_ERROR_LIMITStable
ICU 2.0
Deprecated
-ICU 58
utypes.henum UErrorCode::U_IDNA_ERROR_LIMITStable
ICU 2.0
Deprecated
-ICU 58
+

+(jump back to top) +
+ +

Deprecated or Obsoleted in ICU 60

+ + + + + - + - + - - - - +
FileAPIICU 59ICU 60
utypes.henum UErrorCode::U_PARSE_ERROR_LIMITStable
ICU 2.0
Deprecated
-ICU 58
filteredbrk.hBreakIterator* icu::FilteredBreakIteratorBuilder::build(BreakIterator*, UErrorCode&)Stable
ICU 56
Deprecated
+ICU 60
utypes.henum UErrorCode::U_PLUGIN_ERROR_LIMITStable
ICU 2.0
Deprecated
-ICU 58
filteredbrk.hstatic FilteredBreakIteratorBuilder* icu::FilteredBreakIteratorBuilder::createInstance(UErrorCode&)Stable
ICU 56
Deprecated
+ICU 60
utypes.henum UErrorCode::U_REGEX_ERROR_LIMITStable
ICU 2.0
Deprecated
-ICU 58
utypes.henum UErrorCode::U_STANDARD_ERROR_LIMITStable
ICU 2.0
Deprecated
-ICU 58
utf_old.h#define U_HIDE_OBSOLETE_UTF_OLD_H(missing)Deprecated
+ICU 2.4

(jump back to top)
-

Changed in ICU 58 (old, new)

+

Changed in ICU 60 (old, new)

- + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - - - - - - - - - - - - - - - - +
FileAPIICU 57ICU 58FileAPIICU 59ICU 60
compactdecimalformat.hUnicodeString& icu::CompactDecimalFormat::format(int32_t, UnicodeString&, FieldPosition&)Draft→Stable
ICU 56
decimfmt.hUnicodeString& icu::DecimalFormat::format(double, UnicodeString&, FieldPositionIterator*, UErrorCode&)StableStable
-ICU 4.4
decimfmt.hUnicodeString& icu::DecimalFormat::format(int32_t, UnicodeString&, FieldPositionIterator*, UErrorCode&)StableStable
-ICU 4.4
decimfmt.hUnicodeString& icu::DecimalFormat::format(int64_t, UnicodeString&, FieldPositionIterator*, UErrorCode&)StableStable
-ICU 4.4
dtfmtsym.henum - icu::DateFormatSymbols::DtContextType::DT_CONTEXT_COUNTStable
ICU 3.6
Deprecated
-ICU 58
dtfmtsym.henum - icu::DateFormatSymbols::DtWidthType::DT_WIDTH_COUNTStable
ICU 3.6
Deprecated
-ICU 58
dtptngen.hstatic UnicodeString icu::DateTimePatternGenerator::staticGetBaseSkeleton(const UnicodeString&, UErrorCode&)Draft→Stable
ICU 56
dtptngen.hstatic UnicodeString icu::DateTimePatternGenerator::staticGetSkeleton(const UnicodeString&, UErrorCode&)Draft→Stable
ICU 56
fieldpos.henum icu::FieldPosition::(anonymous) {}(untagged)Stable
-ICU 2.0
fieldpos.henum icu::FieldPosition::(anonymous)::DONT_CARE(untagged)Stable
-ICU 2.0
filteredbrk.hBreakIterator* icu::FilteredBreakIteratorBuilder::build(BreakIterator*, UErrorCode&)Draft→Stable
ICU 56
filteredbrk.hBreakIterator* icu::FilteredBreakIteratorBuilder::build(BreakIterator*, UErrorCode&)Stable
ICU 56
Deprecated
+ICU 60
filteredbrk.hUBool icu::FilteredBreakIteratorBuilder::suppressBreakAfter(const UnicodeString&, UErrorCode&)Draft→Stable
ICU 56
filteredbrk.hstatic FilteredBreakIteratorBuilder* icu::FilteredBreakIteratorBuilder::createInstance(UErrorCode&)Stable
ICU 56
Deprecated
+ICU 60
filteredbrk.hUBool icu::FilteredBreakIteratorBuilder::unsuppressBreakAfter(const UnicodeString&, UErrorCode&)Draft→Stable
ICU 56
measfmt.hUnicodeString icu::MeasureFormat::getUnitDisplayName(const MeasureUnit&, UErrorCode&)Draft→Stable
ICU 58
filteredbrk.hicu::FilteredBreakIteratorBuilder::~FilteredBreakIteratorBuilder()Draft→Stable
ICU 56
ubiditransform.hUBiDiTransform* ubiditransform_open(UErrorCode*)Draft→Stable
ICU 58
filteredbrk.hstatic FilteredBreakIteratorBuilder* icu::FilteredBreakIteratorBuilder::createInstance(UErrorCode&)Draft→Stable
ICU 56
ubiditransform.henum UBiDiMirroring::UBIDI_MIRRORING_OFFDraft→Stable
ICU 58
filteredbrk.hstatic FilteredBreakIteratorBuilder* icu::FilteredBreakIteratorBuilder::createInstance(const Locale&, UErrorCode&)Draft→Stable
ICU 56
ubiditransform.henum UBiDiMirroring::UBIDI_MIRRORING_ONDraft→Stable
ICU 58
localpointer.hicu::LocalArray< T >::LocalArray(T*, UErrorCode&)Draft→Stable
ICU 56
ubiditransform.henum UBiDiOrder::UBIDI_LOGICALDraft→Stable
ICU 58
localpointer.hvoid icu::LocalArray< T >::adoptInsteadAndCheckErrorCode(T*, UErrorCode&)Draft→Stable
ICU 56
ubiditransform.henum UBiDiOrder::UBIDI_VISUALDraft→Stable
ICU 58
localpointer.hvoid icu::LocalArray< T >::swap(LocalArray< T >&) U_NOEXCEPTDraft→Stable
ICU 56
ubiditransform.huint32_t ubiditransform_transform(UBiDiTransform*, const UChar*, int32_t, UChar*, int32_t, UBiDiLevel, UBiDiOrder, UBiDiLevel, UBiDiOrder, UBiDiMirroring, uint32_t, UErrorCode*)Draft→Stable
ICU 58
localpointer.hvoid icu::LocalPointer< T >::swap(LocalPointer< T >&) U_NOEXCEPTDraft→Stable
ICU 56
ubiditransform.hvoid ubiditransform_close(UBiDiTransform*)Draft→Stable
ICU 58
measfmt.henum UMeasureFormatWidth::UMEASFMT_WIDTH_COUNTStable
ICU 53
Deprecated
-ICU 58
udisplaycontext.henum UDisplayContext::UDISPCTX_NO_SUBSTITUTEDraft→Stable
ICU 58
measunit.hstatic MeasureUnit* icu::MeasureUnit::createCentury(UErrorCode&)Draft→Stable
ICU 56
udisplaycontext.henum UDisplayContext::UDISPCTX_SUBSTITUTEDraft→Stable
ICU 58
measunit.hstatic MeasureUnit* icu::MeasureUnit::createCupMetric(UErrorCode&)Draft→Stable
ICU 56
udisplaycontext.henum UDisplayContextType::UDISPCTX_TYPE_SUBSTITUTE_HANDLINGDraft→Stable
ICU 58
measunit.hstatic MeasureUnit* icu::MeasureUnit::createGenericTemperature(UErrorCode&)Draft→Stable
ICU 56
uspoof.hURestrictionLevel uspoof_getCheckResultRestrictionLevel(const USpoofCheckResult*, UErrorCode*)Draft→Stable
ICU 58
measunit.hstatic MeasureUnit* icu::MeasureUnit::createKnot(UErrorCode&)Draft→Stable
ICU 56
uspoof.hUSpoofCheckResult* uspoof_openCheckResult(UErrorCode*)Draft→Stable
ICU 58
measunit.hstatic MeasureUnit* icu::MeasureUnit::createLiterPer100Kilometers(UErrorCode&)Draft→Stable
ICU 56
uspoof.hU_NAMESPACE_END int32_t uspoof_getCheckResultChecks(const USpoofCheckResult*, UErrorCode*)Draft→Stable
ICU 58
measunit.hstatic MeasureUnit* icu::MeasureUnit::createMileScandinavian(UErrorCode&)Draft→Stable
ICU 56
uspoof.hconst USet* uspoof_getCheckResultNumerics(const USpoofCheckResult*, UErrorCode*)Draft→Stable
ICU 58
measunit.hstatic MeasureUnit* icu::MeasureUnit::createPintMetric(UErrorCode&)Draft→Stable
ICU 56
uspoof.henum USpoofChecks::USPOOF_CONFUSABLEDraft→Stable
ICU 58
measunit.hstatic MeasureUnit* icu::MeasureUnit::createRevolutionAngle(UErrorCode&)Draft→Stable
ICU 56
uspoof.hint32_t uspoof_check2(const USpoofChecker*, const UChar*, int32_t, USpoofCheckResult*, UErrorCode*)Draft→Stable
ICU 58
numfmt.hUnicodeString& icu::NumberFormat::format(const Formattable&, UnicodeString&, FieldPositionIterator*, UErrorCode&)StableStable
-ICU 4.4
uspoof.hint32_t uspoof_check2UTF8(const USpoofChecker*, const char*, int32_t, USpoofCheckResult*, UErrorCode*)Draft→Stable
ICU 58
numfmt.hUnicodeString& icu::NumberFormat::format(double, UnicodeString&, FieldPositionIterator*, UErrorCode&)StableStable
-ICU 4.4
uspoof.hint32_t uspoof_check2UnicodeString(const USpoofChecker*, const icu::UnicodeString&, USpoofCheckResult*, UErrorCode*)Draft→Stable
ICU 58
numfmt.hUnicodeString& icu::NumberFormat::format(int32_t, UnicodeString&, FieldPositionIterator*, UErrorCode&)StableStable
-ICU 4.4
uspoof.hvoid uspoof_closeCheckResult(USpoofCheckResult*)Draft→Stable
ICU 58
numfmt.hUnicodeString& icu::NumberFormat::format(int64_t, UnicodeString&, FieldPositionIterator*, UErrorCode&)StableStable
-ICU 4.4
reldatefmt.henum UDateAbsoluteUnit::UDAT_ABSOLUTE_UNIT_COUNTStable
ICU 53
Deprecated
-ICU 58
reldatefmt.henum UDateDirection::UDAT_DIRECTION_COUNTStable
ICU 53
Deprecated
-ICU 58
reldatefmt.henum UDateRelativeUnit::UDAT_RELATIVE_UNIT_COUNTStable
ICU 53
Deprecated
-ICU 58
tmunit.henum - icu::TimeUnit::UTimeUnitFields::UTIMEUNIT_FIELD_COUNTStable
ICU 4.2
Deprecated
-ICU 58
ubidi.h#define U_BIDI_CLASS_DEFAULTStable
ICU 3.6
Deprecated
-ICU 58
+

+(jump back to top) +
+ +

Promoted to stable in ICU 60

+ + + + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - +
FileAPIICU 59ICU 60
ubidi.henum UBiDiReorderingMode::UBIDI_REORDER_COUNTStable
ICU 3.6
Deprecated
-ICU 58
measfmt.hUnicodeString icu::MeasureFormat::getUnitDisplayName(const MeasureUnit&, UErrorCode&)Draft→Stable
ICU 58
ubrk.henum UBreakIteratorType::UBRK_COUNTStable
ICU 2.0
Deprecated
-ICU 58
numfmt.henum + icu::NumberFormat::ERoundingMode {}(moved from decimfmt.h)Stable
+ICU 2.4
ucal.henum UCalendarDateFields::UCAL_FIELD_COUNTStable
ICU 2.6
Deprecated
-ICU 58
numfmt.henum + icu::NumberFormat::ERoundingMode::kRoundCeiling(moved from decimfmt.h)Stable
+ICU 2.4
uchar.henum UBidiPairedBracketType::U_BPT_COUNTStable
ICU 52
Deprecated
-ICU 58
numfmt.henum + icu::NumberFormat::ERoundingMode::kRoundDown(moved from decimfmt.h)Stable
+ICU 2.4
uchar.henum UBlockCode::UBLOCK_COUNTStable
ICU 2.0
Deprecated
-ICU 58
numfmt.henum + icu::NumberFormat::ERoundingMode::kRoundFloor(moved from decimfmt.h)Stable
+ICU 2.4
uchar.henum UCharDirection::U_CHAR_DIRECTION_COUNTStable
ICU 2.0
Deprecated
-ICU 58
numfmt.henum + icu::NumberFormat::ERoundingMode::kRoundHalfDown(moved from decimfmt.h)Stable
+ICU 2.4
uchar.henum UCharNameChoice::U_CHAR_NAME_CHOICE_COUNTStable
ICU 2.0
Deprecated
-ICU 58
numfmt.henum + icu::NumberFormat::ERoundingMode::kRoundHalfEven(moved from decimfmt.h)Stable
+ICU 2.4
uchar.henum UDecompositionType::U_DT_COUNTStable
ICU 2.2
Deprecated
-ICU 58
numfmt.henum + icu::NumberFormat::ERoundingMode::kRoundHalfUp(moved from decimfmt.h)Stable
+ICU 2.4
uchar.henum UEastAsianWidth::U_EA_COUNTStable
ICU 2.2
Deprecated
-ICU 58
numfmt.henum + icu::NumberFormat::ERoundingMode::kRoundUnnecessary(moved from decimfmt.h)Stable
+ICU 4.8
uchar.henum UGraphemeClusterBreak::U_GCB_COUNTStable
ICU 3.4
Deprecated
-ICU 58
numfmt.henum + icu::NumberFormat::ERoundingMode::kRoundUp(moved from decimfmt.h)Stable
+ICU 2.4
uchar.henum UGraphemeClusterBreak::U_GCB_PREPENDStable
ICU 3.4
Stable
-ICU 4.0 -
-(changed)
ubiditransform.hUBiDiTransform* ubiditransform_open(UErrorCode*)Draft→Stable
ICU 58
uchar.henum UGraphemeClusterBreak::U_GCB_REGIONAL_INDICATORStable
ICU 3.4
Stable
-ICU 50 -
-(changed)
ubiditransform.henum UBiDiMirroring::UBIDI_MIRRORING_OFFDraft→Stable
ICU 58
uchar.henum UGraphemeClusterBreak::U_GCB_SPACING_MARKStable
ICU 3.4
Stable
-ICU 4.0 -
-(changed)
ubiditransform.henum UBiDiMirroring::UBIDI_MIRRORING_ONDraft→Stable
ICU 58
uchar.henum UHangulSyllableType::U_HST_COUNTStable
ICU 2.6
Deprecated
-ICU 58
ubiditransform.henum UBiDiOrder::UBIDI_LOGICALDraft→Stable
ICU 58
uchar.henum UJoiningGroup::U_JG_COUNTStable
ICU 2.2
Deprecated
-ICU 58
ubiditransform.henum UBiDiOrder::UBIDI_VISUALDraft→Stable
ICU 58
uchar.henum UJoiningType::U_JT_COUNTStable
ICU 2.2
Deprecated
-ICU 58
ubiditransform.huint32_t ubiditransform_transform(UBiDiTransform*, const UChar*, int32_t, UChar*, int32_t, UBiDiLevel, UBiDiOrder, UBiDiLevel, UBiDiOrder, UBiDiMirroring, uint32_t, UErrorCode*)Draft→Stable
ICU 58
uchar.henum ULineBreak::U_LB_CLOSE_PARENTHESISStable
ICU 2.2
Stable
-ICU 4.4 -
-(changed)
ubiditransform.hvoid ubiditransform_close(UBiDiTransform*)Draft→Stable
ICU 58
uchar.henum ULineBreak::U_LB_CONDITIONAL_JAPANESE_STARTERStable
ICU 2.2
Stable
-ICU 49 -
-(changed)
uchar.henum UBlockCode::UBLOCK_CJK_UNIFIED_IDEOGRAPHS_EXTENSION_F(missing)Stable
+ICU 60
(Born Stable)
uchar.henum ULineBreak::U_LB_COUNTStable
ICU 2.2
Deprecated
-ICU 58
uchar.henum UBlockCode::UBLOCK_KANA_EXTENDED_A(missing)Stable
+ICU 60
(Born Stable)
uchar.henum ULineBreak::U_LB_H2Stable
ICU 2.2
Stable
-ICU 3.4 -
-(changed)
uchar.henum UBlockCode::UBLOCK_MASARAM_GONDI(missing)Stable
+ICU 60
(Born Stable)
uchar.henum ULineBreak::U_LB_H3Stable
ICU 2.2
Stable
-ICU 3.4 -
-(changed)
uchar.henum UBlockCode::UBLOCK_NUSHU(missing)Stable
+ICU 60
(Born Stable)
uchar.henum ULineBreak::U_LB_HEBREW_LETTERStable
ICU 2.2
Stable
-ICU 49 -
-(changed)
uchar.henum UBlockCode::UBLOCK_SOYOMBO(missing)Stable
+ICU 60
(Born Stable)
uchar.henum ULineBreak::U_LB_JLStable
ICU 2.2
Stable
-ICU 3.4 -
-(changed)
uchar.henum UBlockCode::UBLOCK_SYRIAC_SUPPLEMENT(missing)Stable
+ICU 60
(Born Stable)
uchar.henum ULineBreak::U_LB_JTStable
ICU 2.2
Stable
-ICU 3.4 -
-(changed)
uchar.henum UBlockCode::UBLOCK_ZANABAZAR_SQUARE(missing)Stable
+ICU 60
(Born Stable)
uchar.henum ULineBreak::U_LB_JVStable
ICU 2.2
Stable
-ICU 3.4 -
-(changed)
uchar.henum UJoiningGroup::U_JG_MALAYALAM_BHA(missing)Stable
+ICU 60
(Born Stable)
uchar.henum ULineBreak::U_LB_NEXT_LINEStable
ICU 2.2
Stable
-ICU 2.6 -
-(changed)
uchar.henum UJoiningGroup::U_JG_MALAYALAM_JA(missing)Stable
+ICU 60
(Born Stable)
uchar.henum ULineBreak::U_LB_REGIONAL_INDICATORStable
ICU 2.2
Stable
-ICU 50 -
-(changed)
uchar.henum UJoiningGroup::U_JG_MALAYALAM_LLA(missing)Stable
+ICU 60
(Born Stable)
uchar.henum ULineBreak::U_LB_WORD_JOINERStable
ICU 2.2
Stable
-ICU 2.6 -
-(changed)
uchar.henum UJoiningGroup::U_JG_MALAYALAM_LLLA(missing)Stable
+ICU 60
(Born Stable)
uchar.henum UNumericType::U_NT_COUNTStable
ICU 2.2
Deprecated
-ICU 58
uchar.henum UJoiningGroup::U_JG_MALAYALAM_NGA(missing)Stable
+ICU 60
(Born Stable)
uchar.henum UProperty::UCHAR_BINARY_LIMITStable
ICU 2.1
Deprecated
-ICU 58
uchar.henum UJoiningGroup::U_JG_MALAYALAM_NNA(missing)Stable
+ICU 60
(Born Stable)
uchar.henum UProperty::UCHAR_DOUBLE_LIMITStable
ICU 2.4
Deprecated
-ICU 58
uchar.henum UJoiningGroup::U_JG_MALAYALAM_NNNA(missing)Stable
+ICU 60
(Born Stable)
uchar.henum UProperty::UCHAR_INT_LIMITStable
ICU 2.2
Deprecated
-ICU 58
uchar.henum UJoiningGroup::U_JG_MALAYALAM_NYA(missing)Stable
+ICU 60
(Born Stable)
uchar.henum UProperty::UCHAR_MASK_LIMITStable
ICU 2.4
Deprecated
-ICU 58
uchar.henum UJoiningGroup::U_JG_MALAYALAM_RA(missing)Stable
+ICU 60
(Born Stable)
uchar.henum UProperty::UCHAR_OTHER_PROPERTY_LIMITStable
ICU 4.6
Deprecated
-ICU 58
uchar.henum UJoiningGroup::U_JG_MALAYALAM_SSA(missing)Stable
+ICU 60
(Born Stable)
uchar.henum UProperty::UCHAR_STRING_LIMITStable
ICU 2.4
Deprecated
-ICU 58
uchar.henum UJoiningGroup::U_JG_MALAYALAM_TTA(missing)Stable
+ICU 60
(Born Stable)
uchar.henum UPropertyNameChoice::U_PROPERTY_NAME_CHOICE_COUNTStable
ICU 2.4
Deprecated
-ICU 58
uchar.henum UProperty::UCHAR_EMOJI_COMPONENT(missing)Stable
+ICU 60
(Born Stable)
uchar.henum USentenceBreak::U_SB_COUNTStable
ICU 3.4
Deprecated
-ICU 58
uchar.henum UProperty::UCHAR_PREPENDED_CONCATENATION_MARK(missing)Stable
+ICU 60
(Born Stable)
uchar.henum UWordBreakValues::U_WB_COUNTStable
ICU 3.4
Deprecated
-ICU 58
uchar.henum UProperty::UCHAR_REGIONAL_INDICATOR(missing)Stable
+ICU 60
(Born Stable)
uchar.henum UWordBreakValues::U_WB_CRStable
ICU 3.4
Stable
-ICU 4.0 -
-(changed)
udisplaycontext.henum UDisplayContext::UDISPCTX_NO_SUBSTITUTEDraft→Stable
ICU 58
uchar.henum UWordBreakValues::U_WB_DOUBLE_QUOTEStable
ICU 3.4
Stable
-ICU 52 -
-(changed)
udisplaycontext.henum UDisplayContext::UDISPCTX_SUBSTITUTEDraft→Stable
ICU 58
uchar.henum UWordBreakValues::U_WB_EXTENDStable
ICU 3.4
Stable
-ICU 4.0 -
-(changed)
udisplaycontext.henum UDisplayContextType::UDISPCTX_TYPE_SUBSTITUTE_HANDLINGDraft→Stable
ICU 58
uchar.henum UWordBreakValues::U_WB_HEBREW_LETTERStable
ICU 3.4
Stable
-ICU 52 -
-(changed)
uscript.henum UScriptCode::USCRIPT_MASARAM_GONDI(missing)Stable
+ICU 60
(Born Stable)
uchar.henum UWordBreakValues::U_WB_LFStable
ICU 3.4
Stable
-ICU 4.0 -
-(changed)
uscript.henum UScriptCode::USCRIPT_SOYOMBO(missing)Stable
+ICU 60
(Born Stable)
uchar.henum UWordBreakValues::U_WB_MIDNUMLETStable
ICU 3.4
Stable
-ICU 4.0 -
-(changed)
uscript.henum UScriptCode::USCRIPT_ZANABAZAR_SQUARE(missing)Stable
+ICU 60
(Born Stable)
uchar.henum UWordBreakValues::U_WB_NEWLINEStable
ICU 3.4
Stable
-ICU 4.0 -
-(changed)
uspoof.hURestrictionLevel uspoof_getCheckResultRestrictionLevel(const USpoofCheckResult*, UErrorCode*)Draft→Stable
ICU 58
uchar.henum UWordBreakValues::U_WB_REGIONAL_INDICATORStable
ICU 3.4
Stable
-ICU 50 -
-(changed)
uspoof.hUSpoofCheckResult* uspoof_openCheckResult(UErrorCode*)Draft→Stable
ICU 58
uchar.henum UWordBreakValues::U_WB_SINGLE_QUOTEStable
ICU 3.4
Stable
-ICU 52 -
-(changed)
uspoof.hU_NAMESPACE_END int32_t uspoof_getCheckResultChecks(const USpoofCheckResult*, UErrorCode*)Draft→Stable
ICU 58
ucnv.henum UConverterUnicodeSet::UCNV_SET_COUNTStable
ICU 2.6
Deprecated
-ICU 58
uspoof.hconst USet* uspoof_getCheckResultNumerics(const USpoofCheckResult*, UErrorCode*)Draft→Stable
ICU 58
ucol.henum UColAttribute::UCOL_ATTRIBUTE_COUNTStable
ICU 2.0
Deprecated
-ICU 58
uspoof.henum USpoofChecks::USPOOF_CONFUSABLEDraft→Stable
ICU 58
ucol.henum UColAttributeValue::UCOL_ATTRIBUTE_VALUE_COUNTStable
ICU 2.0
Deprecated
-ICU 58
uspoof.hint32_t uspoof_check2(const USpoofChecker*, const UChar*, int32_t, USpoofCheckResult*, UErrorCode*)Draft→Stable
ICU 58
ucol.henum UColBoundMode::UCOL_BOUND_VALUE_COUNTStable
ICU 2.0
Deprecated
-ICU 58
uspoof.hint32_t uspoof_check2UTF8(const USpoofChecker*, const char*, int32_t, USpoofCheckResult*, UErrorCode*)Draft→Stable
ICU 58
ucol.henum UColReorderCode::UCOL_REORDER_CODE_LIMITStable
ICU 4.8
Deprecated
-ICU 58
uspoof.hint32_t uspoof_check2UnicodeString(const USpoofChecker*, const icu::UnicodeString&, USpoofCheckResult*, UErrorCode*)Draft→Stable
ICU 58
ucurr.henum UCurrencyUsage::UCURR_USAGE_COUNTStable
ICU 54
Deprecated
-ICU 58
uspoof.hvoid uspoof_closeCheckResult(USpoofCheckResult*)Draft→Stable
ICU 58
udat.henum UDateFormatBooleanAttribute::UDAT_BOOLEAN_ATTRIBUTE_COUNTStable
ICU 53
Deprecated
-ICU 58
+

+(jump back to top) +
+ +

Added in ICU 60

+ + + + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - - - - -
FileAPIICU 59ICU 60
udat.henum UDateFormatBooleanAttribute::UDAT_PARSE_MULTIPLE_PATTERNS_FOR_MATCHDraft→Stable
ICU 56
bytestream.hicu::StringByteSink< StringClass >::StringByteSink(StringClass*, int32_t)(missing)Draft
+ICU 60
udat.henum UDateFormatBooleanAttribute::UDAT_PARSE_PARTIAL_LITERAL_MATCHDraft→Stable
ICU 56
casemap.hstatic void icu::CaseMap::utf8Fold(uint32_t, StringPiece, ByteSink&, Edits*, UErrorCode&)(missing)Draft
+ICU 60
udat.henum UDateFormatField::UDAT_FIELD_COUNTStable
ICU 3.0
Deprecated
-ICU 58
casemap.hstatic void icu::CaseMap::utf8ToLower(const char*, uint32_t, StringPiece, ByteSink&, Edits*, UErrorCode&)(missing)Draft
+ICU 60
udata.henum UDataFileAccess::UDATA_FILE_ACCESS_COUNTStable
ICU 3.4
Deprecated
-ICU 58
casemap.hstatic void icu::CaseMap::utf8ToTitle(const char*, uint32_t, BreakIterator*, StringPiece, ByteSink&, Edits*, UErrorCode&)(missing)Draft
+ICU 60
udatpg.henum UDateTimePatternConflict::UDATPG_CONFLICT_COUNTStable
ICU 3.8
Deprecated
-ICU 58
casemap.hstatic void icu::CaseMap::utf8ToUpper(const char*, uint32_t, StringPiece, ByteSink&, Edits*, UErrorCode&)(missing)Draft
+ICU 60
udatpg.henum UDateTimePatternField::UDATPG_FIELD_COUNTStable
ICU 3.8
Deprecated
-ICU 58
currunit.hicu::CurrencyUnit::CurrencyUnit()(missing)Draft
+ICU 60
uformattable.henum UFormattableType::UFMT_COUNTStable
ICU 52
Deprecated
-ICU 58
currunit.hicu::CurrencyUnit::CurrencyUnit(const MeasureUnit&, UErrorCode&)(missing)Draft
+ICU 60
uloc.henum ULocDataLocaleType::ULOC_DATA_LOCALE_TYPE_LIMITStable
ICU 2.1
Deprecated
-ICU 58
dcfmtsym.hicu::DecimalFormatSymbols::DecimalFormatSymbols(const Locale&, const NumberingSystem&, UErrorCode&)(missing)Draft
+ICU 60
ulocdata.henum ULocaleDataDelimiterType::ULOCDATA_DELIMITER_COUNTStable
ICU 3.4
Deprecated
-ICU 58
edits.hEdits& icu::Edits::mergeAndAppend(const Edits&, const Edits&, UErrorCode&)(missing)Draft
+ICU 60
ulocdata.henum ULocaleDataExemplarSetType::ULOCDATA_ES_COUNTStable
ICU 3.4
Deprecated
-ICU 58
edits.hEdits& icu::Edits::operator=(Edits&&)(missing)Draft
+ICU 60
ulocdata.henum UMeasurementSystem::UMS_LIMITStable
ICU 2.8
Deprecated
-ICU 58
edits.hEdits& icu::Edits::operator=(const Edits&)(missing)Draft
+ICU 60
unistr.h#define UNISTR_OBJECT_SIZEDraft→Stable
ICU 56
edits.hicu::Edits::Edits(Edits&&)(missing)Draft
+ICU 60
unistr.hvoid icu::UnicodeString::swap(UnicodeString&) U_NOEXCEPTDraft→Stable
ICU 56
edits.hicu::Edits::Edits(const Edits&)(missing)Draft
+ICU 60
unum.henum UCurrencySpacing::UNUM_CURRENCY_SPACING_COUNTStable
ICU 4.8
Deprecated
-ICU 58
edits.hint32_t icu::Edits::numberOfChanges()(missing)Draft
+ICU 60
unum.henum UNumberFormatFields::UNUM_FIELD_COUNTStable
ICU 49
Deprecated
-ICU 58
filteredbrk.hBreakIterator* icu::FilteredBreakIteratorBuilder::wrapIteratorWithFilter(BreakIterator*, UErrorCode&)(missing)Draft
+ICU 60
unum.henum UNumberFormatStyle::UNUM_CURRENCY_STANDARDDraft→Stable
ICU 56
filteredbrk.hstatic FilteredBreakIteratorBuilder* icu::FilteredBreakIteratorBuilder::createEmptyInstance(UErrorCode&)(missing)Draft
+ICU 60
unum.henum UNumberFormatStyle::UNUM_DECIMAL_COMPACT_LONGDraft→Stable
ICU 56
normalizer2.hUBool icu::FilteredNormalizer2::isNormalizedUTF8(StringPiece, UErrorCode&)(missing)Draft
+ICU 60
unum.henum UNumberFormatStyle::UNUM_DECIMAL_COMPACT_SHORTDraft→Stable
ICU 56
normalizer2.hUBool icu::Normalizer2::isNormalizedUTF8(StringPiece, UErrorCode&)(missing)Draft
+ICU 60
unum.henum UNumberFormatStyle::UNUM_FORMAT_STYLE_COUNTStable
ICU 4.8
Deprecated
-ICU 58
normalizer2.hvoid icu::FilteredNormalizer2::normalizeUTF8(uint32_t, StringPiece, ByteSink&, Edits*, UErrorCode&)(missing)Draft
+ICU 60
unum.henum UNumberFormatSymbol::UNUM_FORMAT_SYMBOL_COUNTStable
ICU 2.0
Deprecated
-ICU 58
normalizer2.hvoid icu::Normalizer2::normalizeUTF8(uint32_t, StringPiece, ByteSink&, Edits*, UErrorCode&)(missing)Draft
+ICU 60
upluralrules.henum UPluralType::UPLURAL_TYPE_COUNTStable
ICU 50
Deprecated
-ICU 58
nounit.hUClassID icu::NoUnit::getDynamicClassID()(missing)Draft
+ICU 60
uregion.henum URegionType::URGN_LIMITStable
ICU 51
Deprecated
-ICU 58
nounit.hUObject* icu::NoUnit::clone()(missing)Draft
+ICU 60
ureldatefmt.henum UDateRelativeDateTimeFormatterStyle::UDAT_STYLE_COUNTStable
ICU 54
Deprecated
-ICU 58
nounit.hicu::NoUnit::NoUnit(const NoUnit&)(missing)Draft
+ICU 60
ureldatefmt.henum URelativeDateTimeUnit::UDAT_REL_UNIT_COUNTDraft
ICU 57
Deprecated
-ICU 58
nounit.hicu::NoUnit::~NoUnit()(missing)Draft
+ICU 60
ures.henum UResType::URES_LIMITStable
ICU 2.0
Deprecated
-ICU 58
nounit.hstatic NoUnit icu::NoUnit::base()(missing)Draft
+ICU 60
uscript.henum UScriptCode::USCRIPT_CODE_LIMITStable
ICU 2.2
Deprecated
-ICU 58
nounit.hstatic NoUnit icu::NoUnit::percent()(missing)Draft
+ICU 60
usearch.henum USearchAttribute::USEARCH_ATTRIBUTE_COUNTStable
ICU 2.4
Deprecated
-ICU 58
nounit.hstatic NoUnit icu::NoUnit::permille()(missing)Draft
+ICU 60
usearch.henum USearchAttributeValue::USEARCH_ATTRIBUTE_VALUE_COUNTStable
ICU 2.4
Deprecated
-ICU 58
nounit.hstatic UClassID icu::NoUnit::getStaticClassID()(missing)Draft
+ICU 60
uset.henum USetSpanCondition::USET_SPAN_CONDITION_COUNTStable
ICU 3.8
Deprecated
-ICU 58
numberformatter.hAppendable& icu::number::FormattedNumber::appendTo(Appendable&)(missing)Draft
+ICU 60
uspoof.henum USpoofChecks::USPOOF_ANY_CASEStable
ICU 4.2
Deprecated
-ICU 58
numberformatter.hDerived icu::number::NumberFormatterSettings< Derived >::adoptSymbols(const NumberingSystem*)(missing)Draft
+ICU 60
uspoof.hint32_t uspoof_checkUTF8(const USpoofChecker*, const char*, int32_t, int32_t*, UErrorCode*)Deprecated
ICU 51
Stable
-ICU 4.2 -
-(changed)
numberformatter.hDerived icu::number::NumberFormatterSettings< Derived >::adoptUnit(const icu::MeasureUnit*)(missing)Draft
+ICU 60
uspoof.hint32_t uspoof_checkUnicodeString(const USpoofChecker*, const icu::UnicodeString&, int32_t*, UErrorCode*)Deprecated
ICU 51
Stable
-ICU 4.2 -
-(changed)
numberformatter.hDerived icu::number::NumberFormatterSettings< Derived >::decimal(const UNumberDecimalSeparatorDisplay&)(missing)Draft
+ICU 60
utrace.henum UTraceFunctionNumber::UTRACE_COLLATION_LIMITStable
ICU 2.8
Deprecated
-ICU 58
numberformatter.hDerived icu::number::NumberFormatterSettings< Derived >::grouping(const Grouper&)(missing)Internal
+
utrace.henum UTraceFunctionNumber::UTRACE_CONVERSION_LIMITStable
ICU 2.8
Deprecated
-ICU 58
numberformatter.hDerived icu::number::NumberFormatterSettings< Derived >::integerWidth(const IntegerWidth&)(missing)Draft
+ICU 60
utrace.henum UTraceFunctionNumber::UTRACE_FUNCTION_LIMITStable
ICU 2.8
Deprecated
-ICU 58
numberformatter.hDerived icu::number::NumberFormatterSettings< Derived >::notation(const Notation&)(missing)Draft
+ICU 60
utypes.h#define NULLDeprecated
ICU 54
Stable
-ICU 2.0 -
-(changed)
numberformatter.hDerived icu::number::NumberFormatterSettings< Derived >::padding(const impl::Padder&)(missing)Internal
+ICU 60
utypes.henum UErrorCode::U_BRK_ERROR_LIMITStable
ICU 2.0
Deprecated
-ICU 58
numberformatter.hDerived icu::number::NumberFormatterSettings< Derived >::rounding(const Rounder&)(missing)Draft
+ICU 60
utypes.henum UErrorCode::U_ERROR_LIMITStable
ICU 2.0
Deprecated
-ICU 58
numberformatter.hDerived icu::number::NumberFormatterSettings< Derived >::sign(const UNumberSignDisplay&)(missing)Draft
+ICU 60
utypes.henum UErrorCode::U_ERROR_WARNING_LIMITStable
ICU 2.0
Deprecated
-ICU 58
numberformatter.hDerived icu::number::NumberFormatterSettings< Derived >::symbols(const DecimalFormatSymbols&)(missing)Draft
+ICU 60
utypes.henum UErrorCode::U_FMT_PARSE_ERROR_LIMITStable
ICU 2.0
Deprecated
-ICU 58
numberformatter.hDerived icu::number::NumberFormatterSettings< Derived >::threshold(int32_t)(missing)Internal
+ICU 60
utypes.henum UErrorCode::U_IDNA_ERROR_LIMITStable
ICU 2.0
Deprecated
-ICU 58
numberformatter.hDerived icu::number::NumberFormatterSettings< Derived >::unit(const icu::MeasureUnit&)(missing)Draft
+ICU 60
utypes.henum UErrorCode::U_PARSE_ERROR_LIMITStable
ICU 2.0
Deprecated
-ICU 58
numberformatter.hDerived icu::number::NumberFormatterSettings< Derived >::unitWidth(const UNumberUnitWidth&)(missing)Draft
+ICU 60
utypes.henum UErrorCode::U_PLUGIN_ERROR_LIMITStable
ICU 2.0
Deprecated
-ICU 58
numberformatter.hFormattedNumber icu::number::LocalizedNumberFormatter::formatDecimal(StringPiece, UErrorCode&)(missing)Draft
+ICU 60
utypes.henum UErrorCode::U_REGEX_ERROR_LIMITStable
ICU 2.0
Deprecated
-ICU 58
utypes.henum UErrorCode::U_STANDARD_ERROR_LIMITStable
ICU 2.0
Deprecated
-ICU 58
-

-(jump back to top) -
- -

Promoted to stable in ICU 58

- - - - + - - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - - - - -
FileAPIICU 57ICU 58numberformatter.hFormattedNumber icu::number::LocalizedNumberFormatter::formatDouble(double, UErrorCode&)(missing)Draft
+ICU 60
bytestrie.hStringPiece icu::BytesTrie::Iterator::getString()(missing)Stable
-ICU 4.8
numberformatter.hFormattedNumber icu::number::LocalizedNumberFormatter::formatInt(int64_t, UErrorCode&)(missing)Draft
+ICU 60
bytestriebuilder.hBytesTrieBuilder& icu::BytesTrieBuilder::add(StringPiece, int32_t, UErrorCode&)(missing)Stable
-ICU 4.8
numberformatter.hIntegerWidth icu::number::IntegerWidth::truncateAt(int32_t)(missing)Draft
+ICU 60
compactdecimalformat.hUnicodeString& icu::CompactDecimalFormat::format(int32_t, UnicodeString&, FieldPosition&)Draft→Stable
ICU 56
numberformatter.hLocalizedNumberFormatter icu::number::UnlocalizedNumberFormatter::locale(const icu::Locale&)(missing)Draft
+ICU 60
decimfmt.hUnicodeString& icu::DecimalFormat::format(StringPiece, UnicodeString&, FieldPositionIterator*, UErrorCode&)(missing)Stable
-ICU 4.4
numberformatter.hRounder icu::number::CurrencyRounder::withCurrency(const CurrencyUnit&)(missing)Draft
+ICU 60
dtptngen.hstatic UnicodeString icu::DateTimePatternGenerator::staticGetBaseSkeleton(const UnicodeString&, UErrorCode&)Draft→Stable
ICU 56
numberformatter.hRounder icu::number::FractionRounder::withMaxDigits(int32_t)(missing)Draft
+ICU 60
dtptngen.hstatic UnicodeString icu::DateTimePatternGenerator::staticGetSkeleton(const UnicodeString&, UErrorCode&)Draft→Stable
ICU 56
numberformatter.hRounder icu::number::FractionRounder::withMinDigits(int32_t)(missing)Draft
+ICU 60
fieldpos.henum icu::FieldPosition::(anonymous) {}(untagged)Stable
-ICU 2.0
numberformatter.hRounder icu::number::IncrementRounder::withMinFraction(int32_t)(missing)Draft
+ICU 60
fieldpos.henum icu::FieldPosition::(anonymous)::DONT_CARE(untagged)Stable
-ICU 2.0
numberformatter.hRounder icu::number::Rounder::withMode(UNumberFormatRoundingMode)(missing)Draft
+ICU 60
filteredbrk.hBreakIterator* icu::FilteredBreakIteratorBuilder::build(BreakIterator*, UErrorCode&)Draft→Stable
ICU 56
numberformatter.hScientificNotation icu::number::ScientificNotation::withExponentSignDisplay(UNumberSignDisplay)(missing)Draft
+ICU 60
filteredbrk.hUBool icu::FilteredBreakIteratorBuilder::suppressBreakAfter(const UnicodeString&, UErrorCode&)Draft→Stable
ICU 56
numberformatter.hScientificNotation icu::number::ScientificNotation::withMinExponentDigits(int32_t)(missing)Draft
+ICU 60
filteredbrk.hUBool icu::FilteredBreakIteratorBuilder::unsuppressBreakAfter(const UnicodeString&, UErrorCode&)Draft→Stable
ICU 56
numberformatter.hSymbolsWrapper& icu::number::impl::SymbolsWrapper::operator=(const SymbolsWrapper&)(missing)Internal
+
filteredbrk.hicu::FilteredBreakIteratorBuilder::~FilteredBreakIteratorBuilder()Draft→Stable
ICU 56
numberformatter.hUBool icu::number::NumberFormatterSettings< Derived >::copyErrorTo(UErrorCode&)(missing)Draft
+ICU 60
filteredbrk.hstatic FilteredBreakIteratorBuilder* icu::FilteredBreakIteratorBuilder::createInstance(UErrorCode&)Draft→Stable
ICU 56
numberformatter.hUBool icu::number::impl::SymbolsWrapper::copyErrorTo(UErrorCode&)(missing)Internal
+
filteredbrk.hstatic FilteredBreakIteratorBuilder* icu::FilteredBreakIteratorBuilder::createInstance(const Locale&, UErrorCode&)Draft→Stable
ICU 56
numberformatter.hUnicodeString icu::number::FormattedNumber::toString()(missing)Draft
+ICU 60
fmtable.hicu::Formattable::Formattable(StringPiece, UErrorCode&)(missing)Stable
-ICU 4.4
numberformatter.hbool icu::number::impl::SymbolsWrapper::isDecimalFormatSymbols()(missing)Internal
+
fmtable.hvoid icu::Formattable::setDecimalNumber(StringPiece, UErrorCode&)(missing)Stable
-ICU 4.4
numberformatter.hbool icu::number::impl::SymbolsWrapper::isNumberingSystem()(missing)Internal
+
idna.hvoid icu::IDNA::labelToASCII_UTF8(StringPiece, ByteSink&, IDNAInfo&, UErrorCode&)(missing)Stable
-ICU 4.6
numberformatter.hconst DecimalFormatSymbols* icu::number::impl::SymbolsWrapper::getDecimalFormatSymbols()(missing)Internal
+
idna.hvoid icu::IDNA::labelToUnicodeUTF8(StringPiece, ByteSink&, IDNAInfo&, UErrorCode&)(missing)Stable
-ICU 4.6
numberformatter.hconst NumberingSystem* icu::number::impl::SymbolsWrapper::getNumberingSystem()(missing)Internal
+
idna.hvoid icu::IDNA::nameToASCII_UTF8(StringPiece, ByteSink&, IDNAInfo&, UErrorCode&)(missing)Stable
-ICU 4.6
numberformatter.henum UNumberDecimalSeparatorDisplay::UNUM_DECIMAL_SEPARATOR_ALWAYS(missing)Draft
+ICU 60
idna.hvoid icu::IDNA::nameToUnicodeUTF8(StringPiece, ByteSink&, IDNAInfo&, UErrorCode&)(missing)Stable
-ICU 4.6
numberformatter.henum UNumberDecimalSeparatorDisplay::UNUM_DECIMAL_SEPARATOR_AUTO(missing)Draft
+ICU 60
localpointer.hicu::LocalArray< T >::LocalArray(T*, UErrorCode&)Draft→Stable
ICU 56
numberformatter.henum UNumberDecimalSeparatorDisplay::UNUM_DECIMAL_SEPARATOR_COUNT(missing)Internal
+ICU 60
localpointer.hvoid icu::LocalArray< T >::adoptInsteadAndCheckErrorCode(T*, UErrorCode&)Draft→Stable
ICU 56
numberformatter.henum UNumberSignDisplay::UNUM_SIGN_ACCOUNTING_ALWAYS(missing)Draft
+ICU 60
localpointer.hvoid icu::LocalArray< T >::swap(LocalArray< T >&) U_NOEXCEPTDraft→Stable
ICU 56
numberformatter.henum UNumberSignDisplay::UNUM_SIGN_ACCOUNTING(missing)Draft
+ICU 60
localpointer.hvoid icu::LocalPointer< T >::swap(LocalPointer< T >&) U_NOEXCEPTDraft→Stable
ICU 56
numberformatter.henum UNumberSignDisplay::UNUM_SIGN_ALWAYS(missing)Draft
+ICU 60
measunit.hstatic MeasureUnit* icu::MeasureUnit::createCentury(UErrorCode&)Draft→Stable
ICU 56
numberformatter.henum UNumberSignDisplay::UNUM_SIGN_AUTO(missing)Draft
+ICU 60
measunit.hstatic MeasureUnit* icu::MeasureUnit::createCupMetric(UErrorCode&)Draft→Stable
ICU 56
numberformatter.henum UNumberSignDisplay::UNUM_SIGN_COUNT(missing)Internal
+ICU 60
measunit.hstatic MeasureUnit* icu::MeasureUnit::createGenericTemperature(UErrorCode&)Draft→Stable
ICU 56
numberformatter.henum UNumberSignDisplay::UNUM_SIGN_NEVER(missing)Draft
+ICU 60
measunit.hstatic MeasureUnit* icu::MeasureUnit::createKnot(UErrorCode&)Draft→Stable
ICU 56
numberformatter.henum UNumberUnitWidth::UNUM_UNIT_WIDTH_COUNT(missing)Internal
+ICU 60
measunit.hstatic MeasureUnit* icu::MeasureUnit::createLiterPer100Kilometers(UErrorCode&)Draft→Stable
ICU 56
numberformatter.henum UNumberUnitWidth::UNUM_UNIT_WIDTH_FULL_NAME(missing)Draft
+ICU 60
measunit.hstatic MeasureUnit* icu::MeasureUnit::createMileScandinavian(UErrorCode&)Draft→Stable
ICU 56
numberformatter.henum UNumberUnitWidth::UNUM_UNIT_WIDTH_HIDDEN(missing)Draft
+ICU 60
measunit.hstatic MeasureUnit* icu::MeasureUnit::createPintMetric(UErrorCode&)Draft→Stable
ICU 56
numberformatter.henum UNumberUnitWidth::UNUM_UNIT_WIDTH_ISO_CODE(missing)Draft
+ICU 60
measunit.hstatic MeasureUnit* icu::MeasureUnit::createRevolutionAngle(UErrorCode&)Draft→Stable
ICU 56
numberformatter.henum UNumberUnitWidth::UNUM_UNIT_WIDTH_NARROW(missing)Draft
+ICU 60
numfmt.hUnicodeString& icu::NumberFormat::format(StringPiece, UnicodeString&, FieldPositionIterator*, UErrorCode&)(missing)Stable
-ICU 4.4
numberformatter.henum UNumberUnitWidth::UNUM_UNIT_WIDTH_SHORT(missing)Draft
+ICU 60
uchar.henum UBlockCode::UBLOCK_ADLAM(missing)Stable
-ICU 58
(Born Stable)numberformatter.hicu::number::FormattedNumber::~FormattedNumber()(missing)Draft
+ICU 60
uchar.henum UBlockCode::UBLOCK_BHAIKSUKI(missing)Stable
-ICU 58
(Born Stable)numberformatter.hicu::number::LocalizedNumberFormatter::LocalizedNumberFormatter(const LocalizedNumberFormatter&)(missing)Draft
+ICU 60
uchar.henum UBlockCode::UBLOCK_CYRILLIC_EXTENDED_C(missing)Stable
-ICU 58
(Born Stable)numberformatter.hicu::number::LocalizedNumberFormatter::~LocalizedNumberFormatter()(missing)Draft
+ICU 60
uchar.henum UBlockCode::UBLOCK_GLAGOLITIC_SUPPLEMENT(missing)Stable
-ICU 58
(Born Stable)numberformatter.hicu::number::NumberFormatter::NumberFormatter()=delete(missing)Draft
+ICU 60
uchar.henum UBlockCode::UBLOCK_IDEOGRAPHIC_SYMBOLS_AND_PUNCTUATION(missing)Stable
-ICU 58
(Born Stable)numberformatter.hicu::number::UnlocalizedNumberFormatter::UnlocalizedNumberFormatter(const UnlocalizedNumberFormatter&)(missing)Draft
+ICU 60
uchar.henum UBlockCode::UBLOCK_MARCHEN(missing)Stable
-ICU 58
(Born Stable)numberformatter.hicu::number::impl::SymbolsWrapper::SymbolsWrapper()(missing)Internal
+
uchar.henum UBlockCode::UBLOCK_MONGOLIAN_SUPPLEMENT(missing)Stable
-ICU 58
(Born Stable)numberformatter.hicu::number::impl::SymbolsWrapper::SymbolsWrapper(const SymbolsWrapper&)(missing)Internal
+
uchar.henum UBlockCode::UBLOCK_NEWA(missing)Stable
-ICU 58
(Born Stable)numberformatter.hicu::number::impl::SymbolsWrapper::~SymbolsWrapper()(missing)Internal
+
uchar.henum UBlockCode::UBLOCK_OSAGE(missing)Stable
-ICU 58
(Born Stable)numberformatter.hstatic CompactNotation icu::number::Notation::compactLong()(missing)Draft
+ICU 60
uchar.henum UBlockCode::UBLOCK_TANGUT_COMPONENTS(missing)Stable
-ICU 58
(Born Stable)numberformatter.hstatic CompactNotation icu::number::Notation::compactShort()(missing)Draft
+ICU 60
uchar.henum UBlockCode::UBLOCK_TANGUT(missing)Stable
-ICU 58
(Born Stable)numberformatter.hstatic CurrencyRounder icu::number::Rounder::currency(UCurrencyUsage)(missing)Draft
+ICU 60
uchar.henum UGraphemeClusterBreak::U_GCB_E_BASE_GAZ(missing)Stable
-ICU 58
(Born Stable)numberformatter.hstatic DigitRounder icu::number::Rounder::fixedDigits(int32_t)(missing)Draft
+ICU 60
uchar.henum UGraphemeClusterBreak::U_GCB_E_BASE(missing)Stable
-ICU 58
(Born Stable)numberformatter.hstatic DigitRounder icu::number::Rounder::maxDigits(int32_t)(missing)Draft
+ICU 60
uchar.henum UGraphemeClusterBreak::U_GCB_E_MODIFIER(missing)Stable
-ICU 58
(Born Stable)numberformatter.hstatic DigitRounder icu::number::Rounder::minDigits(int32_t)(missing)Draft
+ICU 60
uchar.henum UGraphemeClusterBreak::U_GCB_GLUE_AFTER_ZWJ(missing)Stable
-ICU 58
(Born Stable)numberformatter.hstatic DigitRounder icu::number::Rounder::minMaxDigits(int32_t, int32_t)(missing)Draft
+ICU 60
uchar.henum UGraphemeClusterBreak::U_GCB_ZWJ(missing)Stable
-ICU 58
(Born Stable)numberformatter.hstatic FractionRounder icu::number::Rounder::fixedFraction(int32_t)(missing)Draft
+ICU 60
uchar.henum UJoiningGroup::U_JG_AFRICAN_FEH(missing)Stable
-ICU 58
(Born Stable)numberformatter.hstatic FractionRounder icu::number::Rounder::integer()(missing)Draft
+ICU 60
uchar.henum UJoiningGroup::U_JG_AFRICAN_NOON(missing)Stable
-ICU 58
(Born Stable)numberformatter.hstatic FractionRounder icu::number::Rounder::maxFraction(int32_t)(missing)Draft
+ICU 60
uchar.henum UJoiningGroup::U_JG_AFRICAN_QAF(missing)Stable
-ICU 58
(Born Stable)numberformatter.hstatic FractionRounder icu::number::Rounder::minFraction(int32_t)(missing)Draft
+ICU 60
uchar.henum ULineBreak::U_LB_E_BASE(missing)Stable
-ICU 58
(Born Stable)numberformatter.hstatic FractionRounder icu::number::Rounder::minMaxFraction(int32_t, int32_t)(missing)Draft
+ICU 60
uchar.henum ULineBreak::U_LB_E_MODIFIER(missing)Stable
-ICU 58
(Born Stable)numberformatter.hstatic Grouper icu::number::Grouper::defaults()(missing)Internal
+
uchar.henum ULineBreak::U_LB_ZWJ(missing)Stable
-ICU 58
(Born Stable)numberformatter.hstatic Grouper icu::number::Grouper::minTwoDigits()(missing)Internal
+
uchar.henum UWordBreakValues::U_WB_E_BASE_GAZ(missing)Stable
-ICU 58
(Born Stable)numberformatter.hstatic Grouper icu::number::Grouper::none()(missing)Internal
+
uchar.henum UWordBreakValues::U_WB_E_BASE(missing)Stable
-ICU 58
(Born Stable)numberformatter.hstatic IncrementRounder icu::number::Rounder::increment(double)(missing)Draft
+ICU 60
uchar.henum UWordBreakValues::U_WB_E_MODIFIER(missing)Stable
-ICU 58
(Born Stable)numberformatter.hstatic IntegerWidth icu::number::IntegerWidth::zeroFillTo(int32_t)(missing)Draft
+ICU 60
uchar.henum UWordBreakValues::U_WB_GLUE_AFTER_ZWJ(missing)Stable
-ICU 58
(Born Stable)numberformatter.hstatic LocalizedNumberFormatter icu::number::NumberFormatter::withLocale(const Locale&)(missing)Draft
+ICU 60
uchar.henum UWordBreakValues::U_WB_ZWJ(missing)Stable
-ICU 58
(Born Stable)numberformatter.hstatic Padder icu::number::impl::Padder::codePoints(UChar32, int32_t, UNumberFormatPadPosition)(missing)Internal
+
udat.henum UDateFormatBooleanAttribute::UDAT_PARSE_MULTIPLE_PATTERNS_FOR_MATCHDraft→Stable
ICU 56
numberformatter.hstatic Padder icu::number::impl::Padder::none()(missing)Internal
+
udat.henum UDateFormatBooleanAttribute::UDAT_PARSE_PARTIAL_LITERAL_MATCHDraft→Stable
ICU 56
numberformatter.hstatic Rounder icu::number::Rounder::unlimited()(missing)Draft
+ICU 60
unistr.h#define UNISTR_OBJECT_SIZEDraft→Stable
ICU 56
numberformatter.hstatic ScientificNotation icu::number::Notation::engineering()(missing)Draft
+ICU 60
unistr.hstatic UnicodeString icu::UnicodeString::fromUTF8(StringPiece)(missing)Stable
-ICU 4.2
numberformatter.hstatic ScientificNotation icu::number::Notation::scientific()(missing)Draft
+ICU 60
unistr.hvoid icu::UnicodeString::swap(UnicodeString&) U_NOEXCEPTDraft→Stable
ICU 56
numberformatter.hstatic SimpleNotation icu::number::Notation::simple()(missing)Draft
+ICU 60
unum.henum UNumberFormatStyle::UNUM_CURRENCY_STANDARDDraft→Stable
ICU 56
numberformatter.hstatic UnlocalizedNumberFormatter icu::number::NumberFormatter::with()(missing)Draft
+ICU 60
unum.henum UNumberFormatStyle::UNUM_DECIMAL_COMPACT_LONGDraft→Stable
ICU 56
numberformatter.hvoid icu::number::FormattedNumber::populateFieldPosition(FieldPosition&, UErrorCode&)(missing)Draft
+ICU 60
unum.henum UNumberFormatStyle::UNUM_DECIMAL_COMPACT_SHORTDraft→Stable
ICU 56
numberformatter.hvoid icu::number::FormattedNumber::populateFieldPositionIterator(FieldPositionIterator&, UErrorCode&)(missing)Draft
+ICU 60
uscript.henum UScriptCode::USCRIPT_ADLAM(missing)Stable
-ICU 58
(Born Stable)numberformatter.hvoid icu::number::impl::SymbolsWrapper::setTo(const DecimalFormatSymbols&)(missing)Internal
+
uscript.henum UScriptCode::USCRIPT_BHAIKSUKI(missing)Stable
-ICU 58
(Born Stable)numberformatter.hvoid icu::number::impl::SymbolsWrapper::setTo(const NumberingSystem*)(missing)Internal
+
uscript.henum UScriptCode::USCRIPT_HAN_WITH_BOPOMOFO(missing)Stable
-ICU 58
(Born Stable)numfmt.hERoundingMode icu::NumberFormat::getRoundingMode()(missing)Draft
+ICU 60
uscript.henum UScriptCode::USCRIPT_JAMO(missing)Stable
-ICU 58
(Born Stable)numfmt.henum + icu::NumberFormat::ERoundingMode {}(moved from decimfmt.h)Stable
+ICU 2.4
uscript.henum UScriptCode::USCRIPT_MARCHEN(missing)Stable
-ICU 58
(Born Stable)numfmt.henum + icu::NumberFormat::ERoundingMode::kRoundCeiling(moved from decimfmt.h)Stable
+ICU 2.4
uscript.henum UScriptCode::USCRIPT_NEWA(missing)Stable
-ICU 58
(Born Stable)numfmt.henum + icu::NumberFormat::ERoundingMode::kRoundDown(moved from decimfmt.h)Stable
+ICU 2.4
uscript.henum UScriptCode::USCRIPT_OSAGE(missing)Stable
-ICU 58
(Born Stable)numfmt.henum + icu::NumberFormat::ERoundingMode::kRoundFloor(moved from decimfmt.h)Stable
+ICU 2.4
uscript.henum UScriptCode::USCRIPT_SYMBOLS_EMOJI(missing)Stable
-ICU 58
(Born Stable)numfmt.henum + icu::NumberFormat::ERoundingMode::kRoundHalfDown(moved from decimfmt.h)Stable
+ICU 2.4
uspoof.hint32_t uspoof_checkUTF8(const USpoofChecker*, const char*, int32_t, int32_t*, UErrorCode*)Deprecated
ICU 51
Stable
-ICU 4.2 -
-(changed)
numfmt.henum + icu::NumberFormat::ERoundingMode::kRoundHalfEven(moved from decimfmt.h)Stable
+ICU 2.4
uspoof.hint32_t uspoof_checkUnicodeString(const USpoofChecker*, const icu::UnicodeString&, int32_t*, UErrorCode*)Deprecated
ICU 51
Stable
-ICU 4.2 -
-(changed)
utypes.h#define NULLDeprecated
ICU 54
Stable
-ICU 2.0 -
-(changed)
-

-(jump back to top) -
- -

Added in ICU 58

- - - - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + - + - + - + - + - + - + - + - + - + - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + - + - + - + - + - + - + - + - + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - +
FileAPIICU 57ICU 58numfmt.henum + icu::NumberFormat::ERoundingMode::kRoundHalfUp(moved from decimfmt.h)Stable
+ICU 2.4
bytestrie.hStringPiece icu::BytesTrie::Iterator::getString()(missing)Stable
-ICU 4.8
bytestriebuilder.hBytesTrieBuilder& icu::BytesTrieBuilder::add(StringPiece, int32_t, UErrorCode&)(missing)Stable
+
numfmt.henum + icu::NumberFormat::ERoundingMode::kRoundUnnecessary(moved from decimfmt.h)Stable
ICU 4.8
compactdecimalformat.hUnicodeString& icu::CompactDecimalFormat::format(StringPiece, UnicodeString&, FieldPositionIterator*, UErrorCode&)(missing)Internal
-
decimfmt.hUnicodeString& icu::DecimalFormat::format(StringPiece, UnicodeString&, FieldPositionIterator*, UErrorCode&)(missing)Stable
-ICU 4.4
fmtable.hicu::Formattable::Formattable(StringPiece, UErrorCode&)(missing)Stable
-ICU 4.4
fmtable.hvoid icu::Formattable::setDecimalNumber(StringPiece, UErrorCode&)(missing)Stable
-ICU 4.4
idna.hvoid icu::IDNA::labelToASCII_UTF8(StringPiece, ByteSink&, IDNAInfo&, UErrorCode&)(missing)Stable
-ICU 4.6
idna.hvoid icu::IDNA::labelToUnicodeUTF8(StringPiece, ByteSink&, IDNAInfo&, UErrorCode&)(missing)Stable
-ICU 4.6
idna.hvoid icu::IDNA::nameToASCII_UTF8(StringPiece, ByteSink&, IDNAInfo&, UErrorCode&)(missing)Stable
-ICU 4.6
idna.hvoid icu::IDNA::nameToUnicodeUTF8(StringPiece, ByteSink&, IDNAInfo&, UErrorCode&)(missing)Stable
-ICU 4.6
measfmt.hUnicodeString icu::MeasureFormat::getUnitDisplayName(const MeasureUnit&, UErrorCode&)(missing)Draft
-ICU 58
measunit.hstatic MeasureUnit* icu::MeasureUnit::createEast(UErrorCode&)(missing)Draft
-ICU 58
numfmt.henum + icu::NumberFormat::ERoundingMode::kRoundUp(moved from decimfmt.h)Stable
+ICU 2.4
measunit.hstatic MeasureUnit* icu::MeasureUnit::createNorth(UErrorCode&)(missing)Draft
-ICU 58
numfmt.hvoid icu::NumberFormat::setRoundingMode(ERoundingMode)(missing)Draft
+ICU 60
measunit.hstatic MeasureUnit* icu::MeasureUnit::createSouth(UErrorCode&)(missing)Draft
-ICU 58
platform.h#define U_CALLCONV_FPTR(missing)Internal
+
measunit.hstatic MeasureUnit* icu::MeasureUnit::createWest(UErrorCode&)(missing)Draft
-ICU 58
platform.h#define U_PF_FUCHSIA(missing)Internal
+
numfmt.hUnicodeString& icu::NumberFormat::format(StringPiece, UnicodeString&, FieldPositionIterator*, UErrorCode&)(missing)Stable
-ICU 4.4
plurrule.hUnicodeString icu::PluralRules::select(const IFixedDecimal&)(missing)Internal
+
tznames.hvoid icu::TimeZoneNames::getDisplayNames(const UnicodeString&, const UTimeZoneNameType types[], int32_t, UDate, UnicodeString dest[], UErrorCode&)(missing)Internal
-
rbbi.hvoid icu::RuleBasedBreakIterator::dumpCache()(missing)Internal
+
tznames.hvoid icu::TimeZoneNames::loadAllDisplayNames(UErrorCode&)(missing)Internal
-
rbnf.hERoundingMode icu::RuleBasedNumberFormat::getRoundingMode()(missing)Draft
+ICU 60
ubiditransform.hUBiDiTransform* ubiditransform_open(UErrorCode*)(missing)Draft
-ICU 58
rbnf.hvoid icu::RuleBasedNumberFormat::setRoundingMode(ERoundingMode)(missing)Draft
+ICU 60
ubiditransform.henum UBiDiMirroring::UBIDI_MIRRORING_OFF(missing)Draft
-ICU 58
stringoptions.h#define U_COMPARE_CODE_POINT_ORDER(moved from unorm2.h, ustring.h)Stable
+ICU 2.2
ubiditransform.henum UBiDiMirroring::UBIDI_MIRRORING_ON(missing)Draft
-ICU 58
stringoptions.h#define U_COMPARE_IGNORE_CASE(moved from unorm2.h)Stable
+ICU 2.2
ubiditransform.henum UBiDiOrder::UBIDI_LOGICAL(missing)Draft
-ICU 58
stringoptions.h#define U_EDITS_NO_RESET(missing)Draft
+ICU 60
ubiditransform.henum UBiDiOrder::UBIDI_VISUAL(missing)Draft
-ICU 58
ubiditransform.huint32_t ubiditransform_transform(UBiDiTransform*, const UChar*, int32_t, UChar*, int32_t, UBiDiLevel, UBiDiOrder, UBiDiLevel, UBiDiOrder, UBiDiMirroring, uint32_t, UErrorCode*)(missing)Draft
-ICU 58
ubiditransform.hvoid ubiditransform_close(UBiDiTransform*)(missing)Draft
-ICU 58
uchar.henum UBlockCode::UBLOCK_ADLAM(missing)Stable
-ICU 58
(Born Stable)
uchar.henum UBlockCode::UBLOCK_BHAIKSUKI(missing)Stable
-ICU 58
(Born Stable)
uchar.henum UBlockCode::UBLOCK_CYRILLIC_EXTENDED_C(missing)Stable
-ICU 58
(Born Stable)
uchar.henum UBlockCode::UBLOCK_GLAGOLITIC_SUPPLEMENT(missing)Stable
-ICU 58
(Born Stable)
uchar.henum UBlockCode::UBLOCK_IDEOGRAPHIC_SYMBOLS_AND_PUNCTUATION(missing)Stable
-ICU 58
(Born Stable)
uchar.henum UBlockCode::UBLOCK_MARCHEN(missing)Stable
-ICU 58
(Born Stable)
uchar.henum UBlockCode::UBLOCK_MONGOLIAN_SUPPLEMENT(missing)Stable
-ICU 58
(Born Stable)
uchar.henum UBlockCode::UBLOCK_NEWA(missing)Stable
-ICU 58
(Born Stable)
uchar.henum UBlockCode::UBLOCK_OSAGE(missing)Stable
-ICU 58
(Born Stable)
uchar.henum UBlockCode::UBLOCK_TANGUT_COMPONENTS(missing)Stable
-ICU 58
(Born Stable)stringoptions.h#define U_FOLD_CASE_DEFAULT(moved from uchar.h)Stable
+ICU 2.0
uchar.henum UBlockCode::UBLOCK_TANGUT(missing)Stable
-ICU 58
(Born Stable)stringoptions.h#define U_FOLD_CASE_EXCLUDE_SPECIAL_I(moved from moved from uchar.h)Stable
+ICU 2.0
uchar.henum UGraphemeClusterBreak::U_GCB_E_BASE_GAZ(missing)Stable
-ICU 58
(Born Stable)stringoptions.h#define U_OMIT_UNCHANGED_TEXT(missing)Draft
+ICU 60
uchar.henum UGraphemeClusterBreak::U_GCB_E_BASE(missing)Stable
-ICU 58
(Born Stable)stringoptions.h#define U_TITLECASE_ADJUST_TO_CASED(missing)Draft
+ICU 60
uchar.henum UGraphemeClusterBreak::U_GCB_E_MODIFIER(missing)Stable
-ICU 58
(Born Stable)stringoptions.h#define U_TITLECASE_NO_BREAK_ADJUSTMENT(moved from ucasemap.h)Stable
+ICU 3.8
uchar.henum UGraphemeClusterBreak::U_GCB_GLUE_AFTER_ZWJ(missing)Stable
-ICU 58
(Born Stable)stringoptions.h#define U_TITLECASE_NO_LOWERCASE(moved from ucasemap.h)Stable
+ICU 3.8
uchar.henum UGraphemeClusterBreak::U_GCB_ZWJ(missing)Stable
-ICU 58
(Born Stable)stringoptions.h#define U_TITLECASE_SENTENCES(missing)Draft
+ICU 60
uchar.henum UJoiningGroup::U_JG_AFRICAN_FEH(missing)Stable
-ICU 58
(Born Stable)stringoptions.h#define U_TITLECASE_WHOLE_STRING(missing)Draft
+ICU 60
uchar.henum UJoiningGroup::U_JG_AFRICAN_NOON(missing)Stable
-ICU 58
(Born Stable)stringoptions.h#define UNORM_INPUT_IS_FCD(moved from unorm2.h)Stable
+ICU 2.2
uchar.henum UJoiningGroup::U_JG_AFRICAN_QAF(missing)Stable
-ICU 58
(Born Stable)uchar.henum UBlockCode::UBLOCK_CJK_UNIFIED_IDEOGRAPHS_EXTENSION_F(missing)Stable
+ICU 60
(Born Stable)
uchar.henum ULineBreak::U_LB_E_BASE(missing)Stable
-ICU 58
(Born Stable)uchar.henum UBlockCode::UBLOCK_KANA_EXTENDED_A(missing)Stable
+ICU 60
(Born Stable)
uchar.henum ULineBreak::U_LB_E_MODIFIER(missing)Stable
-ICU 58
(Born Stable)uchar.henum UBlockCode::UBLOCK_MASARAM_GONDI(missing)Stable
+ICU 60
(Born Stable)
uchar.henum ULineBreak::U_LB_ZWJ(missing)Stable
-ICU 58
(Born Stable)uchar.henum UBlockCode::UBLOCK_NUSHU(missing)Stable
+ICU 60
(Born Stable)
uchar.henum UWordBreakValues::U_WB_E_BASE_GAZ(missing)Stable
-ICU 58
(Born Stable)uchar.henum UBlockCode::UBLOCK_SOYOMBO(missing)Stable
+ICU 60
(Born Stable)
uchar.henum UWordBreakValues::U_WB_E_BASE(missing)Stable
-ICU 58
(Born Stable)uchar.henum UBlockCode::UBLOCK_SYRIAC_SUPPLEMENT(missing)Stable
+ICU 60
(Born Stable)
uchar.henum UWordBreakValues::U_WB_E_MODIFIER(missing)Stable
-ICU 58
(Born Stable)uchar.henum UBlockCode::UBLOCK_ZANABAZAR_SQUARE(missing)Stable
+ICU 60
(Born Stable)
uchar.henum UWordBreakValues::U_WB_GLUE_AFTER_ZWJ(missing)Stable
-ICU 58
(Born Stable)uchar.henum UJoiningGroup::U_JG_MALAYALAM_BHA(missing)Stable
+ICU 60
(Born Stable)
uchar.henum UWordBreakValues::U_WB_ZWJ(missing)Stable
-ICU 58
(Born Stable)uchar.henum UJoiningGroup::U_JG_MALAYALAM_JA(missing)Stable
+ICU 60
(Born Stable)
udisplaycontext.henum UDisplayContext::UDISPCTX_NO_SUBSTITUTE(missing)Draft
-ICU 58
uchar.henum UJoiningGroup::U_JG_MALAYALAM_LLA(missing)Stable
+ICU 60
(Born Stable)
udisplaycontext.henum UDisplayContext::UDISPCTX_SUBSTITUTE(missing)Draft
-ICU 58
uchar.henum UJoiningGroup::U_JG_MALAYALAM_LLLA(missing)Stable
+ICU 60
(Born Stable)
udisplaycontext.henum UDisplayContextType::UDISPCTX_TYPE_SUBSTITUTE_HANDLING(missing)Draft
-ICU 58
uchar.henum UJoiningGroup::U_JG_MALAYALAM_NGA(missing)Stable
+ICU 60
(Born Stable)
unistr.hstatic UnicodeString icu::UnicodeString::fromUTF8(StringPiece)(missing)Stable
-ICU 4.2
uchar.henum UJoiningGroup::U_JG_MALAYALAM_NNA(missing)Stable
+ICU 60
(Born Stable)
uscript.henum UScriptCode::USCRIPT_ADLAM(missing)Stable
-ICU 58
(Born Stable)uchar.henum UJoiningGroup::U_JG_MALAYALAM_NNNA(missing)Stable
+ICU 60
(Born Stable)
uscript.henum UScriptCode::USCRIPT_BHAIKSUKI(missing)Stable
-ICU 58
(Born Stable)uchar.henum UJoiningGroup::U_JG_MALAYALAM_NYA(missing)Stable
+ICU 60
(Born Stable)
uscript.henum UScriptCode::USCRIPT_HAN_WITH_BOPOMOFO(missing)Stable
-ICU 58
(Born Stable)uchar.henum UJoiningGroup::U_JG_MALAYALAM_RA(missing)Stable
+ICU 60
(Born Stable)
uscript.henum UScriptCode::USCRIPT_JAMO(missing)Stable
-ICU 58
(Born Stable)uchar.henum UJoiningGroup::U_JG_MALAYALAM_SSA(missing)Stable
+ICU 60
(Born Stable)
uscript.henum UScriptCode::USCRIPT_MARCHEN(missing)Stable
-ICU 58
(Born Stable)uchar.henum UJoiningGroup::U_JG_MALAYALAM_TTA(missing)Stable
+ICU 60
(Born Stable)
uscript.henum UScriptCode::USCRIPT_NEWA(missing)Stable
-ICU 58
(Born Stable)uchar.henum UProperty::UCHAR_EMOJI_COMPONENT(missing)Stable
+ICU 60
(Born Stable)
uscript.henum UScriptCode::USCRIPT_OSAGE(missing)Stable
-ICU 58
(Born Stable)uchar.henum UProperty::UCHAR_PREPENDED_CONCATENATION_MARK(missing)Stable
+ICU 60
(Born Stable)
uscript.henum UScriptCode::USCRIPT_SYMBOLS_EMOJI(missing)Stable
-ICU 58
(Born Stable)uchar.henum UProperty::UCHAR_REGIONAL_INDICATOR(missing)Stable
+ICU 60
(Born Stable)
uspoof.hURestrictionLevel uspoof_getCheckResultRestrictionLevel(const USpoofCheckResult*, UErrorCode*)(missing)Draft
-ICU 58
uscript.henum UScriptCode::USCRIPT_MASARAM_GONDI(missing)Stable
+ICU 60
(Born Stable)
uspoof.hUSpoofCheckResult* uspoof_openCheckResult(UErrorCode*)(missing)Draft
-ICU 58
uscript.henum UScriptCode::USCRIPT_SOYOMBO(missing)Stable
+ICU 60
(Born Stable)
uspoof.hU_DEFINE_LOCAL_OPEN_POINTER(LocalUSpoofCheckResultPointer,,)(missing) -
- -
-(untagged)
uscript.henum UScriptCode::USCRIPT_ZANABAZAR_SQUARE(missing)Stable
+ICU 60
(Born Stable)
uspoof.hU_NAMESPACE_END int32_t uspoof_getCheckResultChecks(const USpoofCheckResult*, UErrorCode*)(missing)Draft
-ICU 58
utf_old.h#define U_HIDE_OBSOLETE_UTF_OLD_H(missing)Deprecated
+ICU 2.4
uspoof.hconst USet* uspoof_getCheckResultNumerics(const USpoofCheckResult*, UErrorCode*)(missing)Draft
-ICU 58
utf16.h#define U16_GET_OR_FFFD(missing)Draft
+ICU 60
uspoof.henum URestrictionLevel::USPOOF_UNDEFINED_RESTRICTIVE(missing)Internal
-
utf16.h#define U16_NEXT_OR_FFFD(missing)Draft
+ICU 60
uspoof.henum USpoofChecks::USPOOF_CONFUSABLE(missing)Draft
-ICU 58
utf16.h#define U16_PREV_OR_FFFD(missing)Draft
+ICU 60
uspoof.hint32_t uspoof_check2(const USpoofChecker*, const UChar*, int32_t, USpoofCheckResult*, UErrorCode*)(missing)Draft
-ICU 58
utf8.h#define U8_IS_VALID_LEAD3_AND_T1(missing)Internal
+
uspoof.hint32_t uspoof_check2UTF8(const USpoofChecker*, const char*, int32_t, USpoofCheckResult*, UErrorCode*)(missing)Draft
-ICU 58
utf8.h#define U8_IS_VALID_LEAD4_AND_T1(missing)Internal
+
uspoof.hint32_t uspoof_check2UnicodeString(const USpoofChecker*, const icu::UnicodeString&, USpoofCheckResult*, UErrorCode*)(missing)Draft
-ICU 58
utf8.h#define U8_LEAD3_T1_BITS(missing)Internal
+
uspoof.hvoid uspoof_closeCheckResult(USpoofCheckResult*)(missing)Draft
-ICU 58
utf8.h#define U8_LEAD4_T1_BITS(missing)Internal
+

(jump back to top)
-

Other existing drafts in ICU 58

+

Other existing drafts in ICU 60

- + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + + + +
FileAPIICU 57ICU 58FileAPIICU 59ICU 60
localpointer.hLocalArray<T>& icu::LocalArray< T >::moveFrom(LocalArray< T >&) U_NOEXCEPTDraft
ICU 56
casemap.hstatic int32_t icu::CaseMap::fold(uint32_t, const char16_t*, int32_t, char16_t*, int32_t, Edits*, UErrorCode&)Draft
ICU 59
localpointer.hLocalPointer<T>& icu::LocalPointer< T >::moveFrom(LocalPointer< T >&) U_NOEXCEPTDraft
ICU 56
casemap.hstatic int32_t icu::CaseMap::toLower(const char*, uint32_t, const char16_t*, int32_t, char16_t*, int32_t, Edits*, UErrorCode&)Draft
ICU 59
measfmt.hvoid icu::MeasureFormat::parseObject(const UnicodeString&, Formattable&, ParsePosition&)Draft
ICU 53
casemap.hstatic int32_t icu::CaseMap::toTitle(const char*, uint32_t, BreakIterator*, const char16_t*, int32_t, char16_t*, int32_t, Edits*, UErrorCode&)Draft
ICU 59
measunit.hstatic MeasureUnit* icu::MeasureUnit::createGallonImperial(UErrorCode&)Draft
ICU 57
casemap.hstatic int32_t icu::CaseMap::toUpper(const char*, uint32_t, const char16_t*, int32_t, char16_t*, int32_t, Edits*, UErrorCode&)Draft
ICU 59
measunit.hstatic MeasureUnit* icu::MeasureUnit::createMilePerGallonImperial(UErrorCode&)Draft
ICU 57
casemap.hstatic int32_t icu::CaseMap::utf8Fold(uint32_t, const char*, int32_t, char*, int32_t, Edits*, UErrorCode&)Draft
ICU 59
measunit.hstatic MeasureUnit* icu::MeasureUnit::createMilligramPerDeciliter(UErrorCode&)Draft
ICU 57
casemap.hstatic int32_t icu::CaseMap::utf8ToLower(const char*, uint32_t, const char*, int32_t, char*, int32_t, Edits*, UErrorCode&)Draft
ICU 59
measunit.hstatic MeasureUnit* icu::MeasureUnit::createMillimolePerLiter(UErrorCode&)Draft
ICU 57
casemap.hstatic int32_t icu::CaseMap::utf8ToTitle(const char*, uint32_t, BreakIterator*, const char*, int32_t, char*, int32_t, Edits*, UErrorCode&)Draft
ICU 59
measunit.hstatic MeasureUnit* icu::MeasureUnit::createPartPerMillion(UErrorCode&)Draft
ICU 57
casemap.hstatic int32_t icu::CaseMap::utf8ToUpper(const char*, uint32_t, const char*, int32_t, char*, int32_t, Edits*, UErrorCode&)Draft
ICU 59
reldatefmt.hUnicodeString& icu::RelativeDateTimeFormatter::format(double, URelativeDateTimeUnit, UnicodeString&, UErrorCode&)Draft
ICU 57
char16ptr.hchar16_t* icu::Char16Ptr::get()Draft
ICU 59
reldatefmt.hUnicodeString& icu::RelativeDateTimeFormatter::formatNumeric(double, URelativeDateTimeUnit, UnicodeString&, UErrorCode&)Draft
ICU 57
char16ptr.hconst char16_t* icu::ConstChar16Ptr::get()Draft
ICU 59
simpleformatter.hSimpleFormatter& icu::SimpleFormatter::operator=(const SimpleFormatter&)Draft
ICU 57
char16ptr.hicu::Char16Ptr::Char16Ptr(char16_t*)Draft
ICU 59
simpleformatter.hUBool icu::SimpleFormatter::applyPattern(const UnicodeString&, UErrorCode&)Draft
ICU 57
char16ptr.hicu::Char16Ptr::Char16Ptr(std::nullptr_t)Draft
ICU 59
simpleformatter.hUBool icu::SimpleFormatter::applyPatternMinMaxArguments(const UnicodeString&, int32_t, int32_t, UErrorCode&)Draft
ICU 57
char16ptr.hicu::Char16Ptr::Char16Ptr(uint16_t*)Draft
ICU 59
simpleformatter.hUnicodeString icu::SimpleFormatter::getTextWithNoArguments()Draft
ICU 57
char16ptr.hicu::Char16Ptr::Char16Ptr(wchar_t*)Draft
ICU 59
simpleformatter.hUnicodeString& icu::SimpleFormatter::format(const UnicodeString&, UnicodeString&, UErrorCode&)Draft
ICU 57
char16ptr.hicu::Char16Ptr::operator char16_t* ()Draft
ICU 59
simpleformatter.hUnicodeString& icu::SimpleFormatter::format(const UnicodeString&, const UnicodeString&, UnicodeString&, UErrorCode&)Draft
ICU 57
char16ptr.hicu::Char16Ptr::~Char16Ptr()Draft
ICU 59
simpleformatter.hUnicodeString& icu::SimpleFormatter::format(const UnicodeString&, const UnicodeString&, const UnicodeString&, UnicodeString&, UErrorCode&)Draft
ICU 57
char16ptr.hicu::ConstChar16Ptr::ConstChar16Ptr(const char16_t*)Draft
ICU 59
simpleformatter.hUnicodeString& icu::SimpleFormatter::formatAndAppend(const UnicodeString* const*, int32_t, UnicodeString&, int32_t*, int32_t, UErrorCode&)Draft
ICU 57
char16ptr.hicu::ConstChar16Ptr::ConstChar16Ptr(const std::nullptr_t)Draft
ICU 59
simpleformatter.hUnicodeString& icu::SimpleFormatter::formatAndReplace(const UnicodeString* const*, int32_t, UnicodeString&, int32_t*, int32_t, UErrorCode&)Draft
ICU 57
char16ptr.hicu::ConstChar16Ptr::ConstChar16Ptr(const uint16_t*)Draft
ICU 59
simpleformatter.hicu::SimpleFormatter::SimpleFormatter()Draft
ICU 57
char16ptr.hicu::ConstChar16Ptr::ConstChar16Ptr(const wchar_t*)Draft
ICU 59
simpleformatter.hicu::SimpleFormatter::SimpleFormatter(const SimpleFormatter&)Draft
ICU 57
char16ptr.hicu::ConstChar16Ptr::operator const char16_t* ()Draft
ICU 59
simpleformatter.hicu::SimpleFormatter::SimpleFormatter(const UnicodeString&, UErrorCode&)Draft
ICU 57
char16ptr.hicu::ConstChar16Ptr::~ConstChar16Ptr()Draft
ICU 59
simpleformatter.hicu::SimpleFormatter::SimpleFormatter(const UnicodeString&, int32_t, int32_t, UErrorCode&)Draft
ICU 57
edits.hIterator icu::Edits::getCoarseChangesIterator()Draft
ICU 59
simpleformatter.hicu::SimpleFormatter::~SimpleFormatter()Draft
ICU 57
edits.hIterator icu::Edits::getCoarseIterator()Draft
ICU 59
simpleformatter.hint32_t icu::SimpleFormatter::getArgumentLimit()Draft
ICU 57
edits.hIterator icu::Edits::getFineChangesIterator()Draft
ICU 59
uchar.henum UProperty::UCHAR_EMOJI_MODIFIER_BASEDraft
ICU 57
edits.hIterator icu::Edits::getFineIterator()Draft
ICU 59
uchar.henum UProperty::UCHAR_EMOJI_MODIFIERDraft
ICU 57
edits.hUBool icu::Edits::copyErrorTo(UErrorCode&)Draft
ICU 59
uchar.henum UProperty::UCHAR_EMOJI_PRESENTATIONDraft
ICU 57
edits.hUBool icu::Edits::hasChanges()Draft
ICU 59
uchar.henum UProperty::UCHAR_EMOJIDraft
ICU 57
edits.hicu::Edits::Edits()Draft
ICU 59
udat.henum UDateFormatField::UDAT_AM_PM_MIDNIGHT_NOON_FIELDDraft
ICU 57
edits.hicu::Edits::~Edits()Draft
ICU 59
unistr.hUnicodeString& icu::UnicodeString::moveFrom(UnicodeString&) U_NOEXCEPTDraft
ICU 56
edits.hint32_t icu::Edits::lengthDelta()Draft
ICU 59
uregex.henum URegexpFlag::UREGEX_CANON_EQDraft
ICU 2.4
edits.hvoid icu::Edits::addReplace(int32_t, int32_t)Draft
ICU 59
ureldatefmt.hURelativeDateTimeFormatter* ureldatefmt_open(const char*, UNumberFormat*, UDateRelativeDateTimeFormatterStyle, UDisplayContext, UErrorCode*)Draft
ICU 57
edits.hvoid icu::Edits::addUnchanged(int32_t)Draft
ICU 59
ureldatefmt.henum URelativeDateTimeUnit::UDAT_REL_UNIT_DAYDraft
ICU 57
edits.hvoid icu::Edits::reset()Draft
ICU 59
ureldatefmt.henum URelativeDateTimeUnit::UDAT_REL_UNIT_FRIDAYDraft
ICU 57
localpointer.hLocalArray<T>& icu::LocalArray< T >::moveFrom(LocalArray< T >&)Draft
ICU 56
ureldatefmt.henum URelativeDateTimeUnit::UDAT_REL_UNIT_HOURDraft
ICU 57
localpointer.hLocalPointer<T>& icu::LocalPointer< T >::moveFrom(LocalPointer< T >&)Draft
ICU 56
ureldatefmt.henum URelativeDateTimeUnit::UDAT_REL_UNIT_MINUTEDraft
ICU 57
measfmt.hvoid icu::MeasureFormat::parseObject(const UnicodeString&, Formattable&, ParsePosition&)Draft
ICU 53
ureldatefmt.henum URelativeDateTimeUnit::UDAT_REL_UNIT_MONDAYDraft
ICU 57
measunit.hstatic MeasureUnit* icu::MeasureUnit::createPoint(UErrorCode&)Draft
ICU 59
ureldatefmt.henum URelativeDateTimeUnit::UDAT_REL_UNIT_MONTHDraft
ICU 57
ubrk.hUBreakIterator* ubrk_openBinaryRules(const uint8_t*, int32_t, const UChar*, int32_t, UErrorCode*)Draft
ICU 59
ureldatefmt.henum URelativeDateTimeUnit::UDAT_REL_UNIT_QUARTERDraft
ICU 57
ubrk.hint32_t ubrk_getBinaryRules(UBreakIterator*, uint8_t*, int32_t, UErrorCode*)Draft
ICU 59
ureldatefmt.henum URelativeDateTimeUnit::UDAT_REL_UNIT_SATURDAYDraft
ICU 57
unistr.hUNISTR_FROM_STRING_EXPLICIT icu::UnicodeString::UnicodeString(const uint16_t*)Draft
ICU 59
ureldatefmt.henum URelativeDateTimeUnit::UDAT_REL_UNIT_SECONDDraft
ICU 57
unistr.hUNISTR_FROM_STRING_EXPLICIT icu::UnicodeString::UnicodeString(const wchar_t*)Draft
ICU 59
ureldatefmt.henum URelativeDateTimeUnit::UDAT_REL_UNIT_SUNDAYDraft
ICU 57
unistr.hUnicodeString& icu::UnicodeString::moveFrom(UnicodeString&)Draft
ICU 56
ureldatefmt.henum URelativeDateTimeUnit::UDAT_REL_UNIT_THURSDAYDraft
ICU 57
unistr.hicu::UnicodeString::UnicodeString(const std::nullptr_t)Draft
ICU 59
ureldatefmt.henum URelativeDateTimeUnit::UDAT_REL_UNIT_TUESDAYDraft
ICU 57
unistr.hicu::UnicodeString::UnicodeString(const std::nullptr_t, int32_t)Draft
ICU 59
ureldatefmt.henum URelativeDateTimeUnit::UDAT_REL_UNIT_WEDNESDAYDraft
ICU 57
unistr.hicu::UnicodeString::UnicodeString(const uint16_t*, int32_t)Draft
ICU 59
ureldatefmt.henum URelativeDateTimeUnit::UDAT_REL_UNIT_WEEKDraft
ICU 57
unistr.hicu::UnicodeString::UnicodeString(const wchar_t*, int32_t)Draft
ICU 59
ureldatefmt.henum URelativeDateTimeUnit::UDAT_REL_UNIT_YEARDraft
ICU 57
unistr.hicu::UnicodeString::UnicodeString(std::nullptr_t, int32_t, int32_t)Draft
ICU 59
ureldatefmt.hint32_t ureldatefmt_combineDateAndTime(const URelativeDateTimeFormatter*, const UChar*, int32_t, const UChar*, int32_t, UChar*, int32_t, UErrorCode*)Draft
ICU 57
unistr.hicu::UnicodeString::UnicodeString(uint16_t*, int32_t, int32_t)Draft
ICU 59
ureldatefmt.hint32_t ureldatefmt_format(const URelativeDateTimeFormatter*, double, URelativeDateTimeUnit, UChar*, int32_t, UErrorCode*)Draft
ICU 57
unistr.hicu::UnicodeString::UnicodeString(wchar_t*, int32_t, int32_t)Draft
ICU 59
ureldatefmt.hint32_t ureldatefmt_formatNumeric(const URelativeDateTimeFormatter*, double, URelativeDateTimeUnit, UChar*, int32_t, UErrorCode*)Draft
ICU 57
unum.hint32_t unum_formatDoubleForFields(const UNumberFormat*, double, UChar*, int32_t, UFieldPositionIterator*, UErrorCode*)Draft
ICU 59
ureldatefmt.hvoid ureldatefmt_close(URelativeDateTimeFormatter*)Draft
ICU 57
upluralrules.hUEnumeration* uplrules_getKeywords(const UPluralRules*, UErrorCode*)Draft
ICU 59
uregex.henum URegexpFlag::UREGEX_CANON_EQDraft
ICU 2.4
@@ -3191,13 +1335,12 @@ This section shows cases where the signature was "simplified" for the sake of comparison. The simplified form is in bold, followed by all possible variations in "original" form.
-

    (jump back to top)

    -Contents generated by StableAPI tool on Thu Sep 22 11:14:21 PDT 2016
    Copyright (C) 2016, International Business Machines Corporation, All Rights Reserved.
    +Contents generated by StableAPI tool on Wed Oct 04 23:55:39 UTC 2017
    Copyright (C) 2017, International Business Machines Corporation, All Rights Reserved.

    diff --git a/Build/source/libs/icu/icu-src/LICENSE b/Build/source/libs/icu/icu-src/LICENSE index 90be7cdf052..c84076cd072 100644 --- a/Build/source/libs/icu/icu-src/LICENSE +++ b/Build/source/libs/icu/icu-src/LICENSE @@ -1,6 +1,6 @@ COPYRIGHT AND PERMISSION NOTICE (ICU 58 and later) -Copyright © 1991-2016 Unicode, Inc. All rights reserved. +Copyright © 1991-2017 Unicode, Inc. All rights reserved. Distributed under the Terms of Use in http://www.unicode.org/copyright.html Permission is hereby granted, free of charge, to any person obtaining @@ -131,7 +131,7 @@ property of their respective owners. # ---------COPYING.libtabe ---- BEGIN-------------------- # # /* - # * Copyrighy (c) 1999 TaBE Project. + # * Copyright (c) 1999 TaBE Project. # * Copyright (c) 1999 Pai-Hsiang Hsiao. # * All rights reserved. # * diff --git a/Build/source/libs/icu/icu-src/license.html b/Build/source/libs/icu/icu-src/license.html index 25591ceef6a..24846726670 100644 --- a/Build/source/libs/icu/icu-src/license.html +++ b/Build/source/libs/icu/icu-src/license.html @@ -11,8 +11,8 @@ The ICU license is now in plain text format, see LICENSE. Update links and software appropriately.

    - Copyright (C) 2016 and later: Unicode, Inc. and others. License & terms of use: http://www.unicode.org/copyright.html - Copyright (c) 1995-2016 International Business Machines Corporation and others + © 2016 and later: Unicode, Inc. and others. License & terms of use: http://www.unicode.org/copyright.html + © 1995-2016 International Business Machines Corporation and others diff --git a/Build/source/libs/icu/icu-src/readme.html b/Build/source/libs/icu/icu-src/readme.html index 6327fed2d04..dfa5e3b8e94 100644 --- a/Build/source/libs/icu/icu-src/readme.html +++ b/Build/source/libs/icu/icu-src/readme.html @@ -3,7 +3,7 @@ - ReadMe for ICU 58.2 + ReadMe for ICU 60.2 @@ -44,12 +44,15 @@

    This is a release candidate version of ICU4C. It is not recommended for production use.

    -

    Last updated: 2016-Dec-8
    +

    Last updated: 2017-Dec-07
    Copyright © 2016 and later: Unicode, Inc. and others. License & terms of use: http://www.unicode.org/copyright.html
    Copyright © 1997-2016 International Business Machines Corporation and others. All Rights Reserved.

    + +

    This is a maintenance update of ICU 60, + with a small number of bug fixes but no API changes.


    Table of Contents

    @@ -59,9 +62,7 @@
  • Getting Started
  • -
  • What Is New In This release?
  • - -
  • Changes in recent previous releases
  • +
  • What Is New In This Release?
  • How To Download the Source Code
  • @@ -230,148 +231,24 @@

    Important: Please make sure you understand the Copyright and License Information.

    - -

    What is new in this - release?

    - -

    New License

    -

    This is the first release of ICU since the project - joined - the Unicode Consortium. The license has changed to the - Unicode license - (which is similar to the ICU 1.8.1-57 license).

    - -

    Layout Engine Removed

    -

    The LayoutEngine was deprecated in ICU 54 and has now been removed. - see the - User's Guide for more details and migration recommendations. -

    -

    - Note that the ParagraphLayout (layoutex) library is not deprecated. - There is a new option, --enable-layoutex which will build - the ParagraphLayout library using HarfBuzz - instead of ICU as the layout engine. See - the users' guide for more information about how to build. -

    -

    - The options --disable-layout - or --with-layout=false are being retained for - compatibility, but have no effect. -

    - -

    Changes in CLDR 30 data

    -
      -
    • For some combinations of numbering system (arab, arabext, latn) and/or locale - (ar, fa, he), there were changes to the bidirectional control characters used - with certain symbols (percent, minus, plus), and changes to number patterns - (currency and/or percent, including addition of bidirectional control - characters in some cases).
    • -
    • The bidirectional controls used for such purposes now include U+061C ARABIC - LETTER MARK (ALM), which requires use of the bidirectional algorithm from - Unicode 6.3 or later.
    • -
    • The time separator for Norwegian locales (nb, nn) was changed to be ‘:’ - throughout.
    • -
    • For more information on CLDR 30 changes, see - CLDR 30 download - page.
    • -
    + "http://source.icu-project.org/repos/icu/trunk/icu4c/LICENSE">Copyright and License Information.

    -

    Windows build changes

    -

    Windows builds using Visual Studio now require Visual Studio 2015; otherwise you can - use cygwin or similar to build for Windows.

    -

    API Changes

    -

    See the API Change Report for a complete - list of APIs added, removed, or changed in this release.

    +

    What Is New In This Release?

    - -

    Full release notes and the latest updates

    -

    The previous list concentrates on changes that affect existing - applications migrating from previous ICU releases. - For more news about this release, as well as late-breaking news, see the - ICU download page.

    +

    See the ICU 60 download page + for an overview of this release, important changes, new features, bug fixes, known issues, + changes to supported platforms and build environments, + and migration issues for existing applications migrating from previous ICU releases.

    -

    Upcoming changes

    -

    Please note the following changes planned for an upcoming ICU4C release (likely ICU 59):

    -
      -
    • Compiler support for C++11 will be required.
    • -
    • Support for Windows XP will be removed.
    • -
    +

    See the API Change Report for a complete list of + APIs added, removed, or changed in this release.

    -

    Changes in recent - previous releases

    +

    For + changes in previous releases, see the + main ICU download page + with its version-specific subpages.

    - -

    ICU 57: Changes related to new CLDR data and specifications

    -
      -
    • Time formats may include the new day period characters b, B, and - these may produced in response to the new skeleton character C used - with DateTimePatternGenerator.
    • -
    • In day period rules, the use of "after" has been deprecated.
    • -
    • The measurement unit "proportion-karat" has been renamed to - "concentr-karat".
    • -
    - - -

    ICU 56: COLON withdrawn as date/time pattern character

    -

    In ICU 55, COLON was introduced as a date/time pattern character - to be replaced by the value of the timeSeparator for the number - system being used; a corresponding new UDateFormatField - UDAT_TIME_SEPARATOR_FIELD was added. Use of COLON caused some - backwards compatibility problems, so it is being withdrawn as a - pattern character. However, UDAT_TIME_SEPARATOR_FIELD remains - as does the mechanism for replacing a pattern character with the - value of the timeSeparator; a new pattern character may be - assigned in the future.

    - -

    ICU 56: ICU Plugins are disabled by default

    -

    ICU Plugins are now disabled by default. They may be enabled - with the configure option - --enable-plugins or by means of - #define UCONFIG_ENABLE_PLUGINS. -

    - -

    ICU 55: Deprecations in PluralRules (plurrule.h)

    -

    The following PluralRules methods never had an implementation - but were inadvertently marked @stable; they have now been - deprecated. [#10759]

    -
      -
    • double icu::PluralRules::getUniqueKeywordValue(const UnicodeString&)
    • -
    • int32_t icu::PluralRules::getAllKeywordValues(const UnicodeString&, double*, int32_t, UErrorCode&)
    • -
    - -

    ICU 55: Deprecate uidna.h functions for IDNA2003 support

    -

    The IDNA2003 API has been deprecated; use the API for IDNA2008 / UTS #46 instead via - uidna_openUTS46() or class IDNA [#8477]. - This applies to the following:

    -
      -
    • enum value UIDNA_ALLOW_UNASSIGNED
    • -
    • uidna_IDNToASCII
    • -
    • uidna_IDNToUnicode
    • -
    • uidna_compare
    • -
    • uidna_toASCII
    • -
    • uidna_toUnicode
    • -
    - -

    ICU 54: Deprecation of Collation Short Strings

    -

    The collation short naming scheme and its API functions are deprecated. - Use ucol_open() with language tag collation keywords instead (see Collation API Details). For example, ucol_open("de-u-co-phonebk-ka-shifted", &errorCode) - for German Phonebook order with "ignore punctuation" mode.

    - -

    ICU 54: Deprecation of UCOL_TAILORINGS_VERSION

    -

    This was originally intended to be the version of collation tailorings, - but that information is actually in the tailorings data and this - constant has always been (and now will continue to be) 1.

    - - -

    ICU 53: Deprecation of TimeUnitFormat

    -

    The TimeUnitFormat and its methods were actually deprecated in ICU 53 and the - class as a whole was tagged as deprecated in that release, but the status tags for - the individual methods did not correctly indicate the deprecated status; they - do as of ICU 54. Use the MeasureFormat class and its methods instead.

    - -

    How To Download the Source Code

    @@ -505,12 +382,31 @@
  • brkitr/ Data files for character, word, sentence, title casing and line boundary analysis.
  • +
  • coll/ Data for collation tailorings. The makefile + colfiles.mk contains the list of resource bundle files.
  • +
  • locales/ These .txt files contain ICU language and culture-specific localization data. Two special bundles are root, which is the fallback data and parent of other bundles, and index, which contains a list of installed bundles. The makefile resfiles.mk contains the list of resource bundle - files.
  • + files. Some of the locale data is split out into the type-specific + directories curr, lang, region, unit, and zone, described below. + +
  • curr/ Locale data for currency symbols and names (including + plural forms), with its own makefile resfiles.mk.
  • + +
  • lang/ Locale data for names of languages, scripts, and locale + key names and values, with its own makefile resfiles.mk.
  • + +
  • region/ Locale data for names of regions, with its own + makefile resfiles.mk.
  • + +
  • unit/ Locale data for measurement unit patterns and names, + with its own makefile resfiles.mk.
  • + +
  • zone/ Locale data for time zone names, with its own + makefile resfiles.mk.
  • mappings/ Here are the code page converter tables. These .ucm files contain mappings to and from Unicode. These are compiled @@ -532,9 +428,9 @@ information.
  • misc/ The misc directory contains other data files which - did not fit into the above categories. Currently it only contains - time zone information, and a name preperation file for IDNA.
  • + did not fit into the above categories, including time zone + information, region-specific data, and other data derived from CLDR + supplemental data.
  • out/ This directory contains the assembled memory mapped files.
  • @@ -690,7 +586,7 @@ we recommend hardcoding ICU's default charset to UTF-8. This means that some implementation code becomes simpler and faster, and statically linked ICU libraries become smaller. - (See the U_CHARSET_IS_UTF8 + (See the U_CHARSET_IS_UTF8 API documentation for more details.)
    You can -DU_CHARSET_IS_UTF8=1 or modify unicode/utypes.h (in ICU 4.8 and below) @@ -737,6 +633,14 @@ (via -D or uconfig.h, as above) and include those header files explicitly that you actually need.
    Note: The ICU test suites cannot be compiled with this setting. +
  • utf_old.h: + All of utf_old.h is deprecated or obsolete.
    + Beginning with ICU 60, + you should define U_HIDE_OBSOLETE_UTF_OLD_H to 1 + (via -D or uconfig.h, as above). + Use of any of these macros should be replaced as noted + in the comments for the obsolete macro.
    + Note: The ICU test suites can be compiled with this setting.
  • .dat file: By default, the ICU data is built into a shared library (DLL). This is convenient because it requires no install-time or runtime configuration, @@ -779,7 +683,7 @@ source file tree clean and have build output files written to a different location. This is called an "out-of-source build". Simply invoke the configure script from the target location: -
    ~/icu$ svn export http://source.icu-project.org/repos/icu/icu/trunk
    +
    ~/icu$ svn export http://source.icu-project.org/repos/icu/trunk/icu4c
     ~/icu$ mkdir trunk-dev
     ~/icu$ cd trunk-dev
     ~/icu/trunk-dev$ ../trunk/source/runConfigureICU Linux
    @@ -851,7 +755,9 @@
         
    • Microsoft Windows
    • -
    • Microsoft Visual C++ (see the ICU download page for the currently compatible version)
    • +
    • Microsoft Visual C++ (part of Visual Studio) (see the ICU download page for the currently compatible version)
    • + +
    • Optional: A version of the Windows 10 SDK (if you want to build the UWP projects)

    Cygwin is required if using a version of MSVC other than the one compatible with the supplied project files or if other compilers are used to build ICU. (e.g. GCC)

    @@ -874,6 +780,11 @@ "#HowToBuildWindowsCommandLine">command line note below if you want to build from the command line instead.
  • +
  • You may need to re-target the UWP projects to the version of the SDK that you have installed. In Visual Studio you can + right-click on the UWP projects and select the option 'Retarget SDK Version'. Note: You do not need to have a copy of + the Windows 10 SDK installed in order to build the non-UWP projects in Visual Studio. If the SDK is not installed then the + UWP projects will simply not be loaded.
  • +
  • Set the active platform to "Win32" or "x64" (See Windows platform note below) and configuration to "Debug" or "Release" (See Windows configuration note below).
  • @@ -932,9 +843,11 @@ "HowToBuildWindowsCommandLine">Using MSDEV At The Command Line Note: You can build ICU from the command line. Assuming that you have properly installed Microsoft Visual C++ to support command line - execution, you can run the following command, 'devenv.com - <ICU>\source\allinone\allinone.sln /build "Win32|Release"'. You can also - use Cygwin with this compiler to build ICU, and you can refer to the 'devenv.com <ICU>\source\allinone\allinone.sln /build "Release|Win32"'. + Or to build the 64-bit Release version from the command line: + 'devenv.com <ICU>\source\allinone\allinone.sln /build "Release|x64"'. +
    You can also use Cygwin with this compiler to build ICU, and you can refer to the
    How To Build And Install On Windows with Cygwin section for more details.

    @@ -981,7 +894,7 @@
    • Microsoft Windows
    • -
    • Microsoft Visual C++ (when gcc isn't used).
    • +
    • Microsoft Visual C++ (from Visual Studio 2015 or newer, when gcc isn't used).
    • Cygwin with the following installed: @@ -1016,11 +929,11 @@ Visual C++ compiler will not work with a bash command prompt.
    • If the computer isn't set up to use Visual C++ from the command line, - you need to run vcvars32.bat.
      For example:
      "C:\Program Files\Microsoft - Visual Studio 8\VC\bin\vcvars32.bat" can be used for 32-bit builds - or
      "C:\Program Files (x86)\Microsoft Visual Studio - 8\VC\bin\amd64\vcvarsamd64.bat" can be used for 64-bit builds on - Windows x64.
    • + you need to run vcvars32.bat.
      For example:
      + "C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\bin\vcvars32.bat" + can be used for 32-bit builds or
      + "C:\Program Files (x86)\Microsoft Visual Studio 14\VC\bin\x86_amd64\vcvarsx86_amd64.bat" + can be used for 64-bit builds on Windows x64.
    • Unzip the icu-XXXX.zip file into any convenient location. Using command line zip, type "unzip -a icu-XXXX.zip -d drive:\directory", or just use @@ -1229,9 +1142,9 @@ configure option.
    • The latest versions of z/OS use XPLINK + href="https://www.ibm.com/support/knowledgecenter/SSLTBW_2.2.0/com.ibm.zos.v2r2.cbcux01/oebind6.htm">XPLINK version (C128) of the C++ standard library by default. You may see an + href="https://www.ibm.com/support/knowledgecenter/SSLTBW_2.2.0/com.ibm.zos.v2r2.cbcux01/oebind5.htm">an error when running with XPLINK disabled. To avoid this error, set the following environment variable or similar: @@ -1405,7 +1318,7 @@ cd ../../..
    • Test ICU.
      gmake check
      (The QIBM_MULTI_THREADED=Y flag will be automatically applied to intltest - you can look at the + "https://www.ibm.com/support/knowledgecenter/ssw_ibm_i_73/rzahw/rzahwceeco.htm"> iSeries Information Center for more details regarding the running of multiple threads on IBM i.)
    • @@ -1657,7 +1570,7 @@ gnumake

      In order to avoid synchronization and threading issues, developers are suggested to strictly follow the compiling and linking guidelines for multithreaded applications, specified in the following - document from Sun Microsystems. Most notably, pay strict attention to the + SUn Solaris document available from Oracle. Most notably, pay strict attention to the following statements from Sun:

      @@ -1671,10 +1584,15 @@ gnumake

      Failure to do this may cause spurious lock conflicts, recursive mutex failure, and deadlock.

      -

      Source: "Solaris Multithreaded Programming Guide, Compiling and - Debugging", Sun Microsystems, Inc., Apr 2004
      +

      Source: "Multithreaded Programming Guide, Compiling and + Debugging", Sun Microsystems, 2002
      + https://docs.oracle.com/cd/E19683-01/806-6867/compile-74765/index.html

      + +

      Note, a version of that chapter from a 2008 document update covering both Solaris 9 + and Solaris 10 is available here:
      http://docs.sun.com/app/docs/doc/816-5137/6mba5vpke?a=view

      + "http://docs.oracle.com/cd/E19253-01/816-5137/compile-94179/index.html">http://docs.oracle.com/cd/E19253-01/816-5137/compile-94179/index.html

      Windows Platform

      diff --git a/Build/source/libs/icu/icu-src/source/Doxyfile.in b/Build/source/libs/icu/icu-src/source/Doxyfile.in index fde612523db..8c6c5deb220 100644 --- a/Build/source/libs/icu/icu-src/source/Doxyfile.in +++ b/Build/source/libs/icu/icu-src/source/Doxyfile.in @@ -194,7 +194,7 @@ EXPAND_ONLY_PREDEF = YES SEARCH_INCLUDES = YES INCLUDE_PATH = INCLUDE_FILE_PATTERNS = -PREDEFINED = U_EXPORT2= U_STABLE= U_DRAFT= U_INTERNAL= U_SYSTEM= U_DEPRECATED= U_OBSOLETE= U_CALLCONV= U_CDECL_BEGIN= U_CDECL_END= U_NO_THROW=\ "U_NAMESPACE_BEGIN=namespace icu{" "U_NAMESPACE_END=}" U_HAVE_STD_STRING=1 U_SHOW_CPLUSPLUS_API=1 U_DEFINE_LOCAL_OPEN_POINTER()= U_IN_DOXYGEN=1 U_OVERRIDE= U_FINAL= UCONFIG_ENABLE_PLUGINS=1 +PREDEFINED = U_EXPORT2= U_STABLE= U_DRAFT= U_INTERNAL= U_SYSTEM= U_DEPRECATED= U_OBSOLETE= U_CALLCONV_FPTR= U_CALLCONV= U_CDECL_BEGIN= U_CDECL_END= U_NO_THROW=\ "U_NAMESPACE_BEGIN=namespace icu{" "U_NAMESPACE_END=}" U_SHOW_CPLUSPLUS_API=1 U_DEFINE_LOCAL_OPEN_POINTER()= U_IN_DOXYGEN=1 U_OVERRIDE= U_FINAL=final UCONFIG_ENABLE_PLUGINS=1 U_CHAR16_IS_TYPEDEF=0 U_CPLUSPLUS_VERSION=11 U_WCHAR_IS_UTF16 U_NOEXCEPT= EXPAND_AS_DEFINED = SKIP_FUNCTION_MACROS = YES #--------------------------------------------------------------------------- diff --git a/Build/source/libs/icu/icu-src/source/Makefile.in b/Build/source/libs/icu/icu-src/source/Makefile.in index bd5b117cb7d..c1db15bf7b1 100644 --- a/Build/source/libs/icu/icu-src/source/Makefile.in +++ b/Build/source/libs/icu/icu-src/source/Makefile.in @@ -34,9 +34,11 @@ subdir = . @LAYOUTEX_TRUE@LAYOUTEX = layoutex @ICUIO_TRUE@ICUIO = io @EXTRAS_TRUE@EXTRA = extra -@TESTS_TRUE@TEST = test +# need tools for tests +@TOOLS_TRUE@@TESTS_TRUE@TEST = test @SAMPLES_TRUE@SAMPLE = samples @TOOLS_TRUE@TOOLS = tools +@TOOLS_TRUE@DATASUBDIR = data ## pkgconfig setup. Always have uc and i18n. Others are optional. ALL_PKGCONFIG_SUFFIX=uc i18n @@ -58,7 +60,7 @@ INSTALLED_BUILT_FILES = $(top_builddir)/config/Makefile.inc $(top_builddir)/conf LOCAL_BUILT_FILES = icudefs.mk config/icucross.mk config/icucross.inc DOCDIRS = common i18n -SUBDIRS = stubdata common i18n $(LAYOUTEX) $(ICUIO) $(TOOLS) data $(EXTRA) $(SAMPLE) $(TEST) +SUBDIRS = stubdata common i18n $(LAYOUTEX) $(ICUIO) $(TOOLS) $(DATASUBDIR) $(EXTRA) $(SAMPLE) $(TEST) SECTION = 1 @@ -85,7 +87,7 @@ all: all-local all-recursive install: install-recursive install-local clean: clean-recursive-with-twist clean-local distclean : distclean-recursive distclean-local -dist: dist-recursive dist-local +dist: dist-recursive check: all check-recursive check-recursive: all xcheck: all xcheck-recursive @@ -140,6 +142,10 @@ $(LIBDIR) $(BINDIR): ## Recursive targets all-recursive install-recursive clean-recursive distclean-recursive dist-recursive check-recursive check-exhaustive-recursive: $(LIBDIR) $(BINDIR) +ifneq ($(NEED_ESCAPING),) + @echo "building tools/escapesrc (Needed for this platform with NEED_ESCAPING)" + @(cd tools/escapesrc && $(MAKE) RECURSIVE=YES $$local_target) || exit +endif @dot_seen=no; \ target=`echo $@ | sed s/-recursive//`; \ list='$(LOCAL_SUBDIRS)'; for subdir in $$list; do \ @@ -323,9 +329,10 @@ $(top_builddir)/config/icu-config: $(top_builddir)/Makefile $(top_srcdir)/config -$(RMV) $@ $(INSTALL_SCRIPT) $(top_srcdir)/config/icu-config-top $@ chmod u+w $@ + @echo "# Following from icu/icu4c/source/config/Makefile.inc" >> $@ + LC_ALL=C $(SED) -f $(top_srcdir)/config/make2sh.sed < $(top_builddir)/config/Makefile.inc | grep -v '#M#' | uniq >> $@ @echo "# Following from @platform_make_fragment@" >> $@ - LC_ALL=C sed -f $(top_srcdir)/config/make2sh.sed < $(top_builddir)/config/Makefile.inc | grep -v '#M#' | uniq >> $@ - LC_ALL=C sed -f $(top_srcdir)/config/make2sh.sed < @platform_make_fragment@ | grep -v '#M#' | uniq >> $@ + LC_ALL=C $(SED) -f $(top_srcdir)/config/make2sh.sed < @platform_make_fragment@ | grep -v '#M#' | uniq >> $@ cat $(top_srcdir)/config/icu-config-bottom >> $@ chmod u-w $@ diff --git a/Build/source/libs/icu/icu-src/source/allinone/allinone.sln b/Build/source/libs/icu/icu-src/source/allinone/allinone.sln index fdaaea9c681..88a0d19744f 100644 --- a/Build/source/libs/icu/icu-src/source/allinone/allinone.sln +++ b/Build/source/libs/icu/icu-src/source/allinone/allinone.sln @@ -1,5 +1,7 @@ -Microsoft Visual Studio Solution File, Format Version 11.00 -# Visual Studio 2010 +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio 14 +VisualStudioVersion = 14.0.25420.1 +MinimumVisualStudioVersion = 10.0.40219.1 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "cal", "..\samples\cal\cal.vcxproj", "{F7659D77-09CF-4FE9-ACEE-927287AA9509}" EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "cintltst", "..\test\cintltst\cintltst.vcxproj", "{3D1246AE-1B32-479B-BECA-AEFA97BE2321}" @@ -61,268 +63,354 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "icuinfo", "..\tools\icuinfo EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "testplug", "..\tools\icuinfo\testplug.vcxproj", "{659D0C08-D4ED-4BF3-B02B-2D8D4B5A7A7A}" EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "makedata_uwp", "..\data\makedata_uwp.vcxproj", "{B1D53358-37BD-48BC-B27C-68BAF1E78508}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "i18n_uwp", "..\i18n\i18n_uwp.vcxproj", "{6786C051-383B-47E0-9E82-B8B994E06A25}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "common_uwp", "..\common\common_uwp.vcxproj", "{C10CF34B-3F79-430E-AD38-5A32DC0589C2}" +EndProject Global - GlobalSection(SubversionScc) = preSolution - Svn-Managed = True - Manager = AnkhSVN - Subversion Support for Visual Studio - EndGlobalSection GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|ARM = Debug|ARM Debug|Win32 = Debug|Win32 Debug|x64 = Debug|x64 + Release|ARM = Release|ARM Release|Win32 = Release|Win32 Release|x64 = Release|x64 EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution + {F7659D77-09CF-4FE9-ACEE-927287AA9509}.Debug|ARM.ActiveCfg = Debug|Win32 {F7659D77-09CF-4FE9-ACEE-927287AA9509}.Debug|Win32.ActiveCfg = Debug|Win32 {F7659D77-09CF-4FE9-ACEE-927287AA9509}.Debug|Win32.Build.0 = Debug|Win32 {F7659D77-09CF-4FE9-ACEE-927287AA9509}.Debug|x64.ActiveCfg = Debug|x64 {F7659D77-09CF-4FE9-ACEE-927287AA9509}.Debug|x64.Build.0 = Debug|x64 + {F7659D77-09CF-4FE9-ACEE-927287AA9509}.Release|ARM.ActiveCfg = Release|Win32 {F7659D77-09CF-4FE9-ACEE-927287AA9509}.Release|Win32.ActiveCfg = Release|Win32 {F7659D77-09CF-4FE9-ACEE-927287AA9509}.Release|Win32.Build.0 = Release|Win32 {F7659D77-09CF-4FE9-ACEE-927287AA9509}.Release|x64.ActiveCfg = Release|x64 {F7659D77-09CF-4FE9-ACEE-927287AA9509}.Release|x64.Build.0 = Release|x64 + {3D1246AE-1B32-479B-BECA-AEFA97BE2321}.Debug|ARM.ActiveCfg = Debug|Win32 {3D1246AE-1B32-479B-BECA-AEFA97BE2321}.Debug|Win32.ActiveCfg = Debug|Win32 {3D1246AE-1B32-479B-BECA-AEFA97BE2321}.Debug|Win32.Build.0 = Debug|Win32 {3D1246AE-1B32-479B-BECA-AEFA97BE2321}.Debug|x64.ActiveCfg = Debug|x64 {3D1246AE-1B32-479B-BECA-AEFA97BE2321}.Debug|x64.Build.0 = Debug|x64 + {3D1246AE-1B32-479B-BECA-AEFA97BE2321}.Release|ARM.ActiveCfg = Release|Win32 {3D1246AE-1B32-479B-BECA-AEFA97BE2321}.Release|Win32.ActiveCfg = Release|Win32 {3D1246AE-1B32-479B-BECA-AEFA97BE2321}.Release|Win32.Build.0 = Release|Win32 {3D1246AE-1B32-479B-BECA-AEFA97BE2321}.Release|x64.ActiveCfg = Release|x64 {3D1246AE-1B32-479B-BECA-AEFA97BE2321}.Release|x64.Build.0 = Release|x64 + {73C0A65B-D1F2-4DE1-B3A6-15DAD2C23F3D}.Debug|ARM.ActiveCfg = Debug|Win32 {73C0A65B-D1F2-4DE1-B3A6-15DAD2C23F3D}.Debug|Win32.ActiveCfg = Debug|Win32 {73C0A65B-D1F2-4DE1-B3A6-15DAD2C23F3D}.Debug|Win32.Build.0 = Debug|Win32 {73C0A65B-D1F2-4DE1-B3A6-15DAD2C23F3D}.Debug|x64.ActiveCfg = Debug|x64 {73C0A65B-D1F2-4DE1-B3A6-15DAD2C23F3D}.Debug|x64.Build.0 = Debug|x64 + {73C0A65B-D1F2-4DE1-B3A6-15DAD2C23F3D}.Release|ARM.ActiveCfg = Release|Win32 {73C0A65B-D1F2-4DE1-B3A6-15DAD2C23F3D}.Release|Win32.ActiveCfg = Release|Win32 {73C0A65B-D1F2-4DE1-B3A6-15DAD2C23F3D}.Release|Win32.Build.0 = Release|Win32 {73C0A65B-D1F2-4DE1-B3A6-15DAD2C23F3D}.Release|x64.ActiveCfg = Release|x64 {73C0A65B-D1F2-4DE1-B3A6-15DAD2C23F3D}.Release|x64.Build.0 = Release|x64 + {ECA6B435-B4FA-4F9F-BF95-F451D078FC47}.Debug|ARM.ActiveCfg = Debug|Win32 {ECA6B435-B4FA-4F9F-BF95-F451D078FC47}.Debug|Win32.ActiveCfg = Debug|Win32 {ECA6B435-B4FA-4F9F-BF95-F451D078FC47}.Debug|Win32.Build.0 = Debug|Win32 {ECA6B435-B4FA-4F9F-BF95-F451D078FC47}.Debug|x64.ActiveCfg = Debug|x64 {ECA6B435-B4FA-4F9F-BF95-F451D078FC47}.Debug|x64.Build.0 = Debug|x64 + {ECA6B435-B4FA-4F9F-BF95-F451D078FC47}.Release|ARM.ActiveCfg = Release|Win32 {ECA6B435-B4FA-4F9F-BF95-F451D078FC47}.Release|Win32.ActiveCfg = Release|Win32 {ECA6B435-B4FA-4F9F-BF95-F451D078FC47}.Release|Win32.Build.0 = Release|Win32 {ECA6B435-B4FA-4F9F-BF95-F451D078FC47}.Release|x64.ActiveCfg = Release|x64 {ECA6B435-B4FA-4F9F-BF95-F451D078FC47}.Release|x64.Build.0 = Release|x64 + {38B5751A-C6F9-4409-950C-F4F9DA17275F}.Debug|ARM.ActiveCfg = Debug|Win32 {38B5751A-C6F9-4409-950C-F4F9DA17275F}.Debug|Win32.ActiveCfg = Debug|Win32 {38B5751A-C6F9-4409-950C-F4F9DA17275F}.Debug|Win32.Build.0 = Debug|Win32 {38B5751A-C6F9-4409-950C-F4F9DA17275F}.Debug|x64.ActiveCfg = Debug|x64 {38B5751A-C6F9-4409-950C-F4F9DA17275F}.Debug|x64.Build.0 = Debug|x64 + {38B5751A-C6F9-4409-950C-F4F9DA17275F}.Release|ARM.ActiveCfg = Release|Win32 {38B5751A-C6F9-4409-950C-F4F9DA17275F}.Release|Win32.ActiveCfg = Release|Win32 {38B5751A-C6F9-4409-950C-F4F9DA17275F}.Release|Win32.Build.0 = Release|Win32 {38B5751A-C6F9-4409-950C-F4F9DA17275F}.Release|x64.ActiveCfg = Release|x64 {38B5751A-C6F9-4409-950C-F4F9DA17275F}.Release|x64.Build.0 = Release|x64 + {D3065ADB-8820-4CC7-9B6C-9510833961A3}.Debug|ARM.ActiveCfg = Debug|Win32 {D3065ADB-8820-4CC7-9B6C-9510833961A3}.Debug|Win32.ActiveCfg = Debug|Win32 {D3065ADB-8820-4CC7-9B6C-9510833961A3}.Debug|Win32.Build.0 = Debug|Win32 {D3065ADB-8820-4CC7-9B6C-9510833961A3}.Debug|x64.ActiveCfg = Debug|x64 {D3065ADB-8820-4CC7-9B6C-9510833961A3}.Debug|x64.Build.0 = Debug|x64 + {D3065ADB-8820-4CC7-9B6C-9510833961A3}.Release|ARM.ActiveCfg = Release|Win32 {D3065ADB-8820-4CC7-9B6C-9510833961A3}.Release|Win32.ActiveCfg = Release|Win32 {D3065ADB-8820-4CC7-9B6C-9510833961A3}.Release|Win32.Build.0 = Release|Win32 {D3065ADB-8820-4CC7-9B6C-9510833961A3}.Release|x64.ActiveCfg = Release|x64 {D3065ADB-8820-4CC7-9B6C-9510833961A3}.Release|x64.Build.0 = Release|x64 + {C2BE5000-7501-4E87-9724-B8D82494FAE6}.Debug|ARM.ActiveCfg = Debug|Win32 {C2BE5000-7501-4E87-9724-B8D82494FAE6}.Debug|Win32.ActiveCfg = Debug|Win32 {C2BE5000-7501-4E87-9724-B8D82494FAE6}.Debug|Win32.Build.0 = Debug|Win32 {C2BE5000-7501-4E87-9724-B8D82494FAE6}.Debug|x64.ActiveCfg = Debug|x64 {C2BE5000-7501-4E87-9724-B8D82494FAE6}.Debug|x64.Build.0 = Debug|x64 + {C2BE5000-7501-4E87-9724-B8D82494FAE6}.Release|ARM.ActiveCfg = Release|Win32 {C2BE5000-7501-4E87-9724-B8D82494FAE6}.Release|Win32.ActiveCfg = Release|Win32 {C2BE5000-7501-4E87-9724-B8D82494FAE6}.Release|Win32.Build.0 = Release|Win32 {C2BE5000-7501-4E87-9724-B8D82494FAE6}.Release|x64.ActiveCfg = Release|x64 {C2BE5000-7501-4E87-9724-B8D82494FAE6}.Release|x64.Build.0 = Release|x64 + {FDD3C4F2-9805-44EB-9A77-BC1C1C95B547}.Debug|ARM.ActiveCfg = Debug|Win32 {FDD3C4F2-9805-44EB-9A77-BC1C1C95B547}.Debug|Win32.ActiveCfg = Debug|Win32 {FDD3C4F2-9805-44EB-9A77-BC1C1C95B547}.Debug|Win32.Build.0 = Debug|Win32 {FDD3C4F2-9805-44EB-9A77-BC1C1C95B547}.Debug|x64.ActiveCfg = Debug|x64 {FDD3C4F2-9805-44EB-9A77-BC1C1C95B547}.Debug|x64.Build.0 = Debug|x64 + {FDD3C4F2-9805-44EB-9A77-BC1C1C95B547}.Release|ARM.ActiveCfg = Release|Win32 {FDD3C4F2-9805-44EB-9A77-BC1C1C95B547}.Release|Win32.ActiveCfg = Release|Win32 {FDD3C4F2-9805-44EB-9A77-BC1C1C95B547}.Release|Win32.Build.0 = Release|Win32 {FDD3C4F2-9805-44EB-9A77-BC1C1C95B547}.Release|x64.ActiveCfg = Release|x64 {FDD3C4F2-9805-44EB-9A77-BC1C1C95B547}.Release|x64.Build.0 = Release|x64 + {A8D36F8D-09E6-4174-91C3-7BEAA9C3F04F}.Debug|ARM.ActiveCfg = Debug|Win32 {A8D36F8D-09E6-4174-91C3-7BEAA9C3F04F}.Debug|Win32.ActiveCfg = Debug|Win32 {A8D36F8D-09E6-4174-91C3-7BEAA9C3F04F}.Debug|Win32.Build.0 = Debug|Win32 {A8D36F8D-09E6-4174-91C3-7BEAA9C3F04F}.Debug|x64.ActiveCfg = Debug|x64 {A8D36F8D-09E6-4174-91C3-7BEAA9C3F04F}.Debug|x64.Build.0 = Debug|x64 + {A8D36F8D-09E6-4174-91C3-7BEAA9C3F04F}.Release|ARM.ActiveCfg = Release|Win32 {A8D36F8D-09E6-4174-91C3-7BEAA9C3F04F}.Release|Win32.ActiveCfg = Release|Win32 {A8D36F8D-09E6-4174-91C3-7BEAA9C3F04F}.Release|Win32.Build.0 = Release|Win32 {A8D36F8D-09E6-4174-91C3-7BEAA9C3F04F}.Release|x64.ActiveCfg = Release|x64 {A8D36F8D-09E6-4174-91C3-7BEAA9C3F04F}.Release|x64.Build.0 = Release|x64 + {8B41752B-5A52-41E4-B7E0-07921C0CC6BF}.Debug|ARM.ActiveCfg = Debug|Win32 {8B41752B-5A52-41E4-B7E0-07921C0CC6BF}.Debug|Win32.ActiveCfg = Debug|Win32 {8B41752B-5A52-41E4-B7E0-07921C0CC6BF}.Debug|Win32.Build.0 = Debug|Win32 {8B41752B-5A52-41E4-B7E0-07921C0CC6BF}.Debug|x64.ActiveCfg = Debug|x64 {8B41752B-5A52-41E4-B7E0-07921C0CC6BF}.Debug|x64.Build.0 = Debug|x64 + {8B41752B-5A52-41E4-B7E0-07921C0CC6BF}.Release|ARM.ActiveCfg = Release|Win32 {8B41752B-5A52-41E4-B7E0-07921C0CC6BF}.Release|Win32.ActiveCfg = Release|Win32 {8B41752B-5A52-41E4-B7E0-07921C0CC6BF}.Release|Win32.Build.0 = Release|Win32 {8B41752B-5A52-41E4-B7E0-07921C0CC6BF}.Release|x64.ActiveCfg = Release|x64 {8B41752B-5A52-41E4-B7E0-07921C0CC6BF}.Release|x64.Build.0 = Release|x64 + {97521D06-EC47-45D4-8BD0-9E16B3F93B2A}.Debug|ARM.ActiveCfg = Debug|Win32 {97521D06-EC47-45D4-8BD0-9E16B3F93B2A}.Debug|Win32.ActiveCfg = Debug|Win32 {97521D06-EC47-45D4-8BD0-9E16B3F93B2A}.Debug|Win32.Build.0 = Debug|Win32 {97521D06-EC47-45D4-8BD0-9E16B3F93B2A}.Debug|x64.ActiveCfg = Debug|x64 {97521D06-EC47-45D4-8BD0-9E16B3F93B2A}.Debug|x64.Build.0 = Debug|x64 + {97521D06-EC47-45D4-8BD0-9E16B3F93B2A}.Release|ARM.ActiveCfg = Release|Win32 {97521D06-EC47-45D4-8BD0-9E16B3F93B2A}.Release|Win32.ActiveCfg = Release|Win32 {97521D06-EC47-45D4-8BD0-9E16B3F93B2A}.Release|Win32.Build.0 = Release|Win32 {97521D06-EC47-45D4-8BD0-9E16B3F93B2A}.Release|x64.ActiveCfg = Release|x64 {97521D06-EC47-45D4-8BD0-9E16B3F93B2A}.Release|x64.Build.0 = Release|x64 + {77C78066-746F-4EA6-B3FE-B8C8A4A97891}.Debug|ARM.ActiveCfg = Debug|Win32 {77C78066-746F-4EA6-B3FE-B8C8A4A97891}.Debug|Win32.ActiveCfg = Debug|Win32 {77C78066-746F-4EA6-B3FE-B8C8A4A97891}.Debug|Win32.Build.0 = Debug|Win32 {77C78066-746F-4EA6-B3FE-B8C8A4A97891}.Debug|x64.ActiveCfg = Debug|x64 {77C78066-746F-4EA6-B3FE-B8C8A4A97891}.Debug|x64.Build.0 = Debug|x64 + {77C78066-746F-4EA6-B3FE-B8C8A4A97891}.Release|ARM.ActiveCfg = Release|Win32 {77C78066-746F-4EA6-B3FE-B8C8A4A97891}.Release|Win32.ActiveCfg = Release|Win32 {77C78066-746F-4EA6-B3FE-B8C8A4A97891}.Release|Win32.Build.0 = Release|Win32 {77C78066-746F-4EA6-B3FE-B8C8A4A97891}.Release|x64.ActiveCfg = Release|x64 {77C78066-746F-4EA6-B3FE-B8C8A4A97891}.Release|x64.Build.0 = Release|x64 + {0178B127-6269-407D-B112-93877BB62776}.Debug|ARM.ActiveCfg = Debug|Win32 {0178B127-6269-407D-B112-93877BB62776}.Debug|Win32.ActiveCfg = Debug|Win32 {0178B127-6269-407D-B112-93877BB62776}.Debug|Win32.Build.0 = Debug|Win32 {0178B127-6269-407D-B112-93877BB62776}.Debug|x64.ActiveCfg = Debug|x64 {0178B127-6269-407D-B112-93877BB62776}.Debug|x64.Build.0 = Debug|x64 + {0178B127-6269-407D-B112-93877BB62776}.Release|ARM.ActiveCfg = Release|Win32 {0178B127-6269-407D-B112-93877BB62776}.Release|Win32.ActiveCfg = Release|Win32 {0178B127-6269-407D-B112-93877BB62776}.Release|Win32.Build.0 = Release|Win32 {0178B127-6269-407D-B112-93877BB62776}.Release|x64.ActiveCfg = Release|x64 {0178B127-6269-407D-B112-93877BB62776}.Release|x64.Build.0 = Release|x64 + {73632960-B3A6-464D-83A3-4B43365F19B8}.Debug|ARM.ActiveCfg = Debug|Win32 {73632960-B3A6-464D-83A3-4B43365F19B8}.Debug|Win32.ActiveCfg = Debug|Win32 {73632960-B3A6-464D-83A3-4B43365F19B8}.Debug|Win32.Build.0 = Debug|Win32 {73632960-B3A6-464D-83A3-4B43365F19B8}.Debug|x64.ActiveCfg = Debug|x64 {73632960-B3A6-464D-83A3-4B43365F19B8}.Debug|x64.Build.0 = Debug|x64 + {73632960-B3A6-464D-83A3-4B43365F19B8}.Release|ARM.ActiveCfg = Release|Win32 {73632960-B3A6-464D-83A3-4B43365F19B8}.Release|Win32.ActiveCfg = Release|Win32 {73632960-B3A6-464D-83A3-4B43365F19B8}.Release|Win32.Build.0 = Release|Win32 {73632960-B3A6-464D-83A3-4B43365F19B8}.Release|x64.ActiveCfg = Release|x64 {73632960-B3A6-464D-83A3-4B43365F19B8}.Release|x64.Build.0 = Release|x64 - {C920062A-0647-4553-A3B2-37C58065664B}.Debug|Win32.ActiveCfg = Debug|Win32 - {C920062A-0647-4553-A3B2-37C58065664B}.Debug|Win32.Build.0 = Debug|Win32 - {C920062A-0647-4553-A3B2-37C58065664B}.Debug|x64.ActiveCfg = Debug|x64 - {C920062A-0647-4553-A3B2-37C58065664B}.Debug|x64.Build.0 = Debug|x64 - {C920062A-0647-4553-A3B2-37C58065664B}.Release|Win32.ActiveCfg = Release|Win32 - {C920062A-0647-4553-A3B2-37C58065664B}.Release|Win32.Build.0 = Release|Win32 - {C920062A-0647-4553-A3B2-37C58065664B}.Release|x64.ActiveCfg = Release|x64 - {C920062A-0647-4553-A3B2-37C58065664B}.Release|x64.Build.0 = Release|x64 - {37FC2C7F-1904-4811-8955-2F478830EAD1}.Debug|Win32.ActiveCfg = Debug|Win32 - {37FC2C7F-1904-4811-8955-2F478830EAD1}.Debug|Win32.Build.0 = Debug|Win32 - {37FC2C7F-1904-4811-8955-2F478830EAD1}.Debug|x64.ActiveCfg = Debug|x64 - {37FC2C7F-1904-4811-8955-2F478830EAD1}.Debug|x64.Build.0 = Debug|x64 - {37FC2C7F-1904-4811-8955-2F478830EAD1}.Release|Win32.ActiveCfg = Release|Win32 - {37FC2C7F-1904-4811-8955-2F478830EAD1}.Release|Win32.Build.0 = Release|Win32 - {37FC2C7F-1904-4811-8955-2F478830EAD1}.Release|x64.ActiveCfg = Release|x64 - {37FC2C7F-1904-4811-8955-2F478830EAD1}.Release|x64.Build.0 = Release|x64 + {F5AD9738-1A3D-4906-B9C4-A7D9CE33DC2C}.Debug|ARM.ActiveCfg = Debug|Win32 {F5AD9738-1A3D-4906-B9C4-A7D9CE33DC2C}.Debug|Win32.ActiveCfg = Debug|Win32 {F5AD9738-1A3D-4906-B9C4-A7D9CE33DC2C}.Debug|Win32.Build.0 = Debug|Win32 {F5AD9738-1A3D-4906-B9C4-A7D9CE33DC2C}.Debug|x64.ActiveCfg = Debug|x64 {F5AD9738-1A3D-4906-B9C4-A7D9CE33DC2C}.Debug|x64.Build.0 = Debug|x64 + {F5AD9738-1A3D-4906-B9C4-A7D9CE33DC2C}.Release|ARM.ActiveCfg = Release|Win32 {F5AD9738-1A3D-4906-B9C4-A7D9CE33DC2C}.Release|Win32.ActiveCfg = Release|Win32 {F5AD9738-1A3D-4906-B9C4-A7D9CE33DC2C}.Release|Win32.Build.0 = Release|Win32 {F5AD9738-1A3D-4906-B9C4-A7D9CE33DC2C}.Release|x64.ActiveCfg = Release|x64 {F5AD9738-1A3D-4906-B9C4-A7D9CE33DC2C}.Release|x64.Build.0 = Release|x64 + {D9DF7F2F-93B7-4810-B5CD-96F4F33C079B}.Debug|ARM.ActiveCfg = Debug|Win32 {D9DF7F2F-93B7-4810-B5CD-96F4F33C079B}.Debug|Win32.ActiveCfg = Debug|Win32 {D9DF7F2F-93B7-4810-B5CD-96F4F33C079B}.Debug|Win32.Build.0 = Debug|Win32 {D9DF7F2F-93B7-4810-B5CD-96F4F33C079B}.Debug|x64.ActiveCfg = Debug|x64 {D9DF7F2F-93B7-4810-B5CD-96F4F33C079B}.Debug|x64.Build.0 = Debug|x64 + {D9DF7F2F-93B7-4810-B5CD-96F4F33C079B}.Release|ARM.ActiveCfg = Release|Win32 {D9DF7F2F-93B7-4810-B5CD-96F4F33C079B}.Release|Win32.ActiveCfg = Release|Win32 {D9DF7F2F-93B7-4810-B5CD-96F4F33C079B}.Release|Win32.Build.0 = Release|Win32 {D9DF7F2F-93B7-4810-B5CD-96F4F33C079B}.Release|x64.ActiveCfg = Release|x64 {D9DF7F2F-93B7-4810-B5CD-96F4F33C079B}.Release|x64.Build.0 = Release|x64 + {4C8454FE-81D3-4CA3-9927-29BA96F03DAC}.Debug|ARM.ActiveCfg = Debug|Win32 {4C8454FE-81D3-4CA3-9927-29BA96F03DAC}.Debug|Win32.ActiveCfg = Debug|Win32 {4C8454FE-81D3-4CA3-9927-29BA96F03DAC}.Debug|Win32.Build.0 = Debug|Win32 {4C8454FE-81D3-4CA3-9927-29BA96F03DAC}.Debug|x64.ActiveCfg = Debug|x64 {4C8454FE-81D3-4CA3-9927-29BA96F03DAC}.Debug|x64.Build.0 = Debug|x64 + {4C8454FE-81D3-4CA3-9927-29BA96F03DAC}.Release|ARM.ActiveCfg = Release|Win32 {4C8454FE-81D3-4CA3-9927-29BA96F03DAC}.Release|Win32.ActiveCfg = Release|Win32 {4C8454FE-81D3-4CA3-9927-29BA96F03DAC}.Release|Win32.Build.0 = Release|Win32 {4C8454FE-81D3-4CA3-9927-29BA96F03DAC}.Release|x64.ActiveCfg = Release|x64 {4C8454FE-81D3-4CA3-9927-29BA96F03DAC}.Release|x64.Build.0 = Release|x64 + {203EC78A-0531-43F0-A636-285439BDE025}.Debug|ARM.ActiveCfg = Debug|Win32 {203EC78A-0531-43F0-A636-285439BDE025}.Debug|Win32.ActiveCfg = Debug|Win32 {203EC78A-0531-43F0-A636-285439BDE025}.Debug|Win32.Build.0 = Debug|Win32 {203EC78A-0531-43F0-A636-285439BDE025}.Debug|x64.ActiveCfg = Debug|x64 {203EC78A-0531-43F0-A636-285439BDE025}.Debug|x64.Build.0 = Debug|x64 + {203EC78A-0531-43F0-A636-285439BDE025}.Release|ARM.ActiveCfg = Release|Win32 {203EC78A-0531-43F0-A636-285439BDE025}.Release|Win32.ActiveCfg = Release|Win32 {203EC78A-0531-43F0-A636-285439BDE025}.Release|Win32.Build.0 = Release|Win32 {203EC78A-0531-43F0-A636-285439BDE025}.Release|x64.ActiveCfg = Release|x64 {203EC78A-0531-43F0-A636-285439BDE025}.Release|x64.Build.0 = Release|x64 + {6B231032-3CB5-4EED-9210-810D666A23A0}.Debug|ARM.ActiveCfg = Debug|Win32 {6B231032-3CB5-4EED-9210-810D666A23A0}.Debug|Win32.ActiveCfg = Debug|Win32 {6B231032-3CB5-4EED-9210-810D666A23A0}.Debug|Win32.Build.0 = Debug|Win32 {6B231032-3CB5-4EED-9210-810D666A23A0}.Debug|x64.ActiveCfg = Debug|x64 {6B231032-3CB5-4EED-9210-810D666A23A0}.Debug|x64.Build.0 = Debug|x64 + {6B231032-3CB5-4EED-9210-810D666A23A0}.Release|ARM.ActiveCfg = Release|Win32 {6B231032-3CB5-4EED-9210-810D666A23A0}.Release|Win32.ActiveCfg = Release|Win32 {6B231032-3CB5-4EED-9210-810D666A23A0}.Release|Win32.Build.0 = Release|Win32 {6B231032-3CB5-4EED-9210-810D666A23A0}.Release|x64.ActiveCfg = Release|x64 {6B231032-3CB5-4EED-9210-810D666A23A0}.Release|x64.Build.0 = Release|x64 + {DBA4088D-F6F9-4F8F-8820-082A4765C16C}.Debug|ARM.ActiveCfg = Debug|Win32 {DBA4088D-F6F9-4F8F-8820-082A4765C16C}.Debug|Win32.ActiveCfg = Debug|Win32 {DBA4088D-F6F9-4F8F-8820-082A4765C16C}.Debug|Win32.Build.0 = Debug|Win32 {DBA4088D-F6F9-4F8F-8820-082A4765C16C}.Debug|x64.ActiveCfg = Debug|x64 {DBA4088D-F6F9-4F8F-8820-082A4765C16C}.Debug|x64.Build.0 = Debug|x64 + {DBA4088D-F6F9-4F8F-8820-082A4765C16C}.Release|ARM.ActiveCfg = Release|Win32 {DBA4088D-F6F9-4F8F-8820-082A4765C16C}.Release|Win32.ActiveCfg = Release|Win32 {DBA4088D-F6F9-4F8F-8820-082A4765C16C}.Release|Win32.Build.0 = Release|Win32 {DBA4088D-F6F9-4F8F-8820-082A4765C16C}.Release|x64.ActiveCfg = Release|x64 {DBA4088D-F6F9-4F8F-8820-082A4765C16C}.Release|x64.Build.0 = Release|x64 + {C2B04507-2521-4801-BF0D-5FD79D6D518C}.Debug|ARM.ActiveCfg = Debug|Win32 {C2B04507-2521-4801-BF0D-5FD79D6D518C}.Debug|Win32.ActiveCfg = Debug|Win32 {C2B04507-2521-4801-BF0D-5FD79D6D518C}.Debug|Win32.Build.0 = Debug|Win32 {C2B04507-2521-4801-BF0D-5FD79D6D518C}.Debug|x64.ActiveCfg = Debug|x64 {C2B04507-2521-4801-BF0D-5FD79D6D518C}.Debug|x64.Build.0 = Debug|x64 + {C2B04507-2521-4801-BF0D-5FD79D6D518C}.Release|ARM.ActiveCfg = Release|Win32 {C2B04507-2521-4801-BF0D-5FD79D6D518C}.Release|Win32.ActiveCfg = Release|Win32 {C2B04507-2521-4801-BF0D-5FD79D6D518C}.Release|Win32.Build.0 = Release|Win32 {C2B04507-2521-4801-BF0D-5FD79D6D518C}.Release|x64.ActiveCfg = Release|x64 {C2B04507-2521-4801-BF0D-5FD79D6D518C}.Release|x64.Build.0 = Release|x64 + {631C23CE-6C1D-4875-88F0-85E0A42B36EA}.Debug|ARM.ActiveCfg = Debug|Win32 {631C23CE-6C1D-4875-88F0-85E0A42B36EA}.Debug|Win32.ActiveCfg = Debug|Win32 {631C23CE-6C1D-4875-88F0-85E0A42B36EA}.Debug|Win32.Build.0 = Debug|Win32 {631C23CE-6C1D-4875-88F0-85E0A42B36EA}.Debug|x64.ActiveCfg = Debug|x64 {631C23CE-6C1D-4875-88F0-85E0A42B36EA}.Debug|x64.Build.0 = Debug|x64 + {631C23CE-6C1D-4875-88F0-85E0A42B36EA}.Release|ARM.ActiveCfg = Release|Win32 {631C23CE-6C1D-4875-88F0-85E0A42B36EA}.Release|Win32.ActiveCfg = Release|Win32 {631C23CE-6C1D-4875-88F0-85E0A42B36EA}.Release|Win32.Build.0 = Release|Win32 {631C23CE-6C1D-4875-88F0-85E0A42B36EA}.Release|x64.ActiveCfg = Release|x64 {631C23CE-6C1D-4875-88F0-85E0A42B36EA}.Release|x64.Build.0 = Release|x64 + {E4993E82-D68A-46CA-BAE0-9D35E172E46F}.Debug|ARM.ActiveCfg = Debug|Win32 {E4993E82-D68A-46CA-BAE0-9D35E172E46F}.Debug|Win32.ActiveCfg = Debug|Win32 {E4993E82-D68A-46CA-BAE0-9D35E172E46F}.Debug|Win32.Build.0 = Debug|Win32 {E4993E82-D68A-46CA-BAE0-9D35E172E46F}.Debug|x64.ActiveCfg = Debug|x64 {E4993E82-D68A-46CA-BAE0-9D35E172E46F}.Debug|x64.Build.0 = Debug|x64 + {E4993E82-D68A-46CA-BAE0-9D35E172E46F}.Release|ARM.ActiveCfg = Release|Win32 {E4993E82-D68A-46CA-BAE0-9D35E172E46F}.Release|Win32.ActiveCfg = Release|Win32 {E4993E82-D68A-46CA-BAE0-9D35E172E46F}.Release|Win32.Build.0 = Release|Win32 {E4993E82-D68A-46CA-BAE0-9D35E172E46F}.Release|x64.ActiveCfg = Release|x64 {E4993E82-D68A-46CA-BAE0-9D35E172E46F}.Release|x64.Build.0 = Release|x64 + {62D4B15D-7A90-4ECB-BA19-5E021D6A21BC}.Debug|ARM.ActiveCfg = Debug|Win32 {62D4B15D-7A90-4ECB-BA19-5E021D6A21BC}.Debug|Win32.ActiveCfg = Debug|Win32 {62D4B15D-7A90-4ECB-BA19-5E021D6A21BC}.Debug|Win32.Build.0 = Debug|Win32 {62D4B15D-7A90-4ECB-BA19-5E021D6A21BC}.Debug|x64.ActiveCfg = Debug|x64 {62D4B15D-7A90-4ECB-BA19-5E021D6A21BC}.Debug|x64.Build.0 = Debug|x64 + {62D4B15D-7A90-4ECB-BA19-5E021D6A21BC}.Release|ARM.ActiveCfg = Release|Win32 {62D4B15D-7A90-4ECB-BA19-5E021D6A21BC}.Release|Win32.ActiveCfg = Release|Win32 {62D4B15D-7A90-4ECB-BA19-5E021D6A21BC}.Release|Win32.Build.0 = Release|Win32 {62D4B15D-7A90-4ECB-BA19-5E021D6A21BC}.Release|x64.ActiveCfg = Release|x64 {62D4B15D-7A90-4ECB-BA19-5E021D6A21BC}.Release|x64.Build.0 = Release|x64 + {9D4211F7-2C77-439C-82F0-30A4E43BA569}.Debug|ARM.ActiveCfg = Debug|Win32 {9D4211F7-2C77-439C-82F0-30A4E43BA569}.Debug|Win32.ActiveCfg = Debug|Win32 {9D4211F7-2C77-439C-82F0-30A4E43BA569}.Debug|Win32.Build.0 = Debug|Win32 {9D4211F7-2C77-439C-82F0-30A4E43BA569}.Debug|x64.ActiveCfg = Debug|x64 {9D4211F7-2C77-439C-82F0-30A4E43BA569}.Debug|x64.Build.0 = Debug|x64 + {9D4211F7-2C77-439C-82F0-30A4E43BA569}.Release|ARM.ActiveCfg = Release|Win32 {9D4211F7-2C77-439C-82F0-30A4E43BA569}.Release|Win32.ActiveCfg = Release|Win32 {9D4211F7-2C77-439C-82F0-30A4E43BA569}.Release|Win32.Build.0 = Release|Win32 {9D4211F7-2C77-439C-82F0-30A4E43BA569}.Release|x64.ActiveCfg = Release|x64 {9D4211F7-2C77-439C-82F0-30A4E43BA569}.Release|x64.Build.0 = Release|x64 + {691EE0C0-DC57-4A48-8AEE-8ED75EB3A057}.Debug|ARM.ActiveCfg = Debug|Win32 {691EE0C0-DC57-4A48-8AEE-8ED75EB3A057}.Debug|Win32.ActiveCfg = Debug|Win32 {691EE0C0-DC57-4A48-8AEE-8ED75EB3A057}.Debug|Win32.Build.0 = Debug|Win32 {691EE0C0-DC57-4A48-8AEE-8ED75EB3A057}.Debug|x64.ActiveCfg = Debug|x64 {691EE0C0-DC57-4A48-8AEE-8ED75EB3A057}.Debug|x64.Build.0 = Debug|x64 + {691EE0C0-DC57-4A48-8AEE-8ED75EB3A057}.Release|ARM.ActiveCfg = Release|Win32 {691EE0C0-DC57-4A48-8AEE-8ED75EB3A057}.Release|Win32.ActiveCfg = Release|Win32 {691EE0C0-DC57-4A48-8AEE-8ED75EB3A057}.Release|Win32.Build.0 = Release|Win32 {691EE0C0-DC57-4A48-8AEE-8ED75EB3A057}.Release|x64.ActiveCfg = Release|x64 {691EE0C0-DC57-4A48-8AEE-8ED75EB3A057}.Release|x64.Build.0 = Release|x64 + {C7891A65-80AB-4245-912E-5F1E17B0E6C4}.Debug|ARM.ActiveCfg = Debug|Win32 {C7891A65-80AB-4245-912E-5F1E17B0E6C4}.Debug|Win32.ActiveCfg = Debug|Win32 {C7891A65-80AB-4245-912E-5F1E17B0E6C4}.Debug|Win32.Build.0 = Debug|Win32 {C7891A65-80AB-4245-912E-5F1E17B0E6C4}.Debug|x64.ActiveCfg = Debug|x64 {C7891A65-80AB-4245-912E-5F1E17B0E6C4}.Debug|x64.Build.0 = Debug|x64 + {C7891A65-80AB-4245-912E-5F1E17B0E6C4}.Release|ARM.ActiveCfg = Release|Win32 {C7891A65-80AB-4245-912E-5F1E17B0E6C4}.Release|Win32.ActiveCfg = Release|Win32 {C7891A65-80AB-4245-912E-5F1E17B0E6C4}.Release|Win32.Build.0 = Release|Win32 {C7891A65-80AB-4245-912E-5F1E17B0E6C4}.Release|x64.ActiveCfg = Release|x64 {C7891A65-80AB-4245-912E-5F1E17B0E6C4}.Release|x64.Build.0 = Release|x64 + {E7611F49-F088-4175-9446-6111444E72C8}.Debug|ARM.ActiveCfg = Debug|Win32 {E7611F49-F088-4175-9446-6111444E72C8}.Debug|Win32.ActiveCfg = Debug|Win32 {E7611F49-F088-4175-9446-6111444E72C8}.Debug|Win32.Build.0 = Debug|Win32 {E7611F49-F088-4175-9446-6111444E72C8}.Debug|x64.ActiveCfg = Debug|x64 {E7611F49-F088-4175-9446-6111444E72C8}.Debug|x64.Build.0 = Debug|x64 + {E7611F49-F088-4175-9446-6111444E72C8}.Release|ARM.ActiveCfg = Release|Win32 {E7611F49-F088-4175-9446-6111444E72C8}.Release|Win32.ActiveCfg = Release|Win32 {E7611F49-F088-4175-9446-6111444E72C8}.Release|Win32.Build.0 = Release|Win32 {E7611F49-F088-4175-9446-6111444E72C8}.Release|x64.ActiveCfg = Release|x64 {E7611F49-F088-4175-9446-6111444E72C8}.Release|x64.Build.0 = Release|x64 + {659D0C08-D4ED-4BF3-B02B-2D8D4B5A7A7A}.Debug|ARM.ActiveCfg = Debug|Win32 {659D0C08-D4ED-4BF3-B02B-2D8D4B5A7A7A}.Debug|Win32.ActiveCfg = Debug|Win32 {659D0C08-D4ED-4BF3-B02B-2D8D4B5A7A7A}.Debug|Win32.Build.0 = Debug|Win32 {659D0C08-D4ED-4BF3-B02B-2D8D4B5A7A7A}.Debug|x64.ActiveCfg = Debug|x64 {659D0C08-D4ED-4BF3-B02B-2D8D4B5A7A7A}.Debug|x64.Build.0 = Debug|x64 + {659D0C08-D4ED-4BF3-B02B-2D8D4B5A7A7A}.Release|ARM.ActiveCfg = Release|Win32 {659D0C08-D4ED-4BF3-B02B-2D8D4B5A7A7A}.Release|Win32.ActiveCfg = Release|Win32 {659D0C08-D4ED-4BF3-B02B-2D8D4B5A7A7A}.Release|Win32.Build.0 = Release|Win32 {659D0C08-D4ED-4BF3-B02B-2D8D4B5A7A7A}.Release|x64.ActiveCfg = Release|x64 {659D0C08-D4ED-4BF3-B02B-2D8D4B5A7A7A}.Release|x64.Build.0 = Release|x64 + {B1D53358-37BD-48BC-B27C-68BAF1E78508}.Debug|ARM.ActiveCfg = Debug|ARM + {B1D53358-37BD-48BC-B27C-68BAF1E78508}.Debug|ARM.Build.0 = Debug|ARM + {B1D53358-37BD-48BC-B27C-68BAF1E78508}.Debug|Win32.ActiveCfg = Debug|Win32 + {B1D53358-37BD-48BC-B27C-68BAF1E78508}.Debug|Win32.Build.0 = Debug|Win32 + {B1D53358-37BD-48BC-B27C-68BAF1E78508}.Debug|x64.ActiveCfg = Debug|x64 + {B1D53358-37BD-48BC-B27C-68BAF1E78508}.Debug|x64.Build.0 = Debug|x64 + {B1D53358-37BD-48BC-B27C-68BAF1E78508}.Release|ARM.ActiveCfg = Release|ARM + {B1D53358-37BD-48BC-B27C-68BAF1E78508}.Release|ARM.Build.0 = Release|ARM + {B1D53358-37BD-48BC-B27C-68BAF1E78508}.Release|Win32.ActiveCfg = Release|Win32 + {B1D53358-37BD-48BC-B27C-68BAF1E78508}.Release|Win32.Build.0 = Release|Win32 + {B1D53358-37BD-48BC-B27C-68BAF1E78508}.Release|x64.ActiveCfg = Release|x64 + {B1D53358-37BD-48BC-B27C-68BAF1E78508}.Release|x64.Build.0 = Release|x64 + {6786C051-383B-47E0-9E82-B8B994E06A25}.Debug|ARM.ActiveCfg = Debug|ARM + {6786C051-383B-47E0-9E82-B8B994E06A25}.Debug|ARM.Build.0 = Debug|ARM + {6786C051-383B-47E0-9E82-B8B994E06A25}.Debug|Win32.ActiveCfg = Debug|Win32 + {6786C051-383B-47E0-9E82-B8B994E06A25}.Debug|Win32.Build.0 = Debug|Win32 + {6786C051-383B-47E0-9E82-B8B994E06A25}.Debug|x64.ActiveCfg = Debug|x64 + {6786C051-383B-47E0-9E82-B8B994E06A25}.Debug|x64.Build.0 = Debug|x64 + {6786C051-383B-47E0-9E82-B8B994E06A25}.Release|ARM.ActiveCfg = Release|ARM + {6786C051-383B-47E0-9E82-B8B994E06A25}.Release|ARM.Build.0 = Release|ARM + {6786C051-383B-47E0-9E82-B8B994E06A25}.Release|Win32.ActiveCfg = Release|Win32 + {6786C051-383B-47E0-9E82-B8B994E06A25}.Release|Win32.Build.0 = Release|Win32 + {6786C051-383B-47E0-9E82-B8B994E06A25}.Release|x64.ActiveCfg = Release|x64 + {6786C051-383B-47E0-9E82-B8B994E06A25}.Release|x64.Build.0 = Release|x64 + {C10CF34B-3F79-430E-AD38-5A32DC0589C2}.Debug|ARM.ActiveCfg = Debug|ARM + {C10CF34B-3F79-430E-AD38-5A32DC0589C2}.Debug|ARM.Build.0 = Debug|ARM + {C10CF34B-3F79-430E-AD38-5A32DC0589C2}.Debug|Win32.ActiveCfg = Debug|Win32 + {C10CF34B-3F79-430E-AD38-5A32DC0589C2}.Debug|Win32.Build.0 = Debug|Win32 + {C10CF34B-3F79-430E-AD38-5A32DC0589C2}.Debug|x64.ActiveCfg = Debug|x64 + {C10CF34B-3F79-430E-AD38-5A32DC0589C2}.Debug|x64.Build.0 = Debug|x64 + {C10CF34B-3F79-430E-AD38-5A32DC0589C2}.Release|ARM.ActiveCfg = Release|ARM + {C10CF34B-3F79-430E-AD38-5A32DC0589C2}.Release|ARM.Build.0 = Release|ARM + {C10CF34B-3F79-430E-AD38-5A32DC0589C2}.Release|Win32.ActiveCfg = Release|Win32 + {C10CF34B-3F79-430E-AD38-5A32DC0589C2}.Release|Win32.Build.0 = Release|Win32 + {C10CF34B-3F79-430E-AD38-5A32DC0589C2}.Release|x64.ActiveCfg = Release|x64 + {C10CF34B-3F79-430E-AD38-5A32DC0589C2}.Release|x64.Build.0 = Release|x64 EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE EndGlobalSection + GlobalSection(SubversionScc) = preSolution + Svn-Managed = True + Manager = AnkhSVN - Subversion Support for Visual Studio + EndGlobalSection EndGlobal diff --git a/Build/source/libs/icu/icu-src/source/allinone/icucheck.bat b/Build/source/libs/icu/icu-src/source/allinone/icucheck.bat index f8331a0122b..119bc99b416 100755 --- a/Build/source/libs/icu/icu-src/source/allinone/icucheck.bat +++ b/Build/source/libs/icu/icu-src/source/allinone/icucheck.bat @@ -1,131 +1,131 @@ -@echo off -REM Copyright (C) 2016 and later: Unicode, Inc. and others. -REM License & terms of use: http://www.unicode.org/copyright.html -REM ******************************************************************** -REM * COPYRIGHT: -REM * Copyright (c) 2010-2014, International Business Machines Corporation -REM * and others. All Rights Reserved. -REM ******************************************************************** - -set ICU_ARCH=%1 -set ICU_DBRL=%2 - -if "%1" == "" ( -echo Usage: %0 "x86 or x64" "Debug or Release" -exit /b 1 -) - -if "%2" == "" ( -echo Usage: %0 %1 "Debug or Release" -exit /b 1 -) - -set ICU_OPATH=%PATH% - -set ICU_ICUDIR="%~dp0"\..\.. - -if "%ICU_ARCH%" == "x64" ( -set ICU_BINDIR=%~dp0\..\..\bin64 -) else ( -set ICU_BINDIR=%~dp0\..\..\bin -) - -set PATH=%ICU_BINDIR%;%PATH% - -echo testing ICU in %ICU_ICUDIR% arch=%ICU_ARCH% type=%ICU_DBRL% -pushd %ICU_ICUDIR% - -@rem factor these out -set ICUINFO_CMD=%ICU_ICUDIR%\source\tools\icuinfo\%ICU_ARCH%\%ICU_DBRL%\icuinfo.exe -set INTLTEST_CMD=%ICU_ICUDIR%\source\test\intltest\%ICU_ARCH%\%ICU_DBRL%\intltest.exe -set IOTEST_CMD=%ICU_ICUDIR%\source\test\iotest\%ICU_ARCH%\%ICU_DBRL%\iotest.exe -set CINTLTST_CMD=%ICU_ICUDIR%\source\test\cintltst\%ICU_ARCH%\%ICU_DBRL%\cintltst.exe -set LETEST_CMD=%ICU_ICUDIR%\source\test\letest\%ICU_ARCH%\%ICU_DBRL%\letest.exe - -set ICUFAILED= -set ICURUN= -set ICUFAILCNT=0 - -@echo on - -@set THT=icuinfo -@echo ==== %THT% ========================================================================= -%ICUINFO_CMD% %ICUINFO_OPTS% - -@IF NOT ERRORLEVEL 1 GOTO OK_%THT% -@set ICUFAILED=%ICUFAILED% %THT% -@set ICUFAILCNT=1 -:OK_icuinfo -@set ICURUN=%ICURUN% %THT% - -@set THT=intltest -@echo ==== %THT% ========================================================================= -@cd %ICU_ICUDIR%\source\test\intltest -%INTLTEST_CMD% %INTLTEST_OPTS% - -@IF NOT ERRORLEVEL 1 GOTO OK_%THT% -@set ICUFAILED=%ICUFAILED% %THT% -@set ICUFAILCNT=1 -:OK_intltest -@set ICURUN=%ICURUN% %THT% - -@set THT=iotest -@echo ==== %THT% ========================================================================= -@cd %ICU_ICUDIR%\source\test\iotest -%IOTEST_CMD% %IOTEST_OPTS% - -@IF NOT ERRORLEVEL 1 GOTO OK_%THT% -@set ICUFAILED=%ICUFAILED% %THT% -@set ICUFAILCNT=1 -:OK_IOTEST -@set ICURUN=%ICURUN% %THT% - -@set THT=cintltst -@echo ==== %THT% ========================================================================= -@cd %ICU_ICUDIR%\source\test\cintltst -%CINTLTST_CMD% %CINTLTST_OPTS% - -@IF NOT ERRORLEVEL 1 GOTO OK_%THT% -@set ICUFAILED=%ICUFAILED% %THT% -@set ICUFAILCNT=1 -:OK_cintltst -@set ICURUN=%ICURUN% %THT% - -@REM (Layout is deprecated - this would require HarfBuzz) -@REM @set THT=letest -@REM @echo ==== %THT% ========================================================================= -@REM @cd %ICU_ICUDIR%\source\test\letest -@REM %LETST_CMD% %LETEST_OPTS% - -@REM @IF NOT ERRORLEVEL 1 GOTO OK_%THT% -@REM @set ICUFAILED=%ICUFAILED% %THT% -@REM @set ICUFAILCNT=1 -@REM :OK_letest -@REM @set ICURUN=%ICURUN% %THT% - -@echo off - -REM clean up -set PATH=%ICU_OPATH% -REM unset ICU_OPATH -popd - -@REM done - -echo - -echo - -echo - -echo ============================================================ -echo Summary: ICU in %ICU_ICUDIR% arch=%ICU_ARCH% type=%ICU_DBRL% -echo - -echo Tests Run : %ICURUN% - -if %ICUFAILCNT% == 0 ( - echo " - All Passed!" - exit /b 0 -) -echo Failing Tests: %ICUFAILED% -echo - -echo FAILED! - -exit /b 1 +@echo off +REM Copyright (C) 2016 and later: Unicode, Inc. and others. +REM License & terms of use: http://www.unicode.org/copyright.html +REM ******************************************************************** +REM * COPYRIGHT: +REM * Copyright (c) 2010-2014, International Business Machines Corporation +REM * and others. All Rights Reserved. +REM ******************************************************************** + +set ICU_ARCH=%1 +set ICU_DBRL=%2 + +if "%1" == "" ( +echo Usage: %0 "x86 or x64" "Debug or Release" +exit /b 1 +) + +if "%2" == "" ( +echo Usage: %0 %1 "Debug or Release" +exit /b 1 +) + +set ICU_OPATH=%PATH% + +set ICU_ICUDIR="%~dp0"\..\.. + +if "%ICU_ARCH%" == "x64" ( +set ICU_BINDIR=%~dp0\..\..\bin64 +) else ( +set ICU_BINDIR=%~dp0\..\..\bin +) + +set PATH=%ICU_BINDIR%;%PATH% + +echo testing ICU in %ICU_ICUDIR% arch=%ICU_ARCH% type=%ICU_DBRL% +pushd %ICU_ICUDIR% + +@rem factor these out +set ICUINFO_CMD=%ICU_ICUDIR%\source\tools\icuinfo\%ICU_ARCH%\%ICU_DBRL%\icuinfo.exe +set INTLTEST_CMD=%ICU_ICUDIR%\source\test\intltest\%ICU_ARCH%\%ICU_DBRL%\intltest.exe +set IOTEST_CMD=%ICU_ICUDIR%\source\test\iotest\%ICU_ARCH%\%ICU_DBRL%\iotest.exe +set CINTLTST_CMD=%ICU_ICUDIR%\source\test\cintltst\%ICU_ARCH%\%ICU_DBRL%\cintltst.exe +set LETEST_CMD=%ICU_ICUDIR%\source\test\letest\%ICU_ARCH%\%ICU_DBRL%\letest.exe + +set ICUFAILED= +set ICURUN= +set ICUFAILCNT=0 + +@echo on + +@set THT=icuinfo +@echo ==== %THT% ========================================================================= +%ICUINFO_CMD% %ICUINFO_OPTS% + +@IF NOT ERRORLEVEL 1 GOTO OK_%THT% +@set ICUFAILED=%ICUFAILED% %THT% +@set ICUFAILCNT=1 +:OK_icuinfo +@set ICURUN=%ICURUN% %THT% + +@set THT=intltest +@echo ==== %THT% ========================================================================= +@cd %ICU_ICUDIR%\source\test\intltest +%INTLTEST_CMD% %INTLTEST_OPTS% + +@IF NOT ERRORLEVEL 1 GOTO OK_%THT% +@set ICUFAILED=%ICUFAILED% %THT% +@set ICUFAILCNT=1 +:OK_intltest +@set ICURUN=%ICURUN% %THT% + +@set THT=iotest +@echo ==== %THT% ========================================================================= +@cd %ICU_ICUDIR%\source\test\iotest +%IOTEST_CMD% %IOTEST_OPTS% + +@IF NOT ERRORLEVEL 1 GOTO OK_%THT% +@set ICUFAILED=%ICUFAILED% %THT% +@set ICUFAILCNT=1 +:OK_IOTEST +@set ICURUN=%ICURUN% %THT% + +@set THT=cintltst +@echo ==== %THT% ========================================================================= +@cd %ICU_ICUDIR%\source\test\cintltst +%CINTLTST_CMD% %CINTLTST_OPTS% + +@IF NOT ERRORLEVEL 1 GOTO OK_%THT% +@set ICUFAILED=%ICUFAILED% %THT% +@set ICUFAILCNT=1 +:OK_cintltst +@set ICURUN=%ICURUN% %THT% + +@REM (Layout is deprecated - this would require HarfBuzz) +@REM @set THT=letest +@REM @echo ==== %THT% ========================================================================= +@REM @cd %ICU_ICUDIR%\source\test\letest +@REM %LETST_CMD% %LETEST_OPTS% + +@REM @IF NOT ERRORLEVEL 1 GOTO OK_%THT% +@REM @set ICUFAILED=%ICUFAILED% %THT% +@REM @set ICUFAILCNT=1 +@REM :OK_letest +@REM @set ICURUN=%ICURUN% %THT% + +@echo off + +REM clean up +set PATH=%ICU_OPATH% +REM unset ICU_OPATH +popd + +@REM done + +echo - +echo - +echo - +echo ============================================================ +echo Summary: ICU in %ICU_ICUDIR% arch=%ICU_ARCH% type=%ICU_DBRL% +echo - +echo Tests Run : %ICURUN% + +if %ICUFAILCNT% == 0 ( + echo " - All Passed!" + exit /b 0 +) +echo Failing Tests: %ICUFAILED% +echo - +echo FAILED! + +exit /b 1 diff --git a/Build/source/libs/icu/icu-src/source/common/Makefile.in b/Build/source/libs/icu/icu-src/source/common/Makefile.in index 59ffb7377d7..cf0799aed14 100644 --- a/Build/source/libs/icu/icu-src/source/common/Makefile.in +++ b/Build/source/libs/icu/icu-src/source/common/Makefile.in @@ -89,11 +89,12 @@ ucnv_ext.o ucnvmbcs.o ucnv2022.o ucnvhz.o ucnv_lmb.o ucnvisci.o ucnvdisp.o ucnv_ resource.o uresbund.o ures_cnv.o uresdata.o resbund.o resbund_cnv.o \ ucurr.o \ messagepattern.o ucat.o locmap.o uloc.o locid.o locutil.o locavailable.o locdispnames.o locdspnm.o loclikely.o locresdata.o \ -bytestream.o stringpiece.o \ +bytestream.o stringpiece.o bytesinkutil.o \ stringtriebuilder.o bytestriebuilder.o \ bytestrie.o bytestrieiterator.o \ ucharstrie.o ucharstriebuilder.o ucharstrieiterator.o \ dictionarydata.o \ +edits.o \ appendable.o ustr_cnv.o unistr_cnv.o unistr.o unistr_case.o unistr_props.o \ utf_impl.o ustring.o ustrcase.o ucasemap.o ucasemap_titlecase_brkiter.o cstring.o ustrfmt.o ustrtrns.o ustr_wcs.o utext.o \ unistr_case_locale.o ustrcase_locale.o unistr_titlecase_brkiter.o ustr_titlecase_brkiter.o \ @@ -103,7 +104,7 @@ patternprops.o uchar.o uprops.o ucase.o propname.o ubidi_props.o ubidi.o ubidiwr uscript.o uscript_props.o usc_impl.o unames.o \ utrie.o utrie2.o utrie2_builder.o bmpset.o unisetspan.o uset_props.o uniset_props.o uniset_closure.o uset.o uniset.o usetiter.o ruleiter.o caniter.o unifilt.o unifunct.o \ uarrsort.o brkiter.o ubrk.o brkeng.o dictbe.o filteredbrk.o \ -rbbi.o rbbidata.o rbbinode.o rbbirb.o rbbiscan.o rbbisetb.o rbbistbl.o rbbitblb.o \ +rbbi.o rbbidata.o rbbinode.o rbbirb.o rbbiscan.o rbbisetb.o rbbistbl.o rbbitblb.o rbbi_cache.o \ serv.o servnotf.o servls.o servlk.o servlkf.o servrbf.o servslkf.o \ uidna.o usprep.o uts46.o punycode.o \ util.o util_props.o parsepos.o locbased.o cwchar.o wintz.o dtintrv.o ucnvsel.o propsvec.o \ diff --git a/Build/source/libs/icu/icu-src/source/common/appendable.cpp b/Build/source/libs/icu/icu-src/source/common/appendable.cpp index 1a597b5de52..fca3c1e4133 100644 --- a/Build/source/libs/icu/icu-src/source/common/appendable.cpp +++ b/Build/source/libs/icu/icu-src/source/common/appendable.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* @@ -6,7 +6,7 @@ * Corporation and others. All Rights Reserved. ******************************************************************************* * file name: appendable.cpp -* encoding: US-ASCII +* encoding: UTF-8 * tab size: 8 (not used) * indentation:4 * diff --git a/Build/source/libs/icu/icu-src/source/common/bmpset.cpp b/Build/source/libs/icu/icu-src/source/common/bmpset.cpp index ebcd0d23bf9..f84bfd7f5bf 100644 --- a/Build/source/libs/icu/icu-src/source/common/bmpset.cpp +++ b/Build/source/libs/icu/icu-src/source/common/bmpset.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ****************************************************************************** @@ -8,7 +8,7 @@ * ****************************************************************************** * file name: bmpset.cpp -* encoding: US-ASCII +* encoding: UTF-8 * tab size: 8 (not used) * indentation:4 * @@ -28,7 +28,7 @@ U_NAMESPACE_BEGIN BMPSet::BMPSet(const int32_t *parentList, int32_t parentListLength) : list(parentList), listLength(parentListLength) { - uprv_memset(asciiBytes, 0, sizeof(asciiBytes)); + uprv_memset(latin1Contains, 0, sizeof(latin1Contains)); uprv_memset(table7FF, 0, sizeof(table7FF)); uprv_memset(bmpBlockBits, 0, sizeof(bmpBlockBits)); @@ -45,14 +45,16 @@ BMPSet::BMPSet(const int32_t *parentList, int32_t parentListLength) : list4kStarts[i]=findCodePoint(i<<12, list4kStarts[i-1], listLength-1); } list4kStarts[0x11]=listLength-1; + containsFFFD=containsSlow(0xfffd, list4kStarts[0xf], list4kStarts[0x10]); initBits(); overrideIllegal(); } BMPSet::BMPSet(const BMPSet &otherBMPSet, const int32_t *newParentList, int32_t newParentListLength) : + containsFFFD(otherBMPSet.containsFFFD), list(newParentList), listLength(newParentListLength) { - uprv_memcpy(asciiBytes, otherBMPSet.asciiBytes, sizeof(asciiBytes)); + uprv_memcpy(latin1Contains, otherBMPSet.latin1Contains, sizeof(latin1Contains)); uprv_memcpy(table7FF, otherBMPSet.table7FF, sizeof(table7FF)); uprv_memcpy(bmpBlockBits, otherBMPSet.bmpBlockBits, sizeof(bmpBlockBits)); uprv_memcpy(list4kStarts, otherBMPSet.list4kStarts, sizeof(list4kStarts)); @@ -120,7 +122,7 @@ void BMPSet::initBits() { UChar32 start, limit; int32_t listIndex=0; - // Set asciiBytes[]. + // Set latin1Contains[]. do { start=list[listIndex++]; if(listIndex=0x80) { + if(start>=0x100) { break; } do { - asciiBytes[start++]=1; - } while(start0x80) { + if(start<0x80) { + start=0x80; + } + break; + } + } // Set table7FF[]. while(start<0x800) { @@ -204,19 +223,14 @@ void BMPSet::initBits() { * for faster validity checking at runtime. * No need to set 0 values where they were reset to 0 in the constructor * and not modified by initBits(). - * (asciiBytes[] trail bytes, table7FF[] 0..7F, bmpBlockBits[] 0..7FF) + * (table7FF[] 0..7F, bmpBlockBits[] 0..7FF) * Need to set 0 values for surrogates D800..DFFF. */ void BMPSet::overrideIllegal() { uint32_t bits, mask; int32_t i; - if(containsSlow(0xfffd, list4kStarts[0xf], list4kStarts[0x10])) { - // contains(FFFD)==TRUE - for(i=0x80; i<0xc0; ++i) { - asciiBytes[i]=1; - } - + if(containsFFFD) { bits=3; // Lead bytes 0xC0 and 0xC1. for(i=0; i<64; ++i) { table7FF[i]|=bits; @@ -233,7 +247,6 @@ void BMPSet::overrideIllegal() { bmpBlockBits[i]=(bmpBlockBits[i]&mask)|bits; } } else { - // contains(FFFD)==FALSE mask=~(0x10001<<0xd); // Lead byte 0xED. for(i=32; i<64; ++i) { // Second half of 4k block. bmpBlockBits[i]&=mask; @@ -277,8 +290,8 @@ int32_t BMPSet::findCodePoint(UChar32 c, int32_t lo, int32_t hi) const { UBool BMPSet::contains(UChar32 c) const { - if((uint32_t)c<=0x7f) { - return (UBool)asciiBytes[c]; + if((uint32_t)c<=0xff) { + return (UBool)latin1Contains[c]; } else if((uint32_t)c<=0x7ff) { return (UBool)((table7FF[c&0x3f]&((uint32_t)1<<(c>>6)))!=0); } else if((uint32_t)c<0xd800 || (c>=0xe000 && c<=0xffff)) { @@ -314,8 +327,8 @@ BMPSet::span(const UChar *s, const UChar *limit, USetSpanCondition spanCondition // span do { c=*s; - if(c<=0x7f) { - if(!asciiBytes[c]) { + if(c<=0xff) { + if(!latin1Contains[c]) { break; } } else if(c<=0x7ff) { @@ -354,8 +367,8 @@ BMPSet::span(const UChar *s, const UChar *limit, USetSpanCondition spanCondition // span not do { c=*s; - if(c<=0x7f) { - if(asciiBytes[c]) { + if(c<=0xff) { + if(latin1Contains[c]) { break; } } else if(c<=0x7ff) { @@ -403,8 +416,8 @@ BMPSet::spanBack(const UChar *s, const UChar *limit, USetSpanCondition spanCondi // span for(;;) { c=*(--limit); - if(c<=0x7f) { - if(!asciiBytes[c]) { + if(c<=0xff) { + if(!latin1Contains[c]) { break; } } else if(c<=0x7ff) { @@ -446,8 +459,8 @@ BMPSet::spanBack(const UChar *s, const UChar *limit, USetSpanCondition spanCondi // span not for(;;) { c=*(--limit); - if(c<=0x7f) { - if(asciiBytes[c]) { + if(c<=0xff) { + if(latin1Contains[c]) { break; } } else if(c<=0x7ff) { @@ -497,22 +510,22 @@ const uint8_t * BMPSet::spanUTF8(const uint8_t *s, int32_t length, USetSpanCondition spanCondition) const { const uint8_t *limit=s+length; uint8_t b=*s; - if((int8_t)b>=0) { + if(U8_IS_SINGLE(b)) { // Initial all-ASCII span. if(spanCondition) { do { - if(!asciiBytes[b] || ++s==limit) { + if(!latin1Contains[b] || ++s==limit) { return s; } b=*s; - } while((int8_t)b>=0); + } while(U8_IS_SINGLE(b)); } else { do { - if(asciiBytes[b] || ++s==limit) { + if(latin1Contains[b] || ++s==limit) { return s; } b=*s; - } while((int8_t)b>=0); + } while(U8_IS_SINGLE(b)); } length=(int32_t)(limit-s); } @@ -540,20 +553,20 @@ BMPSet::spanUTF8(const uint8_t *s, int32_t length, USetSpanCondition spanConditi // single trail byte, check for preceding 3- or 4-byte lead byte if(length>=2 && (b=*(limit-2))>=0xe0) { limit-=2; - if(asciiBytes[0x80]!=spanCondition) { + if(containsFFFD!=spanCondition) { limit0=limit; } } else if(b<0xc0 && b>=0x80 && length>=3 && (b=*(limit-3))>=0xf0) { // 4-byte lead byte with only two trail bytes limit-=3; - if(asciiBytes[0x80]!=spanCondition) { + if(containsFFFD!=spanCondition) { limit0=limit; } } } else { // lead byte with no trail bytes --limit; - if(asciiBytes[0x80]!=spanCondition) { + if(containsFFFD!=spanCondition) { limit0=limit; } } @@ -563,26 +576,26 @@ BMPSet::spanUTF8(const uint8_t *s, int32_t length, USetSpanCondition spanConditi while(s=0xc0 && (t1=(uint8_t)(*s-0x80)) <= 0x3f ) { if((USetSpanCondition)((table7FF[t1]&((uint32_t)1<<(b&0x1f)))!=0) != spanCondition) { @@ -642,7 +656,7 @@ BMPSet::spanUTF8(const uint8_t *s, int32_t length, USetSpanCondition spanConditi // Give an illegal sequence the same value as the result of contains(FFFD). // Handle each byte of an illegal sequence separately to simplify the code; // no need to optimize error handling. - if(asciiBytes[0x80]!=spanCondition) { + if(containsFFFD!=spanCondition) { return s-1; } } @@ -667,26 +681,26 @@ BMPSet::spanBackUTF8(const uint8_t *s, int32_t length, USetSpanCondition spanCon do { b=s[--length]; - if((int8_t)b>=0) { + if(U8_IS_SINGLE(b)) { // ASCII sub-span if(spanCondition) { do { - if(!asciiBytes[b]) { + if(!latin1Contains[b]) { return length+1; } else if(length==0) { return 0; } b=s[--length]; - } while((int8_t)b>=0); + } while(U8_IS_SINGLE(b)); } else { do { - if(asciiBytes[b]) { + if(latin1Contains[b]) { return length+1; } else if(length==0) { return 0; } b=s[--length]; - } while((int8_t)b>=0); + } while(U8_IS_SINGLE(b)); } } diff --git a/Build/source/libs/icu/icu-src/source/common/bmpset.h b/Build/source/libs/icu/icu-src/source/common/bmpset.h index 8975cd61d5c..018aeb7f95b 100644 --- a/Build/source/libs/icu/icu-src/source/common/bmpset.h +++ b/Build/source/libs/icu/icu-src/source/common/bmpset.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ****************************************************************************** @@ -8,7 +8,7 @@ * ****************************************************************************** * file name: bmpset.h -* encoding: US-ASCII +* encoding: UTF-8 * tab size: 8 (not used) * indentation:4 * @@ -28,11 +28,12 @@ U_NAMESPACE_BEGIN * Helper class for frozen UnicodeSets, implements contains() and span() * optimized for BMP code points. Structured to be UTF-8-friendly. * - * ASCII: Look up bytes. + * Latin-1: Look up bytes. * 2-byte characters: Bits organized vertically. * 3-byte characters: Use zero/one/mixed data per 64-block in U+0000..U+FFFF, * with mixed for illegal ranges. - * Supplementary characters: Call contains() on the parent set. + * Supplementary characters: Binary search over + * the supplementary part of the parent set's inversion list. */ class BMPSet : public UMemory { public: @@ -96,12 +97,12 @@ private: inline UBool containsSlow(UChar32 c, int32_t lo, int32_t hi) const; /* - * One byte per ASCII character, or trail byte in lead position. - * 0 or 1 for ASCII characters. - * The value for trail bytes is the result of contains(FFFD) - * for faster validity checking at runtime. + * One byte 0 or 1 per Latin-1 character. */ - UBool asciiBytes[0xc0]; + UBool latin1Contains[0x100]; + + /* TRUE if contains(U+FFFD). */ + UBool containsFFFD; /* * One bit per code point from U+0000..U+07FF. diff --git a/Build/source/libs/icu/icu-src/source/common/brkeng.cpp b/Build/source/libs/icu/icu-src/source/common/brkeng.cpp index cf144833fae..88024b2e621 100644 --- a/Build/source/libs/icu/icu-src/source/common/brkeng.cpp +++ b/Build/source/libs/icu/icu-src/source/common/brkeng.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ************************************************************************************ @@ -11,9 +11,6 @@ #if !UCONFIG_NO_BREAK_ITERATION -#include "brkeng.h" -#include "cmemory.h" -#include "dictbe.h" #include "unicode/uchar.h" #include "unicode/uniset.h" #include "unicode/chariter.h" @@ -24,6 +21,10 @@ #include "unicode/uscript.h" #include "unicode/ucharstrie.h" #include "unicode/bytestrie.h" + +#include "brkeng.h" +#include "cmemory.h" +#include "dictbe.h" #include "charstr.h" #include "dictionarydata.h" #include "mutex.h" @@ -80,23 +81,15 @@ UnhandledEngine::handles(UChar32 c, int32_t breakType) const { int32_t UnhandledEngine::findBreaks( UText *text, - int32_t startPos, - int32_t endPos, - UBool reverse, - int32_t breakType, - UStack &/*foundBreaks*/ ) const { + int32_t /* startPos */, + int32_t endPos, + int32_t breakType, + UVector32 &/*foundBreaks*/ ) const { if (breakType >= 0 && breakType < UPRV_LENGTHOF(fHandled)) { UChar32 c = utext_current32(text); - if (reverse) { - while((int32_t)utext_getNativeIndex(text) > startPos && fHandled[breakType]->contains(c)) { - c = utext_previous32(text); - } - } - else { - while((int32_t)utext_getNativeIndex(text) < endPos && fHandled[breakType]->contains(c)) { - utext_next32(text); // TODO: recast loop to work with post-increment operations. - c = utext_current32(text); - } + while((int32_t)utext_getNativeIndex(text) < endPos && fHandled[breakType]->contains(c)) { + utext_next32(text); // TODO: recast loop to work with post-increment operations. + c = utext_current32(text); } } return 0; diff --git a/Build/source/libs/icu/icu-src/source/common/brkeng.h b/Build/source/libs/icu/icu-src/source/common/brkeng.h index 163cbbe2967..f59e7df5200 100644 --- a/Build/source/libs/icu/icu-src/source/common/brkeng.h +++ b/Build/source/libs/icu/icu-src/source/common/brkeng.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /** ************************************************************************************ @@ -19,6 +19,7 @@ U_NAMESPACE_BEGIN class UnicodeSet; class UStack; +class UVector32; class DictionaryMatcher; /******************************************************************* @@ -67,18 +68,15 @@ class LanguageBreakEngine : public UMemory { * is capable of handling. * @param startPos The start of the run within the supplied text. * @param endPos The end of the run within the supplied text. - * @param reverse Whether the caller is looking for breaks in a reverse - * direction. * @param breakType The type of break desired, or -1. - * @param foundBreaks An allocated C array of the breaks found, if any + * @param foundBreaks A Vector of int32_t to receive the breaks. * @return The number of breaks found. */ virtual int32_t findBreaks( UText *text, int32_t startPos, int32_t endPos, - UBool reverse, int32_t breakType, - UStack &foundBreaks ) const = 0; + UVector32 &foundBreaks ) const = 0; }; @@ -192,8 +190,6 @@ class UnhandledEngine : public LanguageBreakEngine { * is capable of handling. * @param startPos The start of the run within the supplied text. * @param endPos The end of the run within the supplied text. - * @param reverse Whether the caller is looking for breaks in a reverse - * direction. * @param breakType The type of break desired, or -1. * @param foundBreaks An allocated C array of the breaks found, if any * @return The number of breaks found. @@ -201,9 +197,8 @@ class UnhandledEngine : public LanguageBreakEngine { virtual int32_t findBreaks( UText *text, int32_t startPos, int32_t endPos, - UBool reverse, int32_t breakType, - UStack &foundBreaks ) const; + UVector32 &foundBreaks ) const; /** *

      Tell the engine to handle a particular character and break type.

      diff --git a/Build/source/libs/icu/icu-src/source/common/brkiter.cpp b/Build/source/libs/icu/icu-src/source/common/brkiter.cpp index 029ec5e185d..ab02f1c2471 100644 --- a/Build/source/libs/icu/icu-src/source/common/brkiter.cpp +++ b/Build/source/libs/icu/icu-src/source/common/brkiter.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* @@ -195,7 +195,7 @@ BreakIterator::getAvailableLocales(int32_t& count) // ------------------------------------------ // -// Default constructor and destructor +// Constructors, destructor and assignment operator // //------------------------------------------- @@ -204,6 +204,19 @@ BreakIterator::BreakIterator() *validLocale = *actualLocale = 0; } +BreakIterator::BreakIterator(const BreakIterator &other) : UObject(other) { + uprv_strncpy(actualLocale, other.actualLocale, sizeof(actualLocale)); + uprv_strncpy(validLocale, other.validLocale, sizeof(validLocale)); +} + +BreakIterator &BreakIterator::operator =(const BreakIterator &other) { + if (this != &other) { + uprv_strncpy(actualLocale, other.actualLocale, sizeof(actualLocale)); + uprv_strncpy(validLocale, other.validLocale, sizeof(validLocale)); + } + return *this; +} + BreakIterator::~BreakIterator() { } @@ -265,7 +278,7 @@ ICUBreakIteratorService::~ICUBreakIteratorService() {} // defined in ucln_cmn.h U_NAMESPACE_END -static icu::UInitOnce gInitOnce; +static icu::UInitOnce gInitOnceBrkiter; static icu::ICULocaleService* gService = NULL; @@ -280,7 +293,7 @@ static UBool U_CALLCONV breakiterator_cleanup(void) { delete gService; gService = NULL; } - gInitOnce.reset(); + gInitOnceBrkiter.reset(); #endif return TRUE; } @@ -296,7 +309,7 @@ initService(void) { static ICULocaleService* getService(void) { - umtx_initOnce(gInitOnce, &initService); + umtx_initOnce(gInitOnceBrkiter, &initService); return gService; } @@ -306,7 +319,7 @@ getService(void) static inline UBool hasService(void) { - return !gInitOnce.isReset() && getService() != NULL; + return !gInitOnceBrkiter.isReset() && getService() != NULL; } // ------------------------------------- diff --git a/Build/source/libs/icu/icu-src/source/common/bytesinkutil.cpp b/Build/source/libs/icu/icu-src/source/common/bytesinkutil.cpp new file mode 100644 index 00000000000..bf1a2d45f8a --- /dev/null +++ b/Build/source/libs/icu/icu-src/source/common/bytesinkutil.cpp @@ -0,0 +1,123 @@ +// © 2017 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html + +// bytesinkutil.cpp +// created: 2017sep14 Markus W. Scherer + +#include "unicode/utypes.h" +#include "unicode/bytestream.h" +#include "unicode/edits.h" +#include "unicode/stringoptions.h" +#include "unicode/utf8.h" +#include "unicode/utf16.h" +#include "bytesinkutil.h" +#include "cmemory.h" +#include "uassert.h" + +U_NAMESPACE_BEGIN + +UBool +ByteSinkUtil::appendChange(int32_t length, const char16_t *s16, int32_t s16Length, + ByteSink &sink, Edits *edits, UErrorCode &errorCode) { + if (U_FAILURE(errorCode)) { return FALSE; } + char scratch[200]; + int32_t s8Length = 0; + for (int32_t i = 0; i < s16Length;) { + int32_t capacity; + int32_t desiredCapacity = s16Length - i; + if (desiredCapacity < (INT32_MAX / 3)) { + desiredCapacity *= 3; // max 3 UTF-8 bytes per UTF-16 code unit + } else if (desiredCapacity < (INT32_MAX / 2)) { + desiredCapacity *= 2; + } else { + desiredCapacity = INT32_MAX; + } + char *buffer = sink.GetAppendBuffer(U8_MAX_LENGTH, desiredCapacity, + scratch, UPRV_LENGTHOF(scratch), &capacity); + capacity -= U8_MAX_LENGTH - 1; + int32_t j = 0; + for (; i < s16Length && j < capacity;) { + UChar32 c; + U16_NEXT_UNSAFE(s16, i, c); + U8_APPEND_UNSAFE(buffer, j, c); + } + if (j > (INT32_MAX - s8Length)) { + errorCode = U_INDEX_OUTOFBOUNDS_ERROR; + return FALSE; + } + sink.Append(buffer, j); + s8Length += j; + } + if (edits != nullptr) { + edits->addReplace(length, s8Length); + } + return TRUE; +} + +UBool +ByteSinkUtil::appendChange(const uint8_t *s, const uint8_t *limit, + const char16_t *s16, int32_t s16Length, + ByteSink &sink, Edits *edits, UErrorCode &errorCode) { + if (U_FAILURE(errorCode)) { return FALSE; } + if ((limit - s) > INT32_MAX) { + errorCode = U_INDEX_OUTOFBOUNDS_ERROR; + return FALSE; + } + return appendChange((int32_t)(limit - s), s16, s16Length, sink, edits, errorCode); +} + +void +ByteSinkUtil::appendCodePoint(int32_t length, UChar32 c, ByteSink &sink, Edits *edits) { + char s8[U8_MAX_LENGTH]; + int32_t s8Length = 0; + U8_APPEND_UNSAFE(s8, s8Length, c); + if (edits != nullptr) { + edits->addReplace(length, s8Length); + } + sink.Append(s8, s8Length); +} + +namespace { + +// See unicode/utf8.h U8_APPEND_UNSAFE(). +inline uint8_t getTwoByteLead(UChar32 c) { return (uint8_t)((c >> 6) | 0xc0); } +inline uint8_t getTwoByteTrail(UChar32 c) { return (uint8_t)((c & 0x3f) | 0x80); } + +} // namespace + +void +ByteSinkUtil::appendTwoBytes(UChar32 c, ByteSink &sink) { + U_ASSERT(0x80 <= c && c <= 0x7ff); // 2-byte UTF-8 + char s8[2] = { (char)getTwoByteLead(c), (char)getTwoByteTrail(c) }; + sink.Append(s8, 2); +} + +UBool +ByteSinkUtil::appendUnchanged(const uint8_t *s, int32_t length, + ByteSink &sink, uint32_t options, Edits *edits, + UErrorCode &errorCode) { + if (U_FAILURE(errorCode)) { return FALSE; } + if (length > 0) { + if (edits != nullptr) { + edits->addUnchanged(length); + } + if ((options & U_OMIT_UNCHANGED_TEXT) == 0) { + sink.Append(reinterpret_cast(s), length); + } + } + return TRUE; +} + +UBool +ByteSinkUtil::appendUnchanged(const uint8_t *s, const uint8_t *limit, + ByteSink &sink, uint32_t options, Edits *edits, + UErrorCode &errorCode) { + if (U_FAILURE(errorCode)) { return FALSE; } + if ((limit - s) > INT32_MAX) { + errorCode = U_INDEX_OUTOFBOUNDS_ERROR; + return FALSE; + } + return appendUnchanged(s, (int32_t)(limit - s), sink, options, edits, errorCode); +} + +U_NAMESPACE_END diff --git a/Build/source/libs/icu/icu-src/source/common/bytesinkutil.h b/Build/source/libs/icu/icu-src/source/common/bytesinkutil.h new file mode 100644 index 00000000000..004b49c4ce6 --- /dev/null +++ b/Build/source/libs/icu/icu-src/source/common/bytesinkutil.h @@ -0,0 +1,53 @@ +// © 2017 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html + +// bytesinkutil.h +// created: 2017sep14 Markus W. Scherer + +#include "unicode/utypes.h" +#include "unicode/bytestream.h" +#include "unicode/edits.h" +#include "cmemory.h" +#include "uassert.h" + +U_NAMESPACE_BEGIN + +class ByteSink; +class Edits; + +class U_COMMON_API ByteSinkUtil { +public: + ByteSinkUtil() = delete; // all static + + /** (length) bytes were mapped to valid (s16, s16Length). */ + static UBool appendChange(int32_t length, + const char16_t *s16, int32_t s16Length, + ByteSink &sink, Edits *edits, UErrorCode &errorCode); + + /** The bytes at [s, limit[ were mapped to valid (s16, s16Length). */ + static UBool appendChange(const uint8_t *s, const uint8_t *limit, + const char16_t *s16, int32_t s16Length, + ByteSink &sink, Edits *edits, UErrorCode &errorCode); + + /** (length) bytes were mapped/changed to valid code point c. */ + static void appendCodePoint(int32_t length, UChar32 c, ByteSink &sink, Edits *edits = nullptr); + + /** The few bytes at [src, nextSrc[ were mapped/changed to valid code point c. */ + static inline void appendCodePoint(const uint8_t *src, const uint8_t *nextSrc, UChar32 c, + ByteSink &sink, Edits *edits = nullptr) { + appendCodePoint((int32_t)(nextSrc - src), c, sink, edits); + } + + /** Append the two-byte character (U+0080..U+07FF). */ + static void appendTwoBytes(UChar32 c, ByteSink &sink); + + static UBool appendUnchanged(const uint8_t *s, int32_t length, + ByteSink &sink, uint32_t options, Edits *edits, + UErrorCode &errorCode); + + static UBool appendUnchanged(const uint8_t *s, const uint8_t *limit, + ByteSink &sink, uint32_t options, Edits *edits, + UErrorCode &errorCode); +}; + +U_NAMESPACE_END diff --git a/Build/source/libs/icu/icu-src/source/common/bytestream.cpp b/Build/source/libs/icu/icu-src/source/common/bytestream.cpp index 5a5c2e4410e..0d0e4dda39b 100644 --- a/Build/source/libs/icu/icu-src/source/common/bytestream.cpp +++ b/Build/source/libs/icu/icu-src/source/common/bytestream.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html // Copyright (C) 2009-2011, International Business Machines // Corporation and others. All Rights Reserved. @@ -45,6 +45,12 @@ void CheckedArrayByteSink::Append(const char* bytes, int32_t n) { if (n <= 0) { return; } + if (n > (INT32_MAX - appended_)) { + // TODO: Report as integer overflow, not merely buffer overflow. + appended_ = INT32_MAX; + overflowed_ = TRUE; + return; + } appended_ += n; int32_t available = capacity_ - size_; if (n > available) { diff --git a/Build/source/libs/icu/icu-src/source/common/bytestrie.cpp b/Build/source/libs/icu/icu-src/source/common/bytestrie.cpp index 093cd8ddb12..c4d498c4bfa 100644 --- a/Build/source/libs/icu/icu-src/source/common/bytestrie.cpp +++ b/Build/source/libs/icu/icu-src/source/common/bytestrie.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* @@ -6,7 +6,7 @@ * Corporation and others. All Rights Reserved. ******************************************************************************* * file name: bytestrie.cpp -* encoding: US-ASCII +* encoding: UTF-8 * tab size: 8 (not used) * indentation:4 * diff --git a/Build/source/libs/icu/icu-src/source/common/bytestriebuilder.cpp b/Build/source/libs/icu/icu-src/source/common/bytestriebuilder.cpp index 913d85a2121..581505e0092 100644 --- a/Build/source/libs/icu/icu-src/source/common/bytestriebuilder.cpp +++ b/Build/source/libs/icu/icu-src/source/common/bytestriebuilder.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* @@ -6,7 +6,7 @@ * Corporation and others. All Rights Reserved. ******************************************************************************* * file name: bytestriebuilder.cpp -* encoding: US-ASCII +* encoding: UTF-8 * tab size: 8 (not used) * indentation:4 * diff --git a/Build/source/libs/icu/icu-src/source/common/bytestrieiterator.cpp b/Build/source/libs/icu/icu-src/source/common/bytestrieiterator.cpp index 4d04247c493..e64961a1f13 100644 --- a/Build/source/libs/icu/icu-src/source/common/bytestrieiterator.cpp +++ b/Build/source/libs/icu/icu-src/source/common/bytestrieiterator.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* @@ -6,7 +6,7 @@ * Corporation and others. All Rights Reserved. ******************************************************************************* * file name: bytestrieiterator.cpp -* encoding: US-ASCII +* encoding: UTF-8 * tab size: 8 (not used) * indentation:4 * diff --git a/Build/source/libs/icu/icu-src/source/common/caniter.cpp b/Build/source/libs/icu/icu-src/source/common/caniter.cpp index 24793508fa6..b28acfc84ee 100644 --- a/Build/source/libs/icu/icu-src/source/common/caniter.cpp +++ b/Build/source/libs/icu/icu-src/source/common/caniter.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ***************************************************************************** @@ -311,12 +311,12 @@ void U_EXPORT2 CanonicalIterator::permute(UnicodeString &source, UBool skipZeros // see what the permutations of the characters before and after this one are //Hashtable *subpermute = permute(source.substring(0,i) + source.substring(i + UTF16.getCharCount(cp))); - permute(subPermuteString.replace(i, U16_LENGTH(cp), NULL, 0), skipZeros, &subpermute, status); + permute(subPermuteString.remove(i, U16_LENGTH(cp)), skipZeros, &subpermute, status); /* Test for buffer overflows */ if(U_FAILURE(status)) { return; } - // The upper replace is destructive. The question is do we have to make a copy, or we don't care about the contents + // The upper remove is destructive. The question is do we have to make a copy, or we don't care about the contents // of source at this point. // prefix this character to all of them @@ -405,7 +405,7 @@ UnicodeString* CanonicalIterator::getEquivalents(const UnicodeString &segment, i //String[] finalResult = new String[result.size()]; UnicodeString *finalResult = NULL; int32_t resultCount; - if((resultCount = result.count())) { + if((resultCount = result.count()) != 0) { finalResult = new UnicodeString[resultCount]; if (finalResult == 0) { status = U_MEMORY_ALLOCATION_ERROR; diff --git a/Build/source/libs/icu/icu-src/source/common/chariter.cpp b/Build/source/libs/icu/icu-src/source/common/chariter.cpp index 625ac49eacc..887119a0eba 100644 --- a/Build/source/libs/icu/icu-src/source/common/chariter.cpp +++ b/Build/source/libs/icu/icu-src/source/common/chariter.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** diff --git a/Build/source/libs/icu/icu-src/source/common/charstr.cpp b/Build/source/libs/icu/icu-src/source/common/charstr.cpp index c792181378e..8bacd20ddc7 100644 --- a/Build/source/libs/icu/icu-src/source/common/charstr.cpp +++ b/Build/source/libs/icu/icu-src/source/common/charstr.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* @@ -6,7 +6,7 @@ * Corporation and others. All Rights Reserved. ******************************************************************************* * file name: charstr.cpp -* encoding: US-ASCII +* encoding: UTF-8 * tab size: 8 (not used) * indentation:4 * @@ -15,6 +15,7 @@ */ #include "unicode/utypes.h" +#include "unicode/putil.h" #include "charstr.h" #include "cmemory.h" #include "cstring.h" diff --git a/Build/source/libs/icu/icu-src/source/common/charstr.h b/Build/source/libs/icu/icu-src/source/common/charstr.h index 9758c5c542b..3cfdf6a897a 100644 --- a/Build/source/libs/icu/icu-src/source/common/charstr.h +++ b/Build/source/libs/icu/icu-src/source/common/charstr.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** diff --git a/Build/source/libs/icu/icu-src/source/common/cmemory.c b/Build/source/libs/icu/icu-src/source/common/cmemory.c deleted file mode 100644 index b40994a1eed..00000000000 --- a/Build/source/libs/icu/icu-src/source/common/cmemory.c +++ /dev/null @@ -1,162 +0,0 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. -// License & terms of use: http://www.unicode.org/copyright.html -/* -****************************************************************************** -* -* Copyright (C) 2002-2015, International Business Machines -* Corporation and others. All Rights Reserved. -* -****************************************************************************** -* -* File cmemory.c ICU Heap allocation. -* All ICU heap allocation, both for C and C++ new of ICU -* class types, comes through these functions. -* -* If you have a need to replace ICU allocation, this is the -* place to do it. -* -* Note that uprv_malloc(0) returns a non-NULL pointer, and -* that a subsequent free of that pointer value is a NOP. -* -****************************************************************************** -*/ -#include "unicode/uclean.h" -#include "cmemory.h" -#include "putilimp.h" -#include "uassert.h" -#include - -/* uprv_malloc(0) returns a pointer to this read-only data. */ -static const int32_t zeroMem[] = {0, 0, 0, 0, 0, 0}; - -/* Function Pointers for user-supplied heap functions */ -static const void *pContext; -static UMemAllocFn *pAlloc; -static UMemReallocFn *pRealloc; -static UMemFreeFn *pFree; - -#if U_DEBUG && defined(UPRV_MALLOC_COUNT) -#include -static int n=0; -static long b=0; -#endif - -#if U_DEBUG - -static char gValidMemorySink = 0; - -U_CAPI void uprv_checkValidMemory(const void *p, size_t n) { - /* - * Access the memory to ensure that it's all valid. - * Load and save a computed value to try to ensure that the compiler - * does not throw away the whole loop. - * A thread analyzer might complain about un-mutexed access to gValidMemorySink - * which is true but harmless because no one ever uses the value in gValidMemorySink. - */ - const char *s = (const char *)p; - char c = gValidMemorySink; - size_t i; - U_ASSERT(p != NULL); - for(i = 0; i < n; ++i) { - c ^= s[i]; - } - gValidMemorySink = c; -} - -#endif /* U_DEBUG */ - -U_CAPI void * U_EXPORT2 -uprv_malloc(size_t s) { -#if U_DEBUG && defined(UPRV_MALLOC_COUNT) -#if 1 - putchar('>'); - fflush(stdout); -#else - fprintf(stderr,"MALLOC\t#%d\t%ul bytes\t%ul total\n", ++n,s,(b+=s)); fflush(stderr); -#endif -#endif - if (s > 0) { - if (pAlloc) { - return (*pAlloc)(pContext, s); - } else { - return uprv_default_malloc(s); - } - } else { - return (void *)zeroMem; - } -} - -U_CAPI void * U_EXPORT2 -uprv_realloc(void * buffer, size_t size) { -#if U_DEBUG && defined(UPRV_MALLOC_COUNT) - putchar('~'); - fflush(stdout); -#endif - if (buffer == zeroMem) { - return uprv_malloc(size); - } else if (size == 0) { - if (pFree) { - (*pFree)(pContext, buffer); - } else { - uprv_default_free(buffer); - } - return (void *)zeroMem; - } else { - if (pRealloc) { - return (*pRealloc)(pContext, buffer, size); - } else { - return uprv_default_realloc(buffer, size); - } - } -} - -U_CAPI void U_EXPORT2 -uprv_free(void *buffer) { -#if U_DEBUG && defined(UPRV_MALLOC_COUNT) - putchar('<'); - fflush(stdout); -#endif - if (buffer != zeroMem) { - if (pFree) { - (*pFree)(pContext, buffer); - } else { - uprv_default_free(buffer); - } - } -} - -U_CAPI void * U_EXPORT2 -uprv_calloc(size_t num, size_t size) { - void *mem = NULL; - size *= num; - mem = uprv_malloc(size); - if (mem) { - uprv_memset(mem, 0, size); - } - return mem; -} - -U_CAPI void U_EXPORT2 -u_setMemoryFunctions(const void *context, UMemAllocFn *a, UMemReallocFn *r, UMemFreeFn *f, UErrorCode *status) -{ - if (U_FAILURE(*status)) { - return; - } - if (a==NULL || r==NULL || f==NULL) { - *status = U_ILLEGAL_ARGUMENT_ERROR; - return; - } - pContext = context; - pAlloc = a; - pRealloc = r; - pFree = f; -} - - -U_CFUNC UBool cmemory_cleanup(void) { - pContext = NULL; - pAlloc = NULL; - pRealloc = NULL; - pFree = NULL; - return TRUE; -} diff --git a/Build/source/libs/icu/icu-src/source/common/cmemory.cpp b/Build/source/libs/icu/icu-src/source/common/cmemory.cpp new file mode 100644 index 00000000000..2176c929e84 --- /dev/null +++ b/Build/source/libs/icu/icu-src/source/common/cmemory.cpp @@ -0,0 +1,162 @@ +// © 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html +/* +****************************************************************************** +* +* Copyright (C) 2002-2015, International Business Machines +* Corporation and others. All Rights Reserved. +* +****************************************************************************** +* +* File cmemory.c ICU Heap allocation. +* All ICU heap allocation, both for C and C++ new of ICU +* class types, comes through these functions. +* +* If you have a need to replace ICU allocation, this is the +* place to do it. +* +* Note that uprv_malloc(0) returns a non-NULL pointer, and +* that a subsequent free of that pointer value is a NOP. +* +****************************************************************************** +*/ +#include "unicode/uclean.h" +#include "cmemory.h" +#include "putilimp.h" +#include "uassert.h" +#include + +/* uprv_malloc(0) returns a pointer to this read-only data. */ +static const int32_t zeroMem[] = {0, 0, 0, 0, 0, 0}; + +/* Function Pointers for user-supplied heap functions */ +static const void *pContext; +static UMemAllocFn *pAlloc; +static UMemReallocFn *pRealloc; +static UMemFreeFn *pFree; + +#if U_DEBUG && defined(UPRV_MALLOC_COUNT) +#include +static int n=0; +static long b=0; +#endif + +#if U_DEBUG + +static char gValidMemorySink = 0; + +U_CAPI void uprv_checkValidMemory(const void *p, size_t n) { + /* + * Access the memory to ensure that it's all valid. + * Load and save a computed value to try to ensure that the compiler + * does not throw away the whole loop. + * A thread analyzer might complain about un-mutexed access to gValidMemorySink + * which is true but harmless because no one ever uses the value in gValidMemorySink. + */ + const char *s = (const char *)p; + char c = gValidMemorySink; + size_t i; + U_ASSERT(p != NULL); + for(i = 0; i < n; ++i) { + c ^= s[i]; + } + gValidMemorySink = c; +} + +#endif /* U_DEBUG */ + +U_CAPI void * U_EXPORT2 +uprv_malloc(size_t s) { +#if U_DEBUG && defined(UPRV_MALLOC_COUNT) +#if 1 + putchar('>'); + fflush(stdout); +#else + fprintf(stderr,"MALLOC\t#%d\t%ul bytes\t%ul total\n", ++n,s,(b+=s)); fflush(stderr); +#endif +#endif + if (s > 0) { + if (pAlloc) { + return (*pAlloc)(pContext, s); + } else { + return uprv_default_malloc(s); + } + } else { + return (void *)zeroMem; + } +} + +U_CAPI void * U_EXPORT2 +uprv_realloc(void * buffer, size_t size) { +#if U_DEBUG && defined(UPRV_MALLOC_COUNT) + putchar('~'); + fflush(stdout); +#endif + if (buffer == zeroMem) { + return uprv_malloc(size); + } else if (size == 0) { + if (pFree) { + (*pFree)(pContext, buffer); + } else { + uprv_default_free(buffer); + } + return (void *)zeroMem; + } else { + if (pRealloc) { + return (*pRealloc)(pContext, buffer, size); + } else { + return uprv_default_realloc(buffer, size); + } + } +} + +U_CAPI void U_EXPORT2 +uprv_free(void *buffer) { +#if U_DEBUG && defined(UPRV_MALLOC_COUNT) + putchar('<'); + fflush(stdout); +#endif + if (buffer != zeroMem) { + if (pFree) { + (*pFree)(pContext, buffer); + } else { + uprv_default_free(buffer); + } + } +} + +U_CAPI void * U_EXPORT2 +uprv_calloc(size_t num, size_t size) { + void *mem = NULL; + size *= num; + mem = uprv_malloc(size); + if (mem) { + uprv_memset(mem, 0, size); + } + return mem; +} + +U_CAPI void U_EXPORT2 +u_setMemoryFunctions(const void *context, UMemAllocFn *a, UMemReallocFn *r, UMemFreeFn *f, UErrorCode *status) +{ + if (U_FAILURE(*status)) { + return; + } + if (a==NULL || r==NULL || f==NULL) { + *status = U_ILLEGAL_ARGUMENT_ERROR; + return; + } + pContext = context; + pAlloc = a; + pRealloc = r; + pFree = f; +} + + +U_CFUNC UBool cmemory_cleanup(void) { + pContext = NULL; + pAlloc = NULL; + pRealloc = NULL; + pFree = NULL; + return TRUE; +} diff --git a/Build/source/libs/icu/icu-src/source/common/cmemory.h b/Build/source/libs/icu/icu-src/source/common/cmemory.h index a1211bdc3c4..ddf8e49a681 100644 --- a/Build/source/libs/icu/icu-src/source/common/cmemory.h +++ b/Build/source/libs/icu/icu-src/source/common/cmemory.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ****************************************************************************** @@ -162,7 +162,6 @@ public: * @param p simple pointer to an array of T items that is adopted */ explicit LocalMemory(T *p=NULL) : LocalPointerBase(p) {} -#if U_HAVE_RVALUE_REFERENCES /** * Move constructor, leaves src with isNull(). * @param src source smart pointer @@ -170,14 +169,12 @@ public: LocalMemory(LocalMemory &&src) U_NOEXCEPT : LocalPointerBase(src.ptr) { src.ptr=NULL; } -#endif /** * Destructor deletes the memory it owns. */ ~LocalMemory() { uprv_free(LocalPointerBase::ptr); } -#if U_HAVE_RVALUE_REFERENCES /** * Move assignment operator, leaves src with isNull(). * The behavior is undefined if *this and src are the same object. @@ -187,7 +184,6 @@ public: LocalMemory &operator=(LocalMemory &&src) U_NOEXCEPT { return moveFrom(src); } -#endif /** * Move assignment, leaves src with isNull(). * The behavior is undefined if *this and src are the same object. @@ -312,6 +308,14 @@ public: * Default constructor initializes with internal T[stackCapacity] buffer. */ MaybeStackArray() : ptr(stackArray), capacity(stackCapacity), needToRelease(FALSE) {} + /** + * Automatically allocates the heap array if the argument is larger than the stack capacity. + * Intended for use when an approximate capacity is known at compile time but the true + * capacity is not known until runtime. + */ + MaybeStackArray(int32_t newCapacity) : MaybeStackArray() { + if (capacity < newCapacity) { resize(newCapacity); } + }; /** * Destructor deletes the array (if owned). */ diff --git a/Build/source/libs/icu/icu-src/source/common/common.vcxproj b/Build/source/libs/icu/icu-src/source/common/common.vcxproj index e6c9acffb49..7a688146402 100644 --- a/Build/source/libs/icu/icu-src/source/common/common.vcxproj +++ b/Build/source/libs/icu/icu-src/source/common/common.vcxproj @@ -20,6 +20,7 @@ {73C0A65B-D1F2-4DE1-B3A6-15DAD2C23F3D} + 8.1 @@ -102,13 +103,14 @@ .\x86\Release/ Level3 true + /utf-8 %(AdditionalOptions) NDEBUG;%(PreprocessorDefinitions) 0x0409 - ..\..\bin\icuuc58.dll + ..\..\bin\icuuc60.dll true .\..\..\lib\icuuc.pdb true @@ -143,13 +145,14 @@ Level3 true EditAndContinue + /utf-8 %(AdditionalOptions) _DEBUG;%(PreprocessorDefinitions) 0x0409 - ..\..\bin\icuuc58d.dll + ..\..\bin\icuuc60d.dll true true .\..\..\lib\icuucd.pdb @@ -181,13 +184,14 @@ .\x64\Release/ Level3 true + /utf-8 %(AdditionalOptions) NDEBUG;%(PreprocessorDefinitions) 0x0409 - ..\..\bin64\icuuc58.dll + ..\..\bin64\icuuc60.dll true .\..\..\lib64\icuuc.pdb true @@ -220,13 +224,14 @@ Level3 true ProgramDatabase + /utf-8 %(AdditionalOptions) _DEBUG;%(PreprocessorDefinitions) 0x0409 - ..\..\bin64\icuuc58d.dll + ..\..\bin64\icuuc60d.dll true true .\..\..\lib64\icuucd.pdb @@ -237,11 +242,11 @@ - - - - - + + + + + @@ -263,6 +268,8 @@ + + @@ -271,12 +278,12 @@ ..\i18n;%(AdditionalIncludeDirectories) ..\i18n;%(AdditionalIncludeDirectories) - - - - + + + + - + @@ -286,8 +293,8 @@ - - + + false false false @@ -299,59 +306,59 @@ false false - + false false false false - - - + + + false false false false - + - - - - + + + + - - - - - - + + + + + + - - - - + + + + - + - + false - + - - + + false - + false false false @@ -360,7 +367,7 @@ - + @@ -380,10 +387,10 @@ - + - - + + @@ -405,7 +412,7 @@ - + false @@ -417,8 +424,8 @@ - - + + @@ -440,15 +447,17 @@ + - + - + + @@ -460,7 +469,7 @@ - + @@ -476,7 +485,7 @@ - + @@ -566,6 +575,7 @@ + copy "%(FullPath)" ..\..\include\unicode @@ -1472,6 +1482,7 @@ ..\..\include\unicode\%(Filename)%(Extension);%(Outputs) + copy "%(FullPath)" ..\..\include\unicode @@ -1511,6 +1522,34 @@ ..\..\include\unicode\%(Filename)%(Extension);%(Outputs) copy "%(FullPath)" ..\..\include\unicode + + ..\..\include\unicode\%(Filename)%(Extension);%(Outputs) + + + copy "%(FullPath)" ..\..\include\unicode + + ..\..\include\unicode\%(Filename)%(Extension);%(Outputs) + copy "%(FullPath)" ..\..\include\unicode + + ..\..\include\unicode\%(Filename)%(Extension);%(Outputs) + copy "%(FullPath)" ..\..\include\unicode + + ..\..\include\unicode\%(Filename)%(Extension);%(Outputs) + copy "%(FullPath)" ..\..\include\unicode + + ..\..\include\unicode\%(Filename)%(Extension);%(Outputs) + + + copy "%(FullPath)" ..\..\include\unicode + + ..\..\include\unicode\%(Filename)%(Extension);%(Outputs) + copy "%(FullPath)" ..\..\include\unicode + + ..\..\include\unicode\%(Filename)%(Extension);%(Outputs) + copy "%(FullPath)" ..\..\include\unicode + + ..\..\include\unicode\%(Filename)%(Extension);%(Outputs) + copy "%(FullPath)" ..\..\include\unicode ..\..\include\unicode\%(Filename)%(Extension);%(Outputs) @@ -1532,6 +1571,20 @@ + + copy "%(FullPath)" ..\..\include\unicode + + ..\..\include\unicode\%(Filename)%(Extension);%(Outputs) + copy "%(FullPath)" ..\..\include\unicode + + ..\..\include\unicode\%(Filename)%(Extension);%(Outputs) + copy "%(FullPath)" ..\..\include\unicode + + ..\..\include\unicode\%(Filename)%(Extension);%(Outputs) + copy "%(FullPath)" ..\..\include\unicode + + ..\..\include\unicode\%(Filename)%(Extension);%(Outputs) + copy "%(FullPath)" ..\..\include\unicode @@ -1616,6 +1669,7 @@ ..\..\include\unicode\%(Filename)%(Extension);%(Outputs) + copy "%(FullPath)" ..\..\include\unicode @@ -1840,6 +1894,20 @@ ..\..\include\unicode\%(Filename)%(Extension);%(Outputs) copy "%(FullPath)" ..\..\include\unicode + + ..\..\include\unicode\%(Filename)%(Extension);%(Outputs) + + + copy "%(FullPath)" ..\..\include\unicode + + ..\..\include\unicode\%(Filename)%(Extension);%(Outputs) + copy "%(FullPath)" ..\..\include\unicode + + ..\..\include\unicode\%(Filename)%(Extension);%(Outputs) + copy "%(FullPath)" ..\..\include\unicode + + ..\..\include\unicode\%(Filename)%(Extension);%(Outputs) + copy "%(FullPath)" ..\..\include\unicode ..\..\include\unicode\%(Filename)%(Extension);%(Outputs) @@ -1856,4 +1924,4 @@ - \ No newline at end of file + diff --git a/Build/source/libs/icu/icu-src/source/common/common.vcxproj.filters b/Build/source/libs/icu/icu-src/source/common/common.vcxproj.filters index 56e8c12f04d..f13253be5c0 100644 --- a/Build/source/libs/icu/icu-src/source/common/common.vcxproj.filters +++ b/Build/source/libs/icu/icu-src/source/common/common.vcxproj.filters @@ -49,16 +49,16 @@ - + bidi - + bidi - + bidi - + bidi @@ -97,6 +97,9 @@ break iteration + + break iteration + break iteration @@ -106,22 +109,22 @@ collections - + collections - + collections - + collections - + collections collections - + collections @@ -154,31 +157,31 @@ configuration - + configuration - + configuration configuration - + configuration configuration - + configuration - + configuration - + configuration - + conversion @@ -187,13 +190,13 @@ conversion - + conversion - + conversion - + conversion @@ -202,49 +205,49 @@ conversion - + conversion - + conversion - + conversion - + conversion - + conversion - + conversion conversion - + conversion - + conversion - + conversion - + conversion conversion - + conversion conversion - + data & memory @@ -253,22 +256,22 @@ data & memory - + data & memory data & memory - + data & memory - + data & memory data & memory - + data & memory @@ -289,7 +292,7 @@ formatting - + formatting @@ -334,16 +337,16 @@ locales & resources - + locales & resources locales & resources - + locales & resources - + locales & resources @@ -391,7 +394,7 @@ properties & sets - + properties & sets @@ -418,10 +421,10 @@ properties & sets - + properties & sets - + properties & sets @@ -460,6 +463,9 @@ sprep + + strings + strings @@ -469,13 +475,16 @@ strings - + strings strings - + + strings + + strings @@ -493,7 +502,7 @@ strings - + strings @@ -541,7 +550,7 @@ strings - + strings @@ -568,7 +577,7 @@ break iteration - + conversion @@ -595,7 +604,7 @@ registration - + bidi @@ -633,6 +642,9 @@ break iteration + + break iteration + break iteration @@ -858,6 +870,9 @@ sprep + + strings + strings @@ -870,6 +885,9 @@ strings + + strings + strings @@ -1096,9 +1114,18 @@ strings + + strings + + + strings + strings + + strings + strings @@ -1180,5 +1207,8 @@ collections + + strings + \ No newline at end of file diff --git a/Build/source/libs/icu/icu-src/source/common/common_uwp.vcxproj b/Build/source/libs/icu/icu-src/source/common/common_uwp.vcxproj new file mode 100644 index 00000000000..72fbf41da10 --- /dev/null +++ b/Build/source/libs/icu/icu-src/source/common/common_uwp.vcxproj @@ -0,0 +1,949 @@ + + + + + Debug + Win32 + + + Debug + x64 + + + Debug + ARM + + + Release + Win32 + + + Release + x64 + + + Release + ARM + + + + {C10CF34B-3F79-430E-AD38-5A32DC0589C2} + DynamicLibrary + en-US + 14.0 + true + Windows Store + 10.0.10586.0 + 10.0.10240.0 + 10.0 + + + + DynamicLibrary + false + MultiByte + v140 + + + + + + + + + + + <_ProjectFileVersion>10.0.30319.1 + .\x86\ReleaseUWP\ + .\x86\ReleaseUWP\ + .\x86\DebugUWP\ + .\x86\DebugUWP\ + .\x64\ReleaseUWP\ + .\x64\ReleaseUWP\ + .\x64\DebugUWP\ + .\x64\DebugUWP\ + .\arm\ReleaseUWP\ + .\arm\ReleaseUWP\ + .\arm\DebugUWP\ + .\arm\DebugUWP\ + false + true + + + + + U_PLATFORM_HAS_WINUWP_API=1;%(PreprocessorDefinitions) + true + true + + + ..\..\include;..\common;%(AdditionalIncludeDirectories) + + + U_PLATFORM_HAS_WINUWP_API=1;U_ATTRIBUTE_DEPRECATED=;_CRT_SECURE_NO_DEPRECATE;U_COMMON_IMPLEMENTATION;U_PLATFORM_USES_ONLY_WIN32_API=1;%(PreprocessorDefinitions) + true + + + true + false + true + Level3 + true + Default + NotUsing + false + /utf-8 %(AdditionalOptions) + + + U_PLATFORM_HAS_WINUWP_API=1;%(PreprocessorDefinitions) + 0x0409 + ../common;%(AdditionalIncludeDirectories) + + + true + false + true + + + true + vccorlib.lib;msvcrt.lib + + + + + + NDEBUG;%(PreprocessorDefinitions) + + + NDEBUG;%(PreprocessorDefinitions) + MultiThreadedDLL + + + NDEBUG;%(PreprocessorDefinitions) + + + true + vccorlib.lib;WindowsApp.lib;msvcrt.lib;%(AdditionalDependencies) + + + + + + _DEBUG;%(PreprocessorDefinitions) + + + _DEBUG;%(PreprocessorDefinitions) + MultiThreadedDebugDLL + Disabled + EnableFastChecks + true + EditAndContinue + + + _DEBUG;%(PreprocessorDefinitions) + + + true + vccorlibd.lib;WindowsApp.lib;msvcrtd.lib;%(AdditionalDependencies) + + + + + + Win32 + + + WIN32;%(PreprocessorDefinitions) + + + + + + X64 + + + WIN64;WIN32;%(PreprocessorDefinitions) + + + MachineX64 + + + + + + ARM + + + ARM;WIN32;%(PreprocessorDefinitions) + + + MachineARM + + + + + + .\..\..\lib32uwp\icuuc.tlb + + + .\x86\ReleaseUWP/common.pch + .\x86\ReleaseUWP/ + .\x86\ReleaseUWP/ + .\x86\ReleaseUWP/ + + + ..\..\bin32uwp\icuuc60.dll + .\..\..\lib32uwp\icuuc.pdb + ..\..\lib32uwp\icuuc.lib + + + + + .\..\..\lib32uwp\icuucd.tlb + + + .\x86\DebugUWP/common.pch + .\x86\DebugUWP/ + .\x86\DebugUWP/ + .\x86\DebugUWP/ + + + ..\..\bin32uwp\icuuc60d.dll + .\..\..\lib32uwp\icuucd.pdb + ..\..\lib32uwp\icuucd.lib + + + + + .\..\..\lib64uwp\icuuc.tlb + + + .\x64\ReleaseUWP/common.pch + .\x64\ReleaseUWP/ + .\x64\ReleaseUWP/ + .\x64\ReleaseUWP/ + + + ..\..\bin64uwp\icuuc60.dll + .\..\..\lib64uwp\icuuc.pdb + ..\..\lib64uwp\icuuc.lib + + + + + .\..\..\lib64uwp\icuucd.tlb + + + .\x64\DebugUWP/common.pch + .\x64\DebugUWP/ + .\x64\DebugUWP/ + .\x64\DebugUWP/ + + + ..\..\bin64uwp\icuuc60d.dll + .\..\..\lib64uwp\icuucd.pdb + ..\..\lib64uwp\icuucd.lib + + + + + .\..\..\libARMuwp\icuuc.tlb + + + .\ARM\ReleaseUWP/common.pch + .\ARM\ReleaseUWP/ + .\ARM\ReleaseUWP/ + .\ARM\ReleaseUWP/ + + + ..\..\binARMuwp\icuuc60.dll + .\..\..\libARMuwp\icuuc.pdb + ..\..\libARMuwp\icuuc.lib + + + + + .\..\..\libARMuwp\icuucd.tlb + + + .\ARM\DebugUWP/common.pch + .\ARM\DebugUWP/ + .\ARM\DebugUWP/ + .\ARM\DebugUWP/ + + + ..\..\binARMuwp\icuuc60d.dll + .\..\..\libARMuwp\icuucd.pdb + ..\..\libARMuwp\icuucd.lib + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ..\i18n;%(AdditionalIncludeDirectories) + + + + + + + + + + + + + + + + + + + + true + + + + + + + true + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + copy "%(FullPath)" ..\..\include\unicode + ..\..\include\unicode\%(Filename)%(Extension);%(Outputs) + + + + + + + + + copy "%(FullPath)" ..\..\include\unicode + ..\..\include\unicode\%(Filename)%(Extension);%(Outputs) + + + + copy "%(FullPath)" ..\..\include\unicode + ..\..\include\unicode\%(Filename)%(Extension);%(Outputs) + + + copy "%(FullPath)" ..\..\include\unicode + ..\..\include\unicode\%(Filename)%(Extension);%(Outputs) + + + + copy "%(FullPath)" ..\..\include\unicode + ..\..\include\unicode\%(Filename)%(Extension);%(Outputs) + + + + + + + + + + + + copy "%(FullPath)" ..\..\include\unicode + ..\..\include\unicode\%(Filename)%(Extension);%(Outputs) + + + + + + + + + + + + + copy "%(FullPath)" ..\..\include\unicode + ..\..\include\unicode\%(Filename)%(Extension);%(Outputs) + + + + copy "%(FullPath)" ..\..\include\unicode + ..\..\include\unicode\%(Filename)%(Extension);%(Outputs) + + + + + + + copy "%(FullPath)" ..\..\include\unicode + ..\..\include\unicode\%(Filename)%(Extension);%(Outputs) + + + + + + + + + + + + + copy "%(FullPath)" ..\..\include\unicode + ..\..\include\unicode\%(Filename)%(Extension);%(Outputs) + + + copy "%(FullPath)" ..\..\include\unicode + ..\..\include\unicode\%(Filename)%(Extension);%(Outputs) + + + copy "%(FullPath)" ..\..\include\unicode + ..\..\include\unicode\%(Filename)%(Extension);%(Outputs) + + + + + copy "%(FullPath)" ..\..\include\unicode + ..\..\include\unicode\%(Filename)%(Extension);%(Outputs) + + + copy "%(FullPath)" ..\..\include\unicode + ..\..\include\unicode\%(Filename)%(Extension);%(Outputs) + + + copy "%(FullPath)" ..\..\include\unicode + ..\..\include\unicode\%(Filename)%(Extension);%(Outputs) + + + + copy "%(FullPath)" ..\..\include\unicode + ..\..\include\unicode\%(Filename)%(Extension);%(Outputs) + + + + copy "%(FullPath)" ..\..\include\unicode + ..\..\include\unicode\%(Filename)%(Extension);%(Outputs) + + + copy "%(FullPath)" ..\..\include\unicode + ..\..\include\unicode\%(Filename)%(Extension);%(Outputs) + + + + + copy "%(FullPath)" ..\..\include\unicode + ..\..\include\unicode\%(Filename)%(Extension);%(Outputs) + + + copy "%(FullPath)" ..\..\include\unicode + ..\..\include\unicode\%(Filename)%(Extension);%(Outputs) + + + + copy "%(FullPath)" ..\..\include\unicode + ..\..\include\unicode\%(Filename)%(Extension);%(Outputs) + + + copy "%(FullPath)" ..\..\include\unicode + ..\..\include\unicode\%(Filename)%(Extension);%(Outputs) + + + copy "%(FullPath)" ..\..\include\unicode + ..\..\include\unicode\%(Filename)%(Extension);%(Outputs) + + + + copy "%(FullPath)" ..\..\include\unicode + ..\..\include\unicode\%(Filename)%(Extension);%(Outputs) + + + + copy "%(FullPath)" ..\..\include\unicode + ..\..\include\unicode\%(Filename)%(Extension);%(Outputs) + + + + copy "%(FullPath)" ..\..\include\unicode + ..\..\include\unicode\%(Filename)%(Extension);%(Outputs) + + + + + + + copy "%(FullPath)" ..\..\include\unicode + ..\..\include\unicode\%(Filename)%(Extension);%(Outputs) + + + + copy "%(FullPath)" ..\..\include\unicode + ..\..\include\unicode\%(Filename)%(Extension);%(Outputs) + + + copy "%(FullPath)" ..\..\include\unicode + ..\..\include\unicode\%(Filename)%(Extension);%(Outputs) + + + + + + + copy "%(FullPath)" ..\..\include\unicode + ..\..\include\unicode\%(Filename)%(Extension);%(Outputs) + + + + + + copy "%(FullPath)" ..\..\include\unicode + ..\..\include\unicode\%(Filename)%(Extension);%(Outputs) + + + copy "%(FullPath)" ..\..\include\unicode + ..\..\include\unicode\%(Filename)%(Extension);%(Outputs) + + + copy "%(FullPath)" ..\..\include\unicode + ..\..\include\unicode\%(Filename)%(Extension);%(Outputs) + + + copy "%(FullPath)" ..\..\include\unicode + ..\..\include\unicode\%(Filename)%(Extension);%(Outputs) + + + copy "%(FullPath)" ..\..\include\unicode + ..\..\include\unicode\%(Filename)%(Extension);%(Outputs) + + + + + copy "%(FullPath)" ..\..\include\unicode + ..\..\include\unicode\%(Filename)%(Extension);%(Outputs) + + + + copy "%(FullPath)" ..\..\include\unicode + ..\..\include\unicode\%(Filename)%(Extension);%(Outputs) + + + + copy "%(FullPath)" ..\..\include\unicode + ..\..\include\unicode\%(Filename)%(Extension);%(Outputs) + + + + copy "%(FullPath)" ..\..\include\unicode + ..\..\include\unicode\%(Filename)%(Extension);%(Outputs) + + + + + copy "%(FullPath)" ..\..\include\unicode + ..\..\include\unicode\%(Filename)%(Extension);%(Outputs) + + + copy "%(FullPath)" ..\..\include\unicode + ..\..\include\unicode\%(Filename)%(Extension);%(Outputs) + + + copy "%(FullPath)" ..\..\include\unicode + ..\..\include\unicode\%(Filename)%(Extension);%(Outputs) + + + copy "%(FullPath)" ..\..\include\unicode + ..\..\include\unicode\%(Filename)%(Extension);%(Outputs) + + + copy "%(FullPath)" ..\..\include\unicode + ..\..\include\unicode\%(Filename)%(Extension);%(Outputs) + + + copy "%(FullPath)" ..\..\include\unicode + ..\..\include\unicode\%(Filename)%(Extension);%(Outputs) + + + + copy "%(FullPath)" ..\..\include\unicode + ..\..\include\unicode\%(Filename)%(Extension);%(Outputs) + + + + + + + + copy "%(FullPath)" ..\..\include\unicode + ..\..\include\unicode\%(Filename)%(Extension);%(Outputs) + + + + copy "%(FullPath)" ..\..\include\unicode + ..\..\include\unicode\%(Filename)%(Extension);%(Outputs) + + + + copy "%(FullPath)" ..\..\include\unicode + ..\..\include\unicode\%(Filename)%(Extension);%(Outputs) + + + + copy "%(FullPath)" ..\..\include\unicode + ..\..\include\unicode\%(Filename)%(Extension);%(Outputs) + + + copy "%(FullPath)" ..\..\include\unicode + ..\..\include\unicode\%(Filename)%(Extension);%(Outputs) + + + copy "%(FullPath)" ..\..\include\unicode + ..\..\include\unicode\%(Filename)%(Extension);%(Outputs) + + + + + + + + + copy "%(FullPath)" ..\..\include\unicode + ..\..\include\unicode\%(Filename)%(Extension);%(Outputs) + + + + copy "%(FullPath)" ..\..\include\unicode + ..\..\include\unicode\%(Filename)%(Extension);%(Outputs) + + + copy "%(FullPath)" ..\..\include\unicode + ..\..\include\unicode\%(Filename)%(Extension);%(Outputs) + + + copy "%(FullPath)" ..\..\include\unicode + ..\..\include\unicode\%(Filename)%(Extension);%(Outputs) + + + copy "%(FullPath)" ..\..\include\unicode + ..\..\include\unicode\%(Filename)%(Extension);%(Outputs) + + + copy "%(FullPath)" ..\..\include\unicode + ..\..\include\unicode\%(Filename)%(Extension);%(Outputs) + + + + + + copy "%(FullPath)" ..\..\include\unicode + ..\..\include\unicode\%(Filename)%(Extension);%(Outputs) + + + copy "%(FullPath)" ..\..\include\unicode + ..\..\include\unicode\%(Filename)%(Extension);%(Outputs) + + + + copy "%(FullPath)" ..\..\include\unicode + ..\..\include\unicode\%(Filename)%(Extension);%(Outputs) + + + copy "%(FullPath)" ..\..\include\unicode + ..\..\include\unicode\%(Filename)%(Extension);%(Outputs) + + + + + + + + copy "%(FullPath)" ..\..\include\unicode + ..\..\include\unicode\%(Filename)%(Extension);%(Outputs) + + + copy "%(FullPath)" ..\..\include\unicode + ..\..\include\unicode\%(Filename)%(Extension);%(Outputs) + + + + copy "%(FullPath)" ..\..\include\unicode + ..\..\include\unicode\%(Filename)%(Extension);%(Outputs) + + + copy "%(FullPath)" ..\..\include\unicode + ..\..\include\unicode\%(Filename)%(Extension);%(Outputs) + + + copy "%(FullPath)" ..\..\include\unicode + ..\..\include\unicode\%(Filename)%(Extension);%(Outputs) + + + copy "%(FullPath)" ..\..\include\unicode + ..\..\include\unicode\%(Filename)%(Extension);%(Outputs) + + + + + + + copy "%(FullPath)" ..\..\include\unicode + ..\..\include\unicode\%(Filename)%(Extension);%(Outputs) + + + copy "%(FullPath)" ..\..\include\unicode + ..\..\include\unicode\%(Filename)%(Extension);%(Outputs) + + + copy "%(FullPath)" ..\..\include\unicode + ..\..\include\unicode\%(Filename)%(Extension);%(Outputs) + + + copy "%(FullPath)" ..\..\include\unicode + ..\..\include\unicode\%(Filename)%(Extension);%(Outputs) + + + copy "%(FullPath)" ..\..\include\unicode + ..\..\include\unicode\%(Filename)%(Extension);%(Outputs) + + + copy "%(FullPath)" ..\..\include\unicode + ..\..\include\unicode\%(Filename)%(Extension);%(Outputs) + + + copy "%(FullPath)" ..\..\include\unicode + ..\..\include\unicode\%(Filename)%(Extension);%(Outputs) + + + copy "%(FullPath)" ..\..\include\unicode + ..\..\include\unicode\%(Filename)%(Extension);%(Outputs) + + + copy "%(FullPath)" ..\..\include\unicode + ..\..\include\unicode\%(Filename)%(Extension);%(Outputs) + + + + copy "%(FullPath)" ..\..\include\unicode + ..\..\include\unicode\%(Filename)%(Extension);%(Outputs) + + + copy "%(FullPath)" ..\..\include\unicode + ..\..\include\unicode\%(Filename)%(Extension);%(Outputs) + + + copy "%(FullPath)" ..\..\include\unicode + ..\..\include\unicode\%(Filename)%(Extension);%(Outputs) + + + + + copy "%(FullPath)" ..\..\include\unicode + ..\..\include\unicode\%(Filename)%(Extension);%(Outputs) + + + copy "%(FullPath)" ..\..\include\unicode + ..\..\include\unicode\%(Filename)%(Extension);%(Outputs) + + + copy "%(FullPath)" ..\..\include\unicode + ..\..\include\unicode\%(Filename)%(Extension);%(Outputs) + + + copy "%(FullPath)" ..\..\include\unicode + ..\..\include\unicode\%(Filename)%(Extension);%(Outputs) + + + copy "%(FullPath)" ..\..\include\unicode + ..\..\include\unicode\%(Filename)%(Extension);%(Outputs) + + + copy "%(FullPath)" ..\..\include\unicode + ..\..\include\unicode\%(Filename)%(Extension);%(Outputs) + + + copy "%(FullPath)" ..\..\include\unicode + ..\..\include\unicode\%(Filename)%(Extension);%(Outputs) + + + copy "%(FullPath)" ..\..\include\unicode + ..\..\include\unicode\%(Filename)%(Extension);%(Outputs) + + + copy "%(FullPath)" ..\..\include\unicode + ..\..\include\unicode\%(Filename)%(Extension);%(Outputs) + + + copy "%(FullPath)" ..\..\include\unicode + ..\..\include\unicode\%(Filename)%(Extension);%(Outputs) + + + copy "%(FullPath)" ..\..\include\unicode + ..\..\include\unicode\%(Filename)%(Extension);%(Outputs) + + + + + + + + + \ No newline at end of file diff --git a/Build/source/libs/icu/icu-src/source/common/cpputils.h b/Build/source/libs/icu/icu-src/source/common/cpputils.h index 57af69a7129..307e5704864 100644 --- a/Build/source/libs/icu/icu-src/source/common/cpputils.h +++ b/Build/source/libs/icu/icu-src/source/common/cpputils.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ****************************************************************************** @@ -8,7 +8,7 @@ * ****************************************************************************** * file name: cpputils.h -* encoding: US-ASCII +* encoding: UTF-8 * tab size: 8 (not used) * indentation:4 */ diff --git a/Build/source/libs/icu/icu-src/source/common/cstr.cpp b/Build/source/libs/icu/icu-src/source/common/cstr.cpp index a0006df18e6..24654f8fc22 100644 --- a/Build/source/libs/icu/icu-src/source/common/cstr.cpp +++ b/Build/source/libs/icu/icu-src/source/common/cstr.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* diff --git a/Build/source/libs/icu/icu-src/source/common/cstr.h b/Build/source/libs/icu/icu-src/source/common/cstr.h index 93b2e54c24f..c33f487ea12 100644 --- a/Build/source/libs/icu/icu-src/source/common/cstr.h +++ b/Build/source/libs/icu/icu-src/source/common/cstr.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ****************************************************************************** diff --git a/Build/source/libs/icu/icu-src/source/common/cstring.c b/Build/source/libs/icu/icu-src/source/common/cstring.c deleted file mode 100644 index eb6e021bc0c..00000000000 --- a/Build/source/libs/icu/icu-src/source/common/cstring.c +++ /dev/null @@ -1,341 +0,0 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. -// License & terms of use: http://www.unicode.org/copyright.html -/* -****************************************************************************** -* -* Copyright (C) 1997-2011, International Business Machines -* Corporation and others. All Rights Reserved. -* -****************************************************************************** -* -* File CSTRING.C -* -* @author Helena Shih -* -* Modification History: -* -* Date Name Description -* 6/18/98 hshih Created -* 09/08/98 stephen Added include for ctype, for Mac Port -* 11/15/99 helena Integrated S/390 IEEE changes. -****************************************************************************** -*/ - - - -#include -#include -#include "unicode/utypes.h" -#include "cmemory.h" -#include "cstring.h" -#include "uassert.h" - -/* - * We hardcode case conversion for invariant characters to match our expectation - * and the compiler execution charset. - * This prevents problems on systems - * - with non-default casing behavior, like Turkish system locales where - * tolower('I') maps to dotless i and toupper('i') maps to dotted I - * - where there are no lowercase Latin characters at all, or using different - * codes (some old EBCDIC codepages) - * - * This works because the compiler usually runs on a platform where the execution - * charset includes all of the invariant characters at their expected - * code positions, so that the char * string literals in ICU code match - * the char literals here. - * - * Note that the set of lowercase Latin letters is discontiguous in EBCDIC - * and the set of uppercase Latin letters is discontiguous as well. - */ - -U_CAPI UBool U_EXPORT2 -uprv_isASCIILetter(char c) { -#if U_CHARSET_FAMILY==U_EBCDIC_FAMILY - return - ('a'<=c && c<='i') || ('j'<=c && c<='r') || ('s'<=c && c<='z') || - ('A'<=c && c<='I') || ('J'<=c && c<='R') || ('S'<=c && c<='Z'); -#else - return ('a'<=c && c<='z') || ('A'<=c && c<='Z'); -#endif -} - -U_CAPI char U_EXPORT2 -uprv_toupper(char c) { -#if U_CHARSET_FAMILY==U_EBCDIC_FAMILY - if(('a'<=c && c<='i') || ('j'<=c && c<='r') || ('s'<=c && c<='z')) { - c=(char)(c+('A'-'a')); - } -#else - if('a'<=c && c<='z') { - c=(char)(c+('A'-'a')); - } -#endif - return c; -} - - -#if 0 -/* - * Commented out because cstring.h defines uprv_tolower() to be - * the same as either uprv_asciitolower() or uprv_ebcdictolower() - * to reduce the amount of code to cover with tests. - * - * Note that this uprv_tolower() definition is likely to work for most - * charset families, not just ASCII and EBCDIC, because its #else branch - * is written generically. - */ -U_CAPI char U_EXPORT2 -uprv_tolower(char c) { -#if U_CHARSET_FAMILY==U_EBCDIC_FAMILY - if(('A'<=c && c<='I') || ('J'<=c && c<='R') || ('S'<=c && c<='Z')) { - c=(char)(c+('a'-'A')); - } -#else - if('A'<=c && c<='Z') { - c=(char)(c+('a'-'A')); - } -#endif - return c; -} -#endif - -U_CAPI char U_EXPORT2 -uprv_asciitolower(char c) { - if(0x41<=c && c<=0x5a) { - c=(char)(c+0x20); - } - return c; -} - -U_CAPI char U_EXPORT2 -uprv_ebcdictolower(char c) { - if( (0xc1<=(uint8_t)c && (uint8_t)c<=0xc9) || - (0xd1<=(uint8_t)c && (uint8_t)c<=0xd9) || - (0xe2<=(uint8_t)c && (uint8_t)c<=0xe9) - ) { - c=(char)(c-0x40); - } - return c; -} - - -U_CAPI char* U_EXPORT2 -T_CString_toLowerCase(char* str) -{ - char* origPtr = str; - - if (str) { - do - *str = (char)uprv_tolower(*str); - while (*(str++)); - } - - return origPtr; -} - -U_CAPI char* U_EXPORT2 -T_CString_toUpperCase(char* str) -{ - char* origPtr = str; - - if (str) { - do - *str = (char)uprv_toupper(*str); - while (*(str++)); - } - - return origPtr; -} - -/* - * Takes a int32_t and fills in a char* string with that number "radix"-based. - * Does not handle negative values (makes an empty string for them). - * Writes at most 12 chars ("-2147483647" plus NUL). - * Returns the length of the string (not including the NUL). - */ -U_CAPI int32_t U_EXPORT2 -T_CString_integerToString(char* buffer, int32_t v, int32_t radix) -{ - char tbuf[30]; - int32_t tbx = sizeof(tbuf); - uint8_t digit; - int32_t length = 0; - uint32_t uval; - - U_ASSERT(radix>=2 && radix<=16); - uval = (uint32_t) v; - if(v<0 && radix == 10) { - /* Only in base 10 do we conside numbers to be signed. */ - uval = (uint32_t)(-v); - buffer[length++] = '-'; - } - - tbx = sizeof(tbuf)-1; - tbuf[tbx] = 0; /* We are generating the digits backwards. Null term the end. */ - do { - digit = (uint8_t)(uval % radix); - tbuf[--tbx] = (char)(T_CString_itosOffset(digit)); - uval = uval / radix; - } while (uval != 0); - - /* copy converted number into user buffer */ - uprv_strcpy(buffer+length, tbuf+tbx); - length += sizeof(tbuf) - tbx -1; - return length; -} - - - -/* - * Takes a int64_t and fills in a char* string with that number "radix"-based. - * Writes at most 21: chars ("-9223372036854775807" plus NUL). - * Returns the length of the string, not including the terminating NULL. - */ -U_CAPI int32_t U_EXPORT2 -T_CString_int64ToString(char* buffer, int64_t v, uint32_t radix) -{ - char tbuf[30]; - int32_t tbx = sizeof(tbuf); - uint8_t digit; - int32_t length = 0; - uint64_t uval; - - U_ASSERT(radix>=2 && radix<=16); - uval = (uint64_t) v; - if(v<0 && radix == 10) { - /* Only in base 10 do we conside numbers to be signed. */ - uval = (uint64_t)(-v); - buffer[length++] = '-'; - } - - tbx = sizeof(tbuf)-1; - tbuf[tbx] = 0; /* We are generating the digits backwards. Null term the end. */ - do { - digit = (uint8_t)(uval % radix); - tbuf[--tbx] = (char)(T_CString_itosOffset(digit)); - uval = uval / radix; - } while (uval != 0); - - /* copy converted number into user buffer */ - uprv_strcpy(buffer+length, tbuf+tbx); - length += sizeof(tbuf) - tbx -1; - return length; -} - - -U_CAPI int32_t U_EXPORT2 -T_CString_stringToInteger(const char *integerString, int32_t radix) -{ - char *end; - return uprv_strtoul(integerString, &end, radix); - -} - -U_CAPI int U_EXPORT2 -uprv_stricmp(const char *str1, const char *str2) { - if(str1==NULL) { - if(str2==NULL) { - return 0; - } else { - return -1; - } - } else if(str2==NULL) { - return 1; - } else { - /* compare non-NULL strings lexically with lowercase */ - int rc; - unsigned char c1, c2; - - for(;;) { - c1=(unsigned char)*str1; - c2=(unsigned char)*str2; - if(c1==0) { - if(c2==0) { - return 0; - } else { - return -1; - } - } else if(c2==0) { - return 1; - } else { - /* compare non-zero characters with lowercase */ - rc=(int)(unsigned char)uprv_tolower(c1)-(int)(unsigned char)uprv_tolower(c2); - if(rc!=0) { - return rc; - } - } - ++str1; - ++str2; - } - } -} - -U_CAPI int U_EXPORT2 -uprv_strnicmp(const char *str1, const char *str2, uint32_t n) { - if(str1==NULL) { - if(str2==NULL) { - return 0; - } else { - return -1; - } - } else if(str2==NULL) { - return 1; - } else { - /* compare non-NULL strings lexically with lowercase */ - int rc; - unsigned char c1, c2; - - for(; n--;) { - c1=(unsigned char)*str1; - c2=(unsigned char)*str2; - if(c1==0) { - if(c2==0) { - return 0; - } else { - return -1; - } - } else if(c2==0) { - return 1; - } else { - /* compare non-zero characters with lowercase */ - rc=(int)(unsigned char)uprv_tolower(c1)-(int)(unsigned char)uprv_tolower(c2); - if(rc!=0) { - return rc; - } - } - ++str1; - ++str2; - } - } - - return 0; -} - -U_CAPI char* U_EXPORT2 -uprv_strdup(const char *src) { - size_t len = uprv_strlen(src) + 1; - char *dup = (char *) uprv_malloc(len); - - if (dup) { - uprv_memcpy(dup, src, len); - } - - return dup; -} - -U_CAPI char* U_EXPORT2 -uprv_strndup(const char *src, int32_t n) { - char *dup; - - if(n < 0) { - dup = uprv_strdup(src); - } else { - dup = (char*)uprv_malloc(n+1); - if (dup) { - uprv_memcpy(dup, src, n); - dup[n] = 0; - } - } - - return dup; -} diff --git a/Build/source/libs/icu/icu-src/source/common/cstring.cpp b/Build/source/libs/icu/icu-src/source/common/cstring.cpp new file mode 100644 index 00000000000..06275c4b564 --- /dev/null +++ b/Build/source/libs/icu/icu-src/source/common/cstring.cpp @@ -0,0 +1,341 @@ +// © 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html +/* +****************************************************************************** +* +* Copyright (C) 1997-2011, International Business Machines +* Corporation and others. All Rights Reserved. +* +****************************************************************************** +* +* File CSTRING.C +* +* @author Helena Shih +* +* Modification History: +* +* Date Name Description +* 6/18/98 hshih Created +* 09/08/98 stephen Added include for ctype, for Mac Port +* 11/15/99 helena Integrated S/390 IEEE changes. +****************************************************************************** +*/ + + + +#include +#include +#include "unicode/utypes.h" +#include "cmemory.h" +#include "cstring.h" +#include "uassert.h" + +/* + * We hardcode case conversion for invariant characters to match our expectation + * and the compiler execution charset. + * This prevents problems on systems + * - with non-default casing behavior, like Turkish system locales where + * tolower('I') maps to dotless i and toupper('i') maps to dotted I + * - where there are no lowercase Latin characters at all, or using different + * codes (some old EBCDIC codepages) + * + * This works because the compiler usually runs on a platform where the execution + * charset includes all of the invariant characters at their expected + * code positions, so that the char * string literals in ICU code match + * the char literals here. + * + * Note that the set of lowercase Latin letters is discontiguous in EBCDIC + * and the set of uppercase Latin letters is discontiguous as well. + */ + +U_CAPI UBool U_EXPORT2 +uprv_isASCIILetter(char c) { +#if U_CHARSET_FAMILY==U_EBCDIC_FAMILY + return + ('a'<=c && c<='i') || ('j'<=c && c<='r') || ('s'<=c && c<='z') || + ('A'<=c && c<='I') || ('J'<=c && c<='R') || ('S'<=c && c<='Z'); +#else + return ('a'<=c && c<='z') || ('A'<=c && c<='Z'); +#endif +} + +U_CAPI char U_EXPORT2 +uprv_toupper(char c) { +#if U_CHARSET_FAMILY==U_EBCDIC_FAMILY + if(('a'<=c && c<='i') || ('j'<=c && c<='r') || ('s'<=c && c<='z')) { + c=(char)(c+('A'-'a')); + } +#else + if('a'<=c && c<='z') { + c=(char)(c+('A'-'a')); + } +#endif + return c; +} + + +#if 0 +/* + * Commented out because cstring.h defines uprv_tolower() to be + * the same as either uprv_asciitolower() or uprv_ebcdictolower() + * to reduce the amount of code to cover with tests. + * + * Note that this uprv_tolower() definition is likely to work for most + * charset families, not just ASCII and EBCDIC, because its #else branch + * is written generically. + */ +U_CAPI char U_EXPORT2 +uprv_tolower(char c) { +#if U_CHARSET_FAMILY==U_EBCDIC_FAMILY + if(('A'<=c && c<='I') || ('J'<=c && c<='R') || ('S'<=c && c<='Z')) { + c=(char)(c+('a'-'A')); + } +#else + if('A'<=c && c<='Z') { + c=(char)(c+('a'-'A')); + } +#endif + return c; +} +#endif + +U_CAPI char U_EXPORT2 +uprv_asciitolower(char c) { + if(0x41<=c && c<=0x5a) { + c=(char)(c+0x20); + } + return c; +} + +U_CAPI char U_EXPORT2 +uprv_ebcdictolower(char c) { + if( (0xc1<=(uint8_t)c && (uint8_t)c<=0xc9) || + (0xd1<=(uint8_t)c && (uint8_t)c<=0xd9) || + (0xe2<=(uint8_t)c && (uint8_t)c<=0xe9) + ) { + c=(char)(c-0x40); + } + return c; +} + + +U_CAPI char* U_EXPORT2 +T_CString_toLowerCase(char* str) +{ + char* origPtr = str; + + if (str) { + do + *str = (char)uprv_tolower(*str); + while (*(str++)); + } + + return origPtr; +} + +U_CAPI char* U_EXPORT2 +T_CString_toUpperCase(char* str) +{ + char* origPtr = str; + + if (str) { + do + *str = (char)uprv_toupper(*str); + while (*(str++)); + } + + return origPtr; +} + +/* + * Takes a int32_t and fills in a char* string with that number "radix"-based. + * Does not handle negative values (makes an empty string for them). + * Writes at most 12 chars ("-2147483647" plus NUL). + * Returns the length of the string (not including the NUL). + */ +U_CAPI int32_t U_EXPORT2 +T_CString_integerToString(char* buffer, int32_t v, int32_t radix) +{ + char tbuf[30]; + int32_t tbx = sizeof(tbuf); + uint8_t digit; + int32_t length = 0; + uint32_t uval; + + U_ASSERT(radix>=2 && radix<=16); + uval = (uint32_t) v; + if(v<0 && radix == 10) { + /* Only in base 10 do we conside numbers to be signed. */ + uval = (uint32_t)(-v); + buffer[length++] = '-'; + } + + tbx = sizeof(tbuf)-1; + tbuf[tbx] = 0; /* We are generating the digits backwards. Null term the end. */ + do { + digit = (uint8_t)(uval % radix); + tbuf[--tbx] = (char)(T_CString_itosOffset(digit)); + uval = uval / radix; + } while (uval != 0); + + /* copy converted number into user buffer */ + uprv_strcpy(buffer+length, tbuf+tbx); + length += sizeof(tbuf) - tbx -1; + return length; +} + + + +/* + * Takes a int64_t and fills in a char* string with that number "radix"-based. + * Writes at most 21: chars ("-9223372036854775807" plus NUL). + * Returns the length of the string, not including the terminating NULL. + */ +U_CAPI int32_t U_EXPORT2 +T_CString_int64ToString(char* buffer, int64_t v, uint32_t radix) +{ + char tbuf[30]; + int32_t tbx = sizeof(tbuf); + uint8_t digit; + int32_t length = 0; + uint64_t uval; + + U_ASSERT(radix>=2 && radix<=16); + uval = (uint64_t) v; + if(v<0 && radix == 10) { + /* Only in base 10 do we conside numbers to be signed. */ + uval = (uint64_t)(-v); + buffer[length++] = '-'; + } + + tbx = sizeof(tbuf)-1; + tbuf[tbx] = 0; /* We are generating the digits backwards. Null term the end. */ + do { + digit = (uint8_t)(uval % radix); + tbuf[--tbx] = (char)(T_CString_itosOffset(digit)); + uval = uval / radix; + } while (uval != 0); + + /* copy converted number into user buffer */ + uprv_strcpy(buffer+length, tbuf+tbx); + length += sizeof(tbuf) - tbx -1; + return length; +} + + +U_CAPI int32_t U_EXPORT2 +T_CString_stringToInteger(const char *integerString, int32_t radix) +{ + char *end; + return uprv_strtoul(integerString, &end, radix); + +} + +U_CAPI int U_EXPORT2 +uprv_stricmp(const char *str1, const char *str2) { + if(str1==NULL) { + if(str2==NULL) { + return 0; + } else { + return -1; + } + } else if(str2==NULL) { + return 1; + } else { + /* compare non-NULL strings lexically with lowercase */ + int rc; + unsigned char c1, c2; + + for(;;) { + c1=(unsigned char)*str1; + c2=(unsigned char)*str2; + if(c1==0) { + if(c2==0) { + return 0; + } else { + return -1; + } + } else if(c2==0) { + return 1; + } else { + /* compare non-zero characters with lowercase */ + rc=(int)(unsigned char)uprv_tolower(c1)-(int)(unsigned char)uprv_tolower(c2); + if(rc!=0) { + return rc; + } + } + ++str1; + ++str2; + } + } +} + +U_CAPI int U_EXPORT2 +uprv_strnicmp(const char *str1, const char *str2, uint32_t n) { + if(str1==NULL) { + if(str2==NULL) { + return 0; + } else { + return -1; + } + } else if(str2==NULL) { + return 1; + } else { + /* compare non-NULL strings lexically with lowercase */ + int rc; + unsigned char c1, c2; + + for(; n--;) { + c1=(unsigned char)*str1; + c2=(unsigned char)*str2; + if(c1==0) { + if(c2==0) { + return 0; + } else { + return -1; + } + } else if(c2==0) { + return 1; + } else { + /* compare non-zero characters with lowercase */ + rc=(int)(unsigned char)uprv_tolower(c1)-(int)(unsigned char)uprv_tolower(c2); + if(rc!=0) { + return rc; + } + } + ++str1; + ++str2; + } + } + + return 0; +} + +U_CAPI char* U_EXPORT2 +uprv_strdup(const char *src) { + size_t len = uprv_strlen(src) + 1; + char *dup = (char *) uprv_malloc(len); + + if (dup) { + uprv_memcpy(dup, src, len); + } + + return dup; +} + +U_CAPI char* U_EXPORT2 +uprv_strndup(const char *src, int32_t n) { + char *dup; + + if(n < 0) { + dup = uprv_strdup(src); + } else { + dup = (char*)uprv_malloc(n+1); + if (dup) { + uprv_memcpy(dup, src, n); + dup[n] = 0; + } + } + + return dup; +} diff --git a/Build/source/libs/icu/icu-src/source/common/cstring.h b/Build/source/libs/icu/icu-src/source/common/cstring.h index 238cb3138f2..2232efcda5c 100644 --- a/Build/source/libs/icu/icu-src/source/common/cstring.h +++ b/Build/source/libs/icu/icu-src/source/common/cstring.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ****************************************************************************** diff --git a/Build/source/libs/icu/icu-src/source/common/cwchar.c b/Build/source/libs/icu/icu-src/source/common/cwchar.c deleted file mode 100644 index 4c469ce0ef7..00000000000 --- a/Build/source/libs/icu/icu-src/source/common/cwchar.c +++ /dev/null @@ -1,55 +0,0 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. -// License & terms of use: http://www.unicode.org/copyright.html -/* -****************************************************************************** -* -* Copyright (C) 2001, International Business Machines -* Corporation and others. All Rights Reserved. -* -****************************************************************************** -* file name: cwchar.c -* encoding: US-ASCII -* tab size: 8 (not used) -* indentation:4 -* -* created on: 2001may25 -* created by: Markus W. Scherer -*/ - -#include "unicode/utypes.h" - -#if !U_HAVE_WCSCPY - -#include "cwchar.h" - -U_CAPI wchar_t *uprv_wcscat(wchar_t *dst, const wchar_t *src) { - wchar_t *start=dst; - while(*dst!=0) { - ++dst; - } - while((*dst=*src)!=0) { - ++dst; - ++src; - } - return start; -} - -U_CAPI wchar_t *uprv_wcscpy(wchar_t *dst, const wchar_t *src) { - wchar_t *start=dst; - while((*dst=*src)!=0) { - ++dst; - ++src; - } - return start; -} - -U_CAPI size_t uprv_wcslen(const wchar_t *src) { - const wchar_t *start=src; - while(*src!=0) { - ++src; - } - return src-start; -} - -#endif - diff --git a/Build/source/libs/icu/icu-src/source/common/cwchar.cpp b/Build/source/libs/icu/icu-src/source/common/cwchar.cpp new file mode 100644 index 00000000000..20c7d71e0f0 --- /dev/null +++ b/Build/source/libs/icu/icu-src/source/common/cwchar.cpp @@ -0,0 +1,55 @@ +// © 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html +/* +****************************************************************************** +* +* Copyright (C) 2001, International Business Machines +* Corporation and others. All Rights Reserved. +* +****************************************************************************** +* file name: cwchar.c +* encoding: UTF-8 +* tab size: 8 (not used) +* indentation:4 +* +* created on: 2001may25 +* created by: Markus W. Scherer +*/ + +#include "unicode/utypes.h" + +#if !U_HAVE_WCSCPY + +#include "cwchar.h" + +U_CAPI wchar_t *uprv_wcscat(wchar_t *dst, const wchar_t *src) { + wchar_t *start=dst; + while(*dst!=0) { + ++dst; + } + while((*dst=*src)!=0) { + ++dst; + ++src; + } + return start; +} + +U_CAPI wchar_t *uprv_wcscpy(wchar_t *dst, const wchar_t *src) { + wchar_t *start=dst; + while((*dst=*src)!=0) { + ++dst; + ++src; + } + return start; +} + +U_CAPI size_t uprv_wcslen(const wchar_t *src) { + const wchar_t *start=src; + while(*src!=0) { + ++src; + } + return src-start; +} + +#endif + diff --git a/Build/source/libs/icu/icu-src/source/common/cwchar.h b/Build/source/libs/icu/icu-src/source/common/cwchar.h index c8c3497f7c0..8fd041a1b9c 100644 --- a/Build/source/libs/icu/icu-src/source/common/cwchar.h +++ b/Build/source/libs/icu/icu-src/source/common/cwchar.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ****************************************************************************** @@ -8,7 +8,7 @@ * ****************************************************************************** * file name: cwchar.h -* encoding: US-ASCII +* encoding: UTF-8 * tab size: 8 (not used) * indentation:4 * diff --git a/Build/source/libs/icu/icu-src/source/common/dictbe.cpp b/Build/source/libs/icu/icu-src/source/common/dictbe.cpp index 924f09bd5dd..18fa188a7ed 100644 --- a/Build/source/libs/icu/icu-src/source/common/dictbe.cpp +++ b/Build/source/libs/icu/icu-src/source/common/dictbe.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /** ******************************************************************************* @@ -46,9 +46,9 @@ int32_t DictionaryBreakEngine::findBreaks( UText *text, int32_t startPos, int32_t endPos, - UBool reverse, int32_t breakType, - UStack &foundBreaks ) const { + UVector32 &foundBreaks ) const { + (void)startPos; // TODO: remove this param? int32_t result = 0; // Find the span of characters included in the set. @@ -60,34 +60,12 @@ DictionaryBreakEngine::findBreaks( UText *text, int32_t rangeStart; int32_t rangeEnd; UChar32 c = utext_current32(text); - if (reverse) { - UBool isDict = fSet.contains(c); - while((current = (int32_t)utext_getNativeIndex(text)) > startPos && isDict) { - c = utext_previous32(text); - isDict = fSet.contains(c); - } - if (current < startPos) { - rangeStart = startPos; - } else { - rangeStart = current; - if (!isDict) { - utext_next32(text); - rangeStart = (int32_t)utext_getNativeIndex(text); - } - } - // rangeEnd = start + 1; - utext_setNativeIndex(text, start); - utext_next32(text); - rangeEnd = (int32_t)utext_getNativeIndex(text); - } - else { - while((current = (int32_t)utext_getNativeIndex(text)) < endPos && fSet.contains(c)) { - utext_next32(text); // TODO: recast loop for postincrement - c = utext_current32(text); - } - rangeStart = start; - rangeEnd = current; + while((current = (int32_t)utext_getNativeIndex(text)) < endPos && fSet.contains(c)) { + utext_next32(text); // TODO: recast loop for postincrement + c = utext_current32(text); } + rangeStart = start; + rangeEnd = current; if (breakType >= 0 && breakType < 32 && (((uint32_t)1 << breakType) & fTypes)) { result = divideUpDictionaryRange(text, rangeStart, rangeEnd, foundBreaks); utext_setNativeIndex(text, current); @@ -248,7 +226,7 @@ int32_t ThaiBreakEngine::divideUpDictionaryRange( UText *text, int32_t rangeStart, int32_t rangeEnd, - UStack &foundBreaks ) const { + UVector32 &foundBreaks ) const { utext_setNativeIndex(text, rangeStart); utext_moveIndex32(text, THAI_MIN_WORD_SPAN); if (utext_getNativeIndex(text) >= rangeEnd) { @@ -487,7 +465,7 @@ int32_t LaoBreakEngine::divideUpDictionaryRange( UText *text, int32_t rangeStart, int32_t rangeEnd, - UStack &foundBreaks ) const { + UVector32 &foundBreaks ) const { if ((rangeEnd - rangeStart) < LAO_MIN_WORD_SPAN) { return 0; // Not enough characters for two words } @@ -680,7 +658,7 @@ int32_t BurmeseBreakEngine::divideUpDictionaryRange( UText *text, int32_t rangeStart, int32_t rangeEnd, - UStack &foundBreaks ) const { + UVector32 &foundBreaks ) const { if ((rangeEnd - rangeStart) < BURMESE_MIN_WORD_SPAN) { return 0; // Not enough characters for two words } @@ -885,7 +863,7 @@ int32_t KhmerBreakEngine::divideUpDictionaryRange( UText *text, int32_t rangeStart, int32_t rangeEnd, - UStack &foundBreaks ) const { + UVector32 &foundBreaks ) const { if ((rangeEnd - rangeStart) < KHMER_MIN_WORD_SPAN) { return 0; // Not enough characters for two words } @@ -1110,9 +1088,9 @@ static inline uint32_t getKatakanaCost(int32_t wordLength){ return (wordLength > kMaxKatakanaLength) ? 8192 : katakanaCost[wordLength]; } -static inline bool isKatakana(uint16_t value) { - return (value >= 0x30A1u && value <= 0x30FEu && value != 0x30FBu) || - (value >= 0xFF66u && value <= 0xFF9fu); +static inline bool isKatakana(UChar32 value) { + return (value >= 0x30A1 && value <= 0x30FE && value != 0x30FB) || + (value >= 0xFF66 && value <= 0xFF9f); } @@ -1128,14 +1106,14 @@ static inline int32_t utext_i32_flag(int32_t bitIndex) { * @param text A UText representing the text * @param rangeStart The start of the range of dictionary characters * @param rangeEnd The end of the range of dictionary characters - * @param foundBreaks Output of C array of int32_t break positions, or 0 + * @param foundBreaks vector to receive the break positions * @return The number of breaks found */ int32_t CjkBreakEngine::divideUpDictionaryRange( UText *inText, int32_t rangeStart, int32_t rangeEnd, - UStack &foundBreaks ) const { + UVector32 &foundBreaks ) const { if (rangeStart >= rangeEnd) { return 0; } @@ -1385,13 +1363,27 @@ CjkBreakEngine::divideUpDictionaryRange( UText *inText, // Now that we're done, convert positions in t_boundary[] (indices in // the normalized input string) back to indices in the original input UText // while reversing t_boundary and pushing values to foundBreaks. + int32_t prevCPPos = -1; + int32_t prevUTextPos = -1; for (int32_t i = numBreaks-1; i >= 0; i--) { int32_t cpPos = t_boundary.elementAti(i); + U_ASSERT(cpPos > prevCPPos); int32_t utextPos = inputMap.isValid() ? inputMap->elementAti(cpPos) : cpPos + rangeStart; - // Boundaries are added to foundBreaks output in ascending order. - U_ASSERT(foundBreaks.size() == 0 ||foundBreaks.peeki() < utextPos); - foundBreaks.push(utextPos, status); + U_ASSERT(utextPos >= prevUTextPos); + if (utextPos > prevUTextPos) { + // Boundaries are added to foundBreaks output in ascending order. + U_ASSERT(foundBreaks.size() == 0 || foundBreaks.peeki() < utextPos); + foundBreaks.push(utextPos, status); + } else { + // Normalization expanded the input text, the dictionary found a boundary + // within the expansion, giving two boundaries with the same index in the + // original text. Ignore the second. See ticket #12918. + --numBreaks; + } + prevCPPos = cpPos; + prevUTextPos = utextPos; } + (void)prevCPPos; // suppress compiler warnings about unused variable // inString goes out of scope // inputMap goes out of scope diff --git a/Build/source/libs/icu/icu-src/source/common/dictbe.h b/Build/source/libs/icu/icu-src/source/common/dictbe.h index 9390e92b0d5..de1d49f6935 100644 --- a/Build/source/libs/icu/icu-src/source/common/dictbe.h +++ b/Build/source/libs/icu/icu-src/source/common/dictbe.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /** ******************************************************************************* @@ -15,6 +15,7 @@ #include "unicode/utext.h" #include "brkeng.h" +#include "uvectr32.h" U_NAMESPACE_BEGIN @@ -84,21 +85,18 @@ class DictionaryBreakEngine : public LanguageBreakEngine { * * @param text A UText representing the text. The iterator is left at * the end of the run of characters which the engine is capable of handling - * that starts from the first (or last) character in the range. + * that starts from the first character in the range. * @param startPos The start of the run within the supplied text. * @param endPos The end of the run within the supplied text. - * @param reverse Whether the caller is looking for breaks in a reverse - * direction. * @param breakType The type of break desired, or -1. - * @param foundBreaks An allocated C array of the breaks found, if any + * @param foundBreaks vector of int32_t to receive the break positions * @return The number of breaks found. */ virtual int32_t findBreaks( UText *text, int32_t startPos, int32_t endPos, - UBool reverse, int32_t breakType, - UStack &foundBreaks ) const; + UVector32 &foundBreaks ) const; protected: @@ -128,7 +126,7 @@ class DictionaryBreakEngine : public LanguageBreakEngine { virtual int32_t divideUpDictionaryRange( UText *text, int32_t rangeStart, int32_t rangeEnd, - UStack &foundBreaks ) const = 0; + UVector32 &foundBreaks ) const = 0; }; @@ -185,7 +183,7 @@ class ThaiBreakEngine : public DictionaryBreakEngine { virtual int32_t divideUpDictionaryRange( UText *text, int32_t rangeStart, int32_t rangeEnd, - UStack &foundBreaks ) const; + UVector32 &foundBreaks ) const; }; @@ -241,7 +239,7 @@ class LaoBreakEngine : public DictionaryBreakEngine { virtual int32_t divideUpDictionaryRange( UText *text, int32_t rangeStart, int32_t rangeEnd, - UStack &foundBreaks ) const; + UVector32 &foundBreaks ) const; }; @@ -297,7 +295,7 @@ class BurmeseBreakEngine : public DictionaryBreakEngine { virtual int32_t divideUpDictionaryRange( UText *text, int32_t rangeStart, int32_t rangeEnd, - UStack &foundBreaks ) const; + UVector32 &foundBreaks ) const; }; @@ -353,7 +351,7 @@ class KhmerBreakEngine : public DictionaryBreakEngine { virtual int32_t divideUpDictionaryRange( UText *text, int32_t rangeStart, int32_t rangeEnd, - UStack &foundBreaks ) const; + UVector32 &foundBreaks ) const; }; @@ -417,7 +415,7 @@ class CjkBreakEngine : public DictionaryBreakEngine { virtual int32_t divideUpDictionaryRange( UText *text, int32_t rangeStart, int32_t rangeEnd, - UStack &foundBreaks ) const; + UVector32 &foundBreaks ) const; }; diff --git a/Build/source/libs/icu/icu-src/source/common/dictionarydata.cpp b/Build/source/libs/icu/icu-src/source/common/dictionarydata.cpp index 00f66369e36..6e2dbee5b61 100644 --- a/Build/source/libs/icu/icu-src/source/common/dictionarydata.cpp +++ b/Build/source/libs/icu/icu-src/source/common/dictionarydata.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* diff --git a/Build/source/libs/icu/icu-src/source/common/dictionarydata.h b/Build/source/libs/icu/icu-src/source/common/dictionarydata.h index 6f8852c620e..73b7d6753ba 100644 --- a/Build/source/libs/icu/icu-src/source/common/dictionarydata.h +++ b/Build/source/libs/icu/icu-src/source/common/dictionarydata.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* diff --git a/Build/source/libs/icu/icu-src/source/common/dtintrv.cpp b/Build/source/libs/icu/icu-src/source/common/dtintrv.cpp index f3313d5ebfd..80bb5d6dbd1 100644 --- a/Build/source/libs/icu/icu-src/source/common/dtintrv.cpp +++ b/Build/source/libs/icu/icu-src/source/common/dtintrv.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /******************************************************************************* * Copyright (C) 2008, International Business Machines Corporation and diff --git a/Build/source/libs/icu/icu-src/source/common/edits.cpp b/Build/source/libs/icu/icu-src/source/common/edits.cpp new file mode 100644 index 00000000000..9ec005624fe --- /dev/null +++ b/Build/source/libs/icu/icu-src/source/common/edits.cpp @@ -0,0 +1,776 @@ +// © 2017 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html + +// edits.cpp +// created: 2017feb08 Markus W. Scherer + +#include "unicode/utypes.h" +#include "unicode/edits.h" +#include "cmemory.h" +#include "uassert.h" + +U_NAMESPACE_BEGIN + +namespace { + +// 0000uuuuuuuuuuuu records u+1 unchanged text units. +const int32_t MAX_UNCHANGED_LENGTH = 0x1000; +const int32_t MAX_UNCHANGED = MAX_UNCHANGED_LENGTH - 1; + +// 0mmmnnnccccccccc with m=1..6 records ccc+1 replacements of m:n text units. +const int32_t MAX_SHORT_CHANGE_OLD_LENGTH = 6; +const int32_t MAX_SHORT_CHANGE_NEW_LENGTH = 7; +const int32_t SHORT_CHANGE_NUM_MASK = 0x1ff; +const int32_t MAX_SHORT_CHANGE = 0x6fff; + +// 0111mmmmmmnnnnnn records a replacement of m text units with n. +// m or n = 61: actual length follows in the next edits array unit. +// m or n = 62..63: actual length follows in the next two edits array units. +// Bit 30 of the actual length is in the head unit. +// Trailing units have bit 15 set. +const int32_t LENGTH_IN_1TRAIL = 61; +const int32_t LENGTH_IN_2TRAIL = 62; + +} // namespace + +void Edits::releaseArray() U_NOEXCEPT { + if (array != stackArray) { + uprv_free(array); + } +} + +Edits &Edits::copyArray(const Edits &other) { + if (U_FAILURE(errorCode_)) { + length = delta = numChanges = 0; + return *this; + } + if (length > capacity) { + uint16_t *newArray = (uint16_t *)uprv_malloc((size_t)length * 2); + if (newArray == nullptr) { + length = delta = numChanges = 0; + errorCode_ = U_MEMORY_ALLOCATION_ERROR; + return *this; + } + releaseArray(); + array = newArray; + capacity = length; + } + if (length > 0) { + uprv_memcpy(array, other.array, (size_t)length * 2); + } + return *this; +} + +Edits &Edits::moveArray(Edits &src) U_NOEXCEPT { + if (U_FAILURE(errorCode_)) { + length = delta = numChanges = 0; + return *this; + } + releaseArray(); + if (length > STACK_CAPACITY) { + array = src.array; + capacity = src.capacity; + src.array = src.stackArray; + src.capacity = STACK_CAPACITY; + src.reset(); + return *this; + } + array = stackArray; + capacity = STACK_CAPACITY; + if (length > 0) { + uprv_memcpy(array, src.array, (size_t)length * 2); + } + return *this; +} + +Edits &Edits::operator=(const Edits &other) { + length = other.length; + delta = other.delta; + numChanges = other.numChanges; + errorCode_ = other.errorCode_; + return copyArray(other); +} + +Edits &Edits::operator=(Edits &&src) U_NOEXCEPT { + length = src.length; + delta = src.delta; + numChanges = src.numChanges; + errorCode_ = src.errorCode_; + return moveArray(src); +} + +Edits::~Edits() { + releaseArray(); +} + +void Edits::reset() U_NOEXCEPT { + length = delta = numChanges = 0; + errorCode_ = U_ZERO_ERROR; +} + +void Edits::addUnchanged(int32_t unchangedLength) { + if(U_FAILURE(errorCode_) || unchangedLength == 0) { return; } + if(unchangedLength < 0) { + errorCode_ = U_ILLEGAL_ARGUMENT_ERROR; + return; + } + // Merge into previous unchanged-text record, if any. + int32_t last = lastUnit(); + if(last < MAX_UNCHANGED) { + int32_t remaining = MAX_UNCHANGED - last; + if (remaining >= unchangedLength) { + setLastUnit(last + unchangedLength); + return; + } + setLastUnit(MAX_UNCHANGED); + unchangedLength -= remaining; + } + // Split large lengths into multiple units. + while(unchangedLength >= MAX_UNCHANGED_LENGTH) { + append(MAX_UNCHANGED); + unchangedLength -= MAX_UNCHANGED_LENGTH; + } + // Write a small (remaining) length. + if(unchangedLength > 0) { + append(unchangedLength - 1); + } +} + +void Edits::addReplace(int32_t oldLength, int32_t newLength) { + if(U_FAILURE(errorCode_)) { return; } + if(oldLength < 0 || newLength < 0) { + errorCode_ = U_ILLEGAL_ARGUMENT_ERROR; + return; + } + if (oldLength == 0 && newLength == 0) { + return; + } + ++numChanges; + int32_t newDelta = newLength - oldLength; + if (newDelta != 0) { + if ((newDelta > 0 && delta >= 0 && newDelta > (INT32_MAX - delta)) || + (newDelta < 0 && delta < 0 && newDelta < (INT32_MIN - delta))) { + // Integer overflow or underflow. + errorCode_ = U_INDEX_OUTOFBOUNDS_ERROR; + return; + } + delta += newDelta; + } + + if(0 < oldLength && oldLength <= MAX_SHORT_CHANGE_OLD_LENGTH && + newLength <= MAX_SHORT_CHANGE_NEW_LENGTH) { + // Merge into previous same-lengths short-replacement record, if any. + int32_t u = (oldLength << 12) | (newLength << 9); + int32_t last = lastUnit(); + if(MAX_UNCHANGED < last && last < MAX_SHORT_CHANGE && + (last & ~SHORT_CHANGE_NUM_MASK) == u && + (last & SHORT_CHANGE_NUM_MASK) < SHORT_CHANGE_NUM_MASK) { + setLastUnit(last + 1); + return; + } + append(u); + return; + } + + int32_t head = 0x7000; + if (oldLength < LENGTH_IN_1TRAIL && newLength < LENGTH_IN_1TRAIL) { + head |= oldLength << 6; + head |= newLength; + append(head); + } else if ((capacity - length) >= 5 || growArray()) { + int32_t limit = length + 1; + if(oldLength < LENGTH_IN_1TRAIL) { + head |= oldLength << 6; + } else if(oldLength <= 0x7fff) { + head |= LENGTH_IN_1TRAIL << 6; + array[limit++] = (uint16_t)(0x8000 | oldLength); + } else { + head |= (LENGTH_IN_2TRAIL + (oldLength >> 30)) << 6; + array[limit++] = (uint16_t)(0x8000 | (oldLength >> 15)); + array[limit++] = (uint16_t)(0x8000 | oldLength); + } + if(newLength < LENGTH_IN_1TRAIL) { + head |= newLength; + } else if(newLength <= 0x7fff) { + head |= LENGTH_IN_1TRAIL; + array[limit++] = (uint16_t)(0x8000 | newLength); + } else { + head |= LENGTH_IN_2TRAIL + (newLength >> 30); + array[limit++] = (uint16_t)(0x8000 | (newLength >> 15)); + array[limit++] = (uint16_t)(0x8000 | newLength); + } + array[length] = (uint16_t)head; + length = limit; + } +} + +void Edits::append(int32_t r) { + if(length < capacity || growArray()) { + array[length++] = (uint16_t)r; + } +} + +UBool Edits::growArray() { + int32_t newCapacity; + if (array == stackArray) { + newCapacity = 2000; + } else if (capacity == INT32_MAX) { + // Not U_BUFFER_OVERFLOW_ERROR because that could be confused on a string transform API + // with a result-string-buffer overflow. + errorCode_ = U_INDEX_OUTOFBOUNDS_ERROR; + return FALSE; + } else if (capacity >= (INT32_MAX / 2)) { + newCapacity = INT32_MAX; + } else { + newCapacity = 2 * capacity; + } + // Grow by at least 5 units so that a maximal change record will fit. + if ((newCapacity - capacity) < 5) { + errorCode_ = U_INDEX_OUTOFBOUNDS_ERROR; + return FALSE; + } + uint16_t *newArray = (uint16_t *)uprv_malloc((size_t)newCapacity * 2); + if (newArray == NULL) { + errorCode_ = U_MEMORY_ALLOCATION_ERROR; + return FALSE; + } + uprv_memcpy(newArray, array, (size_t)length * 2); + releaseArray(); + array = newArray; + capacity = newCapacity; + return TRUE; +} + +UBool Edits::copyErrorTo(UErrorCode &outErrorCode) { + if (U_FAILURE(outErrorCode)) { return TRUE; } + if (U_SUCCESS(errorCode_)) { return FALSE; } + outErrorCode = errorCode_; + return TRUE; +} + +Edits &Edits::mergeAndAppend(const Edits &ab, const Edits &bc, UErrorCode &errorCode) { + if (copyErrorTo(errorCode)) { return *this; } + // Picture string a --(Edits ab)--> string b --(Edits bc)--> string c. + // Parallel iteration over both Edits. + Iterator abIter = ab.getFineIterator(); + Iterator bcIter = bc.getFineIterator(); + UBool abHasNext = TRUE, bcHasNext = TRUE; + // Copy iterator state into local variables, so that we can modify and subdivide spans. + // ab old & new length, bc old & new length + int32_t aLength = 0, ab_bLength = 0, bc_bLength = 0, cLength = 0; + // When we have different-intermediate-length changes, we accumulate a larger change. + int32_t pending_aLength = 0, pending_cLength = 0; + for (;;) { + // At this point, for each of the two iterators: + // Either we are done with the locally cached current edit, + // and its intermediate-string length has been reset, + // or we will continue to work with a truncated remainder of this edit. + // + // If the current edit is done, and the iterator has not yet reached the end, + // then we fetch the next edit. This is true for at least one of the iterators. + // + // Normally it does not matter whether we fetch from ab and then bc or vice versa. + // However, the result is observably different when + // ab deletions meet bc insertions at the same intermediate-string index. + // Some users expect the bc insertions to come first, so we fetch from bc first. + if (bc_bLength == 0) { + if (bcHasNext && (bcHasNext = bcIter.next(errorCode))) { + bc_bLength = bcIter.oldLength(); + cLength = bcIter.newLength(); + if (bc_bLength == 0) { + // insertion + if (ab_bLength == 0 || !abIter.hasChange()) { + addReplace(pending_aLength, pending_cLength + cLength); + pending_aLength = pending_cLength = 0; + } else { + pending_cLength += cLength; + } + continue; + } + } + // else see if the other iterator is done, too. + } + if (ab_bLength == 0) { + if (abHasNext && (abHasNext = abIter.next(errorCode))) { + aLength = abIter.oldLength(); + ab_bLength = abIter.newLength(); + if (ab_bLength == 0) { + // deletion + if (bc_bLength == bcIter.oldLength() || !bcIter.hasChange()) { + addReplace(pending_aLength + aLength, pending_cLength); + pending_aLength = pending_cLength = 0; + } else { + pending_aLength += aLength; + } + continue; + } + } else if (bc_bLength == 0) { + // Both iterators are done at the same time: + // The intermediate-string lengths match. + break; + } else { + // The ab output string is shorter than the bc input string. + if (!copyErrorTo(errorCode)) { + errorCode = U_ILLEGAL_ARGUMENT_ERROR; + } + return *this; + } + } + if (bc_bLength == 0) { + // The bc input string is shorter than the ab output string. + if (!copyErrorTo(errorCode)) { + errorCode = U_ILLEGAL_ARGUMENT_ERROR; + } + return *this; + } + // Done fetching: ab_bLength > 0 && bc_bLength > 0 + + // The current state has two parts: + // - Past: We accumulate a longer ac edit in the "pending" variables. + // - Current: We have copies of the current ab/bc edits in local variables. + // At least one side is newly fetched. + // One side might be a truncated remainder of an edit we fetched earlier. + + if (!abIter.hasChange() && !bcIter.hasChange()) { + // An unchanged span all the way from string a to string c. + if (pending_aLength != 0 || pending_cLength != 0) { + addReplace(pending_aLength, pending_cLength); + pending_aLength = pending_cLength = 0; + } + int32_t unchangedLength = aLength <= cLength ? aLength : cLength; + addUnchanged(unchangedLength); + ab_bLength = aLength -= unchangedLength; + bc_bLength = cLength -= unchangedLength; + // At least one of the unchanged spans is now empty. + continue; + } + if (!abIter.hasChange() && bcIter.hasChange()) { + // Unchanged a->b but changed b->c. + if (ab_bLength >= bc_bLength) { + // Split the longer unchanged span into change + remainder. + addReplace(pending_aLength + bc_bLength, pending_cLength + cLength); + pending_aLength = pending_cLength = 0; + aLength = ab_bLength -= bc_bLength; + bc_bLength = 0; + continue; + } + // Handle the shorter unchanged span below like a change. + } else if (abIter.hasChange() && !bcIter.hasChange()) { + // Changed a->b and then unchanged b->c. + if (ab_bLength <= bc_bLength) { + // Split the longer unchanged span into change + remainder. + addReplace(pending_aLength + aLength, pending_cLength + ab_bLength); + pending_aLength = pending_cLength = 0; + cLength = bc_bLength -= ab_bLength; + ab_bLength = 0; + continue; + } + // Handle the shorter unchanged span below like a change. + } else { // both abIter.hasChange() && bcIter.hasChange() + if (ab_bLength == bc_bLength) { + // Changes on both sides up to the same position. Emit & reset. + addReplace(pending_aLength + aLength, pending_cLength + cLength); + pending_aLength = pending_cLength = 0; + ab_bLength = bc_bLength = 0; + continue; + } + } + // Accumulate the a->c change, reset the shorter side, + // keep a remainder of the longer one. + pending_aLength += aLength; + pending_cLength += cLength; + if (ab_bLength < bc_bLength) { + bc_bLength -= ab_bLength; + cLength = ab_bLength = 0; + } else { // ab_bLength > bc_bLength + ab_bLength -= bc_bLength; + aLength = bc_bLength = 0; + } + } + if (pending_aLength != 0 || pending_cLength != 0) { + addReplace(pending_aLength, pending_cLength); + } + copyErrorTo(errorCode); + return *this; +} + +Edits::Iterator::Iterator(const uint16_t *a, int32_t len, UBool oc, UBool crs) : + array(a), index(0), length(len), remaining(0), + onlyChanges_(oc), coarse(crs), + dir(0), changed(FALSE), oldLength_(0), newLength_(0), + srcIndex(0), replIndex(0), destIndex(0) {} + +int32_t Edits::Iterator::readLength(int32_t head) { + if (head < LENGTH_IN_1TRAIL) { + return head; + } else if (head < LENGTH_IN_2TRAIL) { + U_ASSERT(index < length); + U_ASSERT(array[index] >= 0x8000); + return array[index++] & 0x7fff; + } else { + U_ASSERT((index + 2) <= length); + U_ASSERT(array[index] >= 0x8000); + U_ASSERT(array[index + 1] >= 0x8000); + int32_t len = ((head & 1) << 30) | + ((int32_t)(array[index] & 0x7fff) << 15) | + (array[index + 1] & 0x7fff); + index += 2; + return len; + } +} + +void Edits::Iterator::updateNextIndexes() { + srcIndex += oldLength_; + if (changed) { + replIndex += newLength_; + } + destIndex += newLength_; +} + +void Edits::Iterator::updatePreviousIndexes() { + srcIndex -= oldLength_; + if (changed) { + replIndex -= newLength_; + } + destIndex -= newLength_; +} + +UBool Edits::Iterator::noNext() { + // No change before or beyond the string. + dir = 0; + changed = FALSE; + oldLength_ = newLength_ = 0; + return FALSE; +} + +UBool Edits::Iterator::next(UBool onlyChanges, UErrorCode &errorCode) { + // Forward iteration: Update the string indexes to the limit of the current span, + // and post-increment-read array units to assemble a new span. + // Leaves the array index one after the last unit of that span. + if (U_FAILURE(errorCode)) { return FALSE; } + // We have an errorCode in case we need to start guarding against integer overflows. + // It is also convenient for caller loops if we bail out when an error was set elsewhere. + if (dir > 0) { + updateNextIndexes(); + } else { + if (dir < 0) { + // Turn around from previous() to next(). + // Post-increment-read the same span again. + if (remaining > 0) { + // Fine-grained iterator: + // Stay on the current one of a sequence of compressed changes. + ++index; // next() rests on the index after the sequence unit. + dir = 1; + return TRUE; + } + } + dir = 1; + } + if (remaining >= 1) { + // Fine-grained iterator: Continue a sequence of compressed changes. + if (remaining > 1) { + --remaining; + return TRUE; + } + remaining = 0; + } + if (index >= length) { + return noNext(); + } + int32_t u = array[index++]; + if (u <= MAX_UNCHANGED) { + // Combine adjacent unchanged ranges. + changed = FALSE; + oldLength_ = u + 1; + while (index < length && (u = array[index]) <= MAX_UNCHANGED) { + ++index; + oldLength_ += u + 1; + } + newLength_ = oldLength_; + if (onlyChanges) { + updateNextIndexes(); + if (index >= length) { + return noNext(); + } + // already fetched u > MAX_UNCHANGED at index + ++index; + } else { + return TRUE; + } + } + changed = TRUE; + if (u <= MAX_SHORT_CHANGE) { + int32_t oldLen = u >> 12; + int32_t newLen = (u >> 9) & MAX_SHORT_CHANGE_NEW_LENGTH; + int32_t num = (u & SHORT_CHANGE_NUM_MASK) + 1; + if (coarse) { + oldLength_ = num * oldLen; + newLength_ = num * newLen; + } else { + // Split a sequence of changes that was compressed into one unit. + oldLength_ = oldLen; + newLength_ = newLen; + if (num > 1) { + remaining = num; // This is the first of two or more changes. + } + return TRUE; + } + } else { + U_ASSERT(u <= 0x7fff); + oldLength_ = readLength((u >> 6) & 0x3f); + newLength_ = readLength(u & 0x3f); + if (!coarse) { + return TRUE; + } + } + // Combine adjacent changes. + while (index < length && (u = array[index]) > MAX_UNCHANGED) { + ++index; + if (u <= MAX_SHORT_CHANGE) { + int32_t num = (u & SHORT_CHANGE_NUM_MASK) + 1; + oldLength_ += (u >> 12) * num; + newLength_ += ((u >> 9) & MAX_SHORT_CHANGE_NEW_LENGTH) * num; + } else { + U_ASSERT(u <= 0x7fff); + oldLength_ += readLength((u >> 6) & 0x3f); + newLength_ += readLength(u & 0x3f); + } + } + return TRUE; +} + +UBool Edits::Iterator::previous(UErrorCode &errorCode) { + // Backward iteration: Pre-decrement-read array units to assemble a new span, + // then update the string indexes to the start of that span. + // Leaves the array index on the head unit of that span. + if (U_FAILURE(errorCode)) { return FALSE; } + // We have an errorCode in case we need to start guarding against integer overflows. + // It is also convenient for caller loops if we bail out when an error was set elsewhere. + if (dir >= 0) { + if (dir > 0) { + // Turn around from next() to previous(). + // Set the string indexes to the span limit and + // pre-decrement-read the same span again. + if (remaining > 0) { + // Fine-grained iterator: + // Stay on the current one of a sequence of compressed changes. + --index; // previous() rests on the sequence unit. + dir = -1; + return TRUE; + } + updateNextIndexes(); + } + dir = -1; + } + if (remaining > 0) { + // Fine-grained iterator: Continue a sequence of compressed changes. + int32_t u = array[index]; + U_ASSERT(MAX_UNCHANGED < u && u <= MAX_SHORT_CHANGE); + if (remaining <= (u & SHORT_CHANGE_NUM_MASK)) { + ++remaining; + updatePreviousIndexes(); + return TRUE; + } + remaining = 0; + } + if (index <= 0) { + return noNext(); + } + int32_t u = array[--index]; + if (u <= MAX_UNCHANGED) { + // Combine adjacent unchanged ranges. + changed = FALSE; + oldLength_ = u + 1; + while (index > 0 && (u = array[index - 1]) <= MAX_UNCHANGED) { + --index; + oldLength_ += u + 1; + } + newLength_ = oldLength_; + // No need to handle onlyChanges as long as previous() is called only from findIndex(). + updatePreviousIndexes(); + return TRUE; + } + changed = TRUE; + if (u <= MAX_SHORT_CHANGE) { + int32_t oldLen = u >> 12; + int32_t newLen = (u >> 9) & MAX_SHORT_CHANGE_NEW_LENGTH; + int32_t num = (u & SHORT_CHANGE_NUM_MASK) + 1; + if (coarse) { + oldLength_ = num * oldLen; + newLength_ = num * newLen; + } else { + // Split a sequence of changes that was compressed into one unit. + oldLength_ = oldLen; + newLength_ = newLen; + if (num > 1) { + remaining = 1; // This is the last of two or more changes. + } + updatePreviousIndexes(); + return TRUE; + } + } else { + if (u <= 0x7fff) { + // The change is encoded in u alone. + oldLength_ = readLength((u >> 6) & 0x3f); + newLength_ = readLength(u & 0x3f); + } else { + // Back up to the head of the change, read the lengths, + // and reset the index to the head again. + U_ASSERT(index > 0); + while ((u = array[--index]) > 0x7fff) {} + U_ASSERT(u > MAX_SHORT_CHANGE); + int32_t headIndex = index++; + oldLength_ = readLength((u >> 6) & 0x3f); + newLength_ = readLength(u & 0x3f); + index = headIndex; + } + if (!coarse) { + updatePreviousIndexes(); + return TRUE; + } + } + // Combine adjacent changes. + while (index > 0 && (u = array[index - 1]) > MAX_UNCHANGED) { + --index; + if (u <= MAX_SHORT_CHANGE) { + int32_t num = (u & SHORT_CHANGE_NUM_MASK) + 1; + oldLength_ += (u >> 12) * num; + newLength_ += ((u >> 9) & MAX_SHORT_CHANGE_NEW_LENGTH) * num; + } else if (u <= 0x7fff) { + // Read the lengths, and reset the index to the head again. + int32_t headIndex = index++; + oldLength_ += readLength((u >> 6) & 0x3f); + newLength_ += readLength(u & 0x3f); + index = headIndex; + } + } + updatePreviousIndexes(); + return TRUE; +} + +int32_t Edits::Iterator::findIndex(int32_t i, UBool findSource, UErrorCode &errorCode) { + if (U_FAILURE(errorCode) || i < 0) { return -1; } + int32_t spanStart, spanLength; + if (findSource) { // find source index + spanStart = srcIndex; + spanLength = oldLength_; + } else { // find destination index + spanStart = destIndex; + spanLength = newLength_; + } + if (i < spanStart) { + if (i >= (spanStart / 2)) { + // Search backwards. + for (;;) { + UBool hasPrevious = previous(errorCode); + U_ASSERT(hasPrevious); // because i>=0 and the first span starts at 0 + (void)hasPrevious; // avoid unused-variable warning + spanStart = findSource ? srcIndex : destIndex; + if (i >= spanStart) { + // The index is in the current span. + return 0; + } + if (remaining > 0) { + // Is the index in one of the remaining compressed edits? + // spanStart is the start of the current span, first of the remaining ones. + spanLength = findSource ? oldLength_ : newLength_; + int32_t u = array[index]; + U_ASSERT(MAX_UNCHANGED < u && u <= MAX_SHORT_CHANGE); + int32_t num = (u & SHORT_CHANGE_NUM_MASK) + 1 - remaining; + int32_t len = num * spanLength; + if (i >= (spanStart - len)) { + int32_t n = ((spanStart - i - 1) / spanLength) + 1; + // 1 <= n <= num + srcIndex -= n * oldLength_; + replIndex -= n * newLength_; + destIndex -= n * newLength_; + remaining += n; + return 0; + } + // Skip all of these edits at once. + srcIndex -= num * oldLength_; + replIndex -= num * newLength_; + destIndex -= num * newLength_; + remaining = 0; + } + } + } + // Reset the iterator to the start. + dir = 0; + index = remaining = oldLength_ = newLength_ = srcIndex = replIndex = destIndex = 0; + } else if (i < (spanStart + spanLength)) { + // The index is in the current span. + return 0; + } + while (next(FALSE, errorCode)) { + if (findSource) { + spanStart = srcIndex; + spanLength = oldLength_; + } else { + spanStart = destIndex; + spanLength = newLength_; + } + if (i < (spanStart + spanLength)) { + // The index is in the current span. + return 0; + } + if (remaining > 1) { + // Is the index in one of the remaining compressed edits? + // spanStart is the start of the current span, first of the remaining ones. + int32_t len = remaining * spanLength; + if (i < (spanStart + len)) { + int32_t n = (i - spanStart) / spanLength; // 1 <= n <= remaining - 1 + srcIndex += n * oldLength_; + replIndex += n * newLength_; + destIndex += n * newLength_; + remaining -= n; + return 0; + } + // Make next() skip all of these edits at once. + oldLength_ *= remaining; + newLength_ *= remaining; + remaining = 0; + } + } + return 1; +} + +int32_t Edits::Iterator::destinationIndexFromSourceIndex(int32_t i, UErrorCode &errorCode) { + int32_t where = findIndex(i, TRUE, errorCode); + if (where < 0) { + // Error or before the string. + return 0; + } + if (where > 0 || i == srcIndex) { + // At or after string length, or at start of the found span. + return destIndex; + } + if (changed) { + // In a change span, map to its end. + return destIndex + newLength_; + } else { + // In an unchanged span, offset 1:1 within it. + return destIndex + (i - srcIndex); + } +} + +int32_t Edits::Iterator::sourceIndexFromDestinationIndex(int32_t i, UErrorCode &errorCode) { + int32_t where = findIndex(i, FALSE, errorCode); + if (where < 0) { + // Error or before the string. + return 0; + } + if (where > 0 || i == destIndex) { + // At or after string length, or at start of the found span. + return srcIndex; + } + if (changed) { + // In a change span, map to its end. + return srcIndex + oldLength_; + } else { + // In an unchanged span, offset within it. + return srcIndex + (i - destIndex); + } +} + +U_NAMESPACE_END diff --git a/Build/source/libs/icu/icu-src/source/common/errorcode.cpp b/Build/source/libs/icu/icu-src/source/common/errorcode.cpp index bc7807d6010..e7ac43b5273 100644 --- a/Build/source/libs/icu/icu-src/source/common/errorcode.cpp +++ b/Build/source/libs/icu/icu-src/source/common/errorcode.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* @@ -8,7 +8,7 @@ * ******************************************************************************* * file name: errorcode.cpp -* encoding: US-ASCII +* encoding: UTF-8 * tab size: 8 (not used) * indentation:4 * diff --git a/Build/source/libs/icu/icu-src/source/common/filteredbrk.cpp b/Build/source/libs/icu/icu-src/source/common/filteredbrk.cpp index acba9592f0d..30f86173067 100644 --- a/Build/source/libs/icu/icu-src/source/common/filteredbrk.cpp +++ b/Build/source/libs/icu/icu-src/source/common/filteredbrk.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* @@ -694,7 +694,7 @@ FilteredBreakIteratorBuilder::createInstance(const Locale& where, UErrorCode& st } FilteredBreakIteratorBuilder * -FilteredBreakIteratorBuilder::createInstance(UErrorCode& status) { +FilteredBreakIteratorBuilder::createEmptyInstance(UErrorCode& status) { if(U_FAILURE(status)) return NULL; LocalPointer ret(new SimpleFilteredBreakIteratorBuilder(status), status); return (U_SUCCESS(status))? ret.orphan(): NULL; @@ -702,4 +702,4 @@ FilteredBreakIteratorBuilder::createInstance(UErrorCode& status) { U_NAMESPACE_END -#endif //#if !UCONFIG_NO_BREAK_ITERATION && U_HAVE_STD_STRING && !UCONFIG_NO_FILTERED_BREAK_ITERATION +#endif //#if !UCONFIG_NO_BREAK_ITERATION && !UCONFIG_NO_FILTERED_BREAK_ITERATION diff --git a/Build/source/libs/icu/icu-src/source/common/filterednormalizer2.cpp b/Build/source/libs/icu/icu-src/source/common/filterednormalizer2.cpp index fb6e831af7a..1a0914d3f7b 100644 --- a/Build/source/libs/icu/icu-src/source/common/filterednormalizer2.cpp +++ b/Build/source/libs/icu/icu-src/source/common/filterednormalizer2.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* @@ -8,7 +8,7 @@ * ******************************************************************************* * file name: filterednormalizer2.cpp -* encoding: US-ASCII +* encoding: UTF-8 * tab size: 8 (not used) * indentation:4 * @@ -20,7 +20,9 @@ #if !UCONFIG_NO_NORMALIZATION +#include "unicode/edits.h" #include "unicode/normalizer2.h" +#include "unicode/stringoptions.h" #include "unicode/uniset.h" #include "unicode/unistr.h" #include "unicode/unorm.h" @@ -85,6 +87,52 @@ FilteredNormalizer2::normalize(const UnicodeString &src, return dest; } +void +FilteredNormalizer2::normalizeUTF8(uint32_t options, StringPiece src, ByteSink &sink, + Edits *edits, UErrorCode &errorCode) const { + if (U_FAILURE(errorCode)) { + return; + } + if (edits != nullptr && (options & U_EDITS_NO_RESET) == 0) { + edits->reset(); + } + options |= U_EDITS_NO_RESET; // Do not reset for each span. + normalizeUTF8(options, src.data(), src.length(), sink, edits, USET_SPAN_SIMPLE, errorCode); +} + +void +FilteredNormalizer2::normalizeUTF8(uint32_t options, const char *src, int32_t length, + ByteSink &sink, Edits *edits, + USetSpanCondition spanCondition, + UErrorCode &errorCode) const { + while (length > 0) { + int32_t spanLength = set.spanUTF8(src, length, spanCondition); + if (spanCondition == USET_SPAN_NOT_CONTAINED) { + if (spanLength != 0) { + if (edits != nullptr) { + edits->addUnchanged(spanLength); + } + if ((options & U_OMIT_UNCHANGED_TEXT) == 0) { + sink.Append(src, spanLength); + } + } + spanCondition = USET_SPAN_SIMPLE; + } else { + if (spanLength != 0) { + // Not norm2.normalizeSecondAndAppend() because we do not want + // to modify the non-filter part of dest. + norm2.normalizeUTF8(options, StringPiece(src, spanLength), sink, edits, errorCode); + if (U_FAILURE(errorCode)) { + break; + } + } + spanCondition = USET_SPAN_NOT_CONTAINED; + } + src += spanLength; + length -= spanLength; + } +} + UnicodeString & FilteredNormalizer2::normalizeSecondAndAppend(UnicodeString &first, const UnicodeString &second, @@ -196,6 +244,31 @@ FilteredNormalizer2::isNormalized(const UnicodeString &s, UErrorCode &errorCode) return TRUE; } +UBool +FilteredNormalizer2::isNormalizedUTF8(StringPiece sp, UErrorCode &errorCode) const { + if(U_FAILURE(errorCode)) { + return FALSE; + } + const char *s = sp.data(); + int32_t length = sp.length(); + USetSpanCondition spanCondition = USET_SPAN_SIMPLE; + while (length > 0) { + int32_t spanLength = set.spanUTF8(s, length, spanCondition); + if (spanCondition == USET_SPAN_NOT_CONTAINED) { + spanCondition = USET_SPAN_SIMPLE; + } else { + if (!norm2.isNormalizedUTF8(StringPiece(s, spanLength), errorCode) || + U_FAILURE(errorCode)) { + return FALSE; + } + spanCondition = USET_SPAN_NOT_CONTAINED; + } + s += spanLength; + length -= spanLength; + } + return TRUE; +} + UNormalizationCheckResult FilteredNormalizer2::quickCheck(const UnicodeString &s, UErrorCode &errorCode) const { uprv_checkCanGetBuffer(s, errorCode); diff --git a/Build/source/libs/icu/icu-src/source/common/hash.h b/Build/source/libs/icu/icu-src/source/common/hash.h index ac7d22feb67..c6be4672015 100644 --- a/Build/source/libs/icu/icu-src/source/common/hash.h +++ b/Build/source/libs/icu/icu-src/source/common/hash.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ****************************************************************************** @@ -33,6 +33,8 @@ class U_COMMON_API Hashtable : public UMemory { inline void init(UHashFunction *keyHash, UKeyComparator *keyComp, UValueComparator *valueComp, UErrorCode& status); + inline void initSize(UHashFunction *keyHash, UKeyComparator *keyComp, UValueComparator *valueComp, int32_t size, UErrorCode& status); + public: /** * Construct a hashtable @@ -41,6 +43,14 @@ public: */ Hashtable(UBool ignoreKeyCase, UErrorCode& status); + /** + * Construct a hashtable + * @param ignoreKeyCase If true, keys are case insensitive. + * @param size initial size allocation + * @param status Error code + */ + Hashtable(UBool ignoreKeyCase, int32_t size, UErrorCode& status); + /** * Construct a hashtable * @param keyComp Comparator for comparing the keys @@ -76,9 +86,9 @@ public: int32_t puti(const UnicodeString& key, int32_t value, UErrorCode& status); void* get(const UnicodeString& key) const; - + int32_t geti(const UnicodeString& key) const; - + void* remove(const UnicodeString& key); int32_t removei(const UnicodeString& key); @@ -92,9 +102,9 @@ public: * @see uhash_nextElement */ const UHashElement* nextElement(int32_t& pos) const; - + UKeyComparator* setKeyComparator(UKeyComparator*keyComp); - + UValueComparator* setValueComparator(UValueComparator* valueComp); UBool equals(const Hashtable& that) const; @@ -107,7 +117,7 @@ private: * Implementation ********************************************************************/ -inline void Hashtable::init(UHashFunction *keyHash, UKeyComparator *keyComp, +inline void Hashtable::init(UHashFunction *keyHash, UKeyComparator *keyComp, UValueComparator *valueComp, UErrorCode& status) { if (U_FAILURE(status)) { return; @@ -119,10 +129,23 @@ inline void Hashtable::init(UHashFunction *keyHash, UKeyComparator *keyComp, } } -inline Hashtable::Hashtable(UKeyComparator *keyComp, UValueComparator *valueComp, +inline void Hashtable::initSize(UHashFunction *keyHash, UKeyComparator *keyComp, + UValueComparator *valueComp, int32_t size, UErrorCode& status) { + if (U_FAILURE(status)) { + return; + } + uhash_initSize(&hashObj, keyHash, keyComp, valueComp, size, &status); + if (U_SUCCESS(status)) { + hash = &hashObj; + uhash_setKeyDeleter(hash, uprv_deleteUObject); + } +} + +inline Hashtable::Hashtable(UKeyComparator *keyComp, UValueComparator *valueComp, UErrorCode& status) : hash(0) { init( uhash_hashUnicodeString, keyComp, valueComp, status); } + inline Hashtable::Hashtable(UBool ignoreKeyCase, UErrorCode& status) : hash(0) { @@ -134,6 +157,17 @@ inline Hashtable::Hashtable(UBool ignoreKeyCase, UErrorCode& status) status); } +inline Hashtable::Hashtable(UBool ignoreKeyCase, int32_t size, UErrorCode& status) + : hash(0) +{ + initSize(ignoreKeyCase ? uhash_hashCaselessUnicodeString + : uhash_hashUnicodeString, + ignoreKeyCase ? uhash_compareCaselessUnicodeString + : uhash_compareUnicodeString, + NULL, size, + status); +} + inline Hashtable::Hashtable(UErrorCode& status) : hash(0) { @@ -200,7 +234,7 @@ inline void Hashtable::removeAll(void) { inline UKeyComparator* Hashtable::setKeyComparator(UKeyComparator*keyComp){ return uhash_setKeyComparator(hash, keyComp); } - + inline UValueComparator* Hashtable::setValueComparator(UValueComparator* valueComp){ return uhash_setValueComparator(hash, valueComp); } diff --git a/Build/source/libs/icu/icu-src/source/common/icudataver.c b/Build/source/libs/icu/icu-src/source/common/icudataver.c deleted file mode 100644 index 681a187ba21..00000000000 --- a/Build/source/libs/icu/icu-src/source/common/icudataver.c +++ /dev/null @@ -1,31 +0,0 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. -// License & terms of use: http://www.unicode.org/copyright.html -/* -****************************************************************************** -* -* Copyright (C) 2009-2011, International Business Machines -* Corporation and others. All Rights Reserved. -* -****************************************************************************** -*/ - -#include "unicode/utypes.h" -#include "unicode/icudataver.h" -#include "unicode/ures.h" -#include "uresimp.h" /* for ures_getVersionByKey */ - -U_CAPI void U_EXPORT2 u_getDataVersion(UVersionInfo dataVersionFillin, UErrorCode *status) { - UResourceBundle *icudatares = NULL; - - if (U_FAILURE(*status)) { - return; - } - - if (dataVersionFillin != NULL) { - icudatares = ures_openDirect(NULL, U_ICU_VERSION_BUNDLE , status); - if (U_SUCCESS(*status)) { - ures_getVersionByKey(icudatares, U_ICU_DATA_KEY, dataVersionFillin, status); - } - ures_close(icudatares); - } -} diff --git a/Build/source/libs/icu/icu-src/source/common/icudataver.cpp b/Build/source/libs/icu/icu-src/source/common/icudataver.cpp new file mode 100644 index 00000000000..d3144113741 --- /dev/null +++ b/Build/source/libs/icu/icu-src/source/common/icudataver.cpp @@ -0,0 +1,31 @@ +// © 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html +/* +****************************************************************************** +* +* Copyright (C) 2009-2011, International Business Machines +* Corporation and others. All Rights Reserved. +* +****************************************************************************** +*/ + +#include "unicode/utypes.h" +#include "unicode/icudataver.h" +#include "unicode/ures.h" +#include "uresimp.h" /* for ures_getVersionByKey */ + +U_CAPI void U_EXPORT2 u_getDataVersion(UVersionInfo dataVersionFillin, UErrorCode *status) { + UResourceBundle *icudatares = NULL; + + if (U_FAILURE(*status)) { + return; + } + + if (dataVersionFillin != NULL) { + icudatares = ures_openDirect(NULL, U_ICU_VERSION_BUNDLE , status); + if (U_SUCCESS(*status)) { + ures_getVersionByKey(icudatares, U_ICU_DATA_KEY, dataVersionFillin, status); + } + ures_close(icudatares); + } +} diff --git a/Build/source/libs/icu/icu-src/source/common/icuplug.cpp b/Build/source/libs/icu/icu-src/source/common/icuplug.cpp index ec889f78b3d..c6439cc819a 100644 --- a/Build/source/libs/icu/icu-src/source/common/icuplug.cpp +++ b/Build/source/libs/icu/icu-src/source/common/icuplug.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ****************************************************************************** diff --git a/Build/source/libs/icu/icu-src/source/common/icuplugimp.h b/Build/source/libs/icu/icu-src/source/common/icuplugimp.h index acbbcaf294d..3cad8f87f18 100644 --- a/Build/source/libs/icu/icu-src/source/common/icuplugimp.h +++ b/Build/source/libs/icu/icu-src/source/common/icuplugimp.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ****************************************************************************** diff --git a/Build/source/libs/icu/icu-src/source/common/listformatter.cpp b/Build/source/libs/icu/icu-src/source/common/listformatter.cpp index 9225c22f163..33a8ac28671 100644 --- a/Build/source/libs/icu/icu-src/source/common/listformatter.cpp +++ b/Build/source/libs/icu/icu-src/source/common/listformatter.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* @@ -8,7 +8,7 @@ * ******************************************************************************* * file name: listformatter.cpp -* encoding: US-ASCII +* encoding: UTF-8 * tab size: 8 (not used) * indentation:4 * @@ -25,6 +25,7 @@ #include "charstr.h" #include "ucln_cmn.h" #include "uresimp.h" +#include "resource.h" U_NAMESPACE_BEGIN @@ -62,7 +63,7 @@ ListFormatInternal(const ListFormatInternal &other) : static Hashtable* listPatternHash = NULL; static UMutex listFormatterMutex = U_MUTEX_INITIALIZER; -static const char *STANDARD_STYLE = "standard"; +static const char STANDARD_STYLE[] = "standard"; U_CDECL_BEGIN static UBool U_CALLCONV uprv_listformatter_cleanup() { @@ -78,17 +79,6 @@ uprv_deleteListFormatInternal(void *obj) { U_CDECL_END -static ListFormatInternal* loadListFormatInternal( - const Locale& locale, - const char* style, - UErrorCode& errorCode); - -static void getStringByKey( - const UResourceBundle* rb, - const char* key, - UnicodeString& result, - UErrorCode& errorCode); - ListFormatter::ListFormatter(const ListFormatter& other) : owned(other.owned), data(other.data) { if (other.owned != NULL) { @@ -171,30 +161,107 @@ const ListFormatInternal* ListFormatter::getListFormatInternal( return result; } -static ListFormatInternal* loadListFormatInternal( +static const UChar solidus = 0x2F; +static const UChar aliasPrefix[] = { 0x6C,0x69,0x73,0x74,0x50,0x61,0x74,0x74,0x65,0x72,0x6E,0x2F }; // "listPattern/" +enum { + kAliasPrefixLen = UPRV_LENGTHOF(aliasPrefix), + kStyleLenMax = 24 // longest currently is 14 +}; + +struct ListFormatter::ListPatternsSink : public ResourceSink { + UnicodeString two, start, middle, end; +#if ((U_PLATFORM == U_PF_AIX) || (U_PLATFORM == U_PF_OS390)) && (U_CPLUSPLUS_VERSION < 11) + char aliasedStyle[kStyleLenMax+1]; + ListPatternsSink() { + uprv_memset(aliasedStyle, 0, kStyleLenMax+1); + } +#else + char aliasedStyle[kStyleLenMax+1] = {0}; + + ListPatternsSink() {} +#endif + virtual ~ListPatternsSink(); + + void setAliasedStyle(UnicodeString alias) { + int32_t startIndex = alias.indexOf(aliasPrefix, kAliasPrefixLen, 0); + if (startIndex < 0) { + return; + } + startIndex += kAliasPrefixLen; + int32_t endIndex = alias.indexOf(solidus, startIndex); + if (endIndex < 0) { + endIndex = alias.length(); + } + alias.extract(startIndex, endIndex-startIndex, aliasedStyle, kStyleLenMax+1, US_INV); + aliasedStyle[kStyleLenMax] = 0; + } + + void handleValueForPattern(ResourceValue &value, UnicodeString &pattern, UErrorCode &errorCode) { + if (pattern.isEmpty()) { + if (value.getType() == URES_ALIAS) { + if (aliasedStyle[0] == 0) { + setAliasedStyle(value.getAliasUnicodeString(errorCode)); + } + } else { + pattern = value.getUnicodeString(errorCode); + } + } + } + + virtual void put(const char *key, ResourceValue &value, UBool /*noFallback*/, + UErrorCode &errorCode) { + aliasedStyle[0] = 0; + if (value.getType() == URES_ALIAS) { + setAliasedStyle(value.getAliasUnicodeString(errorCode)); + return; + } + ResourceTable listPatterns = value.getTable(errorCode); + for (int i = 0; U_SUCCESS(errorCode) && listPatterns.getKeyAndValue(i, key, value); ++i) { + if (uprv_strcmp(key, "2") == 0) { + handleValueForPattern(value, two, errorCode); + } else if (uprv_strcmp(key, "end") == 0) { + handleValueForPattern(value, end, errorCode); + } else if (uprv_strcmp(key, "middle") == 0) { + handleValueForPattern(value, middle, errorCode); + } else if (uprv_strcmp(key, "start") == 0) { + handleValueForPattern(value, start, errorCode); + } + } + } +}; + +// Virtual destructors must be defined out of line. +ListFormatter::ListPatternsSink::~ListPatternsSink() {} + +ListFormatInternal* ListFormatter::loadListFormatInternal( const Locale& locale, const char * style, UErrorCode& errorCode) { UResourceBundle* rb = ures_open(NULL, locale.getName(), &errorCode); - if (U_FAILURE(errorCode)) { - ures_close(rb); - return NULL; - } rb = ures_getByKeyWithFallback(rb, "listPattern", rb, &errorCode); - rb = ures_getByKeyWithFallback(rb, style, rb, &errorCode); - if (U_FAILURE(errorCode)) { ures_close(rb); return NULL; } - UnicodeString two, start, middle, end; - getStringByKey(rb, "2", two, errorCode); - getStringByKey(rb, "start", start, errorCode); - getStringByKey(rb, "middle", middle, errorCode); - getStringByKey(rb, "end", end, errorCode); + ListFormatter::ListPatternsSink sink; + char currentStyle[kStyleLenMax+1]; + uprv_strncpy(currentStyle, style, kStyleLenMax); + currentStyle[kStyleLenMax] = 0; + + for (;;) { + ures_getAllItemsWithFallback(rb, currentStyle, sink, errorCode); + if (U_FAILURE(errorCode) || sink.aliasedStyle[0] == 0 || uprv_strcmp(currentStyle, sink.aliasedStyle) == 0) { + break; + } + uprv_strcpy(currentStyle, sink.aliasedStyle); + } ures_close(rb); if (U_FAILURE(errorCode)) { return NULL; } - ListFormatInternal* result = new ListFormatInternal(two, start, middle, end, errorCode); + if (sink.two.isEmpty() || sink.start.isEmpty() || sink.middle.isEmpty() || sink.end.isEmpty()) { + errorCode = U_MISSING_RESOURCE_ERROR; + return NULL; + } + ListFormatInternal* result = new ListFormatInternal(sink.two, sink.start, sink.middle, sink.end, errorCode); if (result == NULL) { errorCode = U_MEMORY_ALLOCATION_ERROR; return NULL; @@ -206,15 +273,6 @@ static ListFormatInternal* loadListFormatInternal( return result; } -static void getStringByKey(const UResourceBundle* rb, const char* key, UnicodeString& result, UErrorCode& errorCode) { - int32_t len; - const UChar* ustr = ures_getStringByKeyWithFallback(rb, key, &len, &errorCode); - if (U_FAILURE(errorCode)) { - return; - } - result.setTo(ustr, len); -} - ListFormatter* ListFormatter::createInstance(UErrorCode& errorCode) { Locale locale; // The default locale. return createInstance(locale, errorCode); diff --git a/Build/source/libs/icu/icu-src/source/common/loadednormalizer2impl.cpp b/Build/source/libs/icu/icu-src/source/common/loadednormalizer2impl.cpp index bd618185f40..288a7d69536 100644 --- a/Build/source/libs/icu/icu-src/source/common/loadednormalizer2impl.cpp +++ b/Build/source/libs/icu/icu-src/source/common/loadednormalizer2impl.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* @@ -62,7 +62,7 @@ LoadedNormalizer2Impl::isAcceptable(void * /*context*/, pInfo->dataFormat[1]==0x72 && pInfo->dataFormat[2]==0x6d && pInfo->dataFormat[3]==0x32 && - pInfo->formatVersion[0]==2 + pInfo->formatVersion[0]==3 ) { // Normalizer2Impl *me=(Normalizer2Impl *)context; // uprv_memcpy(me->dataVersion, pInfo->dataVersion, 4); @@ -84,7 +84,7 @@ LoadedNormalizer2Impl::load(const char *packageName, const char *name, UErrorCod const uint8_t *inBytes=(const uint8_t *)udata_getMemory(memory); const int32_t *inIndexes=(const int32_t *)inBytes; int32_t indexesLength=inIndexes[IX_NORM_TRIE_OFFSET]/4; - if(indexesLength<=IX_MIN_MAYBE_YES) { + if(indexesLength<=IX_MIN_LCCC_CP) { errorCode=U_INVALID_FORMAT_ERROR; // Not enough indexes. return; } @@ -232,6 +232,7 @@ Normalizer2::getInstance(const char *packageName, } } if(allModes==NULL) { + ucln_common_registerCleanup(UCLN_COMMON_LOADED_NORMALIZER2, uprv_loaded_normalizer2_cleanup); LocalPointer localAllModes( Norm2AllModes::createInstance(packageName, name, errorCode)); if(U_SUCCESS(errorCode)) { diff --git a/Build/source/libs/icu/icu-src/source/common/localsvc.h b/Build/source/libs/icu/icu-src/source/common/localsvc.h index 6b0624fcb86..60d447c264d 100644 --- a/Build/source/libs/icu/icu-src/source/common/localsvc.h +++ b/Build/source/libs/icu/icu-src/source/common/localsvc.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* *************************************************************************** diff --git a/Build/source/libs/icu/icu-src/source/common/locavailable.cpp b/Build/source/libs/icu/icu-src/source/common/locavailable.cpp index 6016fde0192..8782d0c77e6 100644 --- a/Build/source/libs/icu/icu-src/source/common/locavailable.cpp +++ b/Build/source/libs/icu/icu-src/source/common/locavailable.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* @@ -8,7 +8,7 @@ * ******************************************************************************* * file name: locavailable.cpp -* encoding: US-ASCII +* encoding: UTF-8 * tab size: 8 (not used) * indentation:4 * @@ -35,7 +35,7 @@ U_NAMESPACE_BEGIN static icu::Locale* availableLocaleList = NULL; static int32_t availableLocaleListCount; -static icu::UInitOnce gInitOnce = U_INITONCE_INITIALIZER; +static icu::UInitOnce gInitOnceLocale = U_INITONCE_INITIALIZER; U_NAMESPACE_END @@ -50,7 +50,7 @@ static UBool U_CALLCONV locale_available_cleanup(void) availableLocaleList = NULL; } availableLocaleListCount = 0; - gInitOnce.reset(); + gInitOnceLocale.reset(); return TRUE; } @@ -81,7 +81,7 @@ void U_CALLCONV locale_available_init() { const Locale* U_EXPORT2 Locale::getAvailableLocales(int32_t& count) { - umtx_initOnce(gInitOnce, &locale_available_init); + umtx_initOnce(gInitOnceLocale, &locale_available_init); count = availableLocaleListCount; return availableLocaleList; } diff --git a/Build/source/libs/icu/icu-src/source/common/locbased.cpp b/Build/source/libs/icu/icu-src/source/common/locbased.cpp index f2f56adda17..ff378b4cc78 100644 --- a/Build/source/libs/icu/icu-src/source/common/locbased.cpp +++ b/Build/source/libs/icu/icu-src/source/common/locbased.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** diff --git a/Build/source/libs/icu/icu-src/source/common/locbased.h b/Build/source/libs/icu/icu-src/source/common/locbased.h index ab8628b2b97..06133be1b7b 100644 --- a/Build/source/libs/icu/icu-src/source/common/locbased.h +++ b/Build/source/libs/icu/icu-src/source/common/locbased.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** diff --git a/Build/source/libs/icu/icu-src/source/common/locdispnames.cpp b/Build/source/libs/icu/icu-src/source/common/locdispnames.cpp index d60920c6124..e38550274f9 100644 --- a/Build/source/libs/icu/icu-src/source/common/locdispnames.cpp +++ b/Build/source/libs/icu/icu-src/source/common/locdispnames.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* @@ -8,7 +8,7 @@ * ******************************************************************************* * file name: locdispnames.cpp -* encoding: US-ASCII +* encoding: UTF-8 * tab size: 8 (not used) * indentation:4 * @@ -542,7 +542,7 @@ uloc_getDisplayName(const char *locale, return 0; } separator = (const UChar *)p0 + subLen; - sepLen = p1 - separator; + sepLen = static_cast(p1 - separator); } if(patLen==0 || (patLen==defaultPatLen && !u_strncmp(pattern, defaultPattern, patLen))) { @@ -558,8 +558,8 @@ uloc_getDisplayName(const char *locale, *pErrorCode=U_ILLEGAL_ARGUMENT_ERROR; return 0; } - sub0Pos=p0-pattern; - sub1Pos=p1-pattern; + sub0Pos = static_cast(p0-pattern); + sub1Pos = static_cast(p1-pattern); if (sub1Pos < sub0Pos) { /* a very odd pattern */ int32_t t=sub0Pos; sub0Pos=sub1Pos; sub1Pos=t; langi=1; @@ -821,6 +821,8 @@ uloc_getDisplayKeywordValue( const char* locale, /* get the keyword value */ keywordValue[0]=0; keywordValueLen = uloc_getKeywordValue(locale, keyword, keywordValue, capacity, status); + if (*status == U_STRING_NOT_TERMINATED_WARNING) + *status = U_BUFFER_OVERFLOW_ERROR; /* * if the keyword is equal to currency .. then to get the display name diff --git a/Build/source/libs/icu/icu-src/source/common/locdspnm.cpp b/Build/source/libs/icu/icu-src/source/common/locdspnm.cpp index a17478ce6d8..6ceb6cfc8bc 100644 --- a/Build/source/libs/icu/icu-src/source/common/locdspnm.cpp +++ b/Build/source/libs/icu/icu-src/source/common/locdspnm.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* @@ -13,6 +13,7 @@ #include "unicode/locdspnm.h" #include "unicode/simpleformatter.h" +#include "unicode/ucasemap.h" #include "unicode/ures.h" #include "unicode/udisplaycontext.h" #include "unicode/brkiter.h" @@ -53,7 +54,7 @@ static int32_t ncat(char *buffer, uint32_t buflen, ...) { *p = 0; va_end(args); - return p - buffer; + return static_cast(p - buffer); } U_NAMESPACE_BEGIN @@ -635,8 +636,9 @@ LocaleDisplayNamesImpl::localeDisplayName(const Locale& locale, char value[ULOC_KEYWORD_AND_VALUES_CAPACITY]; // sigh, no ULOC_VALUE_CAPACITY const char* key; while ((key = e->next((int32_t *)0, status)) != NULL) { + value[0] = 0; locale.getKeywordValue(key, value, ULOC_KEYWORD_AND_VALUES_CAPACITY, status); - if (U_FAILURE(status)) { + if (U_FAILURE(status) || status == U_STRING_NOT_TERMINATED_WARNING) { return result; } keyDisplayName(key, temp, TRUE); diff --git a/Build/source/libs/icu/icu-src/source/common/locid.cpp b/Build/source/libs/icu/icu-src/source/common/locid.cpp index d2781db95bd..36508acaf5c 100644 --- a/Build/source/libs/icu/icu-src/source/common/locid.cpp +++ b/Build/source/libs/icu/icu-src/source/common/locid.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** @@ -33,6 +33,7 @@ #include "unicode/locid.h" +#include "unicode/strenum.h" #include "unicode/uloc.h" #include "putilimp.h" #include "mutex.h" diff --git a/Build/source/libs/icu/icu-src/source/common/loclikely.cpp b/Build/source/libs/icu/icu-src/source/common/loclikely.cpp index c13b37e1a1f..7dd07afca5a 100644 --- a/Build/source/libs/icu/icu-src/source/common/loclikely.cpp +++ b/Build/source/libs/icu/icu-src/source/common/loclikely.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* @@ -8,7 +8,7 @@ * ******************************************************************************* * file name: loclikely.cpp -* encoding: US-ASCII +* encoding: UTF-8 * tab size: 8 (not used) * indentation:4 * @@ -22,6 +22,7 @@ #include "unicode/utypes.h" #include "unicode/locid.h" #include "unicode/putil.h" +#include "unicode/uchar.h" #include "unicode/uloc.h" #include "unicode/ures.h" #include "unicode/uscript.h" @@ -510,7 +511,7 @@ parseTagString( unknownLanguage); *langLength = (int32_t)uprv_strlen(lang); } - else if (_isIDSeparator(*position)) { + if (_isIDSeparator(*position)) { ++position; } @@ -1280,7 +1281,7 @@ uloc_minimizeSubtags(const char* localeID, // Pairs of (language subtag, + or -) for finding out fast if common languages // are LTR (minus) or RTL (plus). -static const char* LANG_DIR_STRING = +static const char LANG_DIR_STRING[] = "root-en-es-pt-zh-ja-ko-de-fr-it-ar+he+fa+ru-nl-pl-th-tr-"; // Implemented here because this calls uloc_addLikelySubtags(). diff --git a/Build/source/libs/icu/icu-src/source/common/locmap.c b/Build/source/libs/icu/icu-src/source/common/locmap.c deleted file mode 100644 index 1e28bd7886a..00000000000 --- a/Build/source/libs/icu/icu-src/source/common/locmap.c +++ /dev/null @@ -1,1175 +0,0 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. -// License & terms of use: http://www.unicode.org/copyright.html -/* - ********************************************************************** - * Copyright (C) 1996-2016, International Business Machines - * Corporation and others. All Rights Reserved. - ********************************************************************** - * - * Provides functionality for mapping between - * LCID and Posix IDs or ICU locale to codepage - * - * Note: All classes and code in this file are - * intended for internal use only. - * - * Methods of interest: - * unsigned long convertToLCID(const char*); - * const char* convertToPosix(unsigned long); - * - * Kathleen Wilson, 4/30/96 - * - * Date Name Description - * 3/11/97 aliu Fixed off-by-one bug in assignment operator. Added - * setId() method and safety check against - * MAX_ID_LENGTH. - * 04/23/99 stephen Added C wrapper for convertToPosix. - * 09/18/00 george Removed the memory leaks. - * 08/23/01 george Convert to C - */ - -#include "locmap.h" -#include "cstring.h" -#include "cmemory.h" - -#if U_PLATFORM == U_PF_WINDOWS && defined(_MSC_VER) && (_MSC_VER >= 1500) -/* - * TODO: It seems like we should widen this to - * either U_PLATFORM_USES_ONLY_WIN32_API (includes MinGW) - * or U_PLATFORM_HAS_WIN32_API (includes MinGW and Cygwin) - * but those use gcc and won't have defined(_MSC_VER). - * We might need to #include some Windows header and test for some version macro from there. - * Or call some Windows function and see what it returns. - */ -#define USE_WINDOWS_LOCALE_API -#endif - -#ifdef USE_WINDOWS_LOCALE_API -#include -#include -#endif - -/* - * Note: - * The mapping from Win32 locale ID numbers to POSIX locale strings should - * be the faster one. - * - * Many LCID values come from winnt.h - * Some also come from http://www.microsoft.com/globaldev/reference/lcid-all.mspx - */ - -/* -//////////////////////////////////////////////// -// -// Internal Classes for LCID <--> POSIX Mapping -// -///////////////////////////////////////////////// -*/ - -typedef struct ILcidPosixElement -{ - const uint32_t hostID; - const char * const posixID; -} ILcidPosixElement; - -typedef struct ILcidPosixMap -{ - const uint32_t numRegions; - const struct ILcidPosixElement* const regionMaps; -} ILcidPosixMap; - - -/* -///////////////////////////////////////////////// -// -// Easy macros to make the LCID <--> POSIX Mapping -// -///////////////////////////////////////////////// -*/ - -/** - * The standard one language/one country mapping for LCID. - * The first element must be the language, and the following - * elements are the language with the country. - * @param hostID LCID in host format such as 0x044d - * @param languageID posix ID of just the language such as 'de' - * @param posixID posix ID of the language_TERRITORY such as 'de_CH' - */ -#define ILCID_POSIX_ELEMENT_ARRAY(hostID, languageID, posixID) \ -static const ILcidPosixElement locmap_ ## languageID [] = { \ - {LANGUAGE_LCID(hostID), #languageID}, /* parent locale */ \ - {hostID, #posixID}, \ -}; - -/** - * Define a subtable by ID - * @param id the POSIX ID, either a language or language_TERRITORY - */ -#define ILCID_POSIX_SUBTABLE(id) \ -static const ILcidPosixElement locmap_ ## id [] = - - -/** - * Create the map for the posixID. This macro supposes that the language string - * name is the same as the global variable name, and that the first element - * in the ILcidPosixElement is just the language. - * @param _posixID the full POSIX ID for this entry. - */ -#define ILCID_POSIX_MAP(_posixID) \ - {UPRV_LENGTHOF(locmap_ ## _posixID), locmap_ ## _posixID} - -/* -//////////////////////////////////////////// -// -// Create the table of LCID to POSIX Mapping -// None of it should be dynamically created. -// -// Keep static locale variables inside the function so that -// it can be created properly during static init. -// -// Note: This table should be updated periodically. Check the National Lanaguage Support API Reference Website. -// Microsoft is moving away from LCID in favor of locale name as of Vista. This table needs to be -// maintained for support of older Windows version. -// Update: Windows 7 (091130) -// -// Note: Microsoft assign a different LCID if a locale has a sorting variant. POSIX IDs below may contain -// @collation=XXX, but no other keywords are allowed (at least for now). When uprv_convertToLCID() is -// called from uloc_getLCID(), keywords other than collation are already removed. If we really need -// to support other keywords in this mapping data, we must update the implementation. -//////////////////////////////////////////// -*/ - -ILCID_POSIX_ELEMENT_ARRAY(0x0436, af, af_ZA) - -ILCID_POSIX_SUBTABLE(ar) { - {0x01, "ar"}, - {0x3801, "ar_AE"}, - {0x3c01, "ar_BH"}, - {0x1401, "ar_DZ"}, - {0x0c01, "ar_EG"}, - {0x0801, "ar_IQ"}, - {0x2c01, "ar_JO"}, - {0x3401, "ar_KW"}, - {0x3001, "ar_LB"}, - {0x1001, "ar_LY"}, - {0x1801, "ar_MA"}, - {0x1801, "ar_MO"}, - {0x2001, "ar_OM"}, - {0x4001, "ar_QA"}, - {0x0401, "ar_SA"}, - {0x2801, "ar_SY"}, - {0x1c01, "ar_TN"}, - {0x2401, "ar_YE"} -}; - -ILCID_POSIX_ELEMENT_ARRAY(0x044d, as, as_IN) -ILCID_POSIX_ELEMENT_ARRAY(0x045e, am, am_ET) -ILCID_POSIX_ELEMENT_ARRAY(0x047a, arn,arn_CL) - -ILCID_POSIX_SUBTABLE(az) { - {0x2c, "az"}, - {0x082c, "az_Cyrl_AZ"}, /* Cyrillic based */ - {0x742c, "az_Cyrl"}, /* Cyrillic based */ - {0x042c, "az_Latn_AZ"}, /* Latin based */ - {0x782c, "az_Latn"}, /* Latin based */ - {0x042c, "az_AZ"} /* Latin based */ -}; - -ILCID_POSIX_ELEMENT_ARRAY(0x046d, ba, ba_RU) -ILCID_POSIX_ELEMENT_ARRAY(0x0423, be, be_BY) - -/*ILCID_POSIX_SUBTABLE(ber) { - {0x5f, "ber"}, - {0x045f, "ber_Arab_DZ"}, - {0x045f, "ber_Arab"}, - {0x085f, "ber_Latn_DZ"}, - {0x085f, "ber_Latn"} -};*/ - -ILCID_POSIX_ELEMENT_ARRAY(0x0402, bg, bg_BG) - -ILCID_POSIX_ELEMENT_ARRAY(0x0466, bin, bin_NG) - -ILCID_POSIX_SUBTABLE(bn) { - {0x45, "bn"}, - {0x0845, "bn_BD"}, - {0x0445, "bn_IN"} -}; - -ILCID_POSIX_SUBTABLE(bo) { - {0x51, "bo"}, - {0x0851, "bo_BT"}, - {0x0451, "bo_CN"}, - {0x0c51, "dz_BT"} -}; - -ILCID_POSIX_ELEMENT_ARRAY(0x047e, br, br_FR) - -ILCID_POSIX_SUBTABLE(ca) { - {0x03, "ca"}, - {0x0403, "ca_ES"}, - {0x0803, "ca_ES_VALENCIA"} -}; - -ILCID_POSIX_ELEMENT_ARRAY(0x0483, co, co_FR) -ILCID_POSIX_ELEMENT_ARRAY(0x045c, chr,chr_US) - -ILCID_POSIX_SUBTABLE(ckb) { - {0x92, "ckb"}, - {0x7c92, "ckb_Arab"}, - {0x0492, "ckb_Arab_IQ"} -}; - -/* Declared as cs_CZ to get around compiler errors on z/OS, which defines cs as a function */ -ILCID_POSIX_ELEMENT_ARRAY(0x0405, cs, cs_CZ) - -ILCID_POSIX_ELEMENT_ARRAY(0x0452, cy, cy_GB) -ILCID_POSIX_ELEMENT_ARRAY(0x0406, da, da_DK) - -ILCID_POSIX_SUBTABLE(de) { - {0x07, "de"}, - {0x0c07, "de_AT"}, - {0x0807, "de_CH"}, - {0x0407, "de_DE"}, - {0x1407, "de_LI"}, - {0x1007, "de_LU"}, - {0x10407,"de_DE@collation=phonebook"}, /*This is really de_DE_PHONEBOOK on Windows*/ - {0x10407,"de@collation=phonebook"} /*This is really de_DE_PHONEBOOK on Windows*/ -}; - -ILCID_POSIX_ELEMENT_ARRAY(0x0465, dv, dv_MV) -ILCID_POSIX_ELEMENT_ARRAY(0x0408, el, el_GR) - -ILCID_POSIX_SUBTABLE(en) { - {0x09, "en"}, - {0x0c09, "en_AU"}, - {0x2809, "en_BZ"}, - {0x1009, "en_CA"}, - {0x0809, "en_GB"}, - {0x3c09, "en_HK"}, - {0x3809, "en_ID"}, - {0x1809, "en_IE"}, - {0x4009, "en_IN"}, - {0x2009, "en_JM"}, - {0x4409, "en_MY"}, - {0x1409, "en_NZ"}, - {0x3409, "en_PH"}, - {0x4809, "en_SG"}, - {0x2C09, "en_TT"}, - {0x0409, "en_US"}, - {0x007f, "en_US_POSIX"}, /* duplicate for roundtripping */ - {0x2409, "en_VI"}, /* Virgin Islands AKA Caribbean Islands (en_CB). */ - {0x1c09, "en_ZA"}, - {0x3009, "en_ZW"}, - {0x2409, "en_029"}, - {0x0409, "en_AS"}, /* Alias for en_US. Leave last. */ - {0x0409, "en_GU"}, /* Alias for en_US. Leave last. */ - {0x0409, "en_MH"}, /* Alias for en_US. Leave last. */ - {0x0409, "en_MP"}, /* Alias for en_US. Leave last. */ - {0x0409, "en_UM"} /* Alias for en_US. Leave last. */ -}; - -ILCID_POSIX_SUBTABLE(en_US_POSIX) { - {0x007f, "en_US_POSIX"} /* duplicate for roundtripping */ -}; - -ILCID_POSIX_SUBTABLE(es) { - {0x0a, "es"}, - {0x2c0a, "es_AR"}, - {0x400a, "es_BO"}, - {0x340a, "es_CL"}, - {0x240a, "es_CO"}, - {0x140a, "es_CR"}, - {0x5c0a, "es_CU"}, - {0x1c0a, "es_DO"}, - {0x300a, "es_EC"}, - {0x0c0a, "es_ES"}, /*Modern sort.*/ - {0x100a, "es_GT"}, - {0x480a, "es_HN"}, - {0x080a, "es_MX"}, - {0x4c0a, "es_NI"}, - {0x180a, "es_PA"}, - {0x280a, "es_PE"}, - {0x500a, "es_PR"}, - {0x3c0a, "es_PY"}, - {0x440a, "es_SV"}, - {0x540a, "es_US"}, - {0x380a, "es_UY"}, - {0x200a, "es_VE"}, - {0x580a, "es_419"}, - {0x040a, "es_ES@collation=traditional"}, - {0x040a, "es@collation=traditional"} -}; - -ILCID_POSIX_ELEMENT_ARRAY(0x0425, et, et_EE) -ILCID_POSIX_ELEMENT_ARRAY(0x042d, eu, eu_ES) - -/* ISO-639 doesn't distinguish between Persian and Dari.*/ -ILCID_POSIX_SUBTABLE(fa) { - {0x29, "fa"}, - {0x0429, "fa_IR"}, /* Persian/Farsi (Iran) */ - {0x048c, "fa_AF"} /* Persian/Dari (Afghanistan) */ -}; - -/* duplicate for roundtripping */ -ILCID_POSIX_SUBTABLE(fa_AF) { - {0x8c, "fa_AF"}, /* Persian/Dari (Afghanistan) */ - {0x048c, "fa_AF"} /* Persian/Dari (Afghanistan) */ -}; - -ILCID_POSIX_SUBTABLE(ff) { - {0x67, "ff"}, - {0x7c67, "ff_Latn"}, - {0x0867, "ff_Latn_SN"}, - {0x0467, "ff_NG"} -}; - -ILCID_POSIX_ELEMENT_ARRAY(0x040b, fi, fi_FI) -ILCID_POSIX_ELEMENT_ARRAY(0x0464, fil,fil_PH) -ILCID_POSIX_ELEMENT_ARRAY(0x0438, fo, fo_FO) - -ILCID_POSIX_SUBTABLE(fr) { - {0x0c, "fr"}, - {0x080c, "fr_BE"}, - {0x0c0c, "fr_CA"}, - {0x240c, "fr_CD"}, - {0x240c, "fr_CG"}, - {0x100c, "fr_CH"}, - {0x300c, "fr_CI"}, - {0x2c0c, "fr_CM"}, - {0x040c, "fr_FR"}, - {0x3c0c, "fr_HT"}, - {0x140c, "fr_LU"}, - {0x380c, "fr_MA"}, - {0x180c, "fr_MC"}, - {0x340c, "fr_ML"}, - {0x200c, "fr_RE"}, - {0x280c, "fr_SN"}, - {0xe40c, "fr_015"}, - {0x1c0c, "fr_029"} -}; - -ILCID_POSIX_ELEMENT_ARRAY(0x0467, fuv, fuv_NG) - -ILCID_POSIX_ELEMENT_ARRAY(0x0462, fy, fy_NL) - -ILCID_POSIX_SUBTABLE(ga) { /* Gaelic (Ireland) */ - {0x3c, "ga"}, - {0x083c, "ga_IE"}, - {0x043c, "gd_GB"} -}; - -ILCID_POSIX_SUBTABLE(gd) { /* Gaelic (Scotland) */ - {0x91, "gd"}, - {0x0491, "gd_GB"} -}; - -ILCID_POSIX_ELEMENT_ARRAY(0x0456, gl, gl_ES) -ILCID_POSIX_ELEMENT_ARRAY(0x0447, gu, gu_IN) -ILCID_POSIX_ELEMENT_ARRAY(0x0474, gn, gn_PY) -ILCID_POSIX_ELEMENT_ARRAY(0x0484, gsw,gsw_FR) - -ILCID_POSIX_SUBTABLE(ha) { - {0x68, "ha"}, - {0x7c68, "ha_Latn"}, - {0x0468, "ha_Latn_NG"}, -}; - -ILCID_POSIX_ELEMENT_ARRAY(0x0475, haw,haw_US) -ILCID_POSIX_ELEMENT_ARRAY(0x040d, he, he_IL) -ILCID_POSIX_ELEMENT_ARRAY(0x0439, hi, hi_IN) - -/* This LCID is really four different locales.*/ -ILCID_POSIX_SUBTABLE(hr) { - {0x1a, "hr"}, - {0x141a, "bs_Latn_BA"}, /* Bosnian, Bosnia and Herzegovina */ - {0x681a, "bs_Latn"}, /* Bosnian, Bosnia and Herzegovina */ - {0x141a, "bs_BA"}, /* Bosnian, Bosnia and Herzegovina */ - {0x781a, "bs"}, /* Bosnian */ - {0x201a, "bs_Cyrl_BA"}, /* Bosnian, Bosnia and Herzegovina */ - {0x641a, "bs_Cyrl"}, /* Bosnian, Bosnia and Herzegovina */ - {0x101a, "hr_BA"}, /* Croatian in Bosnia */ - {0x041a, "hr_HR"}, /* Croatian*/ - {0x2c1a, "sr_Latn_ME"}, - {0x241a, "sr_Latn_RS"}, - {0x181a, "sr_Latn_BA"}, /* Serbo-Croatian in Bosnia */ - {0x081a, "sr_Latn_CS"}, /* Serbo-Croatian*/ - {0x701a, "sr_Latn"}, /* It's 0x1a or 0x081a, pick one to make the test program happy. */ - {0x1c1a, "sr_Cyrl_BA"}, /* Serbo-Croatian in Bosnia */ - {0x0c1a, "sr_Cyrl_CS"}, /* Serbian*/ - {0x301a, "sr_Cyrl_ME"}, - {0x281a, "sr_Cyrl_RS"}, - {0x6c1a, "sr_Cyrl"}, /* It's 0x1a or 0x0c1a, pick one to make the test program happy. */ - {0x7c1a, "sr"} /* In CLDR sr is sr_Cyrl. */ -}; - -ILCID_POSIX_SUBTABLE(hsb) { - {0x2E, "hsb"}, - {0x042E, "hsb_DE"}, - {0x082E, "dsb_DE"}, - {0x7C2E, "dsb"}, -}; - -ILCID_POSIX_ELEMENT_ARRAY(0x040e, hu, hu_HU) -ILCID_POSIX_ELEMENT_ARRAY(0x042b, hy, hy_AM) -ILCID_POSIX_ELEMENT_ARRAY(0x0469, ibb, ibb_NG) -ILCID_POSIX_ELEMENT_ARRAY(0x0421, id, id_ID) -ILCID_POSIX_ELEMENT_ARRAY(0x0470, ig, ig_NG) -ILCID_POSIX_ELEMENT_ARRAY(0x0478, ii, ii_CN) -ILCID_POSIX_ELEMENT_ARRAY(0x040f, is, is_IS) - -ILCID_POSIX_SUBTABLE(it) { - {0x10, "it"}, - {0x0810, "it_CH"}, - {0x0410, "it_IT"} -}; - -ILCID_POSIX_SUBTABLE(iu) { - {0x5d, "iu"}, - {0x045d, "iu_Cans_CA"}, - {0x785d, "iu_Cans"}, - {0x085d, "iu_Latn_CA"}, - {0x7c5d, "iu_Latn"} -}; - -ILCID_POSIX_ELEMENT_ARRAY(0x040d, iw, iw_IL) /*Left in for compatibility*/ -ILCID_POSIX_ELEMENT_ARRAY(0x0411, ja, ja_JP) -ILCID_POSIX_ELEMENT_ARRAY(0x0437, ka, ka_GE) -ILCID_POSIX_ELEMENT_ARRAY(0x043f, kk, kk_KZ) -ILCID_POSIX_ELEMENT_ARRAY(0x046f, kl, kl_GL) -ILCID_POSIX_ELEMENT_ARRAY(0x0453, km, km_KH) -ILCID_POSIX_ELEMENT_ARRAY(0x044b, kn, kn_IN) - -ILCID_POSIX_SUBTABLE(ko) { - {0x12, "ko"}, - {0x0812, "ko_KP"}, - {0x0412, "ko_KR"} -}; - -ILCID_POSIX_ELEMENT_ARRAY(0x0457, kok, kok_IN) -ILCID_POSIX_ELEMENT_ARRAY(0x0471, kr, kr_NG) - -ILCID_POSIX_SUBTABLE(ks) { /* We could add PK and CN too */ - {0x60, "ks"}, - {0x0860, "ks_IN"}, /* Documentation doesn't mention script */ - {0x0460, "ks_Arab_IN"}, - {0x0860, "ks_Deva_IN"} -}; - -ILCID_POSIX_ELEMENT_ARRAY(0x0440, ky, ky_KG) /* Kyrgyz is spoken in Kyrgyzstan */ -ILCID_POSIX_ELEMENT_ARRAY(0x0476, la, la_IT) /* TODO: Verify the country */ -ILCID_POSIX_ELEMENT_ARRAY(0x046e, lb, lb_LU) -ILCID_POSIX_ELEMENT_ARRAY(0x0454, lo, lo_LA) -ILCID_POSIX_ELEMENT_ARRAY(0x0427, lt, lt_LT) -ILCID_POSIX_ELEMENT_ARRAY(0x0426, lv, lv_LV) -ILCID_POSIX_ELEMENT_ARRAY(0x0481, mi, mi_NZ) -ILCID_POSIX_ELEMENT_ARRAY(0x042f, mk, mk_MK) -ILCID_POSIX_ELEMENT_ARRAY(0x044c, ml, ml_IN) - -ILCID_POSIX_SUBTABLE(mn) { - {0x50, "mn"}, - {0x0450, "mn_MN"}, - {0x7c50, "mn_Mong"}, - {0x0850, "mn_Mong_CN"}, - {0x0850, "mn_CN"}, - {0x7850, "mn_Cyrl"}, - {0x0c50, "mn_Mong_MN"} -}; - -ILCID_POSIX_ELEMENT_ARRAY(0x0458, mni,mni_IN) -ILCID_POSIX_ELEMENT_ARRAY(0x047c, moh,moh_CA) -ILCID_POSIX_ELEMENT_ARRAY(0x044e, mr, mr_IN) - -ILCID_POSIX_SUBTABLE(ms) { - {0x3e, "ms"}, - {0x083e, "ms_BN"}, /* Brunei Darussalam*/ - {0x043e, "ms_MY"} /* Malaysia*/ -}; - -ILCID_POSIX_ELEMENT_ARRAY(0x043a, mt, mt_MT) -ILCID_POSIX_ELEMENT_ARRAY(0x0455, my, my_MM) - -ILCID_POSIX_SUBTABLE(ne) { - {0x61, "ne"}, - {0x0861, "ne_IN"}, /* India*/ - {0x0461, "ne_NP"} /* Nepal*/ -}; - -ILCID_POSIX_SUBTABLE(nl) { - {0x13, "nl"}, - {0x0813, "nl_BE"}, - {0x0413, "nl_NL"} -}; - -/* The "no" locale split into nb and nn. By default in ICU, "no" is nb.*/ -ILCID_POSIX_SUBTABLE(no) { - {0x14, "no"}, /* really nb_NO */ - {0x7c14, "nb"}, /* really nb */ - {0x0414, "nb_NO"}, /* really nb_NO. Keep first in the 414 list. */ - {0x0414, "no_NO"}, /* really nb_NO */ - {0x0814, "nn_NO"}, /* really nn_NO. Keep first in the 814 list. */ - {0x7814, "nn"}, /* It's 0x14 or 0x814, pick one to make the test program happy. */ - {0x0814, "no_NO_NY"}/* really nn_NO */ -}; - -ILCID_POSIX_ELEMENT_ARRAY(0x046c, nso,nso_ZA) /* TODO: Verify the ISO-639 code */ -ILCID_POSIX_ELEMENT_ARRAY(0x0482, oc, oc_FR) - -ILCID_POSIX_SUBTABLE(om) { /* TODO: Verify the country */ - {0x72, "om"}, - {0x0472, "om_ET"}, - {0x0472, "gaz_ET"} -}; - -/* Declared as or_IN to get around compiler errors*/ -ILCID_POSIX_SUBTABLE(or_IN) { - {0x48, "or"}, - {0x0448, "or_IN"}, -}; - - -ILCID_POSIX_SUBTABLE(pa) { - {0x46, "pa"}, - {0x0446, "pa_IN"}, - {0x0846, "pa_PK"}, - {0x0846, "pa_Arab_PK"} -}; - -ILCID_POSIX_ELEMENT_ARRAY(0x0479, pap, pap_AN) -ILCID_POSIX_ELEMENT_ARRAY(0x0415, pl, pl_PL) -ILCID_POSIX_ELEMENT_ARRAY(0x0463, ps, ps_AF) - -ILCID_POSIX_SUBTABLE(pt) { - {0x16, "pt"}, - {0x0416, "pt_BR"}, - {0x0816, "pt_PT"} -}; - -ILCID_POSIX_SUBTABLE(qu) { - {0x6b, "qu"}, - {0x046b, "qu_BO"}, - {0x086b, "qu_EC"}, - {0x0C6b, "qu_PE"}, - {0x046b, "quz_BO"}, - {0x086b, "quz_EC"}, - {0x0C6b, "quz_PE"} -}; - -ILCID_POSIX_SUBTABLE(quc) { - {0x93, "quc"}, - {0x0493, "quc_CO"}, - /* - "quc_Latn_GT" is an exceptional case. Language ID of "quc" - is 0x93, but LCID of "quc_Latn_GT" is 0x486, which should be - under the group of "qut". "qut" is a retired ISO 639-3 language - code for West Central Quiche, and merged to "quc". - It looks Windows previously reserved "qut" for K'iche', but, - decided to use "quc" when adding a locale for K'iche' (Guatemala). - - This data structure used here assumes language ID bits in - LCID is unique for alphabetic language code. But this is not true - for "quc_Latn_GT". If we don't have the data below, LCID look up - by alphabetic locale ID (POSIX) will fail. The same entry is found - under "qut" below, which is required for reverse look up. - */ - {0x0486, "quc_Latn_GT"} -}; - -ILCID_POSIX_SUBTABLE(qut) { - {0x86, "qut"}, - {0x0486, "qut_GT"}, - /* - See the note in "quc" above. - */ - {0x0486, "quc_Latn_GT"} -}; - -ILCID_POSIX_ELEMENT_ARRAY(0x0417, rm, rm_CH) - -ILCID_POSIX_SUBTABLE(ro) { - {0x18, "ro"}, - {0x0418, "ro_RO"}, - {0x0818, "ro_MD"} -}; - -ILCID_POSIX_SUBTABLE(root) { - {0x00, "root"} -}; - -ILCID_POSIX_SUBTABLE(ru) { - {0x19, "ru"}, - {0x0419, "ru_RU"}, - {0x0819, "ru_MD"} -}; - -ILCID_POSIX_ELEMENT_ARRAY(0x0487, rw, rw_RW) -ILCID_POSIX_ELEMENT_ARRAY(0x044f, sa, sa_IN) -ILCID_POSIX_ELEMENT_ARRAY(0x0485, sah,sah_RU) - -ILCID_POSIX_SUBTABLE(sd) { - {0x59, "sd"}, - {0x0459, "sd_IN"}, - {0x0459, "sd_Deva_IN"}, - {0x0859, "sd_PK"} -}; - -ILCID_POSIX_SUBTABLE(se) { - {0x3b, "se"}, - {0x0c3b, "se_FI"}, - {0x043b, "se_NO"}, - {0x083b, "se_SE"}, - {0x783b, "sma"}, - {0x183b, "sma_NO"}, - {0x1c3b, "sma_SE"}, - {0x7c3b, "smj"}, - {0x703b, "smn"}, - {0x743b, "sms"}, - {0x103b, "smj_NO"}, - {0x143b, "smj_SE"}, - {0x243b, "smn_FI"}, - {0x203b, "sms_FI"}, -}; - -ILCID_POSIX_ELEMENT_ARRAY(0x045b, si, si_LK) -ILCID_POSIX_ELEMENT_ARRAY(0x041b, sk, sk_SK) -ILCID_POSIX_ELEMENT_ARRAY(0x0424, sl, sl_SI) - -ILCID_POSIX_SUBTABLE(so) { /* TODO: Verify the country */ - {0x77, "so"}, - {0x0477, "so_ET"}, - {0x0477, "so_SO"} -}; - -ILCID_POSIX_ELEMENT_ARRAY(0x041c, sq, sq_AL) -ILCID_POSIX_ELEMENT_ARRAY(0x0430, st, st_ZA) - -ILCID_POSIX_SUBTABLE(sv) { - {0x1d, "sv"}, - {0x081d, "sv_FI"}, - {0x041d, "sv_SE"} -}; - -ILCID_POSIX_ELEMENT_ARRAY(0x0441, sw, sw_KE) -ILCID_POSIX_ELEMENT_ARRAY(0x045A, syr, syr_SY) - -ILCID_POSIX_SUBTABLE(ta) { - {0x49, "ta"}, - {0x0449, "ta_IN"}, - {0x0849, "ta_LK"} -}; - -ILCID_POSIX_ELEMENT_ARRAY(0x044a, te, te_IN) - -/* Cyrillic based by default */ -ILCID_POSIX_SUBTABLE(tg) { - {0x28, "tg"}, - {0x7c28, "tg_Cyrl"}, - {0x0428, "tg_Cyrl_TJ"} -}; - -ILCID_POSIX_ELEMENT_ARRAY(0x041e, th, th_TH) - -ILCID_POSIX_SUBTABLE(ti) { - {0x73, "ti"}, - {0x0873, "ti_ER"}, - {0x0473, "ti_ET"} -}; - -ILCID_POSIX_ELEMENT_ARRAY(0x0442, tk, tk_TM) - -ILCID_POSIX_SUBTABLE(tn) { - {0x32, "tn"}, - {0x0832, "tn_BW"}, - {0x0432, "tn_ZA"} -}; - -ILCID_POSIX_ELEMENT_ARRAY(0x041f, tr, tr_TR) -ILCID_POSIX_ELEMENT_ARRAY(0x0431, ts, ts_ZA) -ILCID_POSIX_ELEMENT_ARRAY(0x0444, tt, tt_RU) - -ILCID_POSIX_SUBTABLE(tzm) { - {0x5f, "tzm"}, - {0x7c5f, "tzm_Latn"}, - {0x085f, "tzm_Latn_DZ"}, - {0x105f, "tzm_Tfng_MA"}, - {0x045f, "tzm_Arab_MA"}, - {0x045f, "tmz"} -}; - -ILCID_POSIX_SUBTABLE(ug) { - {0x80, "ug"}, - {0x0480, "ug_CN"}, - {0x0480, "ug_Arab_CN"} -}; - -ILCID_POSIX_ELEMENT_ARRAY(0x0422, uk, uk_UA) - -ILCID_POSIX_SUBTABLE(ur) { - {0x20, "ur"}, - {0x0820, "ur_IN"}, - {0x0420, "ur_PK"} -}; - -ILCID_POSIX_SUBTABLE(uz) { - {0x43, "uz"}, - {0x0843, "uz_Cyrl_UZ"}, /* Cyrillic based */ - {0x7843, "uz_Cyrl"}, /* Cyrillic based */ - {0x0843, "uz_UZ"}, /* Cyrillic based */ - {0x0443, "uz_Latn_UZ"}, /* Latin based */ - {0x7c43, "uz_Latn"} /* Latin based */ -}; - -ILCID_POSIX_SUBTABLE(ve) { /* TODO: Verify the country */ - {0x33, "ve"}, - {0x0433, "ve_ZA"}, - {0x0433, "ven_ZA"} -}; - -ILCID_POSIX_ELEMENT_ARRAY(0x042a, vi, vi_VN) -ILCID_POSIX_ELEMENT_ARRAY(0x0488, wo, wo_SN) -ILCID_POSIX_ELEMENT_ARRAY(0x0434, xh, xh_ZA) -ILCID_POSIX_ELEMENT_ARRAY(0x043d, yi, yi) -ILCID_POSIX_ELEMENT_ARRAY(0x046a, yo, yo_NG) - -ILCID_POSIX_SUBTABLE(zh) { - {0x0004, "zh_Hans"}, - {0x7804, "zh"}, - {0x0804, "zh_CN"}, - {0x0804, "zh_Hans_CN"}, - {0x0c04, "zh_Hant_HK"}, - {0x0c04, "zh_HK"}, - {0x1404, "zh_Hant_MO"}, - {0x1404, "zh_MO"}, - {0x1004, "zh_Hans_SG"}, - {0x1004, "zh_SG"}, - {0x0404, "zh_Hant_TW"}, - {0x7c04, "zh_Hant"}, - {0x0404, "zh_TW"}, - {0x30404,"zh_Hant_TW"}, /* Bopomofo order */ - {0x30404,"zh_TW"}, /* Bopomofo order */ - {0x20004,"zh@collation=stroke"}, - {0x20404,"zh_Hant@collation=stroke"}, - {0x20404,"zh_Hant_TW@collation=stroke"}, - {0x20404,"zh_TW@collation=stroke"}, - {0x20804,"zh_Hans@collation=stroke"}, - {0x20804,"zh_Hans_CN@collation=stroke"}, - {0x20804,"zh_CN@collation=stroke"} -}; - -ILCID_POSIX_ELEMENT_ARRAY(0x0435, zu, zu_ZA) - -/* This must be static and grouped by LCID. */ -static const ILcidPosixMap gPosixIDmap[] = { - ILCID_POSIX_MAP(af), /* af Afrikaans 0x36 */ - ILCID_POSIX_MAP(am), /* am Amharic 0x5e */ - ILCID_POSIX_MAP(ar), /* ar Arabic 0x01 */ - ILCID_POSIX_MAP(arn), /* arn Araucanian/Mapudungun 0x7a */ - ILCID_POSIX_MAP(as), /* as Assamese 0x4d */ - ILCID_POSIX_MAP(az), /* az Azerbaijani 0x2c */ - ILCID_POSIX_MAP(ba), /* ba Bashkir 0x6d */ - ILCID_POSIX_MAP(be), /* be Belarusian 0x23 */ -/* ILCID_POSIX_MAP(ber), ber Berber/Tamazight 0x5f */ - ILCID_POSIX_MAP(bg), /* bg Bulgarian 0x02 */ - ILCID_POSIX_MAP(bin), /* bin Edo 0x66 */ - ILCID_POSIX_MAP(bn), /* bn Bengali; Bangla 0x45 */ - ILCID_POSIX_MAP(bo), /* bo Tibetan 0x51 */ - ILCID_POSIX_MAP(br), /* br Breton 0x7e */ - ILCID_POSIX_MAP(ca), /* ca Catalan 0x03 */ - ILCID_POSIX_MAP(chr), /* chr Cherokee 0x5c */ - ILCID_POSIX_MAP(ckb), /* ckb Sorani (Central Kurdish) 0x92 */ - ILCID_POSIX_MAP(co), /* co Corsican 0x83 */ - ILCID_POSIX_MAP(cs), /* cs Czech 0x05 */ - ILCID_POSIX_MAP(cy), /* cy Welsh 0x52 */ - ILCID_POSIX_MAP(da), /* da Danish 0x06 */ - ILCID_POSIX_MAP(de), /* de German 0x07 */ - ILCID_POSIX_MAP(dv), /* dv Divehi 0x65 */ - ILCID_POSIX_MAP(el), /* el Greek 0x08 */ - ILCID_POSIX_MAP(en), /* en English 0x09 */ - ILCID_POSIX_MAP(en_US_POSIX), /* invariant 0x7f */ - ILCID_POSIX_MAP(es), /* es Spanish 0x0a */ - ILCID_POSIX_MAP(et), /* et Estonian 0x25 */ - ILCID_POSIX_MAP(eu), /* eu Basque 0x2d */ - ILCID_POSIX_MAP(fa), /* fa Persian/Farsi 0x29 */ - ILCID_POSIX_MAP(fa_AF), /* fa Persian/Dari 0x8c */ - ILCID_POSIX_MAP(ff), /* ff Fula 0x67 */ - ILCID_POSIX_MAP(fi), /* fi Finnish 0x0b */ - ILCID_POSIX_MAP(fil), /* fil Filipino 0x64 */ - ILCID_POSIX_MAP(fo), /* fo Faroese 0x38 */ - ILCID_POSIX_MAP(fr), /* fr French 0x0c */ - ILCID_POSIX_MAP(fuv), /* fuv Fulfulde - Nigeria 0x67 */ - ILCID_POSIX_MAP(fy), /* fy Frisian 0x62 */ - ILCID_POSIX_MAP(ga), /* * Gaelic (Ireland,Scotland) 0x3c */ - ILCID_POSIX_MAP(gd), /* gd Gaelic (United Kingdom) 0x91 */ - ILCID_POSIX_MAP(gl), /* gl Galician 0x56 */ - ILCID_POSIX_MAP(gn), /* gn Guarani 0x74 */ - ILCID_POSIX_MAP(gsw), /* gsw Alemanic/Alsatian/Swiss German 0x84 */ - ILCID_POSIX_MAP(gu), /* gu Gujarati 0x47 */ - ILCID_POSIX_MAP(ha), /* ha Hausa 0x68 */ - ILCID_POSIX_MAP(haw), /* haw Hawaiian 0x75 */ - ILCID_POSIX_MAP(he), /* he Hebrew (formerly iw) 0x0d */ - ILCID_POSIX_MAP(hi), /* hi Hindi 0x39 */ - ILCID_POSIX_MAP(hr), /* * Croatian and others 0x1a */ - ILCID_POSIX_MAP(hsb), /* hsb Upper Sorbian 0x2e */ - ILCID_POSIX_MAP(hu), /* hu Hungarian 0x0e */ - ILCID_POSIX_MAP(hy), /* hy Armenian 0x2b */ - ILCID_POSIX_MAP(ibb), /* ibb Ibibio - Nigeria 0x69 */ - ILCID_POSIX_MAP(id), /* id Indonesian (formerly in) 0x21 */ - ILCID_POSIX_MAP(ig), /* ig Igbo 0x70 */ - ILCID_POSIX_MAP(ii), /* ii Sichuan Yi 0x78 */ - ILCID_POSIX_MAP(is), /* is Icelandic 0x0f */ - ILCID_POSIX_MAP(it), /* it Italian 0x10 */ - ILCID_POSIX_MAP(iu), /* iu Inuktitut 0x5d */ - ILCID_POSIX_MAP(iw), /* iw Hebrew 0x0d */ - ILCID_POSIX_MAP(ja), /* ja Japanese 0x11 */ - ILCID_POSIX_MAP(ka), /* ka Georgian 0x37 */ - ILCID_POSIX_MAP(kk), /* kk Kazakh 0x3f */ - ILCID_POSIX_MAP(kl), /* kl Kalaallisut 0x6f */ - ILCID_POSIX_MAP(km), /* km Khmer 0x53 */ - ILCID_POSIX_MAP(kn), /* kn Kannada 0x4b */ - ILCID_POSIX_MAP(ko), /* ko Korean 0x12 */ - ILCID_POSIX_MAP(kok), /* kok Konkani 0x57 */ - ILCID_POSIX_MAP(kr), /* kr Kanuri 0x71 */ - ILCID_POSIX_MAP(ks), /* ks Kashmiri 0x60 */ - ILCID_POSIX_MAP(ky), /* ky Kyrgyz 0x40 */ - ILCID_POSIX_MAP(lb), /* lb Luxembourgish 0x6e */ - ILCID_POSIX_MAP(la), /* la Latin 0x76 */ - ILCID_POSIX_MAP(lo), /* lo Lao 0x54 */ - ILCID_POSIX_MAP(lt), /* lt Lithuanian 0x27 */ - ILCID_POSIX_MAP(lv), /* lv Latvian, Lettish 0x26 */ - ILCID_POSIX_MAP(mi), /* mi Maori 0x81 */ - ILCID_POSIX_MAP(mk), /* mk Macedonian 0x2f */ - ILCID_POSIX_MAP(ml), /* ml Malayalam 0x4c */ - ILCID_POSIX_MAP(mn), /* mn Mongolian 0x50 */ - ILCID_POSIX_MAP(mni), /* mni Manipuri 0x58 */ - ILCID_POSIX_MAP(moh), /* moh Mohawk 0x7c */ - ILCID_POSIX_MAP(mr), /* mr Marathi 0x4e */ - ILCID_POSIX_MAP(ms), /* ms Malay 0x3e */ - ILCID_POSIX_MAP(mt), /* mt Maltese 0x3a */ - ILCID_POSIX_MAP(my), /* my Burmese 0x55 */ -/* ILCID_POSIX_MAP(nb), // no Norwegian 0x14 */ - ILCID_POSIX_MAP(ne), /* ne Nepali 0x61 */ - ILCID_POSIX_MAP(nl), /* nl Dutch 0x13 */ -/* ILCID_POSIX_MAP(nn), // no Norwegian 0x14 */ - ILCID_POSIX_MAP(no), /* * Norwegian 0x14 */ - ILCID_POSIX_MAP(nso), /* nso Sotho, Northern (Sepedi dialect) 0x6c */ - ILCID_POSIX_MAP(oc), /* oc Occitan 0x82 */ - ILCID_POSIX_MAP(om), /* om Oromo 0x72 */ - ILCID_POSIX_MAP(or_IN), /* or Oriya 0x48 */ - ILCID_POSIX_MAP(pa), /* pa Punjabi 0x46 */ - ILCID_POSIX_MAP(pap), /* pap Papiamentu 0x79 */ - ILCID_POSIX_MAP(pl), /* pl Polish 0x15 */ - ILCID_POSIX_MAP(ps), /* ps Pashto 0x63 */ - ILCID_POSIX_MAP(pt), /* pt Portuguese 0x16 */ - ILCID_POSIX_MAP(qu), /* qu Quechua 0x6B */ - ILCID_POSIX_MAP(quc), /* quc K'iche 0x93 */ - ILCID_POSIX_MAP(qut), /* qut K'iche 0x86 */ - ILCID_POSIX_MAP(rm), /* rm Raeto-Romance/Romansh 0x17 */ - ILCID_POSIX_MAP(ro), /* ro Romanian 0x18 */ - ILCID_POSIX_MAP(root), /* root 0x00 */ - ILCID_POSIX_MAP(ru), /* ru Russian 0x19 */ - ILCID_POSIX_MAP(rw), /* rw Kinyarwanda 0x87 */ - ILCID_POSIX_MAP(sa), /* sa Sanskrit 0x4f */ - ILCID_POSIX_MAP(sah), /* sah Yakut 0x85 */ - ILCID_POSIX_MAP(sd), /* sd Sindhi 0x59 */ - ILCID_POSIX_MAP(se), /* se Sami 0x3b */ -/* ILCID_POSIX_MAP(sh), // sh Serbo-Croatian 0x1a */ - ILCID_POSIX_MAP(si), /* si Sinhalese 0x5b */ - ILCID_POSIX_MAP(sk), /* sk Slovak 0x1b */ - ILCID_POSIX_MAP(sl), /* sl Slovenian 0x24 */ - ILCID_POSIX_MAP(so), /* so Somali 0x77 */ - ILCID_POSIX_MAP(sq), /* sq Albanian 0x1c */ -/* ILCID_POSIX_MAP(sr), // sr Serbian 0x1a */ - ILCID_POSIX_MAP(st), /* st Sutu 0x30 */ - ILCID_POSIX_MAP(sv), /* sv Swedish 0x1d */ - ILCID_POSIX_MAP(sw), /* sw Swahili 0x41 */ - ILCID_POSIX_MAP(syr), /* syr Syriac 0x5A */ - ILCID_POSIX_MAP(ta), /* ta Tamil 0x49 */ - ILCID_POSIX_MAP(te), /* te Telugu 0x4a */ - ILCID_POSIX_MAP(tg), /* tg Tajik 0x28 */ - ILCID_POSIX_MAP(th), /* th Thai 0x1e */ - ILCID_POSIX_MAP(ti), /* ti Tigrigna 0x73 */ - ILCID_POSIX_MAP(tk), /* tk Turkmen 0x42 */ - ILCID_POSIX_MAP(tn), /* tn Tswana 0x32 */ - ILCID_POSIX_MAP(tr), /* tr Turkish 0x1f */ - ILCID_POSIX_MAP(ts), /* ts Tsonga 0x31 */ - ILCID_POSIX_MAP(tt), /* tt Tatar 0x44 */ - ILCID_POSIX_MAP(tzm), /* tzm Tamazight 0x5f */ - ILCID_POSIX_MAP(ug), /* ug Uighur 0x80 */ - ILCID_POSIX_MAP(uk), /* uk Ukrainian 0x22 */ - ILCID_POSIX_MAP(ur), /* ur Urdu 0x20 */ - ILCID_POSIX_MAP(uz), /* uz Uzbek 0x43 */ - ILCID_POSIX_MAP(ve), /* ve Venda 0x33 */ - ILCID_POSIX_MAP(vi), /* vi Vietnamese 0x2a */ - ILCID_POSIX_MAP(wo), /* wo Wolof 0x88 */ - ILCID_POSIX_MAP(xh), /* xh Xhosa 0x34 */ - ILCID_POSIX_MAP(yi), /* yi Yiddish 0x3d */ - ILCID_POSIX_MAP(yo), /* yo Yoruba 0x6a */ - ILCID_POSIX_MAP(zh), /* zh Chinese 0x04 */ - ILCID_POSIX_MAP(zu), /* zu Zulu 0x35 */ -}; - -static const uint32_t gLocaleCount = UPRV_LENGTHOF(gPosixIDmap); - -/** - * Do not call this function. It is called by hostID. - * The function is not private because this struct must stay as a C struct, - * and this is an internal class. - */ -static int32_t -idCmp(const char* id1, const char* id2) -{ - int32_t diffIdx = 0; - while (*id1 == *id2 && *id1 != 0) { - diffIdx++; - id1++; - id2++; - } - return diffIdx; -} - -/** - * Searches for a Windows LCID - * - * @param posixid the Posix style locale id. - * @param status gets set to U_ILLEGAL_ARGUMENT_ERROR when the Posix ID has - * no equivalent Windows LCID. - * @return the LCID - */ -static uint32_t -getHostID(const ILcidPosixMap *this_0, const char* posixID, UErrorCode* status) -{ - int32_t bestIdx = 0; - int32_t bestIdxDiff = 0; - int32_t posixIDlen = (int32_t)uprv_strlen(posixID); - uint32_t idx; - - for (idx = 0; idx < this_0->numRegions; idx++ ) { - int32_t sameChars = idCmp(posixID, this_0->regionMaps[idx].posixID); - if (sameChars > bestIdxDiff && this_0->regionMaps[idx].posixID[sameChars] == 0) { - if (posixIDlen == sameChars) { - /* Exact match */ - return this_0->regionMaps[idx].hostID; - } - bestIdxDiff = sameChars; - bestIdx = idx; - } - } - /* We asked for something unusual, like en_ZZ, and we try to return the number for the same language. */ - /* We also have to make sure that sid and si and similar string subsets don't match. */ - if ((posixID[bestIdxDiff] == '_' || posixID[bestIdxDiff] == '@') - && this_0->regionMaps[bestIdx].posixID[bestIdxDiff] == 0) - { - *status = U_USING_FALLBACK_WARNING; - return this_0->regionMaps[bestIdx].hostID; - } - - /*no match found */ - *status = U_ILLEGAL_ARGUMENT_ERROR; - return this_0->regionMaps->hostID; -} - -static const char* -getPosixID(const ILcidPosixMap *this_0, uint32_t hostID) -{ - uint32_t i; - for (i = 0; i <= this_0->numRegions; i++) - { - if (this_0->regionMaps[i].hostID == hostID) - { - return this_0->regionMaps[i].posixID; - } - } - - /* If you get here, then no matching region was found, - so return the language id with the wild card region. */ - return this_0->regionMaps[0].posixID; -} - -/* -////////////////////////////////////// -// -// LCID --> POSIX -// -///////////////////////////////////// -*/ -#ifdef USE_WINDOWS_LOCALE_API -/* - * Various language tags needs to be changed: - * quz -> qu - * prs -> fa - */ -#define FIX_LANGUAGE_ID_TAG(buffer, len) \ - if (len >= 3) { \ - if (buffer[0] == 'q' && buffer[1] == 'u' && buffer[2] == 'z') {\ - buffer[2] = 0; \ - uprv_strcat(buffer, buffer+3); \ - } else if (buffer[0] == 'p' && buffer[1] == 'r' && buffer[2] == 's') {\ - buffer[0] = 'f'; buffer[1] = 'a'; buffer[2] = 0; \ - uprv_strcat(buffer, buffer+3); \ - } \ - } - -#endif -U_CAPI int32_t -uprv_convertToPosix(uint32_t hostid, char *posixID, int32_t posixIDCapacity, UErrorCode* status) -{ - uint16_t langID; - uint32_t localeIndex; - UBool bLookup = TRUE; - const char *pPosixID = NULL; - -#ifdef USE_WINDOWS_LOCALE_API - // Note: Windows primary lang ID 0x92 in LCID is used for Central Kurdish and - // GetLocaleInfo() maps such LCID to "ku". However, CLDR uses "ku" for - // Northern Kurdish and "ckb" for Central Kurdish. For this reason, we cannot - // use the Windows API to resolve locale ID for this specific case. - if ((hostid & 0x3FF) != 0x92) { - int32_t tmpLen = 0; - char locName[157]; /* ULOC_FULLNAME_CAPACITY */ - - tmpLen = GetLocaleInfoA(hostid, LOCALE_SNAME, (LPSTR)locName, UPRV_LENGTHOF(locName)); - if (tmpLen > 1) { - /* Windows locale name may contain sorting variant, such as "es-ES_tradnl". - In such case, we need special mapping data found in the hardcoded table - in this source file. */ - char *p = uprv_strchr(locName, '_'); - if (p) { - /* Keep the base locale, without variant */ - *p = 0; - tmpLen = uprv_strlen(locName); - } - else { - /* No hardcoded table lookup necessary */ - bLookup = FALSE; - } - /* Change the tag separator from '-' to '_' */ - p = locName; - while (*p) { - if (*p == '-') { - *p = '_'; - } - p++; - } - FIX_LANGUAGE_ID_TAG(locName, tmpLen); - pPosixID = locName; - } - } -#endif - if (bLookup) { - const char *pCandidate = NULL; - langID = LANGUAGE_LCID(hostid); - - for (localeIndex = 0; localeIndex < gLocaleCount; localeIndex++) { - if (langID == gPosixIDmap[localeIndex].regionMaps->hostID) { - pCandidate = getPosixID(&gPosixIDmap[localeIndex], hostid); - break; - } - } - - /* On Windows, when locale name has a variant, we still look up the hardcoded table. - If a match in the hardcoded table is longer than the Windows locale name without - variant, we use the one as the result */ - if (pCandidate && (pPosixID == NULL || uprv_strlen(pCandidate) > uprv_strlen(pPosixID))) { - pPosixID = pCandidate; - } - } - - if (pPosixID) { - int32_t resLen = uprv_strlen(pPosixID); - int32_t copyLen = resLen <= posixIDCapacity ? resLen : posixIDCapacity; - uprv_memcpy(posixID, pPosixID, copyLen); - if (resLen < posixIDCapacity) { - posixID[resLen] = 0; - if (*status == U_STRING_NOT_TERMINATED_WARNING) { - *status = U_ZERO_ERROR; - } - } else if (resLen == posixIDCapacity) { - *status = U_STRING_NOT_TERMINATED_WARNING; - } else { - *status = U_BUFFER_OVERFLOW_ERROR; - } - return resLen; - } - - /* no match found */ - *status = U_ILLEGAL_ARGUMENT_ERROR; - return -1; -} - -/* -////////////////////////////////////// -// -// POSIX --> LCID -// This should only be called from uloc_getLCID. -// The locale ID must be in canonical form. -// langID is separate so that this file doesn't depend on the uloc_* API. -// -///////////////////////////////////// -*/ - -U_CAPI uint32_t -uprv_convertToLCID(const char *langID, const char* posixID, UErrorCode* status) -{ - - uint32_t low = 0; - uint32_t high = gLocaleCount; - uint32_t mid; - uint32_t oldmid = 0; - int32_t compVal; - - uint32_t value = 0; - uint32_t fallbackValue = (uint32_t)-1; - UErrorCode myStatus; - uint32_t idx; - - /* Check for incomplete id. */ - if (!langID || !posixID || uprv_strlen(langID) < 2 || uprv_strlen(posixID) < 2) { - return 0; - } - - /*Binary search for the map entry for normal cases */ - - while (high > low) /*binary search*/{ - - mid = (high+low) >> 1; /*Finds median*/ - - if (mid == oldmid) - break; - - compVal = uprv_strcmp(langID, gPosixIDmap[mid].regionMaps->posixID); - if (compVal < 0){ - high = mid; - } - else if (compVal > 0){ - low = mid; - } - else /*we found it*/{ - return getHostID(&gPosixIDmap[mid], posixID, status); - } - oldmid = mid; - } - - /* - * Sometimes we can't do a binary search on posixID because some LCIDs - * go to different locales. We hit one of those special cases. - */ - for (idx = 0; idx < gLocaleCount; idx++ ) { - myStatus = U_ZERO_ERROR; - value = getHostID(&gPosixIDmap[idx], posixID, &myStatus); - if (myStatus == U_ZERO_ERROR) { - return value; - } - else if (myStatus == U_USING_FALLBACK_WARNING) { - fallbackValue = value; - } - } - - if (fallbackValue != (uint32_t)-1) { - *status = U_USING_FALLBACK_WARNING; - return fallbackValue; - } - - /* no match found */ - *status = U_ILLEGAL_ARGUMENT_ERROR; - return 0; /* return international (root) */ -} - diff --git a/Build/source/libs/icu/icu-src/source/common/locmap.cpp b/Build/source/libs/icu/icu-src/source/common/locmap.cpp new file mode 100644 index 00000000000..cbb2b810a58 --- /dev/null +++ b/Build/source/libs/icu/icu-src/source/common/locmap.cpp @@ -0,0 +1,1320 @@ +// © 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html +/* + ********************************************************************** + * Copyright (C) 1996-2016, International Business Machines + * Corporation and others. All Rights Reserved. + ********************************************************************** + * + * Provides functionality for mapping between + * LCID and Posix IDs or ICU locale to codepage + * + * Note: All classes and code in this file are + * intended for internal use only. + * + * Methods of interest: + * unsigned long convertToLCID(const char*); + * const char* convertToPosix(unsigned long); + * + * Kathleen Wilson, 4/30/96 + * + * Date Name Description + * 3/11/97 aliu Fixed off-by-one bug in assignment operator. Added + * setId() method and safety check against + * MAX_ID_LENGTH. + * 04/23/99 stephen Added C wrapper for convertToPosix. + * 09/18/00 george Removed the memory leaks. + * 08/23/01 george Convert to C + */ + +#include "locmap.h" +#include "cstring.h" +#include "cmemory.h" +#include "unicode/uloc.h" + +#if U_PLATFORM == U_PF_WINDOWS && defined(_MSC_VER) && (_MSC_VER >= 1500) +/* + * TODO: It seems like we should widen this to + * either U_PLATFORM_USES_ONLY_WIN32_API (includes MinGW) + * or U_PLATFORM_HAS_WIN32_API (includes MinGW and Cygwin) + * but those use gcc and won't have defined(_MSC_VER). + * We might need to #include some Windows header and test for some version macro from there. + * Or call some Windows function and see what it returns. + */ +#define USE_WINDOWS_LCID_MAPPING_API +#include +#include +#endif + +/* + * Note: + * The mapping from Win32 locale ID numbers to POSIX locale strings should + * be the faster one. + * + * Windows LCIDs are defined at https://msdn.microsoft.com/en-us/library/cc233965.aspx + * [MS-LCID] Windows Language Code Identifier (LCID) Reference + */ + +/* +//////////////////////////////////////////////// +// +// Internal Classes for LCID <--> POSIX Mapping +// +///////////////////////////////////////////////// +*/ + +typedef struct ILcidPosixElement +{ + const uint32_t hostID; + const char * const posixID; +} ILcidPosixElement; + +typedef struct ILcidPosixMap +{ + const uint32_t numRegions; + const struct ILcidPosixElement* const regionMaps; +} ILcidPosixMap; + + +/* +///////////////////////////////////////////////// +// +// Easy macros to make the LCID <--> POSIX Mapping +// +///////////////////////////////////////////////// +*/ + +/** + * The standard one language/one country mapping for LCID. + * The first element must be the language, and the following + * elements are the language with the country. + * @param hostID LCID in host format such as 0x044d + * @param languageID posix ID of just the language such as 'de' + * @param posixID posix ID of the language_TERRITORY such as 'de_CH' + */ +#define ILCID_POSIX_ELEMENT_ARRAY(hostID, languageID, posixID) \ +static const ILcidPosixElement locmap_ ## languageID [] = { \ + {LANGUAGE_LCID(hostID), #languageID}, /* parent locale */ \ + {hostID, #posixID}, \ +}; + +/** + * Define a subtable by ID + * @param id the POSIX ID, either a language or language_TERRITORY + */ +#define ILCID_POSIX_SUBTABLE(id) \ +static const ILcidPosixElement locmap_ ## id [] = + + +/** + * Create the map for the posixID. This macro supposes that the language string + * name is the same as the global variable name, and that the first element + * in the ILcidPosixElement is just the language. + * @param _posixID the full POSIX ID for this entry. + */ +#define ILCID_POSIX_MAP(_posixID) \ + {UPRV_LENGTHOF(locmap_ ## _posixID), locmap_ ## _posixID} + +/* +//////////////////////////////////////////// +// +// Create the table of LCID to POSIX Mapping +// None of it should be dynamically created. +// +// Keep static locale variables inside the function so that +// it can be created properly during static init. +// +// Note: This table should be updated periodically. Check the [MS-LCID] Windows Language Code Identifier +// (LCID) Reference defined at https://msdn.microsoft.com/en-us/library/cc233965.aspx +// +// Microsoft is moving away from LCID in favor of locale name as of Vista. This table needs to be +// maintained for support of older Windows version. +// Update: Windows 7 (091130) +// +// Note: Microsoft assign a different LCID if a locale has a sorting variant. POSIX IDs below may contain +// @collation=XXX, but no other keywords are allowed (at least for now). When uprv_convertToLCID() is +// called from uloc_getLCID(), keywords other than collation are already removed. If we really need +// to support other keywords in this mapping data, we must update the implementation. +//////////////////////////////////////////// +*/ + +// TODO: For Windows ideally this table would be a list of exceptions rather than a complete list as +// LocaleNameToLCID and LCIDToLocaleName provide 90% of these. + +ILCID_POSIX_ELEMENT_ARRAY(0x0436, af, af_ZA) + +ILCID_POSIX_SUBTABLE(ar) { + {0x01, "ar"}, + {0x3801, "ar_AE"}, + {0x3c01, "ar_BH"}, + {0x1401, "ar_DZ"}, + {0x0c01, "ar_EG"}, + {0x0801, "ar_IQ"}, + {0x2c01, "ar_JO"}, + {0x3401, "ar_KW"}, + {0x3001, "ar_LB"}, + {0x1001, "ar_LY"}, + {0x1801, "ar_MA"}, + {0x1801, "ar_MO"}, + {0x2001, "ar_OM"}, + {0x4001, "ar_QA"}, + {0x0401, "ar_SA"}, + {0x2801, "ar_SY"}, + {0x1c01, "ar_TN"}, + {0x2401, "ar_YE"} +}; + +ILCID_POSIX_ELEMENT_ARRAY(0x044d, as, as_IN) +ILCID_POSIX_ELEMENT_ARRAY(0x045e, am, am_ET) +ILCID_POSIX_ELEMENT_ARRAY(0x047a, arn,arn_CL) + +ILCID_POSIX_SUBTABLE(az) { + {0x2c, "az"}, + {0x082c, "az_Cyrl_AZ"}, /* Cyrillic based */ + {0x742c, "az_Cyrl"}, /* Cyrillic based */ + {0x042c, "az_Latn_AZ"}, /* Latin based */ + {0x782c, "az_Latn"}, /* Latin based */ + {0x042c, "az_AZ"} /* Latin based */ +}; + +ILCID_POSIX_ELEMENT_ARRAY(0x046d, ba, ba_RU) +ILCID_POSIX_ELEMENT_ARRAY(0x0423, be, be_BY) + +/*ILCID_POSIX_SUBTABLE(ber) { + {0x5f, "ber"}, + {0x045f, "ber_Arab_DZ"}, + {0x045f, "ber_Arab"}, + {0x085f, "ber_Latn_DZ"}, + {0x085f, "ber_Latn"} +};*/ + +ILCID_POSIX_ELEMENT_ARRAY(0x0402, bg, bg_BG) + +ILCID_POSIX_SUBTABLE(bin) { + {0x66, "bin"}, + {0x0466, "bin_NG"} +}; + +ILCID_POSIX_SUBTABLE(bn) { + {0x45, "bn"}, + {0x0845, "bn_BD"}, + {0x0445, "bn_IN"} +}; + +ILCID_POSIX_SUBTABLE(bo) { + {0x51, "bo"}, + {0x0851, "bo_BT"}, + {0x0451, "bo_CN"}, + {0x0c51, "dz_BT"} +}; + +ILCID_POSIX_ELEMENT_ARRAY(0x047e, br, br_FR) + +ILCID_POSIX_SUBTABLE(ca) { + {0x03, "ca"}, + {0x0403, "ca_ES"}, + {0x0803, "ca_ES_VALENCIA"} +}; + +ILCID_POSIX_ELEMENT_ARRAY(0x0483, co, co_FR) + +ILCID_POSIX_SUBTABLE(chr) { + {0x05c, "chr"}, + {0x7c5c, "chr_Cher"}, + {0x045c, "chr_Cher_US"}, + {0x045c, "chr_US"} +}; + +// ICU has chosen different names for these. +ILCID_POSIX_SUBTABLE(ckb) { + {0x92, "ckb"}, + {0x7c92, "ckb_Arab"}, + {0x0492, "ckb_Arab_IQ"} +}; + +/* Declared as cs_CZ to get around compiler errors on z/OS, which defines cs as a function */ +ILCID_POSIX_ELEMENT_ARRAY(0x0405, cs, cs_CZ) + +ILCID_POSIX_ELEMENT_ARRAY(0x0452, cy, cy_GB) +ILCID_POSIX_ELEMENT_ARRAY(0x0406, da, da_DK) + +// Windows doesn't know POSIX or BCP47 Unicode phonebook sort names +ILCID_POSIX_SUBTABLE(de) { + {0x07, "de"}, + {0x0c07, "de_AT"}, + {0x0807, "de_CH"}, + {0x0407, "de_DE"}, + {0x1407, "de_LI"}, + {0x1007, "de_LU"}, + {0x10407,"de_DE@collation=phonebook"}, /*This is really de_DE_PHONEBOOK on Windows*/ + {0x10407,"de@collation=phonebook"} /*This is really de_DE_PHONEBOOK on Windows*/ +}; + +ILCID_POSIX_ELEMENT_ARRAY(0x0465, dv, dv_MV) +ILCID_POSIX_ELEMENT_ARRAY(0x0408, el, el_GR) + +// Windows uses an empty string for 'invariant' +ILCID_POSIX_SUBTABLE(en) { + {0x09, "en"}, + {0x0c09, "en_AU"}, + {0x2809, "en_BZ"}, + {0x1009, "en_CA"}, + {0x0809, "en_GB"}, + {0x3c09, "en_HK"}, + {0x3809, "en_ID"}, + {0x1809, "en_IE"}, + {0x4009, "en_IN"}, + {0x2009, "en_JM"}, + {0x4409, "en_MY"}, + {0x1409, "en_NZ"}, + {0x3409, "en_PH"}, + {0x4809, "en_SG"}, + {0x2C09, "en_TT"}, + {0x0409, "en_US"}, + {0x007f, "en_US_POSIX"}, /* duplicate for round-tripping */ + {0x2409, "en_029"}, + {0x1c09, "en_ZA"}, + {0x3009, "en_ZW"}, + {0x2409, "en_VI"}, /* Virgin Islands AKA Caribbean Islands (en_CB). On Windows8+ This is 0x1000 or dynamically assigned */ + {0x0409, "en_AS"}, /* Alias for en_US. Leave last. On Windows8+ This is 0x1000 or dynamically assigned */ + {0x0409, "en_GU"}, /* Alias for en_US. Leave last. On Windows8+ This is 0x1000 or dynamically assigned */ + {0x0409, "en_MH"}, /* Alias for en_US. Leave last. On Windows8+ This is 0x1000 or dynamically assigned */ + {0x0409, "en_MP"}, /* Alias for en_US. Leave last. On Windows8+ This is 0x1000 or dynamically assigned */ + {0x0409, "en_UM"} /* Alias for en_US. Leave last. On Windows8+ This is 0x1000 or dynamically assigned */ +}; + +ILCID_POSIX_SUBTABLE(en_US_POSIX) { + {0x007f, "en_US_POSIX"} /* duplicate for roundtripping */ +}; + +// Windows doesn't know POSIX or BCP47 Unicode traditional sort names +ILCID_POSIX_SUBTABLE(es) { + {0x0a, "es"}, + {0x2c0a, "es_AR"}, + {0x400a, "es_BO"}, + {0x340a, "es_CL"}, + {0x240a, "es_CO"}, + {0x140a, "es_CR"}, + {0x5c0a, "es_CU"}, + {0x1c0a, "es_DO"}, + {0x300a, "es_EC"}, + {0x0c0a, "es_ES"}, /*Modern sort.*/ + {0x100a, "es_GT"}, + {0x480a, "es_HN"}, + {0x080a, "es_MX"}, + {0x4c0a, "es_NI"}, + {0x180a, "es_PA"}, + {0x280a, "es_PE"}, + {0x500a, "es_PR"}, + {0x3c0a, "es_PY"}, + {0x440a, "es_SV"}, + {0x540a, "es_US"}, + {0x380a, "es_UY"}, + {0x200a, "es_VE"}, + {0x580a, "es_419"}, + {0x040a, "es_ES@collation=traditional"}, + {0x040a, "es@collation=traditional"} // Windows will treat this as es-ES@collation=traditional +}; + +ILCID_POSIX_ELEMENT_ARRAY(0x0425, et, et_EE) +ILCID_POSIX_ELEMENT_ARRAY(0x042d, eu, eu_ES) + +/* ISO-639 doesn't distinguish between Persian and Dari.*/ +ILCID_POSIX_SUBTABLE(fa) { + {0x29, "fa"}, + {0x0429, "fa_IR"}, /* Persian/Farsi (Iran) */ + {0x048c, "fa_AF"} /* Persian/Dari (Afghanistan) */ +}; + + +/* duplicate for roundtripping */ +ILCID_POSIX_SUBTABLE(fa_AF) { + {0x8c, "fa_AF"}, /* Persian/Dari (Afghanistan) */ + {0x048c, "fa_AF"} /* Persian/Dari (Afghanistan) */ +}; + +ILCID_POSIX_SUBTABLE(ff) { + {0x67, "ff"}, + {0x7c67, "ff_Latn"}, + {0x0867, "ff_Latn_SN"}, + {0x0467, "ff_NG"} +}; + +ILCID_POSIX_ELEMENT_ARRAY(0x040b, fi, fi_FI) +ILCID_POSIX_ELEMENT_ARRAY(0x0464, fil,fil_PH) +ILCID_POSIX_ELEMENT_ARRAY(0x0438, fo, fo_FO) + +ILCID_POSIX_SUBTABLE(fr) { + {0x0c, "fr"}, + {0x080c, "fr_BE"}, + {0x0c0c, "fr_CA"}, + {0x240c, "fr_CD"}, + {0x240c, "fr_CG"}, + {0x100c, "fr_CH"}, + {0x300c, "fr_CI"}, + {0x2c0c, "fr_CM"}, + {0x040c, "fr_FR"}, + {0x3c0c, "fr_HT"}, + {0x140c, "fr_LU"}, + {0x380c, "fr_MA"}, + {0x180c, "fr_MC"}, + {0x340c, "fr_ML"}, + {0x200c, "fr_RE"}, + {0x280c, "fr_SN"}, + {0xe40c, "fr_015"}, + {0x1c0c, "fr_029"} +}; + +ILCID_POSIX_ELEMENT_ARRAY(0x0467, fuv, fuv_NG) + +ILCID_POSIX_ELEMENT_ARRAY(0x0462, fy, fy_NL) + +ILCID_POSIX_SUBTABLE(ga) { /* Gaelic (Ireland) */ + {0x3c, "ga"}, + {0x083c, "ga_IE"}, + {0x043c, "gd_GB"} +}; + +ILCID_POSIX_SUBTABLE(gd) { /* Gaelic (Scotland) */ + {0x91, "gd"}, + {0x0491, "gd_GB"} +}; + +ILCID_POSIX_ELEMENT_ARRAY(0x0456, gl, gl_ES) +ILCID_POSIX_ELEMENT_ARRAY(0x0447, gu, gu_IN) +ILCID_POSIX_ELEMENT_ARRAY(0x0474, gn, gn_PY) +ILCID_POSIX_ELEMENT_ARRAY(0x0484, gsw,gsw_FR) + +ILCID_POSIX_SUBTABLE(ha) { + {0x68, "ha"}, + {0x7c68, "ha_Latn"}, + {0x0468, "ha_Latn_NG"}, +}; + +ILCID_POSIX_ELEMENT_ARRAY(0x0475, haw,haw_US) +ILCID_POSIX_ELEMENT_ARRAY(0x040d, he, he_IL) +ILCID_POSIX_ELEMENT_ARRAY(0x0439, hi, hi_IN) + +/* This LCID is really four different locales.*/ +ILCID_POSIX_SUBTABLE(hr) { + {0x1a, "hr"}, + {0x141a, "bs_Latn_BA"}, /* Bosnian, Bosnia and Herzegovina */ + {0x681a, "bs_Latn"}, /* Bosnian, Bosnia and Herzegovina */ + {0x141a, "bs_BA"}, /* Bosnian, Bosnia and Herzegovina */ + {0x781a, "bs"}, /* Bosnian */ + {0x201a, "bs_Cyrl_BA"}, /* Bosnian, Bosnia and Herzegovina */ + {0x641a, "bs_Cyrl"}, /* Bosnian, Bosnia and Herzegovina */ + {0x101a, "hr_BA"}, /* Croatian in Bosnia */ + {0x041a, "hr_HR"}, /* Croatian*/ + {0x2c1a, "sr_Latn_ME"}, + {0x241a, "sr_Latn_RS"}, + {0x181a, "sr_Latn_BA"}, /* Serbo-Croatian in Bosnia */ + {0x081a, "sr_Latn_CS"}, /* Serbo-Croatian*/ + {0x701a, "sr_Latn"}, /* It's 0x1a or 0x081a, pick one to make the test program happy. */ + {0x1c1a, "sr_Cyrl_BA"}, /* Serbo-Croatian in Bosnia */ + {0x0c1a, "sr_Cyrl_CS"}, /* Serbian*/ + {0x301a, "sr_Cyrl_ME"}, + {0x281a, "sr_Cyrl_RS"}, + {0x6c1a, "sr_Cyrl"}, /* It's 0x1a or 0x0c1a, pick one to make the test program happy. */ + {0x7c1a, "sr"} /* In CLDR sr is sr_Cyrl. */ +}; + +ILCID_POSIX_SUBTABLE(hsb) { + {0x2E, "hsb"}, + {0x042E, "hsb_DE"}, + {0x082E, "dsb_DE"}, + {0x7C2E, "dsb"}, +}; + +ILCID_POSIX_ELEMENT_ARRAY(0x040e, hu, hu_HU) +ILCID_POSIX_ELEMENT_ARRAY(0x042b, hy, hy_AM) + +ILCID_POSIX_SUBTABLE(ibb) { + {0x69, "ibb"}, + {0x0469, "ibb_NG"} +}; + +ILCID_POSIX_ELEMENT_ARRAY(0x0421, id, id_ID) +ILCID_POSIX_ELEMENT_ARRAY(0x0470, ig, ig_NG) +ILCID_POSIX_ELEMENT_ARRAY(0x0478, ii, ii_CN) +ILCID_POSIX_ELEMENT_ARRAY(0x040f, is, is_IS) + +ILCID_POSIX_SUBTABLE(it) { + {0x10, "it"}, + {0x0810, "it_CH"}, + {0x0410, "it_IT"} +}; + +ILCID_POSIX_SUBTABLE(iu) { + {0x5d, "iu"}, + {0x045d, "iu_Cans_CA"}, + {0x785d, "iu_Cans"}, + {0x085d, "iu_Latn_CA"}, + {0x7c5d, "iu_Latn"} +}; + +ILCID_POSIX_ELEMENT_ARRAY(0x040d, iw, iw_IL) /*Left in for compatibility*/ +ILCID_POSIX_ELEMENT_ARRAY(0x0411, ja, ja_JP) +ILCID_POSIX_ELEMENT_ARRAY(0x0437, ka, ka_GE) +ILCID_POSIX_ELEMENT_ARRAY(0x043f, kk, kk_KZ) +ILCID_POSIX_ELEMENT_ARRAY(0x046f, kl, kl_GL) +ILCID_POSIX_ELEMENT_ARRAY(0x0453, km, km_KH) +ILCID_POSIX_ELEMENT_ARRAY(0x044b, kn, kn_IN) + +ILCID_POSIX_SUBTABLE(ko) { + {0x12, "ko"}, + {0x0812, "ko_KP"}, + {0x0412, "ko_KR"} +}; + +ILCID_POSIX_ELEMENT_ARRAY(0x0457, kok, kok_IN) +ILCID_POSIX_ELEMENT_ARRAY(0x0471, kr, kr_NG) + +ILCID_POSIX_SUBTABLE(ks) { /* We could add PK and CN too */ + {0x60, "ks"}, + {0x0460, "ks_Arab_IN"}, + {0x0860, "ks_Deva_IN"} +}; + +ILCID_POSIX_ELEMENT_ARRAY(0x0440, ky, ky_KG) /* Kyrgyz is spoken in Kyrgyzstan */ + +ILCID_POSIX_SUBTABLE(la) { + {0x76, "la"}, + {0x0476, "la_001"}, + {0x0476, "la_IT"} /*Left in for compatibility*/ +}; + +ILCID_POSIX_ELEMENT_ARRAY(0x046e, lb, lb_LU) +ILCID_POSIX_ELEMENT_ARRAY(0x0454, lo, lo_LA) +ILCID_POSIX_ELEMENT_ARRAY(0x0427, lt, lt_LT) +ILCID_POSIX_ELEMENT_ARRAY(0x0426, lv, lv_LV) +ILCID_POSIX_ELEMENT_ARRAY(0x0481, mi, mi_NZ) +ILCID_POSIX_ELEMENT_ARRAY(0x042f, mk, mk_MK) +ILCID_POSIX_ELEMENT_ARRAY(0x044c, ml, ml_IN) + +ILCID_POSIX_SUBTABLE(mn) { + {0x50, "mn"}, + {0x0450, "mn_MN"}, + {0x7c50, "mn_Mong"}, + {0x0850, "mn_Mong_CN"}, + {0x0850, "mn_CN"}, + {0x7850, "mn_Cyrl"}, + {0x0c50, "mn_Mong_MN"} +}; + +ILCID_POSIX_ELEMENT_ARRAY(0x0458, mni,mni_IN) +ILCID_POSIX_ELEMENT_ARRAY(0x047c, moh,moh_CA) +ILCID_POSIX_ELEMENT_ARRAY(0x044e, mr, mr_IN) + +ILCID_POSIX_SUBTABLE(ms) { + {0x3e, "ms"}, + {0x083e, "ms_BN"}, /* Brunei Darussalam*/ + {0x043e, "ms_MY"} /* Malaysia*/ +}; + +ILCID_POSIX_ELEMENT_ARRAY(0x043a, mt, mt_MT) +ILCID_POSIX_ELEMENT_ARRAY(0x0455, my, my_MM) + +ILCID_POSIX_SUBTABLE(ne) { + {0x61, "ne"}, + {0x0861, "ne_IN"}, /* India*/ + {0x0461, "ne_NP"} /* Nepal*/ +}; + +ILCID_POSIX_SUBTABLE(nl) { + {0x13, "nl"}, + {0x0813, "nl_BE"}, + {0x0413, "nl_NL"} +}; + +/* The "no" locale split into nb and nn. By default in ICU, "no" is nb.*/ +// TODO: Not all of these are needed on Windows, but I don't know how ICU treats preferred ones here. +ILCID_POSIX_SUBTABLE(no) { + {0x14, "no"}, /* really nb_NO - actually Windows differentiates between neutral (no region) and specific (with region) */ + {0x7c14, "nb"}, /* really nb */ + {0x0414, "nb_NO"}, /* really nb_NO. Keep first in the 414 list. */ + {0x0414, "no_NO"}, /* really nb_NO */ + {0x0814, "nn_NO"}, /* really nn_NO. Keep first in the 814 list. */ + {0x7814, "nn"}, /* It's 0x14 or 0x814, pick one to make the test program happy. */ + {0x0814, "no_NO_NY"}/* really nn_NO */ +}; + +ILCID_POSIX_ELEMENT_ARRAY(0x046c, nso,nso_ZA) /* TODO: Verify the ISO-639 code */ +ILCID_POSIX_ELEMENT_ARRAY(0x0482, oc, oc_FR) + +ILCID_POSIX_SUBTABLE(om) { /* TODO: Verify the country */ + {0x72, "om"}, + {0x0472, "om_ET"}, + {0x0472, "gaz_ET"} +}; + +/* Declared as or_IN to get around compiler errors*/ +ILCID_POSIX_SUBTABLE(or_IN) { + {0x48, "or"}, + {0x0448, "or_IN"}, +}; + +ILCID_POSIX_SUBTABLE(pa) { + {0x46, "pa"}, + {0x0446, "pa_IN"}, + {0x0846, "pa_Arab_PK"}, + {0x0846, "pa_PK"} +}; + +ILCID_POSIX_SUBTABLE(pap) { + {0x79, "pap"}, + {0x0479, "pap_029"}, + {0x0479, "pap_AN"} /*Left in for compatibility*/ +}; + +ILCID_POSIX_ELEMENT_ARRAY(0x0415, pl, pl_PL) +ILCID_POSIX_ELEMENT_ARRAY(0x0463, ps, ps_AF) + +ILCID_POSIX_SUBTABLE(pt) { + {0x16, "pt"}, + {0x0416, "pt_BR"}, + {0x0816, "pt_PT"} +}; + +ILCID_POSIX_SUBTABLE(qu) { + {0x6b, "qu"}, + {0x046b, "qu_BO"}, + {0x086b, "qu_EC"}, + {0x0C6b, "qu_PE"}, + {0x046b, "quz_BO"}, + {0x086b, "quz_EC"}, + {0x0C6b, "quz_PE"} +}; + +ILCID_POSIX_SUBTABLE(quc) { + {0x93, "quc"}, + {0x0493, "quc_CO"}, + /* + "quc_Latn_GT" is an exceptional case. Language ID of "quc" + is 0x93, but LCID of "quc_Latn_GT" is 0x486, which should be + under the group of "qut". "qut" is a retired ISO 639-3 language + code for West Central Quiche, and merged to "quc". + It looks Windows previously reserved "qut" for K'iche', but, + decided to use "quc" when adding a locale for K'iche' (Guatemala). + + This data structure used here assumes language ID bits in + LCID is unique for alphabetic language code. But this is not true + for "quc_Latn_GT". If we don't have the data below, LCID look up + by alphabetic locale ID (POSIX) will fail. The same entry is found + under "qut" below, which is required for reverse look up. + */ + {0x0486, "quc_Latn_GT"} +}; + +ILCID_POSIX_SUBTABLE(qut) { + {0x86, "qut"}, + {0x0486, "qut_GT"}, + /* + See the note in "quc" above. + */ + {0x0486, "quc_Latn_GT"} +}; + +ILCID_POSIX_ELEMENT_ARRAY(0x0417, rm, rm_CH) + +ILCID_POSIX_SUBTABLE(ro) { + {0x18, "ro"}, + {0x0418, "ro_RO"}, + {0x0818, "ro_MD"} +}; + +// TODO: This is almost certainly 'wrong'. 0 in Windows is a synonym for LOCALE_USER_DEFAULT. +// More likely this is a similar concept to the Windows 0x7f Invariant locale "" +// (Except that it's not invariant in ICU) +ILCID_POSIX_SUBTABLE(root) { + {0x00, "root"} +}; + +ILCID_POSIX_SUBTABLE(ru) { + {0x19, "ru"}, + {0x0419, "ru_RU"}, + {0x0819, "ru_MD"} +}; + +ILCID_POSIX_ELEMENT_ARRAY(0x0487, rw, rw_RW) +ILCID_POSIX_ELEMENT_ARRAY(0x044f, sa, sa_IN) +ILCID_POSIX_ELEMENT_ARRAY(0x0485, sah,sah_RU) + +ILCID_POSIX_SUBTABLE(sd) { + {0x59, "sd"}, + {0x0459, "sd_Deva_IN"}, + {0x0459, "sd_IN"}, + {0x0859, "sd_Arab_PK"}, + {0x0859, "sd_PK"}, + {0x7c59, "sd_Arab"} +}; + +ILCID_POSIX_SUBTABLE(se) { + {0x3b, "se"}, + {0x0c3b, "se_FI"}, + {0x043b, "se_NO"}, + {0x083b, "se_SE"}, + {0x783b, "sma"}, + {0x183b, "sma_NO"}, + {0x1c3b, "sma_SE"}, + {0x7c3b, "smj"}, + {0x703b, "smn"}, + {0x743b, "sms"}, + {0x103b, "smj_NO"}, + {0x143b, "smj_SE"}, + {0x243b, "smn_FI"}, + {0x203b, "sms_FI"}, +}; + +ILCID_POSIX_ELEMENT_ARRAY(0x045b, si, si_LK) +ILCID_POSIX_ELEMENT_ARRAY(0x041b, sk, sk_SK) +ILCID_POSIX_ELEMENT_ARRAY(0x0424, sl, sl_SI) + +ILCID_POSIX_SUBTABLE(so) { + {0x77, "so"}, + {0x0477, "so_SO"} +}; + +ILCID_POSIX_ELEMENT_ARRAY(0x041c, sq, sq_AL) +ILCID_POSIX_ELEMENT_ARRAY(0x0430, st, st_ZA) + +ILCID_POSIX_SUBTABLE(sv) { + {0x1d, "sv"}, + {0x081d, "sv_FI"}, + {0x041d, "sv_SE"} +}; + +ILCID_POSIX_ELEMENT_ARRAY(0x0441, sw, sw_KE) +ILCID_POSIX_ELEMENT_ARRAY(0x045A, syr, syr_SY) + +ILCID_POSIX_SUBTABLE(ta) { + {0x49, "ta"}, + {0x0449, "ta_IN"}, + {0x0849, "ta_LK"} +}; + +ILCID_POSIX_ELEMENT_ARRAY(0x044a, te, te_IN) + +/* Cyrillic based by default */ +ILCID_POSIX_SUBTABLE(tg) { + {0x28, "tg"}, + {0x7c28, "tg_Cyrl"}, + {0x0428, "tg_Cyrl_TJ"} +}; + +ILCID_POSIX_ELEMENT_ARRAY(0x041e, th, th_TH) + +ILCID_POSIX_SUBTABLE(ti) { + {0x73, "ti"}, + {0x0873, "ti_ER"}, + {0x0473, "ti_ET"} +}; + +ILCID_POSIX_ELEMENT_ARRAY(0x0442, tk, tk_TM) + +ILCID_POSIX_SUBTABLE(tn) { + {0x32, "tn"}, + {0x0832, "tn_BW"}, + {0x0432, "tn_ZA"} +}; + +ILCID_POSIX_ELEMENT_ARRAY(0x041f, tr, tr_TR) +ILCID_POSIX_ELEMENT_ARRAY(0x0431, ts, ts_ZA) +ILCID_POSIX_ELEMENT_ARRAY(0x0444, tt, tt_RU) + +ILCID_POSIX_SUBTABLE(tzm) { + {0x5f, "tzm"}, + {0x7c5f, "tzm_Latn"}, + {0x085f, "tzm_Latn_DZ"}, + {0x105f, "tzm_Tfng_MA"}, + {0x045f, "tzm_Arab_MA"}, + {0x045f, "tmz"} +}; + +ILCID_POSIX_SUBTABLE(ug) { + {0x80, "ug"}, + {0x0480, "ug_CN"}, + {0x0480, "ug_Arab_CN"} +}; + +ILCID_POSIX_ELEMENT_ARRAY(0x0422, uk, uk_UA) + +ILCID_POSIX_SUBTABLE(ur) { + {0x20, "ur"}, + {0x0820, "ur_IN"}, + {0x0420, "ur_PK"} +}; + +ILCID_POSIX_SUBTABLE(uz) { + {0x43, "uz"}, + {0x0843, "uz_Cyrl_UZ"}, /* Cyrillic based */ + {0x7843, "uz_Cyrl"}, /* Cyrillic based */ + {0x0843, "uz_UZ"}, /* Cyrillic based */ + {0x0443, "uz_Latn_UZ"}, /* Latin based */ + {0x7c43, "uz_Latn"} /* Latin based */ +}; + +ILCID_POSIX_SUBTABLE(ve) { /* TODO: Verify the country */ + {0x33, "ve"}, + {0x0433, "ve_ZA"}, + {0x0433, "ven_ZA"} +}; + +ILCID_POSIX_ELEMENT_ARRAY(0x042a, vi, vi_VN) +ILCID_POSIX_ELEMENT_ARRAY(0x0488, wo, wo_SN) +ILCID_POSIX_ELEMENT_ARRAY(0x0434, xh, xh_ZA) + +ILCID_POSIX_SUBTABLE(yi) { + {0x003d, "yi"}, + {0x043d, "yi_001"} +}; + +ILCID_POSIX_ELEMENT_ARRAY(0x046a, yo, yo_NG) + +// Windows & ICU tend to different names for some of these +// TODO: Windows probably does not need all of these entries, but I don't know how the precedence works. +ILCID_POSIX_SUBTABLE(zh) { + {0x0004, "zh_Hans"}, + {0x7804, "zh"}, + {0x0804, "zh_CN"}, + {0x0804, "zh_Hans_CN"}, + {0x0c04, "zh_Hant_HK"}, + {0x0c04, "zh_HK"}, + {0x1404, "zh_Hant_MO"}, + {0x1404, "zh_MO"}, + {0x1004, "zh_Hans_SG"}, + {0x1004, "zh_SG"}, + {0x0404, "zh_Hant_TW"}, + {0x7c04, "zh_Hant"}, + {0x0404, "zh_TW"}, + {0x30404,"zh_Hant_TW"}, /* Bopomofo order */ + {0x30404,"zh_TW"}, /* Bopomofo order */ + {0x20004,"zh@collation=stroke"}, + {0x20404,"zh_Hant@collation=stroke"}, + {0x20404,"zh_Hant_TW@collation=stroke"}, + {0x20404,"zh_TW@collation=stroke"}, + {0x20804,"zh_Hans@collation=stroke"}, + {0x20804,"zh_Hans_CN@collation=stroke"}, + {0x20804,"zh_CN@collation=stroke"} + // TODO: Alternate collations for other LCIDs are missing, eg: 0x50804 +}; + +ILCID_POSIX_ELEMENT_ARRAY(0x0435, zu, zu_ZA) + +/* This must be static and grouped by LCID. */ +static const ILcidPosixMap gPosixIDmap[] = { + ILCID_POSIX_MAP(af), /* af Afrikaans 0x36 */ + ILCID_POSIX_MAP(am), /* am Amharic 0x5e */ + ILCID_POSIX_MAP(ar), /* ar Arabic 0x01 */ + ILCID_POSIX_MAP(arn), /* arn Araucanian/Mapudungun 0x7a */ + ILCID_POSIX_MAP(as), /* as Assamese 0x4d */ + ILCID_POSIX_MAP(az), /* az Azerbaijani 0x2c */ + ILCID_POSIX_MAP(ba), /* ba Bashkir 0x6d */ + ILCID_POSIX_MAP(be), /* be Belarusian 0x23 */ +/* ILCID_POSIX_MAP(ber), ber Berber/Tamazight 0x5f */ + ILCID_POSIX_MAP(bg), /* bg Bulgarian 0x02 */ + ILCID_POSIX_MAP(bin), /* bin Edo 0x66 */ + ILCID_POSIX_MAP(bn), /* bn Bengali; Bangla 0x45 */ + ILCID_POSIX_MAP(bo), /* bo Tibetan 0x51 */ + ILCID_POSIX_MAP(br), /* br Breton 0x7e */ + ILCID_POSIX_MAP(ca), /* ca Catalan 0x03 */ + ILCID_POSIX_MAP(chr), /* chr Cherokee 0x5c */ + ILCID_POSIX_MAP(ckb), /* ckb Sorani (Central Kurdish) 0x92 */ + ILCID_POSIX_MAP(co), /* co Corsican 0x83 */ + ILCID_POSIX_MAP(cs), /* cs Czech 0x05 */ + ILCID_POSIX_MAP(cy), /* cy Welsh 0x52 */ + ILCID_POSIX_MAP(da), /* da Danish 0x06 */ + ILCID_POSIX_MAP(de), /* de German 0x07 */ + ILCID_POSIX_MAP(dv), /* dv Divehi 0x65 */ + ILCID_POSIX_MAP(el), /* el Greek 0x08 */ + ILCID_POSIX_MAP(en), /* en English 0x09 */ + ILCID_POSIX_MAP(en_US_POSIX), /* invariant 0x7f */ + ILCID_POSIX_MAP(es), /* es Spanish 0x0a */ + ILCID_POSIX_MAP(et), /* et Estonian 0x25 */ + ILCID_POSIX_MAP(eu), /* eu Basque 0x2d */ + ILCID_POSIX_MAP(fa), /* fa Persian/Farsi 0x29 */ + ILCID_POSIX_MAP(fa_AF), /* fa Persian/Dari 0x8c */ + ILCID_POSIX_MAP(ff), /* ff Fula 0x67 */ + ILCID_POSIX_MAP(fi), /* fi Finnish 0x0b */ + ILCID_POSIX_MAP(fil), /* fil Filipino 0x64 */ + ILCID_POSIX_MAP(fo), /* fo Faroese 0x38 */ + ILCID_POSIX_MAP(fr), /* fr French 0x0c */ + ILCID_POSIX_MAP(fuv), /* fuv Fulfulde - Nigeria 0x67 */ + ILCID_POSIX_MAP(fy), /* fy Frisian 0x62 */ + ILCID_POSIX_MAP(ga), /* * Gaelic (Ireland,Scotland) 0x3c */ + ILCID_POSIX_MAP(gd), /* gd Gaelic (United Kingdom) 0x91 */ + ILCID_POSIX_MAP(gl), /* gl Galician 0x56 */ + ILCID_POSIX_MAP(gn), /* gn Guarani 0x74 */ + ILCID_POSIX_MAP(gsw), /* gsw Alemanic/Alsatian/Swiss German 0x84 */ + ILCID_POSIX_MAP(gu), /* gu Gujarati 0x47 */ + ILCID_POSIX_MAP(ha), /* ha Hausa 0x68 */ + ILCID_POSIX_MAP(haw), /* haw Hawaiian 0x75 */ + ILCID_POSIX_MAP(he), /* he Hebrew (formerly iw) 0x0d */ + ILCID_POSIX_MAP(hi), /* hi Hindi 0x39 */ + ILCID_POSIX_MAP(hr), /* * Croatian and others 0x1a */ + ILCID_POSIX_MAP(hsb), /* hsb Upper Sorbian 0x2e */ + ILCID_POSIX_MAP(hu), /* hu Hungarian 0x0e */ + ILCID_POSIX_MAP(hy), /* hy Armenian 0x2b */ + ILCID_POSIX_MAP(ibb), /* ibb Ibibio - Nigeria 0x69 */ + ILCID_POSIX_MAP(id), /* id Indonesian (formerly in) 0x21 */ + ILCID_POSIX_MAP(ig), /* ig Igbo 0x70 */ + ILCID_POSIX_MAP(ii), /* ii Sichuan Yi 0x78 */ + ILCID_POSIX_MAP(is), /* is Icelandic 0x0f */ + ILCID_POSIX_MAP(it), /* it Italian 0x10 */ + ILCID_POSIX_MAP(iu), /* iu Inuktitut 0x5d */ + ILCID_POSIX_MAP(iw), /* iw Hebrew 0x0d */ + ILCID_POSIX_MAP(ja), /* ja Japanese 0x11 */ + ILCID_POSIX_MAP(ka), /* ka Georgian 0x37 */ + ILCID_POSIX_MAP(kk), /* kk Kazakh 0x3f */ + ILCID_POSIX_MAP(kl), /* kl Kalaallisut 0x6f */ + ILCID_POSIX_MAP(km), /* km Khmer 0x53 */ + ILCID_POSIX_MAP(kn), /* kn Kannada 0x4b */ + ILCID_POSIX_MAP(ko), /* ko Korean 0x12 */ + ILCID_POSIX_MAP(kok), /* kok Konkani 0x57 */ + ILCID_POSIX_MAP(kr), /* kr Kanuri 0x71 */ + ILCID_POSIX_MAP(ks), /* ks Kashmiri 0x60 */ + ILCID_POSIX_MAP(ky), /* ky Kyrgyz 0x40 */ + ILCID_POSIX_MAP(lb), /* lb Luxembourgish 0x6e */ + ILCID_POSIX_MAP(la), /* la Latin 0x76 */ + ILCID_POSIX_MAP(lo), /* lo Lao 0x54 */ + ILCID_POSIX_MAP(lt), /* lt Lithuanian 0x27 */ + ILCID_POSIX_MAP(lv), /* lv Latvian, Lettish 0x26 */ + ILCID_POSIX_MAP(mi), /* mi Maori 0x81 */ + ILCID_POSIX_MAP(mk), /* mk Macedonian 0x2f */ + ILCID_POSIX_MAP(ml), /* ml Malayalam 0x4c */ + ILCID_POSIX_MAP(mn), /* mn Mongolian 0x50 */ + ILCID_POSIX_MAP(mni), /* mni Manipuri 0x58 */ + ILCID_POSIX_MAP(moh), /* moh Mohawk 0x7c */ + ILCID_POSIX_MAP(mr), /* mr Marathi 0x4e */ + ILCID_POSIX_MAP(ms), /* ms Malay 0x3e */ + ILCID_POSIX_MAP(mt), /* mt Maltese 0x3a */ + ILCID_POSIX_MAP(my), /* my Burmese 0x55 */ +/* ILCID_POSIX_MAP(nb), // no Norwegian 0x14 */ + ILCID_POSIX_MAP(ne), /* ne Nepali 0x61 */ + ILCID_POSIX_MAP(nl), /* nl Dutch 0x13 */ +/* ILCID_POSIX_MAP(nn), // no Norwegian 0x14 */ + ILCID_POSIX_MAP(no), /* * Norwegian 0x14 */ + ILCID_POSIX_MAP(nso), /* nso Sotho, Northern (Sepedi dialect) 0x6c */ + ILCID_POSIX_MAP(oc), /* oc Occitan 0x82 */ + ILCID_POSIX_MAP(om), /* om Oromo 0x72 */ + ILCID_POSIX_MAP(or_IN), /* or Oriya 0x48 */ + ILCID_POSIX_MAP(pa), /* pa Punjabi 0x46 */ + ILCID_POSIX_MAP(pap), /* pap Papiamentu 0x79 */ + ILCID_POSIX_MAP(pl), /* pl Polish 0x15 */ + ILCID_POSIX_MAP(ps), /* ps Pashto 0x63 */ + ILCID_POSIX_MAP(pt), /* pt Portuguese 0x16 */ + ILCID_POSIX_MAP(qu), /* qu Quechua 0x6B */ + ILCID_POSIX_MAP(quc), /* quc K'iche 0x93 */ + ILCID_POSIX_MAP(qut), /* qut K'iche 0x86 */ + ILCID_POSIX_MAP(rm), /* rm Raeto-Romance/Romansh 0x17 */ + ILCID_POSIX_MAP(ro), /* ro Romanian 0x18 */ + ILCID_POSIX_MAP(root), /* root 0x00 */ + ILCID_POSIX_MAP(ru), /* ru Russian 0x19 */ + ILCID_POSIX_MAP(rw), /* rw Kinyarwanda 0x87 */ + ILCID_POSIX_MAP(sa), /* sa Sanskrit 0x4f */ + ILCID_POSIX_MAP(sah), /* sah Yakut 0x85 */ + ILCID_POSIX_MAP(sd), /* sd Sindhi 0x59 */ + ILCID_POSIX_MAP(se), /* se Sami 0x3b */ +/* ILCID_POSIX_MAP(sh), // sh Serbo-Croatian 0x1a */ + ILCID_POSIX_MAP(si), /* si Sinhalese 0x5b */ + ILCID_POSIX_MAP(sk), /* sk Slovak 0x1b */ + ILCID_POSIX_MAP(sl), /* sl Slovenian 0x24 */ + ILCID_POSIX_MAP(so), /* so Somali 0x77 */ + ILCID_POSIX_MAP(sq), /* sq Albanian 0x1c */ +/* ILCID_POSIX_MAP(sr), // sr Serbian 0x1a */ + ILCID_POSIX_MAP(st), /* st Sutu 0x30 */ + ILCID_POSIX_MAP(sv), /* sv Swedish 0x1d */ + ILCID_POSIX_MAP(sw), /* sw Swahili 0x41 */ + ILCID_POSIX_MAP(syr), /* syr Syriac 0x5A */ + ILCID_POSIX_MAP(ta), /* ta Tamil 0x49 */ + ILCID_POSIX_MAP(te), /* te Telugu 0x4a */ + ILCID_POSIX_MAP(tg), /* tg Tajik 0x28 */ + ILCID_POSIX_MAP(th), /* th Thai 0x1e */ + ILCID_POSIX_MAP(ti), /* ti Tigrigna 0x73 */ + ILCID_POSIX_MAP(tk), /* tk Turkmen 0x42 */ + ILCID_POSIX_MAP(tn), /* tn Tswana 0x32 */ + ILCID_POSIX_MAP(tr), /* tr Turkish 0x1f */ + ILCID_POSIX_MAP(ts), /* ts Tsonga 0x31 */ + ILCID_POSIX_MAP(tt), /* tt Tatar 0x44 */ + ILCID_POSIX_MAP(tzm), /* tzm Tamazight 0x5f */ + ILCID_POSIX_MAP(ug), /* ug Uighur 0x80 */ + ILCID_POSIX_MAP(uk), /* uk Ukrainian 0x22 */ + ILCID_POSIX_MAP(ur), /* ur Urdu 0x20 */ + ILCID_POSIX_MAP(uz), /* uz Uzbek 0x43 */ + ILCID_POSIX_MAP(ve), /* ve Venda 0x33 */ + ILCID_POSIX_MAP(vi), /* vi Vietnamese 0x2a */ + ILCID_POSIX_MAP(wo), /* wo Wolof 0x88 */ + ILCID_POSIX_MAP(xh), /* xh Xhosa 0x34 */ + ILCID_POSIX_MAP(yi), /* yi Yiddish 0x3d */ + ILCID_POSIX_MAP(yo), /* yo Yoruba 0x6a */ + ILCID_POSIX_MAP(zh), /* zh Chinese 0x04 */ + ILCID_POSIX_MAP(zu), /* zu Zulu 0x35 */ +}; + +static const uint32_t gLocaleCount = UPRV_LENGTHOF(gPosixIDmap); + +/** + * Do not call this function. It is called by hostID. + * The function is not private because this struct must stay as a C struct, + * and this is an internal class. + */ +static int32_t +idCmp(const char* id1, const char* id2) +{ + int32_t diffIdx = 0; + while (*id1 == *id2 && *id1 != 0) { + diffIdx++; + id1++; + id2++; + } + return diffIdx; +} + +/** + * Searches for a Windows LCID + * + * @param posixid the Posix style locale id. + * @param status gets set to U_ILLEGAL_ARGUMENT_ERROR when the Posix ID has + * no equivalent Windows LCID. + * @return the LCID + */ +static uint32_t +getHostID(const ILcidPosixMap *this_0, const char* posixID, UErrorCode* status) +{ + int32_t bestIdx = 0; + int32_t bestIdxDiff = 0; + int32_t posixIDlen = (int32_t)uprv_strlen(posixID); + uint32_t idx; + + for (idx = 0; idx < this_0->numRegions; idx++ ) { + int32_t sameChars = idCmp(posixID, this_0->regionMaps[idx].posixID); + if (sameChars > bestIdxDiff && this_0->regionMaps[idx].posixID[sameChars] == 0) { + if (posixIDlen == sameChars) { + /* Exact match */ + return this_0->regionMaps[idx].hostID; + } + bestIdxDiff = sameChars; + bestIdx = idx; + } + } + /* We asked for something unusual, like en_ZZ, and we try to return the number for the same language. */ + /* We also have to make sure that sid and si and similar string subsets don't match. */ + if ((posixID[bestIdxDiff] == '_' || posixID[bestIdxDiff] == '@') + && this_0->regionMaps[bestIdx].posixID[bestIdxDiff] == 0) + { + *status = U_USING_FALLBACK_WARNING; + return this_0->regionMaps[bestIdx].hostID; + } + + /*no match found */ + *status = U_ILLEGAL_ARGUMENT_ERROR; + return this_0->regionMaps->hostID; +} + +static const char* +getPosixID(const ILcidPosixMap *this_0, uint32_t hostID) +{ + uint32_t i; + for (i = 0; i <= this_0->numRegions; i++) + { + if (this_0->regionMaps[i].hostID == hostID) + { + return this_0->regionMaps[i].posixID; + } + } + + /* If you get here, then no matching region was found, + so return the language id with the wild card region. */ + return this_0->regionMaps[0].posixID; +} + +/* +////////////////////////////////////// +// +// LCID --> POSIX +// +///////////////////////////////////// +*/ +#ifdef USE_WINDOWS_LCID_MAPPING_API +/* + * Various language tags needs to be changed: + * quz -> qu + * prs -> fa + */ +#define FIX_LANGUAGE_ID_TAG(buffer, len) \ + if (len >= 3) { \ + if (buffer[0] == 'q' && buffer[1] == 'u' && buffer[2] == 'z') {\ + buffer[2] = 0; \ + uprv_strcat(buffer, buffer+3); \ + } else if (buffer[0] == 'p' && buffer[1] == 'r' && buffer[2] == 's') {\ + buffer[0] = 'f'; buffer[1] = 'a'; buffer[2] = 0; \ + uprv_strcat(buffer, buffer+3); \ + } \ + } + +#endif +U_CAPI int32_t +uprv_convertToPosix(uint32_t hostid, char *posixID, int32_t posixIDCapacity, UErrorCode* status) +{ + uint16_t langID; + uint32_t localeIndex; + UBool bLookup = TRUE; + const char *pPosixID = NULL; + +#ifdef USE_WINDOWS_LCID_MAPPING_API + char locName[LOCALE_NAME_MAX_LENGTH] = {}; // ICU name can't be longer than Windows name + + // Note: Windows primary lang ID 0x92 in LCID is used for Central Kurdish and + // GetLocaleInfo() maps such LCID to "ku". However, CLDR uses "ku" for + // Northern Kurdish and "ckb" for Central Kurdish. For this reason, we cannot + // use the Windows API to resolve locale ID for this specific case. + if ((hostid & 0x3FF) != 0x92) { + int32_t tmpLen = 0; + UChar windowsLocaleName[LOCALE_NAME_MAX_LENGTH]; // ULOC_FULLNAME_CAPACITY > LOCALE_NAME_MAX_LENGTH + + // Note: LOCALE_ALLOW_NEUTRAL_NAMES was enabled in Windows7+, prior versions did not handle neutral (no-region) locale names. + tmpLen = LCIDToLocaleName(hostid, (PWSTR)windowsLocaleName, UPRV_LENGTHOF(windowsLocaleName), LOCALE_ALLOW_NEUTRAL_NAMES); + if (tmpLen > 1) { + int32_t i = 0; + // Only need to look up in table if have _, eg for de-de_phoneb type alternate sort. + bLookup = FALSE; + for (i = 0; i < UPRV_LENGTHOF(locName); i++) + { + locName[i] = (char)(windowsLocaleName[i]); + + // Windows locale name may contain sorting variant, such as "es-ES_tradnl". + // In such cases, we need special mapping data found in the hardcoded table + // in this source file. + if (windowsLocaleName[i] == L'_') + { + // Keep the base locale, without variant + // TODO: Should these be mapped from _phoneb to @collation=phonebook, etc.? + locName[i] = '\0'; + tmpLen = i; + bLookup = TRUE; + break; + } + else if (windowsLocaleName[i] == L'-') + { + // Windows names use -, ICU uses _ + locName[i] = '_'; + } + else if (windowsLocaleName[i] == L'\0') + { + // No point in doing more work than necessary + break; + } + } + // TODO: Need to understand this better, why isn't it an alias? + FIX_LANGUAGE_ID_TAG(locName, tmpLen); + pPosixID = locName; + } + } +#endif // USE_WINDOWS_LCID_MAPPING_API + + if (bLookup) { + const char *pCandidate = NULL; + langID = LANGUAGE_LCID(hostid); + + for (localeIndex = 0; localeIndex < gLocaleCount; localeIndex++) { + if (langID == gPosixIDmap[localeIndex].regionMaps->hostID) { + pCandidate = getPosixID(&gPosixIDmap[localeIndex], hostid); + break; + } + } + + /* On Windows, when locale name has a variant, we still look up the hardcoded table. + If a match in the hardcoded table is longer than the Windows locale name without + variant, we use the one as the result */ + if (pCandidate && (pPosixID == NULL || uprv_strlen(pCandidate) > uprv_strlen(pPosixID))) { + pPosixID = pCandidate; + } + } + + if (pPosixID) { + int32_t resLen = static_cast(uprv_strlen(pPosixID)); + int32_t copyLen = resLen <= posixIDCapacity ? resLen : posixIDCapacity; + uprv_memcpy(posixID, pPosixID, copyLen); + if (resLen < posixIDCapacity) { + posixID[resLen] = 0; + if (*status == U_STRING_NOT_TERMINATED_WARNING) { + *status = U_ZERO_ERROR; + } + } else if (resLen == posixIDCapacity) { + *status = U_STRING_NOT_TERMINATED_WARNING; + } else { + *status = U_BUFFER_OVERFLOW_ERROR; + } + return resLen; + } + + /* no match found */ + *status = U_ILLEGAL_ARGUMENT_ERROR; + return -1; +} + +/* +////////////////////////////////////// +// +// POSIX --> LCID +// This should only be called from uloc_getLCID. +// The locale ID must be in canonical form. +// +///////////////////////////////////// +*/ +U_CAPI uint32_t +uprv_convertToLCIDPlatform(const char* localeID) +{ + // The purpose of this function is to leverage native platform name->lcid + // conversion functionality when available. +#ifdef USE_WINDOWS_LCID_MAPPING_API + DWORD nameLCIDFlags = 0; + UErrorCode myStatus = U_ZERO_ERROR; + + // First check for a Windows name->LCID match, fall through to catch + // ICU special cases, but Windows may know it already. +#if LOCALE_ALLOW_NEUTRAL_NAMES + nameLCIDFlags = LOCALE_ALLOW_NEUTRAL_NAMES; +#endif /* LOCALE_ALLOW_NEUTRAL_NAMES */ + + int32_t len; + char collVal[ULOC_KEYWORDS_CAPACITY] = {}; + char baseName[ULOC_FULLNAME_CAPACITY] = {}; + const char * mylocaleID = localeID; + + // Check any for keywords. + if (uprv_strchr(localeID, '@')) + { + len = uloc_getKeywordValue(localeID, "collation", collVal, UPRV_LENGTHOF(collVal) - 1, &myStatus); + if (U_SUCCESS(myStatus) && len > 0) + { + // If it contains the keyword collation, return 0 so that the LCID lookup table will be used. + return 0; + } + else + { + // If the locale ID contains keywords other than collation, just use the base name. + len = uloc_getBaseName(localeID, baseName, UPRV_LENGTHOF(baseName) - 1, &myStatus); + + if (U_SUCCESS(myStatus) && len > 0) + { + baseName[len] = 0; + mylocaleID = baseName; + } + } + } + + char asciiBCP47Tag[LOCALE_NAME_MAX_LENGTH] = {}; + // this will change it from de_DE@collation=phonebook to de-DE-u-co-phonebk form + (void)uloc_toLanguageTag(mylocaleID, asciiBCP47Tag, UPRV_LENGTHOF(asciiBCP47Tag), FALSE, &myStatus); + + if (U_SUCCESS(myStatus)) + { + // Need it to be UTF-16, not 8-bit + wchar_t bcp47Tag[LOCALE_NAME_MAX_LENGTH] = {}; + int32_t i; + for (i = 0; i < UPRV_LENGTHOF(bcp47Tag); i++) + { + if (asciiBCP47Tag[i] == '\0') + { + break; + } + else + { + // Copy the character + bcp47Tag[i] = static_cast(asciiBCP47Tag[i]); + } + } + + if (i < (UPRV_LENGTHOF(bcp47Tag) - 1)) + { + // Ensure it's null terminated + bcp47Tag[i] = L'\0'; + LCID lcid = LocaleNameToLCID(bcp47Tag, nameLCIDFlags); + if (lcid > 0) + { + // Found LCID from windows, return that one, unless its completely ambiguous + // LOCALE_USER_DEFAULT and transients are OK because they will round trip + // for this process. + if (lcid != LOCALE_CUSTOM_UNSPECIFIED) + { + return lcid; + } + } + } + } +#else + (void)localeID; // Suppress unused variable warning. +#endif /* USE_WINDOWS_LCID_MAPPING_API */ + + // No found, or not implemented on platforms without native name->lcid conversion + return 0; +} + +U_CAPI uint32_t +uprv_convertToLCID(const char *langID, const char* posixID, UErrorCode* status) +{ + // This function does the table lookup when native platform name->lcid conversion isn't available, + // or for locales that don't follow patterns the platform expects. + uint32_t low = 0; + uint32_t high = gLocaleCount; + uint32_t mid; + uint32_t oldmid = 0; + int32_t compVal; + + uint32_t value = 0; + uint32_t fallbackValue = (uint32_t)-1; + UErrorCode myStatus; + uint32_t idx; + + /* Check for incomplete id. */ + if (!langID || !posixID || uprv_strlen(langID) < 2 || uprv_strlen(posixID) < 2) { + return 0; + } + + /*Binary search for the map entry for normal cases */ + + while (high > low) /*binary search*/{ + + mid = (high+low) >> 1; /*Finds median*/ + + if (mid == oldmid) + break; + + compVal = uprv_strcmp(langID, gPosixIDmap[mid].regionMaps->posixID); + if (compVal < 0){ + high = mid; + } + else if (compVal > 0){ + low = mid; + } + else /*we found it*/{ + return getHostID(&gPosixIDmap[mid], posixID, status); + } + oldmid = mid; + } + + /* + * Sometimes we can't do a binary search on posixID because some LCIDs + * go to different locales. We hit one of those special cases. + */ + for (idx = 0; idx < gLocaleCount; idx++ ) { + myStatus = U_ZERO_ERROR; + value = getHostID(&gPosixIDmap[idx], posixID, &myStatus); + if (myStatus == U_ZERO_ERROR) { + return value; + } + else if (myStatus == U_USING_FALLBACK_WARNING) { + fallbackValue = value; + } + } + + if (fallbackValue != (uint32_t)-1) { + *status = U_USING_FALLBACK_WARNING; + return fallbackValue; + } + + /* no match found */ + *status = U_ILLEGAL_ARGUMENT_ERROR; + return 0; /* return international (root) */ +} diff --git a/Build/source/libs/icu/icu-src/source/common/locmap.h b/Build/source/libs/icu/icu-src/source/common/locmap.h index 4e14fe5ddcf..bef62956e64 100644 --- a/Build/source/libs/icu/icu-src/source/common/locmap.h +++ b/Build/source/libs/icu/icu-src/source/common/locmap.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ****************************************************************************** @@ -32,7 +32,8 @@ U_CAPI int32_t uprv_convertToPosix(uint32_t hostid, char* posixID, int32_t posixIDCapacity, UErrorCode* status); -/* Don't call this function directly. Use uloc_getLCID instead. */ +/* Don't call these functions directly. Use uloc_getLCID instead. */ +U_CAPI uint32_t uprv_convertToLCIDPlatform(const char *localeID); // Leverage platform conversion if possible U_CAPI uint32_t uprv_convertToLCID(const char *langID, const char* posixID, UErrorCode* status); #endif /* LOCMAP_H */ diff --git a/Build/source/libs/icu/icu-src/source/common/locresdata.cpp b/Build/source/libs/icu/icu-src/source/common/locresdata.cpp index ee606397dfb..258b707334e 100644 --- a/Build/source/libs/icu/icu-src/source/common/locresdata.cpp +++ b/Build/source/libs/icu/icu-src/source/common/locresdata.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* @@ -8,7 +8,7 @@ * ******************************************************************************* * file name: loclikely.cpp -* encoding: US-ASCII +* encoding: UTF-8 * tab size: 8 (not used) * indentation:4 * diff --git a/Build/source/libs/icu/icu-src/source/common/locutil.cpp b/Build/source/libs/icu/icu-src/source/common/locutil.cpp index a27edf12f57..5f0bd520e37 100644 --- a/Build/source/libs/icu/icu-src/source/common/locutil.cpp +++ b/Build/source/libs/icu/icu-src/source/common/locutil.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* diff --git a/Build/source/libs/icu/icu-src/source/common/locutil.h b/Build/source/libs/icu/icu-src/source/common/locutil.h index 64f7dcc2c05..31bfffd7a59 100644 --- a/Build/source/libs/icu/icu-src/source/common/locutil.h +++ b/Build/source/libs/icu/icu-src/source/common/locutil.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /** ******************************************************************************* diff --git a/Build/source/libs/icu/icu-src/source/common/messageimpl.h b/Build/source/libs/icu/icu-src/source/common/messageimpl.h index 980f777e8df..dc7a6edd6c0 100644 --- a/Build/source/libs/icu/icu-src/source/common/messageimpl.h +++ b/Build/source/libs/icu/icu-src/source/common/messageimpl.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* @@ -6,7 +6,7 @@ * Corporation and others. All Rights Reserved. ******************************************************************************* * file name: messageimpl.h -* encoding: US-ASCII +* encoding: UTF-8 * tab size: 8 (not used) * indentation:4 * diff --git a/Build/source/libs/icu/icu-src/source/common/messagepattern.cpp b/Build/source/libs/icu/icu-src/source/common/messagepattern.cpp index 31d5bb7b9a6..f223d067116 100644 --- a/Build/source/libs/icu/icu-src/source/common/messagepattern.cpp +++ b/Build/source/libs/icu/icu-src/source/common/messagepattern.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* @@ -6,7 +6,7 @@ * Corporation and others. All Rights Reserved. ******************************************************************************* * file name: messagepattern.cpp -* encoding: US-ASCII +* encoding: UTF-8 * tab size: 8 (not used) * indentation:4 * diff --git a/Build/source/libs/icu/icu-src/source/common/msvcres.h b/Build/source/libs/icu/icu-src/source/common/msvcres.h index ac23b97af70..0cace85e747 100644 --- a/Build/source/libs/icu/icu-src/source/common/msvcres.h +++ b/Build/source/libs/icu/icu-src/source/common/msvcres.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html //{{NO_DEPENDENCIES}} // Copyright (c) 2003-2010 International Business Machines diff --git a/Build/source/libs/icu/icu-src/source/common/mutex.h b/Build/source/libs/icu/icu-src/source/common/mutex.h index 525628b4041..bb45e7df83c 100644 --- a/Build/source/libs/icu/icu-src/source/common/mutex.h +++ b/Build/source/libs/icu/icu-src/source/common/mutex.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ****************************************************************************** diff --git a/Build/source/libs/icu/icu-src/source/common/norm2_nfc_data.h b/Build/source/libs/icu/icu-src/source/common/norm2_nfc_data.h index 4ddba0f8ba6..8f5c4346db5 100644 --- a/Build/source/libs/icu/icu-src/source/common/norm2_nfc_data.h +++ b/Build/source/libs/icu/icu-src/source/common/norm2_nfc_data.h @@ -1,49 +1,50 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html -/* - * Copyright (C) 1999-2016, International Business Machines - * Corporation and others. All Rights Reserved. - * - * file name: norm2_nfc_data.h - * - * machine-generated by: icu/source/tools/gennorm2/n2builder.cpp - */ +// +// Copyright (C) 1999-2016, International Business Machines +// Corporation and others. All Rights Reserved. +// +// file name: norm2_nfc_data.h +// +// machine-generated by: icu/source/tools/gennorm2/n2builder.cpp + #ifdef INCLUDED_FROM_NORMALIZER2_CPP -static const UVersionInfo norm2_nfc_data_formatVersion={2,0,0,0}; -static const UVersionInfo norm2_nfc_data_dataVersion={9,0,0,0}; +static const UVersionInfo norm2_nfc_data_formatVersion={3,0,0,0}; +static const UVersionInfo norm2_nfc_data_dataVersion={0xa,0,0,0}; static const int32_t norm2_nfc_data_indexes[Normalizer2Impl::IX_COUNT]={ -0x40,0x4bb8,0x880c,0x890c,0x890c,0x890c,0x890c,0x890c,0xc0,0x300,0x56e,0x14e7,0x1e2a,0xfe00,0x941,0 +0x50,0x4cc0,0x8918,0x8a18,0x8a18,0x8a18,0x8a18,0x8a18,0xc0,0x300,0xadc,0x29d0,0x3c56,0xfc00,0x1282,0x3b8c, +0x3c24,0x3c56,0x300,0 }; -static const uint16_t norm2_nfc_data_trieIndex[9652]={ +static const uint16_t norm2_nfc_data_trieIndex[9776]={ 0x2a8,0x2b0,0x2b8,0x2c0,0x2ce,0x2d6,0x2de,0x2e6,0x2ee,0x2f6,0x2fe,0x306,0x30e,0x316,0x31c,0x324, 0x32c,0x334,0x2c7,0x2cf,0x339,0x341,0x2c7,0x2cf,0x349,0x351,0x359,0x361,0x369,0x371,0x379,0x381, 0x389,0x391,0x399,0x3a1,0x3a9,0x3b1,0x3b9,0x3c1,0x2c7,0x2cf,0x2c7,0x2cf,0x3c8,0x3d0,0x3d8,0x3e0, 0x3e4,0x3ec,0x3f2,0x3fa,0x2c7,0x2cf,0x402,0x40a,0x40e,0x416,0x41e,0x426,0x2c7,0x2cf,0x424,0x42c, 0x431,0x438,0x43c,0x2c7,0x2c7,0x2c7,0x443,0x44b,0x2c7,0x453,0x45b,0x2c7,0x2c7,0x463,0x46b,0x2c7, 0x2c7,0x473,0x47b,0x2c7,0x2c7,0x483,0x48b,0x2c7,0x2c7,0x463,0x492,0x2c7,0x49a,0x4a0,0x4a8,0x2c7, -0x2c7,0x2c7,0x4af,0x2c7,0x2c7,0x4b5,0x4bd,0x2c7,0x2c7,0x4a0,0x4c4,0x2c7,0x2c7,0x2c7,0x4ca,0x2c7, -0x2c7,0x4d2,0x4d9,0x2c7,0x2c7,0x4dc,0x4e3,0x2c7,0x4e6,0x4ed,0x4f5,0x4fd,0x505,0x50d,0x514,0x2c7, -0x2c7,0x51b,0x2c7,0x2c7,0x522,0x2c7,0x2c7,0x2c7,0x929,0x2c7,0x2c7,0x931,0x2c7,0x937,0x93f,0x2c7, -0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x526,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7, +0x2c7,0x2c7,0x4af,0x2c7,0x2c7,0x4b5,0x4bd,0x2c7,0x2c7,0x4c3,0x4cb,0x2c7,0x2c7,0x2c7,0x4d1,0x2c7, +0x2c7,0x4d9,0x4e0,0x2c7,0x2c7,0x4e3,0x4ea,0x2c7,0x4ed,0x4f4,0x4fc,0x504,0x50c,0x514,0x51b,0x2c7, +0x2c7,0x522,0x2c7,0x2c7,0x529,0x2c7,0x2c7,0x2c7,0x93b,0x2c7,0x2c7,0x943,0x2c7,0x949,0x951,0x2c7, +0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x52d,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7, 0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7, -0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x52e,0x52e,0x2c7,0x2c7,0x2c7,0x2c7,0x534,0x2c7, -0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x53c,0x2c7,0x2c7,0x2c7,0x53f,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7, -0x546,0x2c7,0x2c7,0x54e,0x2c7,0x556,0x2c7,0x2c7,0x55e,0x563,0x56b,0x571,0x2c7,0x577,0x2c7,0x57e, -0x2c7,0x583,0x2c7,0x2c7,0x2c7,0x2c7,0x589,0x591,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x599,0x59e, -0x5a6,0x5ae,0x5b6,0x5be,0x5c6,0x5ce,0x5d6,0x5de,0x5e6,0x5ee,0x5f6,0x5fe,0x606,0x60e,0x616,0x61e, -0x626,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x62a,0x632,0x2c7,0x639,0x2c7,0x2c7,0x63d,0x644,0x649,0x2c7, -0x651,0x659,0x661,0x669,0x671,0x679,0x2c7,0x681,0x2c7,0x687,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7, +0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x535,0x535,0x2c7,0x2c7,0x2c7,0x2c7,0x53b,0x2c7, +0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x543,0x2c7,0x2c7,0x2c7,0x546,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7, +0x54d,0x2c7,0x2c7,0x555,0x2c7,0x55d,0x2c7,0x2c7,0x565,0x56a,0x572,0x578,0x2c7,0x57e,0x2c7,0x585, +0x2c7,0x58a,0x2c7,0x2c7,0x2c7,0x2c7,0x590,0x598,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x5a0,0x5a5, +0x5ad,0x5b5,0x5bd,0x5c5,0x5cd,0x5d5,0x5dd,0x5e5,0x5ed,0x5f5,0x5fd,0x605,0x60d,0x615,0x61d,0x625, +0x62d,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x631,0x639,0x2c7,0x640,0x2c7,0x2c7,0x644,0x64b,0x650,0x2c7, +0x658,0x660,0x668,0x670,0x678,0x680,0x2c7,0x688,0x2c7,0x68e,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7, 0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7, 0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7, 0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7, -0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x68a,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7, -0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x692,0x2c7,0x2c7,0x2c7,0x697,0x2c7,0x2c7,0x2c7,0x69f, +0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x691,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7, +0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x699,0x2c7,0x2c7,0x2c7,0x69e,0x2c7,0x2c7,0x2c7,0x6a6, 0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7, -0x2c7,0x6a7,0x6ae,0x6b6,0x6be,0x6c6,0x6ce,0x6d6,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7, +0x2c7,0x6ae,0x6b5,0x6bd,0x6c5,0x6cd,0x6d5,0x6dd,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7, 0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7, 0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7, 0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7, @@ -102,32 +103,32 @@ static const uint16_t norm2_nfc_data_trieIndex[9652]={ 0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7, 0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7, 0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7, -0x2c7,0x2c7,0x2c7,0x6de,0x6e6,0x2c7,0x2c7,0x6ee,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7, -0x6f5,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x6fc,0x704,0x2c7,0x70a,0x70e,0x2c7,0x2c7,0x584,0x716,0x2c7, -0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x71a,0x722,0x725,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x48b, -0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947, -0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947, -0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947, -0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947, -0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947, -0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947, -0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947, -0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947, -0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947, -0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947, -0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947, -0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947, -0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947, -0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947, -0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947, -0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947, -0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947, -0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947, -0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947, -0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947, -0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947, -0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x94e,0x2c7,0x2c7, -0x956,0x95d,0x2a8,0x964,0x2a8,0x2a8,0x2a8,0x2a8,0x2a8,0x2a8,0x2a8,0x2a8,0x2a8,0x2a8,0x2a8,0x2a8, +0x2c7,0x2c7,0x2c7,0x6e5,0x6ed,0x2c7,0x2c7,0x6f5,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7, +0x6fc,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x703,0x70b,0x2c7,0x711,0x715,0x2c7,0x2c7,0x58b,0x71d,0x2c7, +0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x721,0x729,0x72c,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x48b, +0x959,0x95a,0x95b,0x95c,0x95d,0x95e,0x96d,0x959,0x95a,0x95b,0x95c,0x95d,0x95e,0x96d,0x959,0x95a, +0x95b,0x95c,0x95d,0x95e,0x96d,0x959,0x95a,0x95b,0x95c,0x95d,0x95e,0x96d,0x959,0x95a,0x95b,0x95c, +0x95d,0x95e,0x96d,0x959,0x95a,0x95b,0x95c,0x95d,0x95e,0x96d,0x959,0x95a,0x95b,0x95c,0x95d,0x95e, +0x96d,0x959,0x95a,0x95b,0x95c,0x95d,0x95e,0x96d,0x959,0x95a,0x95b,0x95c,0x95d,0x95e,0x96d,0x959, +0x95a,0x95b,0x95c,0x95d,0x95e,0x96d,0x959,0x95a,0x95b,0x95c,0x95d,0x95e,0x96d,0x959,0x95a,0x95b, +0x95c,0x95d,0x95e,0x96d,0x959,0x95a,0x95b,0x95c,0x95d,0x95e,0x96d,0x959,0x95a,0x95b,0x95c,0x95d, +0x95e,0x96d,0x959,0x95a,0x95b,0x95c,0x95d,0x95e,0x96d,0x959,0x95a,0x95b,0x95c,0x95d,0x95e,0x96d, +0x959,0x95a,0x95b,0x95c,0x95d,0x95e,0x96d,0x959,0x95a,0x95b,0x95c,0x95d,0x95e,0x96d,0x959,0x95a, +0x95b,0x95c,0x95d,0x95e,0x96d,0x959,0x95a,0x95b,0x95c,0x95d,0x95e,0x96d,0x959,0x95a,0x95b,0x95c, +0x95d,0x95e,0x96d,0x959,0x95a,0x95b,0x95c,0x95d,0x95e,0x96d,0x959,0x95a,0x95b,0x95c,0x95d,0x95e, +0x96d,0x959,0x95a,0x95b,0x95c,0x95d,0x95e,0x96d,0x959,0x95a,0x95b,0x95c,0x95d,0x95e,0x96d,0x959, +0x95a,0x95b,0x95c,0x95d,0x95e,0x96d,0x959,0x95a,0x95b,0x95c,0x95d,0x95e,0x96d,0x959,0x95a,0x95b, +0x95c,0x95d,0x95e,0x96d,0x959,0x95a,0x95b,0x95c,0x95d,0x95e,0x96d,0x959,0x95a,0x95b,0x95c,0x95d, +0x95e,0x96d,0x959,0x95a,0x95b,0x95c,0x95d,0x95e,0x96d,0x959,0x95a,0x95b,0x95c,0x95d,0x95e,0x96d, +0x959,0x95a,0x95b,0x95c,0x95d,0x95e,0x96d,0x959,0x95a,0x95b,0x95c,0x95d,0x95e,0x96d,0x959,0x95a, +0x95b,0x95c,0x95d,0x95e,0x96d,0x959,0x95a,0x95b,0x95c,0x95d,0x95e,0x96d,0x959,0x95a,0x95b,0x95c, +0x95d,0x95e,0x96d,0x959,0x95a,0x95b,0x95c,0x95d,0x95e,0x96d,0x959,0x95a,0x95b,0x95c,0x95d,0x95e, +0x96d,0x959,0x95a,0x95b,0x95c,0x95d,0x95e,0x96d,0x959,0x95a,0x95b,0x95c,0x95d,0x95e,0x96d,0x959, +0x95a,0x95b,0x95c,0x95d,0x95e,0x96d,0x959,0x95a,0x95b,0x95c,0x95d,0x95e,0x96d,0x959,0x95a,0x95b, +0x95c,0x95d,0x95e,0x96d,0x959,0x95a,0x95b,0x95c,0x95d,0x95e,0x96d,0x959,0x95a,0x95b,0x95c,0x95d, +0x95e,0x96d,0x959,0x95a,0x95b,0x95c,0x95d,0x95e,0x96d,0x959,0x95a,0x95b,0x95c,0x95d,0x95e,0x96d, +0x959,0x95a,0x95b,0x95c,0x95d,0x95e,0x96d,0x959,0x95a,0x95b,0x95c,0x95d,0x95e,0x965,0x2c7,0x2c7, +0x975,0x97c,0x2a8,0x983,0x2a8,0x2a8,0x2a8,0x2a8,0x2a8,0x2a8,0x2a8,0x2a8,0x2a8,0x2a8,0x2a8,0x2a8, 0x2a8,0x2a8,0x2a8,0x2a8,0x2a8,0x2a8,0x2a8,0x2a8,0x2a8,0x2a8,0x2a8,0x2a8,0x2a8,0x2a8,0x2a8,0x2a8, 0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7, 0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7, @@ -143,489 +144,496 @@ static const uint16_t norm2_nfc_data_trieIndex[9652]={ 0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7, 0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7, 0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7, -0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x72d,0x735,0x73d,0x745,0x74d,0x755,0x75d,0x765, -0x76d,0x775,0x77d,0x785,0x78d,0x795,0x79d,0x2c7,0x7a4,0x7ac,0x7b4,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7, +0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x734,0x73c,0x744,0x74c,0x754,0x75c,0x764,0x76c, +0x774,0x77c,0x784,0x78c,0x794,0x79c,0x7a4,0x2c7,0x7ab,0x7b3,0x7bb,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7, 0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7, -0x2c7,0x7bc,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7, +0x2c7,0x7c3,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7, 0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7, 0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7, 0xb20,0xb20,0xb38,0xb78,0xbb8,0xbf8,0xc38,0xc70,0xcb0,0xb1c,0xce4,0xb1c,0xd24,0xd64,0xda4,0xde4, 0xe24,0xe64,0xea4,0xee4,0xb1c,0xb1c,0xf20,0xf60,0xf90,0xfc8,0xb1c,0x1008,0x1038,0x1078,0xb1c,0x1090, -0x880,0x8b0,0x8ee,0x928,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x951,0x188,0x188, -0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x96d,0x188,0x188,0x9a3,0x188,0x9e3,0xa1d,0x188,0x188, +0x880,0x8b0,0x8ee,0x928,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x953,0x188,0x188, +0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x96f,0x188,0x188,0x9a5,0x188,0x9e5,0xa1f,0x188,0x188, 0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188, -0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0xa5d, -0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x7c0, -0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x7c8,0x2c7,0x2c7,0x2c7,0x7cb,0x2c7,0x2c7,0x2c7,0x2c7, -0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7, -0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7, -0x7d2,0x7d6,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x7de,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7, -0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7, -0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7, -0x6f5,0x697,0x7e0,0x7e8,0x2c7,0x2c7,0x7f0,0x7f7,0x2c7,0x584,0x2c7,0x2c7,0x7ff,0x2c7,0x2c7,0x802, -0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x808,0x2c7,0x463,0x80f,0x816,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7, -0x81e,0x2c7,0x2c7,0x822,0x82a,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x82f,0x837,0x2c7,0x2c7,0x697, -0x2c7,0x2c7,0x2c7,0x83a,0x2c7,0x2c7,0x2c7,0x840,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7, -0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7, -0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x697,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7, -0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7, -0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x844,0x2c7,0x84a,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7, -0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7, -0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7, -0x2c7,0x850,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7, -0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x858,0x860,0x868, -0x86e,0x876,0x2c7,0x2c7,0x2c7,0x87e,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7, -0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7, -0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7, -0x2c7,0x2c7,0x2c7,0x886,0x88e,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7, -0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7, -0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7, -0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7, -0x2c7,0x2c7,0x2c7,0x892,0x2c7,0x2c7,0x2c7,0x899,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7, -0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7, -0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7, -0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x8a1,0x8a9,0x8b1, -0x8b9,0x8c1,0x8c9,0x8d1,0x8d9,0x8e1,0x8e9,0x8f1,0x8f9,0x901,0x909,0x911,0x919,0x921,0x2c7,0x2c7, -0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7, -0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7, -0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2a7,0x2a7,0x2a7, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,2,4,6,0, -0,8,0x28,0x2e,0x38,0x44,0x66,0x68,0x76,0x84,0xa2,0xa4,0xae,0xba,0xc0,0xd2, -0xf2,0,0xf6,0x106,0x114,0x122,0x148,0x14c,0x158,0x15c,0x16e,0,0,0,0,0, -0,0x17a,0x19a,0x1a0,0x1aa,0x1b6,0x1d8,0x1da,0x1e8,0x1f8,0x214,0x218,0x222,0x22e,0x234,0x246, -0x266,0,0x26a,0x27a,0x288,0x298,0x2be,0x2c2,0x2d0,0x2d4,0x2e8,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0x2f4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0x941,0x944,0x56f,0x947,0x57a,0x57f,0x2fa,0x584, -0x94a,0x94d,0x589,0x950,0x953,0x956,0x959,0x594,0,0x95c,0x95f,0x962,0x599,0x5a4,0x5ad,0, -0x2fe,0x965,0x968,0x96b,0x5b2,0x96e,0,0,0x971,0x974,0x5bd,0x977,0x5c8,0x5cd,0x300,0x5d2, -0x97a,0x97d,0x5d7,0x980,0x983,0x986,0x989,0x5e2,0,0x98c,0x98f,0x992,0x5e7,0x5f2,0x5fb,0, -0x304,0x995,0x998,0x99b,0x600,0x99e,0,0x9a1,0x9a4,0x9a7,0x60b,0x616,0x9aa,0x9ad,0x9b0,0x9b3, -0x9b6,0x9b9,0x9bc,0x9bf,0x9c2,0x9c5,0x9c8,0x9cb,0,0,0x621,0x628,0x9ce,0x9d1,0x9d4,0x9d7, -0x9da,0x9dd,0x9e0,0x9e3,0x9e6,0x9e9,0x9ec,0x9ef,0x9f2,0x9f5,0x9f8,0x9fb,0x9fe,0xa01,0,0, -0xa04,0xa07,0xa0a,0xa0d,0xa10,0xa13,0xa16,0xa19,0xa1c,0,0,0,0xa1f,0xa22,0xa25,0xa28, -0,0xa2b,0xa2e,0xa31,0xa34,0xa37,0xa3a,0,0,0,0,0xa3d,0xa40,0xa43,0xa46,0xa49, -0xa4c,0,0,0,0x62f,0x636,0xa4f,0xa52,0xa55,0xa58,0,0,0xa5b,0xa5e,0xa61,0xa64, -0xa67,0xa6a,0x63d,0x642,0xa6d,0xa70,0xa73,0xa76,0x647,0x64c,0xa79,0xa7c,0xa7f,0xa82,0,0, -0x651,0x656,0x65b,0x660,0xa85,0xa88,0xa8b,0xa8e,0xa91,0xa94,0xa97,0xa9a,0xa9d,0xaa0,0xaa3,0xaa6, -0xaa9,0xaac,0xaaf,0xab2,0xab5,0xab8,0xabb,0x306,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0x665,0x672,0,0,0,0,0,0, -0,0,0,0,0,0,0,0x67f,0x68c,0,0,0,0,0,0,0x308, -0,0,0,0,0,0,0,0,0,0,0,0,0,0xabe,0xac1,0xac4, -0xac7,0xaca,0xacd,0xad0,0xad3,0xad7,0xadc,0xae1,0xae6,0xaeb,0xaf0,0xaf5,0xafa,0,0xaff,0xb04, -0xb09,0xb0e,0xb12,0xb15,0,0,0xb18,0xb1b,0xb1e,0xb21,0x699,0x69e,0xb25,0xb2a,0xb2e,0xb31, -0xb34,0,0,0,0xb37,0xb3a,0,0,0xb3d,0xb40,0xb44,0xb49,0xb4d,0xb50,0xb53,0xb56, -0xb59,0xb5c,0xb5f,0xb62,0xb65,0xb68,0xb6b,0xb6e,0xb71,0xb74,0xb77,0xb7a,0xb7d,0xb80,0xb83,0xb86, -0xb89,0xb8c,0xb8f,0xb92,0xb95,0xb98,0xb9b,0xb9e,0xba1,0xba4,0xba7,0xbaa,0,0,0xbad,0xbb0, -0,0,0,0,0,0,0x6a3,0x6a8,0x6ad,0x6b2,0xbb4,0xbb9,0xbbe,0xbc3,0x6b7,0x6bc, -0xbc8,0xbcd,0xbd1,0xbd4,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0x30a,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0xfee6,0xfee6,0xfee6,0xfee6,0xfee6,0xffe6,0xfee6,0xfee6,0xfee6,0xfee6,0xfee6,0xfee6, -0xfee6,0xffe6,0xffe6,0xfee6,0xffe6,0xfee6,0xffe6,0xfee6,0xfee6,0xffe8,0xffdc,0xffdc,0xffdc,0xffdc,0xffe8,0xfed8, -0xffdc,0xffdc,0xffdc,0xffdc,0xffdc,0xffca,0xffca,0xfedc,0xfedc,0xfedc,0xfedc,0xfeca,0xfeca,0xffdc,0xffdc,0xffdc, -0xffdc,0xfedc,0xfedc,0xffdc,0xfedc,0xfedc,0xffdc,0xffdc,0xff01,0xff01,0xff01,0xff01,0xfe01,0xffdc,0xffdc,0xffdc, -0xffdc,0xffe6,0xffe6,0xffe6,0x14e8,0x14eb,0xfee6,0x14ee,0x14f1,0xfef0,0xffe6,0xffdc,0xffdc,0xffdc,0xffe6,0xffe6, -0xffe6,0xffdc,0xffdc,0,0xffe6,0xffe6,0xffe6,0xffdc,0xffdc,0xffdc,0xffdc,0xffe6,0xffe8,0xffdc,0xffdc,0xffe6, -0xffe9,0xffea,0xffea,0xffe9,0xffea,0xffea,0xffe9,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6, -0xffe6,0xffe6,0xffe6,0xffe6,0,0,0,0,0x14f4,0,0,0,0,0,0,0, -0,0,0x14f6,0,0,0,0,0,0,0xbd7,0xbda,0x14f8,0xbdd,0xbe0,0xbe3,0, -0xbe6,0,0xbe9,0xbec,0xbf0,0x30c,0,0,0,0x31a,0,0x322,0,0x32c,0,0, -0,0,0,0x33a,0,0x342,0,0,0,0x344,0,0,0,0x350,0xbf4,0xbf7, -0x6c1,0xbfa,0x6c6,0xbfd,0xc01,0x35a,0,0,0,0x36a,0,0x372,0,0x37e,0,0, -0,0,0,0x38e,0,0x396,0,0,0,0x39a,0,0,0,0x3aa,0x6cb,0x6d4, -0xc05,0xc08,0x6dd,0,0,0,0x3b6,0xc0b,0xc0e,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0xc11,0xc14,0,0xc17,0,0,0x3ba,0xc1a,0,0,0,0, -0xc1d,0xc20,0xc23,0,0x3bc,0,0,0x3c0,0,0x3c2,0x3c8,0x3cc,0x3ce,0xc26,0x3d6,0, -0,0,0x3d8,0,0,0,0,0x3da,0,0,0,0x3e2,0,0,0,0x3e4, -0,0x3e6,0,0,0x3e8,0,0,0x3ec,0,0x3ee,0x3f4,0x3f8,0x3fa,0xc29,0x402,0, -0,0,0x404,0,0,0,0,0x406,0,0,0,0x40e,0,0,0,0x410, -0,0x412,0,0,0xc2c,0xc2f,0,0xc32,0,0,0x414,0xc35,0,0,0,0, -0xc38,0xc3b,0xc3e,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0x416,0x418,0xc41,0xc44,0,0,0,0, -0,0,0,0,0,0,0,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0xc47,0xc4a,0,0,0,0,0,0,0,0,0, -0,0,0,0,0xc4d,0xc50,0xc53,0xc56,0,0,0xc59,0xc5c,0x41a,0x41c,0xc5f,0xc62, -0xc65,0xc68,0xc6b,0xc6e,0,0,0xc71,0xc74,0xc77,0xc7a,0xc7d,0xc80,0x41e,0x420,0xc83,0xc86, -0xc89,0xc8c,0xc8f,0xc92,0xc95,0xc98,0xc9b,0xc9e,0xca1,0xca4,0,0,0xca7,0xcaa,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0xffdc,0xffe6,0xffe6,0xffe6,0xffe6,0xffdc,0xffe6,0xffe6,0xffe6,0xffde,0xffdc,0xffe6,0xffe6,0xffe6,0xffe6, -0xffe6,0xffe6,0xffdc,0xffdc,0xffdc,0xffdc,0xffdc,0xffdc,0xffe6,0xffe6,0xffdc,0xffe6,0xffe6,0xffde,0xffe4,0xffe6, -0xff0a,0xff0b,0xff0c,0xff0d,0xff0e,0xff0f,0xff10,0xff11,0xff12,0xff13,0xff13,0xff14,0xff15,0xff16,0,0xff17, -0,0xff18,0xff19,0,0xffe6,0xffdc,0,0xff12,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xff1e,0xff1f,0xff20,0,0,0,0,0, -0,0,0xcad,0xcb0,0xcb3,0xcb6,0xcb9,0x422,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0x428,0,0x42a,0xff1b,0xff1c,0xff1d,0xff1e,0xff1f,0xff20,0xff21,0xff22,0xfee6,0xfee6,0xfedc,0xffdc,0xffe6, -0xffe6,0xffe6,0xffe6,0xffe6,0xffdc,0xffe6,0xffe6,0xffdc,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0xff23,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0xcbc,0x42c,0xcbf,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0x42e,0xcc2,0,0x430,0xffe6,0xffe6, -0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0,0,0xffe6,0xffe6,0xffe6,0xffe6,0xffdc,0xffe6,0,0,0xffe6, -0xffe6,0,0xffdc,0xffe6,0xffe6,0xffdc,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0xff24,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0xffe6,0xffdc,0xffe6,0xffe6,0xffdc,0xffe6,0xffe6,0xffdc, -0xffdc,0xffdc,0xffe6,0xffdc,0xffdc,0xffe6,0xffdc,0xffe6,0xffe6,0xffe6,0xffdc,0xffe6,0xffdc,0xffe6,0xffdc,0xffe6, -0xffdc,0xffe6,0xffe6,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6, -0xffe6,0xffe6,0xffdc,0xffe6,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0xffe6,0xffe6,0xffe6,0xffe6,0,0xffe6, -0xffe6,0xffe6,0xffe6,0xffe6,0,0xffe6,0xffe6,0xffe6,0,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0xffdc,0xffdc,0xffdc,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0,0xffdc, -0xffe6,0xffe6,0xffdc,0xffe6,0xffe6,0xffdc,0xffe6,0xffe6,0xffe6,0xffdc,0xffdc,0xffdc,0xff1b,0xff1c,0xff1d,0xffe6, -0xffe6,0xffe6,0xffdc,0xffe6,0xffe6,0xffdc,0xffdc,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0,0,0,0, -0,0,0,0,0x432,0xcc5,0,0,0,0,0,0,0x434,0xcc8,0,0x436, -0xccb,0,0,0,0,0,0,0,0xfe07,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0xff09,0,0,0,0xffe6,0xffdc,0xffe6, -0xffe6,0,0,0,0x14fa,0x14fd,0x1500,0x1503,0x1506,0x1509,0x150c,0x150f,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0xff07,0,0xfe00,0,0,0,0,0, -0,0,0,0x438,0,0,0,0xcce,0xcd1,0xff09,0,0,0,0,0,0, -0,0,0,0xfe00,0,0,0,0,0x1512,0x1515,0,0x1518,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0x151b, -0,0,0x151e,0,0,0,0,0,0xff07,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0xff09,0,0,0,0,0,0, -0,0,0,0,0,0x1521,0x1524,0x1527,0,0,0x152a,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0xff07,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0xff09,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0x43c, -0xcd4,0,0,0xcd7,0xcda,0xff09,0,0,0,0,0,0,0,0,0xfe00,0xfe00, -0,0,0,0,0x152d,0x1530,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0x442,0,0xcdd,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0xfe00,0, -0,0,0,0,0,0,0x444,0x448,0,0,0xce0,0xce3,0xce6,0xff09,0,0, -0,0,0,0,0,0,0,0xfe00,0,0,0,0,0,0,0,0, -0,0,0x44a,0,0xce9,0,0,0,0,0xff09,0,0,0,0,0,0, -0,0xff54,0xfe5b,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0xff07,0,0,0x44c,0xcec,0,0xfe00,0,0,0,0x44e,0xcef,0xcf2,0,0x6e2,0xcf6, -0,0xff09,0,0,0,0,0,0,0,0xfe00,0xfe00,0,0,0,0,0, -0,0,0,0,0,0,0x454,0x458,0,0,0xcfa,0xcfd,0xd00,0xff09,0,0, -0,0,0,0,0,0,0,0xfe00,0,0,0,0,0,0,0,0, -0,0,0xfe09,0,0,0,0,0xfe00,0,0,0,0,0,0,0,0, -0,0x45a,0xd03,0,0x6e7,0xd07,0xd0b,0xfe00,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0xff67,0xff67,0xff09,0,0,0,0,0,0,0,0,0,0xff6b,0xff6b,0xff6b,0xff6b, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0xff76,0xff76,0,0,0,0,0,0, -0,0,0,0,0xff7a,0xff7a,0xff7a,0xff7a,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0xffdc,0xffdc,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0xffdc,0,0xffdc,0,0xffd8,0,0, -0,0,0,0,0,0,0,0x1533,0,0,0,0,0,0,0,0, -0,0x1536,0,0,0,0,0x1539,0,0,0,0,0x153c,0,0,0,0, -0x153f,0,0,0,0,0,0,0,0,0,0,0,0,0x1542,0,0, -0,0,0,0,0,0xff81,0xff82,0x1546,0xff84,0x154a,0x154d,0,0x1550,0,0xff82,0xff82, -0xff82,0xff82,0,0,0xff82,0x1554,0xffe6,0xffe6,0xff09,0,0xffe6,0xffe6,0,0,0,0, -0,0,0,0,0,0,0,0x1557,0,0,0,0,0,0,0,0, -0,0x155a,0,0,0,0,0x155d,0,0,0,0,0x1560,0,0,0,0, -0x1563,0,0,0,0,0,0,0,0,0,0,0,0,0x1566,0,0, -0,0,0,0,0,0,0xffdc,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0x460,0xd0e,0,0,0,0,0,0,0,0xfe00,0,0,0,0,0, -0,0,0,0xff07,0,0xff09,0xff09,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0xffdc,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0xffe6,0xffe6,0xffe6,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0xff09,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0xff09,0,0,0,0,0,0,0,0,0,0,0xffe6,0,0, -0,0,0,0,0,0,0,0,0,0xffe4,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0xffde,0xffe6,0xffdc,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0xffe6, -0xffdc,0,0,0,0,0,0,0,0xff09,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0xffe6,0xffe6,0xffe6, -0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0,0,0xffdc,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffdc,0xffdc,0xffdc, -0xffdc,0xffdc,0xffdc,0xffe6,0xffe6,0xffdc,0,0,0,0,0,0,0,0x462,0xd11,0x464, -0xd14,0x466,0xd17,0x468,0xd1a,0x46a,0xd1d,0,0,0x46c,0xd20,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0xff07,0xfe00,0,0,0,0,0x46e,0xd23,0x470,0xd26,0x472,0x474,0xd29,0xd2c,0x476,0xd2f, -0xff09,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0xffe6, -0xffdc,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0xff09,0xff09,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0xff07,0, -0,0,0,0,0,0,0,0,0,0,0xff09,0xff09,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0xff07,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0xffe6,0xffe6,0xffe6,0,0xff01,0xffdc,0xffdc,0xffdc,0xffdc,0xffdc,0xffe6,0xffe6, -0xffdc,0xffdc,0xffdc,0xffdc,0xffe6,0,0xff01,0xff01,0xff01,0xff01,0xff01,0xff01,0xff01,0,0,0, -0,0xffdc,0,0,0,0,0,0,0xffe6,0,0,0,0xffe6,0xffe6,0,0, -0,0,0,0,0xffe6,0xffe6,0xffdc,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffdc,0xffe6, -0xffe6,0xffea,0xffd6,0xffdc,0xffca,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6, -0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0,0, -0,0,0,0xffe6,0xffe9,0xffdc,0xffe6,0xffdc,0xd32,0xd35,0xd38,0xd3b,0xd3e,0xd41,0xd44,0xd47, -0xd4b,0xd50,0xd54,0xd57,0xd5a,0xd5d,0xd60,0xd63,0xd66,0xd69,0xd6c,0xd6f,0xd73,0xd78,0xd7d,0xd82, -0xd86,0xd89,0xd8c,0xd8f,0xd93,0xd98,0xd9c,0xd9f,0xda2,0xda5,0xda8,0xdab,0xdae,0xdb1,0xdb4,0xdb7, -0xdba,0xdbd,0xdc0,0xdc3,0xdc6,0xdc9,0xdcd,0xdd2,0xdd6,0xdd9,0xddc,0xddf,0xde2,0xde5,0x6ec,0x6f1, -0xde9,0xdee,0xdf2,0xdf5,0xdf8,0xdfb,0xdfe,0xe01,0xe04,0xe07,0xe0a,0xe0d,0xe10,0xe13,0xe16,0xe19, -0xe1c,0xe1f,0xe22,0xe25,0xe29,0xe2e,0xe33,0xe38,0xe3d,0xe42,0xe47,0xe4c,0xe50,0xe53,0xe56,0xe59, -0xe5c,0xe5f,0x6f6,0x6fb,0xe63,0xe68,0xe6c,0xe6f,0xe72,0xe75,0x700,0x705,0xe79,0xe7e,0xe83,0xe88, -0xe8d,0xe92,0xe96,0xe99,0xe9c,0xe9f,0xea2,0xea5,0xea8,0xeab,0xeae,0xeb1,0xeb4,0xeb7,0xeba,0xebd, -0xec1,0xec6,0xecb,0xed0,0xed4,0xed7,0xeda,0xedd,0xee0,0xee3,0xee6,0xee9,0xeec,0xeef,0xef2,0xef5, -0xef8,0xefb,0xefe,0xf01,0xf04,0xf07,0xf0a,0xf0d,0xf10,0xf13,0xf16,0xf19,0xf1c,0xf1f,0xf22,0xf25, -0xf28,0xf2b,0,0xf2e,0,0,0,0,0x70a,0x711,0xf31,0xf34,0xf38,0xf3d,0xf42,0xf47, -0xf4c,0xf51,0xf56,0xf5b,0xf60,0xf65,0xf6a,0xf6f,0xf74,0xf79,0xf7e,0xf83,0xf88,0xf8d,0xf92,0xf97, -0x718,0x71d,0xf9b,0xf9e,0xfa1,0xfa4,0xfa8,0xfad,0xfb2,0xfb7,0xfbc,0xfc1,0xfc6,0xfcb,0xfd0,0xfd5, -0xfd9,0xfdc,0xfdf,0xfe2,0x722,0x727,0xfe5,0xfe8,0xfec,0xff1,0xff6,0xffb,0x1000,0x1005,0x100a,0x100f, -0x1014,0x1019,0x101e,0x1023,0x1028,0x102d,0x1032,0x1037,0x103c,0x1041,0x1046,0x104b,0x104f,0x1052,0x1055,0x1058, -0x105c,0x1061,0x1066,0x106b,0x1070,0x1075,0x107a,0x107f,0x1084,0x1089,0x108d,0x1090,0x1093,0x1096,0x1099,0x109c, -0x109f,0x10a2,0,0,0,0,0,0,0x72c,0x737,0x743,0x74a,0x751,0x758,0x75f,0x766, -0x76c,0x777,0x783,0x78a,0x791,0x798,0x79f,0x7a6,0x7ac,0x7b3,0x10a6,0x10ab,0x10b0,0x10b5,0,0, -0x7ba,0x7c1,0x10ba,0x10bf,0x10c4,0x10c9,0,0,0x7c8,0x7d3,0x7df,0x7e6,0x7ed,0x7f4,0x7fb,0x802, -0x808,0x813,0x81f,0x826,0x82d,0x834,0x83b,0x842,0x848,0x851,0x10ce,0x10d3,0x10d8,0x10dd,0x10e2,0x10e7, -0x85a,0x863,0x10ec,0x10f1,0x10f6,0x10fb,0x1100,0x1105,0x86c,0x873,0x110a,0x110f,0x1114,0x1119,0,0, -0x87a,0x881,0x111e,0x1123,0x1128,0x112d,0,0,0x888,0x891,0x1132,0x1137,0x113c,0x1141,0x1146,0x114b, -0,0x89a,0,0x1150,0,0x1155,0,0x115a,0x8a3,0x8ae,0x8ba,0x8c1,0x8c8,0x8cf,0x8d6,0x8dd, -0x8e3,0x8ee,0x8fa,0x901,0x908,0x90f,0x916,0x91d,0x923,0x156a,0x115e,0x156e,0x928,0x1572,0x1161,0x1576, -0x1164,0x157a,0x1167,0x157e,0x92d,0x1582,0,0,0x116b,0x1170,0x1177,0x117f,0x1187,0x118f,0x1197,0x119f, -0x11a5,0x11aa,0x11b1,0x11b9,0x11c1,0x11c9,0x11d1,0x11d9,0x11df,0x11e4,0x11eb,0x11f3,0x11fb,0x1203,0x120b,0x1213, -0x1219,0x121e,0x1225,0x122d,0x1235,0x123d,0x1245,0x124d,0x1253,0x1258,0x125f,0x1267,0x126f,0x1277,0x127f,0x1287, -0x128d,0x1292,0x1299,0x12a1,0x12a9,0x12b1,0x12b9,0x12c1,0x12c6,0x12c9,0x12cd,0x12d1,0x12d5,0,0x932,0x12da, -0x12de,0x12e1,0x12e4,0x1586,0x12e7,0,0x1589,0x478,0,0x12ea,0x12ee,0x12f2,0x12f6,0,0x937,0x12fb, -0x12ff,0x158c,0x1302,0x1590,0x1305,0x1308,0x130b,0x130e,0x1311,0x1314,0x1318,0x1595,0,0,0x131c,0x1320, -0x1324,0x1327,0x132a,0x159a,0,0x132d,0x1330,0x1333,0x1336,0x1339,0x133d,0x159f,0x1341,0x1344,0x1347,0x134b, -0x134f,0x1352,0x1355,0x15a4,0x1358,0x135b,0x15a8,0x15ab,0,0,0x135f,0x1363,0x1367,0,0x93c,0x136c, -0x1370,0x15ae,0x1373,0x15b2,0x1376,0x15b5,0x47e,0,0xfdc1,0xfdc1,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0xffe6,0xffe6,0xff01,0xff01,0xffe6,0xffe6,0xffe6,0xffe6, -0xff01,0xff01,0xff01,0xffe6,0xffe6,0,0,0,0,0xffe6,0,0,0,0xff01,0xff01,0xffe6, -0xffdc,0xffe6,0xff01,0xff01,0xffdc,0xffdc,0xffdc,0xffdc,0xffe6,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0x15b7,0,0,0,0x15b9,0x15bc, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0x484,0,0x486,0,0x488,0,0,0,0,0,0x1379,0x137c, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0x137f,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0x1382,0x1385,0x1388,0x48a,0,0x48c,0,0x48e,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0x490,0x138b,0,0,0,0x492,0x138e,0,0x494, -0x1391,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0x496,0x1394,0x498,0x1397,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0x49a,0,0,0,0,0x139a,0,0x49c,0x139d,0x49e,0,0x13a0,0x4a0,0x13a3,0,0, -0,0x4a2,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0x13a6,0x4a4,0x13a9,0,0x4a6,0x4a8,0,0,0,0,0,0, -0,0x13ac,0x13af,0x13b2,0x13b5,0x13b8,0x4aa,0x4ac,0x13bb,0x13be,0x4ae,0x4b0,0x13c1,0x13c4,0x4b2,0x4b4, -0x4b6,0x4b8,0,0,0x13c7,0x13ca,0x4ba,0x4bc,0x13cd,0x13d0,0x4be,0x4c0,0x13d3,0x13d6,0,0, -0,0,0,0,0,0x4c2,0x4c4,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0x4c6,0,0,0,0,0,0x4c8,0x4ca,0,0x4cc, -0x13d9,0x13dc,0x13df,0x13e2,0,0,0x4ce,0x4d0,0x4d2,0x4d4,0,0,0,0,0,0, -0,0,0,0,0x13e5,0x13e8,0x13eb,0x13ee,0,0,0,0,0,0,0x13f1,0x13f4, -0x13f7,0x13fa,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0x15bf,0x15c1,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0x15c3,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0xffe6,0xffe6,0xffe6,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0xff09,0xffe6,0xffe6,0xffe6,0xffe6, -0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6, -0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0,0,0,0, -0,0,0,0,0,0,0xffda,0xffe4,0xffe8,0xffde,0xffe0,0xffe0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0x4d6,0, -0,0,0,0x4d8,0x13fd,0x4da,0x1400,0x4dc,0x1403,0x4de,0x1406,0x4e0,0x1409,0x4e2,0x140c,0x4e4, -0x140f,0x4e6,0x1412,0x4e8,0x1415,0x4ea,0x1418,0x4ec,0x141b,0x4ee,0x141e,0,0x4f0,0x1421,0x4f2,0x1424, -0x4f4,0x1427,0,0,0,0,0,0x4f6,0x142a,0x142d,0x4fa,0x1430,0x1433,0x4fe,0x1436,0x1439, -0x502,0x143c,0x143f,0x506,0x1442,0x1445,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0x1448,0,0,0, -0,0xfe08,0xfe08,0,0,0x50a,0x144b,0,0,0,0,0,0,0,0x50c,0, -0,0,0,0x50e,0x144e,0x510,0x1451,0x512,0x1454,0x514,0x1457,0x516,0x145a,0x518,0x145d,0x51a, -0x1460,0x51c,0x1463,0x51e,0x1466,0x520,0x1469,0x522,0x146c,0x524,0x146f,0,0x526,0x1472,0x528,0x1475, -0x52a,0x1478,0,0,0,0,0,0x52c,0x147b,0x147e,0x530,0x1481,0x1484,0x534,0x1487,0x148a, -0x538,0x148d,0x1490,0x53c,0x1493,0x1496,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0x540,0x542,0x544,0x546,0,0x1499,0,0,0x149c, -0x149f,0x14a2,0x14a5,0,0,0x548,0x14a8,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0xffe6,0,0,0,0,0xffe6,0xffe6,0xffe6,0xffe6, -0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0xffe6,0xffe6,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0xffe6,0xffe6,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0xff09,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0xff09,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6, -0xffe6,0xffe6,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0xffdc,0xffdc,0xffdc,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0xff09,0,0,0,0, -0,0,0,0,0,0,0,0,0xff09,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0xffe6,0,0xffe6,0xffe6,0xffdc,0,0,0xffe6, -0xffe6,0,0,0,0,0,0xffe6,0xffe6,0,0xffe6,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0xff09,0,0,0,0,0, -0,0,0,0,0x15c6,0x15c8,0x15ca,0x15cc,0x15ce,0x15d0,0x15d2,0x15d4,0x15d4,0x15d6,0x15d8,0x15da, -0x15dc,0x15de,0x15e0,0x15e2,0x15e4,0x15e6,0x15e8,0x15ea,0x15ec,0x15ee,0x15f0,0x15f2,0x15f4,0x15f6,0x15f8,0x15fa, -0x15fc,0x15fe,0x1600,0x1602,0x1604,0x1606,0x1608,0x160a,0x160c,0x160e,0x1610,0x1612,0x1614,0x1616,0x1618,0x161a, -0x161c,0x161e,0x1620,0x1622,0x1624,0x1626,0x1628,0x162a,0x162c,0x162e,0x1630,0x1632,0x1634,0x1636,0x1638,0x163a, -0x163c,0x163e,0x1640,0x1642,0x1644,0x1646,0x1648,0x164a,0x164c,0x164e,0x1650,0x1652,0x1654,0x1656,0x1658,0x165a, -0x165c,0x165e,0x1660,0x1662,0x1664,0x1666,0x1668,0x166a,0x166c,0x166e,0x1670,0x1672,0x1674,0x1676,0x1678,0x167a, -0x15ec,0x167c,0x167e,0x1680,0x1682,0x1684,0x1686,0x1688,0x168a,0x168c,0x168e,0x1690,0x1692,0x1694,0x1696,0x1698, -0x169a,0x169c,0x169e,0x16a0,0x16a2,0x16a4,0x16a6,0x16a8,0x16aa,0x16ac,0x16ae,0x16b0,0x16b2,0x16b4,0x16b6,0x16b8, -0x16ba,0x16bc,0x16be,0x16c0,0x16c2,0x16c4,0x16c6,0x16c8,0x16ca,0x16cc,0x16ce,0x16d0,0x16d2,0x16d4,0x16d6,0x16d8, -0x16da,0x16dc,0x16de,0x16e0,0x16e2,0x16e4,0x16e6,0x16e8,0x16ea,0x16ec,0x16ee,0x16f0,0x16f2,0x16f4,0x16f6,0x16f8, -0x16fa,0x16fc,0x16fe,0x1700,0x1702,0x16a0,0x1704,0x1706,0x1708,0x170a,0x170c,0x170e,0x1710,0x1712,0x1680,0x1714, -0x1716,0x1718,0x171a,0x171c,0x171e,0x1720,0x1722,0x1724,0x1726,0x1728,0x172a,0x172c,0x172e,0x1730,0x1732,0x1734, -0x1736,0x1738,0x173a,0x15ec,0x173c,0x173e,0x1740,0x1742,0x1744,0x1746,0x1748,0x174a,0x174c,0x174e,0x1750,0x1752, -0x1754,0x1756,0x1758,0x175a,0x175c,0x175e,0x1760,0x1762,0x1764,0x1766,0x1768,0x176a,0x176c,0x176e,0x1770,0x1684, -0x1772,0x1774,0x1776,0x1778,0x177a,0x177c,0x177e,0x1780,0x1782,0x1784,0x1786,0x1788,0x178a,0x178c,0x178e,0x1790, -0x1792,0x1794,0x1796,0x1798,0x179a,0x179c,0x179e,0x17a0,0x17a2,0x17a4,0x17a6,0x17a8,0x17aa,0x17ac,0x17ae,0x17b0, -0x17b2,0x17b4,0x17b6,0x17b8,0x17ba,0x17bc,0x17be,0x17c0,0x17c2,0x17c4,0x17c6,0x17c8,0x17ca,0x17cc,0x17ce,0x17d0, -0x17d2,0x17d4,0,0,0x17d6,0,0x17d8,0,0,0x17da,0x17dc,0x17de,0x17e0,0x17e2,0x17e4,0x17e6, -0x17e8,0x17ea,0x17ec,0,0x17ee,0,0x17f0,0,0,0x17f2,0x17f4,0,0,0,0x17f6,0x17f8, -0x17fa,0x17fc,0x17fe,0x1800,0x1802,0x1804,0x1806,0x1808,0x180a,0x180c,0x180e,0x1810,0x1812,0x1814,0x1816,0x1818, -0x181a,0x181c,0x181e,0x1820,0x1822,0x1824,0x1826,0x1828,0x182a,0x182c,0x182e,0x1830,0x1832,0x1834,0x1836,0x1838, -0x183a,0x183c,0x183e,0x1840,0x1842,0x1844,0x1846,0x1848,0x184a,0x184c,0x184e,0x16ee,0x1850,0x1852,0x1854,0x1856, -0x1858,0x185a,0x185a,0x185c,0x185e,0x1860,0x1862,0x1864,0x1866,0x1868,0x186a,0x17f2,0x186c,0x186e,0x1870,0x1872, -0x1874,0x1877,0,0,0x1879,0x187b,0x187d,0x187f,0x1881,0x1883,0x1885,0x1887,0x180e,0x1889,0x188b,0x188d, -0x17d6,0x188f,0x1891,0x1893,0x1895,0x1897,0x1899,0x189b,0x189d,0x189f,0x18a1,0x18a3,0x18a5,0x1820,0x18a7,0x1822, -0x18a9,0x18ab,0x18ad,0x18af,0x18b1,0x17d8,0x1616,0x18b3,0x18b5,0x18b7,0x16a2,0x1750,0x18b9,0x18bb,0x1830,0x18bd, -0x1832,0x18bf,0x18c1,0x18c3,0x17dc,0x18c5,0x18c7,0x18c9,0x18cb,0x18cd,0x17de,0x18cf,0x18d1,0x18d3,0x18d5,0x18d7, -0x18d9,0x184e,0x18db,0x18dd,0x16ee,0x18df,0x1856,0x18e1,0x18e3,0x18e5,0x18e7,0x18e9,0x1860,0x18eb,0x17f0,0x18ed, -0x1862,0x167c,0x18ef,0x1864,0x18f1,0x1868,0x18f3,0x18f5,0x18f7,0x18f9,0x18fb,0x186c,0x17e8,0x18fd,0x186e,0x18ff, -0x1870,0x1901,0x15d4,0x1903,0x1906,0x1909,0x190c,0x190e,0x1910,0x1912,0x1915,0x1918,0x191b,0x191d,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0x191f,0xff1a,0x1922, -0,0,0,0,0,0,0,0,0,0,0x1925,0x1928,0x192c,0x1931,0x1935,0x1938, -0x193b,0x193e,0x1941,0x1944,0x1947,0x194a,0x194d,0,0x1950,0x1953,0x1956,0x1959,0x195c,0,0x195f,0, -0x1962,0x1965,0,0x1968,0x196b,0,0x196e,0x1971,0x1974,0x1977,0x197a,0x197d,0x1980,0x1983,0x1986,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffdc,0xffdc,0xffdc,0xffdc,0xffdc,0xffdc,0xffdc,0xffe6,0xffe6, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0xffdc,0,0, -0xffdc,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0xffdc,0,0xffe6,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0xffe6,0xff01,0xffdc,0,0,0,0,0xff09,0,0,0,0,0,0xffe6,0xffdc,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0x54a,0x14ab,0x54d,0x14b0,0,0,0, -0,0,0,0,0,0x550,0,0,0,0,0,0x14b5,0,0,0,0, -0,0,0,0,0,0,0,0,0,0xff09,0xfe07,0,0,0,0,0, -0xffe6,0xffe6,0xffe6,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0xfe00,0,0,0,0,0,0,0x14ba,0x14bf,0,0x553,0x556,0xff09, -0xff09,0,0,0,0,0,0,0,0,0,0,0,0xff09,0,0,0, -0,0,0,0,0,0,0xff07,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0xff09,0xff07,0, -0,0,0,0,0,0,0,0,0,0xff07,0xff09,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0x559,0,0,0,0x14c4,0x14c9,0xff09,0,0,0,0,0,0, -0,0,0,0xfe00,0,0,0,0,0,0,0,0,0,0,0xffe6,0xffe6, -0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0,0,0,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0,0,0, -0,0,0,0,0,0,0,0,0,0,0xff09,0,0,0,0xff07,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0xfe00,0,0,0,0,0,0,0, -0,0x55f,0xfe00,0x14ce,0x14d3,0xfe00,0x14d8,0,0,0,0xff09,0xff07,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0xfe00,0,0,0,0, -0,0,0,0,0x568,0x56b,0x14dd,0x14e2,0,0,0,0xff09,0xff07,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0xff09,0xff07, -0,0,0,0,0,0,0,0,0,0,0,0xff09,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0xff01,0xff01,0xff01,0xff01,0xff01,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0xff01,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0x1989,0x198e, -0x1998,0x19a4,0x19b0,0x19bc,0x19c8,0xffd8,0xffd8,0xff01,0xff01,0xff01,0,0,0,0xffe2,0xffd8,0xffd8, -0xffd8,0xffd8,0xffd8,0,0,0,0,0,0,0,0,0xffdc,0xffdc,0xffdc,0xffdc,0xffdc, -0xffdc,0xffdc,0xffdc,0,0,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffdc,0xffdc,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0xffe6,0xffe6,0xffe6,0xffe6,0,0,0,0,0,0,0,0,0,0, -0,0,0,0x19cf,0x19d4,0x19de,0x19ea,0x19f6,0x1a02,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0xffe6,0xffe6,0xffe6,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0, -0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6, -0xffe6,0,0,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0,0xffe6,0xffe6,0,0xffe6,0xffe6, -0xffe6,0xffe6,0xffe6,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0xffdc,0xffdc,0xffdc,0xffdc,0xffdc,0xffdc,0xffdc,0, -0,0,0,0,0,0,0,0,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xff07,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0x1a09,0x1a0b,0x1a0d,0x1a0f,0x1a12,0x1802,0x1a14,0x1a16,0x1a18,0x1a1a,0x1804,0x1a1c, -0x1a1e,0x1a20,0x1806,0x1a23,0x1a25,0x1a27,0x1a29,0x1a2c,0x1a2e,0x1a30,0x1a32,0x1a35,0x1a37,0x1a39,0x1a3b,0x187b, -0x1a3d,0x1a40,0x1a42,0x1a44,0x1a46,0x1a48,0x1a4a,0x1a4c,0x1a4e,0x1885,0x1808,0x180a,0x1887,0x1a50,0x1a52,0x1688, -0x1a54,0x180c,0x1a56,0x1a58,0x1a5a,0x1a5c,0x1a5c,0x1a5c,0x1a5e,0x1a61,0x1a63,0x1a65,0x1a67,0x1a6a,0x1a6c,0x1a6e, -0x1a70,0x1a72,0x1a74,0x1a76,0x1a78,0x1a7a,0x1a7c,0x1a7e,0x1a80,0x1a82,0x1a82,0x188b,0x1a84,0x1a86,0x1a88,0x1a8a, -0x1810,0x1a8c,0x1a8e,0x1a90,0x17ba,0x1a92,0x1a94,0x1a96,0x1a98,0x1a9a,0x1a9c,0x1a9e,0x1aa0,0x1aa2,0x1aa5,0x1aa7, -0x1aa9,0x1aab,0x1aad,0x1aaf,0x1ab1,0x1ab4,0x1ab7,0x1ab9,0x1abb,0x1abd,0x1abf,0x1ac1,0x1ac3,0x1ac5,0x1ac7,0x1ac7, -0x1ac9,0x1acc,0x1ace,0x1680,0x1ad0,0x1ad2,0x1ad5,0x1ad7,0x1ad9,0x1adb,0x1add,0x1adf,0x181a,0x1ae1,0x1ae3,0x1ae5, -0x1ae8,0x1aea,0x1aed,0x1aef,0x1af1,0x1af3,0x1af5,0x1af7,0x1af9,0x1afb,0x1afd,0x1aff,0x1b01,0x1b03,0x1b06,0x1b08, -0x1b0a,0x1b0c,0x1614,0x1b0e,0x1b11,0x1b13,0x1b13,0x1b16,0x1b18,0x1b18,0x1b1a,0x1b1c,0x1b1f,0x1b22,0x1b24,0x1b26, -0x1b28,0x1b2a,0x1b2c,0x1b2e,0x1b30,0x1b32,0x1b34,0x181c,0x1b36,0x1b39,0x1b3b,0x1b3d,0x18a3,0x1b3d,0x1b3f,0x1820, -0x1b41,0x1b43,0x1b45,0x1b47,0x1822,0x15de,0x1b49,0x1b4b,0x1b4d,0x1b4f,0x1b51,0x1b53,0x1b55,0x1b58,0x1b5a,0x1b5c, -0x1b5e,0x1b60,0x1b62,0x1b65,0x1b67,0x1b69,0x1b6b,0x1b6d,0x1b6f,0x1b71,0x1b73,0x1b75,0x1824,0x1b77,0x1b79,0x1b7c, -0x1b7e,0x1b80,0x1b82,0x1828,0x1b84,0x1b86,0x1b88,0x1b8a,0x1b8c,0x1b8e,0x1b90,0x1b92,0x1616,0x18b3,0x1b94,0x1b96, -0x1b98,0x1b9a,0x1b9d,0x1b9f,0x1ba1,0x1ba3,0x182a,0x1ba5,0x1ba8,0x1baa,0x1bac,0x190c,0x1bae,0x1bb0,0x1bb2,0x1bb4, -0x1bb6,0x1bb9,0x1bbb,0x1bbd,0x1bbf,0x1bc2,0x1bc4,0x1bc6,0x1bc8,0x16a2,0x1bca,0x1bcc,0x1bcf,0x1bd2,0x1bd5,0x1bd7, -0x1bda,0x1bdc,0x1bde,0x1be0,0x1be2,0x182c,0x1750,0x1be4,0x1be6,0x1be8,0x1bea,0x1bed,0x1bef,0x1bf1,0x1bf3,0x18bb, -0x1bf5,0x1bf7,0x1bfa,0x1bfc,0x1bfe,0x1c01,0x1c04,0x1c06,0x18bd,0x1c08,0x1c0a,0x1c0c,0x1c0e,0x1c10,0x1c12,0x1c14, -0x1c17,0x1c19,0x1c1c,0x1c1e,0x1c21,0x18c1,0x1c23,0x1c25,0x1c28,0x1c2a,0x1c2c,0x1c2f,0x1c32,0x1c34,0x1c36,0x1c38, -0x1c3a,0x1c3a,0x1c3c,0x1c3e,0x18c5,0x1c40,0x1c42,0x1c44,0x1c46,0x1c48,0x1c4b,0x1c4d,0x1686,0x1c50,0x1c53,0x1c55, -0x1c58,0x1c5b,0x1c5e,0x1c60,0x18d1,0x1c62,0x1c65,0x1c68,0x1c6b,0x1c6e,0x1c70,0x1c70,0x18d3,0x1910,0x1c72,0x1c74, -0x1c76,0x1c78,0x1c7b,0x163a,0x18d7,0x1c7d,0x1c7f,0x1842,0x1c82,0x1c85,0x17e6,0x1c88,0x1c8a,0x184a,0x1c8c,0x1c8e, -0x1c90,0x1c93,0x1c93,0x1c96,0x1c98,0x1c9a,0x1c9d,0x1c9f,0x1ca1,0x1ca3,0x1ca6,0x1ca8,0x1caa,0x1cac,0x1cae,0x1cb0, -0x1cb3,0x1cb5,0x1cb7,0x1cb9,0x1cbb,0x1cbd,0x1cbf,0x1cc2,0x1cc5,0x1cc7,0x1cca,0x1ccc,0x1ccf,0x1cd1,0x1856,0x1cd3, -0x1cd6,0x1cd9,0x1cdb,0x1cde,0x1ce0,0x1ce3,0x1ce5,0x1ce7,0x1ce9,0x1ceb,0x1ced,0x1cef,0x1cf2,0x1cf5,0x1cf8,0x1b16, -0x1cfb,0x1cfd,0x1cff,0x1d01,0x1d03,0x1d05,0x1d07,0x1d09,0x1d0b,0x1d0d,0x1d0f,0x1d11,0x16aa,0x1d14,0x1d16,0x1d18, -0x1d1a,0x1d1c,0x1d1e,0x185c,0x1d20,0x1d22,0x1d24,0x1d26,0x1d28,0x1d2b,0x1d2e,0x1d31,0x1d33,0x1d35,0x1d37,0x1d39, -0x1d3c,0x1d3e,0x1d41,0x1d43,0x1d45,0x1d48,0x1d4b,0x1d4d,0x1630,0x1d4f,0x1d51,0x1d53,0x1d55,0x1d57,0x1d59,0x18e5, -0x1d5b,0x1d5d,0x1d5f,0x1d61,0x1d63,0x1d65,0x1d67,0x1d69,0x1d6b,0x1d6d,0x1d70,0x1d72,0x1d74,0x1d76,0x1d78,0x1d7a, -0x1d7d,0x1d80,0x1d82,0x1d84,0x18ef,0x18f1,0x1d86,0x1d88,0x1d8b,0x1d8d,0x1d8f,0x1d91,0x1d93,0x1d96,0x1d99,0x1d9b, -0x1d9d,0x1d9f,0x1da2,0x18f3,0x1da4,0x1da7,0x1daa,0x1dac,0x1dae,0x1db0,0x1db3,0x1db5,0x1db7,0x1db9,0x1dbb,0x1dbd, -0x1dbf,0x1dc1,0x1dc4,0x1dc6,0x1dc8,0x1dca,0x1dcd,0x1dcf,0x1dd1,0x1dd3,0x1dd5,0x1dd8,0x1ddb,0x1ddd,0x1ddf,0x1de1, -0x1de4,0x1de6,0x18ff,0x18ff,0x1de9,0x1deb,0x1dee,0x1df0,0x1df2,0x1df4,0x1df6,0x1df8,0x1dfa,0x1dfc,0x1901,0x1dff, -0x1e01,0x1e03,0x1e05,0x1e07,0x1e09,0x1e0c,0x1e0e,0x1e11,0x1e14,0x1e17,0x1e19,0x1e1b,0x1e1d,0x1e1f,0x1e21,0x1e23, -0x1e25,0x1e27,0,0,1,1,1,1,1,1,1,1,1,1,1,1, -1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00, -0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0,0,0,0,0,0, -0,0,0,0,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00, -0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0x56e,0x56e,0x56e,0x56e, -0x56e,0x56e,0x56e,0x56e,0x56e,0x56e,0x56e,0x56e,0x56e,0x56e,0x56e,0x56e,0x56e,0x56e,0x56e,0x56e, -0x56e,0x56e,0x56e,0x56e,0x56e,0x56e,0x56e,0x56e,0x56e,0x56e,0x56e,0x56e,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0x1e29,0,0x1e29,0,0x1e29,0x1e29,0,0x1e29, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0x1e29,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0x1e29,0,0,0,0,0x1e29,0,0,0,0x1e29,0,0x1e29,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0x1e27,0, -0,0,0,0 +0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0xa5f, +0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x7c7, +0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x7cf,0x2c7,0x2c7,0x2c7,0x7d2,0x2c7,0x2c7,0x2c7,0x2c7, +0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7, +0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7, +0x7d9,0x7dd,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x7e5,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7, +0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7, +0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7, +0x6fc,0x69e,0x7e7,0x7ef,0x2c7,0x2c7,0x7f7,0x7fe,0x2c7,0x58b,0x2c7,0x2c7,0x806,0x2c7,0x2c7,0x809, +0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x80f,0x2c7,0x463,0x816,0x81d,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7, +0x825,0x2c7,0x2c7,0x829,0x831,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x836,0x83e,0x2c7,0x2c7,0x69e, +0x2c7,0x2c7,0x2c7,0x841,0x2c7,0x2c7,0x2c7,0x847,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7, +0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x535,0x848,0x2c7,0x84a,0x2c7,0x2c7,0x2c7, +0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x69e,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7, +0x2c7,0x2c7,0x852,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7, +0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x856,0x2c7,0x85c,0x2c7,0x2c7,0x2c7, +0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7, +0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7, +0x2c7,0x2c7,0x2c7,0x862,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7, +0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x86a, +0x872,0x87a,0x880,0x888,0x2c7,0x2c7,0x2c7,0x890,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7, +0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7, +0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7, +0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x898,0x8a0,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7, +0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7, +0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7, +0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7, +0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x8a4,0x2c7,0x2c7,0x2c7,0x8ab,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7, +0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7, +0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7, +0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x8b3, +0x8bb,0x8c3,0x8cb,0x8d3,0x8db,0x8e3,0x8eb,0x8f3,0x8fb,0x903,0x90b,0x913,0x91b,0x923,0x92b,0x933, +0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7, +0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7, +0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2a7, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,4,8,0xc,1, +1,0x10,0x50,0x5c,0x70,0x88,0xcc,0xd0,0xec,0x108,0x144,0x148,0x15c,0x174,0x180,0x1a4, +0x1e4,1,0x1ec,0x20c,0x228,0x244,0x290,0x298,0x2b0,0x2b8,0x2dc,1,1,1,1,1, +1,0x2f4,0x334,0x340,0x354,0x36c,0x3b0,0x3b4,0x3d0,0x3f0,0x428,0x430,0x444,0x45c,0x468,0x48c, +0x4cc,1,0x4d4,0x4f4,0x510,0x530,0x57c,0x584,0x5a0,0x5a8,0x5d0,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +0x5e8,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,0x1284,0x128a,0xade,0x1290,0xaf4,0xafe,0x5f4,0xb08, +0x1296,0x129c,0xb12,0x12a2,0x12a8,0x12ae,0x12b4,0xb28,1,0x12ba,0x12c0,0x12c6,0xb32,0xb48,0xb5a,1, +0x5fc,0x12cc,0x12d2,0x12d8,0xb64,0x12de,1,1,0x12e4,0x12ea,0xb7a,0x12f0,0xb90,0xb9a,0x600,0xba4, +0x12f6,0x12fc,0xbae,0x1302,0x1308,0x130e,0x1314,0xbc4,1,0x131a,0x1320,0x1326,0xbce,0xbe4,0xbf6,1, +0x608,0x132c,0x1332,0x1338,0xc00,0x133e,1,0x1344,0x134a,0x1350,0xc16,0xc2c,0x1357,0x135d,0x1362,0x1368, +0x136e,0x1374,0x137a,0x1380,0x1386,0x138c,0x1392,0x1398,1,1,0xc42,0xc50,0x139e,0x13a4,0x13aa,0x13b0, +0x13b7,0x13bd,0x13c2,0x13c8,0x13ce,0x13d4,0x13da,0x13e0,0x13e6,0x13ec,0x13f3,0x13f9,0x13fe,0x1404,1,1, +0x140a,0x1410,0x1416,0x141c,0x1422,0x1428,0x142f,0x1435,0x143a,1,1,1,0x1441,0x1447,0x144d,0x1453, +1,0x1458,0x145e,0x1465,0x146b,0x1470,0x1476,1,1,1,1,0x147c,0x1482,0x1489,0x148f,0x1494, +0x149a,1,1,1,0xc5e,0xc6c,0x14a0,0x14a6,0x14ac,0x14b2,1,1,0x14b8,0x14be,0x14c5,0x14cb, +0x14d0,0x14d6,0xc7a,0xc84,0x14dc,0x14e2,0x14e9,0x14ef,0xc8e,0xc98,0x14f5,0x14fb,0x1500,0x1506,1,1, +0xca2,0xcac,0xcb6,0xcc0,0x150c,0x1512,0x1518,0x151e,0x1524,0x152a,0x1531,0x1537,0x153c,0x1542,0x1548,0x154e, +0x1554,0x155a,0x1560,0x1566,0x156c,0x1572,0x1578,0x60c,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,0xcca,0xce4,1,1,1,1,1,1, +1,1,1,1,1,1,1,0xcfe,0xd18,1,1,1,1,1,1,0x610, +1,1,1,1,1,1,1,1,1,1,1,1,1,0x157e,0x1584,0x158a, +0x1590,0x1596,0x159c,0x15a2,0x15a8,0x15b0,0x15ba,0x15c4,0x15ce,0x15d8,0x15e2,0x15ec,0x15f6,1,0x1600,0x160a, +0x1614,0x161e,0x1627,0x162d,1,1,0x1632,0x1638,0x163e,0x1644,0xd32,0xd3c,0x164d,0x1657,0x165f,0x1665, +0x166b,1,1,1,0x1670,0x1676,1,1,0x167c,0x1682,0x168a,0x1694,0x169d,0x16a3,0x16a9,0x16af, +0x16b4,0x16ba,0x16c0,0x16c6,0x16cc,0x16d2,0x16d8,0x16de,0x16e4,0x16ea,0x16f0,0x16f6,0x16fc,0x1702,0x1708,0x170e, +0x1714,0x171a,0x1720,0x1726,0x172c,0x1732,0x1738,0x173e,0x1744,0x174a,0x1750,0x1756,1,1,0x175c,0x1762, +1,1,1,1,1,1,0xd46,0xd50,0xd5a,0xd64,0x176a,0x1774,0x177e,0x1788,0xd6e,0xd78, +0x1792,0x179c,0x17a4,0x17aa,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,0x614,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,0xfdcc,0xfdcc,0xfdcc,0xfdcc,0xfdcc,0xffcc,0xfdcc,0xfdcc,0xfdcc,0xfdcc,0xfdcc,0xfdcc, +0xfdcc,0xffcc,0xffcc,0xfdcc,0xffcc,0xfdcc,0xffcc,0xfdcc,0xfdcc,0xffd0,0xffb8,0xffb8,0xffb8,0xffb8,0xffd0,0xfdb0, +0xffb8,0xffb8,0xffb8,0xffb8,0xffb8,0xff94,0xff94,0xfdb8,0xfdb8,0xfdb8,0xfdb8,0xfd94,0xfd94,0xffb8,0xffb8,0xffb8, +0xffb8,0xfdb8,0xfdb8,0xffb8,0xfdb8,0xfdb8,0xffb8,0xffb8,0xfe02,0xfe02,0xfe02,0xfe02,0xfc02,0xffb8,0xffb8,0xffb8, +0xffb8,0xffcc,0xffcc,0xffcc,0x3c26,0x3c2c,0xfdcc,0x3c32,0x3c38,0xfde0,0xffcc,0xffb8,0xffb8,0xffb8,0xffcc,0xffcc, +0xffcc,0xffb8,0xffb8,1,0xffcc,0xffcc,0xffcc,0xffb8,0xffb8,0xffb8,0xffb8,0xffcc,0xffd0,0xffb8,0xffb8,0xffcc, +0xffd2,0xffd4,0xffd4,0xffd2,0xffd4,0xffd4,0xffd2,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc, +0xffcc,0xffcc,0xffcc,0xffcc,1,1,1,1,0x29d1,1,1,1,1,1,1,1, +1,1,0x29d5,1,1,1,1,1,1,0x17b1,0x17b7,0x29d9,0x17bd,0x17c3,0x17c9,1, +0x17cf,1,0x17d5,0x17db,0x17e3,0x618,1,1,1,0x634,1,0x644,1,0x658,1,1, +1,1,1,0x674,1,0x684,1,1,1,0x688,1,1,1,0x6a0,0x17eb,0x17f1, +0xd82,0x17f7,0xd8c,0x17fd,0x1805,0x6b4,1,1,1,0x6d4,1,0x6e4,1,0x6fc,1,1, +1,1,1,0x71c,1,0x72c,1,1,1,0x734,1,1,1,0x754,0xd96,0xda8, +0x180d,0x1813,0xdba,1,1,1,0x76c,0x1819,0x181f,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,0x1825,0x182b,1,0x1831,1,1,0x774,0x1837,1,1,1,1, +0x183d,0x1843,0x1849,1,0x778,1,1,0x780,1,0x784,0x790,0x798,0x79c,0x184f,0x7ac,1, +1,1,0x7b0,1,1,1,1,0x7b4,1,1,1,0x7c4,1,1,1,0x7c8, +1,0x7cc,1,1,0x7d0,1,1,0x7d8,1,0x7dc,0x7e8,0x7f0,0x7f4,0x1855,0x804,1, +1,1,0x808,1,1,1,1,0x80c,1,1,1,0x81c,1,1,1,0x820, +1,0x824,1,1,0x185b,0x1861,1,0x1867,1,1,0x828,0x186d,1,1,1,1, +0x1873,0x1879,0x187f,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,0x82c,0x830,0x1885,0x188b,1,1,1,1, +1,1,1,1,1,1,1,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,0x1891,0x1897,1,1,1,1,1,1,1,1,1, +1,1,1,1,0x189d,0x18a3,0x18a9,0x18af,1,1,0x18b5,0x18bb,0x834,0x838,0x18c1,0x18c7, +0x18cd,0x18d3,0x18d9,0x18df,1,1,0x18e5,0x18eb,0x18f1,0x18f7,0x18fd,0x1903,0x83c,0x840,0x1909,0x190f, +0x1915,0x191b,0x1921,0x1927,0x192d,0x1933,0x1939,0x193f,0x1945,0x194b,1,1,0x1951,0x1957,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,0xffb8,0xffcc,0xffcc,0xffcc,0xffcc,0xffb8,0xffcc,0xffcc,0xffcc,0xffbc,0xffb8,0xffcc,0xffcc,0xffcc,0xffcc, +0xffcc,0xffcc,0xffb8,0xffb8,0xffb8,0xffb8,0xffb8,0xffb8,0xffcc,0xffcc,0xffb8,0xffcc,0xffcc,0xffbc,0xffc8,0xffcc, +0xfe14,0xfe16,0xfe18,0xfe1a,0xfe1c,0xfe1e,0xfe20,0xfe22,0xfe24,0xfe26,0xfe26,0xfe28,0xfe2a,0xfe2c,1,0xfe2e, +1,0xfe30,0xfe32,1,0xffcc,0xffb8,1,0xfe24,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xfe3c,0xfe3e,0xfe40,1,1,1,1,1, +1,1,0x195c,0x1962,0x1969,0x196f,0x1975,0x844,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +0x850,1,0x854,0xfe36,0xfe38,0xfe3a,0xfe3c,0xfe3e,0xfe40,0xfe42,0xfe44,0xfdcc,0xfdcc,0xfdb8,0xffb8,0xffcc, +0xffcc,0xffcc,0xffcc,0xffcc,0xffb8,0xffcc,0xffcc,0xffb8,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,0xfe46,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,0x197b,0x858,0x1981,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,0x85c,0x1987,1,0x860,0xffcc,0xffcc, +0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,1,1,0xffcc,0xffcc,0xffcc,0xffcc,0xffb8,0xffcc,1,1,0xffcc, +0xffcc,1,0xffb8,0xffcc,0xffcc,0xffb8,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,0xfe48,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,0xffcc,0xffb8,0xffcc,0xffcc,0xffb8,0xffcc,0xffcc,0xffb8, +0xffb8,0xffb8,0xffcc,0xffb8,0xffb8,0xffcc,0xffb8,0xffcc,0xffcc,0xffcc,0xffb8,0xffcc,0xffb8,0xffcc,0xffb8,0xffcc, +0xffb8,0xffcc,0xffcc,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc, +0xffcc,0xffcc,0xffb8,0xffcc,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,0xffcc,0xffcc,0xffcc,0xffcc,1,0xffcc, +0xffcc,0xffcc,0xffcc,0xffcc,1,0xffcc,0xffcc,0xffcc,1,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,0xffb8,0xffb8,0xffb8,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,1,0xffb8, +0xffcc,0xffcc,0xffb8,0xffcc,0xffcc,0xffb8,0xffcc,0xffcc,0xffcc,0xffb8,0xffb8,0xffb8,0xfe36,0xfe38,0xfe3a,0xffcc, +0xffcc,0xffcc,0xffb8,0xffcc,0xffcc,0xffb8,0xffb8,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,1,1,1,1, +1,1,1,1,0x864,0x198d,1,1,1,1,1,1,0x868,0x1993,1,0x86c, +0x1999,1,1,1,1,1,1,1,0xfc0e,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,0xfe12,1,1,1,0xffcc,0xffb8,0xffcc, +0xffcc,1,1,1,0x29dc,0x29e2,0x29e8,0x29ee,0x29f4,0x29fa,0x2a00,0x2a06,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,0xfe0e,1,0xfc00,1,1,1,1,1, +1,1,1,0x870,1,1,1,0x199f,0x19a5,0xfe12,1,1,1,1,1,1, +1,1,1,0xfc00,1,1,1,1,0x2a0c,0x2a12,1,0x2a18,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0x2a1e, +1,1,0x2a24,1,1,1,1,1,0xfe0e,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,0xfe12,1,1,1,1,1,1, +1,1,1,1,1,0x2a2a,0x2a30,0x2a36,1,1,0x2a3c,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,0xfe0e,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,0xfe12,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0x878, +0x19ab,1,1,0x19b1,0x19b7,0xfe12,1,1,1,1,1,1,1,1,0xfc00,0xfc00, +1,1,1,1,0x2a42,0x2a48,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,0x884,1,0x19bd,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,0xfc00,1, +1,1,1,1,1,1,0x888,0x890,1,1,0x19c3,0x19c9,0x19cf,0xfe12,1,1, +1,1,1,1,1,1,1,0xfc00,1,1,1,1,1,1,1,1, +1,1,0x894,1,0x19d5,1,1,1,1,0xfe12,1,1,1,1,1,1, +1,0xfea8,0xfcb6,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +0xfe0e,1,1,0x898,0x19db,1,0xfc00,1,1,1,0x89c,0x19e1,0x19e7,1,0xdc4,0x19ef, +1,0xfe12,1,1,1,1,1,1,1,0xfc00,0xfc00,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,0xfe12,0xfe12,1,0xfc00,1,1,1,1,1, +1,1,0x8a8,0x8b0,1,1,0x19f7,0x19fd,0x1a03,0xfe12,1,1,1,1,1,1, +1,1,1,0xfc00,1,1,1,1,1,1,1,1,1,1,0xfc12,1, +1,1,1,0xfc00,1,1,1,1,1,1,1,1,1,0x8b4,0x1a09,1, +0xdce,0x1a11,0x1a19,0xfc00,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,0xfece,0xfece,0xfe12,1, +1,1,1,1,1,1,1,1,0xfed6,0xfed6,0xfed6,0xfed6,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,0xfeec,0xfeec,1,1,1,1,1,1,1,1,1,1, +0xfef4,0xfef4,0xfef4,0xfef4,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,0xffb8,0xffb8,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,0xffb8,1,0xffb8,1,0xffb0,1,1,1,1,1,1, +1,1,1,0x2a4f,1,1,1,1,1,1,1,1,1,0x2a55,1,1, +1,1,0x2a5b,1,1,1,1,0x2a61,1,1,1,1,0x2a67,1,1,1, +1,1,1,1,1,1,1,1,1,0x2a6d,1,1,1,1,1,1, +1,0xff02,0xff04,0x3c40,0xff08,0x3c48,0x2a72,1,0x2a78,1,0xff04,0xff04,0xff04,0xff04,1,1, +0xff04,0x3c50,0xffcc,0xffcc,0xfe12,1,0xffcc,0xffcc,1,1,1,1,1,1,1,1, +1,1,1,0x2a7f,1,1,1,1,1,1,1,1,1,0x2a85,1,1, +1,1,0x2a8b,1,1,1,1,0x2a91,1,1,1,1,0x2a97,1,1,1, +1,1,1,1,1,1,1,1,1,0x2a9d,1,1,1,1,1,1, +1,1,0xffb8,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,1,0x8c0,0x1a1f,1, +1,1,1,1,1,1,0xfc00,1,1,1,1,1,1,1,1,0xfe0e, +1,0xfe12,0xfe12,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,0xffb8,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,0xffcc,0xffcc,0xffcc,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,0xfe12,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,0xfe12,1, +1,1,1,1,1,1,1,1,1,0xffcc,1,1,1,1,1,1, +1,1,1,1,1,0xffc8,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,0xffbc,0xffcc,0xffb8,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,0xffcc,0xffb8,1,1,1, +1,1,1,1,0xfe12,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc, +0xffcc,1,1,0xffb8,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffb8,0xffb8,0xffb8,0xffb8,0xffb8,0xffb8,0xffcc, +0xffcc,0xffb8,1,1,1,1,1,1,1,0x8c4,0x1a25,0x8c8,0x1a2b,0x8cc,0x1a31,0x8d0, +0x1a37,0x8d4,0x1a3d,1,1,0x8d8,0x1a43,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,0xfe0e,0xfc00,1,1, +1,1,0x8dc,0x1a49,0x8e0,0x1a4f,0x8e4,0x8e8,0x1a55,0x1a5b,0x8ec,0x1a61,0xfe12,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,0xffcc,0xffb8,0xffcc,0xffcc,0xffcc, +0xffcc,0xffcc,0xffcc,0xffcc,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,0xfe12,0xfe12,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,0xfe0e,1,1,1,1,1, +1,1,1,1,1,1,0xfe12,0xfe12,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0xfe0e, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +0xffcc,0xffcc,0xffcc,1,0xfe02,0xffb8,0xffb8,0xffb8,0xffb8,0xffb8,0xffcc,0xffcc,0xffb8,0xffb8,0xffb8,0xffb8, +0xffcc,1,0xfe02,0xfe02,0xfe02,0xfe02,0xfe02,0xfe02,0xfe02,1,1,1,1,0xffb8,1,1, +1,1,1,1,0xffcc,1,1,1,0xffcc,0xffcc,1,1,1,1,1,1, +0xffcc,0xffcc,0xffb8,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffb8,0xffcc,0xffcc,0xffd4,0xffac,0xffb8, +0xff94,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc, +0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffd0,0xffc8,0xffc8,0xffb8,1,0xffcc, +0xffd2,0xffb8,0xffcc,0xffb8,0x1a66,0x1a6c,0x1a72,0x1a78,0x1a7f,0x1a85,0x1a8b,0x1a91,0x1a99,0x1aa3,0x1aaa,0x1ab0, +0x1ab6,0x1abc,0x1ac2,0x1ac8,0x1acf,0x1ad5,0x1ada,0x1ae0,0x1ae8,0x1af2,0x1afc,0x1b06,0x1b0e,0x1b14,0x1b1a,0x1b20, +0x1b29,0x1b33,0x1b3b,0x1b41,0x1b46,0x1b4c,0x1b52,0x1b58,0x1b5e,0x1b64,0x1b6a,0x1b70,0x1b77,0x1b7d,0x1b82,0x1b88, +0x1b8e,0x1b94,0x1b9c,0x1ba6,0x1bae,0x1bb4,0x1bba,0x1bc0,0x1bc6,0x1bcc,0xdd8,0xde2,0x1bd4,0x1bde,0x1be6,0x1bec, +0x1bf2,0x1bf8,0x1bfe,0x1c04,0x1c0a,0x1c10,0x1c17,0x1c1d,0x1c22,0x1c28,0x1c2e,0x1c34,0x1c3a,0x1c40,0x1c46,0x1c4c, +0x1c54,0x1c5e,0x1c68,0x1c72,0x1c7c,0x1c86,0x1c90,0x1c9a,0x1ca3,0x1ca9,0x1caf,0x1cb5,0x1cba,0x1cc0,0xdec,0xdf6, +0x1cc8,0x1cd2,0x1cda,0x1ce0,0x1ce6,0x1cec,0xe00,0xe0a,0x1cf4,0x1cfe,0x1d08,0x1d12,0x1d1c,0x1d26,0x1d2e,0x1d34, +0x1d3a,0x1d40,0x1d46,0x1d4c,0x1d52,0x1d58,0x1d5e,0x1d64,0x1d6a,0x1d70,0x1d76,0x1d7c,0x1d84,0x1d8e,0x1d98,0x1da2, +0x1daa,0x1db0,0x1db7,0x1dbd,0x1dc2,0x1dc8,0x1dce,0x1dd4,0x1dda,0x1de0,0x1de6,0x1dec,0x1df3,0x1df9,0x1dff,0x1e05, +0x1e0b,0x1e11,0x1e16,0x1e1c,0x1e22,0x1e28,0x1e2f,0x1e35,0x1e3b,0x1e41,0x1e46,0x1e4c,0x1e52,0x1e58,1,0x1e5f, +1,1,1,1,0xe14,0xe22,0x1e64,0x1e6a,0x1e72,0x1e7c,0x1e86,0x1e90,0x1e9a,0x1ea4,0x1eae,0x1eb8, +0x1ec2,0x1ecc,0x1ed6,0x1ee0,0x1eea,0x1ef4,0x1efe,0x1f08,0x1f12,0x1f1c,0x1f26,0x1f30,0xe30,0xe3a,0x1f38,0x1f3e, +0x1f44,0x1f4a,0x1f52,0x1f5c,0x1f66,0x1f70,0x1f7a,0x1f84,0x1f8e,0x1f98,0x1fa2,0x1fac,0x1fb4,0x1fba,0x1fc0,0x1fc6, +0xe44,0xe4e,0x1fcc,0x1fd2,0x1fda,0x1fe4,0x1fee,0x1ff8,0x2002,0x200c,0x2016,0x2020,0x202a,0x2034,0x203e,0x2048, +0x2052,0x205c,0x2066,0x2070,0x207a,0x2084,0x208e,0x2098,0x20a0,0x20a6,0x20ac,0x20b2,0x20ba,0x20c4,0x20ce,0x20d8, +0x20e2,0x20ec,0x20f6,0x2100,0x210a,0x2114,0x211c,0x2122,0x2129,0x212f,0x2134,0x213a,0x2140,0x2146,1,1, +1,1,1,1,0xe58,0xe6e,0xe86,0xe94,0xea2,0xeb0,0xebe,0xecc,0xed8,0xeee,0xf06,0xf14, +0xf22,0xf30,0xf3e,0xf4c,0xf58,0xf66,0x214f,0x2159,0x2163,0x216d,1,1,0xf74,0xf82,0x2177,0x2181, +0x218b,0x2195,1,1,0xf90,0xfa6,0xfbe,0xfcc,0xfda,0xfe8,0xff6,0x1004,0x1010,0x1026,0x103e,0x104c, +0x105a,0x1068,0x1076,0x1084,0x1090,0x10a2,0x219f,0x21a9,0x21b3,0x21bd,0x21c7,0x21d1,0x10b4,0x10c6,0x21db,0x21e5, +0x21ef,0x21f9,0x2203,0x220d,0x10d8,0x10e6,0x2217,0x2221,0x222b,0x2235,1,1,0x10f4,0x1102,0x223f,0x2249, +0x2253,0x225d,1,1,0x1110,0x1122,0x2267,0x2271,0x227b,0x2285,0x228f,0x2299,1,0x1134,1,0x22a3, +1,0x22ad,1,0x22b7,0x1146,0x115c,0x1174,0x1182,0x1190,0x119e,0x11ac,0x11ba,0x11c6,0x11dc,0x11f4,0x1202, +0x1210,0x121e,0x122c,0x123a,0x1246,0x3b8e,0x22bf,0x3b96,0x1250,0x3b9e,0x22c5,0x3ba6,0x22cb,0x3bae,0x22d1,0x3bb6, +0x125a,0x3bbe,1,1,0x22d8,0x22e2,0x22f1,0x2301,0x2311,0x2321,0x2331,0x2341,0x234c,0x2356,0x2365,0x2375, +0x2385,0x2395,0x23a5,0x23b5,0x23c0,0x23ca,0x23d9,0x23e9,0x23f9,0x2409,0x2419,0x2429,0x2434,0x243e,0x244d,0x245d, +0x246d,0x247d,0x248d,0x249d,0x24a8,0x24b2,0x24c1,0x24d1,0x24e1,0x24f1,0x2501,0x2511,0x251c,0x2526,0x2535,0x2545, +0x2555,0x2565,0x2575,0x2585,0x258f,0x2595,0x259d,0x25a4,0x25ad,1,0x1264,0x25b7,0x25bf,0x25c5,0x25cb,0x3bc6, +0x25d0,1,0x2aa2,0x8f0,1,0x25d7,0x25df,0x25e6,0x25ef,1,0x126e,0x25f9,0x2601,0x3bce,0x2607,0x3bd6, +0x260c,0x2613,0x2619,0x261f,0x2625,0x262b,0x2633,0x3be0,1,1,0x263b,0x2643,0x264b,0x2651,0x2657,0x3bea, +1,0x265d,0x2663,0x2669,0x266f,0x2675,0x267d,0x3bf4,0x2685,0x268b,0x2691,0x2699,0x26a1,0x26a7,0x26ad,0x3bfe, +0x26b3,0x26b9,0x3c06,0x2aa7,1,1,0x26c1,0x26c8,0x26d1,1,0x1278,0x26db,0x26e3,0x3c0e,0x26e9,0x3c16, +0x26ee,0x2aab,0x8fc,1,0xfa09,0xfa09,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,0xffcc,0xffcc,0xfe02,0xfe02,0xffcc,0xffcc,0xffcc,0xffcc,0xfe02,0xfe02,0xfe02,0xffcc, +0xffcc,1,1,1,1,0xffcc,1,1,1,0xfe02,0xfe02,0xffcc,0xffb8,0xffcc,0xfe02,0xfe02, +0xffb8,0xffb8,0xffb8,0xffb8,0xffcc,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,0x2aae,1,1,1,0x2ab2,0x3c1e,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +0x908,1,0x90c,1,0x910,1,1,1,1,1,0x26f5,0x26fb,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,0x2701,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,1,0x2707,0x270d,0x2713, +0x914,1,0x918,1,0x91c,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,0x920,0x2719,1,1,1,0x924,0x271f,1,0x928,0x2725,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,0x92c,0x272b,0x930,0x2731,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,0x934,1,1,1, +1,0x2737,1,0x938,0x273d,0x93c,1,0x2743,0x940,0x2749,1,1,1,0x944,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +0x274f,0x948,0x2755,1,0x94c,0x950,1,1,1,1,1,1,1,0x275b,0x2761,0x2767, +0x276d,0x2773,0x954,0x958,0x2779,0x277f,0x95c,0x960,0x2785,0x278b,0x964,0x968,0x96c,0x970,1,1, +0x2791,0x2797,0x974,0x978,0x279d,0x27a3,0x97c,0x980,0x27a9,0x27af,1,1,1,1,1,1, +1,0x984,0x988,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,0x98c,1,1,1,1,1,0x990,0x994,1,0x998,0x27b5,0x27bb,0x27c1,0x27c7, +1,1,0x99c,0x9a0,0x9a4,0x9a8,1,1,1,1,1,1,1,1,1,1, +0x27cd,0x27d3,0x27d9,0x27df,1,1,1,1,1,1,0x27e5,0x27eb,0x27f1,0x27f7,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,0x2ab7,0x2abb,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +0x2abf,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,0xffcc,0xffcc,0xffcc,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,0xfe12,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc, +0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc, +0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,1,1,1,1,1,1,1,1, +1,1,0xffb4,0xffc8,0xffd0,0xffbc,0xffc0,0xffc0,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,0x9ac,1,1,1,1,0x9b0, +0x27fd,0x9b4,0x2803,0x9b8,0x2809,0x9bc,0x280f,0x9c0,0x2815,0x9c4,0x281b,0x9c8,0x2821,0x9cc,0x2827,0x9d0, +0x282d,0x9d4,0x2833,0x9d8,0x2839,0x9dc,0x283f,1,0x9e0,0x2845,0x9e4,0x284b,0x9e8,0x2851,1,1, +1,1,1,0x9ec,0x2857,0x285d,0x9f4,0x2863,0x2869,0x9fc,0x286f,0x2875,0xa04,0x287b,0x2881,0xa0c, +0x2887,0x288d,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,0x2893,1,1,1,1,0xfc10,0xfc10,1, +1,0xa14,0x2899,1,1,1,1,1,1,1,0xa18,1,1,1,1,0xa1c, +0x289f,0xa20,0x28a5,0xa24,0x28ab,0xa28,0x28b1,0xa2c,0x28b7,0xa30,0x28bd,0xa34,0x28c3,0xa38,0x28c9,0xa3c, +0x28cf,0xa40,0x28d5,0xa44,0x28db,0xa48,0x28e1,1,0xa4c,0x28e7,0xa50,0x28ed,0xa54,0x28f3,1,1, +1,1,1,0xa58,0x28f9,0x28ff,0xa60,0x2905,0x290b,0xa68,0x2911,0x2917,0xa70,0x291d,0x2923,0xa78, +0x2929,0x292f,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,0xa80,0xa84,0xa88,0xa8c,1,0x2935,1,1,0x293b,0x2941,0x2947,0x294d,1, +1,0xa90,0x2953,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,0xffcc,1,1,1,1,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc, +0xffcc,0xffcc,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,0xffcc,0xffcc,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,0xffcc,0xffcc,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,0xfe12,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +0xfe12,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,0xffcc,0xffcc,0xffcc,0xffcc, +0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0xffb8, +0xffb8,0xffb8,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,0xfe12,1,1,1,1,1,1,1,1, +1,1,1,1,0xfe12,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,0xffcc,1,0xffcc,0xffcc,0xffb8,1,1,0xffcc,0xffcc,1,1,1, +1,1,0xffcc,0xffcc,1,0xffcc,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,0xfe12,1,1,1,1,1,1,1,1,1, +0x2ac5,0x2ac9,0x2acd,0x2ad1,0x2ad5,0x2ad9,0x2add,0x2ae1,0x2ae1,0x2ae5,0x2ae9,0x2aed,0x2af1,0x2af5,0x2af9,0x2afd, +0x2b01,0x2b05,0x2b09,0x2b0d,0x2b11,0x2b15,0x2b19,0x2b1d,0x2b21,0x2b25,0x2b29,0x2b2d,0x2b31,0x2b35,0x2b39,0x2b3d, +0x2b41,0x2b45,0x2b49,0x2b4d,0x2b51,0x2b55,0x2b59,0x2b5d,0x2b61,0x2b65,0x2b69,0x2b6d,0x2b71,0x2b75,0x2b79,0x2b7d, +0x2b81,0x2b85,0x2b89,0x2b8d,0x2b91,0x2b95,0x2b99,0x2b9d,0x2ba1,0x2ba5,0x2ba9,0x2bad,0x2bb1,0x2bb5,0x2bb9,0x2bbd, +0x2bc1,0x2bc5,0x2bc9,0x2bcd,0x2bd1,0x2bd5,0x2bd9,0x2bdd,0x2be1,0x2be5,0x2be9,0x2bed,0x2bf1,0x2bf5,0x2bf9,0x2bfd, +0x2c01,0x2c05,0x2c09,0x2c0d,0x2c11,0x2c15,0x2c19,0x2c1d,0x2c21,0x2c25,0x2c29,0x2c2d,0x2b11,0x2c31,0x2c35,0x2c39, +0x2c3d,0x2c41,0x2c45,0x2c49,0x2c4d,0x2c51,0x2c55,0x2c59,0x2c5d,0x2c61,0x2c65,0x2c69,0x2c6d,0x2c71,0x2c75,0x2c79, +0x2c7d,0x2c81,0x2c85,0x2c89,0x2c8d,0x2c91,0x2c95,0x2c99,0x2c9d,0x2ca1,0x2ca5,0x2ca9,0x2cad,0x2cb1,0x2cb5,0x2cb9, +0x2cbd,0x2cc1,0x2cc5,0x2cc9,0x2ccd,0x2cd1,0x2cd5,0x2cd9,0x2cdd,0x2ce1,0x2ce5,0x2ce9,0x2ced,0x2cf1,0x2cf5,0x2cf9, +0x2cfd,0x2d01,0x2d05,0x2d09,0x2d0d,0x2d11,0x2d15,0x2d19,0x2d1d,0x2d21,0x2d25,0x2d29,0x2d2d,0x2d31,0x2d35,0x2d39, +0x2d3d,0x2c79,0x2d41,0x2d45,0x2d49,0x2d4d,0x2d51,0x2d55,0x2d59,0x2d5d,0x2c39,0x2d61,0x2d65,0x2d69,0x2d6d,0x2d71, +0x2d75,0x2d79,0x2d7d,0x2d81,0x2d85,0x2d89,0x2d8d,0x2d91,0x2d95,0x2d99,0x2d9d,0x2da1,0x2da5,0x2da9,0x2dad,0x2b11, +0x2db1,0x2db5,0x2db9,0x2dbd,0x2dc1,0x2dc5,0x2dc9,0x2dcd,0x2dd1,0x2dd5,0x2dd9,0x2ddd,0x2de1,0x2de5,0x2de9,0x2ded, +0x2df1,0x2df5,0x2df9,0x2dfd,0x2e01,0x2e05,0x2e09,0x2e0d,0x2e11,0x2e15,0x2e19,0x2c41,0x2e1d,0x2e21,0x2e25,0x2e29, +0x2e2d,0x2e31,0x2e35,0x2e39,0x2e3d,0x2e41,0x2e45,0x2e49,0x2e4d,0x2e51,0x2e55,0x2e59,0x2e5d,0x2e61,0x2e65,0x2e69, +0x2e6d,0x2e71,0x2e75,0x2e79,0x2e7d,0x2e81,0x2e85,0x2e89,0x2e8d,0x2e91,0x2e95,0x2e99,0x2e9d,0x2ea1,0x2ea5,0x2ea9, +0x2ead,0x2eb1,0x2eb5,0x2eb9,0x2ebd,0x2ec1,0x2ec5,0x2ec9,0x2ecd,0x2ed1,0x2ed5,0x2ed9,0x2edd,0x2ee1,1,1, +0x2ee5,1,0x2ee9,1,1,0x2eed,0x2ef1,0x2ef5,0x2ef9,0x2efd,0x2f01,0x2f05,0x2f09,0x2f0d,0x2f11,1, +0x2f15,1,0x2f19,1,1,0x2f1d,0x2f21,1,1,1,0x2f25,0x2f29,0x2f2d,0x2f31,0x2f35,0x2f39, +0x2f3d,0x2f41,0x2f45,0x2f49,0x2f4d,0x2f51,0x2f55,0x2f59,0x2f5d,0x2f61,0x2f65,0x2f69,0x2f6d,0x2f71,0x2f75,0x2f79, +0x2f7d,0x2f81,0x2f85,0x2f89,0x2f8d,0x2f91,0x2f95,0x2f99,0x2f9d,0x2fa1,0x2fa5,0x2fa9,0x2fad,0x2fb1,0x2fb5,0x2fb9, +0x2fbd,0x2fc1,0x2fc5,0x2fc9,0x2fcd,0x2fd1,0x2fd5,0x2d15,0x2fd9,0x2fdd,0x2fe1,0x2fe5,0x2fe9,0x2fed,0x2fed,0x2ff1, +0x2ff5,0x2ff9,0x2ffd,0x3001,0x3005,0x3009,0x300d,0x2f1d,0x3011,0x3015,0x3019,0x301d,0x3021,0x3027,1,1, +0x302b,0x302f,0x3033,0x3037,0x303b,0x303f,0x3043,0x3047,0x2f55,0x304b,0x304f,0x3053,0x2ee5,0x3057,0x305b,0x305f, +0x3063,0x3067,0x306b,0x306f,0x3073,0x3077,0x307b,0x307f,0x3083,0x2f79,0x3087,0x2f7d,0x308b,0x308f,0x3093,0x3097, +0x309b,0x2ee9,0x2b65,0x309f,0x30a3,0x30a7,0x2c7d,0x2dd9,0x30ab,0x30af,0x2f99,0x30b3,0x2f9d,0x30b7,0x30bb,0x30bf, +0x2ef1,0x30c3,0x30c7,0x30cb,0x30cf,0x30d3,0x2ef5,0x30d7,0x30db,0x30df,0x30e3,0x30e7,0x30eb,0x2fd5,0x30ef,0x30f3, +0x2d15,0x30f7,0x2fe5,0x30fb,0x30ff,0x3103,0x3107,0x310b,0x2ff9,0x310f,0x2f19,0x3113,0x2ffd,0x2c31,0x3117,0x3001, +0x311b,0x3009,0x311f,0x3123,0x3127,0x312b,0x312f,0x3011,0x2f09,0x3133,0x3015,0x3137,0x3019,0x313b,0x2ae1,0x313f, +0x3145,0x314b,0x3151,0x3155,0x3159,0x315d,0x3163,0x3169,0x316f,0x3173,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,0x3176,0xfe34,0x317c,1,1,1,1, +1,1,1,1,1,1,0x3182,0x3188,0x3190,0x319a,0x31a2,0x31a8,0x31ae,0x31b4,0x31ba,0x31c0, +0x31c6,0x31cc,0x31d2,1,0x31d8,0x31de,0x31e4,0x31ea,0x31f0,1,0x31f6,1,0x31fc,0x3202,1,0x3208, +0x320e,1,0x3214,0x321a,0x3220,0x3226,0x322c,0x3232,0x3238,0x323e,0x3244,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,0xffcc,0xffcc,0xffcc,0xffcc, +0xffcc,0xffcc,0xffcc,0xffb8,0xffb8,0xffb8,0xffb8,0xffb8,0xffb8,0xffb8,0xffcc,0xffcc,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,0xffb8,1,1,0xffb8,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,0xffcc,0xffcc, +0xffcc,0xffcc,0xffcc,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,0xffb8,1,0xffcc,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,0xffcc,0xfe02,0xffb8,1, +1,1,1,0xfe12,1,1,1,1,1,0xffcc,0xffb8,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,0xa94,0x2959,0xa9a,0x2963,1,1,1,1,1,1,1, +1,0xaa0,1,1,1,1,1,0x296d,1,1,1,1,1,1,1,1, +1,1,1,1,1,0xfe12,0xfc0e,1,1,1,1,1,0xffcc,0xffcc,0xffcc,1, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0xfc00, +1,1,1,1,1,1,0x2977,0x2981,1,0xaa6,0xaac,0xfe12,0xfe12,1,1,1, +1,1,1,1,1,1,1,1,0xfe12,1,1,1,1,1,1,1, +1,1,0xfe0e,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,0xfe12,0xfe0e,1,1,1,1,1, +1,1,1,1,1,0xfe0e,0xfe12,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0xab2, +1,1,1,0x298b,0x2995,0xfe12,1,1,1,1,1,1,1,1,1,0xfc00, +1,1,1,1,1,1,1,1,1,1,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc, +0xffcc,1,1,1,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,1,1,1,1,1,1,1, +1,1,1,1,1,1,0xfe12,1,1,1,0xfe0e,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,0xfc00,1,1,1,1,1,1,1,1,0xabe,0xfc00,0x299f, +0x29a9,0xfc00,0x29b3,1,1,1,0xfe12,0xfe0e,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,0xfc00,1,1,1,1,1,1,1,1, +0xad0,0xad6,0x29bd,0x29c7,1,1,1,0xfe12,0xfe0e,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,0xfe12,0xfe0e,1,1,1,1, +1,1,1,1,1,1,1,0xfe12,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,0xfe12,1,1,1,1,1,1,1,1,0xfe0e,1,0xfe12,0xfe12,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,0xfe02,0xfe02,0xfe02,0xfe02,0xfe02,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,0xfe02,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,0x324a,0x3254,0x3268,0x3280,0x3298,0x32b0,0x32c8,0xffb0,0xffb0,0xfe02, +0xfe02,0xfe02,1,1,1,0xffc4,0xffb0,0xffb0,0xffb0,0xffb0,0xffb0,1,1,1,1,1, +1,1,1,0xffb8,0xffb8,0xffb8,0xffb8,0xffb8,0xffb8,0xffb8,0xffb8,1,1,0xffcc,0xffcc,0xffcc, +0xffcc,0xffcc,0xffb8,0xffb8,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,0xffcc,0xffcc,0xffcc,0xffcc,1,1, +1,1,1,1,1,1,1,1,1,1,1,0x32d6,0x32e0,0x32f4,0x330c,0x3324, +0x333c,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,0xffcc,0xffcc,0xffcc,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,1,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc, +0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,1,1,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc, +0xffcc,0xffcc,1,0xffcc,0xffcc,1,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +0xffb8,0xffb8,0xffb8,0xffb8,0xffb8,0xffb8,0xffb8,1,1,1,1,1,1,1,1,1, +0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xfe0e,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,0x334b,0x334f,0x3353,0x3357, +0x335d,0x2f3d,0x3361,0x3365,0x3369,0x336d,0x2f41,0x3371,0x3375,0x3379,0x2f45,0x337f,0x3383,0x3387,0x338b,0x3391, +0x3395,0x3399,0x339d,0x33a3,0x33a7,0x33ab,0x33af,0x302f,0x33b3,0x33b9,0x33bd,0x33c1,0x33c5,0x33c9,0x33cd,0x33d1, +0x33d5,0x3043,0x2f49,0x2f4d,0x3047,0x33d9,0x33dd,0x2c49,0x33e1,0x2f51,0x33e5,0x33e9,0x33ed,0x33f1,0x33f1,0x33f1, +0x33f5,0x33fb,0x33ff,0x3403,0x3407,0x340d,0x3411,0x3415,0x3419,0x341d,0x3421,0x3425,0x3429,0x342d,0x3431,0x3435, +0x3439,0x343d,0x343d,0x304f,0x3441,0x3445,0x3449,0x344d,0x2f59,0x3451,0x3455,0x3459,0x2ead,0x345d,0x3461,0x3465, +0x3469,0x346d,0x3471,0x3475,0x3479,0x347d,0x3483,0x3487,0x348b,0x348f,0x3493,0x3497,0x349b,0x34a1,0x34a7,0x34ab, +0x34af,0x34b3,0x34b7,0x34bb,0x34bf,0x34c3,0x34c7,0x34c7,0x34cb,0x34d1,0x34d5,0x2c39,0x34d9,0x34dd,0x34e3,0x34e7, +0x34eb,0x34ef,0x34f3,0x34f7,0x2f6d,0x34fb,0x34ff,0x3503,0x3509,0x350d,0x3513,0x3517,0x351b,0x351f,0x3523,0x3527, +0x352b,0x352f,0x3533,0x3537,0x353b,0x353f,0x3545,0x3549,0x354d,0x3551,0x2b61,0x3555,0x355b,0x355f,0x355f,0x3565, +0x3569,0x3569,0x356d,0x3571,0x3577,0x357d,0x3581,0x3585,0x3589,0x358d,0x3591,0x3595,0x3599,0x359d,0x35a1,0x2f71, +0x35a5,0x35ab,0x35af,0x35b3,0x307f,0x35b3,0x35b7,0x2f79,0x35bb,0x35bf,0x35c3,0x35c7,0x2f7d,0x2af5,0x35cb,0x35cf, +0x35d3,0x35d7,0x35db,0x35df,0x35e3,0x35e9,0x35ed,0x35f1,0x35f5,0x35f9,0x35fd,0x3603,0x3607,0x360b,0x360f,0x3613, +0x3617,0x361b,0x361f,0x3623,0x2f81,0x3627,0x362b,0x3631,0x3635,0x3639,0x363d,0x2f89,0x3641,0x3645,0x3649,0x364d, +0x3651,0x3655,0x3659,0x365d,0x2b65,0x309f,0x3661,0x3665,0x3669,0x366d,0x3673,0x3677,0x367b,0x367f,0x2f8d,0x3683, +0x3689,0x368d,0x3691,0x3151,0x3695,0x3699,0x369d,0x36a1,0x36a5,0x36ab,0x36af,0x36b3,0x36b7,0x36bd,0x36c1,0x36c5, +0x36c9,0x2c7d,0x36cd,0x36d1,0x36d7,0x36dd,0x36e3,0x36e7,0x36ed,0x36f1,0x36f5,0x36f9,0x36fd,0x2f91,0x2dd9,0x3701, +0x3705,0x3709,0x370d,0x3713,0x3717,0x371b,0x371f,0x30af,0x3723,0x3727,0x372d,0x3731,0x3735,0x373b,0x3741,0x3745, +0x30b3,0x3749,0x374d,0x3751,0x3755,0x3759,0x375d,0x3761,0x3767,0x376b,0x3771,0x3775,0x377b,0x30bb,0x377f,0x3783, +0x3789,0x378d,0x3791,0x3797,0x379d,0x37a1,0x37a5,0x37a9,0x37ad,0x37ad,0x37b1,0x37b5,0x30c3,0x37b9,0x37bd,0x37c1, +0x37c5,0x37c9,0x37cf,0x37d3,0x2c45,0x37d9,0x37df,0x37e3,0x37e9,0x37ef,0x37f5,0x37f9,0x30db,0x37fd,0x3803,0x3809, +0x380f,0x3815,0x3819,0x3819,0x30df,0x3159,0x381d,0x3821,0x3825,0x3829,0x382f,0x2bad,0x30e7,0x3833,0x3837,0x2fbd, +0x383d,0x3843,0x2f05,0x3849,0x384d,0x2fcd,0x3851,0x3855,0x3859,0x385f,0x385f,0x3865,0x3869,0x386d,0x3873,0x3877, +0x387b,0x387f,0x3885,0x3889,0x388d,0x3891,0x3895,0x3899,0x389f,0x38a3,0x38a7,0x38ab,0x38af,0x38b3,0x38b7,0x38bd, +0x38c3,0x38c7,0x38cd,0x38d1,0x38d7,0x38db,0x2fe5,0x38df,0x38e5,0x38eb,0x38ef,0x38f5,0x38f9,0x38ff,0x3903,0x3907, +0x390b,0x390f,0x3913,0x3917,0x391d,0x3923,0x3929,0x3565,0x392f,0x3933,0x3937,0x393b,0x393f,0x3943,0x3947,0x394b, +0x394f,0x3953,0x3957,0x395b,0x2c8d,0x3961,0x3965,0x3969,0x396d,0x3971,0x3975,0x2ff1,0x3979,0x397d,0x3981,0x3985, +0x3989,0x398f,0x3995,0x399b,0x399f,0x39a3,0x39a7,0x39ab,0x39b1,0x39b5,0x39bb,0x39bf,0x39c3,0x39c9,0x39cf,0x39d3, +0x2b99,0x39d7,0x39db,0x39df,0x39e3,0x39e7,0x39eb,0x3103,0x39ef,0x39f3,0x39f7,0x39fb,0x39ff,0x3a03,0x3a07,0x3a0b, +0x3a0f,0x3a13,0x3a19,0x3a1d,0x3a21,0x3a25,0x3a29,0x3a2d,0x3a33,0x3a39,0x3a3d,0x3a41,0x3117,0x311b,0x3a45,0x3a49, +0x3a4f,0x3a53,0x3a57,0x3a5b,0x3a5f,0x3a65,0x3a6b,0x3a6f,0x3a73,0x3a77,0x3a7d,0x311f,0x3a81,0x3a87,0x3a8d,0x3a91, +0x3a95,0x3a99,0x3a9f,0x3aa3,0x3aa7,0x3aab,0x3aaf,0x3ab3,0x3ab7,0x3abb,0x3ac1,0x3ac5,0x3ac9,0x3acd,0x3ad3,0x3ad7, +0x3adb,0x3adf,0x3ae3,0x3ae9,0x3aef,0x3af3,0x3af7,0x3afb,0x3b01,0x3b05,0x3137,0x3137,0x3b0b,0x3b0f,0x3b15,0x3b19, +0x3b1d,0x3b21,0x3b25,0x3b29,0x3b2d,0x3b31,0x313b,0x3b37,0x3b3b,0x3b3f,0x3b43,0x3b47,0x3b4b,0x3b51,0x3b55,0x3b5b, +0x3b61,0x3b67,0x3b6b,0x3b6f,0x3b73,0x3b77,0x3b7b,0x3b7f,0x3b83,0x3b87,1,1,2,2,2,2, +2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1, +1,1,1,1,1,1,1,1,1,1,1,1,1,0xfe00,0xfe00,0xfe00, +0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00, +0xfe00,0xfe00,1,1,1,1,1,1,1,1,1,1,0xfe00,0xfe00,0xfe00,0xfe00, +0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00, +0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,0xadc,0x1283,0x1283,0x1283,0x1283,0x1283,0x1283,0x1283,0x1283,0x1283,0x1283,0x1283, +0x1283,0x1283,0x1283,0x1283,0x1283,0x1283,0x1283,0x1283,0x1283,0x1283,0x1283,0x1283,0x1283,0x1283,0x1283,0x1283, +0xadc,0x1283,0x1283,0x1283,0x1283,0x1283,0x1283,0x1283,0x1283,0x1283,0x1283,0x1283,0x1283,0x1283,0x1283,0x1283, +0x1283,0x1283,0x1283,0x1283,0x1283,0x1283,0x1283,0x1283,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,0x1283,0x1283,0x1283,0x1283,0xadc,0x1283,0x1283,0x1283,0x1283,0x1283,0x1283,0x1283, +0x1283,0x1283,0x1283,0x1283,0x1283,0x1283,0x1283,0x1283,0x1283,0x1283,0x1283,0x1283,0x1283,0x1283,0x1283,0x1283, +0x1283,0x1283,0x1283,0x1283,0x3c54,1,0x3c54,1,0x3c54,0x3c54,0x3c54,0x3c54,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,0x3c54,1, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0x3c54, +1,1,1,1,0x3c54,1,1,1,0x3c54,1,0x3c54,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,0x3b87,1,1,1,1,1 }; -static const uint16_t norm2_nfc_data_extraData[7722]={ +static const uint16_t norm2_nfc_data_extraData[7724]={ 0xffff,0xffff,0x8670,0x44dc,0x8670,0x44c0,0x8670,0x44de,0x600,0x180,0x602,0x182,0x604,0x185,0x606,0x186, 0x608,0x200,0x60c,0x205,0x60e,0x44d,0x610,0x189,0x612,0x3d44,0x614,0x18b,0x618,0x39a,0x61e,0x400, 0x622,0x404,0x646,0x3d41,0x64a,0x3c00,0x8650,0x208,0x60e,0x3c04,0x646,0x3c08,0x8662,0x3c0c,0x602,0x20c, @@ -712,407 +720,407 @@ static const uint16_t norm2_nfc_data_extraData[7722]={ 0x6132,0x61a6,0xe134,0x61a8,0x6132,0x61ac,0xe134,0x61ae,0x6132,0x61b2,0xe134,0x61b4,0x6132,0x61b8,0xe134,0x61ba, 0xe132,0x61ee,0xe132,0x61f0,0xe132,0x61f2,0xe132,0x61f4,0xe132,0x61fc,0xb489,0x2e82,0x2134,0xb489,0x2e82,0x2138, 0xb489,0x2e82,0x2156,0xb489,0x49c2,0x225c,0xb489,0x49c2,0x225e,0x3489,0xcf82,0x2696,0xb489,0xd5c2,0x2698,0x348b, -0x2c02,0x2978,0x348b,0x2e82,0x2976,0xb48b,0x2f42,0x297c,0xb48b,0x6bc2,0x2b74,0xb48b,0x6bc2,0x2b76,0,0xe622, -0x41,0x302,0x600,0x3d4c,0x602,0x3d48,0x606,0x3d54,0x8612,0x3d50,0xe622,0x41,0x308,0x8608,0x3bc,0xe622, -0x41,0x30a,0x8602,0x3f4,0xca22,0x43,0x327,0x8602,0x3c10,0xe622,0x45,0x302,0x600,0x3d80,0x602,0x3d7c, -0x606,0x3d88,0x8612,0x3d84,0xe622,0x49,0x308,0x8602,0x3c5c,0xe622,0x4f,0x302,0x600,0x3da4,0x602,0x3da0, -0x606,0x3dac,0x8612,0x3da8,0xe622,0x4f,0x303,0x602,0x3c98,0x608,0x458,0x8610,0x3c9c,0xe622,0x4f,0x308, -0x8608,0x454,0xe622,0x55,0x308,0x600,0x3b6,0x602,0x3ae,0x608,0x3aa,0x8618,0x3b2,0xe622,0x61,0x302, -0x600,0x3d4e,0x602,0x3d4a,0x606,0x3d56,0x8612,0x3d52,0xe622,0x61,0x308,0x8608,0x3be,0xe622,0x61,0x30a, -0x8602,0x3f6,0xca22,0x63,0x327,0x8602,0x3c12,0xe622,0x65,0x302,0x600,0x3d82,0x602,0x3d7e,0x606,0x3d8a, -0x8612,0x3d86,0xe622,0x69,0x308,0x8602,0x3c5e,0xe622,0x6f,0x302,0x600,0x3da6,0x602,0x3da2,0x606,0x3dae, -0x8612,0x3daa,0xe622,0x6f,0x303,0x602,0x3c9a,0x608,0x45a,0x8610,0x3c9e,0xe622,0x6f,0x308,0x8608,0x456, -0xe622,0x75,0x308,0x600,0x3b8,0x602,0x3b0,0x608,0x3ac,0x8618,0x3b4,0xe622,0x41,0x306,0x600,0x3d60, -0x602,0x3d5c,0x606,0x3d68,0x8612,0x3d64,0xe622,0x61,0x306,0x600,0x3d62,0x602,0x3d5e,0x606,0x3d6a,0x8612, -0x3d66,0xe622,0x45,0x304,0x600,0x3c28,0x8602,0x3c2c,0xe622,0x65,0x304,0x600,0x3c2a,0x8602,0x3c2e,0xe622, -0x4f,0x304,0x600,0x3ca0,0x8602,0x3ca4,0xe622,0x6f,0x304,0x600,0x3ca2,0x8602,0x3ca6,0xe622,0x53,0x301, -0x860e,0x3cc8,0xe622,0x73,0x301,0x860e,0x3cca,0xe622,0x53,0x30c,0x860e,0x3ccc,0xe622,0x73,0x30c,0x860e, -0x3cce,0xe622,0x55,0x303,0x8602,0x3cf0,0xe622,0x75,0x303,0x8602,0x3cf2,0xe622,0x55,0x304,0x8610,0x3cf4, -0xe622,0x75,0x304,0x8610,0x3cf6,0xd822,0x4f,0x31b,0x600,0x3db8,0x602,0x3db4,0x606,0x3dc0,0x612,0x3dbc, -0x8646,0x3dc4,0xd822,0x6f,0x31b,0x600,0x3dba,0x602,0x3db6,0x606,0x3dc2,0x612,0x3dbe,0x8646,0x3dc6,0xd822, -0x55,0x31b,0x600,0x3dd4,0x602,0x3dd0,0x606,0x3ddc,0x612,0x3dd8,0x8646,0x3de0,0xd822,0x75,0x31b,0x600, -0x3dd6,0x602,0x3dd2,0x606,0x3dde,0x612,0x3dda,0x8646,0x3de2,0xca22,0x4f,0x328,0x8608,0x3d8,0xca22,0x6f, -0x328,0x8608,0x3da,0xe622,0x41,0x307,0x8608,0x3c0,0xe622,0x61,0x307,0x8608,0x3c2,0xca22,0x45,0x327, -0x860c,0x3c38,0xca22,0x65,0x327,0x860c,0x3c3a,0xe622,0x4f,0x307,0x8608,0x460,0xe622,0x6f,0x307,0x8608, -0x462,0xe622,0x3b1,0x301,0x868a,0x3f68,0xe622,0x3b7,0x301,0x868a,0x3f88,0xe622,0x3b9,0x308,0x600,0x3fa4, -0x602,0x720,0x8684,0x3fae,0xe622,0x3c5,0x308,0x600,0x3fc4,0x602,0x760,0x8684,0x3fce,0xe622,0x3c9,0x301, -0x868a,0x3fe8,0x22,0xcc6,0xcc2,0x99aa,0x1996,0x22,0xdd9,0xdcf,0x9b94,0x1bba,0xdc22,0x4c,0x323,0x8608, -0x3c70,0xdc22,0x6c,0x323,0x8608,0x3c72,0xdc22,0x52,0x323,0x8608,0x3cb8,0xdc22,0x72,0x323,0x8608,0x3cba, -0xdc22,0x53,0x323,0x860e,0x3cd0,0xdc22,0x73,0x323,0x860e,0x3cd2,0xdc22,0x41,0x323,0x604,0x3d58,0x860c, -0x3d6c,0xdc22,0x61,0x323,0x604,0x3d5a,0x860c,0x3d6e,0xdc22,0x45,0x323,0x8604,0x3d8c,0xdc22,0x65,0x323, -0x8604,0x3d8e,0xdc22,0x4f,0x323,0x8604,0x3db0,0xdc22,0x6f,0x323,0x8604,0x3db2,0xe622,0x3b1,0x313,0x600, -0x3e05,0x602,0x3e09,0x684,0x3e0d,0x868a,0x3f00,0xe622,0x3b1,0x314,0x600,0x3e07,0x602,0x3e0b,0x684,0x3e0f, -0x868a,0x3f02,0x1f00,0xe663,0x3b1,0x313,0x300,0x868a,0x3f04,0x1f01,0xe663,0x3b1,0x314,0x300,0x868a,0x3f06, -0x1f00,0xe663,0x3b1,0x313,0x301,0x868a,0x3f08,0x1f01,0xe663,0x3b1,0x314,0x301,0x868a,0x3f0a,0x1f00,0xe663, -0x3b1,0x313,0x342,0x868a,0x3f0c,0x1f01,0xe663,0x3b1,0x314,0x342,0x868a,0x3f0e,0xe622,0x391,0x313,0x600, -0x3e15,0x602,0x3e19,0x684,0x3e1d,0x868a,0x3f10,0xe622,0x391,0x314,0x600,0x3e17,0x602,0x3e1b,0x684,0x3e1f, -0x868a,0x3f12,0x1f08,0xe663,0x391,0x313,0x300,0x868a,0x3f14,0x1f09,0xe663,0x391,0x314,0x300,0x868a,0x3f16, -0x1f08,0xe663,0x391,0x313,0x301,0x868a,0x3f18,0x1f09,0xe663,0x391,0x314,0x301,0x868a,0x3f1a,0x1f08,0xe663, -0x391,0x313,0x342,0x868a,0x3f1c,0x1f09,0xe663,0x391,0x314,0x342,0x868a,0x3f1e,0xe622,0x3b5,0x313,0x600, -0x3e24,0x8602,0x3e28,0xe622,0x3b5,0x314,0x600,0x3e26,0x8602,0x3e2a,0xe622,0x395,0x313,0x600,0x3e34,0x8602, -0x3e38,0xe622,0x395,0x314,0x600,0x3e36,0x8602,0x3e3a,0xe622,0x3b7,0x313,0x600,0x3e45,0x602,0x3e49,0x684, -0x3e4d,0x868a,0x3f20,0xe622,0x3b7,0x314,0x600,0x3e47,0x602,0x3e4b,0x684,0x3e4f,0x868a,0x3f22,0x1f20,0xe663, -0x3b7,0x313,0x300,0x868a,0x3f24,0x1f21,0xe663,0x3b7,0x314,0x300,0x868a,0x3f26,0x1f20,0xe663,0x3b7,0x313, -0x301,0x868a,0x3f28,0x1f21,0xe663,0x3b7,0x314,0x301,0x868a,0x3f2a,0x1f20,0xe663,0x3b7,0x313,0x342,0x868a, -0x3f2c,0x1f21,0xe663,0x3b7,0x314,0x342,0x868a,0x3f2e,0xe622,0x397,0x313,0x600,0x3e55,0x602,0x3e59,0x684, -0x3e5d,0x868a,0x3f30,0xe622,0x397,0x314,0x600,0x3e57,0x602,0x3e5b,0x684,0x3e5f,0x868a,0x3f32,0x1f28,0xe663, -0x397,0x313,0x300,0x868a,0x3f34,0x1f29,0xe663,0x397,0x314,0x300,0x868a,0x3f36,0x1f28,0xe663,0x397,0x313, -0x301,0x868a,0x3f38,0x1f29,0xe663,0x397,0x314,0x301,0x868a,0x3f3a,0x1f28,0xe663,0x397,0x313,0x342,0x868a, -0x3f3c,0x1f29,0xe663,0x397,0x314,0x342,0x868a,0x3f3e,0xe622,0x3b9,0x313,0x600,0x3e64,0x602,0x3e68,0x8684, -0x3e6c,0xe622,0x3b9,0x314,0x600,0x3e66,0x602,0x3e6a,0x8684,0x3e6e,0xe622,0x399,0x313,0x600,0x3e74,0x602, -0x3e78,0x8684,0x3e7c,0xe622,0x399,0x314,0x600,0x3e76,0x602,0x3e7a,0x8684,0x3e7e,0xe622,0x3bf,0x313,0x600, -0x3e84,0x8602,0x3e88,0xe622,0x3bf,0x314,0x600,0x3e86,0x8602,0x3e8a,0xe622,0x39f,0x313,0x600,0x3e94,0x8602, -0x3e98,0xe622,0x39f,0x314,0x600,0x3e96,0x8602,0x3e9a,0xe622,0x3c5,0x313,0x600,0x3ea4,0x602,0x3ea8,0x8684, -0x3eac,0xe622,0x3c5,0x314,0x600,0x3ea6,0x602,0x3eaa,0x8684,0x3eae,0xe622,0x3a5,0x314,0x600,0x3eb6,0x602, -0x3eba,0x8684,0x3ebe,0xe622,0x3c9,0x313,0x600,0x3ec5,0x602,0x3ec9,0x684,0x3ecd,0x868a,0x3f40,0xe622,0x3c9, -0x314,0x600,0x3ec7,0x602,0x3ecb,0x684,0x3ecf,0x868a,0x3f42,0x1f60,0xe663,0x3c9,0x313,0x300,0x868a,0x3f44, -0x1f61,0xe663,0x3c9,0x314,0x300,0x868a,0x3f46,0x1f60,0xe663,0x3c9,0x313,0x301,0x868a,0x3f48,0x1f61,0xe663, -0x3c9,0x314,0x301,0x868a,0x3f4a,0x1f60,0xe663,0x3c9,0x313,0x342,0x868a,0x3f4c,0x1f61,0xe663,0x3c9,0x314, -0x342,0x868a,0x3f4e,0xe622,0x3a9,0x313,0x600,0x3ed5,0x602,0x3ed9,0x684,0x3edd,0x868a,0x3f50,0xe622,0x3a9, -0x314,0x600,0x3ed7,0x602,0x3edb,0x684,0x3edf,0x868a,0x3f52,0x1f68,0xe663,0x3a9,0x313,0x300,0x868a,0x3f54, -0x1f69,0xe663,0x3a9,0x314,0x300,0x868a,0x3f56,0x1f68,0xe663,0x3a9,0x313,0x301,0x868a,0x3f58,0x1f69,0xe663, -0x3a9,0x314,0x301,0x868a,0x3f5a,0x1f68,0xe663,0x3a9,0x313,0x342,0x868a,0x3f5c,0x1f69,0xe663,0x3a9,0x314, -0x342,0x868a,0x3f5e,0xe622,0x3b1,0x300,0x868a,0x3f64,0xe622,0x3b7,0x300,0x868a,0x3f84,0xe622,0x3c9,0x300, -0x868a,0x3fe4,0xe622,0x3b1,0x342,0x868a,0x3f6e,0xe622,0x3b7,0x342,0x868a,0x3f8e,0xe622,0x3c9,0x342,0x868a, -0x3fee,0xe622,0x41,0x300,0xe622,0x41,0x301,0xe622,0x41,0x303,0xe622,0x45,0x300,0xe622,0x45,0x301, -0xe622,0x45,0x308,0xe622,0x49,0x300,0xe622,0x49,0x301,0xe622,0x49,0x302,0xe622,0x4e,0x303,0xe622, -0x4f,0x300,0xe622,0x4f,0x301,0xe622,0x55,0x300,0xe622,0x55,0x301,0xe622,0x55,0x302,0xe622,0x59, -0x301,0xe622,0x61,0x300,0xe622,0x61,0x301,0xe622,0x61,0x303,0xe622,0x65,0x300,0xe622,0x65,0x301, -0xe622,0x65,0x308,0xe622,0x69,0x300,0xe622,0x69,0x301,0xe622,0x69,0x302,0xe622,0x6e,0x303,0xe622, -0x6f,0x300,0xe622,0x6f,0x301,0xe622,0x75,0x300,0xe622,0x75,0x301,0xe622,0x75,0x302,0xe622,0x79, -0x301,0xe622,0x79,0x308,0xe622,0x41,0x304,0xe622,0x61,0x304,0xca02,0x41,0x328,0xca02,0x61,0x328, -0xe622,0x43,0x301,0xe622,0x63,0x301,0xe622,0x43,0x302,0xe622,0x63,0x302,0xe622,0x43,0x307,0xe622, -0x63,0x307,0xe622,0x43,0x30c,0xe622,0x63,0x30c,0xe622,0x44,0x30c,0xe622,0x64,0x30c,0xe622,0x45, -0x306,0xe622,0x65,0x306,0xe622,0x45,0x307,0xe622,0x65,0x307,0xca02,0x45,0x328,0xca02,0x65,0x328, -0xe622,0x45,0x30c,0xe622,0x65,0x30c,0xe622,0x47,0x302,0xe622,0x67,0x302,0xe622,0x47,0x306,0xe622, -0x67,0x306,0xe622,0x47,0x307,0xe622,0x67,0x307,0xca02,0x47,0x327,0xca02,0x67,0x327,0xe622,0x48, -0x302,0xe622,0x68,0x302,0xe622,0x49,0x303,0xe622,0x69,0x303,0xe622,0x49,0x304,0xe622,0x69,0x304, -0xe622,0x49,0x306,0xe622,0x69,0x306,0xca02,0x49,0x328,0xca02,0x69,0x328,0xe622,0x49,0x307,0xe602, -0x4a,0x302,0xe602,0x6a,0x302,0xca02,0x4b,0x327,0xca02,0x6b,0x327,0xe622,0x4c,0x301,0xe622,0x6c, -0x301,0xca02,0x4c,0x327,0xca02,0x6c,0x327,0xe622,0x4c,0x30c,0xe622,0x6c,0x30c,0xe622,0x4e,0x301, -0xe622,0x6e,0x301,0xca02,0x4e,0x327,0xca02,0x6e,0x327,0xe622,0x4e,0x30c,0xe622,0x6e,0x30c,0xe622, -0x4f,0x306,0xe622,0x6f,0x306,0xe622,0x4f,0x30b,0xe622,0x6f,0x30b,0xe622,0x52,0x301,0xe622,0x72, -0x301,0xca02,0x52,0x327,0xca02,0x72,0x327,0xe622,0x52,0x30c,0xe622,0x72,0x30c,0xe622,0x53,0x302, -0xe622,0x73,0x302,0xca02,0x53,0x327,0xca02,0x73,0x327,0xca02,0x54,0x327,0xca02,0x74,0x327,0xe622, -0x54,0x30c,0xe622,0x74,0x30c,0xe622,0x55,0x306,0xe622,0x75,0x306,0xe622,0x55,0x30a,0xe622,0x75, -0x30a,0xe622,0x55,0x30b,0xe622,0x75,0x30b,0xca02,0x55,0x328,0xca02,0x75,0x328,0xe622,0x57,0x302, -0xe622,0x77,0x302,0xe622,0x59,0x302,0xe622,0x79,0x302,0xe622,0x59,0x308,0xe622,0x5a,0x301,0xe622, -0x7a,0x301,0xe622,0x5a,0x307,0xe622,0x7a,0x307,0xe622,0x5a,0x30c,0xe622,0x7a,0x30c,0xe622,0x41, -0x30c,0xe622,0x61,0x30c,0xe622,0x49,0x30c,0xe622,0x69,0x30c,0xe622,0x4f,0x30c,0xe622,0x6f,0x30c, -0xe622,0x55,0x30c,0xe622,0x75,0x30c,0xdc,0xe663,0x55,0x308,0x304,0xfc,0xe663,0x75,0x308,0x304, -0xdc,0xe663,0x55,0x308,0x301,0xfc,0xe663,0x75,0x308,0x301,0xdc,0xe663,0x55,0x308,0x30c,0xfc, -0xe663,0x75,0x308,0x30c,0xdc,0xe663,0x55,0x308,0x300,0xfc,0xe663,0x75,0x308,0x300,0xc4,0xe663, -0x41,0x308,0x304,0xe4,0xe663,0x61,0x308,0x304,0x226,0xe663,0x41,0x307,0x304,0x227,0xe663,0x61, -0x307,0x304,0xe602,0xc6,0x304,0xe602,0xe6,0x304,0xe622,0x47,0x30c,0xe622,0x67,0x30c,0xe622,0x4b, -0x30c,0xe622,0x6b,0x30c,0x1ea,0xe643,0x4f,0x328,0x304,0x1eb,0xe643,0x6f,0x328,0x304,0xe602,0x1b7, -0x30c,0xe602,0x292,0x30c,0xe602,0x6a,0x30c,0xe622,0x47,0x301,0xe622,0x67,0x301,0xe622,0x4e,0x300, -0xe622,0x6e,0x300,0xc5,0xe663,0x41,0x30a,0x301,0xe5,0xe663,0x61,0x30a,0x301,0xe602,0xc6,0x301, -0xe602,0xe6,0x301,0xe602,0xd8,0x301,0xe602,0xf8,0x301,0xe622,0x41,0x30f,0xe622,0x61,0x30f,0xe622, -0x41,0x311,0xe622,0x61,0x311,0xe622,0x45,0x30f,0xe622,0x65,0x30f,0xe622,0x45,0x311,0xe622,0x65, -0x311,0xe622,0x49,0x30f,0xe622,0x69,0x30f,0xe622,0x49,0x311,0xe622,0x69,0x311,0xe622,0x4f,0x30f, -0xe622,0x6f,0x30f,0xe622,0x4f,0x311,0xe622,0x6f,0x311,0xe622,0x52,0x30f,0xe622,0x72,0x30f,0xe622, -0x52,0x311,0xe622,0x72,0x311,0xe622,0x55,0x30f,0xe622,0x75,0x30f,0xe622,0x55,0x311,0xe622,0x75, -0x311,0xdc22,0x53,0x326,0xdc22,0x73,0x326,0xdc22,0x54,0x326,0xdc22,0x74,0x326,0xe622,0x48,0x30c, -0xe622,0x68,0x30c,0xd6,0xe663,0x4f,0x308,0x304,0xf6,0xe663,0x6f,0x308,0x304,0xd5,0xe663,0x4f, -0x303,0x304,0xf5,0xe663,0x6f,0x303,0x304,0x22e,0xe663,0x4f,0x307,0x304,0x22f,0xe663,0x6f,0x307, -0x304,0xe622,0x59,0x304,0xe622,0x79,0x304,0xe602,0xa8,0x301,0xe602,0x391,0x301,0xe602,0x395,0x301, -0xe602,0x397,0x301,0xe602,0x399,0x301,0xe602,0x39f,0x301,0xe602,0x3a5,0x301,0xe602,0x3a9,0x301,0x3ca, -0xe643,0x3b9,0x308,0x301,0xe602,0x399,0x308,0xe602,0x3a5,0x308,0xe602,0x3b5,0x301,0xe602,0x3b9,0x301, -0x3cb,0xe643,0x3c5,0x308,0x301,0xe602,0x3bf,0x301,0xe602,0x3c5,0x301,0xe602,0x3d2,0x301,0xe602,0x3d2, -0x308,0xe602,0x415,0x300,0xe602,0x415,0x308,0xe602,0x413,0x301,0xe602,0x406,0x308,0xe602,0x41a,0x301, -0xe602,0x418,0x300,0xe602,0x423,0x306,0xe602,0x418,0x306,0xe602,0x438,0x306,0xe602,0x435,0x300,0xe602, -0x435,0x308,0xe602,0x433,0x301,0xe602,0x456,0x308,0xe602,0x43a,0x301,0xe602,0x438,0x300,0xe602,0x443, -0x306,0xe602,0x474,0x30f,0xe602,0x475,0x30f,0xe602,0x416,0x306,0xe602,0x436,0x306,0xe602,0x410,0x306, -0xe602,0x430,0x306,0xe602,0x410,0x308,0xe602,0x430,0x308,0xe602,0x415,0x306,0xe602,0x435,0x306,0xe602, -0x4d8,0x308,0xe602,0x4d9,0x308,0xe602,0x416,0x308,0xe602,0x436,0x308,0xe602,0x417,0x308,0xe602,0x437, -0x308,0xe602,0x418,0x304,0xe602,0x438,0x304,0xe602,0x418,0x308,0xe602,0x438,0x308,0xe602,0x41e,0x308, -0xe602,0x43e,0x308,0xe602,0x4e8,0x308,0xe602,0x4e9,0x308,0xe602,0x42d,0x308,0xe602,0x44d,0x308,0xe602, -0x423,0x304,0xe602,0x443,0x304,0xe602,0x423,0x308,0xe602,0x443,0x308,0xe602,0x423,0x30b,0xe602,0x443, -0x30b,0xe602,0x427,0x308,0xe602,0x447,0x308,0xe602,0x42b,0x308,0xe602,0x44b,0x308,0xe622,0x627,0x653, -0xe622,0x627,0x654,0xe602,0x648,0x654,0xdc02,0x627,0x655,0xe602,0x64a,0x654,0xe602,0x6d5,0x654,0xe602, -0x6c1,0x654,0xe602,0x6d2,0x654,0x702,0x928,0x93c,0x702,0x930,0x93c,0x702,0x933,0x93c,2,0x9c7, -0x9be,2,0x9c7,0x9d7,2,0xb47,0xb56,2,0xb47,0xb3e,2,0xb47,0xb57,2,0xb92,0xbd7, -2,0xbc6,0xbbe,2,0xbc7,0xbbe,2,0xbc6,0xbd7,0x5b02,0xc46,0xc56,2,0xcbf,0xcd5,2, -0xcc6,0xcd5,2,0xcc6,0xcd6,0xcca,0x43,0xcc6,0xcc2,0xcd5,2,0xd46,0xd3e,2,0xd47,0xd3e, -2,0xd46,0xd57,0x902,0xdd9,0xdca,0xddc,0x943,0xdd9,0xdcf,0xdca,2,0xdd9,0xddf,2,0x1025, -0x102e,2,0x1b05,0x1b35,2,0x1b07,0x1b35,2,0x1b09,0x1b35,2,0x1b0b,0x1b35,2,0x1b0d,0x1b35, -2,0x1b11,0x1b35,2,0x1b3a,0x1b35,2,0x1b3c,0x1b35,2,0x1b3e,0x1b35,2,0x1b3f,0x1b35,2, -0x1b42,0x1b35,0xdc22,0x41,0x325,0xdc22,0x61,0x325,0xe622,0x42,0x307,0xe622,0x62,0x307,0xdc02,0x42, -0x323,0xdc02,0x62,0x323,0xdc02,0x42,0x331,0xdc02,0x62,0x331,0xc7,0xe643,0x43,0x327,0x301,0xe7, -0xe643,0x63,0x327,0x301,0xe622,0x44,0x307,0xe622,0x64,0x307,0xdc22,0x44,0x323,0xdc22,0x64,0x323, -0xdc22,0x44,0x331,0xdc22,0x64,0x331,0xca02,0x44,0x327,0xca02,0x64,0x327,0xdc22,0x44,0x32d,0xdc22, -0x64,0x32d,0x112,0xe663,0x45,0x304,0x300,0x113,0xe663,0x65,0x304,0x300,0x112,0xe663,0x45,0x304, -0x301,0x113,0xe663,0x65,0x304,0x301,0xdc22,0x45,0x32d,0xdc22,0x65,0x32d,0xdc22,0x45,0x330,0xdc22, -0x65,0x330,0x228,0xe643,0x45,0x327,0x306,0x229,0xe643,0x65,0x327,0x306,0xe602,0x46,0x307,0xe602, -0x66,0x307,0xe622,0x47,0x304,0xe622,0x67,0x304,0xe622,0x48,0x307,0xe622,0x68,0x307,0xdc22,0x48, -0x323,0xdc22,0x68,0x323,0xe622,0x48,0x308,0xe622,0x68,0x308,0xca02,0x48,0x327,0xca02,0x68,0x327, -0xdc22,0x48,0x32e,0xdc22,0x68,0x32e,0xdc22,0x49,0x330,0xdc22,0x69,0x330,0xcf,0xe663,0x49,0x308, -0x301,0xef,0xe663,0x69,0x308,0x301,0xe622,0x4b,0x301,0xe622,0x6b,0x301,0xdc22,0x4b,0x323,0xdc22, -0x6b,0x323,0xdc22,0x4b,0x331,0xdc22,0x6b,0x331,0x1e36,0xe663,0x4c,0x323,0x304,0x1e37,0xe663,0x6c, -0x323,0x304,0xdc22,0x4c,0x331,0xdc22,0x6c,0x331,0xdc22,0x4c,0x32d,0xdc22,0x6c,0x32d,0xe622,0x4d, -0x301,0xe622,0x6d,0x301,0xe622,0x4d,0x307,0xe622,0x6d,0x307,0xdc02,0x4d,0x323,0xdc02,0x6d,0x323, -0xe622,0x4e,0x307,0xe622,0x6e,0x307,0xdc22,0x4e,0x323,0xdc22,0x6e,0x323,0xdc22,0x4e,0x331,0xdc22, -0x6e,0x331,0xdc22,0x4e,0x32d,0xdc22,0x6e,0x32d,0xd5,0xe663,0x4f,0x303,0x301,0xf5,0xe663,0x6f, -0x303,0x301,0xd5,0xe663,0x4f,0x303,0x308,0xf5,0xe663,0x6f,0x303,0x308,0x14c,0xe663,0x4f,0x304, -0x300,0x14d,0xe663,0x6f,0x304,0x300,0x14c,0xe663,0x4f,0x304,0x301,0x14d,0xe663,0x6f,0x304,0x301, -0xe602,0x50,0x301,0xe602,0x70,0x301,0xe602,0x50,0x307,0xe602,0x70,0x307,0xe622,0x52,0x307,0xe622, -0x72,0x307,0x1e5a,0xe663,0x52,0x323,0x304,0x1e5b,0xe663,0x72,0x323,0x304,0xdc22,0x52,0x331,0xdc22, -0x72,0x331,0xe622,0x53,0x307,0xe622,0x73,0x307,0x15a,0xe663,0x53,0x301,0x307,0x15b,0xe663,0x73, -0x301,0x307,0x160,0xe663,0x53,0x30c,0x307,0x161,0xe663,0x73,0x30c,0x307,0x1e62,0xe663,0x53,0x323, -0x307,0x1e63,0xe663,0x73,0x323,0x307,0xe622,0x54,0x307,0xe622,0x74,0x307,0xdc22,0x54,0x323,0xdc22, -0x74,0x323,0xdc22,0x54,0x331,0xdc22,0x74,0x331,0xdc22,0x54,0x32d,0xdc22,0x74,0x32d,0xdc22,0x55, -0x324,0xdc22,0x75,0x324,0xdc22,0x55,0x330,0xdc22,0x75,0x330,0xdc22,0x55,0x32d,0xdc22,0x75,0x32d, -0x168,0xe663,0x55,0x303,0x301,0x169,0xe663,0x75,0x303,0x301,0x16a,0xe663,0x55,0x304,0x308,0x16b, -0xe663,0x75,0x304,0x308,0xe622,0x56,0x303,0xe622,0x76,0x303,0xdc02,0x56,0x323,0xdc02,0x76,0x323, -0xe622,0x57,0x300,0xe622,0x77,0x300,0xe622,0x57,0x301,0xe622,0x77,0x301,0xe622,0x57,0x308,0xe622, -0x77,0x308,0xe622,0x57,0x307,0xe622,0x77,0x307,0xdc02,0x57,0x323,0xdc02,0x77,0x323,0xe602,0x58, -0x307,0xe602,0x78,0x307,0xe602,0x58,0x308,0xe602,0x78,0x308,0xe622,0x59,0x307,0xe622,0x79,0x307, -0xe622,0x5a,0x302,0xe622,0x7a,0x302,0xdc02,0x5a,0x323,0xdc02,0x7a,0x323,0xdc02,0x5a,0x331,0xdc02, -0x7a,0x331,0xdc22,0x68,0x331,0xe622,0x74,0x308,0xe622,0x77,0x30a,0xe622,0x79,0x30a,0xe602,0x17f, -0x307,0xe622,0x41,0x309,0xe622,0x61,0x309,0xc2,0xe663,0x41,0x302,0x301,0xe2,0xe663,0x61,0x302, -0x301,0xc2,0xe663,0x41,0x302,0x300,0xe2,0xe663,0x61,0x302,0x300,0xc2,0xe663,0x41,0x302,0x309, -0xe2,0xe663,0x61,0x302,0x309,0xc2,0xe663,0x41,0x302,0x303,0xe2,0xe663,0x61,0x302,0x303,0x1ea0, -0xe663,0x41,0x323,0x302,0x1ea1,0xe663,0x61,0x323,0x302,0x102,0xe663,0x41,0x306,0x301,0x103,0xe663, -0x61,0x306,0x301,0x102,0xe663,0x41,0x306,0x300,0x103,0xe663,0x61,0x306,0x300,0x102,0xe663,0x41, -0x306,0x309,0x103,0xe663,0x61,0x306,0x309,0x102,0xe663,0x41,0x306,0x303,0x103,0xe663,0x61,0x306, -0x303,0x1ea0,0xe663,0x41,0x323,0x306,0x1ea1,0xe663,0x61,0x323,0x306,0xe622,0x45,0x309,0xe622,0x65, -0x309,0xe622,0x45,0x303,0xe622,0x65,0x303,0xca,0xe663,0x45,0x302,0x301,0xea,0xe663,0x65,0x302, -0x301,0xca,0xe663,0x45,0x302,0x300,0xea,0xe663,0x65,0x302,0x300,0xca,0xe663,0x45,0x302,0x309, -0xea,0xe663,0x65,0x302,0x309,0xca,0xe663,0x45,0x302,0x303,0xea,0xe663,0x65,0x302,0x303,0x1eb8, -0xe663,0x45,0x323,0x302,0x1eb9,0xe663,0x65,0x323,0x302,0xe622,0x49,0x309,0xe622,0x69,0x309,0xdc22, -0x49,0x323,0xdc22,0x69,0x323,0xe622,0x4f,0x309,0xe622,0x6f,0x309,0xd4,0xe663,0x4f,0x302,0x301, -0xf4,0xe663,0x6f,0x302,0x301,0xd4,0xe663,0x4f,0x302,0x300,0xf4,0xe663,0x6f,0x302,0x300,0xd4, -0xe663,0x4f,0x302,0x309,0xf4,0xe663,0x6f,0x302,0x309,0xd4,0xe663,0x4f,0x302,0x303,0xf4,0xe663, -0x6f,0x302,0x303,0x1ecc,0xe663,0x4f,0x323,0x302,0x1ecd,0xe663,0x6f,0x323,0x302,0x1a0,0xe663,0x4f, -0x31b,0x301,0x1a1,0xe663,0x6f,0x31b,0x301,0x1a0,0xe663,0x4f,0x31b,0x300,0x1a1,0xe663,0x6f,0x31b, -0x300,0x1a0,0xe663,0x4f,0x31b,0x309,0x1a1,0xe663,0x6f,0x31b,0x309,0x1a0,0xe663,0x4f,0x31b,0x303, -0x1a1,0xe663,0x6f,0x31b,0x303,0x1a0,0xdc63,0x4f,0x31b,0x323,0x1a1,0xdc63,0x6f,0x31b,0x323,0xdc22, -0x55,0x323,0xdc22,0x75,0x323,0xe622,0x55,0x309,0xe622,0x75,0x309,0x1af,0xe663,0x55,0x31b,0x301, -0x1b0,0xe663,0x75,0x31b,0x301,0x1af,0xe663,0x55,0x31b,0x300,0x1b0,0xe663,0x75,0x31b,0x300,0x1af, -0xe663,0x55,0x31b,0x309,0x1b0,0xe663,0x75,0x31b,0x309,0x1af,0xe663,0x55,0x31b,0x303,0x1b0,0xe663, -0x75,0x31b,0x303,0x1af,0xdc63,0x55,0x31b,0x323,0x1b0,0xdc63,0x75,0x31b,0x323,0xe622,0x59,0x300, -0xe622,0x79,0x300,0xdc02,0x59,0x323,0xdc02,0x79,0x323,0xe622,0x59,0x309,0xe622,0x79,0x309,0xe622, -0x59,0x303,0xe622,0x79,0x303,0x1f10,0xe643,0x3b5,0x313,0x300,0x1f11,0xe643,0x3b5,0x314,0x300,0x1f10, -0xe643,0x3b5,0x313,0x301,0x1f11,0xe643,0x3b5,0x314,0x301,0x1f18,0xe643,0x395,0x313,0x300,0x1f19,0xe643, -0x395,0x314,0x300,0x1f18,0xe643,0x395,0x313,0x301,0x1f19,0xe643,0x395,0x314,0x301,0x1f30,0xe643,0x3b9, -0x313,0x300,0x1f31,0xe643,0x3b9,0x314,0x300,0x1f30,0xe643,0x3b9,0x313,0x301,0x1f31,0xe643,0x3b9,0x314, -0x301,0x1f30,0xe643,0x3b9,0x313,0x342,0x1f31,0xe643,0x3b9,0x314,0x342,0x1f38,0xe643,0x399,0x313,0x300, -0x1f39,0xe643,0x399,0x314,0x300,0x1f38,0xe643,0x399,0x313,0x301,0x1f39,0xe643,0x399,0x314,0x301,0x1f38, -0xe643,0x399,0x313,0x342,0x1f39,0xe643,0x399,0x314,0x342,0x1f40,0xe643,0x3bf,0x313,0x300,0x1f41,0xe643, -0x3bf,0x314,0x300,0x1f40,0xe643,0x3bf,0x313,0x301,0x1f41,0xe643,0x3bf,0x314,0x301,0x1f48,0xe643,0x39f, -0x313,0x300,0x1f49,0xe643,0x39f,0x314,0x300,0x1f48,0xe643,0x39f,0x313,0x301,0x1f49,0xe643,0x39f,0x314, -0x301,0x1f50,0xe643,0x3c5,0x313,0x300,0x1f51,0xe643,0x3c5,0x314,0x300,0x1f50,0xe643,0x3c5,0x313,0x301, -0x1f51,0xe643,0x3c5,0x314,0x301,0x1f50,0xe643,0x3c5,0x313,0x342,0x1f51,0xe643,0x3c5,0x314,0x342,0x1f59, -0xe643,0x3a5,0x314,0x300,0x1f59,0xe643,0x3a5,0x314,0x301,0x1f59,0xe643,0x3a5,0x314,0x342,0xe602,0x3b5, -0x300,0xe602,0x3b9,0x300,0xe602,0x3bf,0x300,0xe602,0x3c5,0x300,0x1f00,0xf063,0x3b1,0x313,0x345,0x1f01, -0xf063,0x3b1,0x314,0x345,0x1f02,0x345,2,0xf044,0x3b1,0x313,0x300,0x345,0x1f03,0x345,2,0xf044, -0x3b1,0x314,0x300,0x345,0x1f04,0x345,2,0xf044,0x3b1,0x313,0x301,0x345,0x1f05,0x345,2,0xf044, -0x3b1,0x314,0x301,0x345,0x1f06,0x345,2,0xf044,0x3b1,0x313,0x342,0x345,0x1f07,0x345,2,0xf044, -0x3b1,0x314,0x342,0x345,0x1f08,0xf063,0x391,0x313,0x345,0x1f09,0xf063,0x391,0x314,0x345,0x1f0a,0x345, -2,0xf044,0x391,0x313,0x300,0x345,0x1f0b,0x345,2,0xf044,0x391,0x314,0x300,0x345,0x1f0c,0x345, -2,0xf044,0x391,0x313,0x301,0x345,0x1f0d,0x345,2,0xf044,0x391,0x314,0x301,0x345,0x1f0e,0x345, -2,0xf044,0x391,0x313,0x342,0x345,0x1f0f,0x345,2,0xf044,0x391,0x314,0x342,0x345,0x1f20,0xf063, -0x3b7,0x313,0x345,0x1f21,0xf063,0x3b7,0x314,0x345,0x1f22,0x345,2,0xf044,0x3b7,0x313,0x300,0x345, -0x1f23,0x345,2,0xf044,0x3b7,0x314,0x300,0x345,0x1f24,0x345,2,0xf044,0x3b7,0x313,0x301,0x345, -0x1f25,0x345,2,0xf044,0x3b7,0x314,0x301,0x345,0x1f26,0x345,2,0xf044,0x3b7,0x313,0x342,0x345, -0x1f27,0x345,2,0xf044,0x3b7,0x314,0x342,0x345,0x1f28,0xf063,0x397,0x313,0x345,0x1f29,0xf063,0x397, -0x314,0x345,0x1f2a,0x345,2,0xf044,0x397,0x313,0x300,0x345,0x1f2b,0x345,2,0xf044,0x397,0x314, -0x300,0x345,0x1f2c,0x345,2,0xf044,0x397,0x313,0x301,0x345,0x1f2d,0x345,2,0xf044,0x397,0x314, -0x301,0x345,0x1f2e,0x345,2,0xf044,0x397,0x313,0x342,0x345,0x1f2f,0x345,2,0xf044,0x397,0x314, -0x342,0x345,0x1f60,0xf063,0x3c9,0x313,0x345,0x1f61,0xf063,0x3c9,0x314,0x345,0x1f62,0x345,2,0xf044, -0x3c9,0x313,0x300,0x345,0x1f63,0x345,2,0xf044,0x3c9,0x314,0x300,0x345,0x1f64,0x345,2,0xf044, -0x3c9,0x313,0x301,0x345,0x1f65,0x345,2,0xf044,0x3c9,0x314,0x301,0x345,0x1f66,0x345,2,0xf044, -0x3c9,0x313,0x342,0x345,0x1f67,0x345,2,0xf044,0x3c9,0x314,0x342,0x345,0x1f68,0xf063,0x3a9,0x313, -0x345,0x1f69,0xf063,0x3a9,0x314,0x345,0x1f6a,0x345,2,0xf044,0x3a9,0x313,0x300,0x345,0x1f6b,0x345, -2,0xf044,0x3a9,0x314,0x300,0x345,0x1f6c,0x345,2,0xf044,0x3a9,0x313,0x301,0x345,0x1f6d,0x345, -2,0xf044,0x3a9,0x314,0x301,0x345,0x1f6e,0x345,2,0xf044,0x3a9,0x313,0x342,0x345,0x1f6f,0x345, -2,0xf044,0x3a9,0x314,0x342,0x345,0xe602,0x3b1,0x306,0xe602,0x3b1,0x304,0x1f70,0xf043,0x3b1,0x300, -0x345,0xf022,0x3b1,0x345,0x3ac,0xf043,0x3b1,0x301,0x345,0x1fb6,0xf043,0x3b1,0x342,0x345,0xe602,0x391, -0x306,0xe602,0x391,0x304,0xe602,0x391,0x300,0xf022,0x391,0x345,0xe602,0xa8,0x342,0x1f74,0xf043,0x3b7, -0x300,0x345,0xf022,0x3b7,0x345,0x3ae,0xf043,0x3b7,0x301,0x345,0x1fc6,0xf043,0x3b7,0x342,0x345,0xe602, -0x395,0x300,0xe602,0x397,0x300,0xf022,0x397,0x345,0xe602,0x1fbf,0x300,0xe602,0x1fbf,0x301,0xe602,0x1fbf, -0x342,0xe602,0x3b9,0x306,0xe602,0x3b9,0x304,0x3ca,0xe643,0x3b9,0x308,0x300,0xe602,0x3b9,0x342,0x3ca, -0xe643,0x3b9,0x308,0x342,0xe602,0x399,0x306,0xe602,0x399,0x304,0xe602,0x399,0x300,0xe602,0x1ffe,0x300, -0xe602,0x1ffe,0x301,0xe602,0x1ffe,0x342,0xe602,0x3c5,0x306,0xe602,0x3c5,0x304,0x3cb,0xe643,0x3c5,0x308, -0x300,0xe602,0x3c1,0x313,0xe602,0x3c1,0x314,0xe602,0x3c5,0x342,0x3cb,0xe643,0x3c5,0x308,0x342,0xe602, -0x3a5,0x306,0xe602,0x3a5,0x304,0xe602,0x3a5,0x300,0xe602,0x3a1,0x314,0xe602,0xa8,0x300,0x1f7c,0xf043, -0x3c9,0x300,0x345,0xf022,0x3c9,0x345,0x3ce,0xf043,0x3c9,0x301,0x345,0x1ff6,0xf043,0x3c9,0x342,0x345, -0xe602,0x39f,0x300,0xe602,0x3a9,0x300,0xf022,0x3a9,0x345,0x102,0x2190,0x338,0x102,0x2192,0x338,0x102, -0x2194,0x338,0x102,0x21d0,0x338,0x102,0x21d4,0x338,0x102,0x21d2,0x338,0x102,0x2203,0x338,0x102,0x2208, -0x338,0x102,0x220b,0x338,0x102,0x2223,0x338,0x102,0x2225,0x338,0x102,0x223c,0x338,0x102,0x2243,0x338, -0x102,0x2245,0x338,0x102,0x2248,0x338,0x102,0x3d,0x338,0x102,0x2261,0x338,0x102,0x224d,0x338,0x102, -0x3c,0x338,0x102,0x3e,0x338,0x102,0x2264,0x338,0x102,0x2265,0x338,0x102,0x2272,0x338,0x102,0x2273, -0x338,0x102,0x2276,0x338,0x102,0x2277,0x338,0x102,0x227a,0x338,0x102,0x227b,0x338,0x102,0x2282,0x338, -0x102,0x2283,0x338,0x102,0x2286,0x338,0x102,0x2287,0x338,0x102,0x22a2,0x338,0x102,0x22a8,0x338,0x102, -0x22a9,0x338,0x102,0x22ab,0x338,0x102,0x227c,0x338,0x102,0x227d,0x338,0x102,0x2291,0x338,0x102,0x2292, -0x338,0x102,0x22b2,0x338,0x102,0x22b3,0x338,0x102,0x22b4,0x338,0x102,0x22b5,0x338,0x802,0x304b,0x3099, -0x802,0x304d,0x3099,0x802,0x304f,0x3099,0x802,0x3051,0x3099,0x802,0x3053,0x3099,0x802,0x3055,0x3099,0x802, -0x3057,0x3099,0x802,0x3059,0x3099,0x802,0x305b,0x3099,0x802,0x305d,0x3099,0x802,0x305f,0x3099,0x802,0x3061, -0x3099,0x802,0x3064,0x3099,0x802,0x3066,0x3099,0x802,0x3068,0x3099,0x802,0x306f,0x3099,0x802,0x306f,0x309a, -0x802,0x3072,0x3099,0x802,0x3072,0x309a,0x802,0x3075,0x3099,0x802,0x3075,0x309a,0x802,0x3078,0x3099,0x802, -0x3078,0x309a,0x802,0x307b,0x3099,0x802,0x307b,0x309a,0x802,0x3046,0x3099,0x802,0x309d,0x3099,0x802,0x30ab, -0x3099,0x802,0x30ad,0x3099,0x802,0x30af,0x3099,0x802,0x30b1,0x3099,0x802,0x30b3,0x3099,0x802,0x30b5,0x3099, -0x802,0x30b7,0x3099,0x802,0x30b9,0x3099,0x802,0x30bb,0x3099,0x802,0x30bd,0x3099,0x802,0x30bf,0x3099,0x802, -0x30c1,0x3099,0x802,0x30c4,0x3099,0x802,0x30c6,0x3099,0x802,0x30c8,0x3099,0x802,0x30cf,0x3099,0x802,0x30cf, -0x309a,0x802,0x30d2,0x3099,0x802,0x30d2,0x309a,0x802,0x30d5,0x3099,0x802,0x30d5,0x309a,0x802,0x30d8,0x3099, -0x802,0x30d8,0x309a,0x802,0x30db,0x3099,0x802,0x30db,0x309a,0x802,0x30a6,0x3099,0x802,0x30ef,0x3099,0x802, -0x30f0,0x3099,0x802,0x30f1,0x3099,0x802,0x30f2,0x3099,0x802,0x30fd,0x3099,0x704,0xd804,0xdc99,0xd804,0xdcba, -0x704,0xd804,0xdc9b,0xd804,0xdcba,0x704,0xd804,0xdca5,0xd804,0xdcba,4,0xd804,0xdd31,0xd804,0xdd27,4, -0xd804,0xdd32,0xd804,0xdd27,4,0xd804,0xdf47,0xd804,0xdf3e,4,0xd804,0xdf47,0xd804,0xdf57,4,0xd805, -0xdcb9,0xd805,0xdcba,4,0xd805,0xdcb9,0xd805,0xdcb0,4,0xd805,0xdcb9,0xd805,0xdcbd,4,0xd805,0xddb8, -0xd805,0xddaf,4,0xd805,0xddb9,0xd805,0xddaf,0xe6e6,0xe6a1,0x300,0xe6e6,0xe6a1,0x301,0xe6e6,0xe6a1,0x313, -0xe6e6,0xe6a2,0x308,0x301,1,0x2b9,1,0x3b,1,0xb7,0x702,0x915,0x93c,0x702,0x916,0x93c, -0x702,0x917,0x93c,0x702,0x91c,0x93c,0x702,0x921,0x93c,0x702,0x922,0x93c,0x702,0x92b,0x93c,0x702, -0x92f,0x93c,0x702,0x9a1,0x9bc,0x702,0x9a2,0x9bc,0x702,0x9af,0x9bc,0x702,0xa32,0xa3c,0x702,0xa38, -0xa3c,0x702,0xa16,0xa3c,0x702,0xa17,0xa3c,0x702,0xa1c,0xa3c,0x702,0xa2b,0xa3c,0x702,0xb21,0xb3c, -0x702,0xb22,0xb3c,2,0xf42,0xfb7,2,0xf4c,0xfb7,2,0xf51,0xfb7,2,0xf56,0xfb7,2, -0xf5b,0xfb7,2,0xf40,0xfb5,0x8100,0x82a2,0xf71,0xf72,0x8100,0x84a2,0xf71,0xf74,0x8202,0xfb2,0xf80, -0x8202,0xfb3,0xf80,0x8100,0x82a2,0xf71,0xf80,2,0xf92,0xfb7,2,0xf9c,0xfb7,2,0xfa1,0xfb7, -2,0xfa6,0xfb7,2,0xfab,0xfb7,2,0xf90,0xfb5,0x3ac,0xe662,0x3b1,0x301,0x3ad,0xe642,0x3b5, -0x301,0x3ae,0xe662,0x3b7,0x301,0x3af,0xe642,0x3b9,0x301,0x3cc,0xe642,0x3bf,0x301,0x3cd,0xe642,0x3c5, -0x301,0x3ce,0xe662,0x3c9,0x301,0x386,0xe642,0x391,0x301,0x21,0x3b9,0x388,0xe642,0x395,0x301,0x389, -0xe642,0x397,0x301,0x390,1,0xe643,0x3b9,0x308,0x301,0x38a,0xe642,0x399,0x301,0x3b0,1,0xe643, -0x3c5,0x308,0x301,0x38e,0xe642,0x3a5,0x301,0x385,0xe642,0xa8,0x301,1,0x60,0x38c,0xe642,0x39f, -0x301,0x38f,0xe642,0x3a9,0x301,1,0xb4,0x21,0x3a9,0x21,0x4b,0xc5,0xe662,0x41,0x30a,1, -0x3008,1,0x3009,0x102,0x2add,0x338,1,0x8c48,1,0x66f4,1,0x8eca,1,0x8cc8,1,0x6ed1, -1,0x4e32,1,0x53e5,1,0x9f9c,1,0x5951,1,0x91d1,1,0x5587,1,0x5948,1,0x61f6, -1,0x7669,1,0x7f85,1,0x863f,1,0x87ba,1,0x88f8,1,0x908f,1,0x6a02,1,0x6d1b, -1,0x70d9,1,0x73de,1,0x843d,1,0x916a,1,0x99f1,1,0x4e82,1,0x5375,1,0x6b04, -1,0x721b,1,0x862d,1,0x9e1e,1,0x5d50,1,0x6feb,1,0x85cd,1,0x8964,1,0x62c9, -1,0x81d8,1,0x881f,1,0x5eca,1,0x6717,1,0x6d6a,1,0x72fc,1,0x90ce,1,0x4f86, -1,0x51b7,1,0x52de,1,0x64c4,1,0x6ad3,1,0x7210,1,0x76e7,1,0x8001,1,0x8606, -1,0x865c,1,0x8def,1,0x9732,1,0x9b6f,1,0x9dfa,1,0x788c,1,0x797f,1,0x7da0, -1,0x83c9,1,0x9304,1,0x9e7f,1,0x8ad6,1,0x58df,1,0x5f04,1,0x7c60,1,0x807e, -1,0x7262,1,0x78ca,1,0x8cc2,1,0x96f7,1,0x58d8,1,0x5c62,1,0x6a13,1,0x6dda, -1,0x6f0f,1,0x7d2f,1,0x7e37,1,0x964b,1,0x52d2,1,0x808b,1,0x51dc,1,0x51cc, -1,0x7a1c,1,0x7dbe,1,0x83f1,1,0x9675,1,0x8b80,1,0x62cf,1,0x8afe,1,0x4e39, -1,0x5be7,1,0x6012,1,0x7387,1,0x7570,1,0x5317,1,0x78fb,1,0x4fbf,1,0x5fa9, -1,0x4e0d,1,0x6ccc,1,0x6578,1,0x7d22,1,0x53c3,1,0x585e,1,0x7701,1,0x8449, -1,0x8aaa,1,0x6bba,1,0x8fb0,1,0x6c88,1,0x62fe,1,0x82e5,1,0x63a0,1,0x7565, -1,0x4eae,1,0x5169,1,0x51c9,1,0x6881,1,0x7ce7,1,0x826f,1,0x8ad2,1,0x91cf, -1,0x52f5,1,0x5442,1,0x5973,1,0x5eec,1,0x65c5,1,0x6ffe,1,0x792a,1,0x95ad, -1,0x9a6a,1,0x9e97,1,0x9ece,1,0x529b,1,0x66c6,1,0x6b77,1,0x8f62,1,0x5e74, -1,0x6190,1,0x6200,1,0x649a,1,0x6f23,1,0x7149,1,0x7489,1,0x79ca,1,0x7df4, -1,0x806f,1,0x8f26,1,0x84ee,1,0x9023,1,0x934a,1,0x5217,1,0x52a3,1,0x54bd, -1,0x70c8,1,0x88c2,1,0x5ec9,1,0x5ff5,1,0x637b,1,0x6bae,1,0x7c3e,1,0x7375, -1,0x4ee4,1,0x56f9,1,0x5dba,1,0x601c,1,0x73b2,1,0x7469,1,0x7f9a,1,0x8046, -1,0x9234,1,0x96f6,1,0x9748,1,0x9818,1,0x4f8b,1,0x79ae,1,0x91b4,1,0x96b8, -1,0x60e1,1,0x4e86,1,0x50da,1,0x5bee,1,0x5c3f,1,0x6599,1,0x71ce,1,0x7642, -1,0x84fc,1,0x907c,1,0x9f8d,1,0x6688,1,0x962e,1,0x5289,1,0x677b,1,0x67f3, -1,0x6d41,1,0x6e9c,1,0x7409,1,0x7559,1,0x786b,1,0x7d10,1,0x985e,1,0x516d, -1,0x622e,1,0x9678,1,0x502b,1,0x5d19,1,0x6dea,1,0x8f2a,1,0x5f8b,1,0x6144, -1,0x6817,1,0x9686,1,0x5229,1,0x540f,1,0x5c65,1,0x6613,1,0x674e,1,0x68a8, -1,0x6ce5,1,0x7406,1,0x75e2,1,0x7f79,1,0x88cf,1,0x88e1,1,0x91cc,1,0x96e2, -1,0x533f,1,0x6eba,1,0x541d,1,0x71d0,1,0x7498,1,0x85fa,1,0x96a3,1,0x9c57, -1,0x9e9f,1,0x6797,1,0x6dcb,1,0x81e8,1,0x7acb,1,0x7b20,1,0x7c92,1,0x72c0, -1,0x7099,1,0x8b58,1,0x4ec0,1,0x8336,1,0x523a,1,0x5207,1,0x5ea6,1,0x62d3, -1,0x7cd6,1,0x5b85,1,0x6d1e,1,0x66b4,1,0x8f3b,1,0x884c,1,0x964d,1,0x898b, -1,0x5ed3,1,0x5140,1,0x55c0,1,0x585a,1,0x6674,1,0x51de,1,0x732a,1,0x76ca, -1,0x793c,1,0x795e,1,0x7965,1,0x798f,1,0x9756,1,0x7cbe,1,0x7fbd,1,0x8612, -1,0x8af8,1,0x9038,1,0x90fd,1,0x98ef,1,0x98fc,1,0x9928,1,0x9db4,1,0x90de, -1,0x96b7,1,0x4fae,1,0x50e7,1,0x514d,1,0x52c9,1,0x52e4,1,0x5351,1,0x559d, -1,0x5606,1,0x5668,1,0x5840,1,0x58a8,1,0x5c64,1,0x5c6e,1,0x6094,1,0x6168, -1,0x618e,1,0x61f2,1,0x654f,1,0x65e2,1,0x6691,1,0x6885,1,0x6d77,1,0x6e1a, -1,0x6f22,1,0x716e,1,0x722b,1,0x7422,1,0x7891,1,0x793e,1,0x7949,1,0x7948, -1,0x7950,1,0x7956,1,0x795d,1,0x798d,1,0x798e,1,0x7a40,1,0x7a81,1,0x7bc0, -1,0x7e09,1,0x7e41,1,0x7f72,1,0x8005,1,0x81ed,1,0x8279,1,0x8457,1,0x8910, -1,0x8996,1,0x8b01,1,0x8b39,1,0x8cd3,1,0x8d08,1,0x8fb6,1,0x96e3,1,0x97ff, -1,0x983b,1,0x6075,2,0xd850,0xdeee,1,0x8218,1,0x4e26,1,0x51b5,1,0x5168,1, -0x4f80,1,0x5145,1,0x5180,1,0x52c7,1,0x52fa,1,0x5555,1,0x5599,1,0x55e2,1, -0x58b3,1,0x5944,1,0x5954,1,0x5a62,1,0x5b28,1,0x5ed2,1,0x5ed9,1,0x5f69,1, -0x5fad,1,0x60d8,1,0x614e,1,0x6108,1,0x6160,1,0x6234,1,0x63c4,1,0x641c,1, -0x6452,1,0x6556,1,0x671b,1,0x6756,1,0x6b79,1,0x6edb,1,0x6ecb,1,0x701e,1, -0x77a7,1,0x7235,1,0x72af,1,0x7471,1,0x7506,1,0x753b,1,0x761d,1,0x761f,1, -0x76db,1,0x76f4,1,0x774a,1,0x7740,1,0x78cc,1,0x7ab1,1,0x7c7b,1,0x7d5b,1, -0x7f3e,1,0x8352,1,0x83ef,1,0x8779,1,0x8941,1,0x8986,1,0x8abf,1,0x8acb,1, -0x8aed,1,0x8b8a,1,0x8f38,1,0x9072,1,0x9199,1,0x9276,1,0x967c,1,0x97db,1, -0x980b,1,0x9b12,2,0xd84a,0xdc4a,2,0xd84a,0xdc44,2,0xd84c,0xdfd5,1,0x3b9d,1,0x4018, -1,0x4039,2,0xd854,0xde49,2,0xd857,0xdcd0,2,0xd85f,0xded3,1,0x9f43,1,0x9f8e,0xe02, -0x5d9,0x5b4,0x1102,0x5f2,0x5b7,0x1802,0x5e9,0x5c1,0x1902,0x5e9,0x5c2,0xfb49,0x1843,0x5e9,0x5bc,0x5c1, -0xfb49,0x1943,0x5e9,0x5bc,0x5c2,0x1102,0x5d0,0x5b7,0x1202,0x5d0,0x5b8,0x1502,0x5d0,0x5bc,0x1502,0x5d1, -0x5bc,0x1502,0x5d2,0x5bc,0x1502,0x5d3,0x5bc,0x1502,0x5d4,0x5bc,0x1502,0x5d5,0x5bc,0x1502,0x5d6,0x5bc, -0x1502,0x5d8,0x5bc,0x1502,0x5d9,0x5bc,0x1502,0x5da,0x5bc,0x1502,0x5db,0x5bc,0x1502,0x5dc,0x5bc,0x1502, -0x5de,0x5bc,0x1502,0x5e0,0x5bc,0x1502,0x5e1,0x5bc,0x1502,0x5e3,0x5bc,0x1502,0x5e4,0x5bc,0x1502,0x5e6, -0x5bc,0x1502,0x5e7,0x5bc,0x1502,0x5e8,0x5bc,0x1502,0x5e9,0x5bc,0x1502,0x5ea,0x5bc,0x1302,0x5d5,0x5b9, -0x1702,0x5d1,0x5bf,0x1702,0x5db,0x5bf,0x1702,0x5e4,0x5bf,0xd804,0xd834,0xdd57,0xd834,0xdd65,0xd804,0xd834, -0xdd58,0xd834,0xdd65,0xd834,0xdd5f,0xd834,0xdd6e,4,0xd846,0xd834,0xdd58,0xd834,0xdd65,0xd834,0xdd6e,0xd834, -0xdd5f,0xd834,0xdd6f,4,0xd846,0xd834,0xdd58,0xd834,0xdd65,0xd834,0xdd6f,0xd834,0xdd5f,0xd834,0xdd70,4, -0xd846,0xd834,0xdd58,0xd834,0xdd65,0xd834,0xdd70,0xd834,0xdd5f,0xd834,0xdd71,4,0xd846,0xd834,0xdd58,0xd834, -0xdd65,0xd834,0xdd71,0xd834,0xdd5f,0xd834,0xdd72,4,0xd846,0xd834,0xdd58,0xd834,0xdd65,0xd834,0xdd72,0xd804, -0xd834,0xddb9,0xd834,0xdd65,0xd804,0xd834,0xddba,0xd834,0xdd65,0xd834,0xddbb,0xd834,0xdd6e,4,0xd846,0xd834, -0xddb9,0xd834,0xdd65,0xd834,0xdd6e,0xd834,0xddbc,0xd834,0xdd6e,4,0xd846,0xd834,0xddba,0xd834,0xdd65,0xd834, -0xdd6e,0xd834,0xddbb,0xd834,0xdd6f,4,0xd846,0xd834,0xddb9,0xd834,0xdd65,0xd834,0xdd6f,0xd834,0xddbc,0xd834, -0xdd6f,4,0xd846,0xd834,0xddba,0xd834,0xdd65,0xd834,0xdd6f,1,0x4e3d,1,0x4e38,1,0x4e41,2, -0xd840,0xdd22,1,0x4f60,1,0x4fbb,1,0x5002,1,0x507a,1,0x5099,1,0x50cf,1,0x349e, -2,0xd841,0xde3a,1,0x5154,1,0x5164,1,0x5177,2,0xd841,0xdd1c,1,0x34b9,1,0x5167, -1,0x518d,2,0xd841,0xdd4b,1,0x5197,1,0x51a4,1,0x4ecc,1,0x51ac,2,0xd864,0xdddf, -1,0x51f5,1,0x5203,1,0x34df,1,0x523b,1,0x5246,1,0x5272,1,0x5277,1,0x3515, -1,0x5305,1,0x5306,1,0x5349,1,0x535a,1,0x5373,1,0x537d,1,0x537f,2,0xd842, -0xde2c,1,0x7070,1,0x53ca,1,0x53df,2,0xd842,0xdf63,1,0x53eb,1,0x53f1,1,0x5406, -1,0x549e,1,0x5438,1,0x5448,1,0x5468,1,0x54a2,1,0x54f6,1,0x5510,1,0x5553, -1,0x5563,1,0x5584,1,0x55ab,1,0x55b3,1,0x55c2,1,0x5716,1,0x5717,1,0x5651, -1,0x5674,1,0x58ee,1,0x57ce,1,0x57f4,1,0x580d,1,0x578b,1,0x5832,1,0x5831, -1,0x58ac,2,0xd845,0xdce4,1,0x58f2,1,0x58f7,1,0x5906,1,0x591a,1,0x5922,1, -0x5962,2,0xd845,0xdea8,2,0xd845,0xdeea,1,0x59ec,1,0x5a1b,1,0x5a27,1,0x59d8,1, -0x5a66,1,0x36ee,1,0x36fc,1,0x5b08,1,0x5b3e,2,0xd846,0xddc8,1,0x5bc3,1,0x5bd8, -1,0x5bf3,2,0xd846,0xdf18,1,0x5bff,1,0x5c06,1,0x5f53,1,0x5c22,1,0x3781,1, -0x5c60,1,0x5cc0,1,0x5c8d,2,0xd847,0xdde4,1,0x5d43,2,0xd847,0xdde6,1,0x5d6e,1, -0x5d6b,1,0x5d7c,1,0x5de1,1,0x5de2,1,0x382f,1,0x5dfd,1,0x5e28,1,0x5e3d,1, -0x5e69,1,0x3862,2,0xd848,0xdd83,1,0x387c,1,0x5eb0,1,0x5eb3,1,0x5eb6,2,0xd868, -0xdf92,1,0x5efe,2,0xd848,0xdf31,1,0x8201,1,0x5f22,1,0x38c7,2,0xd84c,0xdeb8,2, -0xd858,0xddda,1,0x5f62,1,0x5f6b,1,0x38e3,1,0x5f9a,1,0x5fcd,1,0x5fd7,1,0x5ff9, -1,0x6081,1,0x393a,1,0x391c,2,0xd849,0xded4,1,0x60c7,1,0x6148,1,0x614c,1, -0x617a,1,0x61b2,1,0x61a4,1,0x61af,1,0x61de,1,0x6210,1,0x621b,1,0x625d,1, -0x62b1,1,0x62d4,1,0x6350,2,0xd84a,0xdf0c,1,0x633d,1,0x62fc,1,0x6368,1,0x6383, -1,0x63e4,2,0xd84a,0xdff1,1,0x6422,1,0x63c5,1,0x63a9,1,0x3a2e,1,0x6469,1, -0x647e,1,0x649d,1,0x6477,1,0x3a6c,1,0x656c,2,0xd84c,0xdc0a,1,0x65e3,1,0x66f8, -1,0x6649,1,0x3b19,1,0x3b08,1,0x3ae4,1,0x5192,1,0x5195,1,0x6700,1,0x669c, -1,0x80ad,1,0x43d9,1,0x6721,1,0x675e,1,0x6753,2,0xd84c,0xdfc3,1,0x3b49,1, -0x67fa,1,0x6785,1,0x6852,2,0xd84d,0xdc6d,1,0x688e,1,0x681f,1,0x6914,1,0x6942, -1,0x69a3,1,0x69ea,1,0x6aa8,2,0xd84d,0xdea3,1,0x6adb,1,0x3c18,1,0x6b21,2, -0xd84e,0xdca7,1,0x6b54,1,0x3c4e,1,0x6b72,1,0x6b9f,1,0x6bbb,2,0xd84e,0xde8d,2, -0xd847,0xdd0b,2,0xd84e,0xdefa,1,0x6c4e,2,0xd84f,0xdcbc,1,0x6cbf,1,0x6ccd,1,0x6c67, -1,0x6d16,1,0x6d3e,1,0x6d69,1,0x6d78,1,0x6d85,2,0xd84f,0xdd1e,1,0x6d34,1, -0x6e2f,1,0x6e6e,1,0x3d33,1,0x6ec7,2,0xd84f,0xded1,1,0x6df9,1,0x6f6e,2,0xd84f, -0xdf5e,2,0xd84f,0xdf8e,1,0x6fc6,1,0x7039,1,0x701b,1,0x3d96,1,0x704a,1,0x707d, -1,0x7077,1,0x70ad,2,0xd841,0xdd25,1,0x7145,2,0xd850,0xde63,1,0x719c,2,0xd850, -0xdfab,1,0x7228,1,0x7250,2,0xd851,0xde08,1,0x7280,1,0x7295,2,0xd851,0xdf35,2, -0xd852,0xdc14,1,0x737a,1,0x738b,1,0x3eac,1,0x73a5,1,0x3eb8,1,0x7447,1,0x745c, -1,0x7485,1,0x74ca,1,0x3f1b,1,0x7524,2,0xd853,0xdc36,1,0x753e,2,0xd853,0xdc92, -2,0xd848,0xdd9f,1,0x7610,2,0xd853,0xdfa1,2,0xd853,0xdfb8,2,0xd854,0xdc44,1,0x3ffc, -1,0x4008,2,0xd854,0xdcf3,2,0xd854,0xdcf2,2,0xd854,0xdd19,2,0xd854,0xdd33,1,0x771e, -1,0x771f,1,0x778b,1,0x4046,1,0x4096,2,0xd855,0xdc1d,1,0x784e,1,0x40e3,2, -0xd855,0xde26,2,0xd855,0xde9a,2,0xd855,0xdec5,1,0x79eb,1,0x412f,1,0x7a4a,1,0x7a4f, -2,0xd856,0xdd7c,2,0xd856,0xdea7,1,0x7aee,1,0x4202,2,0xd856,0xdfab,1,0x7bc6,1, -0x7bc9,1,0x4227,2,0xd857,0xdc80,1,0x7cd2,1,0x42a0,1,0x7ce8,1,0x7ce3,1,0x7d00, -2,0xd857,0xdf86,1,0x7d63,1,0x4301,1,0x7dc7,1,0x7e02,1,0x7e45,1,0x4334,2, -0xd858,0xde28,2,0xd858,0xde47,1,0x4359,2,0xd858,0xded9,1,0x7f7a,2,0xd858,0xdf3e,1, -0x7f95,1,0x7ffa,2,0xd859,0xdcda,2,0xd859,0xdd23,1,0x8060,2,0xd859,0xdda8,1,0x8070, -2,0xd84c,0xdf5f,1,0x43d5,1,0x80b2,1,0x8103,1,0x440b,1,0x813e,1,0x5ab5,2, -0xd859,0xdfa7,2,0xd859,0xdfb5,2,0xd84c,0xdf93,2,0xd84c,0xdf9c,1,0x8204,1,0x8f9e,1, -0x446b,1,0x8291,1,0x828b,1,0x829d,1,0x52b3,1,0x82b1,1,0x82b3,1,0x82bd,1, -0x82e6,2,0xd85a,0xdf3c,1,0x831d,1,0x8363,1,0x83ad,1,0x8323,1,0x83bd,1,0x83e7, -1,0x8353,1,0x83ca,1,0x83cc,1,0x83dc,2,0xd85b,0xdc36,2,0xd85b,0xdd6b,2,0xd85b, -0xdcd5,1,0x452b,1,0x84f1,1,0x84f3,1,0x8516,2,0xd85c,0xdfca,1,0x8564,2,0xd85b, -0xdf2c,1,0x455d,1,0x4561,2,0xd85b,0xdfb1,2,0xd85c,0xdcd2,1,0x456b,1,0x8650,1, -0x8667,1,0x8669,1,0x86a9,1,0x8688,1,0x870e,1,0x86e2,1,0x8728,1,0x876b,1, -0x8786,1,0x45d7,1,0x87e1,1,0x8801,1,0x45f9,1,0x8860,1,0x8863,2,0xd85d,0xde67, -1,0x88d7,1,0x88de,1,0x4635,1,0x88fa,1,0x34bb,2,0xd85e,0xdcae,2,0xd85e,0xdd66, -1,0x46be,1,0x46c7,1,0x8aa0,1,0x8c55,2,0xd85f,0xdca8,1,0x8cab,1,0x8cc1,1, -0x8d1b,1,0x8d77,2,0xd85f,0xdf2f,2,0xd842,0xdc04,1,0x8dcb,1,0x8dbc,1,0x8df0,2, -0xd842,0xdcde,1,0x8ed4,2,0xd861,0xddd2,2,0xd861,0xdded,1,0x9094,1,0x90f1,1,0x9111, -2,0xd861,0xdf2e,1,0x911b,1,0x9238,1,0x92d7,1,0x92d8,1,0x927c,1,0x93f9,1, -0x9415,2,0xd862,0xdffa,1,0x958b,1,0x4995,1,0x95b7,2,0xd863,0xdd77,1,0x49e6,1, -0x96c3,1,0x5db2,1,0x9723,2,0xd864,0xdd45,2,0xd864,0xde1a,1,0x4a6e,1,0x4a76,1, -0x97e0,2,0xd865,0xdc0a,1,0x4ab2,2,0xd865,0xdc96,1,0x9829,2,0xd865,0xddb6,1,0x98e2, -1,0x4b33,1,0x9929,1,0x99a7,1,0x99c2,1,0x99fe,1,0x4bce,2,0xd866,0xdf30,1, -0x9c40,1,0x9cfd,1,0x4cce,1,0x4ced,1,0x9d67,2,0xd868,0xdcce,1,0x4cf8,2,0xd868, -0xdd05,2,0xd868,0xde0e,2,0xd868,0xde91,1,0x9ebb,1,0x4d56,1,0x9ef9,1,0x9efe,1, -0x9f05,1,0x9f0f,1,0x9f16,1,0x9f3b,2,0xd869,0xde00 +0x2c02,0x2978,0x348b,0x2e82,0x2976,0xb48b,0x2f42,0x297c,0xb48b,0x6bc2,0x2b74,0xb48b,0x6bc2,0x2b76,2,0xe602, +0x41,0x302,0x600,0x3d4c,0x602,0x3d48,0x606,0x3d54,0x8612,0x3d50,0xe602,0x41,0x308,0x8608,0x3bc,0xe602, +0x41,0x30a,0x8602,0x3f4,0xca02,0x43,0x327,0x8602,0x3c10,0xe602,0x45,0x302,0x600,0x3d80,0x602,0x3d7c, +0x606,0x3d88,0x8612,0x3d84,0xe602,0x49,0x308,0x8602,0x3c5c,0xe602,0x4f,0x302,0x600,0x3da4,0x602,0x3da0, +0x606,0x3dac,0x8612,0x3da8,0xe602,0x4f,0x303,0x602,0x3c98,0x608,0x458,0x8610,0x3c9c,0xe602,0x4f,0x308, +0x8608,0x454,0xe602,0x55,0x308,0x600,0x3b6,0x602,0x3ae,0x608,0x3aa,0x8618,0x3b2,0xe602,0x61,0x302, +0x600,0x3d4e,0x602,0x3d4a,0x606,0x3d56,0x8612,0x3d52,0xe602,0x61,0x308,0x8608,0x3be,0xe602,0x61,0x30a, +0x8602,0x3f6,0xca02,0x63,0x327,0x8602,0x3c12,0xe602,0x65,0x302,0x600,0x3d82,0x602,0x3d7e,0x606,0x3d8a, +0x8612,0x3d86,0xe602,0x69,0x308,0x8602,0x3c5e,0xe602,0x6f,0x302,0x600,0x3da6,0x602,0x3da2,0x606,0x3dae, +0x8612,0x3daa,0xe602,0x6f,0x303,0x602,0x3c9a,0x608,0x45a,0x8610,0x3c9e,0xe602,0x6f,0x308,0x8608,0x456, +0xe602,0x75,0x308,0x600,0x3b8,0x602,0x3b0,0x608,0x3ac,0x8618,0x3b4,0xe602,0x41,0x306,0x600,0x3d60, +0x602,0x3d5c,0x606,0x3d68,0x8612,0x3d64,0xe602,0x61,0x306,0x600,0x3d62,0x602,0x3d5e,0x606,0x3d6a,0x8612, +0x3d66,0xe602,0x45,0x304,0x600,0x3c28,0x8602,0x3c2c,0xe602,0x65,0x304,0x600,0x3c2a,0x8602,0x3c2e,0xe602, +0x4f,0x304,0x600,0x3ca0,0x8602,0x3ca4,0xe602,0x6f,0x304,0x600,0x3ca2,0x8602,0x3ca6,0xe602,0x53,0x301, +0x860e,0x3cc8,0xe602,0x73,0x301,0x860e,0x3cca,0xe602,0x53,0x30c,0x860e,0x3ccc,0xe602,0x73,0x30c,0x860e, +0x3cce,0xe602,0x55,0x303,0x8602,0x3cf0,0xe602,0x75,0x303,0x8602,0x3cf2,0xe602,0x55,0x304,0x8610,0x3cf4, +0xe602,0x75,0x304,0x8610,0x3cf6,0xd802,0x4f,0x31b,0x600,0x3db8,0x602,0x3db4,0x606,0x3dc0,0x612,0x3dbc, +0x8646,0x3dc4,0xd802,0x6f,0x31b,0x600,0x3dba,0x602,0x3db6,0x606,0x3dc2,0x612,0x3dbe,0x8646,0x3dc6,0xd802, +0x55,0x31b,0x600,0x3dd4,0x602,0x3dd0,0x606,0x3ddc,0x612,0x3dd8,0x8646,0x3de0,0xd802,0x75,0x31b,0x600, +0x3dd6,0x602,0x3dd2,0x606,0x3dde,0x612,0x3dda,0x8646,0x3de2,0xca02,0x4f,0x328,0x8608,0x3d8,0xca02,0x6f, +0x328,0x8608,0x3da,0xe602,0x41,0x307,0x8608,0x3c0,0xe602,0x61,0x307,0x8608,0x3c2,0xca02,0x45,0x327, +0x860c,0x3c38,0xca02,0x65,0x327,0x860c,0x3c3a,0xe602,0x4f,0x307,0x8608,0x460,0xe602,0x6f,0x307,0x8608, +0x462,0xe602,0x3b1,0x301,0x868a,0x3f68,0xe602,0x3b7,0x301,0x868a,0x3f88,0xe602,0x3b9,0x308,0x600,0x3fa4, +0x602,0x720,0x8684,0x3fae,0xe602,0x3c5,0x308,0x600,0x3fc4,0x602,0x760,0x8684,0x3fce,0xe602,0x3c9,0x301, +0x868a,0x3fe8,2,0xcc6,0xcc2,0x99aa,0x1996,2,0xdd9,0xdcf,0x9b94,0x1bba,0xdc02,0x4c,0x323,0x8608, +0x3c70,0xdc02,0x6c,0x323,0x8608,0x3c72,0xdc02,0x52,0x323,0x8608,0x3cb8,0xdc02,0x72,0x323,0x8608,0x3cba, +0xdc02,0x53,0x323,0x860e,0x3cd0,0xdc02,0x73,0x323,0x860e,0x3cd2,0xdc02,0x41,0x323,0x604,0x3d58,0x860c, +0x3d6c,0xdc02,0x61,0x323,0x604,0x3d5a,0x860c,0x3d6e,0xdc02,0x45,0x323,0x8604,0x3d8c,0xdc02,0x65,0x323, +0x8604,0x3d8e,0xdc02,0x4f,0x323,0x8604,0x3db0,0xdc02,0x6f,0x323,0x8604,0x3db2,0xe602,0x3b1,0x313,0x600, +0x3e05,0x602,0x3e09,0x684,0x3e0d,0x868a,0x3f00,0xe602,0x3b1,0x314,0x600,0x3e07,0x602,0x3e0b,0x684,0x3e0f, +0x868a,0x3f02,0x1f00,0xe643,0x3b1,0x313,0x300,0x868a,0x3f04,0x1f01,0xe643,0x3b1,0x314,0x300,0x868a,0x3f06, +0x1f00,0xe643,0x3b1,0x313,0x301,0x868a,0x3f08,0x1f01,0xe643,0x3b1,0x314,0x301,0x868a,0x3f0a,0x1f00,0xe643, +0x3b1,0x313,0x342,0x868a,0x3f0c,0x1f01,0xe643,0x3b1,0x314,0x342,0x868a,0x3f0e,0xe602,0x391,0x313,0x600, +0x3e15,0x602,0x3e19,0x684,0x3e1d,0x868a,0x3f10,0xe602,0x391,0x314,0x600,0x3e17,0x602,0x3e1b,0x684,0x3e1f, +0x868a,0x3f12,0x1f08,0xe643,0x391,0x313,0x300,0x868a,0x3f14,0x1f09,0xe643,0x391,0x314,0x300,0x868a,0x3f16, +0x1f08,0xe643,0x391,0x313,0x301,0x868a,0x3f18,0x1f09,0xe643,0x391,0x314,0x301,0x868a,0x3f1a,0x1f08,0xe643, +0x391,0x313,0x342,0x868a,0x3f1c,0x1f09,0xe643,0x391,0x314,0x342,0x868a,0x3f1e,0xe602,0x3b5,0x313,0x600, +0x3e24,0x8602,0x3e28,0xe602,0x3b5,0x314,0x600,0x3e26,0x8602,0x3e2a,0xe602,0x395,0x313,0x600,0x3e34,0x8602, +0x3e38,0xe602,0x395,0x314,0x600,0x3e36,0x8602,0x3e3a,0xe602,0x3b7,0x313,0x600,0x3e45,0x602,0x3e49,0x684, +0x3e4d,0x868a,0x3f20,0xe602,0x3b7,0x314,0x600,0x3e47,0x602,0x3e4b,0x684,0x3e4f,0x868a,0x3f22,0x1f20,0xe643, +0x3b7,0x313,0x300,0x868a,0x3f24,0x1f21,0xe643,0x3b7,0x314,0x300,0x868a,0x3f26,0x1f20,0xe643,0x3b7,0x313, +0x301,0x868a,0x3f28,0x1f21,0xe643,0x3b7,0x314,0x301,0x868a,0x3f2a,0x1f20,0xe643,0x3b7,0x313,0x342,0x868a, +0x3f2c,0x1f21,0xe643,0x3b7,0x314,0x342,0x868a,0x3f2e,0xe602,0x397,0x313,0x600,0x3e55,0x602,0x3e59,0x684, +0x3e5d,0x868a,0x3f30,0xe602,0x397,0x314,0x600,0x3e57,0x602,0x3e5b,0x684,0x3e5f,0x868a,0x3f32,0x1f28,0xe643, +0x397,0x313,0x300,0x868a,0x3f34,0x1f29,0xe643,0x397,0x314,0x300,0x868a,0x3f36,0x1f28,0xe643,0x397,0x313, +0x301,0x868a,0x3f38,0x1f29,0xe643,0x397,0x314,0x301,0x868a,0x3f3a,0x1f28,0xe643,0x397,0x313,0x342,0x868a, +0x3f3c,0x1f29,0xe643,0x397,0x314,0x342,0x868a,0x3f3e,0xe602,0x3b9,0x313,0x600,0x3e64,0x602,0x3e68,0x8684, +0x3e6c,0xe602,0x3b9,0x314,0x600,0x3e66,0x602,0x3e6a,0x8684,0x3e6e,0xe602,0x399,0x313,0x600,0x3e74,0x602, +0x3e78,0x8684,0x3e7c,0xe602,0x399,0x314,0x600,0x3e76,0x602,0x3e7a,0x8684,0x3e7e,0xe602,0x3bf,0x313,0x600, +0x3e84,0x8602,0x3e88,0xe602,0x3bf,0x314,0x600,0x3e86,0x8602,0x3e8a,0xe602,0x39f,0x313,0x600,0x3e94,0x8602, +0x3e98,0xe602,0x39f,0x314,0x600,0x3e96,0x8602,0x3e9a,0xe602,0x3c5,0x313,0x600,0x3ea4,0x602,0x3ea8,0x8684, +0x3eac,0xe602,0x3c5,0x314,0x600,0x3ea6,0x602,0x3eaa,0x8684,0x3eae,0xe602,0x3a5,0x314,0x600,0x3eb6,0x602, +0x3eba,0x8684,0x3ebe,0xe602,0x3c9,0x313,0x600,0x3ec5,0x602,0x3ec9,0x684,0x3ecd,0x868a,0x3f40,0xe602,0x3c9, +0x314,0x600,0x3ec7,0x602,0x3ecb,0x684,0x3ecf,0x868a,0x3f42,0x1f60,0xe643,0x3c9,0x313,0x300,0x868a,0x3f44, +0x1f61,0xe643,0x3c9,0x314,0x300,0x868a,0x3f46,0x1f60,0xe643,0x3c9,0x313,0x301,0x868a,0x3f48,0x1f61,0xe643, +0x3c9,0x314,0x301,0x868a,0x3f4a,0x1f60,0xe643,0x3c9,0x313,0x342,0x868a,0x3f4c,0x1f61,0xe643,0x3c9,0x314, +0x342,0x868a,0x3f4e,0xe602,0x3a9,0x313,0x600,0x3ed5,0x602,0x3ed9,0x684,0x3edd,0x868a,0x3f50,0xe602,0x3a9, +0x314,0x600,0x3ed7,0x602,0x3edb,0x684,0x3edf,0x868a,0x3f52,0x1f68,0xe643,0x3a9,0x313,0x300,0x868a,0x3f54, +0x1f69,0xe643,0x3a9,0x314,0x300,0x868a,0x3f56,0x1f68,0xe643,0x3a9,0x313,0x301,0x868a,0x3f58,0x1f69,0xe643, +0x3a9,0x314,0x301,0x868a,0x3f5a,0x1f68,0xe643,0x3a9,0x313,0x342,0x868a,0x3f5c,0x1f69,0xe643,0x3a9,0x314, +0x342,0x868a,0x3f5e,0xe602,0x3b1,0x300,0x868a,0x3f64,0xe602,0x3b7,0x300,0x868a,0x3f84,0xe602,0x3c9,0x300, +0x868a,0x3fe4,0xe602,0x3b1,0x342,0x868a,0x3f6e,0xe602,0x3b7,0x342,0x868a,0x3f8e,0xe602,0x3c9,0x342,0x868a, +0x3fee,3,0xe602,0x41,0x300,0xe602,0x41,0x301,0xe602,0x41,0x303,0xe602,0x45,0x300,0xe602,0x45, +0x301,0xe602,0x45,0x308,0xe602,0x49,0x300,0xe602,0x49,0x301,0xe602,0x49,0x302,0xe602,0x4e,0x303, +0xe602,0x4f,0x300,0xe602,0x4f,0x301,0xe602,0x55,0x300,0xe602,0x55,0x301,0xe602,0x55,0x302,0xe602, +0x59,0x301,0xe602,0x61,0x300,0xe602,0x61,0x301,0xe602,0x61,0x303,0xe602,0x65,0x300,0xe602,0x65, +0x301,0xe602,0x65,0x308,0xe602,0x69,0x300,0xe602,0x69,0x301,0xe602,0x69,0x302,0xe602,0x6e,0x303, +0xe602,0x6f,0x300,0xe602,0x6f,0x301,0xe602,0x75,0x300,0xe602,0x75,0x301,0xe602,0x75,0x302,0xe602, +0x79,0x301,0xe602,0x79,0x308,0xe602,0x41,0x304,0xe602,0x61,0x304,0xca02,0x41,0x328,0xca02,0x61, +0x328,0xe602,0x43,0x301,0xe602,0x63,0x301,0xe602,0x43,0x302,0xe602,0x63,0x302,0xe602,0x43,0x307, +0xe602,0x63,0x307,0xe602,0x43,0x30c,0xe602,0x63,0x30c,0xe602,0x44,0x30c,0xe602,0x64,0x30c,0xe602, +0x45,0x306,0xe602,0x65,0x306,0xe602,0x45,0x307,0xe602,0x65,0x307,0xca02,0x45,0x328,0xca02,0x65, +0x328,0xe602,0x45,0x30c,0xe602,0x65,0x30c,0xe602,0x47,0x302,0xe602,0x67,0x302,0xe602,0x47,0x306, +0xe602,0x67,0x306,0xe602,0x47,0x307,0xe602,0x67,0x307,0xca02,0x47,0x327,0xca02,0x67,0x327,0xe602, +0x48,0x302,0xe602,0x68,0x302,0xe602,0x49,0x303,0xe602,0x69,0x303,0xe602,0x49,0x304,0xe602,0x69, +0x304,0xe602,0x49,0x306,0xe602,0x69,0x306,0xca02,0x49,0x328,0xca02,0x69,0x328,0xe602,0x49,0x307, +0xe602,0x4a,0x302,0xe602,0x6a,0x302,0xca02,0x4b,0x327,0xca02,0x6b,0x327,0xe602,0x4c,0x301,0xe602, +0x6c,0x301,0xca02,0x4c,0x327,0xca02,0x6c,0x327,0xe602,0x4c,0x30c,0xe602,0x6c,0x30c,0xe602,0x4e, +0x301,0xe602,0x6e,0x301,0xca02,0x4e,0x327,0xca02,0x6e,0x327,0xe602,0x4e,0x30c,0xe602,0x6e,0x30c, +0xe602,0x4f,0x306,0xe602,0x6f,0x306,0xe602,0x4f,0x30b,0xe602,0x6f,0x30b,0xe602,0x52,0x301,0xe602, +0x72,0x301,0xca02,0x52,0x327,0xca02,0x72,0x327,0xe602,0x52,0x30c,0xe602,0x72,0x30c,0xe602,0x53, +0x302,0xe602,0x73,0x302,0xca02,0x53,0x327,0xca02,0x73,0x327,0xca02,0x54,0x327,0xca02,0x74,0x327, +0xe602,0x54,0x30c,0xe602,0x74,0x30c,0xe602,0x55,0x306,0xe602,0x75,0x306,0xe602,0x55,0x30a,0xe602, +0x75,0x30a,0xe602,0x55,0x30b,0xe602,0x75,0x30b,0xca02,0x55,0x328,0xca02,0x75,0x328,0xe602,0x57, +0x302,0xe602,0x77,0x302,0xe602,0x59,0x302,0xe602,0x79,0x302,0xe602,0x59,0x308,0xe602,0x5a,0x301, +0xe602,0x7a,0x301,0xe602,0x5a,0x307,0xe602,0x7a,0x307,0xe602,0x5a,0x30c,0xe602,0x7a,0x30c,0xe602, +0x41,0x30c,0xe602,0x61,0x30c,0xe602,0x49,0x30c,0xe602,0x69,0x30c,0xe602,0x4f,0x30c,0xe602,0x6f, +0x30c,0xe602,0x55,0x30c,0xe602,0x75,0x30c,0xdc,0xe643,0x55,0x308,0x304,0xfc,0xe643,0x75,0x308, +0x304,0xdc,0xe643,0x55,0x308,0x301,0xfc,0xe643,0x75,0x308,0x301,0xdc,0xe643,0x55,0x308,0x30c, +0xfc,0xe643,0x75,0x308,0x30c,0xdc,0xe643,0x55,0x308,0x300,0xfc,0xe643,0x75,0x308,0x300,0xc4, +0xe643,0x41,0x308,0x304,0xe4,0xe643,0x61,0x308,0x304,0x226,0xe643,0x41,0x307,0x304,0x227,0xe643, +0x61,0x307,0x304,0xe602,0xc6,0x304,0xe602,0xe6,0x304,0xe602,0x47,0x30c,0xe602,0x67,0x30c,0xe602, +0x4b,0x30c,0xe602,0x6b,0x30c,0x1ea,0xe643,0x4f,0x328,0x304,0x1eb,0xe643,0x6f,0x328,0x304,0xe602, +0x1b7,0x30c,0xe602,0x292,0x30c,0xe602,0x6a,0x30c,0xe602,0x47,0x301,0xe602,0x67,0x301,0xe602,0x4e, +0x300,0xe602,0x6e,0x300,0xc5,0xe643,0x41,0x30a,0x301,0xe5,0xe643,0x61,0x30a,0x301,0xe602,0xc6, +0x301,0xe602,0xe6,0x301,0xe602,0xd8,0x301,0xe602,0xf8,0x301,0xe602,0x41,0x30f,0xe602,0x61,0x30f, +0xe602,0x41,0x311,0xe602,0x61,0x311,0xe602,0x45,0x30f,0xe602,0x65,0x30f,0xe602,0x45,0x311,0xe602, +0x65,0x311,0xe602,0x49,0x30f,0xe602,0x69,0x30f,0xe602,0x49,0x311,0xe602,0x69,0x311,0xe602,0x4f, +0x30f,0xe602,0x6f,0x30f,0xe602,0x4f,0x311,0xe602,0x6f,0x311,0xe602,0x52,0x30f,0xe602,0x72,0x30f, +0xe602,0x52,0x311,0xe602,0x72,0x311,0xe602,0x55,0x30f,0xe602,0x75,0x30f,0xe602,0x55,0x311,0xe602, +0x75,0x311,0xdc02,0x53,0x326,0xdc02,0x73,0x326,0xdc02,0x54,0x326,0xdc02,0x74,0x326,0xe602,0x48, +0x30c,0xe602,0x68,0x30c,0xd6,0xe643,0x4f,0x308,0x304,0xf6,0xe643,0x6f,0x308,0x304,0xd5,0xe643, +0x4f,0x303,0x304,0xf5,0xe643,0x6f,0x303,0x304,0x22e,0xe643,0x4f,0x307,0x304,0x22f,0xe643,0x6f, +0x307,0x304,0xe602,0x59,0x304,0xe602,0x79,0x304,0xe602,0xa8,0x301,0xe602,0x391,0x301,0xe602,0x395, +0x301,0xe602,0x397,0x301,0xe602,0x399,0x301,0xe602,0x39f,0x301,0xe602,0x3a5,0x301,0xe602,0x3a9,0x301, +0x3ca,0xe643,0x3b9,0x308,0x301,0xe602,0x399,0x308,0xe602,0x3a5,0x308,0xe602,0x3b5,0x301,0xe602,0x3b9, +0x301,0x3cb,0xe643,0x3c5,0x308,0x301,0xe602,0x3bf,0x301,0xe602,0x3c5,0x301,0xe602,0x3d2,0x301,0xe602, +0x3d2,0x308,0xe602,0x415,0x300,0xe602,0x415,0x308,0xe602,0x413,0x301,0xe602,0x406,0x308,0xe602,0x41a, +0x301,0xe602,0x418,0x300,0xe602,0x423,0x306,0xe602,0x418,0x306,0xe602,0x438,0x306,0xe602,0x435,0x300, +0xe602,0x435,0x308,0xe602,0x433,0x301,0xe602,0x456,0x308,0xe602,0x43a,0x301,0xe602,0x438,0x300,0xe602, +0x443,0x306,0xe602,0x474,0x30f,0xe602,0x475,0x30f,0xe602,0x416,0x306,0xe602,0x436,0x306,0xe602,0x410, +0x306,0xe602,0x430,0x306,0xe602,0x410,0x308,0xe602,0x430,0x308,0xe602,0x415,0x306,0xe602,0x435,0x306, +0xe602,0x4d8,0x308,0xe602,0x4d9,0x308,0xe602,0x416,0x308,0xe602,0x436,0x308,0xe602,0x417,0x308,0xe602, +0x437,0x308,0xe602,0x418,0x304,0xe602,0x438,0x304,0xe602,0x418,0x308,0xe602,0x438,0x308,0xe602,0x41e, +0x308,0xe602,0x43e,0x308,0xe602,0x4e8,0x308,0xe602,0x4e9,0x308,0xe602,0x42d,0x308,0xe602,0x44d,0x308, +0xe602,0x423,0x304,0xe602,0x443,0x304,0xe602,0x423,0x308,0xe602,0x443,0x308,0xe602,0x423,0x30b,0xe602, +0x443,0x30b,0xe602,0x427,0x308,0xe602,0x447,0x308,0xe602,0x42b,0x308,0xe602,0x44b,0x308,0xe602,0x627, +0x653,0xe602,0x627,0x654,0xe602,0x648,0x654,0xdc02,0x627,0x655,0xe602,0x64a,0x654,0xe602,0x6d5,0x654, +0xe602,0x6c1,0x654,0xe602,0x6d2,0x654,0x702,0x928,0x93c,0x702,0x930,0x93c,0x702,0x933,0x93c,2, +0x9c7,0x9be,2,0x9c7,0x9d7,2,0xb47,0xb56,2,0xb47,0xb3e,2,0xb47,0xb57,2,0xb92, +0xbd7,2,0xbc6,0xbbe,2,0xbc7,0xbbe,2,0xbc6,0xbd7,0x5b02,0xc46,0xc56,2,0xcbf,0xcd5, +2,0xcc6,0xcd5,2,0xcc6,0xcd6,0xcca,0x43,0xcc6,0xcc2,0xcd5,2,0xd46,0xd3e,2,0xd47, +0xd3e,2,0xd46,0xd57,0x902,0xdd9,0xdca,0xddc,0x943,0xdd9,0xdcf,0xdca,2,0xdd9,0xddf,2, +0x1025,0x102e,2,0x1b05,0x1b35,2,0x1b07,0x1b35,2,0x1b09,0x1b35,2,0x1b0b,0x1b35,2,0x1b0d, +0x1b35,2,0x1b11,0x1b35,2,0x1b3a,0x1b35,2,0x1b3c,0x1b35,2,0x1b3e,0x1b35,2,0x1b3f,0x1b35, +2,0x1b42,0x1b35,0xdc02,0x41,0x325,0xdc02,0x61,0x325,0xe602,0x42,0x307,0xe602,0x62,0x307,0xdc02, +0x42,0x323,0xdc02,0x62,0x323,0xdc02,0x42,0x331,0xdc02,0x62,0x331,0xc7,0xe643,0x43,0x327,0x301, +0xe7,0xe643,0x63,0x327,0x301,0xe602,0x44,0x307,0xe602,0x64,0x307,0xdc02,0x44,0x323,0xdc02,0x64, +0x323,0xdc02,0x44,0x331,0xdc02,0x64,0x331,0xca02,0x44,0x327,0xca02,0x64,0x327,0xdc02,0x44,0x32d, +0xdc02,0x64,0x32d,0x112,0xe643,0x45,0x304,0x300,0x113,0xe643,0x65,0x304,0x300,0x112,0xe643,0x45, +0x304,0x301,0x113,0xe643,0x65,0x304,0x301,0xdc02,0x45,0x32d,0xdc02,0x65,0x32d,0xdc02,0x45,0x330, +0xdc02,0x65,0x330,0x228,0xe643,0x45,0x327,0x306,0x229,0xe643,0x65,0x327,0x306,0xe602,0x46,0x307, +0xe602,0x66,0x307,0xe602,0x47,0x304,0xe602,0x67,0x304,0xe602,0x48,0x307,0xe602,0x68,0x307,0xdc02, +0x48,0x323,0xdc02,0x68,0x323,0xe602,0x48,0x308,0xe602,0x68,0x308,0xca02,0x48,0x327,0xca02,0x68, +0x327,0xdc02,0x48,0x32e,0xdc02,0x68,0x32e,0xdc02,0x49,0x330,0xdc02,0x69,0x330,0xcf,0xe643,0x49, +0x308,0x301,0xef,0xe643,0x69,0x308,0x301,0xe602,0x4b,0x301,0xe602,0x6b,0x301,0xdc02,0x4b,0x323, +0xdc02,0x6b,0x323,0xdc02,0x4b,0x331,0xdc02,0x6b,0x331,0x1e36,0xe643,0x4c,0x323,0x304,0x1e37,0xe643, +0x6c,0x323,0x304,0xdc02,0x4c,0x331,0xdc02,0x6c,0x331,0xdc02,0x4c,0x32d,0xdc02,0x6c,0x32d,0xe602, +0x4d,0x301,0xe602,0x6d,0x301,0xe602,0x4d,0x307,0xe602,0x6d,0x307,0xdc02,0x4d,0x323,0xdc02,0x6d, +0x323,0xe602,0x4e,0x307,0xe602,0x6e,0x307,0xdc02,0x4e,0x323,0xdc02,0x6e,0x323,0xdc02,0x4e,0x331, +0xdc02,0x6e,0x331,0xdc02,0x4e,0x32d,0xdc02,0x6e,0x32d,0xd5,0xe643,0x4f,0x303,0x301,0xf5,0xe643, +0x6f,0x303,0x301,0xd5,0xe643,0x4f,0x303,0x308,0xf5,0xe643,0x6f,0x303,0x308,0x14c,0xe643,0x4f, +0x304,0x300,0x14d,0xe643,0x6f,0x304,0x300,0x14c,0xe643,0x4f,0x304,0x301,0x14d,0xe643,0x6f,0x304, +0x301,0xe602,0x50,0x301,0xe602,0x70,0x301,0xe602,0x50,0x307,0xe602,0x70,0x307,0xe602,0x52,0x307, +0xe602,0x72,0x307,0x1e5a,0xe643,0x52,0x323,0x304,0x1e5b,0xe643,0x72,0x323,0x304,0xdc02,0x52,0x331, +0xdc02,0x72,0x331,0xe602,0x53,0x307,0xe602,0x73,0x307,0x15a,0xe643,0x53,0x301,0x307,0x15b,0xe643, +0x73,0x301,0x307,0x160,0xe643,0x53,0x30c,0x307,0x161,0xe643,0x73,0x30c,0x307,0x1e62,0xe643,0x53, +0x323,0x307,0x1e63,0xe643,0x73,0x323,0x307,0xe602,0x54,0x307,0xe602,0x74,0x307,0xdc02,0x54,0x323, +0xdc02,0x74,0x323,0xdc02,0x54,0x331,0xdc02,0x74,0x331,0xdc02,0x54,0x32d,0xdc02,0x74,0x32d,0xdc02, +0x55,0x324,0xdc02,0x75,0x324,0xdc02,0x55,0x330,0xdc02,0x75,0x330,0xdc02,0x55,0x32d,0xdc02,0x75, +0x32d,0x168,0xe643,0x55,0x303,0x301,0x169,0xe643,0x75,0x303,0x301,0x16a,0xe643,0x55,0x304,0x308, +0x16b,0xe643,0x75,0x304,0x308,0xe602,0x56,0x303,0xe602,0x76,0x303,0xdc02,0x56,0x323,0xdc02,0x76, +0x323,0xe602,0x57,0x300,0xe602,0x77,0x300,0xe602,0x57,0x301,0xe602,0x77,0x301,0xe602,0x57,0x308, +0xe602,0x77,0x308,0xe602,0x57,0x307,0xe602,0x77,0x307,0xdc02,0x57,0x323,0xdc02,0x77,0x323,0xe602, +0x58,0x307,0xe602,0x78,0x307,0xe602,0x58,0x308,0xe602,0x78,0x308,0xe602,0x59,0x307,0xe602,0x79, +0x307,0xe602,0x5a,0x302,0xe602,0x7a,0x302,0xdc02,0x5a,0x323,0xdc02,0x7a,0x323,0xdc02,0x5a,0x331, +0xdc02,0x7a,0x331,0xdc02,0x68,0x331,0xe602,0x74,0x308,0xe602,0x77,0x30a,0xe602,0x79,0x30a,0xe602, +0x17f,0x307,0xe602,0x41,0x309,0xe602,0x61,0x309,0xc2,0xe643,0x41,0x302,0x301,0xe2,0xe643,0x61, +0x302,0x301,0xc2,0xe643,0x41,0x302,0x300,0xe2,0xe643,0x61,0x302,0x300,0xc2,0xe643,0x41,0x302, +0x309,0xe2,0xe643,0x61,0x302,0x309,0xc2,0xe643,0x41,0x302,0x303,0xe2,0xe643,0x61,0x302,0x303, +0x1ea0,0xe643,0x41,0x323,0x302,0x1ea1,0xe643,0x61,0x323,0x302,0x102,0xe643,0x41,0x306,0x301,0x103, +0xe643,0x61,0x306,0x301,0x102,0xe643,0x41,0x306,0x300,0x103,0xe643,0x61,0x306,0x300,0x102,0xe643, +0x41,0x306,0x309,0x103,0xe643,0x61,0x306,0x309,0x102,0xe643,0x41,0x306,0x303,0x103,0xe643,0x61, +0x306,0x303,0x1ea0,0xe643,0x41,0x323,0x306,0x1ea1,0xe643,0x61,0x323,0x306,0xe602,0x45,0x309,0xe602, +0x65,0x309,0xe602,0x45,0x303,0xe602,0x65,0x303,0xca,0xe643,0x45,0x302,0x301,0xea,0xe643,0x65, +0x302,0x301,0xca,0xe643,0x45,0x302,0x300,0xea,0xe643,0x65,0x302,0x300,0xca,0xe643,0x45,0x302, +0x309,0xea,0xe643,0x65,0x302,0x309,0xca,0xe643,0x45,0x302,0x303,0xea,0xe643,0x65,0x302,0x303, +0x1eb8,0xe643,0x45,0x323,0x302,0x1eb9,0xe643,0x65,0x323,0x302,0xe602,0x49,0x309,0xe602,0x69,0x309, +0xdc02,0x49,0x323,0xdc02,0x69,0x323,0xe602,0x4f,0x309,0xe602,0x6f,0x309,0xd4,0xe643,0x4f,0x302, +0x301,0xf4,0xe643,0x6f,0x302,0x301,0xd4,0xe643,0x4f,0x302,0x300,0xf4,0xe643,0x6f,0x302,0x300, +0xd4,0xe643,0x4f,0x302,0x309,0xf4,0xe643,0x6f,0x302,0x309,0xd4,0xe643,0x4f,0x302,0x303,0xf4, +0xe643,0x6f,0x302,0x303,0x1ecc,0xe643,0x4f,0x323,0x302,0x1ecd,0xe643,0x6f,0x323,0x302,0x1a0,0xe643, +0x4f,0x31b,0x301,0x1a1,0xe643,0x6f,0x31b,0x301,0x1a0,0xe643,0x4f,0x31b,0x300,0x1a1,0xe643,0x6f, +0x31b,0x300,0x1a0,0xe643,0x4f,0x31b,0x309,0x1a1,0xe643,0x6f,0x31b,0x309,0x1a0,0xe643,0x4f,0x31b, +0x303,0x1a1,0xe643,0x6f,0x31b,0x303,0x1a0,0xdc43,0x4f,0x31b,0x323,0x1a1,0xdc43,0x6f,0x31b,0x323, +0xdc02,0x55,0x323,0xdc02,0x75,0x323,0xe602,0x55,0x309,0xe602,0x75,0x309,0x1af,0xe643,0x55,0x31b, +0x301,0x1b0,0xe643,0x75,0x31b,0x301,0x1af,0xe643,0x55,0x31b,0x300,0x1b0,0xe643,0x75,0x31b,0x300, +0x1af,0xe643,0x55,0x31b,0x309,0x1b0,0xe643,0x75,0x31b,0x309,0x1af,0xe643,0x55,0x31b,0x303,0x1b0, +0xe643,0x75,0x31b,0x303,0x1af,0xdc43,0x55,0x31b,0x323,0x1b0,0xdc43,0x75,0x31b,0x323,0xe602,0x59, +0x300,0xe602,0x79,0x300,0xdc02,0x59,0x323,0xdc02,0x79,0x323,0xe602,0x59,0x309,0xe602,0x79,0x309, +0xe602,0x59,0x303,0xe602,0x79,0x303,0x1f10,0xe643,0x3b5,0x313,0x300,0x1f11,0xe643,0x3b5,0x314,0x300, +0x1f10,0xe643,0x3b5,0x313,0x301,0x1f11,0xe643,0x3b5,0x314,0x301,0x1f18,0xe643,0x395,0x313,0x300,0x1f19, +0xe643,0x395,0x314,0x300,0x1f18,0xe643,0x395,0x313,0x301,0x1f19,0xe643,0x395,0x314,0x301,0x1f30,0xe643, +0x3b9,0x313,0x300,0x1f31,0xe643,0x3b9,0x314,0x300,0x1f30,0xe643,0x3b9,0x313,0x301,0x1f31,0xe643,0x3b9, +0x314,0x301,0x1f30,0xe643,0x3b9,0x313,0x342,0x1f31,0xe643,0x3b9,0x314,0x342,0x1f38,0xe643,0x399,0x313, +0x300,0x1f39,0xe643,0x399,0x314,0x300,0x1f38,0xe643,0x399,0x313,0x301,0x1f39,0xe643,0x399,0x314,0x301, +0x1f38,0xe643,0x399,0x313,0x342,0x1f39,0xe643,0x399,0x314,0x342,0x1f40,0xe643,0x3bf,0x313,0x300,0x1f41, +0xe643,0x3bf,0x314,0x300,0x1f40,0xe643,0x3bf,0x313,0x301,0x1f41,0xe643,0x3bf,0x314,0x301,0x1f48,0xe643, +0x39f,0x313,0x300,0x1f49,0xe643,0x39f,0x314,0x300,0x1f48,0xe643,0x39f,0x313,0x301,0x1f49,0xe643,0x39f, +0x314,0x301,0x1f50,0xe643,0x3c5,0x313,0x300,0x1f51,0xe643,0x3c5,0x314,0x300,0x1f50,0xe643,0x3c5,0x313, +0x301,0x1f51,0xe643,0x3c5,0x314,0x301,0x1f50,0xe643,0x3c5,0x313,0x342,0x1f51,0xe643,0x3c5,0x314,0x342, +0x1f59,0xe643,0x3a5,0x314,0x300,0x1f59,0xe643,0x3a5,0x314,0x301,0x1f59,0xe643,0x3a5,0x314,0x342,0xe602, +0x3b5,0x300,0xe602,0x3b9,0x300,0xe602,0x3bf,0x300,0xe602,0x3c5,0x300,0x1f00,0xf043,0x3b1,0x313,0x345, +0x1f01,0xf043,0x3b1,0x314,0x345,0x1f02,0x345,2,0xf044,0x3b1,0x313,0x300,0x345,0x1f03,0x345,2, +0xf044,0x3b1,0x314,0x300,0x345,0x1f04,0x345,2,0xf044,0x3b1,0x313,0x301,0x345,0x1f05,0x345,2, +0xf044,0x3b1,0x314,0x301,0x345,0x1f06,0x345,2,0xf044,0x3b1,0x313,0x342,0x345,0x1f07,0x345,2, +0xf044,0x3b1,0x314,0x342,0x345,0x1f08,0xf043,0x391,0x313,0x345,0x1f09,0xf043,0x391,0x314,0x345,0x1f0a, +0x345,2,0xf044,0x391,0x313,0x300,0x345,0x1f0b,0x345,2,0xf044,0x391,0x314,0x300,0x345,0x1f0c, +0x345,2,0xf044,0x391,0x313,0x301,0x345,0x1f0d,0x345,2,0xf044,0x391,0x314,0x301,0x345,0x1f0e, +0x345,2,0xf044,0x391,0x313,0x342,0x345,0x1f0f,0x345,2,0xf044,0x391,0x314,0x342,0x345,0x1f20, +0xf043,0x3b7,0x313,0x345,0x1f21,0xf043,0x3b7,0x314,0x345,0x1f22,0x345,2,0xf044,0x3b7,0x313,0x300, +0x345,0x1f23,0x345,2,0xf044,0x3b7,0x314,0x300,0x345,0x1f24,0x345,2,0xf044,0x3b7,0x313,0x301, +0x345,0x1f25,0x345,2,0xf044,0x3b7,0x314,0x301,0x345,0x1f26,0x345,2,0xf044,0x3b7,0x313,0x342, +0x345,0x1f27,0x345,2,0xf044,0x3b7,0x314,0x342,0x345,0x1f28,0xf043,0x397,0x313,0x345,0x1f29,0xf043, +0x397,0x314,0x345,0x1f2a,0x345,2,0xf044,0x397,0x313,0x300,0x345,0x1f2b,0x345,2,0xf044,0x397, +0x314,0x300,0x345,0x1f2c,0x345,2,0xf044,0x397,0x313,0x301,0x345,0x1f2d,0x345,2,0xf044,0x397, +0x314,0x301,0x345,0x1f2e,0x345,2,0xf044,0x397,0x313,0x342,0x345,0x1f2f,0x345,2,0xf044,0x397, +0x314,0x342,0x345,0x1f60,0xf043,0x3c9,0x313,0x345,0x1f61,0xf043,0x3c9,0x314,0x345,0x1f62,0x345,2, +0xf044,0x3c9,0x313,0x300,0x345,0x1f63,0x345,2,0xf044,0x3c9,0x314,0x300,0x345,0x1f64,0x345,2, +0xf044,0x3c9,0x313,0x301,0x345,0x1f65,0x345,2,0xf044,0x3c9,0x314,0x301,0x345,0x1f66,0x345,2, +0xf044,0x3c9,0x313,0x342,0x345,0x1f67,0x345,2,0xf044,0x3c9,0x314,0x342,0x345,0x1f68,0xf043,0x3a9, +0x313,0x345,0x1f69,0xf043,0x3a9,0x314,0x345,0x1f6a,0x345,2,0xf044,0x3a9,0x313,0x300,0x345,0x1f6b, +0x345,2,0xf044,0x3a9,0x314,0x300,0x345,0x1f6c,0x345,2,0xf044,0x3a9,0x313,0x301,0x345,0x1f6d, +0x345,2,0xf044,0x3a9,0x314,0x301,0x345,0x1f6e,0x345,2,0xf044,0x3a9,0x313,0x342,0x345,0x1f6f, +0x345,2,0xf044,0x3a9,0x314,0x342,0x345,0xe602,0x3b1,0x306,0xe602,0x3b1,0x304,0x1f70,0xf043,0x3b1, +0x300,0x345,0xf002,0x3b1,0x345,0x3ac,0xf043,0x3b1,0x301,0x345,0x1fb6,0xf043,0x3b1,0x342,0x345,0xe602, +0x391,0x306,0xe602,0x391,0x304,0xe602,0x391,0x300,0xf002,0x391,0x345,0xe602,0xa8,0x342,0x1f74,0xf043, +0x3b7,0x300,0x345,0xf002,0x3b7,0x345,0x3ae,0xf043,0x3b7,0x301,0x345,0x1fc6,0xf043,0x3b7,0x342,0x345, +0xe602,0x395,0x300,0xe602,0x397,0x300,0xf002,0x397,0x345,0xe602,0x1fbf,0x300,0xe602,0x1fbf,0x301,0xe602, +0x1fbf,0x342,0xe602,0x3b9,0x306,0xe602,0x3b9,0x304,0x3ca,0xe643,0x3b9,0x308,0x300,0xe602,0x3b9,0x342, +0x3ca,0xe643,0x3b9,0x308,0x342,0xe602,0x399,0x306,0xe602,0x399,0x304,0xe602,0x399,0x300,0xe602,0x1ffe, +0x300,0xe602,0x1ffe,0x301,0xe602,0x1ffe,0x342,0xe602,0x3c5,0x306,0xe602,0x3c5,0x304,0x3cb,0xe643,0x3c5, +0x308,0x300,0xe602,0x3c1,0x313,0xe602,0x3c1,0x314,0xe602,0x3c5,0x342,0x3cb,0xe643,0x3c5,0x308,0x342, +0xe602,0x3a5,0x306,0xe602,0x3a5,0x304,0xe602,0x3a5,0x300,0xe602,0x3a1,0x314,0xe602,0xa8,0x300,0x1f7c, +0xf043,0x3c9,0x300,0x345,0xf002,0x3c9,0x345,0x3ce,0xf043,0x3c9,0x301,0x345,0x1ff6,0xf043,0x3c9,0x342, +0x345,0xe602,0x39f,0x300,0xe602,0x3a9,0x300,0xf002,0x3a9,0x345,0x102,0x2190,0x338,0x102,0x2192,0x338, +0x102,0x2194,0x338,0x102,0x21d0,0x338,0x102,0x21d4,0x338,0x102,0x21d2,0x338,0x102,0x2203,0x338,0x102, +0x2208,0x338,0x102,0x220b,0x338,0x102,0x2223,0x338,0x102,0x2225,0x338,0x102,0x223c,0x338,0x102,0x2243, +0x338,0x102,0x2245,0x338,0x102,0x2248,0x338,0x102,0x3d,0x338,0x102,0x2261,0x338,0x102,0x224d,0x338, +0x102,0x3c,0x338,0x102,0x3e,0x338,0x102,0x2264,0x338,0x102,0x2265,0x338,0x102,0x2272,0x338,0x102, +0x2273,0x338,0x102,0x2276,0x338,0x102,0x2277,0x338,0x102,0x227a,0x338,0x102,0x227b,0x338,0x102,0x2282, +0x338,0x102,0x2283,0x338,0x102,0x2286,0x338,0x102,0x2287,0x338,0x102,0x22a2,0x338,0x102,0x22a8,0x338, +0x102,0x22a9,0x338,0x102,0x22ab,0x338,0x102,0x227c,0x338,0x102,0x227d,0x338,0x102,0x2291,0x338,0x102, +0x2292,0x338,0x102,0x22b2,0x338,0x102,0x22b3,0x338,0x102,0x22b4,0x338,0x102,0x22b5,0x338,0x802,0x304b, +0x3099,0x802,0x304d,0x3099,0x802,0x304f,0x3099,0x802,0x3051,0x3099,0x802,0x3053,0x3099,0x802,0x3055,0x3099, +0x802,0x3057,0x3099,0x802,0x3059,0x3099,0x802,0x305b,0x3099,0x802,0x305d,0x3099,0x802,0x305f,0x3099,0x802, +0x3061,0x3099,0x802,0x3064,0x3099,0x802,0x3066,0x3099,0x802,0x3068,0x3099,0x802,0x306f,0x3099,0x802,0x306f, +0x309a,0x802,0x3072,0x3099,0x802,0x3072,0x309a,0x802,0x3075,0x3099,0x802,0x3075,0x309a,0x802,0x3078,0x3099, +0x802,0x3078,0x309a,0x802,0x307b,0x3099,0x802,0x307b,0x309a,0x802,0x3046,0x3099,0x802,0x309d,0x3099,0x802, +0x30ab,0x3099,0x802,0x30ad,0x3099,0x802,0x30af,0x3099,0x802,0x30b1,0x3099,0x802,0x30b3,0x3099,0x802,0x30b5, +0x3099,0x802,0x30b7,0x3099,0x802,0x30b9,0x3099,0x802,0x30bb,0x3099,0x802,0x30bd,0x3099,0x802,0x30bf,0x3099, +0x802,0x30c1,0x3099,0x802,0x30c4,0x3099,0x802,0x30c6,0x3099,0x802,0x30c8,0x3099,0x802,0x30cf,0x3099,0x802, +0x30cf,0x309a,0x802,0x30d2,0x3099,0x802,0x30d2,0x309a,0x802,0x30d5,0x3099,0x802,0x30d5,0x309a,0x802,0x30d8, +0x3099,0x802,0x30d8,0x309a,0x802,0x30db,0x3099,0x802,0x30db,0x309a,0x802,0x30a6,0x3099,0x802,0x30ef,0x3099, +0x802,0x30f0,0x3099,0x802,0x30f1,0x3099,0x802,0x30f2,0x3099,0x802,0x30fd,0x3099,0x704,0xd804,0xdc99,0xd804, +0xdcba,0x704,0xd804,0xdc9b,0xd804,0xdcba,0x704,0xd804,0xdca5,0xd804,0xdcba,4,0xd804,0xdd31,0xd804,0xdd27, +4,0xd804,0xdd32,0xd804,0xdd27,4,0xd804,0xdf47,0xd804,0xdf3e,4,0xd804,0xdf47,0xd804,0xdf57,4, +0xd805,0xdcb9,0xd805,0xdcba,4,0xd805,0xdcb9,0xd805,0xdcb0,4,0xd805,0xdcb9,0xd805,0xdcbd,4,0xd805, +0xddb8,0xd805,0xddaf,4,0xd805,0xddb9,0xd805,0xddaf,1,0x2b9,1,0x3b,1,0xb7,0x702,0x915, +0x93c,0x702,0x916,0x93c,0x702,0x917,0x93c,0x702,0x91c,0x93c,0x702,0x921,0x93c,0x702,0x922,0x93c, +0x702,0x92b,0x93c,0x702,0x92f,0x93c,0x702,0x9a1,0x9bc,0x702,0x9a2,0x9bc,0x702,0x9af,0x9bc,0x702, +0xa32,0xa3c,0x702,0xa38,0xa3c,0x702,0xa16,0xa3c,0x702,0xa17,0xa3c,0x702,0xa1c,0xa3c,0x702,0xa2b, +0xa3c,0x702,0xb21,0xb3c,0x702,0xb22,0xb3c,2,0xf42,0xfb7,2,0xf4c,0xfb7,2,0xf51,0xfb7, +2,0xf56,0xfb7,2,0xf5b,0xfb7,2,0xf40,0xfb5,0x8202,0xfb2,0xf80,0x8202,0xfb3,0xf80,2, +0xf92,0xfb7,2,0xf9c,0xfb7,2,0xfa1,0xfb7,2,0xfa6,0xfb7,2,0xfab,0xfb7,2,0xf90, +0xfb5,1,0x3b9,1,0x60,1,0xb4,1,0x3a9,1,0x4b,1,0x3008,1,0x3009,0x102, +0x2add,0x338,1,0x8c48,1,0x66f4,1,0x8eca,1,0x8cc8,1,0x6ed1,1,0x4e32,1,0x53e5, +1,0x9f9c,1,0x5951,1,0x91d1,1,0x5587,1,0x5948,1,0x61f6,1,0x7669,1,0x7f85, +1,0x863f,1,0x87ba,1,0x88f8,1,0x908f,1,0x6a02,1,0x6d1b,1,0x70d9,1,0x73de, +1,0x843d,1,0x916a,1,0x99f1,1,0x4e82,1,0x5375,1,0x6b04,1,0x721b,1,0x862d, +1,0x9e1e,1,0x5d50,1,0x6feb,1,0x85cd,1,0x8964,1,0x62c9,1,0x81d8,1,0x881f, +1,0x5eca,1,0x6717,1,0x6d6a,1,0x72fc,1,0x90ce,1,0x4f86,1,0x51b7,1,0x52de, +1,0x64c4,1,0x6ad3,1,0x7210,1,0x76e7,1,0x8001,1,0x8606,1,0x865c,1,0x8def, +1,0x9732,1,0x9b6f,1,0x9dfa,1,0x788c,1,0x797f,1,0x7da0,1,0x83c9,1,0x9304, +1,0x9e7f,1,0x8ad6,1,0x58df,1,0x5f04,1,0x7c60,1,0x807e,1,0x7262,1,0x78ca, +1,0x8cc2,1,0x96f7,1,0x58d8,1,0x5c62,1,0x6a13,1,0x6dda,1,0x6f0f,1,0x7d2f, +1,0x7e37,1,0x964b,1,0x52d2,1,0x808b,1,0x51dc,1,0x51cc,1,0x7a1c,1,0x7dbe, +1,0x83f1,1,0x9675,1,0x8b80,1,0x62cf,1,0x8afe,1,0x4e39,1,0x5be7,1,0x6012, +1,0x7387,1,0x7570,1,0x5317,1,0x78fb,1,0x4fbf,1,0x5fa9,1,0x4e0d,1,0x6ccc, +1,0x6578,1,0x7d22,1,0x53c3,1,0x585e,1,0x7701,1,0x8449,1,0x8aaa,1,0x6bba, +1,0x8fb0,1,0x6c88,1,0x62fe,1,0x82e5,1,0x63a0,1,0x7565,1,0x4eae,1,0x5169, +1,0x51c9,1,0x6881,1,0x7ce7,1,0x826f,1,0x8ad2,1,0x91cf,1,0x52f5,1,0x5442, +1,0x5973,1,0x5eec,1,0x65c5,1,0x6ffe,1,0x792a,1,0x95ad,1,0x9a6a,1,0x9e97, +1,0x9ece,1,0x529b,1,0x66c6,1,0x6b77,1,0x8f62,1,0x5e74,1,0x6190,1,0x6200, +1,0x649a,1,0x6f23,1,0x7149,1,0x7489,1,0x79ca,1,0x7df4,1,0x806f,1,0x8f26, +1,0x84ee,1,0x9023,1,0x934a,1,0x5217,1,0x52a3,1,0x54bd,1,0x70c8,1,0x88c2, +1,0x5ec9,1,0x5ff5,1,0x637b,1,0x6bae,1,0x7c3e,1,0x7375,1,0x4ee4,1,0x56f9, +1,0x5dba,1,0x601c,1,0x73b2,1,0x7469,1,0x7f9a,1,0x8046,1,0x9234,1,0x96f6, +1,0x9748,1,0x9818,1,0x4f8b,1,0x79ae,1,0x91b4,1,0x96b8,1,0x60e1,1,0x4e86, +1,0x50da,1,0x5bee,1,0x5c3f,1,0x6599,1,0x71ce,1,0x7642,1,0x84fc,1,0x907c, +1,0x9f8d,1,0x6688,1,0x962e,1,0x5289,1,0x677b,1,0x67f3,1,0x6d41,1,0x6e9c, +1,0x7409,1,0x7559,1,0x786b,1,0x7d10,1,0x985e,1,0x516d,1,0x622e,1,0x9678, +1,0x502b,1,0x5d19,1,0x6dea,1,0x8f2a,1,0x5f8b,1,0x6144,1,0x6817,1,0x9686, +1,0x5229,1,0x540f,1,0x5c65,1,0x6613,1,0x674e,1,0x68a8,1,0x6ce5,1,0x7406, +1,0x75e2,1,0x7f79,1,0x88cf,1,0x88e1,1,0x91cc,1,0x96e2,1,0x533f,1,0x6eba, +1,0x541d,1,0x71d0,1,0x7498,1,0x85fa,1,0x96a3,1,0x9c57,1,0x9e9f,1,0x6797, +1,0x6dcb,1,0x81e8,1,0x7acb,1,0x7b20,1,0x7c92,1,0x72c0,1,0x7099,1,0x8b58, +1,0x4ec0,1,0x8336,1,0x523a,1,0x5207,1,0x5ea6,1,0x62d3,1,0x7cd6,1,0x5b85, +1,0x6d1e,1,0x66b4,1,0x8f3b,1,0x884c,1,0x964d,1,0x898b,1,0x5ed3,1,0x5140, +1,0x55c0,1,0x585a,1,0x6674,1,0x51de,1,0x732a,1,0x76ca,1,0x793c,1,0x795e, +1,0x7965,1,0x798f,1,0x9756,1,0x7cbe,1,0x7fbd,1,0x8612,1,0x8af8,1,0x9038, +1,0x90fd,1,0x98ef,1,0x98fc,1,0x9928,1,0x9db4,1,0x90de,1,0x96b7,1,0x4fae, +1,0x50e7,1,0x514d,1,0x52c9,1,0x52e4,1,0x5351,1,0x559d,1,0x5606,1,0x5668, +1,0x5840,1,0x58a8,1,0x5c64,1,0x5c6e,1,0x6094,1,0x6168,1,0x618e,1,0x61f2, +1,0x654f,1,0x65e2,1,0x6691,1,0x6885,1,0x6d77,1,0x6e1a,1,0x6f22,1,0x716e, +1,0x722b,1,0x7422,1,0x7891,1,0x793e,1,0x7949,1,0x7948,1,0x7950,1,0x7956, +1,0x795d,1,0x798d,1,0x798e,1,0x7a40,1,0x7a81,1,0x7bc0,1,0x7e09,1,0x7e41, +1,0x7f72,1,0x8005,1,0x81ed,1,0x8279,1,0x8457,1,0x8910,1,0x8996,1,0x8b01, +1,0x8b39,1,0x8cd3,1,0x8d08,1,0x8fb6,1,0x96e3,1,0x97ff,1,0x983b,1,0x6075, +2,0xd850,0xdeee,1,0x8218,1,0x4e26,1,0x51b5,1,0x5168,1,0x4f80,1,0x5145,1, +0x5180,1,0x52c7,1,0x52fa,1,0x5555,1,0x5599,1,0x55e2,1,0x58b3,1,0x5944,1, +0x5954,1,0x5a62,1,0x5b28,1,0x5ed2,1,0x5ed9,1,0x5f69,1,0x5fad,1,0x60d8,1, +0x614e,1,0x6108,1,0x6160,1,0x6234,1,0x63c4,1,0x641c,1,0x6452,1,0x6556,1, +0x671b,1,0x6756,1,0x6b79,1,0x6edb,1,0x6ecb,1,0x701e,1,0x77a7,1,0x7235,1, +0x72af,1,0x7471,1,0x7506,1,0x753b,1,0x761d,1,0x761f,1,0x76db,1,0x76f4,1, +0x774a,1,0x7740,1,0x78cc,1,0x7ab1,1,0x7c7b,1,0x7d5b,1,0x7f3e,1,0x8352,1, +0x83ef,1,0x8779,1,0x8941,1,0x8986,1,0x8abf,1,0x8acb,1,0x8aed,1,0x8b8a,1, +0x8f38,1,0x9072,1,0x9199,1,0x9276,1,0x967c,1,0x97db,1,0x980b,1,0x9b12,2, +0xd84a,0xdc4a,2,0xd84a,0xdc44,2,0xd84c,0xdfd5,1,0x3b9d,1,0x4018,1,0x4039,2,0xd854, +0xde49,2,0xd857,0xdcd0,2,0xd85f,0xded3,1,0x9f43,1,0x9f8e,0xe02,0x5d9,0x5b4,0x1102,0x5f2, +0x5b7,0x1802,0x5e9,0x5c1,0x1902,0x5e9,0x5c2,0xfb49,0x1843,0x5e9,0x5bc,0x5c1,0xfb49,0x1943,0x5e9,0x5bc, +0x5c2,0x1102,0x5d0,0x5b7,0x1202,0x5d0,0x5b8,0x1502,0x5d0,0x5bc,0x1502,0x5d1,0x5bc,0x1502,0x5d2,0x5bc, +0x1502,0x5d3,0x5bc,0x1502,0x5d4,0x5bc,0x1502,0x5d5,0x5bc,0x1502,0x5d6,0x5bc,0x1502,0x5d8,0x5bc,0x1502, +0x5d9,0x5bc,0x1502,0x5da,0x5bc,0x1502,0x5db,0x5bc,0x1502,0x5dc,0x5bc,0x1502,0x5de,0x5bc,0x1502,0x5e0, +0x5bc,0x1502,0x5e1,0x5bc,0x1502,0x5e3,0x5bc,0x1502,0x5e4,0x5bc,0x1502,0x5e6,0x5bc,0x1502,0x5e7,0x5bc, +0x1502,0x5e8,0x5bc,0x1502,0x5e9,0x5bc,0x1502,0x5ea,0x5bc,0x1302,0x5d5,0x5b9,0x1702,0x5d1,0x5bf,0x1702, +0x5db,0x5bf,0x1702,0x5e4,0x5bf,0xd804,0xd834,0xdd57,0xd834,0xdd65,0xd804,0xd834,0xdd58,0xd834,0xdd65,0xd834, +0xdd5f,0xd834,0xdd6e,4,0xd846,0xd834,0xdd58,0xd834,0xdd65,0xd834,0xdd6e,0xd834,0xdd5f,0xd834,0xdd6f,4, +0xd846,0xd834,0xdd58,0xd834,0xdd65,0xd834,0xdd6f,0xd834,0xdd5f,0xd834,0xdd70,4,0xd846,0xd834,0xdd58,0xd834, +0xdd65,0xd834,0xdd70,0xd834,0xdd5f,0xd834,0xdd71,4,0xd846,0xd834,0xdd58,0xd834,0xdd65,0xd834,0xdd71,0xd834, +0xdd5f,0xd834,0xdd72,4,0xd846,0xd834,0xdd58,0xd834,0xdd65,0xd834,0xdd72,0xd804,0xd834,0xddb9,0xd834,0xdd65, +0xd804,0xd834,0xddba,0xd834,0xdd65,0xd834,0xddbb,0xd834,0xdd6e,4,0xd846,0xd834,0xddb9,0xd834,0xdd65,0xd834, +0xdd6e,0xd834,0xddbc,0xd834,0xdd6e,4,0xd846,0xd834,0xddba,0xd834,0xdd65,0xd834,0xdd6e,0xd834,0xddbb,0xd834, +0xdd6f,4,0xd846,0xd834,0xddb9,0xd834,0xdd65,0xd834,0xdd6f,0xd834,0xddbc,0xd834,0xdd6f,4,0xd846,0xd834, +0xddba,0xd834,0xdd65,0xd834,0xdd6f,1,0x4e3d,1,0x4e38,1,0x4e41,2,0xd840,0xdd22,1,0x4f60, +1,0x4fbb,1,0x5002,1,0x507a,1,0x5099,1,0x50cf,1,0x349e,2,0xd841,0xde3a,1, +0x5154,1,0x5164,1,0x5177,2,0xd841,0xdd1c,1,0x34b9,1,0x5167,1,0x518d,2,0xd841, +0xdd4b,1,0x5197,1,0x51a4,1,0x4ecc,1,0x51ac,2,0xd864,0xdddf,1,0x51f5,1,0x5203, +1,0x34df,1,0x523b,1,0x5246,1,0x5272,1,0x5277,1,0x3515,1,0x5305,1,0x5306, +1,0x5349,1,0x535a,1,0x5373,1,0x537d,1,0x537f,2,0xd842,0xde2c,1,0x7070,1, +0x53ca,1,0x53df,2,0xd842,0xdf63,1,0x53eb,1,0x53f1,1,0x5406,1,0x549e,1,0x5438, +1,0x5448,1,0x5468,1,0x54a2,1,0x54f6,1,0x5510,1,0x5553,1,0x5563,1,0x5584, +1,0x55ab,1,0x55b3,1,0x55c2,1,0x5716,1,0x5717,1,0x5651,1,0x5674,1,0x58ee, +1,0x57ce,1,0x57f4,1,0x580d,1,0x578b,1,0x5832,1,0x5831,1,0x58ac,2,0xd845, +0xdce4,1,0x58f2,1,0x58f7,1,0x5906,1,0x591a,1,0x5922,1,0x5962,2,0xd845,0xdea8, +2,0xd845,0xdeea,1,0x59ec,1,0x5a1b,1,0x5a27,1,0x59d8,1,0x5a66,1,0x36ee,1, +0x36fc,1,0x5b08,1,0x5b3e,2,0xd846,0xddc8,1,0x5bc3,1,0x5bd8,1,0x5bf3,2,0xd846, +0xdf18,1,0x5bff,1,0x5c06,1,0x5f53,1,0x5c22,1,0x3781,1,0x5c60,1,0x5cc0,1, +0x5c8d,2,0xd847,0xdde4,1,0x5d43,2,0xd847,0xdde6,1,0x5d6e,1,0x5d6b,1,0x5d7c,1, +0x5de1,1,0x5de2,1,0x382f,1,0x5dfd,1,0x5e28,1,0x5e3d,1,0x5e69,1,0x3862,2, +0xd848,0xdd83,1,0x387c,1,0x5eb0,1,0x5eb3,1,0x5eb6,2,0xd868,0xdf92,1,0x5efe,2, +0xd848,0xdf31,1,0x8201,1,0x5f22,1,0x38c7,2,0xd84c,0xdeb8,2,0xd858,0xddda,1,0x5f62, +1,0x5f6b,1,0x38e3,1,0x5f9a,1,0x5fcd,1,0x5fd7,1,0x5ff9,1,0x6081,1,0x393a, +1,0x391c,2,0xd849,0xded4,1,0x60c7,1,0x6148,1,0x614c,1,0x617a,1,0x61b2,1, +0x61a4,1,0x61af,1,0x61de,1,0x6210,1,0x621b,1,0x625d,1,0x62b1,1,0x62d4,1, +0x6350,2,0xd84a,0xdf0c,1,0x633d,1,0x62fc,1,0x6368,1,0x6383,1,0x63e4,2,0xd84a, +0xdff1,1,0x6422,1,0x63c5,1,0x63a9,1,0x3a2e,1,0x6469,1,0x647e,1,0x649d,1, +0x6477,1,0x3a6c,1,0x656c,2,0xd84c,0xdc0a,1,0x65e3,1,0x66f8,1,0x6649,1,0x3b19, +1,0x3b08,1,0x3ae4,1,0x5192,1,0x5195,1,0x6700,1,0x669c,1,0x80ad,1,0x43d9, +1,0x6721,1,0x675e,1,0x6753,2,0xd84c,0xdfc3,1,0x3b49,1,0x67fa,1,0x6785,1, +0x6852,2,0xd84d,0xdc6d,1,0x688e,1,0x681f,1,0x6914,1,0x6942,1,0x69a3,1,0x69ea, +1,0x6aa8,2,0xd84d,0xdea3,1,0x6adb,1,0x3c18,1,0x6b21,2,0xd84e,0xdca7,1,0x6b54, +1,0x3c4e,1,0x6b72,1,0x6b9f,1,0x6bbb,2,0xd84e,0xde8d,2,0xd847,0xdd0b,2,0xd84e, +0xdefa,1,0x6c4e,2,0xd84f,0xdcbc,1,0x6cbf,1,0x6ccd,1,0x6c67,1,0x6d16,1,0x6d3e, +1,0x6d69,1,0x6d78,1,0x6d85,2,0xd84f,0xdd1e,1,0x6d34,1,0x6e2f,1,0x6e6e,1, +0x3d33,1,0x6ec7,2,0xd84f,0xded1,1,0x6df9,1,0x6f6e,2,0xd84f,0xdf5e,2,0xd84f,0xdf8e, +1,0x6fc6,1,0x7039,1,0x701b,1,0x3d96,1,0x704a,1,0x707d,1,0x7077,1,0x70ad, +2,0xd841,0xdd25,1,0x7145,2,0xd850,0xde63,1,0x719c,2,0xd850,0xdfab,1,0x7228,1, +0x7250,2,0xd851,0xde08,1,0x7280,1,0x7295,2,0xd851,0xdf35,2,0xd852,0xdc14,1,0x737a, +1,0x738b,1,0x3eac,1,0x73a5,1,0x3eb8,1,0x7447,1,0x745c,1,0x7485,1,0x74ca, +1,0x3f1b,1,0x7524,2,0xd853,0xdc36,1,0x753e,2,0xd853,0xdc92,2,0xd848,0xdd9f,1, +0x7610,2,0xd853,0xdfa1,2,0xd853,0xdfb8,2,0xd854,0xdc44,1,0x3ffc,1,0x4008,2,0xd854, +0xdcf3,2,0xd854,0xdcf2,2,0xd854,0xdd19,2,0xd854,0xdd33,1,0x771e,1,0x771f,1,0x778b, +1,0x4046,1,0x4096,2,0xd855,0xdc1d,1,0x784e,1,0x40e3,2,0xd855,0xde26,2,0xd855, +0xde9a,2,0xd855,0xdec5,1,0x79eb,1,0x412f,1,0x7a4a,1,0x7a4f,2,0xd856,0xdd7c,2, +0xd856,0xdea7,1,0x7aee,1,0x4202,2,0xd856,0xdfab,1,0x7bc6,1,0x7bc9,1,0x4227,2, +0xd857,0xdc80,1,0x7cd2,1,0x42a0,1,0x7ce8,1,0x7ce3,1,0x7d00,2,0xd857,0xdf86,1, +0x7d63,1,0x4301,1,0x7dc7,1,0x7e02,1,0x7e45,1,0x4334,2,0xd858,0xde28,2,0xd858, +0xde47,1,0x4359,2,0xd858,0xded9,1,0x7f7a,2,0xd858,0xdf3e,1,0x7f95,1,0x7ffa,2, +0xd859,0xdcda,2,0xd859,0xdd23,1,0x8060,2,0xd859,0xdda8,1,0x8070,2,0xd84c,0xdf5f,1, +0x43d5,1,0x80b2,1,0x8103,1,0x440b,1,0x813e,1,0x5ab5,2,0xd859,0xdfa7,2,0xd859, +0xdfb5,2,0xd84c,0xdf93,2,0xd84c,0xdf9c,1,0x8204,1,0x8f9e,1,0x446b,1,0x8291,1, +0x828b,1,0x829d,1,0x52b3,1,0x82b1,1,0x82b3,1,0x82bd,1,0x82e6,2,0xd85a,0xdf3c, +1,0x831d,1,0x8363,1,0x83ad,1,0x8323,1,0x83bd,1,0x83e7,1,0x8353,1,0x83ca, +1,0x83cc,1,0x83dc,2,0xd85b,0xdc36,2,0xd85b,0xdd6b,2,0xd85b,0xdcd5,1,0x452b,1, +0x84f1,1,0x84f3,1,0x8516,2,0xd85c,0xdfca,1,0x8564,2,0xd85b,0xdf2c,1,0x455d,1, +0x4561,2,0xd85b,0xdfb1,2,0xd85c,0xdcd2,1,0x456b,1,0x8650,1,0x8667,1,0x8669,1, +0x86a9,1,0x8688,1,0x870e,1,0x86e2,1,0x8728,1,0x876b,1,0x8786,1,0x45d7,1, +0x87e1,1,0x8801,1,0x45f9,1,0x8860,1,0x8863,2,0xd85d,0xde67,1,0x88d7,1,0x88de, +1,0x4635,1,0x88fa,1,0x34bb,2,0xd85e,0xdcae,2,0xd85e,0xdd66,1,0x46be,1,0x46c7, +1,0x8aa0,1,0x8c55,2,0xd85f,0xdca8,1,0x8cab,1,0x8cc1,1,0x8d1b,1,0x8d77,2, +0xd85f,0xdf2f,2,0xd842,0xdc04,1,0x8dcb,1,0x8dbc,1,0x8df0,2,0xd842,0xdcde,1,0x8ed4, +2,0xd861,0xddd2,2,0xd861,0xdded,1,0x9094,1,0x90f1,1,0x9111,2,0xd861,0xdf2e,1, +0x911b,1,0x9238,1,0x92d7,1,0x92d8,1,0x927c,1,0x93f9,1,0x9415,2,0xd862,0xdffa, +1,0x958b,1,0x4995,1,0x95b7,2,0xd863,0xdd77,1,0x49e6,1,0x96c3,1,0x5db2,1, +0x9723,2,0xd864,0xdd45,2,0xd864,0xde1a,1,0x4a6e,1,0x4a76,1,0x97e0,2,0xd865,0xdc0a, +1,0x4ab2,2,0xd865,0xdc96,1,0x9829,2,0xd865,0xddb6,1,0x98e2,1,0x4b33,1,0x9929, +1,0x99a7,1,0x99c2,1,0x99fe,1,0x4bce,2,0xd866,0xdf30,1,0x9c40,1,0x9cfd,1, +0x4cce,1,0x4ced,1,0x9d67,2,0xd868,0xdcce,1,0x4cf8,2,0xd868,0xdd05,2,0xd868,0xde0e, +2,0xd868,0xde91,1,0x9ebb,1,0x4d56,1,0x9ef9,1,0x9efe,1,0x9f05,1,0x9f0f,1, +0x9f16,1,0x9f3b,2,0xd869,0xde00,0x3ac,0xe642,0x3b1,0x301,0x3ad,0xe642,0x3b5,0x301,0x3ae,0xe642, +0x3b7,0x301,0x3af,0xe642,0x3b9,0x301,0x3cc,0xe642,0x3bf,0x301,0x3cd,0xe642,0x3c5,0x301,0x3ce,0xe642, +0x3c9,0x301,0x386,0xe642,0x391,0x301,0x388,0xe642,0x395,0x301,0x389,0xe642,0x397,0x301,0x390,1, +0xe643,0x3b9,0x308,0x301,0x38a,0xe642,0x399,0x301,0x3b0,1,0xe643,0x3c5,0x308,0x301,0x38e,0xe642, +0x3a5,0x301,0x385,0xe642,0xa8,0x301,0x38c,0xe642,0x39f,0x301,0x38f,0xe642,0x3a9,0x301,0xc5,0xe642, +0x41,0x30a,0xe6e6,0xe681,0x300,0xe6e6,0xe681,0x301,0xe6e6,0xe681,0x313,0xe6e6,0xe682,0x308,0x301,0x8100, +0x8282,0xf71,0xf72,0x8100,0x8482,0xf71,0xf74,0x8100,0x8282,0xf71,0xf80,0 }; static const uint8_t norm2_nfc_data_smallFCD[256]={ -0xc0,0xef,3,0x7f,0xdf,0x70,0xcf,0x87,0xc7,0x66,0x66,0x46,0x64,0x44,0x66,0x5b, +0xc0,0xef,3,0x7f,0xdf,0x70,0xcf,0x87,0xc7,0x66,0x66,0x46,0x64,0x46,0x66,0x5b, 0x12,0,0,4,0,0,0,0x43,0x20,2,0x29,0xae,0xc2,0xc0,0xff,0xff, 0xc0,0x72,0xbf,0,0,0,0,0,0,0,0x40,0,0x80,0x88,0,0, 0xfe,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, @@ -1135,13 +1143,13 @@ static const UTrie2 norm2_nfc_data_trie={ norm2_nfc_data_trieIndex+2720, NULL, 2720, - 6932, + 7056, 0x188, 0xb1c, - 0x0, - 0x0, + 0x1, + 0x1, 0x30000, - 0x25b0, + 0x262c, NULL, 0, FALSE, FALSE, 0, NULL }; diff --git a/Build/source/libs/icu/icu-src/source/common/norm2allmodes.h b/Build/source/libs/icu/icu-src/source/common/norm2allmodes.h index 943e83d5670..682ece28f13 100644 --- a/Build/source/libs/icu/icu-src/source/common/norm2allmodes.h +++ b/Build/source/libs/icu/icu-src/source/common/norm2allmodes.h @@ -1,11 +1,11 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* * Copyright (C) 2014, International Business Machines * Corporation and others. All Rights Reserved. ******************************************************************************* -* loadednormalizer2impl.h +* norm2allmodes.h * * created on: 2014sep07 * created by: Markus W. Scherer @@ -18,7 +18,9 @@ #if !UCONFIG_NO_NORMALIZATION +#include "unicode/edits.h" #include "unicode/normalizer2.h" +#include "unicode/stringoptions.h" #include "unicode/unistr.h" #include "cpputils.h" #include "normalizer2impl.h" @@ -210,8 +212,8 @@ private: virtual UNormalizationCheckResult getQuickCheck(UChar32 c) const { return impl.isDecompYes(impl.getNorm16(c)) ? UNORM_YES : UNORM_NO; } - virtual UBool hasBoundaryBefore(UChar32 c) const { return impl.hasDecompBoundary(c, TRUE); } - virtual UBool hasBoundaryAfter(UChar32 c) const { return impl.hasDecompBoundary(c, FALSE); } + virtual UBool hasBoundaryBefore(UChar32 c) const { return impl.hasDecompBoundaryBefore(c); } + virtual UBool hasBoundaryAfter(UChar32 c) const { return impl.hasDecompBoundaryAfter(c); } virtual UBool isInert(UChar32 c) const { return impl.isDecompInert(c); } }; @@ -224,19 +226,35 @@ public: private: virtual void normalize(const UChar *src, const UChar *limit, - ReorderingBuffer &buffer, UErrorCode &errorCode) const { + ReorderingBuffer &buffer, UErrorCode &errorCode) const U_OVERRIDE { impl.compose(src, limit, onlyContiguous, TRUE, buffer, errorCode); } using Normalizer2WithImpl::normalize; // Avoid warning about hiding base class function. + + void + normalizeUTF8(uint32_t options, StringPiece src, ByteSink &sink, + Edits *edits, UErrorCode &errorCode) const U_OVERRIDE { + if (U_FAILURE(errorCode)) { + return; + } + if (edits != nullptr && (options & U_EDITS_NO_RESET) == 0) { + edits->reset(); + } + const uint8_t *s = reinterpret_cast(src.data()); + impl.composeUTF8(options, onlyContiguous, s, s + src.length(), + &sink, edits, errorCode); + sink.Flush(); + } + virtual void normalizeAndAppend(const UChar *src, const UChar *limit, UBool doNormalize, UnicodeString &safeMiddle, - ReorderingBuffer &buffer, UErrorCode &errorCode) const { + ReorderingBuffer &buffer, UErrorCode &errorCode) const U_OVERRIDE { impl.composeAndAppend(src, limit, doNormalize, onlyContiguous, safeMiddle, buffer, errorCode); } virtual UBool - isNormalized(const UnicodeString &s, UErrorCode &errorCode) const { + isNormalized(const UnicodeString &s, UErrorCode &errorCode) const U_OVERRIDE { if(U_FAILURE(errorCode)) { return FALSE; } @@ -252,8 +270,16 @@ private: } return impl.compose(sArray, sArray+s.length(), onlyContiguous, FALSE, buffer, errorCode); } + virtual UBool + isNormalizedUTF8(StringPiece sp, UErrorCode &errorCode) const U_OVERRIDE { + if(U_FAILURE(errorCode)) { + return FALSE; + } + const uint8_t *s = reinterpret_cast(sp.data()); + return impl.composeUTF8(0, onlyContiguous, s, s + sp.length(), nullptr, nullptr, errorCode); + } virtual UNormalizationCheckResult - quickCheck(const UnicodeString &s, UErrorCode &errorCode) const { + quickCheck(const UnicodeString &s, UErrorCode &errorCode) const U_OVERRIDE { if(U_FAILURE(errorCode)) { return UNORM_MAYBE; } @@ -267,21 +293,21 @@ private: return qcResult; } virtual const UChar * - spanQuickCheckYes(const UChar *src, const UChar *limit, UErrorCode &) const { + spanQuickCheckYes(const UChar *src, const UChar *limit, UErrorCode &) const U_OVERRIDE { return impl.composeQuickCheck(src, limit, onlyContiguous, NULL); } using Normalizer2WithImpl::spanQuickCheckYes; // Avoid warning about hiding base class function. - virtual UNormalizationCheckResult getQuickCheck(UChar32 c) const { + virtual UNormalizationCheckResult getQuickCheck(UChar32 c) const U_OVERRIDE { return impl.getCompQuickCheck(impl.getNorm16(c)); } - virtual UBool hasBoundaryBefore(UChar32 c) const { + virtual UBool hasBoundaryBefore(UChar32 c) const U_OVERRIDE { return impl.hasCompBoundaryBefore(c); } - virtual UBool hasBoundaryAfter(UChar32 c) const { - return impl.hasCompBoundaryAfter(c, onlyContiguous, FALSE); + virtual UBool hasBoundaryAfter(UChar32 c) const U_OVERRIDE { + return impl.hasCompBoundaryAfter(c, onlyContiguous); } - virtual UBool isInert(UChar32 c) const { - return impl.hasCompBoundaryAfter(c, onlyContiguous, TRUE); + virtual UBool isInert(UChar32 c) const U_OVERRIDE { + return impl.isCompInert(c, onlyContiguous); } const UBool onlyContiguous; diff --git a/Build/source/libs/icu/icu-src/source/common/normalizer2.cpp b/Build/source/libs/icu/icu-src/source/common/normalizer2.cpp index 33d94174eb4..0f12dfcff42 100644 --- a/Build/source/libs/icu/icu-src/source/common/normalizer2.cpp +++ b/Build/source/libs/icu/icu-src/source/common/normalizer2.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* @@ -8,7 +8,7 @@ * ******************************************************************************* * file name: normalizer2.cpp -* encoding: US-ASCII +* encoding: UTF-8 * tab size: 8 (not used) * indentation:4 * @@ -20,7 +20,9 @@ #if !UCONFIG_NO_NORMALIZATION +#include "unicode/edits.h" #include "unicode/normalizer2.h" +#include "unicode/stringoptions.h" #include "unicode/unistr.h" #include "unicode/unorm.h" #include "cstring.h" @@ -42,6 +44,20 @@ U_NAMESPACE_BEGIN Normalizer2::~Normalizer2() {} +void +Normalizer2::normalizeUTF8(uint32_t /*options*/, StringPiece src, ByteSink &sink, + Edits *edits, UErrorCode &errorCode) const { + if (U_FAILURE(errorCode)) { + return; + } + if (edits != nullptr) { + errorCode = U_UNSUPPORTED_ERROR; + return; + } + UnicodeString src16 = UnicodeString::fromUTF8(src); + normalize(src16, errorCode).toUTF8(sink); +} + UBool Normalizer2::getRawDecomposition(UChar32, UnicodeString &) const { return FALSE; @@ -57,6 +73,11 @@ Normalizer2::getCombiningClass(UChar32 /*c*/) const { return 0; } +UBool +Normalizer2::isNormalizedUTF8(StringPiece s, UErrorCode &errorCode) const { + return U_SUCCESS(errorCode) && isNormalized(UnicodeString::fromUTF8(s), errorCode); +} + // Normalizer2 implementation for the old UNORM_NONE. class NoopNormalizer2 : public Normalizer2 { virtual ~NoopNormalizer2(); @@ -64,7 +85,7 @@ class NoopNormalizer2 : public Normalizer2 { virtual UnicodeString & normalize(const UnicodeString &src, UnicodeString &dest, - UErrorCode &errorCode) const { + UErrorCode &errorCode) const U_OVERRIDE { if(U_SUCCESS(errorCode)) { if(&dest!=&src) { dest=src; @@ -74,10 +95,27 @@ class NoopNormalizer2 : public Normalizer2 { } return dest; } + virtual void + normalizeUTF8(uint32_t options, StringPiece src, ByteSink &sink, + Edits *edits, UErrorCode &errorCode) const U_OVERRIDE { + if(U_SUCCESS(errorCode)) { + if (edits != nullptr) { + if ((options & U_EDITS_NO_RESET) == 0) { + edits->reset(); + } + edits->addUnchanged(src.length()); + } + if ((options & U_OMIT_UNCHANGED_TEXT) == 0) { + sink.Append(src.data(), src.length()); + } + sink.Flush(); + } + } + virtual UnicodeString & normalizeSecondAndAppend(UnicodeString &first, const UnicodeString &second, - UErrorCode &errorCode) const { + UErrorCode &errorCode) const U_OVERRIDE { if(U_SUCCESS(errorCode)) { if(&first!=&second) { first.append(second); @@ -90,7 +128,7 @@ class NoopNormalizer2 : public Normalizer2 { virtual UnicodeString & append(UnicodeString &first, const UnicodeString &second, - UErrorCode &errorCode) const { + UErrorCode &errorCode) const U_OVERRIDE { if(U_SUCCESS(errorCode)) { if(&first!=&second) { first.append(second); @@ -101,25 +139,29 @@ class NoopNormalizer2 : public Normalizer2 { return first; } virtual UBool - getDecomposition(UChar32, UnicodeString &) const { + getDecomposition(UChar32, UnicodeString &) const U_OVERRIDE { return FALSE; } - // No need to override the default getRawDecomposition(). + // No need to U_OVERRIDE the default getRawDecomposition(). + virtual UBool + isNormalized(const UnicodeString &, UErrorCode &errorCode) const U_OVERRIDE { + return U_SUCCESS(errorCode); + } virtual UBool - isNormalized(const UnicodeString &, UErrorCode &) const { - return TRUE; + isNormalizedUTF8(StringPiece, UErrorCode &errorCode) const U_OVERRIDE { + return U_SUCCESS(errorCode); } virtual UNormalizationCheckResult - quickCheck(const UnicodeString &, UErrorCode &) const { + quickCheck(const UnicodeString &, UErrorCode &) const U_OVERRIDE { return UNORM_YES; } virtual int32_t - spanQuickCheckYes(const UnicodeString &s, UErrorCode &) const { + spanQuickCheckYes(const UnicodeString &s, UErrorCode &) const U_OVERRIDE { return s.length(); } - virtual UBool hasBoundaryBefore(UChar32) const { return TRUE; } - virtual UBool hasBoundaryAfter(UChar32) const { return TRUE; } - virtual UBool isInert(UChar32) const { return TRUE; } + virtual UBool hasBoundaryBefore(UChar32) const U_OVERRIDE { return TRUE; } + virtual UBool hasBoundaryAfter(UChar32) const U_OVERRIDE { return TRUE; } + virtual UBool isInert(UChar32) const U_OVERRIDE { return TRUE; } }; NoopNormalizer2::~NoopNormalizer2() {} diff --git a/Build/source/libs/icu/icu-src/source/common/normalizer2impl.cpp b/Build/source/libs/icu/icu-src/source/common/normalizer2impl.cpp index be0240eee2a..15b4a528934 100644 --- a/Build/source/libs/icu/icu-src/source/common/normalizer2impl.cpp +++ b/Build/source/libs/icu/icu-src/source/common/normalizer2impl.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* @@ -8,7 +8,7 @@ * ******************************************************************************* * file name: normalizer2impl.cpp -* encoding: US-ASCII +* encoding: UTF-8 * tab size: 8 (not used) * indentation:4 * @@ -20,10 +20,15 @@ #if !UCONFIG_NO_NORMALIZATION +#include "unicode/bytestream.h" +#include "unicode/edits.h" #include "unicode/normalizer2.h" +#include "unicode/stringoptions.h" #include "unicode/udata.h" #include "unicode/ustring.h" #include "unicode/utf16.h" +#include "unicode/utf8.h" +#include "bytesinkutil.h" #include "cmemory.h" #include "mutex.h" #include "normalizer2impl.h" @@ -35,8 +40,142 @@ U_NAMESPACE_BEGIN +namespace { + +/** + * UTF-8 lead byte for minNoMaybeCP. + * Can be lower than the actual lead byte for c. + * Typically U+0300 for NFC/NFD, U+00A0 for NFKC/NFKD, U+0041 for NFKC_Casefold. + */ +inline uint8_t leadByteForCP(UChar32 c) { + if (c <= 0x7f) { + return (uint8_t)c; + } else if (c <= 0x7ff) { + return (uint8_t)(0xc0+(c>>6)); + } else { + // Should not occur because ccc(U+0300)!=0. + return 0xe0; + } +} + +/** + * Returns the code point from one single well-formed UTF-8 byte sequence + * between cpStart and cpLimit. + * + * UTrie2 UTF-8 macros do not assemble whole code points (for efficiency). + * When we do need the code point, we call this function. + * We should not need it for normalization-inert data (norm16==0). + * Illegal sequences yield the error value norm16==0 just like real normalization-inert code points. + */ +UChar32 codePointFromValidUTF8(const uint8_t *cpStart, const uint8_t *cpLimit) { + // Similar to U8_NEXT_UNSAFE(s, i, c). + U_ASSERT(cpStart < cpLimit); + uint8_t c = *cpStart; + switch(cpLimit-cpStart) { + case 1: + return c; + case 2: + return ((c&0x1f)<<6) | (cpStart[1]&0x3f); + case 3: + // no need for (c&0xf) because the upper bits are truncated after <<12 in the cast to (UChar) + return (UChar)((c<<12) | ((cpStart[1]&0x3f)<<6) | (cpStart[2]&0x3f)); + case 4: + return ((c&7)<<18) | ((cpStart[1]&0x3f)<<12) | ((cpStart[2]&0x3f)<<6) | (cpStart[3]&0x3f); + default: + U_ASSERT(FALSE); // Should not occur. + return U_SENTINEL; + } +} + +/** + * Returns the last code point in [start, p[ if it is valid and in U+1000..U+D7FF. + * Otherwise returns a negative value. + */ +UChar32 previousHangulOrJamo(const uint8_t *start, const uint8_t *p) { + if ((p - start) >= 3) { + p -= 3; + uint8_t l = *p; + uint8_t t1, t2; + if (0xe1 <= l && l <= 0xed && + (t1 = (uint8_t)(p[1] - 0x80)) <= 0x3f && + (t2 = (uint8_t)(p[2] - 0x80)) <= 0x3f && + (l < 0xed || t1 <= 0x1f)) { + return ((l & 0xf) << 12) | (t1 << 6) | t2; + } + } + return U_SENTINEL; +} + +/** + * Returns the offset from the Jamo T base if [src, limit[ starts with a single Jamo T code point. + * Otherwise returns a negative value. + */ +int32_t getJamoTMinusBase(const uint8_t *src, const uint8_t *limit) { + // Jamo T: E1 86 A8..E1 87 82 + if ((limit - src) >= 3 && *src == 0xe1) { + if (src[1] == 0x86) { + uint8_t t = src[2]; + // The first Jamo T is U+11A8 but JAMO_T_BASE is 11A7. + // Offset 0 does not correspond to any conjoining Jamo. + if (0xa8 <= t && t <= 0xbf) { + return t - 0xa7; + } + } else if (src[1] == 0x87) { + uint8_t t = src[2]; + if ((int8_t)t <= (int8_t)0x82) { + return t - (0xa7 - 0x40); + } + } + } + return -1; +} + +void +appendCodePointDelta(const uint8_t *cpStart, const uint8_t *cpLimit, int32_t delta, + ByteSink &sink, Edits *edits) { + char buffer[U8_MAX_LENGTH]; + int32_t length; + int32_t cpLength = (int32_t)(cpLimit - cpStart); + if (cpLength == 1) { + // The builder makes ASCII map to ASCII. + buffer[0] = (uint8_t)(*cpStart + delta); + length = 1; + } else { + int32_t trail = *(cpLimit-1) + delta; + if (0x80 <= trail && trail <= 0xbf) { + // The delta only changes the last trail byte. + --cpLimit; + length = 0; + do { buffer[length++] = *cpStart++; } while (cpStart < cpLimit); + buffer[length++] = (uint8_t)trail; + } else { + // Decode the code point, add the delta, re-encode. + UChar32 c = codePointFromValidUTF8(cpStart, cpLimit) + delta; + length = 0; + U8_APPEND_UNSAFE(buffer, length, c); + } + } + if (edits != nullptr) { + edits->addReplace(cpLength, length); + } + sink.Append(buffer, length); +} + +} // namespace + // ReorderingBuffer -------------------------------------------------------- *** +ReorderingBuffer::ReorderingBuffer(const Normalizer2Impl &ni, UnicodeString &dest, + UErrorCode &errorCode) : + impl(ni), str(dest), + start(str.getBuffer(8)), reorderStart(start), limit(start), + remainingCapacity(str.getCapacity()), lastCC(0) { + if (start == nullptr && U_SUCCESS(errorCode)) { + // getBuffer() already did str.setToBogus() + errorCode = U_MEMORY_ALLOCATION_ERROR; + } +} + UBool ReorderingBuffer::init(int32_t destCapacity, UErrorCode &errorCode) { int32_t length=str.length(); start=str.getBuffer(destCapacity); @@ -69,6 +208,32 @@ UBool ReorderingBuffer::equals(const UChar *otherStart, const UChar *otherLimit) 0==u_memcmp(start, otherStart, length); } +UBool ReorderingBuffer::equals(const uint8_t *otherStart, const uint8_t *otherLimit) const { + U_ASSERT((otherLimit - otherStart) <= INT32_MAX); // ensured by caller + int32_t length = (int32_t)(limit - start); + int32_t otherLength = (int32_t)(otherLimit - otherStart); + // For equal strings, UTF-8 is at least as long as UTF-16, and at most three times as long. + if (otherLength < length || (otherLength / 3) > length) { + return FALSE; + } + // Compare valid strings from between normalization boundaries. + // (Invalid sequences are normalization-inert.) + for (int32_t i = 0, j = 0;;) { + if (i >= length) { + return j >= otherLength; + } else if (j >= otherLength) { + return FALSE; + } + // Not at the end of either string yet. + UChar32 c, other; + U16_NEXT_UNSAFE(start, i, c); + U8_NEXT_UNSAFE(otherStart, j, other); + if (c != other) { + return FALSE; + } + } +} + UBool ReorderingBuffer::appendSupplementary(UChar32 c, uint8_t cc, UErrorCode &errorCode) { if(remainingCapacity<2 && !resize(2, errorCode)) { return FALSE; @@ -216,16 +381,12 @@ uint8_t ReorderingBuffer::previousCC() { return 0; } UChar32 c=*--codePointStart; - if(c>DELTA_SHIFT)-MAX_DELTA-1; normTrie=inTrie; maybeYesCompositions=inExtraData; - extraData=maybeYesCompositions+(MIN_NORMAL_MAYBE_YES-minMaybeYes); + extraData=maybeYesCompositions+((MIN_NORMAL_MAYBE_YES-minMaybeYes)>>OFFSET_SHIFT); smallFCD=inSmallFCD; - - // Build tccc180[]. - // gennorm2 enforces lccc=0 for c>=1) { - if((c&0xff)==0) { - bits=smallFCD[c>>8]; // one byte per 0x100 code points - } - if(bits&1) { - for(int i=0; i<0x20; ++i, ++c) { - tccc180[c]=(uint8_t)getFCD16FromNormData(c); - } - } else { - uprv_memset(tccc180+c, 0, 0x20); - c+=0x20; - } - } -} - -uint8_t Normalizer2Impl::getTrailCCFromCompYesAndZeroCC(const UChar *cpStart, const UChar *cpLimit) const { - UChar32 c; - if(cpStart==(cpLimit-1)) { - c=*cpStart; - } else { - c=U16_GET_SUPPLEMENTARY(cpStart[0], cpStart[1]); - } - uint16_t prevNorm16=getNorm16(c); - if(prevNorm16<=minYesNo) { - return 0; // yesYes and Hangul LV/LVT have ccc=tccc=0 - } else { - return (uint8_t)(*getMapping(prevNorm16)>>8); // tccc from yesNo - } } -namespace { - class LcccContext { public: LcccContext(const Normalizer2Impl &ni, UnicodeSet &s) : impl(ni), set(s) {} void handleRange(UChar32 start, UChar32 end, uint16_t norm16) { - if(impl.isAlgorithmicNoNo(norm16)) { - // Range of code points with same-norm16-value algorithmic decompositions. - // They might have different non-zero FCD16 values. - do { - uint16_t fcd16=impl.getFCD16(start); - if(fcd16>0xff) { set.add(start); } - } while(++start<=end); - } else { + if (norm16 > Normalizer2Impl::MIN_NORMAL_MAYBE_YES && + norm16 != Normalizer2Impl::JAMO_VT) { + set.add(start, end); + } else if (impl.minNoNoCompNoMaybeCC <= norm16 && norm16 < impl.limitNoNo) { uint16_t fcd16=impl.getFCD16(start); if(fcd16>0xff) { set.add(start, end); } } @@ -335,6 +464,8 @@ private: UnicodeSet &set; }; +namespace { + struct PropertyStartsContext { PropertyStartsContext(const Normalizer2Impl &ni, const USetAdder *adder) : impl(ni), sa(adder) {} @@ -359,7 +490,8 @@ enumNorm16PropertyStartsRange(const void *context, UChar32 start, UChar32 end, u const PropertyStartsContext *ctx=(const PropertyStartsContext *)context; const USetAdder *sa=ctx->sa; sa->add(sa->set, start); - if(start!=end && ctx->impl.isAlgorithmicNoNo((uint16_t)value)) { + if (start != end && ctx->impl.isAlgorithmicNoNo((uint16_t)value) && + (value & Normalizer2Impl::DELTA_TCCC_MASK) > Normalizer2Impl::DELTA_TCCC_1) { // Range of code points with same-norm16-value algorithmic decompositions. // They might have different non-zero FCD16 values. uint16_t prevFCD16=ctx->impl.getFCD16(start); @@ -391,7 +523,6 @@ U_CDECL_END void Normalizer2Impl::addLcccChars(UnicodeSet &set) const { - /* add the start code point of each same-value range of each trie */ LcccContext context(*this, set); utrie2_enum(normTrie, NULL, enumLcccRange, &context); } @@ -568,77 +699,174 @@ Normalizer2Impl::decompose(const UChar *src, const UChar *limit, // fail the quick check loop and/or where the quick check loop's overhead // is unlikely to be amortized. // Called by the compose() and makeFCD() implementations. -UBool Normalizer2Impl::decomposeShort(const UChar *src, const UChar *limit, - ReorderingBuffer &buffer, - UErrorCode &errorCode) const { +const UChar * +Normalizer2Impl::decomposeShort(const UChar *src, const UChar *limit, + UBool stopAtCompBoundary, UBool onlyContiguous, + ReorderingBuffer &buffer, UErrorCode &errorCode) const { + if (U_FAILURE(errorCode)) { + return nullptr; + } while(src= limitNoNo) { + if (isMaybeOrNonZeroCC(norm16)) { return buffer.append(c, getCCFromYesOrMaybe(norm16), errorCode); - } else if(isHangul(norm16)) { + } + // Maps to an isCompYesAndZeroCC. + c=mapAlgorithmic(c, norm16); + norm16=getNorm16(c); + } + if (norm16 < minYesNo) { + // c does not decompose + return buffer.append(c, 0, errorCode); + } else if(isHangulLV(norm16) || isHangulLVT(norm16)) { + // Hangul syllable: decompose algorithmically + UChar jamos[3]; + return buffer.appendZeroCC(jamos, jamos+Hangul::decompose(c, jamos), errorCode); + } + // c decomposes, get everything from the variable-length extra data + const uint16_t *mapping=getMapping(norm16); + uint16_t firstUnit=*mapping; + int32_t length=firstUnit&MAPPING_LENGTH_MASK; + uint8_t leadCC, trailCC; + trailCC=(uint8_t)(firstUnit>>8); + if(firstUnit&MAPPING_HAS_CCC_LCCC_WORD) { + leadCC=(uint8_t)(*(mapping-1)>>8); + } else { + leadCC=0; + } + return buffer.append((const UChar *)mapping+1, length, leadCC, trailCC, errorCode); +} + +const uint8_t * +Normalizer2Impl::decomposeShort(const uint8_t *src, const uint8_t *limit, + UBool stopAtCompBoundary, UBool onlyContiguous, + ReorderingBuffer &buffer, UErrorCode &errorCode) const { + if (U_FAILURE(errorCode)) { + return nullptr; + } + while (src < limit) { + const uint8_t *prevSrc = src; + uint16_t norm16; + UTRIE2_U8_NEXT16(normTrie, src, limit, norm16); + // Get the decomposition and the lead and trail cc's. + UChar32 c = U_SENTINEL; + if (norm16 >= limitNoNo) { + if (isMaybeOrNonZeroCC(norm16)) { + // No boundaries around this character. + c = codePointFromValidUTF8(prevSrc, src); + if (!buffer.append(c, getCCFromYesOrMaybe(norm16), errorCode)) { + return nullptr; + } + continue; + } + // Maps to an isCompYesAndZeroCC. + if (stopAtCompBoundary) { + return prevSrc; + } + c = codePointFromValidUTF8(prevSrc, src); + c = mapAlgorithmic(c, norm16); + norm16 = getNorm16(c); + } else if (stopAtCompBoundary && norm16 < minNoNoCompNoMaybeCC) { + return prevSrc; + } + // norm16!=INERT guarantees that [prevSrc, src[ is valid UTF-8. + // We do not see invalid UTF-8 here because + // its norm16==INERT is normalization-inert, + // so it gets copied unchanged in the fast path, + // and we stop the slow path where invalid UTF-8 begins. + U_ASSERT(norm16 != INERT); + if (norm16 < minYesNo) { + if (c < 0) { + c = codePointFromValidUTF8(prevSrc, src); + } + // does not decompose + if (!buffer.append(c, 0, errorCode)) { + return nullptr; + } + } else if (isHangulLV(norm16) || isHangulLVT(norm16)) { // Hangul syllable: decompose algorithmically - UChar jamos[3]; - return buffer.appendZeroCC(jamos, jamos+Hangul::decompose(c, jamos), errorCode); - } else if(isDecompNoAlgorithmic(norm16)) { - c=mapAlgorithmic(c, norm16); - norm16=getNorm16(c); + if (c < 0) { + c = codePointFromValidUTF8(prevSrc, src); + } + char16_t jamos[3]; + if (!buffer.appendZeroCC(jamos, jamos+Hangul::decompose(c, jamos), errorCode)) { + return nullptr; + } } else { - // c decomposes, get everything from the variable-length extra data - const uint16_t *mapping=getMapping(norm16); - uint16_t firstUnit=*mapping; - int32_t length=firstUnit&MAPPING_LENGTH_MASK; - uint8_t leadCC, trailCC; - trailCC=(uint8_t)(firstUnit>>8); - if(firstUnit&MAPPING_HAS_CCC_LCCC_WORD) { - leadCC=(uint8_t)(*(mapping-1)>>8); + // The character decomposes, get everything from the variable-length extra data. + const uint16_t *mapping = getMapping(norm16); + uint16_t firstUnit = *mapping; + int32_t length = firstUnit & MAPPING_LENGTH_MASK; + uint8_t trailCC = (uint8_t)(firstUnit >> 8); + uint8_t leadCC; + if (firstUnit & MAPPING_HAS_CCC_LCCC_WORD) { + leadCC = (uint8_t)(*(mapping-1) >> 8); } else { - leadCC=0; + leadCC = 0; + } + if (!buffer.append((const char16_t *)mapping+1, length, leadCC, trailCC, errorCode)) { + return nullptr; } - return buffer.append((const UChar *)mapping+1, length, leadCC, trailCC, errorCode); + } + if (stopAtCompBoundary && norm16HasCompBoundaryAfter(norm16, onlyContiguous)) { + return src; } } + return src; } const UChar * Normalizer2Impl::getDecomposition(UChar32 c, UChar buffer[4], int32_t &length) const { - const UChar *decomp=NULL; uint16_t norm16; - for(;;) { - if(c>7)&1)-1; - uint16_t rm0=*rawMapping; - if(rm0<=MAPPING_LENGTH_MASK) { - length=rm0; - return (const UChar *)rawMapping-rm0; - } else { - // Copy the normal mapping and replace its first two code units with rm0. - buffer[0]=(UChar)rm0; - u_memcpy(buffer+1, (const UChar *)mapping+1+2, mLength-2); - length=mLength-1; - return buffer; - } + } + // c decomposes, get everything from the variable-length extra data + const uint16_t *mapping=getMapping(norm16); + uint16_t firstUnit=*mapping; + int32_t mLength=firstUnit&MAPPING_LENGTH_MASK; // length of normal mapping + if(firstUnit&MAPPING_HAS_RAW_MAPPING) { + // Read the raw mapping from before the firstUnit and before the optional ccc/lccc word. + // Bit 7=MAPPING_HAS_CCC_LCCC_WORD + const uint16_t *rawMapping=mapping-((firstUnit>>7)&1)-1; + uint16_t rm0=*rawMapping; + if(rm0<=MAPPING_LENGTH_MASK) { + length=rm0; + return (const UChar *)rawMapping-rm0; } else { - length=mLength; - return (const UChar *)mapping+1; + // Copy the normal mapping and replace its first two code units with rm0. + buffer[0]=(UChar)rm0; + u_memcpy(buffer+1, (const UChar *)mapping+1+2, mLength-2); + length=mLength-1; + return buffer; } + } else { + length=mLength; + return (const UChar *)mapping+1; } } @@ -717,43 +942,60 @@ void Normalizer2Impl::decomposeAndAppend(const UChar *src, const UChar *limit, } } -// Note: hasDecompBoundary() could be implemented as aliases to -// hasFCDBoundaryBefore() and hasFCDBoundaryAfter() -// at the cost of building the FCD trie for a decomposition normalizer. -UBool Normalizer2Impl::hasDecompBoundary(UChar32 c, UBool before) const { - for(;;) { - if(cMIN_NORMAL_MAYBE_YES) { - return FALSE; // ccc!=0 - } else if(isDecompNoAlgorithmic(norm16)) { - c=mapAlgorithmic(c, norm16); - } else { - // c decomposes, get everything from the variable-length extra data - const uint16_t *mapping=getMapping(norm16); - uint16_t firstUnit=*mapping; - if((firstUnit&MAPPING_LENGTH_MASK)==0) { - return FALSE; - } - if(!before) { - // decomp after-boundary: same as hasFCDBoundaryAfter(), - // fcd16<=1 || trailCC==0 - if(firstUnit>0x1ff) { - return FALSE; // trailCC>1 - } - if(firstUnit<=0xff) { - return TRUE; // trailCC==0 - } - // if(trailCC==1) test leadCC==0, same as checking for before-boundary - } - // TRUE if leadCC==0 (hasFCDBoundaryBefore()) - return (firstUnit&MAPPING_HAS_CCC_LCCC_WORD)==0 || (*(mapping-1)&0xff00)==0; - } +UBool Normalizer2Impl::hasDecompBoundaryBefore(UChar32 c) const { + return c < minLcccCP || (c <= 0xffff && !singleLeadMightHaveNonZeroFCD16(c)) || + norm16HasDecompBoundaryBefore(getNorm16(c)); +} + +UBool Normalizer2Impl::norm16HasDecompBoundaryBefore(uint16_t norm16) const { + if (norm16 < minNoNoCompNoMaybeCC) { + return TRUE; } + if (norm16 >= limitNoNo) { + return norm16 <= MIN_NORMAL_MAYBE_YES || norm16 == JAMO_VT; + } + // c decomposes, get everything from the variable-length extra data + const uint16_t *mapping=getMapping(norm16); + uint16_t firstUnit=*mapping; + // TRUE if leadCC==0 (hasFCDBoundaryBefore()) + return (firstUnit&MAPPING_HAS_CCC_LCCC_WORD)==0 || (*(mapping-1)&0xff00)==0; +} + +UBool Normalizer2Impl::hasDecompBoundaryAfter(UChar32 c) const { + if (c < minDecompNoCP) { + return TRUE; + } + if (c <= 0xffff && !singleLeadMightHaveNonZeroFCD16(c)) { + return TRUE; + } + return norm16HasDecompBoundaryAfter(getNorm16(c)); +} + +UBool Normalizer2Impl::norm16HasDecompBoundaryAfter(uint16_t norm16) const { + if(norm16 <= minYesNo || isHangulLVT(norm16)) { + return TRUE; + } + if (norm16 >= limitNoNo) { + if (isMaybeOrNonZeroCC(norm16)) { + return norm16 <= MIN_NORMAL_MAYBE_YES || norm16 == JAMO_VT; + } + // Maps to an isCompYesAndZeroCC. + return (norm16 & DELTA_TCCC_MASK) <= DELTA_TCCC_1; + } + // c decomposes, get everything from the variable-length extra data + const uint16_t *mapping=getMapping(norm16); + uint16_t firstUnit=*mapping; + // decomp after-boundary: same as hasFCDBoundaryAfter(), + // fcd16<=1 || trailCC==0 + if(firstUnit>0x1ff) { + return FALSE; // trailCC>1 + } + if(firstUnit<=0xff) { + return TRUE; // trailCC==0 + } + // if(trailCC==1) test leadCC==0, same as checking for before-boundary + // TRUE if leadCC==0 (hasFCDBoundaryBefore()) + return (firstUnit&MAPPING_HAS_CCC_LCCC_WORD)==0 || (*(mapping-1)&0xff00)==0; } /* @@ -1031,6 +1273,7 @@ Normalizer2Impl::composePair(UChar32 a, UChar32 b) const { if(isInert(norm16)) { return U_SENTINEL; } else if(norm16minYesNo) { // composite 'a' has both mapping & compositions list list+= // mapping pointer - 1+ // +1 to skip the first unit with the mapping lenth + 1+ // +1 to skip the first unit with the mapping length (*list&MAPPING_LENGTH_MASK); // + mapping length } } } else if(norm16=minNoNo. + // The current character is either a "noNo" (has a mapping) + // or a "maybeYes" (combines backward) + // or a "yesYes" with ccc!=0. + // It is not a Hangul syllable or Jamo L because those have "yes" properties. + + // Medium-fast path: Handle cases that do not require full decomposition and recomposition. + if (!isMaybeOrNonZeroCC(norm16)) { // minNoNo <= norm16 < minMaybeYes + if (!doCompose) { + return FALSE; } - // Set prevBoundary to the last character in the quick check loop. - prevBoundary=src-1; - if( U16_IS_TRAIL(*prevBoundary) && prevSrc(getMapping(norm16)); + int32_t length = *mapping++ & MAPPING_LENGTH_MASK; + if(!buffer.appendZeroCC(mapping, mapping + length, errorCode)) { + break; + } + prevBoundary = src; + continue; + } + } else if (norm16 >= minNoNoEmpty) { + // The current character maps to nothing. + // Simply omit it from the output if there is a boundary before _or_ after it. + // The character itself implies no boundaries. + if (hasCompBoundaryBefore(src, limit) || + hasCompBoundaryAfter(prevBoundary, prevSrc, onlyContiguous)) { + if (prevBoundary != prevSrc && !buffer.appendZeroCC(prevBoundary, prevSrc, errorCode)) { + break; + } + prevBoundary = src; + continue; + } } - // The start of the current character (c). - prevSrc=src; - } else if(src==limit) { - break; - } - - src+=U16_LENGTH(c); - /* - * isCompYesAndZeroCC(norm16) is false, that is, norm16>=minNoNo. - * c is either a "noNo" (has a mapping) or a "maybeYes" (combines backward) - * or has ccc!=0. - * Check for Jamo V/T, then for regular characters. - * c is not a Hangul syllable or Jamo L because those have "yes" properties. - */ - if(isJamoVT(norm16) && prevBoundary!=prevSrc) { + // Other "noNo" type, or need to examine more text around this character: + // Fall through to the slow path. + } else if (isJamoVT(norm16) && prevBoundary != prevSrc) { UChar prev=*(prevSrc-1); - UBool needToDecompose=FALSE; if(c= 0) { + UChar32 syllable = Hangul::HANGUL_BASE + + (l*Hangul::JAMO_V_COUNT + (c-Hangul::JAMO_V_BASE)) * + Hangul::JAMO_T_COUNT + t; + --prevSrc; // Replace the Jamo L as well. + if (prevBoundary != prevSrc && !buffer.appendZeroCC(prevBoundary, prevSrc, errorCode)) { + break; + } + if(!buffer.appendBMP((UChar)syllable, 0, errorCode)) { + break; + } + prevBoundary = src; continue; } // If we see L+V+x where x!=T then we drop to the slow path, // decompose and recompose. // This is to deal with NFKC finding normal L and V but a - // compatibility variant of a T. We need to either fully compose that - // combination here (which would complicate the code and may not work - // with strange custom data) or use the slow path -- or else our replacing - // two input characters (L+V) with one output character (LV syllable) - // would violate the invariant that [prevBoundary..prevSrc[ has the same - // length as what we appended to the buffer since prevBoundary. - needToDecompose=TRUE; + // compatibility variant of a T. + // We need to either fully compose that combination here + // (which would complicate the code and may not work with strange custom data) + // or use the slow path. } - } else if(Hangul::isHangulWithoutJamoT(prev)) { - // c is a Jamo Trailing consonant, + } else if (Hangul::isHangulLV(prev)) { + // The current character is a Jamo Trailing consonant, // compose with previous Hangul LV that does not contain a Jamo T. - if(!doCompose) { + if (!doCompose) { return FALSE; } - buffer.setLastChar((UChar)(prev+c-Hangul::JAMO_T_BASE)); - prevBoundary=src; - continue; - } - if(!needToDecompose) { - // The Jamo V/T did not compose into a Hangul syllable. - if(doCompose) { - if(!buffer.appendBMP((UChar)c, 0, errorCode)) { - break; - } - } else { - prevCC=0; + UChar32 syllable = prev + c - Hangul::JAMO_T_BASE; + --prevSrc; // Replace the Hangul LV as well. + if (prevBoundary != prevSrc && !buffer.appendZeroCC(prevBoundary, prevSrc, errorCode)) { + break; + } + if(!buffer.appendBMP((UChar)syllable, 0, errorCode)) { + break; } + prevBoundary = src; continue; } - } - /* - * Source buffer pointers: - * - * all done quick check current char not yet - * "yes" but (c) processed - * may combine - * forward - * [-------------[-------------[-------------[-------------[ - * | | | | | - * orig. src prevBoundary prevSrc src limit - * - * - * Destination buffer pointers inside the ReorderingBuffer: - * - * all done might take not filled yet - * characters for - * reordering - * [-------------[-------------[-------------[ - * | | | | - * start reorderStart limit | - * +remainingCap.+ - */ - if(norm16>=MIN_YES_YES_WITH_CC) { - uint8_t cc=(uint8_t)norm16; // cc!=0 - if( onlyContiguous && // FCC - (doCompose ? buffer.getLastCC() : prevCC)==0 && - prevBoundarycc - ) { + // No matching context, or may need to decompose surrounding text first: + // Fall through to the slow path. + } else if (norm16 > JAMO_VT) { // norm16 >= MIN_YES_YES_WITH_CC + // One or more combining marks that do not combine-back: + // Check for canonical order, copy unchanged if ok and + // if followed by a character with a boundary-before. + uint8_t cc = getCCFromNormalYesOrMaybe(norm16); // cc!=0 + if (onlyContiguous /* FCC */ && getPreviousTrailCC(prevBoundary, prevSrc) > cc) { // Fails FCD test, need to decompose and contiguously recompose. - if(!doCompose) { + if (!doCompose) { return FALSE; } - } else if(doCompose) { - if(!buffer.append(c, cc, errorCode)) { - break; - } - continue; - } else if(prevCC<=cc) { - prevCC=cc; - continue; } else { - return FALSE; + // If !onlyContiguous (not FCC), then we ignore the tccc of + // the previous character which passed the quick check "yes && ccc==0" test. + const UChar *nextSrc; + uint16_t n16; + for (;;) { + if (src == limit) { + if (doCompose) { + buffer.appendZeroCC(prevBoundary, limit, errorCode); + } + return TRUE; + } + uint8_t prevCC = cc; + nextSrc = src; + UTRIE2_U16_NEXT16(normTrie, nextSrc, limit, c, n16); + if (n16 >= MIN_YES_YES_WITH_CC) { + cc = getCCFromNormalYesOrMaybe(n16); + if (prevCC > cc) { + if (!doCompose) { + return FALSE; + } + break; + } + } else { + break; + } + src = nextSrc; + } + // src is after the last in-order combining mark. + // If there is a boundary here, then we continue with no change. + if (norm16HasCompBoundaryBefore(n16)) { + if (isCompYesAndZeroCC(n16)) { + src = nextSrc; + } + continue; + } + // Use the slow path. There is no boundary in [prevSrc, src[. } - } else if(!doCompose && !isMaybeOrNonZeroCC(norm16)) { - return FALSE; } - /* - * Find appropriate boundaries around this character, - * decompose the source text from between the boundaries, - * and recompose it. - * - * We may need to remove the last few characters from the ReorderingBuffer - * to account for source text that was copied or appended - * but needs to take part in the recomposition. - */ - - /* - * Find the last composition boundary in [prevBoundary..src[. - * It is either the decomposition of the current character (at prevSrc), - * or prevBoundary. - */ - if(hasCompBoundaryBefore(c, norm16)) { - prevBoundary=prevSrc; - } else if(doCompose) { - buffer.removeSuffix((int32_t)(prevSrc-prevBoundary)); - } - - // Find the next composition boundary in [src..limit[ - - // modifies src to point to the next starter. - src=(UChar *)findNextCompBoundary(src, limit); - - // Decompose [prevBoundary..src[ into the buffer and then recompose that part of it. + // Slow path: Find the nearest boundaries around the current character, + // decompose and recompose. + if (prevBoundary != prevSrc && !norm16HasCompBoundaryBefore(norm16)) { + const UChar *p = prevSrc; + UTRIE2_U16_PREV16(normTrie, prevBoundary, p, c, norm16); + if (!norm16HasCompBoundaryAfter(norm16, onlyContiguous)) { + prevSrc = p; + } + } + if (doCompose && prevBoundary != prevSrc && !buffer.appendZeroCC(prevBoundary, prevSrc, errorCode)) { + break; + } int32_t recomposeStartIndex=buffer.length(); - if(!decomposeShort(prevBoundary, src, buffer, errorCode)) { + // We know there is not a boundary here. + decomposeShort(prevSrc, src, FALSE /* !stopAtCompBoundary */, onlyContiguous, + buffer, errorCode); + // Decompose until the next boundary. + src = decomposeShort(src, limit, TRUE /* stopAtCompBoundary */, onlyContiguous, + buffer, errorCode); + if (U_FAILURE(errorCode)) { break; } + if ((src - prevSrc) > INT32_MAX) { // guard before buffer.equals() + errorCode = U_INDEX_OUTOFBOUNDS_ERROR; + return TRUE; + } recompose(buffer, recomposeStartIndex, onlyContiguous); if(!doCompose) { - if(!buffer.equals(prevBoundary, src)) { + if(!buffer.equals(prevSrc, src)) { return FALSE; } buffer.remove(); - prevCC=0; } - - // Move to the next starter. We never need to look back before this point again. prevBoundary=src; } return TRUE; @@ -1340,30 +1600,28 @@ const UChar * Normalizer2Impl::composeQuickCheck(const UChar *src, const UChar *limit, UBool onlyContiguous, UNormalizationCheckResult *pQCResult) const { - /* - * prevBoundary points to the last character before the current one - * that has a composition boundary before it with ccc==0 and quick check "yes". - */ const UChar *prevBoundary=src; UChar32 minNoMaybeCP=minCompNoMaybeCP; if(limit==NULL) { UErrorCode errorCode=U_ZERO_ERROR; src=copyLowPrefixFromNulTerminated(src, minNoMaybeCP, NULL, errorCode); - if(prevBoundary=minNoNo. + // The current character is either a "noNo" (has a mapping) + // or a "maybeYes" (combines backward) + // or a "yesYes" with ccc!=0. + // It is not a Hangul syllable or Jamo L because those have "yes" properties. + + uint16_t prevNorm16 = INERT; + if (prevBoundary != prevSrc) { + if (norm16HasCompBoundaryBefore(norm16)) { + prevBoundary = prevSrc; + } else { + const UChar *p = prevSrc; + uint16_t n16; + UTRIE2_U16_PREV16(normTrie, prevBoundary, p, c, n16); + if (norm16HasCompBoundaryAfter(n16, onlyContiguous)) { + prevBoundary = prevSrc; + } else { + prevBoundary = p; + prevNorm16 = n16; + } } - prevCC=0; - // The start of the current character (c). - prevSrc=src; } - src+=U16_LENGTH(c); - /* - * isCompYesAndZeroCC(norm16) is false, that is, norm16>=minNoNo. - * c is either a "noNo" (has a mapping) or a "maybeYes" (combines backward) - * or has ccc!=0. - */ if(isMaybeOrNonZeroCC(norm16)) { uint8_t cc=getCCFromYesOrMaybe(norm16); - if( onlyContiguous && // FCC - cc!=0 && - prevCC==0 && - prevBoundarycc - ) { - // Fails FCD test. - } else if(prevCC<=cc || cc==0) { - prevCC=cc; - if(norm16 cc) { + // The [prevBoundary..prevSrc[ character + // passed the quick check "yes && ccc==0" test + // but is out of canonical order with the current combining mark. + } else { + // If !onlyContiguous (not FCC), then we ignore the tccc of + // the previous character which passed the quick check "yes && ccc==0" test. + const UChar *nextSrc; + for (;;) { + if (norm16 < MIN_YES_YES_WITH_CC) { + if (pQCResult != nullptr) { + *pQCResult = UNORM_MAYBE; + } else { + return prevBoundary; + } + } + if (src == limit) { + return src; + } + uint8_t prevCC = cc; + nextSrc = src; + UTRIE2_U16_NEXT16(normTrie, nextSrc, limit, c, norm16); + if (isMaybeOrNonZeroCC(norm16)) { + cc = getCCFromYesOrMaybe(norm16); + if (!(prevCC <= cc || cc == 0)) { + break; + } } else { - return prevBoundary; + break; } + src = nextSrc; + } + // src is after the last in-order combining mark. + if (isCompYesAndZeroCC(norm16)) { + prevBoundary = src; + src = nextSrc; + continue; } - continue; } } if(pQCResult!=NULL) { @@ -1453,10 +1732,10 @@ void Normalizer2Impl::composeAndAppend(const UChar *src, const UChar *limit, ReorderingBuffer &buffer, UErrorCode &errorCode) const { if(!buffer.isEmpty()) { - const UChar *firstStarterInSrc=findNextCompBoundary(src, limit); + const UChar *firstStarterInSrc=findNextCompBoundary(src, limit, onlyContiguous); if(src!=firstStarterInSrc) { const UChar *lastStarterInDest=findPreviousCompBoundary(buffer.getStart(), - buffer.getLimit()); + buffer.getLimit(), onlyContiguous); int32_t destSuffixLength=(int32_t)(buffer.getLimit()-lastStarterInDest); UnicodeString middle(lastStarterInDest, destSuffixLength); buffer.removeSuffix(destSuffixLength); @@ -1481,91 +1760,349 @@ void Normalizer2Impl::composeAndAppend(const UChar *src, const UChar *limit, } } -/** - * Does c have a composition boundary before it? - * True if its decomposition begins with a character that has - * ccc=0 && NFC_QC=Yes (isCompYesAndZeroCC()). - * As a shortcut, this is true if c itself has ccc=0 && NFC_QC=Yes - * (isCompYesAndZeroCC()) so we need not decompose. - */ -UBool Normalizer2Impl::hasCompBoundaryBefore(UChar32 c, uint16_t norm16) const { - for(;;) { - if(isCompYesAndZeroCC(norm16)) { +UBool +Normalizer2Impl::composeUTF8(uint32_t options, UBool onlyContiguous, + const uint8_t *src, const uint8_t *limit, + ByteSink *sink, Edits *edits, UErrorCode &errorCode) const { + U_ASSERT(limit != nullptr); + UnicodeString s16; + uint8_t minNoMaybeLead = leadByteForCP(minCompNoMaybeCP); + const uint8_t *prevBoundary = src; + + for (;;) { + // Fast path: Scan over a sequence of characters below the minimum "no or maybe" code point, + // or with (compYes && ccc==0) properties. + const uint8_t *prevSrc; + uint16_t norm16 = 0; + for (;;) { + if (src == limit) { + if (prevBoundary != limit && sink != nullptr) { + ByteSinkUtil::appendUnchanged(prevBoundary, limit, + *sink, options, edits, errorCode); + } + return TRUE; + } + if (*src < minNoMaybeLead) { + ++src; + } else { + prevSrc = src; + UTRIE2_U8_NEXT16(normTrie, src, limit, norm16); + if (!isCompYesAndZeroCC(norm16)) { + break; + } + } + } + // isCompYesAndZeroCC(norm16) is false, that is, norm16>=minNoNo. + // The current character is either a "noNo" (has a mapping) + // or a "maybeYes" (combines backward) + // or a "yesYes" with ccc!=0. + // It is not a Hangul syllable or Jamo L because those have "yes" properties. + + // Medium-fast path: Handle cases that do not require full decomposition and recomposition. + if (!isMaybeOrNonZeroCC(norm16)) { // minNoNo <= norm16 < minMaybeYes + if (sink == nullptr) { + return FALSE; + } + // Fast path for mapping a character that is immediately surrounded by boundaries. + // In this case, we need not decompose around the current character. + if (isDecompNoAlgorithmic(norm16)) { + // Maps to a single isCompYesAndZeroCC character + // which also implies hasCompBoundaryBefore. + if (norm16HasCompBoundaryAfter(norm16, onlyContiguous) || + hasCompBoundaryBefore(src, limit)) { + if (prevBoundary != prevSrc && + !ByteSinkUtil::appendUnchanged(prevBoundary, prevSrc, + *sink, options, edits, errorCode)) { + break; + } + appendCodePointDelta(prevSrc, src, getAlgorithmicDelta(norm16), *sink, edits); + prevBoundary = src; + continue; + } + } else if (norm16 < minNoNoCompBoundaryBefore) { + // The mapping is comp-normalized which also implies hasCompBoundaryBefore. + if (norm16HasCompBoundaryAfter(norm16, onlyContiguous) || + hasCompBoundaryBefore(src, limit)) { + if (prevBoundary != prevSrc && + !ByteSinkUtil::appendUnchanged(prevBoundary, prevSrc, + *sink, options, edits, errorCode)) { + break; + } + const uint16_t *mapping = getMapping(norm16); + int32_t length = *mapping++ & MAPPING_LENGTH_MASK; + if (!ByteSinkUtil::appendChange(prevSrc, src, (const UChar *)mapping, length, + *sink, edits, errorCode)) { + break; + } + prevBoundary = src; + continue; + } + } else if (norm16 >= minNoNoEmpty) { + // The current character maps to nothing. + // Simply omit it from the output if there is a boundary before _or_ after it. + // The character itself implies no boundaries. + if (hasCompBoundaryBefore(src, limit) || + hasCompBoundaryAfter(prevBoundary, prevSrc, onlyContiguous)) { + if (prevBoundary != prevSrc && + !ByteSinkUtil::appendUnchanged(prevBoundary, prevSrc, + *sink, options, edits, errorCode)) { + break; + } + if (edits != nullptr) { + edits->addReplace((int32_t)(src - prevSrc), 0); + } + prevBoundary = src; + continue; + } + } + // Other "noNo" type, or need to examine more text around this character: + // Fall through to the slow path. + } else if (isJamoVT(norm16)) { + // Jamo L: E1 84 80..92 + // Jamo V: E1 85 A1..B5 + // Jamo T: E1 86 A8..E1 87 82 + U_ASSERT((src - prevSrc) == 3 && *prevSrc == 0xe1); + UChar32 prev = previousHangulOrJamo(prevBoundary, prevSrc); + if (prevSrc[1] == 0x85) { + // The current character is a Jamo Vowel, + // compose with previous Jamo L and following Jamo T. + UChar32 l = prev - Hangul::JAMO_L_BASE; + if ((uint32_t)l < Hangul::JAMO_L_COUNT) { + if (sink == nullptr) { + return FALSE; + } + int32_t t = getJamoTMinusBase(src, limit); + if (t >= 0) { + // The next character is a Jamo T. + src += 3; + } else if (hasCompBoundaryBefore(src, limit)) { + // No Jamo T follows, not even via decomposition. + t = 0; + } + if (t >= 0) { + UChar32 syllable = Hangul::HANGUL_BASE + + (l*Hangul::JAMO_V_COUNT + (prevSrc[2]-0xa1)) * + Hangul::JAMO_T_COUNT + t; + prevSrc -= 3; // Replace the Jamo L as well. + if (prevBoundary != prevSrc && + !ByteSinkUtil::appendUnchanged(prevBoundary, prevSrc, + *sink, options, edits, errorCode)) { + break; + } + ByteSinkUtil::appendCodePoint(prevSrc, src, syllable, *sink, edits); + prevBoundary = src; + continue; + } + // If we see L+V+x where x!=T then we drop to the slow path, + // decompose and recompose. + // This is to deal with NFKC finding normal L and V but a + // compatibility variant of a T. + // We need to either fully compose that combination here + // (which would complicate the code and may not work with strange custom data) + // or use the slow path. + } + } else if (Hangul::isHangulLV(prev)) { + // The current character is a Jamo Trailing consonant, + // compose with previous Hangul LV that does not contain a Jamo T. + if (sink == nullptr) { + return FALSE; + } + UChar32 syllable = prev + getJamoTMinusBase(prevSrc, src); + prevSrc -= 3; // Replace the Hangul LV as well. + if (prevBoundary != prevSrc && + !ByteSinkUtil::appendUnchanged(prevBoundary, prevSrc, + *sink, options, edits, errorCode)) { + break; + } + ByteSinkUtil::appendCodePoint(prevSrc, src, syllable, *sink, edits); + prevBoundary = src; + continue; + } + // No matching context, or may need to decompose surrounding text first: + // Fall through to the slow path. + } else if (norm16 > JAMO_VT) { // norm16 >= MIN_YES_YES_WITH_CC + // One or more combining marks that do not combine-back: + // Check for canonical order, copy unchanged if ok and + // if followed by a character with a boundary-before. + uint8_t cc = getCCFromNormalYesOrMaybe(norm16); // cc!=0 + if (onlyContiguous /* FCC */ && getPreviousTrailCC(prevBoundary, prevSrc) > cc) { + // Fails FCD test, need to decompose and contiguously recompose. + if (sink == nullptr) { + return FALSE; + } + } else { + // If !onlyContiguous (not FCC), then we ignore the tccc of + // the previous character which passed the quick check "yes && ccc==0" test. + const uint8_t *nextSrc; + uint16_t n16; + for (;;) { + if (src == limit) { + if (sink != nullptr) { + ByteSinkUtil::appendUnchanged(prevBoundary, limit, + *sink, options, edits, errorCode); + } + return TRUE; + } + uint8_t prevCC = cc; + nextSrc = src; + UTRIE2_U8_NEXT16(normTrie, nextSrc, limit, n16); + if (n16 >= MIN_YES_YES_WITH_CC) { + cc = getCCFromNormalYesOrMaybe(n16); + if (prevCC > cc) { + if (sink == nullptr) { + return FALSE; + } + break; + } + } else { + break; + } + src = nextSrc; + } + // src is after the last in-order combining mark. + // If there is a boundary here, then we continue with no change. + if (norm16HasCompBoundaryBefore(n16)) { + if (isCompYesAndZeroCC(n16)) { + src = nextSrc; + } + continue; + } + // Use the slow path. There is no boundary in [prevSrc, src[. + } + } + + // Slow path: Find the nearest boundaries around the current character, + // decompose and recompose. + if (prevBoundary != prevSrc && !norm16HasCompBoundaryBefore(norm16)) { + const uint8_t *p = prevSrc; + UTRIE2_U8_PREV16(normTrie, prevBoundary, p, norm16); + if (!norm16HasCompBoundaryAfter(norm16, onlyContiguous)) { + prevSrc = p; + } + } + ReorderingBuffer buffer(*this, s16, errorCode); + if (U_FAILURE(errorCode)) { + break; + } + // We know there is not a boundary here. + decomposeShort(prevSrc, src, FALSE /* !stopAtCompBoundary */, onlyContiguous, + buffer, errorCode); + // Decompose until the next boundary. + src = decomposeShort(src, limit, TRUE /* stopAtCompBoundary */, onlyContiguous, + buffer, errorCode); + if (U_FAILURE(errorCode)) { + break; + } + if ((src - prevSrc) > INT32_MAX) { // guard before buffer.equals() + errorCode = U_INDEX_OUTOFBOUNDS_ERROR; return TRUE; - } else if(isMaybeOrNonZeroCC(norm16)) { - return FALSE; - } else if(isDecompNoAlgorithmic(norm16)) { - c=mapAlgorithmic(c, norm16); - norm16=getNorm16(c); - } else { - // c decomposes, get everything from the variable-length extra data - const uint16_t *mapping=getMapping(norm16); - uint16_t firstUnit=*mapping; - if((firstUnit&MAPPING_LENGTH_MASK)==0) { + } + recompose(buffer, 0, onlyContiguous); + if (!buffer.equals(prevSrc, src)) { + if (sink == nullptr) { return FALSE; } - if((firstUnit&MAPPING_HAS_CCC_LCCC_WORD) && (*(mapping-1)&0xff00)) { - return FALSE; // non-zero leadCC + if (prevBoundary != prevSrc && + !ByteSinkUtil::appendUnchanged(prevBoundary, prevSrc, + *sink, options, edits, errorCode)) { + break; + } + if (!ByteSinkUtil::appendChange(prevSrc, src, buffer.getStart(), buffer.length(), + *sink, edits, errorCode)) { + break; } - int32_t i=1; // skip over the firstUnit - UChar32 c; - U16_NEXT_UNSAFE(mapping, i, c); - return isCompYesAndZeroCC(getNorm16(c)); + prevBoundary = src; } } + return TRUE; } -UBool Normalizer2Impl::hasCompBoundaryAfter(UChar32 c, UBool onlyContiguous, UBool testInert) const { - for(;;) { - uint16_t norm16=getNorm16(c); - if(isInert(norm16)) { - return TRUE; - } else if(norm16<=minYesNo) { - // Hangul: norm16==minYesNo - // Hangul LVT has a boundary after it. - // Hangul LV and non-inert yesYes characters combine forward. - return isHangul(norm16) && !Hangul::isHangulWithoutJamoT((UChar)c); - } else if(norm16>= (testInert ? minNoNo : minMaybeYes)) { - return FALSE; - } else if(isDecompNoAlgorithmic(norm16)) { - c=mapAlgorithmic(c, norm16); - } else { - // c decomposes, get everything from the variable-length extra data. - // If testInert, then c must be a yesNo character which has lccc=0, - // otherwise it could be a noNo. - const uint16_t *mapping=getMapping(norm16); - uint16_t firstUnit=*mapping; - // TRUE if - // not MAPPING_NO_COMP_BOUNDARY_AFTER - // (which is set if - // c is not deleted, and - // it and its decomposition do not combine forward, and it has a starter) - // and if FCC then trailCC<=1 - return - (firstUnit&MAPPING_NO_COMP_BOUNDARY_AFTER)==0 && - (!onlyContiguous || firstUnit<=0x1ff); - } +UBool Normalizer2Impl::hasCompBoundaryBefore(const UChar *src, const UChar *limit) const { + if (src == limit || *src < minCompNoMaybeCP) { + return TRUE; } + UChar32 c; + uint16_t norm16; + UTRIE2_U16_NEXT16(normTrie, src, limit, c, norm16); + return norm16HasCompBoundaryBefore(norm16); } -const UChar *Normalizer2Impl::findPreviousCompBoundary(const UChar *start, const UChar *p) const { - BackwardUTrie2StringIterator iter(normTrie, start, p); +UBool Normalizer2Impl::hasCompBoundaryBefore(const uint8_t *src, const uint8_t *limit) const { + if (src == limit) { + return TRUE; + } uint16_t norm16; - do { - norm16=iter.previous16(); - } while(!hasCompBoundaryBefore(iter.codePoint, norm16)); - // We could also test hasCompBoundaryAfter() and return iter.codePointLimit, - // but that's probably not worth the extra cost. - return iter.codePointStart; + UTRIE2_U8_NEXT16(normTrie, src, limit, norm16); + return norm16HasCompBoundaryBefore(norm16); } -const UChar *Normalizer2Impl::findNextCompBoundary(const UChar *p, const UChar *limit) const { - ForwardUTrie2StringIterator iter(normTrie, p, limit); +UBool Normalizer2Impl::hasCompBoundaryAfter(const UChar *start, const UChar *p, + UBool onlyContiguous) const { + if (start == p) { + return TRUE; + } + UChar32 c; uint16_t norm16; - do { - norm16=iter.next16(); - } while(!hasCompBoundaryBefore(iter.codePoint, norm16)); - return iter.codePointStart; + UTRIE2_U16_PREV16(normTrie, start, p, c, norm16); + return norm16HasCompBoundaryAfter(norm16, onlyContiguous); +} + +UBool Normalizer2Impl::hasCompBoundaryAfter(const uint8_t *start, const uint8_t *p, + UBool onlyContiguous) const { + if (start == p) { + return TRUE; + } + uint16_t norm16; + UTRIE2_U8_PREV16(normTrie, start, p, norm16); + return norm16HasCompBoundaryAfter(norm16, onlyContiguous); +} + +const UChar *Normalizer2Impl::findPreviousCompBoundary(const UChar *start, const UChar *p, + UBool onlyContiguous) const { + BackwardUTrie2StringIterator iter(normTrie, start, p); + for(;;) { + uint16_t norm16=iter.previous16(); + if (norm16HasCompBoundaryAfter(norm16, onlyContiguous)) { + return iter.codePointLimit; + } + if (hasCompBoundaryBefore(iter.codePoint, norm16)) { + return iter.codePointStart; + } + } +} + +const UChar *Normalizer2Impl::findNextCompBoundary(const UChar *p, const UChar *limit, + UBool onlyContiguous) const { + ForwardUTrie2StringIterator iter(normTrie, p, limit); + for(;;) { + uint16_t norm16=iter.next16(); + if (hasCompBoundaryBefore(iter.codePoint, norm16)) { + return iter.codePointStart; + } + if (norm16HasCompBoundaryAfter(norm16, onlyContiguous)) { + return iter.codePointLimit; + } + } +} + +uint8_t Normalizer2Impl::getPreviousTrailCC(const UChar *start, const UChar *p) const { + if (start == p) { + return 0; + } + int32_t i = (int32_t)(p - start); + UChar32 c; + U16_PREV(start, 0, i, c); + return (uint8_t)getFCD16(c); +} + +uint8_t Normalizer2Impl::getPreviousTrailCC(const uint8_t *start, const uint8_t *p) const { + if (start == p) { + return 0; + } + int32_t i = (int32_t)(p - start); + UChar32 c; + U8_PREV(start, 0, i, c); + return (uint8_t)getFCD16(c); } // Note: normalizer2impl.cpp r30982 (2011-nov-27) @@ -1573,43 +2110,41 @@ const UChar *Normalizer2Impl::findNextCompBoundary(const UChar *p, const UChar * // That provided faster access to FCD data than getFCD16FromNormData() // but required synchronization and consumed some 10kB of heap memory // in any process that uses FCD (e.g., via collation). -// tccc180[] and smallFCD[] are intended to help with any loss of performance, -// at least for Latin & CJK. +// minDecompNoCP etc. and smallFCD[] are intended to help with any loss of performance, +// at least for ASCII & CJK. // Gets the FCD value from the regular normalization data. uint16_t Normalizer2Impl::getFCD16FromNormData(UChar32 c) const { - // Only loops for 1:1 algorithmic mappings. - for(;;) { - uint16_t norm16=getNorm16(c); - if(norm16<=minYesNo) { - // no decomposition or Hangul syllable, all zeros - return 0; - } else if(norm16>=MIN_NORMAL_MAYBE_YES) { + uint16_t norm16=getNorm16(c); + if (norm16 >= limitNoNo) { + if(norm16>=MIN_NORMAL_MAYBE_YES) { // combining mark - norm16&=0xff; + norm16=getCCFromNormalYesOrMaybe(norm16); return norm16|(norm16<<8); } else if(norm16>=minMaybeYes) { return 0; - } else if(isDecompNoAlgorithmic(norm16)) { - c=mapAlgorithmic(c, norm16); - } else { - // c decomposes, get everything from the variable-length extra data - const uint16_t *mapping=getMapping(norm16); - uint16_t firstUnit=*mapping; - if((firstUnit&MAPPING_LENGTH_MASK)==0) { - // A character that is deleted (maps to an empty string) must - // get the worst-case lccc and tccc values because arbitrary - // characters on both sides will become adjacent. - return 0x1ff; - } else { - norm16=firstUnit>>8; // tccc - if(firstUnit&MAPPING_HAS_CCC_LCCC_WORD) { - norm16|=*(mapping-1)&0xff00; // lccc - } - return norm16; + } else { // isDecompNoAlgorithmic(norm16) + uint16_t deltaTrailCC = norm16 & DELTA_TCCC_MASK; + if (deltaTrailCC <= DELTA_TCCC_1) { + return deltaTrailCC >> OFFSET_SHIFT; } + // Maps to an isCompYesAndZeroCC. + c=mapAlgorithmic(c, norm16); + norm16=getNorm16(c); } } + if(norm16<=minYesNo || isHangulLVT(norm16)) { + // no decomposition or Hangul syllable, all zeros + return 0; + } + // c decomposes, get everything from the variable-length extra data + const uint16_t *mapping=getMapping(norm16); + uint16_t firstUnit=*mapping; + norm16=firstUnit>>8; // tccc + if(firstUnit&MAPPING_HAS_CCC_LCCC_WORD) { + norm16|=*(mapping-1)&0xff00; // lccc + } + return norm16; } // Dual functionality: @@ -1624,7 +2159,7 @@ Normalizer2Impl::makeFCD(const UChar *src, const UChar *limit, const UChar *prevBoundary=src; int32_t prevFCD16=0; if(limit==NULL) { - src=copyLowPrefixFromNulTerminated(src, MIN_CCC_LCCC_CP, buffer, errorCode); + src=copyLowPrefixFromNulTerminated(src, minLcccCP, buffer, errorCode); if(U_FAILURE(errorCode)) { return src; } @@ -1653,7 +2188,7 @@ Normalizer2Impl::makeFCD(const UChar *src, const UChar *limit, for(;;) { // count code units with lccc==0 for(prevSrc=src; src!=limit;) { - if((c=*src)1) { - --prevBoundary; + if(prev1) { + --prevBoundary; + } } } else { const UChar *p=src-1; @@ -1748,7 +2287,8 @@ Normalizer2Impl::makeFCD(const UChar *src, const UChar *limit, * The source text does not fulfill the conditions for FCD. * Decompose and reorder a limited piece of the text. */ - if(!decomposeShort(prevBoundary, src, *buffer, errorCode)) { + decomposeShort(prevBoundary, src, FALSE, FALSE, *buffer, errorCode); + if (U_FAILURE(errorCode)) { break; } prevBoundary=src; @@ -1792,16 +2332,33 @@ void Normalizer2Impl::makeFCDAndAppend(const UChar *src, const UChar *limit, } const UChar *Normalizer2Impl::findPreviousFCDBoundary(const UChar *start, const UChar *p) const { - while(start

      0xff) {} + while(startmakeCanonIterDataFromNorm16( - start, end, (uint16_t)value, *impl->fCanonIterData, errorCode); + InitCanonIterData::handleRange(impl, start, end, (uint16_t)value, errorCode); } return U_SUCCESS(errorCode); } +U_CDECL_END - -// UInitOnce instantiation function for CanonIterData - -static void U_CALLCONV -initCanonIterData(Normalizer2Impl *impl, UErrorCode &errorCode) { +void InitCanonIterData::doInit(Normalizer2Impl *impl, UErrorCode &errorCode) { U_ASSERT(impl->fCanonIterData == NULL); impl->fCanonIterData = new CanonIterData(errorCode); if (impl->fCanonIterData == NULL) { errorCode=U_MEMORY_ALLOCATION_ERROR; } if (U_SUCCESS(errorCode)) { - utrie2_enum(impl->getNormTrie(), NULL, enumCIDRangeHandler, impl); + utrie2_enum(impl->normTrie, NULL, enumCIDRangeHandler, impl); utrie2_freeze(impl->fCanonIterData->trie, UTRIE2_32_VALUE_BITS, &errorCode); } if (U_FAILURE(errorCode)) { @@ -1881,12 +2447,15 @@ initCanonIterData(Normalizer2Impl *impl, UErrorCode &errorCode) { } } -U_CDECL_END +void InitCanonIterData::handleRange( + Normalizer2Impl *impl, UChar32 start, UChar32 end, uint16_t value, UErrorCode &errorCode) { + impl->makeCanonIterDataFromNorm16(start, end, value, *impl->fCanonIterData, errorCode); +} -void Normalizer2Impl::makeCanonIterDataFromNorm16(UChar32 start, UChar32 end, uint16_t norm16, +void Normalizer2Impl::makeCanonIterDataFromNorm16(UChar32 start, UChar32 end, const uint16_t norm16, CanonIterData &newData, UErrorCode &errorCode) const { - if(norm16==0 || (minYesNo<=norm16 && norm16=minMaybeYes) { + if(isMaybeOrNonZeroCC(norm16)) { // not a segment starter if it occurs in a decomposition or has cc!=0 newValue|=CANON_NOT_SEGMENT_STARTER; if(norm16 minYesNo) { // c decomposes, get everything from the variable-length extra data const uint16_t *mapping=getMapping(norm16_2); uint16_t firstUnit=*mapping; @@ -2017,7 +2590,7 @@ unorm2_swap(const UDataSwapper *ds, uint8_t *outBytes; const int32_t *inIndexes; - int32_t indexes[Normalizer2Impl::IX_MIN_MAYBE_YES+1]; + int32_t indexes[Normalizer2Impl::IX_TOTAL_SIZE+1]; int32_t i, offset, nextOffset, size; @@ -2029,12 +2602,13 @@ unorm2_swap(const UDataSwapper *ds, /* check data format and format version */ pInfo=(const UDataInfo *)((const char *)inData+4); + uint8_t formatVersion0=pInfo->formatVersion[0]; if(!( pInfo->dataFormat[0]==0x4e && /* dataFormat="Nrm2" */ pInfo->dataFormat[1]==0x72 && pInfo->dataFormat[2]==0x6d && pInfo->dataFormat[3]==0x32 && - (pInfo->formatVersion[0]==1 || pInfo->formatVersion[0]==2) + (1<=formatVersion0 && formatVersion0<=3) )) { udata_printError(ds, "unorm2_swap(): data format %02x.%02x.%02x.%02x (format version %02x) is not recognized as Normalizer2 data\n", pInfo->dataFormat[0], pInfo->dataFormat[1], @@ -2048,10 +2622,18 @@ unorm2_swap(const UDataSwapper *ds, outBytes=(uint8_t *)outData+headerSize; inIndexes=(const int32_t *)inBytes; + int32_t minIndexesLength; + if(formatVersion0==1) { + minIndexesLength=Normalizer2Impl::IX_MIN_MAYBE_YES+1; + } else if(formatVersion0==2) { + minIndexesLength=Normalizer2Impl::IX_MIN_YES_NO_MAPPINGS_ONLY+1; + } else { + minIndexesLength=Normalizer2Impl::IX_MIN_LCCC_CP+1; + } if(length>=0) { length-=headerSize; - if(length<(int32_t)sizeof(indexes)) { + if(length=MIN_NORMAL_MAYBE_YES) { - return (uint8_t)norm16; + return getCCFromNormalYesOrMaybe(norm16); } if(norm16> OFFSET_SHIFT); + } static uint8_t getCCFromYesOrMaybe(uint16_t norm16) { - return norm16>=MIN_NORMAL_MAYBE_YES ? (uint8_t)norm16 : 0; + return norm16>=MIN_NORMAL_MAYBE_YES ? getCCFromNormalYesOrMaybe(norm16) : 0; + } + uint8_t getCCFromYesOrMaybeCP(UChar32 c) const { + if (c < minCompNoMaybeCP) { return 0; } + return getCCFromYesOrMaybe(getNorm16(c)); } /** @@ -272,10 +295,8 @@ public: * @return The lccc(c) in bits 15..8 and tccc(c) in bits 7..0. */ uint16_t getFCD16(UChar32 c) const { - if(c<0) { + if(c1) for quick FCC boundary-after tests. + DELTA_TCCC_0=0, + DELTA_TCCC_1=2, + DELTA_TCCC_GT_1=4, + DELTA_TCCC_MASK=6, + DELTA_SHIFT=3, - enum { - MIN_YES_YES_WITH_CC=0xff01, - JAMO_VT=0xff00, - MIN_NORMAL_MAYBE_YES=0xfe00, - JAMO_L=1, MAX_DELTA=0x40 }; @@ -394,21 +419,32 @@ public: IX_MIN_COMP_NO_MAYBE_CP, // Norm16 value thresholds for quick check combinations and types of extra data. - IX_MIN_YES_NO, // Mappings & compositions in [minYesNo..minYesNoMappingsOnly[. + + /** Mappings & compositions in [minYesNo..minYesNoMappingsOnly[. */ + IX_MIN_YES_NO, + /** Mappings are comp-normalized. */ IX_MIN_NO_NO, IX_LIMIT_NO_NO, IX_MIN_MAYBE_YES, - IX_MIN_YES_NO_MAPPINGS_ONLY, // Mappings only in [minYesNoMappingsOnly..minNoNo[. - - IX_RESERVED15, + /** Mappings only in [minYesNoMappingsOnly..minNoNo[. */ + IX_MIN_YES_NO_MAPPINGS_ONLY, + /** Mappings are not comp-normalized but have a comp boundary before. */ + IX_MIN_NO_NO_COMP_BOUNDARY_BEFORE, + /** Mappings do not have a comp boundary before. */ + IX_MIN_NO_NO_COMP_NO_MAYBE_CC, + /** Mappings to the empty string. */ + IX_MIN_NO_NO_EMPTY, + + IX_MIN_LCCC_CP, + IX_RESERVED19, IX_COUNT }; enum { MAPPING_HAS_CCC_LCCC_WORD=0x80, MAPPING_HAS_RAW_MAPPING=0x40, - MAPPING_NO_COMP_BOUNDARY_AFTER=0x20, + // unused bit 0x20, MAPPING_LENGTH_MASK=0x1f }; @@ -457,6 +493,12 @@ public: UnicodeString &safeMiddle, ReorderingBuffer &buffer, UErrorCode &errorCode) const; + + /** sink==nullptr: isNormalized() */ + UBool composeUTF8(uint32_t options, UBool onlyContiguous, + const uint8_t *src, const uint8_t *limit, + ByteSink *sink, icu::Edits *edits, UErrorCode &errorCode) const; + const UChar *makeFCD(const UChar *src, const UChar *limit, ReorderingBuffer *buffer, UErrorCode &errorCode) const; void makeFCDAndAppend(const UChar *src, const UChar *limit, @@ -465,27 +507,42 @@ public: ReorderingBuffer &buffer, UErrorCode &errorCode) const; - UBool hasDecompBoundary(UChar32 c, UBool before) const; + UBool hasDecompBoundaryBefore(UChar32 c) const; + UBool norm16HasDecompBoundaryBefore(uint16_t norm16) const; + UBool hasDecompBoundaryAfter(UChar32 c) const; + UBool norm16HasDecompBoundaryAfter(uint16_t norm16) const; UBool isDecompInert(UChar32 c) const { return isDecompYesAndZeroCC(getNorm16(c)); } UBool hasCompBoundaryBefore(UChar32 c) const { - return c=minMaybeYes; } - static UBool isInert(uint16_t norm16) { return norm16==0; } - static UBool isJamoL(uint16_t norm16) { return norm16==1; } + static UBool isInert(uint16_t norm16) { return norm16==INERT; } + static UBool isJamoL(uint16_t norm16) { return norm16==JAMO_L; } static UBool isJamoVT(uint16_t norm16) { return norm16==JAMO_VT; } - UBool isHangul(uint16_t norm16) const { return norm16==minYesNo; } + uint16_t hangulLVT() const { return minYesNoMappingsOnly|HAS_COMP_BOUNDARY_AFTER; } + UBool isHangulLV(uint16_t norm16) const { return norm16==minYesNo; } + UBool isHangulLVT(uint16_t norm16) const { + return norm16==hangulLVT(); + } UBool isCompYesAndZeroCC(uint16_t norm16) const { return norm16=MIN_YES_YES_WITH_CC || norm16=MIN_YES_YES_WITH_CC ? (uint8_t)norm16 : 0; + // return norm16>=MIN_YES_YES_WITH_CC ? getCCFromNormalYesOrMaybe(norm16) : 0; // } uint8_t getCCFromNoNo(uint16_t norm16) const { const uint16_t *mapping=getMapping(norm16); @@ -525,30 +582,47 @@ private: } } // requires that the [cpStart..cpLimit[ character passes isCompYesAndZeroCC() - uint8_t getTrailCCFromCompYesAndZeroCC(const UChar *cpStart, const UChar *cpLimit) const; + uint8_t getTrailCCFromCompYesAndZeroCC(uint16_t norm16) const { + if(norm16<=minYesNo) { + return 0; // yesYes and Hangul LV have ccc=tccc=0 + } else { + // For Hangul LVT we harmlessly fetch a firstUnit with tccc=0 here. + return (uint8_t)(*getMapping(norm16)>>8); // tccc from yesNo + } + } + uint8_t getPreviousTrailCC(const UChar *start, const UChar *p) const; + uint8_t getPreviousTrailCC(const uint8_t *start, const uint8_t *p) const; // Requires algorithmic-NoNo. UChar32 mapAlgorithmic(UChar32 c, uint16_t norm16) const { - return c+norm16-(minMaybeYes-MAX_DELTA-1); + return c+(norm16>>DELTA_SHIFT)-centerNoNoDelta; + } + UChar32 getAlgorithmicDelta(uint16_t norm16) const { + return (norm16>>DELTA_SHIFT)-centerNoNoDelta; } // Requires minYesNo>OFFSET_SHIFT); } const uint16_t *getCompositionsListForDecompYes(uint16_t norm16) const { - if(norm16==0 || MIN_NORMAL_MAYBE_YES<=norm16) { + if(norm16>OFFSET_SHIFT); + } /** * @param c code point must have compositions * @return compositions list pointer @@ -563,46 +637,78 @@ private: UChar32 minNeedDataCP, ReorderingBuffer *buffer, UErrorCode &errorCode) const; - UBool decomposeShort(const UChar *src, const UChar *limit, - ReorderingBuffer &buffer, UErrorCode &errorCode) const; + const UChar *decomposeShort(const UChar *src, const UChar *limit, + UBool stopAtCompBoundary, UBool onlyContiguous, + ReorderingBuffer &buffer, UErrorCode &errorCode) const; UBool decompose(UChar32 c, uint16_t norm16, ReorderingBuffer &buffer, UErrorCode &errorCode) const; + const uint8_t *decomposeShort(const uint8_t *src, const uint8_t *limit, + UBool stopAtCompBoundary, UBool onlyContiguous, + ReorderingBuffer &buffer, UErrorCode &errorCode) const; + static int32_t combine(const uint16_t *list, UChar32 trail); void addComposites(const uint16_t *list, UnicodeSet &set) const; void recompose(ReorderingBuffer &buffer, int32_t recomposeStartIndex, UBool onlyContiguous) const; - UBool hasCompBoundaryBefore(UChar32 c, uint16_t norm16) const; - const UChar *findPreviousCompBoundary(const UChar *start, const UChar *p) const; - const UChar *findNextCompBoundary(const UChar *p, const UChar *limit) const; + UBool hasCompBoundaryBefore(UChar32 c, uint16_t norm16) const { + return c -#include "unicode/utypes.h" -#include "cmemory.h" -#include "utrie.h" -#include "utrie2.h" -#include "uarrsort.h" -#include "propsvec.h" -#include "uassert.h" - -struct UPropsVectors { - uint32_t *v; - int32_t columns; /* number of columns, plus two for start & limit values */ - int32_t maxRows; - int32_t rows; - int32_t prevRow; /* search optimization: remember last row seen */ - UBool isCompacted; -}; - -#define UPVEC_INITIAL_ROWS (1<<12) -#define UPVEC_MEDIUM_ROWS ((int32_t)1<<16) -#define UPVEC_MAX_ROWS (UPVEC_MAX_CP+1) - -U_CAPI UPropsVectors * U_EXPORT2 -upvec_open(int32_t columns, UErrorCode *pErrorCode) { - UPropsVectors *pv; - uint32_t *v, *row; - uint32_t cp; - - if(U_FAILURE(*pErrorCode)) { - return NULL; - } - if(columns<1) { - *pErrorCode=U_ILLEGAL_ARGUMENT_ERROR; - return NULL; - } - columns+=2; /* count range start and limit columns */ - - pv=(UPropsVectors *)uprv_malloc(sizeof(UPropsVectors)); - v=(uint32_t *)uprv_malloc(UPVEC_INITIAL_ROWS*columns*4); - if(pv==NULL || v==NULL) { - uprv_free(pv); - uprv_free(v); - *pErrorCode=U_MEMORY_ALLOCATION_ERROR; - return NULL; - } - uprv_memset(pv, 0, sizeof(UPropsVectors)); - pv->v=v; - pv->columns=columns; - pv->maxRows=UPVEC_INITIAL_ROWS; - pv->rows=2+(UPVEC_MAX_CP-UPVEC_FIRST_SPECIAL_CP); - - /* set the all-Unicode row and the special-value rows */ - row=pv->v; - uprv_memset(row, 0, pv->rows*columns*4); - row[0]=0; - row[1]=0x110000; - row+=columns; - for(cp=UPVEC_FIRST_SPECIAL_CP; cp<=UPVEC_MAX_CP; ++cp) { - row[0]=cp; - row[1]=cp+1; - row+=columns; - } - return pv; -} - -U_CAPI void U_EXPORT2 -upvec_close(UPropsVectors *pv) { - if(pv!=NULL) { - uprv_free(pv->v); - uprv_free(pv); - } -} - -static uint32_t * -_findRow(UPropsVectors *pv, UChar32 rangeStart) { - uint32_t *row; - int32_t columns, i, start, limit, prevRow; - - columns=pv->columns; - limit=pv->rows; - prevRow=pv->prevRow; - - /* check the vicinity of the last-seen row (start searching with an unrolled loop) */ - row=pv->v+prevRow*columns; - if(rangeStart>=(UChar32)row[0]) { - if(rangeStart<(UChar32)row[1]) { - /* same row as last seen */ - return row; - } else if(rangeStart<(UChar32)(row+=columns)[1]) { - /* next row after the last one */ - pv->prevRow=prevRow+1; - return row; - } else if(rangeStart<(UChar32)(row+=columns)[1]) { - /* second row after the last one */ - pv->prevRow=prevRow+2; - return row; - } else if((rangeStart-(UChar32)row[1])<10) { - /* we are close, continue looping */ - prevRow+=2; - do { - ++prevRow; - row+=columns; - } while(rangeStart>=(UChar32)row[1]); - pv->prevRow=prevRow; - return row; - } - } else if(rangeStart<(UChar32)pv->v[1]) { - /* the very first row */ - pv->prevRow=0; - return pv->v; - } - - /* do a binary search for the start of the range */ - start=0; - while(startv+i*columns; - if(rangeStart<(UChar32)row[0]) { - limit=i; - } else if(rangeStart<(UChar32)row[1]) { - pv->prevRow=i; - return row; - } else { - start=i; - } - } - - /* must be found because all ranges together always cover all of Unicode */ - pv->prevRow=start; - return pv->v+start*columns; -} - -U_CAPI void U_EXPORT2 -upvec_setValue(UPropsVectors *pv, - UChar32 start, UChar32 end, - int32_t column, - uint32_t value, uint32_t mask, - UErrorCode *pErrorCode) { - uint32_t *firstRow, *lastRow; - int32_t columns; - UChar32 limit; - UBool splitFirstRow, splitLastRow; - - /* argument checking */ - if(U_FAILURE(*pErrorCode)) { - return; - } - if( pv==NULL || - start<0 || start>end || end>UPVEC_MAX_CP || - column<0 || column>=(pv->columns-2) - ) { - *pErrorCode=U_ILLEGAL_ARGUMENT_ERROR; - return; - } - if(pv->isCompacted) { - *pErrorCode=U_NO_WRITE_PERMISSION; - return; - } - limit=end+1; - - /* initialize */ - columns=pv->columns; - column+=2; /* skip range start and limit columns */ - value&=mask; - - /* find the rows whose ranges overlap with the input range */ - - /* find the first and last rows, always successful */ - firstRow=_findRow(pv, start); - lastRow=_findRow(pv, end); - - /* - * Rows need to be split if they partially overlap with the - * input range (only possible for the first and last rows) - * and if their value differs from the input value. - */ - splitFirstRow= (UBool)(start!=(UChar32)firstRow[0] && value!=(firstRow[column]&mask)); - splitLastRow= (UBool)(limit!=(UChar32)lastRow[1] && value!=(lastRow[column]&mask)); - - /* split first/last rows if necessary */ - if(splitFirstRow || splitLastRow) { - int32_t count, rows; - - rows=pv->rows; - if((rows+splitFirstRow+splitLastRow)>pv->maxRows) { - uint32_t *newVectors; - int32_t newMaxRows; - - if(pv->maxRowsmaxRowsv, (size_t)rows*columns*4); - firstRow=newVectors+(firstRow-pv->v); - lastRow=newVectors+(lastRow-pv->v); - uprv_free(pv->v); - pv->v=newVectors; - pv->maxRows=newMaxRows; - } - - /* count the number of row cells to move after the last row, and move them */ - count = (int32_t)((pv->v+rows*columns)-(lastRow+columns)); - if(count>0) { - uprv_memmove( - lastRow+(1+splitFirstRow+splitLastRow)*columns, - lastRow+columns, - count*4); - } - pv->rows=rows+splitFirstRow+splitLastRow; - - /* split the first row, and move the firstRow pointer to the second part */ - if(splitFirstRow) { - /* copy all affected rows up one and move the lastRow pointer */ - count = (int32_t)((lastRow-firstRow)+columns); - uprv_memmove(firstRow+columns, firstRow, (size_t)count*4); - lastRow+=columns; - - /* split the range and move the firstRow pointer */ - firstRow[1]=firstRow[columns]=(uint32_t)start; - firstRow+=columns; - } - - /* split the last row */ - if(splitLastRow) { - /* copy the last row data */ - uprv_memcpy(lastRow+columns, lastRow, (size_t)columns*4); - - /* split the range and move the firstRow pointer */ - lastRow[1]=lastRow[columns]=(uint32_t)limit; - } - } - - /* set the "row last seen" to the last row for the range */ - pv->prevRow=(int32_t)((lastRow-(pv->v))/columns); - - /* set the input value in all remaining rows */ - firstRow+=column; - lastRow+=column; - mask=~mask; - for(;;) { - *firstRow=(*firstRow&mask)|value; - if(firstRow==lastRow) { - break; - } - firstRow+=columns; - } -} - -U_CAPI uint32_t U_EXPORT2 -upvec_getValue(const UPropsVectors *pv, UChar32 c, int32_t column) { - uint32_t *row; - UPropsVectors *ncpv; - - if(pv->isCompacted || c<0 || c>UPVEC_MAX_CP || column<0 || column>=(pv->columns-2)) { - return 0; - } - ncpv=(UPropsVectors *)pv; - row=_findRow(ncpv, c); - return row[2+column]; -} - -U_CAPI uint32_t * U_EXPORT2 -upvec_getRow(const UPropsVectors *pv, int32_t rowIndex, - UChar32 *pRangeStart, UChar32 *pRangeEnd) { - uint32_t *row; - int32_t columns; - - if(pv->isCompacted || rowIndex<0 || rowIndex>=pv->rows) { - return NULL; - } - - columns=pv->columns; - row=pv->v+rowIndex*columns; - if(pRangeStart!=NULL) { - *pRangeStart=(UChar32)row[0]; - } - if(pRangeEnd!=NULL) { - *pRangeEnd=(UChar32)row[1]-1; - } - return row+2; -} - -static int32_t U_CALLCONV -upvec_compareRows(const void *context, const void *l, const void *r) { - const uint32_t *left=(const uint32_t *)l, *right=(const uint32_t *)r; - const UPropsVectors *pv=(const UPropsVectors *)context; - int32_t i, count, columns; - - count=columns=pv->columns; /* includes start/limit columns */ - - /* start comparing after start/limit but wrap around to them */ - i=2; - do { - if(left[i]!=right[i]) { - return left[i]0); - - return 0; -} - -U_CAPI void U_EXPORT2 -upvec_compact(UPropsVectors *pv, UPVecCompactHandler *handler, void *context, UErrorCode *pErrorCode) { - uint32_t *row; - int32_t i, columns, valueColumns, rows, count; - UChar32 start, limit; - - /* argument checking */ - if(U_FAILURE(*pErrorCode)) { - return; - } - if(handler==NULL) { - *pErrorCode=U_ILLEGAL_ARGUMENT_ERROR; - return; - } - if(pv->isCompacted) { - return; - } - - /* Set the flag now: Sorting and compacting destroys the builder data structure. */ - pv->isCompacted=TRUE; - - rows=pv->rows; - columns=pv->columns; - U_ASSERT(columns>=3); /* upvec_open asserts this */ - valueColumns=columns-2; /* not counting start & limit */ - - /* sort the properties vectors to find unique vector values */ - uprv_sortArray(pv->v, rows, columns*4, - upvec_compareRows, pv, FALSE, pErrorCode); - if(U_FAILURE(*pErrorCode)) { - return; - } - - /* - * Find and set the special values. - * This has to do almost the same work as the compaction below, - * to find the indexes where the special-value rows will move. - */ - row=pv->v; - count=-valueColumns; - for(i=0; i=UPVEC_FIRST_SPECIAL_CP) { - handler(context, start, start, count, row+2, valueColumns, pErrorCode); - if(U_FAILURE(*pErrorCode)) { - return; - } - } - - row+=columns; - } - - /* count is at the beginning of the last vector, add valueColumns to include that last vector */ - count+=valueColumns; - - /* Call the handler once more to signal the start of delivering real values. */ - handler(context, UPVEC_START_REAL_VALUES_CP, UPVEC_START_REAL_VALUES_CP, - count, row-valueColumns, valueColumns, pErrorCode); - if(U_FAILURE(*pErrorCode)) { - return; - } - - /* - * Move vector contents up to a contiguous array with only unique - * vector values, and call the handler function for each vector. - * - * This destroys the Properties Vector structure and replaces it - * with an array of just vector values. - */ - row=pv->v; - count=-valueColumns; - for(i=0; iv+count, valueColumns*4)) { - count+=valueColumns; - uprv_memmove(pv->v+count, row+2, (size_t)valueColumns*4); - } - - if(startv+count, valueColumns, pErrorCode); - if(U_FAILURE(*pErrorCode)) { - return; - } - } - - row+=columns; - } - - /* count is at the beginning of the last vector, add one to include that last vector */ - pv->rows=count/valueColumns+1; -} - -U_CAPI const uint32_t * U_EXPORT2 -upvec_getArray(const UPropsVectors *pv, int32_t *pRows, int32_t *pColumns) { - if(!pv->isCompacted) { - return NULL; - } - if(pRows!=NULL) { - *pRows=pv->rows; - } - if(pColumns!=NULL) { - *pColumns=pv->columns-2; - } - return pv->v; -} - -U_CAPI uint32_t * U_EXPORT2 -upvec_cloneArray(const UPropsVectors *pv, - int32_t *pRows, int32_t *pColumns, UErrorCode *pErrorCode) { - uint32_t *clonedArray; - int32_t byteLength; - - if(U_FAILURE(*pErrorCode)) { - return NULL; - } - if(!pv->isCompacted) { - *pErrorCode=U_ILLEGAL_ARGUMENT_ERROR; - return NULL; - } - byteLength=pv->rows*(pv->columns-2)*4; - clonedArray=(uint32_t *)uprv_malloc(byteLength); - if(clonedArray==NULL) { - *pErrorCode=U_MEMORY_ALLOCATION_ERROR; - return NULL; - } - uprv_memcpy(clonedArray, pv->v, byteLength); - if(pRows!=NULL) { - *pRows=pv->rows; - } - if(pColumns!=NULL) { - *pColumns=pv->columns-2; - } - return clonedArray; -} - -U_CAPI UTrie2 * U_EXPORT2 -upvec_compactToUTrie2WithRowIndexes(UPropsVectors *pv, UErrorCode *pErrorCode) { - UPVecToUTrie2Context toUTrie2={ NULL, 0, 0, 0 }; - upvec_compact(pv, upvec_compactToUTrie2Handler, &toUTrie2, pErrorCode); - utrie2_freeze(toUTrie2.trie, UTRIE2_16_VALUE_BITS, pErrorCode); - if(U_FAILURE(*pErrorCode)) { - utrie2_close(toUTrie2.trie); - toUTrie2.trie=NULL; - } - return toUTrie2.trie; -} - -/* - * TODO(markus): Add upvec_16BitsToUTrie2() function that enumerates all rows, extracts - * some 16-bit field and builds and returns a UTrie2. - */ - -U_CAPI void U_CALLCONV -upvec_compactToUTrie2Handler(void *context, - UChar32 start, UChar32 end, - int32_t rowIndex, uint32_t *row, int32_t columns, - UErrorCode *pErrorCode) { - UPVecToUTrie2Context *toUTrie2=(UPVecToUTrie2Context *)context; - if(starttrie, start, end, (uint32_t)rowIndex, TRUE, pErrorCode); - } else { - switch(start) { - case UPVEC_INITIAL_VALUE_CP: - toUTrie2->initialValue=rowIndex; - break; - case UPVEC_ERROR_VALUE_CP: - toUTrie2->errorValue=rowIndex; - break; - case UPVEC_START_REAL_VALUES_CP: - toUTrie2->maxValue=rowIndex; - if(rowIndex>0xffff) { - /* too many rows for a 16-bit trie */ - *pErrorCode=U_INDEX_OUTOFBOUNDS_ERROR; - } else { - toUTrie2->trie=utrie2_open(toUTrie2->initialValue, - toUTrie2->errorValue, pErrorCode); - } - break; - default: - break; - } - } -} diff --git a/Build/source/libs/icu/icu-src/source/common/propsvec.cpp b/Build/source/libs/icu/icu-src/source/common/propsvec.cpp new file mode 100644 index 00000000000..056fcda9cf6 --- /dev/null +++ b/Build/source/libs/icu/icu-src/source/common/propsvec.cpp @@ -0,0 +1,529 @@ +// © 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html +/* +******************************************************************************* +* +* Copyright (C) 2002-2011, International Business Machines +* Corporation and others. All Rights Reserved. +* +******************************************************************************* +* file name: propsvec.c +* encoding: UTF-8 +* tab size: 8 (not used) +* indentation:4 +* +* created on: 2002feb22 +* created by: Markus W. Scherer +* +* Store bits (Unicode character properties) in bit set vectors. +*/ + +#include +#include "unicode/utypes.h" +#include "cmemory.h" +#include "utrie.h" +#include "utrie2.h" +#include "uarrsort.h" +#include "propsvec.h" +#include "uassert.h" + +struct UPropsVectors { + uint32_t *v; + int32_t columns; /* number of columns, plus two for start & limit values */ + int32_t maxRows; + int32_t rows; + int32_t prevRow; /* search optimization: remember last row seen */ + UBool isCompacted; +}; + +#define UPVEC_INITIAL_ROWS (1<<12) +#define UPVEC_MEDIUM_ROWS ((int32_t)1<<16) +#define UPVEC_MAX_ROWS (UPVEC_MAX_CP+1) + +U_CAPI UPropsVectors * U_EXPORT2 +upvec_open(int32_t columns, UErrorCode *pErrorCode) { + UPropsVectors *pv; + uint32_t *v, *row; + uint32_t cp; + + if(U_FAILURE(*pErrorCode)) { + return NULL; + } + if(columns<1) { + *pErrorCode=U_ILLEGAL_ARGUMENT_ERROR; + return NULL; + } + columns+=2; /* count range start and limit columns */ + + pv=(UPropsVectors *)uprv_malloc(sizeof(UPropsVectors)); + v=(uint32_t *)uprv_malloc(UPVEC_INITIAL_ROWS*columns*4); + if(pv==NULL || v==NULL) { + uprv_free(pv); + uprv_free(v); + *pErrorCode=U_MEMORY_ALLOCATION_ERROR; + return NULL; + } + uprv_memset(pv, 0, sizeof(UPropsVectors)); + pv->v=v; + pv->columns=columns; + pv->maxRows=UPVEC_INITIAL_ROWS; + pv->rows=2+(UPVEC_MAX_CP-UPVEC_FIRST_SPECIAL_CP); + + /* set the all-Unicode row and the special-value rows */ + row=pv->v; + uprv_memset(row, 0, pv->rows*columns*4); + row[0]=0; + row[1]=0x110000; + row+=columns; + for(cp=UPVEC_FIRST_SPECIAL_CP; cp<=UPVEC_MAX_CP; ++cp) { + row[0]=cp; + row[1]=cp+1; + row+=columns; + } + return pv; +} + +U_CAPI void U_EXPORT2 +upvec_close(UPropsVectors *pv) { + if(pv!=NULL) { + uprv_free(pv->v); + uprv_free(pv); + } +} + +static uint32_t * +_findRow(UPropsVectors *pv, UChar32 rangeStart) { + uint32_t *row; + int32_t columns, i, start, limit, prevRow; + + columns=pv->columns; + limit=pv->rows; + prevRow=pv->prevRow; + + /* check the vicinity of the last-seen row (start searching with an unrolled loop) */ + row=pv->v+prevRow*columns; + if(rangeStart>=(UChar32)row[0]) { + if(rangeStart<(UChar32)row[1]) { + /* same row as last seen */ + return row; + } else if(rangeStart<(UChar32)(row+=columns)[1]) { + /* next row after the last one */ + pv->prevRow=prevRow+1; + return row; + } else if(rangeStart<(UChar32)(row+=columns)[1]) { + /* second row after the last one */ + pv->prevRow=prevRow+2; + return row; + } else if((rangeStart-(UChar32)row[1])<10) { + /* we are close, continue looping */ + prevRow+=2; + do { + ++prevRow; + row+=columns; + } while(rangeStart>=(UChar32)row[1]); + pv->prevRow=prevRow; + return row; + } + } else if(rangeStart<(UChar32)pv->v[1]) { + /* the very first row */ + pv->prevRow=0; + return pv->v; + } + + /* do a binary search for the start of the range */ + start=0; + while(startv+i*columns; + if(rangeStart<(UChar32)row[0]) { + limit=i; + } else if(rangeStart<(UChar32)row[1]) { + pv->prevRow=i; + return row; + } else { + start=i; + } + } + + /* must be found because all ranges together always cover all of Unicode */ + pv->prevRow=start; + return pv->v+start*columns; +} + +U_CAPI void U_EXPORT2 +upvec_setValue(UPropsVectors *pv, + UChar32 start, UChar32 end, + int32_t column, + uint32_t value, uint32_t mask, + UErrorCode *pErrorCode) { + uint32_t *firstRow, *lastRow; + int32_t columns; + UChar32 limit; + UBool splitFirstRow, splitLastRow; + + /* argument checking */ + if(U_FAILURE(*pErrorCode)) { + return; + } + if( pv==NULL || + start<0 || start>end || end>UPVEC_MAX_CP || + column<0 || column>=(pv->columns-2) + ) { + *pErrorCode=U_ILLEGAL_ARGUMENT_ERROR; + return; + } + if(pv->isCompacted) { + *pErrorCode=U_NO_WRITE_PERMISSION; + return; + } + limit=end+1; + + /* initialize */ + columns=pv->columns; + column+=2; /* skip range start and limit columns */ + value&=mask; + + /* find the rows whose ranges overlap with the input range */ + + /* find the first and last rows, always successful */ + firstRow=_findRow(pv, start); + lastRow=_findRow(pv, end); + + /* + * Rows need to be split if they partially overlap with the + * input range (only possible for the first and last rows) + * and if their value differs from the input value. + */ + splitFirstRow= (UBool)(start!=(UChar32)firstRow[0] && value!=(firstRow[column]&mask)); + splitLastRow= (UBool)(limit!=(UChar32)lastRow[1] && value!=(lastRow[column]&mask)); + + /* split first/last rows if necessary */ + if(splitFirstRow || splitLastRow) { + int32_t count, rows; + + rows=pv->rows; + if((rows+splitFirstRow+splitLastRow)>pv->maxRows) { + uint32_t *newVectors; + int32_t newMaxRows; + + if(pv->maxRowsmaxRowsv, (size_t)rows*columns*4); + firstRow=newVectors+(firstRow-pv->v); + lastRow=newVectors+(lastRow-pv->v); + uprv_free(pv->v); + pv->v=newVectors; + pv->maxRows=newMaxRows; + } + + /* count the number of row cells to move after the last row, and move them */ + count = (int32_t)((pv->v+rows*columns)-(lastRow+columns)); + if(count>0) { + uprv_memmove( + lastRow+(1+splitFirstRow+splitLastRow)*columns, + lastRow+columns, + count*4); + } + pv->rows=rows+splitFirstRow+splitLastRow; + + /* split the first row, and move the firstRow pointer to the second part */ + if(splitFirstRow) { + /* copy all affected rows up one and move the lastRow pointer */ + count = (int32_t)((lastRow-firstRow)+columns); + uprv_memmove(firstRow+columns, firstRow, (size_t)count*4); + lastRow+=columns; + + /* split the range and move the firstRow pointer */ + firstRow[1]=firstRow[columns]=(uint32_t)start; + firstRow+=columns; + } + + /* split the last row */ + if(splitLastRow) { + /* copy the last row data */ + uprv_memcpy(lastRow+columns, lastRow, (size_t)columns*4); + + /* split the range and move the firstRow pointer */ + lastRow[1]=lastRow[columns]=(uint32_t)limit; + } + } + + /* set the "row last seen" to the last row for the range */ + pv->prevRow=(int32_t)((lastRow-(pv->v))/columns); + + /* set the input value in all remaining rows */ + firstRow+=column; + lastRow+=column; + mask=~mask; + for(;;) { + *firstRow=(*firstRow&mask)|value; + if(firstRow==lastRow) { + break; + } + firstRow+=columns; + } +} + +U_CAPI uint32_t U_EXPORT2 +upvec_getValue(const UPropsVectors *pv, UChar32 c, int32_t column) { + uint32_t *row; + UPropsVectors *ncpv; + + if(pv->isCompacted || c<0 || c>UPVEC_MAX_CP || column<0 || column>=(pv->columns-2)) { + return 0; + } + ncpv=(UPropsVectors *)pv; + row=_findRow(ncpv, c); + return row[2+column]; +} + +U_CAPI uint32_t * U_EXPORT2 +upvec_getRow(const UPropsVectors *pv, int32_t rowIndex, + UChar32 *pRangeStart, UChar32 *pRangeEnd) { + uint32_t *row; + int32_t columns; + + if(pv->isCompacted || rowIndex<0 || rowIndex>=pv->rows) { + return NULL; + } + + columns=pv->columns; + row=pv->v+rowIndex*columns; + if(pRangeStart!=NULL) { + *pRangeStart=(UChar32)row[0]; + } + if(pRangeEnd!=NULL) { + *pRangeEnd=(UChar32)row[1]-1; + } + return row+2; +} + +static int32_t U_CALLCONV +upvec_compareRows(const void *context, const void *l, const void *r) { + const uint32_t *left=(const uint32_t *)l, *right=(const uint32_t *)r; + const UPropsVectors *pv=(const UPropsVectors *)context; + int32_t i, count, columns; + + count=columns=pv->columns; /* includes start/limit columns */ + + /* start comparing after start/limit but wrap around to them */ + i=2; + do { + if(left[i]!=right[i]) { + return left[i]0); + + return 0; +} + +U_CAPI void U_EXPORT2 +upvec_compact(UPropsVectors *pv, UPVecCompactHandler *handler, void *context, UErrorCode *pErrorCode) { + uint32_t *row; + int32_t i, columns, valueColumns, rows, count; + UChar32 start, limit; + + /* argument checking */ + if(U_FAILURE(*pErrorCode)) { + return; + } + if(handler==NULL) { + *pErrorCode=U_ILLEGAL_ARGUMENT_ERROR; + return; + } + if(pv->isCompacted) { + return; + } + + /* Set the flag now: Sorting and compacting destroys the builder data structure. */ + pv->isCompacted=TRUE; + + rows=pv->rows; + columns=pv->columns; + U_ASSERT(columns>=3); /* upvec_open asserts this */ + valueColumns=columns-2; /* not counting start & limit */ + + /* sort the properties vectors to find unique vector values */ + uprv_sortArray(pv->v, rows, columns*4, + upvec_compareRows, pv, FALSE, pErrorCode); + if(U_FAILURE(*pErrorCode)) { + return; + } + + /* + * Find and set the special values. + * This has to do almost the same work as the compaction below, + * to find the indexes where the special-value rows will move. + */ + row=pv->v; + count=-valueColumns; + for(i=0; i=UPVEC_FIRST_SPECIAL_CP) { + handler(context, start, start, count, row+2, valueColumns, pErrorCode); + if(U_FAILURE(*pErrorCode)) { + return; + } + } + + row+=columns; + } + + /* count is at the beginning of the last vector, add valueColumns to include that last vector */ + count+=valueColumns; + + /* Call the handler once more to signal the start of delivering real values. */ + handler(context, UPVEC_START_REAL_VALUES_CP, UPVEC_START_REAL_VALUES_CP, + count, row-valueColumns, valueColumns, pErrorCode); + if(U_FAILURE(*pErrorCode)) { + return; + } + + /* + * Move vector contents up to a contiguous array with only unique + * vector values, and call the handler function for each vector. + * + * This destroys the Properties Vector structure and replaces it + * with an array of just vector values. + */ + row=pv->v; + count=-valueColumns; + for(i=0; iv+count, valueColumns*4)) { + count+=valueColumns; + uprv_memmove(pv->v+count, row+2, (size_t)valueColumns*4); + } + + if(startv+count, valueColumns, pErrorCode); + if(U_FAILURE(*pErrorCode)) { + return; + } + } + + row+=columns; + } + + /* count is at the beginning of the last vector, add one to include that last vector */ + pv->rows=count/valueColumns+1; +} + +U_CAPI const uint32_t * U_EXPORT2 +upvec_getArray(const UPropsVectors *pv, int32_t *pRows, int32_t *pColumns) { + if(!pv->isCompacted) { + return NULL; + } + if(pRows!=NULL) { + *pRows=pv->rows; + } + if(pColumns!=NULL) { + *pColumns=pv->columns-2; + } + return pv->v; +} + +U_CAPI uint32_t * U_EXPORT2 +upvec_cloneArray(const UPropsVectors *pv, + int32_t *pRows, int32_t *pColumns, UErrorCode *pErrorCode) { + uint32_t *clonedArray; + int32_t byteLength; + + if(U_FAILURE(*pErrorCode)) { + return NULL; + } + if(!pv->isCompacted) { + *pErrorCode=U_ILLEGAL_ARGUMENT_ERROR; + return NULL; + } + byteLength=pv->rows*(pv->columns-2)*4; + clonedArray=(uint32_t *)uprv_malloc(byteLength); + if(clonedArray==NULL) { + *pErrorCode=U_MEMORY_ALLOCATION_ERROR; + return NULL; + } + uprv_memcpy(clonedArray, pv->v, byteLength); + if(pRows!=NULL) { + *pRows=pv->rows; + } + if(pColumns!=NULL) { + *pColumns=pv->columns-2; + } + return clonedArray; +} + +U_CAPI UTrie2 * U_EXPORT2 +upvec_compactToUTrie2WithRowIndexes(UPropsVectors *pv, UErrorCode *pErrorCode) { + UPVecToUTrie2Context toUTrie2={ NULL, 0, 0, 0 }; + upvec_compact(pv, upvec_compactToUTrie2Handler, &toUTrie2, pErrorCode); + utrie2_freeze(toUTrie2.trie, UTRIE2_16_VALUE_BITS, pErrorCode); + if(U_FAILURE(*pErrorCode)) { + utrie2_close(toUTrie2.trie); + toUTrie2.trie=NULL; + } + return toUTrie2.trie; +} + +/* + * TODO(markus): Add upvec_16BitsToUTrie2() function that enumerates all rows, extracts + * some 16-bit field and builds and returns a UTrie2. + */ + +U_CAPI void U_CALLCONV +upvec_compactToUTrie2Handler(void *context, + UChar32 start, UChar32 end, + int32_t rowIndex, uint32_t *row, int32_t columns, + UErrorCode *pErrorCode) { + (void)row; + (void)columns; + UPVecToUTrie2Context *toUTrie2=(UPVecToUTrie2Context *)context; + if(starttrie, start, end, (uint32_t)rowIndex, TRUE, pErrorCode); + } else { + switch(start) { + case UPVEC_INITIAL_VALUE_CP: + toUTrie2->initialValue=rowIndex; + break; + case UPVEC_ERROR_VALUE_CP: + toUTrie2->errorValue=rowIndex; + break; + case UPVEC_START_REAL_VALUES_CP: + toUTrie2->maxValue=rowIndex; + if(rowIndex>0xffff) { + /* too many rows for a 16-bit trie */ + *pErrorCode=U_INDEX_OUTOFBOUNDS_ERROR; + } else { + toUTrie2->trie=utrie2_open(toUTrie2->initialValue, + toUTrie2->errorValue, pErrorCode); + } + break; + default: + break; + } + } +} diff --git a/Build/source/libs/icu/icu-src/source/common/propsvec.h b/Build/source/libs/icu/icu-src/source/common/propsvec.h index b34e4ee8ff4..39080615ea3 100644 --- a/Build/source/libs/icu/icu-src/source/common/propsvec.h +++ b/Build/source/libs/icu/icu-src/source/common/propsvec.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* @@ -8,7 +8,7 @@ * ******************************************************************************* * file name: propsvec.h -* encoding: US-ASCII +* encoding: UTF-8 * tab size: 8 (not used) * indentation:4 * diff --git a/Build/source/libs/icu/icu-src/source/common/punycode.cpp b/Build/source/libs/icu/icu-src/source/common/punycode.cpp index 1d2ccb342e6..90fe1ec3c80 100644 --- a/Build/source/libs/icu/icu-src/source/common/punycode.cpp +++ b/Build/source/libs/icu/icu-src/source/common/punycode.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* @@ -8,7 +8,7 @@ * ******************************************************************************* * file name: punycode.cpp -* encoding: US-ASCII +* encoding: UTF-8 * tab size: 8 (not used) * indentation:4 * diff --git a/Build/source/libs/icu/icu-src/source/common/punycode.h b/Build/source/libs/icu/icu-src/source/common/punycode.h index ff23eb0c377..5d8a243175c 100644 --- a/Build/source/libs/icu/icu-src/source/common/punycode.h +++ b/Build/source/libs/icu/icu-src/source/common/punycode.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* @@ -8,7 +8,7 @@ * ******************************************************************************* * file name: punycode.h -* encoding: US-ASCII +* encoding: UTF-8 * tab size: 8 (not used) * indentation:4 * diff --git a/Build/source/libs/icu/icu-src/source/common/putil.cpp b/Build/source/libs/icu/icu-src/source/common/putil.cpp index abf2aac830f..5d2df349295 100644 --- a/Build/source/libs/icu/icu-src/source/common/putil.cpp +++ b/Build/source/libs/icu/icu-src/source/common/putil.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ****************************************************************************** @@ -43,7 +43,10 @@ // Must be before any other #includes. #include "uposixdefs.h" -#if (U_PF_MINGW <= U_PLATFORM && U_PLATFORM <= U_PF_CYGWIN) && defined(__STRICT_ANSI__) +// First, the platform type. Need this for U_PLATFORM. +#include "unicode/platform.h" + +#if (U_PF_CYGWIN <= U_PLATFORM) && defined(__STRICT_ANSI__) /* tzset isn't defined in strict ANSI on Cygwin and MinGW. */ #undef __STRICT_ANSI__ #endif @@ -57,8 +60,7 @@ #include #endif -/* include ICU headers */ -#include "unicode/utypes.h" +/* include the rest of the ICU headers */ #include "unicode/putil.h" #include "unicode/ustring.h" #include "putilimp.h" @@ -90,14 +92,29 @@ * Should Cygwin be included as well (U_PLATFORM_HAS_WIN32_API) * to use native APIs as much as possible? */ +#ifndef WIN32_LEAN_AND_MEAN # define WIN32_LEAN_AND_MEAN +#endif # define VC_EXTRALEAN # define NOUSER # define NOSERVICE # define NOIME # define NOMCX # include +# include "unicode/uloc.h" +#if U_PLATFORM_HAS_WINUWP_API == 0 # include "wintz.h" +#else // U_PLATFORM_HAS_WINUWP_API +typedef PVOID LPMSG; // TODO: figure out how to get rid of this typedef +#include +#include +#include +#include + +using namespace ABI::Windows::Foundation; +using namespace Microsoft::WRL; +using namespace Microsoft::WRL::Wrappers; +#endif #elif U_PLATFORM == U_PF_OS400 # include # include /* error code structure */ @@ -651,13 +668,23 @@ uprv_timezone() /* Note that U_TZNAME does *not* have to be tzname, but if it is, some platforms need to have it declared here. */ -#if defined(U_TZNAME) && (U_PLATFORM == U_PF_IRIX || U_PLATFORM_IS_DARWIN_BASED || (U_PLATFORM == U_PF_CYGWIN && !U_PLATFORM_USES_ONLY_WIN32_API)) +#if defined(U_TZNAME) && (U_PLATFORM == U_PF_IRIX || U_PLATFORM_IS_DARWIN_BASED) /* RS6000 and others reject char **tzname. */ extern U_IMPORT char *U_TZNAME[]; #endif #if !UCONFIG_NO_FILE_IO && ((U_PLATFORM_IS_DARWIN_BASED && (U_PLATFORM != U_PF_IPHONE || defined(U_TIMEZONE))) || U_PLATFORM_IS_LINUX_BASED || U_PLATFORM == U_PF_BSD || U_PLATFORM == U_PF_SOLARIS) /* These platforms are likely to use Olson timezone IDs. */ +/* common targets of the symbolic link at TZDEFAULT are: + * "/usr/share/zoneinfo/" default, older Linux distros, macOS to 10.12 + * "../usr/share/zoneinfo/" newer Linux distros: Red Hat Enterprise Linux 7, Ubuntu 16, SuSe Linux 12 + * "/usr/share/lib/zoneinfo/" Solaris + * "../usr/share/lib/zoneinfo/" Solaris + * "/var/db/timezone/zoneinfo/" macOS 10.13 + * To avoid checking lots of paths, just check that the target path + * before the ends with "/zoneinfo/", and the is valid. + */ + #define CHECK_LOCALTIME_LINK 1 #if U_PLATFORM_IS_DARWIN_BASED #include @@ -665,12 +692,12 @@ extern U_IMPORT char *U_TZNAME[]; #elif U_PLATFORM == U_PF_SOLARIS #define TZDEFAULT "/etc/localtime" #define TZZONEINFO "/usr/share/lib/zoneinfo/" -#define TZZONEINFO2 "../usr/share/lib/zoneinfo/" #define TZ_ENV_CHECK "localtime" #else #define TZDEFAULT "/etc/localtime" #define TZZONEINFO "/usr/share/zoneinfo/" #endif +#define TZZONEINFOTAIL "/zoneinfo/" #if U_HAVE_DIRENT_H #define TZFILE_SKIP "posixrules" /* tz file to skip when searching. */ /* Some Linux distributions have 'localtime' in /usr/share/zoneinfo @@ -922,30 +949,30 @@ static CharString *gSearchTZFileResult = NULL; * This function is not thread safe - it uses a global, gSearchTZFileResult, to hold its results. */ static char* searchForTZFile(const char* path, DefaultTZInfo* tzInfo) { - DIR* dirp = opendir(path); - DIR* subDirp = NULL; + DIR* dirp = NULL; struct dirent* dirEntry = NULL; - char* result = NULL; + UErrorCode status = U_ZERO_ERROR; + + /* Save the current path */ + CharString curpath(path, -1, status); + if (U_FAILURE(status)) { + goto cleanupAndReturn; + } + + dirp = opendir(path); if (dirp == NULL) { - return result; + goto cleanupAndReturn; } if (gSearchTZFileResult == NULL) { gSearchTZFileResult = new CharString; if (gSearchTZFileResult == NULL) { - return NULL; + goto cleanupAndReturn; } ucln_common_registerCleanup(UCLN_COMMON_PUTIL, putil_cleanup); } - /* Save the current path */ - UErrorCode status = U_ZERO_ERROR; - CharString curpath(path, -1, status); - if (U_FAILURE(status)) { - return NULL; - } - /* Check each entry in the directory. */ while((dirEntry = readdir(dirp)) != NULL) { const char* dirName = dirEntry->d_name; @@ -954,15 +981,16 @@ static char* searchForTZFile(const char* path, DefaultTZInfo* tzInfo) { CharString newpath(curpath, status); newpath.append(dirName, -1, status); if (U_FAILURE(status)) { - return NULL; + break; } + DIR* subDirp = NULL; if ((subDirp = opendir(newpath.data())) != NULL) { /* If this new path is a directory, make a recursive call with the newpath. */ closedir(subDirp); newpath.append('/', status); if (U_FAILURE(status)) { - return NULL; + break; } result = searchForTZFile(newpath.data(), tzInfo); /* @@ -986,7 +1014,7 @@ static char* searchForTZFile(const char* path, DefaultTZInfo* tzInfo) { gSearchTZFileResult->clear(); gSearchTZFileResult->append(zoneid, -1, status); if (U_FAILURE(status)) { - return NULL; + break; } result = gSearchTZFileResult->data(); /* Get out after the first one found. */ @@ -995,7 +1023,11 @@ static char* searchForTZFile(const char* path, DefaultTZInfo* tzInfo) { } } } - closedir(dirp); + + cleanupAndReturn: + if (dirp) { + closedir(dirp); + } return result; } #endif @@ -1008,16 +1040,66 @@ uprv_tzname_clear_cache() #endif } +// With the Universal Windows Platform we can just ask Windows for the name +#if U_PLATFORM_HAS_WINUWP_API +U_CAPI const char* U_EXPORT2 +uprv_getWindowsTimeZone() +{ + // Get default Windows timezone. + ComPtr calendar; + HRESULT hr = RoActivateInstance( + HStringReference(RuntimeClass_Windows_Globalization_Calendar).Get(), + &calendar); + if (SUCCEEDED(hr)) + { + ComPtr timezone; + hr = calendar.As(&timezone); + if (SUCCEEDED(hr)) + { + HString timezoneString; + hr = timezone->GetTimeZone(timezoneString.GetAddressOf()); + if (SUCCEEDED(hr)) + { + int32_t length = static_cast(wcslen(timezoneString.GetRawBuffer(NULL))); + char* asciiId = (char*)uprv_calloc(length + 1, sizeof(char)); + if (asciiId != nullptr) + { + u_UCharsToChars((UChar*)timezoneString.GetRawBuffer(NULL), asciiId, length); + return asciiId; + } + } + } + } + + // Failed + return nullptr; +} +#endif + U_CAPI const char* U_EXPORT2 uprv_tzname(int n) { + (void)n; // Avoid unreferenced parameter warning. const char *tzid = NULL; #if U_PLATFORM_USES_ONLY_WIN32_API +#if U_PLATFORM_HAS_WINUWP_API > 0 + tzid = uprv_getWindowsTimeZone(); +#else tzid = uprv_detectWindowsTimeZone(); +#endif if (tzid != NULL) { return tzid; } + +#ifndef U_TZNAME + // The return value is free'd in timezone.cpp on Windows because + // the other code path returns a pointer to a heap location. + // If we don't have a name already, then tzname wouldn't be any + // better, so just fall back. + return uprv_strdup("Etc/UTC"); +#endif // !U_TZNAME + #else /*#if U_PLATFORM_IS_DARWIN_BASED @@ -1059,24 +1141,15 @@ uprv_tzname(int n) */ int32_t ret = (int32_t)readlink(TZDEFAULT, gTimeZoneBuffer, sizeof(gTimeZoneBuffer)-1); if (0 < ret) { - int32_t tzZoneInfoLen = uprv_strlen(TZZONEINFO); + int32_t tzZoneInfoTailLen = uprv_strlen(TZZONEINFOTAIL); gTimeZoneBuffer[ret] = 0; - if (uprv_strncmp(gTimeZoneBuffer, TZZONEINFO, tzZoneInfoLen) == 0 - && isValidOlsonID(gTimeZoneBuffer + tzZoneInfoLen)) - { - return (gTimeZoneBufferPtr = gTimeZoneBuffer + tzZoneInfoLen); - } -#if U_PLATFORM == U_PF_SOLARIS - else + char * tzZoneInfoTailPtr = uprv_strstr(gTimeZoneBuffer, TZZONEINFOTAIL); + + if (tzZoneInfoTailPtr != NULL + && isValidOlsonID(tzZoneInfoTailPtr + tzZoneInfoTailLen)) { - tzZoneInfoLen = uprv_strlen(TZZONEINFO2); - if (uprv_strncmp(gTimeZoneBuffer, TZZONEINFO2, tzZoneInfoLen) == 0 - && isValidOlsonID(gTimeZoneBuffer + tzZoneInfoLen)) - { - return (gTimeZoneBufferPtr = gTimeZoneBuffer + tzZoneInfoLen); - } + return (gTimeZoneBufferPtr = tzZoneInfoTailPtr + tzZoneInfoTailLen); } -#endif } else { #if defined(SEARCH_TZFILE) DefaultTZInfo* tzInfo = (DefaultTZInfo*)uprv_malloc(sizeof(DefaultTZInfo)); @@ -1162,7 +1235,8 @@ UInitOnce gTimeZoneFilesInitOnce = U_INITONCE_INITIALIZER; static CharString *gTimeZoneFilesDirectory = NULL; #if U_POSIX_LOCALE || U_PLATFORM_USES_ONLY_WIN32_API - static char *gCorrectedPOSIXLocale = NULL; /* Heap allocated */ + static const char *gCorrectedPOSIXLocale = NULL; /* Sometimes heap allocated */ + static bool gCorrectedPOSIXLocaleHeapAllocated = false; #endif static UBool U_CALLCONV putil_cleanup(void) @@ -1183,9 +1257,10 @@ static UBool U_CALLCONV putil_cleanup(void) #endif #if U_POSIX_LOCALE || U_PLATFORM_USES_ONLY_WIN32_API - if (gCorrectedPOSIXLocale) { - uprv_free(gCorrectedPOSIXLocale); + if (gCorrectedPOSIXLocale && gCorrectedPOSIXLocaleHeapAllocated) { + uprv_free(const_cast(gCorrectedPOSIXLocale)); gCorrectedPOSIXLocale = NULL; + gCorrectedPOSIXLocaleHeapAllocated = false; } #endif return TRUE; @@ -1219,7 +1294,7 @@ u_setDataDirectory(const char *directory) { #if (U_FILE_SEP_CHAR != U_FILE_ALT_SEP_CHAR) { char *p; - while(p = uprv_strchr(newDataDir, U_FILE_ALT_SEP_CHAR)) { + while((p = uprv_strchr(newDataDir, U_FILE_ALT_SEP_CHAR)) != NULL) { *p = U_FILE_SEP_CHAR; } } @@ -1297,7 +1372,9 @@ static void U_CALLCONV dataDirectoryInitFn() { */ # if !defined(ICU_NO_USER_DATA_OVERRIDE) && !UCONFIG_NO_FILE_IO /* First try to get the environment variable */ - path=getenv("ICU_DATA"); +# if U_PLATFORM_HAS_WINUWP_API == 0 // Windows UWP does not support getenv + path=getenv("ICU_DATA"); +# endif # endif /* ICU_DATA_DIR may be set as a compile option. @@ -1326,9 +1403,35 @@ static void U_CALLCONV dataDirectoryInitFn() { } #endif +#if defined(ICU_DATA_DIR_WINDOWS) && U_PLATFORM_HAS_WINUWP_API != 0 + // Use data from the %windir%\globalization\icu directory + // This is only available if ICU is built as a system component + char datadir_path_buffer[MAX_PATH]; + UINT length = GetWindowsDirectoryA(datadir_path_buffer, UPRV_LENGTHOF(datadir_path_buffer)); + if (length > 0 && length < (UPRV_LENGTHOF(datadir_path_buffer) - sizeof(ICU_DATA_DIR_WINDOWS) - 1)) + { + if (datadir_path_buffer[length - 1] != '\\') + { + datadir_path_buffer[length++] = '\\'; + datadir_path_buffer[length] = '\0'; + } + + if ((length + 1 + sizeof(ICU_DATA_DIR_WINDOWS)) < UPRV_LENGTHOF(datadir_path_buffer)) + { + uprv_strcat(datadir_path_buffer, ICU_DATA_DIR_WINDOWS); + path = datadir_path_buffer; + } + } +#endif + if(path==NULL) { /* It looks really bad, set it to something. */ +#if U_PLATFORM_HAS_WIN32_API + // Windows UWP will require icudtl.dat file in same directory as icuuc.dll + path = ".\\"; +#else path = ""; +#endif } u_setDataDirectory(path); @@ -1349,7 +1452,7 @@ static void setTimeZoneFilesDir(const char *path, UErrorCode &status) { gTimeZoneFilesDirectory->append(path, status); #if (U_FILE_SEP_CHAR != U_FILE_ALT_SEP_CHAR) char *p = gTimeZoneFilesDirectory->data(); - while (p = uprv_strchr(p, U_FILE_ALT_SEP_CHAR)) { + while ((p = uprv_strchr(p, U_FILE_ALT_SEP_CHAR)) != NULL) { *p = U_FILE_SEP_CHAR; } #endif @@ -1366,7 +1469,12 @@ static void U_CALLCONV TimeZoneDataDirInitFn(UErrorCode &status) { status = U_MEMORY_ALLOCATION_ERROR; return; } +#if U_PLATFORM_HAS_WINUWP_API == 0 const char *dir = getenv("ICU_TIMEZONE_FILES_DIR"); +#else + // TODO: UWP does not support alternate timezone data directories at this time + const char *dir = ""; +#endif // U_PLATFORM_HAS_WINUWP_API #if defined(U_TIMEZONE_FILES_DIR) if (dir == NULL) { dir = TO_STRING(U_TIMEZONE_FILES_DIR); @@ -1603,6 +1711,7 @@ The leftmost codepage (.xxx) wins. if (gCorrectedPOSIXLocale == NULL) { gCorrectedPOSIXLocale = correctedPOSIXLocale; + gCorrectedPOSIXLocaleHeapAllocated = true; ucln_common_registerCleanup(UCLN_COMMON_PUTIL, putil_cleanup); correctedPOSIXLocale = NULL; } @@ -1618,25 +1727,117 @@ The leftmost codepage (.xxx) wins. UErrorCode status = U_ZERO_ERROR; char *correctedPOSIXLocale = 0; + // If we have already figured this out just use the cached value if (gCorrectedPOSIXLocale != NULL) { return gCorrectedPOSIXLocale; } - LCID id = GetThreadLocale(); - correctedPOSIXLocale = static_cast(uprv_malloc(POSIX_LOCALE_CAPACITY + 1)); - if (correctedPOSIXLocale) { - int32_t posixLen = uprv_convertToPosix(id, correctedPOSIXLocale, POSIX_LOCALE_CAPACITY, &status); - if (U_SUCCESS(status)) { - *(correctedPOSIXLocale + posixLen) = 0; - gCorrectedPOSIXLocale = correctedPOSIXLocale; - ucln_common_registerCleanup(UCLN_COMMON_PUTIL, putil_cleanup); - } else { - uprv_free(correctedPOSIXLocale); + // No cached value, need to determine the current value + static WCHAR windowsLocale[LOCALE_NAME_MAX_LENGTH]; +#if U_PLATFORM_HAS_WINUWP_API == 0 + // If not a Universal Windows App, we'll need user default language. + // Vista and above should use Locale Names instead of LCIDs + int length = GetUserDefaultLocaleName(windowsLocale, UPRV_LENGTHOF(windowsLocale)); +#else + // In a UWP app, we want the top language that the application and user agreed upon + ComPtr> languageList; + + ComPtr applicationLanguagesStatics; + HRESULT hr = GetActivationFactory( + HStringReference(RuntimeClass_Windows_Globalization_ApplicationLanguages).Get(), + &applicationLanguagesStatics); + if (SUCCEEDED(hr)) + { + hr = applicationLanguagesStatics->get_Languages(&languageList); + } + + if (FAILED(hr)) + { + // If there is no application context, then use the top language from the user language profile + ComPtr globalizationPreferencesStatics; + hr = GetActivationFactory( + HStringReference(RuntimeClass_Windows_System_UserProfile_GlobalizationPreferences).Get(), + &globalizationPreferencesStatics); + if (SUCCEEDED(hr)) + { + hr = globalizationPreferencesStatics->get_Languages(&languageList); } } + // We have a list of languages, ICU knows one, so use the top one for our locale + HString topLanguage; + if (SUCCEEDED(hr)) + { + hr = languageList->GetAt(0, topLanguage.GetAddressOf()); + } + + if (FAILED(hr)) + { + // Unexpected, use en-US by default + if (gCorrectedPOSIXLocale == NULL) { + gCorrectedPOSIXLocale = "en_US"; + } + + return gCorrectedPOSIXLocale; + } + + // ResolveLocaleName will get a likely subtags form consistent with Windows behavior. + int length = ResolveLocaleName(topLanguage.GetRawBuffer(NULL), windowsLocale, UPRV_LENGTHOF(windowsLocale)); +#endif + // Now we should have a Windows locale name that needs converted to the POSIX style, + if (length > 0) + { + // First we need to go from UTF-16 to char (and also convert from _ to - while we're at it.) + char modifiedWindowsLocale[LOCALE_NAME_MAX_LENGTH]; + + int32_t i; + for (i = 0; i < UPRV_LENGTHOF(modifiedWindowsLocale); i++) + { + if (windowsLocale[i] == '_') + { + modifiedWindowsLocale[i] = '-'; + } + else + { + modifiedWindowsLocale[i] = static_cast(windowsLocale[i]); + } + + if (modifiedWindowsLocale[i] == '\0') + { + break; + } + } + + if (i >= UPRV_LENGTHOF(modifiedWindowsLocale)) + { + // Ran out of room, can't really happen, maybe we'll be lucky about a matching + // locale when tags are dropped + modifiedWindowsLocale[UPRV_LENGTHOF(modifiedWindowsLocale) - 1] = '\0'; + } + + // Now normalize the resulting name + correctedPOSIXLocale = static_cast(uprv_malloc(POSIX_LOCALE_CAPACITY + 1)); + /* TODO: Should we just exit on memory allocation failure? */ + if (correctedPOSIXLocale) + { + int32_t posixLen = uloc_canonicalize(modifiedWindowsLocale, correctedPOSIXLocale, POSIX_LOCALE_CAPACITY, &status); + if (U_SUCCESS(status)) + { + *(correctedPOSIXLocale + posixLen) = 0; + gCorrectedPOSIXLocale = correctedPOSIXLocale; + gCorrectedPOSIXLocaleHeapAllocated = true; + ucln_common_registerCleanup(UCLN_COMMON_PUTIL, putil_cleanup); + } + else + { + uprv_free(correctedPOSIXLocale); + } + } + } + + // If unable to find a locale we can agree upon, use en-US by default if (gCorrectedPOSIXLocale == NULL) { - return "en_US"; + gCorrectedPOSIXLocale = "en_US"; } return gCorrectedPOSIXLocale; @@ -1923,8 +2124,34 @@ int_getDefaultCodepage() #elif U_PLATFORM_USES_ONLY_WIN32_API static char codepage[64]; - sprintf(codepage, "windows-%d", GetACP()); - return codepage; + DWORD codepageNumber = 0; + +#if U_PLATFORM_HAS_WINUWP_API > 0 + // UWP doesn't have a direct API to get the default ACP as Microsoft would rather + // have folks use Unicode than a "system" code page, however this is the same + // codepage as the system default locale codepage. (FWIW, the system locale is + // ONLY used for codepage, it should never be used for anything else) + GetLocaleInfoEx(LOCALE_NAME_SYSTEM_DEFAULT, LOCALE_IDEFAULTANSICODEPAGE | LOCALE_RETURN_NUMBER, + (LPWSTR)&codepageNumber, sizeof(codepageNumber) / sizeof(WCHAR)); +#else + // Win32 apps can call GetACP + codepageNumber = GetACP(); +#endif + // Special case for UTF-8 + if (codepageNumber == 65001) + { + return "UTF-8"; + } + // Windows codepages can look like windows-1252, so format the found number + // the numbers are eclectic, however all valid system code pages, besides UTF-8 + // are between 3 and 19999 + if (codepageNumber > 0 && codepageNumber < 20000) + { + sprintf(codepage, "windows-%ld", codepageNumber); + return codepage; + } + // If the codepage number call failed then return UTF-8 + return "UTF-8"; #elif U_POSIX_LOCALE static char codesetName[100]; @@ -2108,19 +2335,16 @@ u_getVersion(UVersionInfo versionArray) { * icucfg.h dependent code */ -#if U_ENABLE_DYLOAD - -#if HAVE_DLOPEN && !U_PLATFORM_USES_ONLY_WIN32_API +#if U_ENABLE_DYLOAD && HAVE_DLOPEN && !U_PLATFORM_USES_ONLY_WIN32_API #if HAVE_DLFCN_H - #ifdef __MVS__ #ifndef __SUSV3 #define __SUSV3 1 #endif #endif #include -#endif +#endif /* HAVE_DLFCN_H */ U_INTERNAL void * U_EXPORT2 uprv_dl_open(const char *libName, UErrorCode *status) { @@ -2160,38 +2384,10 @@ uprv_dlsym_func(void *lib, const char* sym, UErrorCode *status) { return uret.fp; } -#else - -/* null (nonexistent) implementation. */ - -U_INTERNAL void * U_EXPORT2 -uprv_dl_open(const char *libName, UErrorCode *status) { - if(U_FAILURE(*status)) return NULL; - *status = U_UNSUPPORTED_ERROR; - return NULL; -} - -U_INTERNAL void U_EXPORT2 -uprv_dl_close(void *lib, UErrorCode *status) { - if(U_FAILURE(*status)) return; - *status = U_UNSUPPORTED_ERROR; - return; -} - - -U_INTERNAL UVoidFunction* U_EXPORT2 -uprv_dlsym_func(void *lib, const char* sym, UErrorCode *status) { - if(U_SUCCESS(*status)) { - *status = U_UNSUPPORTED_ERROR; - } - return (UVoidFunction*)NULL; -} - - +#elif U_ENABLE_DYLOAD && U_PLATFORM_USES_ONLY_WIN32_API && !U_PLATFORM_HAS_WINUWP_API -#endif - -#elif U_PLATFORM_USES_ONLY_WIN32_API +/* Windows API implementation. */ +// Note: UWP does not expose/allow these APIs, so the UWP version gets the null implementation. */ U_INTERNAL void * U_EXPORT2 uprv_dl_open(const char *libName, UErrorCode *status) { @@ -2218,7 +2414,6 @@ uprv_dl_close(void *lib, UErrorCode *status) { return; } - U_INTERNAL UVoidFunction* U_EXPORT2 uprv_dlsym_func(void *lib, const char* sym, UErrorCode *status) { HMODULE handle = (HMODULE)lib; @@ -2240,10 +2435,9 @@ uprv_dlsym_func(void *lib, const char* sym, UErrorCode *status) { return addr; } - #else -/* No dynamic loading set. */ +/* No dynamic loading, null (nonexistent) implementation. */ U_INTERNAL void * U_EXPORT2 uprv_dl_open(const char *libName, UErrorCode *status) { @@ -2261,7 +2455,6 @@ uprv_dl_close(void *lib, UErrorCode *status) { return; } - U_INTERNAL UVoidFunction* U_EXPORT2 uprv_dlsym_func(void *lib, const char* sym, UErrorCode *status) { (void)lib; @@ -2272,7 +2465,7 @@ uprv_dlsym_func(void *lib, const char* sym, UErrorCode *status) { return (UVoidFunction*)NULL; } -#endif /* U_ENABLE_DYLOAD */ +#endif /* * Hey, Emacs, please set the following: diff --git a/Build/source/libs/icu/icu-src/source/common/putilimp.h b/Build/source/libs/icu/icu-src/source/common/putilimp.h index 61e7e187ed4..42acdda6d71 100644 --- a/Build/source/libs/icu/icu-src/source/common/putilimp.h +++ b/Build/source/libs/icu/icu-src/source/common/putilimp.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ****************************************************************************** @@ -72,22 +72,13 @@ typedef size_t uintptr_t; #endif -/** - * \def U_HAVE_MSVC_2003_OR_EARLIER - * Flag for workaround of MSVC 2003 optimization bugs - * @internal - */ -#if !defined(U_HAVE_MSVC_2003_OR_EARLIER) && defined(_MSC_VER) && (_MSC_VER < 1400) -#define U_HAVE_MSVC_2003_OR_EARLIER -#endif - /*===========================================================================*/ /** @{ Information about POSIX support */ /*===========================================================================*/ #ifdef U_HAVE_NL_LANGINFO_CODESET /* Use the predefined value. */ -#elif U_PLATFORM_HAS_WIN32_API || U_PLATFORM == U_PF_ANDROID || U_PLATFORM == U_PF_QNX +#elif U_PLATFORM_USES_ONLY_WIN32_API || U_PLATFORM == U_PF_ANDROID || U_PLATFORM == U_PF_QNX # define U_HAVE_NL_LANGINFO_CODESET 0 #else # define U_HAVE_NL_LANGINFO_CODESET 1 @@ -106,7 +97,10 @@ typedef size_t uintptr_t; #ifdef U_TZSET /* Use the predefined value. */ #elif U_PLATFORM_USES_ONLY_WIN32_API + // UWP doesn't support tzset or environment variables for tz +#if U_PLATFORM_HAS_WINUWP_API == 0 # define U_TZSET _tzset +#endif #elif U_PLATFORM == U_PF_OS400 /* not defined */ #else @@ -117,15 +111,15 @@ typedef size_t uintptr_t; /* Use the predefined value. */ #elif U_PLATFORM == U_PF_ANDROID # define U_TIMEZONE timezone +#elif defined(__UCLIBC__) + // uClibc does not have __timezone or _timezone. +#elif defined(_NEWLIB_VERSION) +# define U_TIMEZONE _timezone +#elif defined(__GLIBC__) + // glibc +# define U_TIMEZONE __timezone #elif U_PLATFORM_IS_LINUX_BASED -# if defined(__UCLIBC__) - /* uClibc does not have __timezone or _timezone. */ -# elif defined(_NEWLIB_VERSION) -# define U_TIMEZONE _timezone -# elif defined(__GLIBC__) - /* glibc */ -# define U_TIMEZONE __timezone -# endif + // not defined #elif U_PLATFORM_USES_ONLY_WIN32_API # define U_TIMEZONE _timezone #elif U_PLATFORM == U_PF_BSD && !defined(__NetBSD__) @@ -141,7 +135,10 @@ typedef size_t uintptr_t; #ifdef U_TZNAME /* Use the predefined value. */ #elif U_PLATFORM_USES_ONLY_WIN32_API + /* not usable on all windows platforms */ +#if U_PLATFORM_HAS_WINUWP_API == 0 # define U_TZNAME _tzname +#endif #elif U_PLATFORM == U_PF_OS400 /* not defined */ #else @@ -208,7 +205,7 @@ typedef size_t uintptr_t; /** * \def U_HAVE_STD_ATOMICS * Defines whether the standard C++11 is available. - * ICU will use this when avialable, + * ICU will use this when available, * otherwise will fall back to compiler or platform specific alternatives. * @internal */ @@ -233,7 +230,7 @@ typedef size_t uintptr_t; /** * \def U_HAVE_CLANG_ATOMICS - * Defines whether Clang c11 style built-in atomics are avaialable. + * Defines whether Clang c11 style built-in atomics are available. * These are used in preference to gcc atomics when both are available. */ #ifdef U_HAVE_CLANG_ATOMICS @@ -271,7 +268,7 @@ typedef size_t uintptr_t; /** * Platform utilities isolates the platform dependencies of the - * libarary. For each platform which this code is ported to, these + * library. For each platform which this code is ported to, these * functions may have to be re-implemented. */ @@ -419,7 +416,7 @@ U_INTERNAL const char* U_EXPORT2 uprv_getDefaultCodepage(void); /** * Please use uloc_getDefault() instead. - * Return the default locale ID string by querying ths system, or + * Return the default locale ID string by querying the system, or * zero if one cannot be found. * This function can call setlocale() on Unix platforms. Please read the * platform documentation on setlocale() before calling this function. diff --git a/Build/source/libs/icu/icu-src/source/common/rbbi.cpp b/Build/source/libs/icu/icu-src/source/common/rbbi.cpp index 2680bf216c7..54b289e24d1 100644 --- a/Build/source/libs/icu/icu-src/source/common/rbbi.cpp +++ b/Build/source/libs/icu/icu-src/source/common/rbbi.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* *************************************************************************** @@ -7,7 +7,7 @@ *************************************************************************** */ // -// file: rbbi.c Contains the implementation of the rule based break iterator +// file: rbbi.cpp Contains the implementation of the rule based break iterator // runtime engine and the API implementation for // class RuleBasedBreakIterator // @@ -21,18 +21,19 @@ #include "unicode/rbbi.h" #include "unicode/schriter.h" #include "unicode/uchriter.h" -#include "unicode/udata.h" #include "unicode/uclean.h" -#include "rbbidata.h" -#include "rbbirb.h" +#include "unicode/udata.h" + +#include "brkeng.h" +#include "ucln_cmn.h" #include "cmemory.h" #include "cstring.h" -#include "umutex.h" -#include "ucln_cmn.h" -#include "brkeng.h" - +#include "rbbidata.h" +#include "rbbi_cache.h" +#include "rbbirb.h" #include "uassert.h" -#include "uvector.h" +#include "umutex.h" +#include "uvectr32.h" // if U_LOCAL_SERVICE_HOOK is defined, then localsvc.cpp is expected to be included. #if U_LOCAL_SERVICE_HOOK @@ -40,16 +41,16 @@ #endif #ifdef RBBI_DEBUG -static UBool fTrace = FALSE; +static UBool gTrace = FALSE; #endif U_NAMESPACE_BEGIN // The state number of the starting state -#define START_STATE 1 +constexpr int32_t START_STATE = 1; // The state-transition value indicating "stop" -#define STOP_STATE 0 +constexpr int32_t STOP_STATE = 0; UOBJECT_DEFINE_RTTI_IMPLEMENTATION(RuleBasedBreakIterator) @@ -63,9 +64,8 @@ UOBJECT_DEFINE_RTTI_IMPLEMENTATION(RuleBasedBreakIterator) * Constructs a RuleBasedBreakIterator that uses the already-created * tables object that is passed in as a parameter. */ -RuleBasedBreakIterator::RuleBasedBreakIterator(RBBIDataHeader* data, UErrorCode &status) -{ - init(); +RuleBasedBreakIterator::RuleBasedBreakIterator(RBBIDataHeader* data, UErrorCode &status) { + init(status); fData = new RBBIDataWrapper(data, status); // status checked in constructor if (U_FAILURE(status)) {return;} if(fData == 0) { @@ -81,7 +81,7 @@ RuleBasedBreakIterator::RuleBasedBreakIterator(RBBIDataHeader* data, UErrorCode RuleBasedBreakIterator::RuleBasedBreakIterator(const uint8_t *compiledRules, uint32_t ruleLength, UErrorCode &status) { - init(); + init(status); if (U_FAILURE(status)) { return; } @@ -94,13 +94,13 @@ RuleBasedBreakIterator::RuleBasedBreakIterator(const uint8_t *compiledRules, status = U_ILLEGAL_ARGUMENT_ERROR; return; } - fData = new RBBIDataWrapper(data, RBBIDataWrapper::kDontAdopt, status); + fData = new RBBIDataWrapper(data, RBBIDataWrapper::kDontAdopt, status); if (U_FAILURE(status)) {return;} if(fData == 0) { status = U_MEMORY_ALLOCATION_ERROR; return; } -} +} //------------------------------------------------------------------------------- @@ -111,7 +111,7 @@ RuleBasedBreakIterator::RuleBasedBreakIterator(const uint8_t *compiledRules, //------------------------------------------------------------------------------- RuleBasedBreakIterator::RuleBasedBreakIterator(UDataMemory* udm, UErrorCode &status) { - init(); + init(status); fData = new RBBIDataWrapper(udm, status); // status checked in constructor if (U_FAILURE(status)) {return;} if(fData == 0) { @@ -131,7 +131,7 @@ RuleBasedBreakIterator::RuleBasedBreakIterator( const UnicodeString &rules, UParseError &parseError, UErrorCode &status) { - init(); + init(status); if (U_FAILURE(status)) {return;} RuleBasedBreakIterator *bi = (RuleBasedBreakIterator *) RBBIRuleBuilder::createRuleBasedBreakIterator(rules, &parseError, status); @@ -153,7 +153,8 @@ RuleBasedBreakIterator::RuleBasedBreakIterator( const UnicodeString &rules, // of rules. //------------------------------------------------------------------------------- RuleBasedBreakIterator::RuleBasedBreakIterator() { - init(); + UErrorCode status = U_ZERO_ERROR; + init(status); } @@ -166,7 +167,8 @@ RuleBasedBreakIterator::RuleBasedBreakIterator() { RuleBasedBreakIterator::RuleBasedBreakIterator(const RuleBasedBreakIterator& other) : BreakIterator(other) { - this->init(); + UErrorCode status = U_ZERO_ERROR; + this->init(status); *this = other; } @@ -181,28 +183,27 @@ RuleBasedBreakIterator::~RuleBasedBreakIterator() { } fCharIter = NULL; delete fSCharIter; - fCharIter = NULL; + fSCharIter = NULL; delete fDCharIter; fDCharIter = NULL; - + utext_close(fText); if (fData != NULL) { fData->removeReference(); fData = NULL; } - if (fCachedBreakPositions) { - uprv_free(fCachedBreakPositions); - fCachedBreakPositions = NULL; - } - if (fLanguageBreakEngines) { - delete fLanguageBreakEngines; - fLanguageBreakEngines = NULL; - } - if (fUnhandledBreakEngine) { - delete fUnhandledBreakEngine; - fUnhandledBreakEngine = NULL; - } + delete fBreakCache; + fBreakCache = NULL; + + delete fDictionaryCache; + fDictionaryCache = NULL; + + delete fLanguageBreakEngines; + fLanguageBreakEngines = NULL; + + delete fUnhandledBreakEngine; + fUnhandledBreakEngine = NULL; } /** @@ -214,7 +215,8 @@ RuleBasedBreakIterator::operator=(const RuleBasedBreakIterator& that) { if (this == &that) { return *this; } - reset(); // Delete break cache information + BreakIterator::operator=(that); + fBreakType = that.fBreakType; if (fLanguageBreakEngines != NULL) { delete fLanguageBreakEngines; @@ -244,6 +246,17 @@ RuleBasedBreakIterator::operator=(const RuleBasedBreakIterator& that) { fData = that.fData->addReference(); } + fPosition = that.fPosition; + fRuleStatusIndex = that.fRuleStatusIndex; + fDone = that.fDone; + + // TODO: both the dictionary and the main cache need to be copied. + // Current position could be within a dictionary range. Trying to continue + // the iteration without the caches present would go to the rules, with + // the assumption that the current position is on a rule boundary. + fBreakCache->reset(fPosition, fRuleStatusIndex); + fDictionaryCache->reset(); + return *this; } @@ -255,33 +268,43 @@ RuleBasedBreakIterator::operator=(const RuleBasedBreakIterator& that) { // Initializes all fields, leaving the object in a consistent state. // //----------------------------------------------------------------------------- -void RuleBasedBreakIterator::init() { - UErrorCode status = U_ZERO_ERROR; - fText = utext_openUChars(NULL, NULL, 0, &status); +void RuleBasedBreakIterator::init(UErrorCode &status) { + fText = NULL; fCharIter = NULL; fSCharIter = NULL; fDCharIter = NULL; fData = NULL; - fLastRuleStatusIndex = 0; - fLastStatusIndexValid = TRUE; + fPosition = 0; + fRuleStatusIndex = 0; + fDone = false; fDictionaryCharCount = 0; fBreakType = UBRK_WORD; // Defaulting BreakType to word gives reasonable // dictionary behavior for Break Iterators that are // built from rules. Even better would be the ability to // declare the type in the rules. - fCachedBreakPositions = NULL; - fLanguageBreakEngines = NULL; - fUnhandledBreakEngine = NULL; - fNumCachedBreakPositions = 0; - fPositionInCache = 0; + fLanguageBreakEngines = NULL; + fUnhandledBreakEngine = NULL; + fBreakCache = NULL; + fDictionaryCache = NULL; + + if (U_FAILURE(status)) { + return; + } + + fText = utext_openUChars(NULL, NULL, 0, &status); + fDictionaryCache = new DictionaryCache(this, status); + fBreakCache = new BreakCache(this, status); + if (U_SUCCESS(status) && (fText == NULL || fDictionaryCache == NULL || fBreakCache == NULL)) { + status = U_MEMORY_ALLOCATION_ERROR; + } #ifdef RBBI_DEBUG static UBool debugInitDone = FALSE; if (debugInitDone == FALSE) { char *debugEnv = getenv("U_RBBIDEBUG"); if (debugEnv && uprv_strstr(debugEnv, "trace")) { - fTrace = TRUE; + gTrace = TRUE; } debugInitDone = TRUE; } @@ -311,16 +334,28 @@ RuleBasedBreakIterator::operator==(const BreakIterator& that) const { if (typeid(*this) != typeid(that)) { return FALSE; } + if (this == &that) { + return TRUE; + } + + // The base class BreakIterator carries no state that participates in equality, + // and does not implement an equality function that would otherwise be + // checked at this point. const RuleBasedBreakIterator& that2 = (const RuleBasedBreakIterator&) that; if (!utext_equals(fText, that2.fText)) { // The two break iterators are operating on different text, - // or have a different interation position. + // or have a different iteration position. + // Note that fText's position is always the same as the break iterator's position. return FALSE; }; - // TODO: need a check for when in a dictionary region at different offsets. + if (!(fPosition == that2.fPosition && + fRuleStatusIndex == that2.fRuleStatusIndex && + fDone == that2.fDone)) { + return FALSE; + } if (that2.fData == fData || (fData != NULL && that2.fData != NULL && *that2.fData == *fData)) { @@ -348,7 +383,8 @@ void RuleBasedBreakIterator::setText(UText *ut, UErrorCode &status) { if (U_FAILURE(status)) { return; } - reset(); + fBreakCache->reset(); + fDictionaryCache->reset(); fText = utext_clone(fText, ut, FALSE, TRUE, &status); // Set up a dummy CharacterIterator to be returned if anyone @@ -377,38 +413,17 @@ void RuleBasedBreakIterator::setText(UText *ut, UErrorCode &status) { UText *RuleBasedBreakIterator::getUText(UText *fillIn, UErrorCode &status) const { - UText *result = utext_clone(fillIn, fText, FALSE, TRUE, &status); + UText *result = utext_clone(fillIn, fText, FALSE, TRUE, &status); return result; } - -/** - * Returns the description used to create this iterator - */ -const UnicodeString& -RuleBasedBreakIterator::getRules() const { - if (fData != NULL) { - return fData->getRuleSourceString(); - } else { - static const UnicodeString *s; - if (s == NULL) { - // TODO: something more elegant here. - // perhaps API should return the string by value. - // Note: thread unsafe init & leak are semi-ok, better than - // what was before. Sould be cleaned up, though. - s = new UnicodeString; - } - return *s; - } -} - //======================================================================= // BreakIterator overrides //======================================================================= /** - * Return a CharacterIterator over the text being analyzed. + * Return a CharacterIterator over the text being analyzed. */ CharacterIterator& RuleBasedBreakIterator::getText() const { @@ -422,7 +437,7 @@ RuleBasedBreakIterator::getText() const { */ void RuleBasedBreakIterator::adoptText(CharacterIterator* newText) { - // If we are holding a CharacterIterator adopted from a + // If we are holding a CharacterIterator adopted from a // previous call to this function, delete it now. if (fCharIter!=fSCharIter && fCharIter!=fDCharIter) { delete fCharIter; @@ -430,8 +445,9 @@ RuleBasedBreakIterator::adoptText(CharacterIterator* newText) { fCharIter = newText; UErrorCode status = U_ZERO_ERROR; - reset(); - if (newText==NULL || newText->startIndex() != 0) { + fBreakCache->reset(); + fDictionaryCache->reset(); + if (newText==NULL || newText->startIndex() != 0) { // startIndex !=0 wants to be an error, but there's no way to report it. // Make the iterator text be an empty string. fText = utext_openUChars(fText, NULL, 0, &status); @@ -449,10 +465,11 @@ RuleBasedBreakIterator::adoptText(CharacterIterator* newText) { void RuleBasedBreakIterator::setText(const UnicodeString& newText) { UErrorCode status = U_ZERO_ERROR; - reset(); + fBreakCache->reset(); + fDictionaryCache->reset(); fText = utext_openConstUnicodeString(fText, &newText, &status); - // Set up a character iterator on the string. + // Set up a character iterator on the string. // Needed in case someone calls getText(). // Can not, unfortunately, do this lazily on the (probably never) // call to getText(), because getText is const. @@ -509,13 +526,12 @@ RuleBasedBreakIterator &RuleBasedBreakIterator::refreshInputText(UText *input, U * @return The new iterator position, which is zero. */ int32_t RuleBasedBreakIterator::first(void) { - reset(); - fLastRuleStatusIndex = 0; - fLastStatusIndexValid = TRUE; - //if (fText == NULL) - // return BreakIterator::DONE; - - utext_setNativeIndex(fText, 0); + UErrorCode status = U_ZERO_ERROR; + if (!fBreakCache->seek(0)) { + fBreakCache->populateNear(0, status); + } + fBreakCache->current(); + U_ASSERT(fPosition == 0); return 0; } @@ -524,17 +540,12 @@ int32_t RuleBasedBreakIterator::first(void) { * @return The text's past-the-end offset. */ int32_t RuleBasedBreakIterator::last(void) { - reset(); - if (fText == NULL) { - fLastRuleStatusIndex = 0; - fLastStatusIndexValid = TRUE; - return BreakIterator::DONE; - } - - fLastStatusIndexValid = FALSE; - int32_t pos = (int32_t)utext_nativeLength(fText); - utext_setNativeIndex(fText, pos); - return pos; + int32_t endPos = (int32_t)utext_nativeLength(fText); + UBool endShouldBeBoundary = isBoundary(endPos); // Has side effect of setting iterator position. + (void)endShouldBeBoundary; + U_ASSERT(endShouldBeBoundary); + U_ASSERT(fPosition == endPos); + return endPos; } /** @@ -547,14 +558,17 @@ int32_t RuleBasedBreakIterator::last(void) { * the current one. */ int32_t RuleBasedBreakIterator::next(int32_t n) { - int32_t result = current(); - while (n > 0) { - result = next(); - --n; - } - while (n < 0) { - result = previous(); - ++n; + int32_t result = 0; + if (n > 0) { + for (; n > 0 && result != UBRK_DONE; --n) { + result = next(); + } + } else if (n < 0) { + for (; n < 0 && result != UBRK_DONE; ++n) { + result = previous(); + } + } else { + result = current(); } return result; } @@ -564,396 +578,120 @@ int32_t RuleBasedBreakIterator::next(int32_t n) { * @return The position of the first boundary after this one. */ int32_t RuleBasedBreakIterator::next(void) { - // if we have cached break positions and we're still in the range - // covered by them, just move one step forward in the cache - if (fCachedBreakPositions != NULL) { - if (fPositionInCache < fNumCachedBreakPositions - 1) { - ++fPositionInCache; - int32_t pos = fCachedBreakPositions[fPositionInCache]; - utext_setNativeIndex(fText, pos); - return pos; - } - else { - reset(); - } - } - - int32_t startPos = current(); - fDictionaryCharCount = 0; - int32_t result = handleNext(fData->fForwardTable); - if (fDictionaryCharCount > 0) { - result = checkDictionary(startPos, result, FALSE); - } - return result; + fBreakCache->next(); + return fDone ? UBRK_DONE : fPosition; } /** - * Advances the iterator backwards, to the last boundary preceding this one. - * @return The position of the last boundary position preceding this one. + * Move the iterator backwards, to the boundary preceding the current one. + * + * Starts from the current position within fText. + * Starting position need not be on a boundary. + * + * @return The position of the boundary position immediately preceding the starting position. */ int32_t RuleBasedBreakIterator::previous(void) { - int32_t result; - int32_t startPos; - - // if we have cached break positions and we're still in the range - // covered by them, just move one step backward in the cache - if (fCachedBreakPositions != NULL) { - if (fPositionInCache > 0) { - --fPositionInCache; - // If we're at the beginning of the cache, need to reevaluate the - // rule status - if (fPositionInCache <= 0) { - fLastStatusIndexValid = FALSE; - } - int32_t pos = fCachedBreakPositions[fPositionInCache]; - utext_setNativeIndex(fText, pos); - return pos; - } - else { - reset(); - } - } - - // if we're already sitting at the beginning of the text, return DONE - if (fText == NULL || (startPos = current()) == 0) { - fLastRuleStatusIndex = 0; - fLastStatusIndexValid = TRUE; - return BreakIterator::DONE; - } - - if (fData->fSafeRevTable != NULL || fData->fSafeFwdTable != NULL) { - result = handlePrevious(fData->fReverseTable); - if (fDictionaryCharCount > 0) { - result = checkDictionary(result, startPos, TRUE); - } - return result; - } - - // old rule syntax - // set things up. handlePrevious() will back us up to some valid - // break position before the current position (we back our internal - // iterator up one step to prevent handlePrevious() from returning - // the current position), but not necessarily the last one before - // where we started - - int32_t start = current(); - - (void)UTEXT_PREVIOUS32(fText); - int32_t lastResult = handlePrevious(fData->fReverseTable); - if (lastResult == UBRK_DONE) { - lastResult = 0; - utext_setNativeIndex(fText, 0); - } - result = lastResult; - int32_t lastTag = 0; - UBool breakTagValid = FALSE; - - // iterate forward from the known break position until we pass our - // starting point. The last break position before the starting - // point is our return value - - for (;;) { - result = next(); - if (result == BreakIterator::DONE || result >= start) { - break; - } - lastResult = result; - lastTag = fLastRuleStatusIndex; - breakTagValid = TRUE; - } - - // fLastBreakTag wants to have the value for section of text preceding - // the result position that we are to return (in lastResult.) If - // the backwards rules overshot and the above loop had to do two or more - // next()s to move up to the desired return position, we will have a valid - // tag value. But, if handlePrevious() took us to exactly the correct result position, - // we wont have a tag value for that position, which is only set by handleNext(). - - // Set the current iteration position to be the last break position - // before where we started, and then return that value. - utext_setNativeIndex(fText, lastResult); - fLastRuleStatusIndex = lastTag; // for use by getRuleStatus() - fLastStatusIndexValid = breakTagValid; - - // No need to check the dictionary; it will have been handled by - // next() - - return lastResult; + UErrorCode status = U_ZERO_ERROR; + fBreakCache->previous(status); + return fDone ? UBRK_DONE : fPosition; } /** * Sets the iterator to refer to the first boundary position following * the specified position. - * @offset The position from which to begin searching for a break position. + * @param startPos The position from which to begin searching for a break position. * @return The position of the first break after the current position. */ -int32_t RuleBasedBreakIterator::following(int32_t offset) { - // if the offset passed in is already past the end of the text, - // just return DONE; if it's before the beginning, return the +int32_t RuleBasedBreakIterator::following(int32_t startPos) { + // if the supplied position is before the beginning, return the // text's starting offset - if (fText == NULL || offset >= utext_nativeLength(fText)) { - last(); - return next(); - } - else if (offset < 0) { + if (startPos < 0) { return first(); } // Move requested offset to a code point start. It might be on a trail surrogate, - // or on a trail byte if the input is UTF-8. - utext_setNativeIndex(fText, offset); - offset = (int32_t)utext_getNativeIndex(fText); - - // if we have cached break positions and offset is in the range - // covered by them, use them - // TODO: could use binary search - // TODO: what if offset is outside range, but break is not? - if (fCachedBreakPositions != NULL) { - if (offset >= fCachedBreakPositions[0] - && offset < fCachedBreakPositions[fNumCachedBreakPositions - 1]) { - fPositionInCache = 0; - // We are guaranteed not to leave the array due to range test above - while (offset >= fCachedBreakPositions[fPositionInCache]) { - ++fPositionInCache; - } - int32_t pos = fCachedBreakPositions[fPositionInCache]; - utext_setNativeIndex(fText, pos); - return pos; - } - else { - reset(); - } - } - - // Set our internal iteration position (temporarily) - // to the position passed in. If this is the _beginning_ position, - // then we can just use next() to get our return value - - int32_t result = 0; - - if (fData->fSafeRevTable != NULL) { - // new rule syntax - utext_setNativeIndex(fText, offset); - // move forward one codepoint to prepare for moving back to a - // safe point. - // this handles offset being between a supplementary character - // TODO: is this still needed, with move to code point boundary handled above? - (void)UTEXT_NEXT32(fText); - // handlePrevious will move most of the time to < 1 boundary away - handlePrevious(fData->fSafeRevTable); - int32_t result = next(); - while (result <= offset) { - result = next(); - } - return result; - } - if (fData->fSafeFwdTable != NULL) { - // backup plan if forward safe table is not available - utext_setNativeIndex(fText, offset); - (void)UTEXT_PREVIOUS32(fText); - // handle next will give result >= offset - handleNext(fData->fSafeFwdTable); - // previous will give result 0 or 1 boundary away from offset, - // most of the time - // we have to - int32_t oldresult = previous(); - while (oldresult > offset) { - int32_t result = previous(); - if (result <= offset) { - return oldresult; - } - oldresult = result; - } - int32_t result = next(); - if (result <= offset) { - return next(); - } - return result; - } - // otherwise, we have to sync up first. Use handlePrevious() to back - // up to a known break position before the specified position (if - // we can determine that the specified position is a break position, - // we don't back up at all). This may or may not be the last break - // position at or before our starting position. Advance forward - // from here until we've passed the starting position. The position - // we stop on will be the first break position after the specified one. - // old rule syntax - - utext_setNativeIndex(fText, offset); - if (offset==0 || - (offset==1 && utext_getNativeIndex(fText)==0)) { - return next(); - } - result = previous(); + // or on a trail byte if the input is UTF-8. Or it may be beyond the end of the text. + utext_setNativeIndex(fText, startPos); + startPos = (int32_t)utext_getNativeIndex(fText); - while (result != BreakIterator::DONE && result <= offset) { - result = next(); - } - - return result; + UErrorCode status = U_ZERO_ERROR; + fBreakCache->following(startPos, status); + return fDone ? UBRK_DONE : fPosition; } /** * Sets the iterator to refer to the last boundary position before the * specified position. - * @offset The position to begin searching for a break from. + * @param offset The position to begin searching for a break from. * @return The position of the last boundary before the starting position. */ int32_t RuleBasedBreakIterator::preceding(int32_t offset) { - // if the offset passed in is already past the end of the text, - // just return DONE; if it's before the beginning, return the - // text's starting offset if (fText == NULL || offset > utext_nativeLength(fText)) { return last(); } - else if (offset < 0) { - return first(); - } // Move requested offset to a code point start. It might be on a trail surrogate, // or on a trail byte if the input is UTF-8. - utext_setNativeIndex(fText, offset); - offset = (int32_t)utext_getNativeIndex(fText); - - // if we have cached break positions and offset is in the range - // covered by them, use them - if (fCachedBreakPositions != NULL) { - // TODO: binary search? - // TODO: What if offset is outside range, but break is not? - if (offset > fCachedBreakPositions[0] - && offset <= fCachedBreakPositions[fNumCachedBreakPositions - 1]) { - fPositionInCache = 0; - while (fPositionInCache < fNumCachedBreakPositions - && offset > fCachedBreakPositions[fPositionInCache]) - ++fPositionInCache; - --fPositionInCache; - // If we're at the beginning of the cache, need to reevaluate the - // rule status - if (fPositionInCache <= 0) { - fLastStatusIndexValid = FALSE; - } - utext_setNativeIndex(fText, fCachedBreakPositions[fPositionInCache]); - return fCachedBreakPositions[fPositionInCache]; - } - else { - reset(); - } - } - - // if we start by updating the current iteration position to the - // position specified by the caller, we can just use previous() - // to carry out this operation - - if (fData->fSafeFwdTable != NULL) { - // new rule syntax - utext_setNativeIndex(fText, offset); - int32_t newOffset = (int32_t)UTEXT_GETNATIVEINDEX(fText); - if (newOffset != offset) { - // Will come here if specified offset was not a code point boundary AND - // the underlying implmentation is using UText, which snaps any non-code-point-boundary - // indices to the containing code point. - // For breakitereator::preceding only, these non-code-point indices need to be moved - // up to refer to the following codepoint. - (void)UTEXT_NEXT32(fText); - offset = (int32_t)UTEXT_GETNATIVEINDEX(fText); - } - // TODO: (synwee) would it be better to just check for being in the middle of a surrogate pair, - // rather than adjusting the position unconditionally? - // (Change would interact with safe rules.) - // TODO: change RBBI behavior for off-boundary indices to match that of UText? - // affects only preceding(), seems cleaner, but is slightly different. - (void)UTEXT_PREVIOUS32(fText); - handleNext(fData->fSafeFwdTable); - int32_t result = (int32_t)UTEXT_GETNATIVEINDEX(fText); - while (result >= offset) { - result = previous(); - } - return result; - } - if (fData->fSafeRevTable != NULL) { - // backup plan if forward safe table is not available - // TODO: check whether this path can be discarded - // It's probably OK to say that rules must supply both safe tables - // if they use safe tables at all. We have certainly never described - // to anyone how to work with just one safe table. - utext_setNativeIndex(fText, offset); - (void)UTEXT_NEXT32(fText); - - // handle previous will give result <= offset - handlePrevious(fData->fSafeRevTable); - - // next will give result 0 or 1 boundary away from offset, - // most of the time - // we have to - int32_t oldresult = next(); - while (oldresult < offset) { - int32_t result = next(); - if (result >= offset) { - return oldresult; - } - oldresult = result; - } - int32_t result = previous(); - if (result >= offset) { - return previous(); - } - return result; - } - - // old rule syntax utext_setNativeIndex(fText, offset); - return previous(); + int32_t adjustedOffset = utext_getNativeIndex(fText); + + UErrorCode status = U_ZERO_ERROR; + fBreakCache->preceding(adjustedOffset, status); + return fDone ? UBRK_DONE : fPosition; } /** * Returns true if the specfied position is a boundary position. As a side * effect, leaves the iterator pointing to the first boundary position at * or after "offset". + * * @param offset the offset to check. * @return True if "offset" is a boundary position. */ UBool RuleBasedBreakIterator::isBoundary(int32_t offset) { - // the beginning index of the iterator is always a boundary position by definition - if (offset == 0) { - first(); // For side effects on current position, tag values. - return TRUE; - } - - if (offset == (int32_t)utext_nativeLength(fText)) { - last(); // For side effects on current position, tag values. - return TRUE; - } - // out-of-range indexes are never boundary positions if (offset < 0) { first(); // For side effects on current position, tag values. return FALSE; } - if (offset > utext_nativeLength(fText)) { - last(); // For side effects on current position, tag values. - return FALSE; + // Adjust offset to be on a code point boundary and not beyond the end of the text. + // Note that isBoundary() is always be false for offsets that are not on code point boundaries. + // But we still need the side effect of leaving iteration at the following boundary. + + utext_setNativeIndex(fText, offset); + int32_t adjustedOffset = utext_getNativeIndex(fText); + + bool result = false; + UErrorCode status = U_ZERO_ERROR; + if (fBreakCache->seek(adjustedOffset) || fBreakCache->populateNear(adjustedOffset, status)) { + result = (fBreakCache->current() == offset); } - // otherwise, we can use following() on the position before the specified - // one and return true if the position we get back is the one the user - // specified - utext_previous32From(fText, offset); - int32_t backOne = (int32_t)UTEXT_GETNATIVEINDEX(fText); - UBool result = following(backOne) == offset; + if (result && adjustedOffset < offset && utext_char32At(fText, offset) == U_SENTINEL) { + // Original offset is beyond the end of the text. Return FALSE, it's not a boundary, + // but the iteration position remains set to the end of the text, which is a boundary. + return FALSE; + } + if (!result) { + // Not on a boundary. isBoundary() must leave iterator on the following boundary. + // Cache->seek(), above, left us on the preceding boundary, so advance one. + next(); + } return result; } + /** * Returns the current iteration position. * @return The current iteration position. */ int32_t RuleBasedBreakIterator::current(void) const { - int32_t pos = (int32_t)UTEXT_GETNATIVEINDEX(fText); - return pos; + return fPosition; } - + + //======================================================================= // implementation //======================================================================= @@ -1020,43 +758,43 @@ struct LookAheadResults { //----------------------------------------------------------------------------------- // -// handleNext(stateTable) -// This method is the actual implementation of the rbbi next() method. -// This method initializes the state machine to state 1 -// and advances through the text character by character until we reach the end -// of the text or the state machine transitions to state 0. We update our return -// value every time the state machine passes through an accepting state. +// handleNext() +// Run the state machine to find a boundary // //----------------------------------------------------------------------------------- -int32_t RuleBasedBreakIterator::handleNext(const RBBIStateTable *statetable) { +int32_t RuleBasedBreakIterator::handleNext() { int32_t state; uint16_t category = 0; RBBIRunMode mode; - + RBBIStateTableRow *row; UChar32 c; LookAheadResults lookAheadMatches; int32_t result = 0; int32_t initialPosition = 0; + const RBBIStateTable *statetable = fData->fForwardTable; const char *tableData = statetable->fTableData; uint32_t tableRowLen = statetable->fRowLen; - #ifdef RBBI_DEBUG - if (fTrace) { + if (gTrace) { RBBIDebugPuts("Handle Next pos char state category"); } #endif - // No matter what, handleNext alway correctly sets the break tag value. - fLastStatusIndexValid = TRUE; - fLastRuleStatusIndex = 0; + // handleNext alway sets the break tag value. + // Set the default for it. + fRuleStatusIndex = 0; + + fDictionaryCharCount = 0; // if we're already at the end of the text, return DONE. - initialPosition = (int32_t)UTEXT_GETNATIVEINDEX(fText); + initialPosition = fPosition; + UTEXT_SETNATIVEINDEX(fText, initialPosition); result = initialPosition; c = UTEXT_NEXT32(fText); - if (fData == NULL || c==U_SENTINEL) { - return BreakIterator::DONE; + if (c==U_SENTINEL) { + fDone = TRUE; + return UBRK_DONE; } // Set the initial state for the state machine @@ -1064,8 +802,8 @@ int32_t RuleBasedBreakIterator::handleNext(const RBBIStateTable *statetable) { row = (RBBIStateTableRow *) //(statetable->fTableData + (statetable->fRowLen * state)); (tableData + tableRowLen * state); - - + + mode = RBBI_RUN; if (statetable->fFlags & RBBI_BOF_REQUIRED) { category = 2; @@ -1079,7 +817,7 @@ int32_t RuleBasedBreakIterator::handleNext(const RBBIStateTable *statetable) { if (c == U_SENTINEL) { // Reached end of input string. if (mode == RBBI_END) { - // We have already run the loop one last time with the + // We have already run the loop one last time with the // character set to the psueudo {eof} value. Now it is time // to unconditionally bail out. break; @@ -1100,10 +838,10 @@ int32_t RuleBasedBreakIterator::handleNext(const RBBIStateTable *statetable) { // Note: the 16 in UTRIE_GET16 refers to the size of the data being returned, // not the size of the character going in, which is a UChar32. // - UTRIE_GET16(&fData->fTrie, c, category); + category = UTRIE2_GET16(fData->fTrie, c); // Check the dictionary bit in the character's category. - // Counter is only used by dictionary based iterators (subclasses). + // Counter is only used by dictionary based iteration. // Chars that need to be handled by a dictionary have a flag bit set // in their category values. // @@ -1115,7 +853,7 @@ int32_t RuleBasedBreakIterator::handleNext(const RBBIStateTable *statetable) { } #ifdef RBBI_DEBUG - if (fTrace) { + if (gTrace) { RBBIDebugPrintf(" %4ld ", utext_getNativeIndex(fText)); if (0x20<=c && c<0x7f) { RBBIDebugPrintf("\"%c\" ", c); @@ -1144,16 +882,16 @@ int32_t RuleBasedBreakIterator::handleNext(const RBBIStateTable *statetable) { if (mode != RBBI_START) { result = (int32_t)UTEXT_GETNATIVEINDEX(fText); } - fLastRuleStatusIndex = row->fTagIdx; // Remember the break status (tag) values. + fRuleStatusIndex = row->fTagIdx; // Remember the break status (tag) values. } int16_t completedRule = row->fAccepting; if (completedRule > 0) { - // Lookahead match is completed. + // Lookahead match is completed. int32_t lookaheadResult = lookAheadMatches.getPosition(completedRule); if (lookaheadResult >= 0) { - fLastRuleStatusIndex = row->fTagIdx; - UTEXT_SETNATIVEINDEX(fText, lookaheadResult); + fRuleStatusIndex = row->fTagIdx; + fPosition = lookaheadResult; return lookaheadResult; } } @@ -1170,8 +908,8 @@ int32_t RuleBasedBreakIterator::handleNext(const RBBIStateTable *statetable) { // longer match is possible, no matter what characters follow. break; } - - // Advance to the next character. + + // Advance to the next character. // If this is a beginning-of-input loop iteration, don't advance // the input position. The next iteration will be processing the // first real input character. @@ -1182,8 +920,6 @@ int32_t RuleBasedBreakIterator::handleNext(const RBBIStateTable *statetable) { mode = RBBI_RUN; } } - - } // The state machine is done. Check whether it found a match... @@ -1192,15 +928,16 @@ int32_t RuleBasedBreakIterator::handleNext(const RBBIStateTable *statetable) { // (This really indicates a defect in the break rules. They should always match // at least one character.) if (result == initialPosition) { - UTEXT_SETNATIVEINDEX(fText, initialPosition); - UTEXT_NEXT32(fText); - result = (int32_t)UTEXT_GETNATIVEINDEX(fText); + utext_setNativeIndex(fText, initialPosition); + utext_next32(fText); + result = (int32_t)utext_getNativeIndex(fText); + fRuleStatusIndex = 0; } // Leave the iterator at our result position. - UTEXT_SETNATIVEINDEX(fText, result); + fPosition = result; #ifdef RBBI_DEBUG - if (fTrace) { + if (gTrace) { RBBIDebugPrintf("result = %d\n\n", result); } #endif @@ -1213,13 +950,11 @@ int32_t RuleBasedBreakIterator::handleNext(const RBBIStateTable *statetable) { // // handlePrevious() // -// Iterate backwards, according to the logic of the reverse rules. -// This version handles the exact style backwards rules. -// +// Iterate backwards using the safe reverse rules. // The logic of this function is very similar to handleNext(), above. // //----------------------------------------------------------------------------------- -int32_t RuleBasedBreakIterator::handlePrevious(const RBBIStateTable *statetable) { +int32_t RuleBasedBreakIterator::handlePrevious(int32_t fromPosition) { int32_t state; uint16_t category = 0; RBBIRunMode mode; @@ -1229,19 +964,14 @@ int32_t RuleBasedBreakIterator::handlePrevious(const RBBIStateTable *statetable) int32_t result = 0; int32_t initialPosition = 0; + const RBBIStateTable *stateTable = fData->fSafeRevTable; + UTEXT_SETNATIVEINDEX(fText, fromPosition); #ifdef RBBI_DEBUG - if (fTrace) { + if (gTrace) { RBBIDebugPuts("Handle Previous pos char state category"); } #endif - // handlePrevious() never gets the rule status. - // Flag the status as invalid; if the user ever asks for status, we will need - // to back up, then re-find the break position using handleNext(), which does - // get the status value. - fLastStatusIndexValid = FALSE; - fLastRuleStatusIndex = 0; - // if we're already at the start of the text, return DONE. if (fText == NULL || fData == NULL || UTEXT_GETNATIVEINDEX(fText)==0) { return BreakIterator::DONE; @@ -1255,10 +985,10 @@ int32_t RuleBasedBreakIterator::handlePrevious(const RBBIStateTable *statetable) // Set the initial state for the state machine state = START_STATE; row = (RBBIStateTableRow *) - (statetable->fTableData + (statetable->fRowLen * state)); + (stateTable->fTableData + (stateTable->fRowLen * state)); category = 3; mode = RBBI_RUN; - if (statetable->fFlags & RBBI_BOF_REQUIRED) { + if (stateTable->fFlags & RBBI_BOF_REQUIRED) { category = 2; mode = RBBI_START; } @@ -1270,15 +1000,9 @@ int32_t RuleBasedBreakIterator::handlePrevious(const RBBIStateTable *statetable) if (c == U_SENTINEL) { // Reached end of input string. if (mode == RBBI_END) { - // We have already run the loop one last time with the + // We have already run the loop one last time with the // character set to the psueudo {eof} value. Now it is time // to unconditionally bail out. - if (result == initialPosition) { - // Ran off start, no match found. - // move one index one (towards the start, since we are doing a previous()) - UTEXT_SETNATIVEINDEX(fText, initialPosition); - (void)UTEXT_PREVIOUS32(fText); // TODO: shouldn't be necessary. We're already at beginning. Check. - } break; } // Run the loop one last time with the fake end-of-input character category. @@ -1297,22 +1021,13 @@ int32_t RuleBasedBreakIterator::handlePrevious(const RBBIStateTable *statetable) // Note: the 16 in UTRIE_GET16 refers to the size of the data being returned, // not the size of the character going in, which is a UChar32. // - UTRIE_GET16(&fData->fTrie, c, category); - - // Check the dictionary bit in the character's category. - // Counter is only used by dictionary based iterators (subclasses). - // Chars that need to be handled by a dictionary have a flag bit set - // in their category values. - // - if ((category & 0x4000) != 0) { - fDictionaryCharCount++; - // And off the dictionary flag bit. - category &= ~0x4000; - } + // And off the dictionary flag bit. For reverse iteration it is not used. + category = UTRIE2_GET16(fData->fTrie, c); + category &= ~0x4000; } #ifdef RBBI_DEBUG - if (fTrace) { + if (gTrace) { RBBIDebugPrintf(" %4d ", (int32_t)utext_getNativeIndex(fText)); if (0x20<=c && c<0x7f) { RBBIDebugPrintf("\"%c\" ", c); @@ -1332,7 +1047,7 @@ int32_t RuleBasedBreakIterator::handlePrevious(const RBBIStateTable *statetable) U_ASSERT(categoryfHeader->fCatCount); state = row->fNextState[category]; /*Not accessing beyond memory*/ row = (RBBIStateTableRow *) - (statetable->fTableData + (statetable->fRowLen * state)); + (stateTable->fTableData + (stateTable->fRowLen * state)); if (row->fAccepting == -1) { // Match found, common case. @@ -1341,7 +1056,7 @@ int32_t RuleBasedBreakIterator::handlePrevious(const RBBIStateTable *statetable) int16_t completedRule = row->fAccepting; if (completedRule > 0) { - // Lookahead match is completed. + // Lookahead match is completed. int32_t lookaheadResult = lookAheadMatches.getPosition(completedRule); if (lookaheadResult >= 0) { UTEXT_SETNATIVEINDEX(fText, lookaheadResult); @@ -1362,13 +1077,13 @@ int32_t RuleBasedBreakIterator::handlePrevious(const RBBIStateTable *statetable) break; } - // Move (backwards) to the next character to process. + // Move (backwards) to the next character to process. // If this is a beginning-of-input loop iteration, don't advance // the input position. The next iteration will be processing the // first real input character. if (mode == RBBI_RUN) { c = UTEXT_PREVIOUS32(fText); - } else { + } else { if (mode == RBBI_START) { mode = RBBI_RUN; } @@ -1386,10 +1101,8 @@ int32_t RuleBasedBreakIterator::handlePrevious(const RBBIStateTable *statetable) result = (int32_t)UTEXT_GETNATIVEINDEX(fText); } - // Leave the iterator at our result position. - UTEXT_SETNATIVEINDEX(fText, result); #ifdef RBBI_DEBUG - if (fTrace) { + if (gTrace) { RBBIDebugPrintf("result = %d\n\n", result); } #endif @@ -1397,20 +1110,6 @@ int32_t RuleBasedBreakIterator::handlePrevious(const RBBIStateTable *statetable) } -void -RuleBasedBreakIterator::reset() -{ - if (fCachedBreakPositions) { - uprv_free(fCachedBreakPositions); - } - fCachedBreakPositions = NULL; - fNumCachedBreakPositions = 0; - fDictionaryCharCount = 0; - fPositionInCache = 0; -} - - - //------------------------------------------------------------------------------- // // getRuleStatus() Return the break rule tag associated with the current @@ -1418,64 +1117,27 @@ RuleBasedBreakIterator::reset() // position by iterating forwards, the value will have been // cached by the handleNext() function. // -// If no cached status value is available, the status is -// found by doing a previous() followed by a next(), which -// leaves the iterator where it started, and computes the -// status while doing the next(). -// //------------------------------------------------------------------------------- -void RuleBasedBreakIterator::makeRuleStatusValid() { - if (fLastStatusIndexValid == FALSE) { - // No cached status is available. - if (fText == NULL || current() == 0) { - // At start of text, or there is no text. Status is always zero. - fLastRuleStatusIndex = 0; - fLastStatusIndexValid = TRUE; - } else { - // Not at start of text. Find status the tedious way. - int32_t pa = current(); - previous(); - if (fNumCachedBreakPositions > 0) { - reset(); // Blow off the dictionary cache - } - int32_t pb = next(); - if (pa != pb) { - // note: the if (pa != pb) test is here only to eliminate warnings for - // unused local variables on gcc. Logically, it isn't needed. - U_ASSERT(pa == pb); - } - } - } - U_ASSERT(fLastRuleStatusIndex >= 0 && fLastRuleStatusIndex < fData->fStatusMaxIdx); -} - int32_t RuleBasedBreakIterator::getRuleStatus() const { - RuleBasedBreakIterator *nonConstThis = (RuleBasedBreakIterator *)this; - nonConstThis->makeRuleStatusValid(); // fLastRuleStatusIndex indexes to the start of the appropriate status record // (the number of status values.) // This function returns the last (largest) of the array of status values. - int32_t idx = fLastRuleStatusIndex + fData->fRuleStatusTable[fLastRuleStatusIndex]; + int32_t idx = fRuleStatusIndex + fData->fRuleStatusTable[fRuleStatusIndex]; int32_t tagVal = fData->fRuleStatusTable[idx]; return tagVal; } - - int32_t RuleBasedBreakIterator::getRuleStatusVec( - int32_t *fillInVec, int32_t capacity, UErrorCode &status) -{ + int32_t *fillInVec, int32_t capacity, UErrorCode &status) { if (U_FAILURE(status)) { return 0; } - RuleBasedBreakIterator *nonConstThis = (RuleBasedBreakIterator *)this; - nonConstThis->makeRuleStatusValid(); - int32_t numVals = fData->fRuleStatusTable[fLastRuleStatusIndex]; + int32_t numVals = fData->fRuleStatusTable[fRuleStatusIndex]; int32_t numValsToCopy = numVals; if (numVals > capacity) { status = U_BUFFER_OVERFLOW_ERROR; @@ -1483,7 +1145,7 @@ int32_t RuleBasedBreakIterator::getRuleStatusVec( } int i; for (i=0; ifRuleStatusTable[fLastRuleStatusIndex + i + 1]; + fillInVec[i] = fData->fRuleStatusTable[fRuleStatusIndex + i + 1]; } return numVals; } @@ -1531,205 +1193,25 @@ BreakIterator * RuleBasedBreakIterator::createBufferClone(void * /*stackBuffer* return (RuleBasedBreakIterator *)clonedBI; } - -//------------------------------------------------------------------------------- -// -// isDictionaryChar Return true if the category lookup for this char -// indicates that it is in the set of dictionary lookup -// chars. -// -// This function is intended for use by dictionary based -// break iterators. -// -//------------------------------------------------------------------------------- -/*UBool RuleBasedBreakIterator::isDictionaryChar(UChar32 c) { - if (fData == NULL) { - return FALSE; - } - uint16_t category; - UTRIE_GET16(&fData->fTrie, c, category); - return (category & 0x4000) != 0; -}*/ - - -//------------------------------------------------------------------------------- -// -// checkDictionary This function handles all processing of characters in -// the "dictionary" set. It will determine the appropriate -// course of action, and possibly set up a cache in the -// process. -// -//------------------------------------------------------------------------------- -int32_t RuleBasedBreakIterator::checkDictionary(int32_t startPos, - int32_t endPos, - UBool reverse) { - // Reset the old break cache first. - reset(); - - // note: code segment below assumes that dictionary chars are in the - // startPos-endPos range - // value returned should be next character in sequence - if ((endPos - startPos) <= 1) { - return (reverse ? startPos : endPos); - } - - // Starting from the starting point, scan towards the proposed result, - // looking for the first dictionary character (which may be the one - // we're on, if we're starting in the middle of a range). - utext_setNativeIndex(fText, reverse ? endPos : startPos); - if (reverse) { - UTEXT_PREVIOUS32(fText); - } - - int32_t rangeStart = startPos; - int32_t rangeEnd = endPos; - - uint16_t category; - int32_t current; - UErrorCode status = U_ZERO_ERROR; - UStack breaks(status); - int32_t foundBreakCount = 0; - UChar32 c = utext_current32(fText); - - UTRIE_GET16(&fData->fTrie, c, category); - - // Is the character we're starting on a dictionary character? If so, we - // need to back up to include the entire run; otherwise the results of - // the break algorithm will differ depending on where we start. Since - // the result is cached and there is typically a non-dictionary break - // within a small number of words, there should be little performance impact. - if (category & 0x4000) { - if (reverse) { - do { - utext_next32(fText); // TODO: recast to work directly with postincrement. - c = utext_current32(fText); - UTRIE_GET16(&fData->fTrie, c, category); - } while (c != U_SENTINEL && (category & 0x4000)); - // Back up to the last dictionary character - rangeEnd = (int32_t)UTEXT_GETNATIVEINDEX(fText); - if (c == U_SENTINEL) { - // c = fText->last32(); - // TODO: why was this if needed? - c = UTEXT_PREVIOUS32(fText); - } - else { - c = UTEXT_PREVIOUS32(fText); - } - } - else { - do { - c = UTEXT_PREVIOUS32(fText); - UTRIE_GET16(&fData->fTrie, c, category); - } - while (c != U_SENTINEL && (category & 0x4000)); - // Back up to the last dictionary character - if (c == U_SENTINEL) { - // c = fText->first32(); - c = utext_current32(fText); - } - else { - utext_next32(fText); - c = utext_current32(fText); - } - rangeStart = (int32_t)UTEXT_GETNATIVEINDEX(fText);; - } - UTRIE_GET16(&fData->fTrie, c, category); - } - - // Loop through the text, looking for ranges of dictionary characters. - // For each span, find the appropriate break engine, and ask it to find - // any breaks within the span. - // Note: we always do this in the forward direction, so that the break - // cache is built in the right order. - if (reverse) { - utext_setNativeIndex(fText, rangeStart); - c = utext_current32(fText); - UTRIE_GET16(&fData->fTrie, c, category); - } - while(U_SUCCESS(status)) { - while((current = (int32_t)UTEXT_GETNATIVEINDEX(fText)) < rangeEnd && (category & 0x4000) == 0) { - utext_next32(fText); // TODO: tweak for post-increment operation - c = utext_current32(fText); - UTRIE_GET16(&fData->fTrie, c, category); - } - if (current >= rangeEnd) { - break; - } - - // We now have a dictionary character. Get the appropriate language object - // to deal with it. - const LanguageBreakEngine *lbe = getLanguageBreakEngine(c); - - // Ask the language object if there are any breaks. It will leave the text - // pointer on the other side of its range, ready to search for the next one. - if (lbe != NULL) { - foundBreakCount += lbe->findBreaks(fText, rangeStart, rangeEnd, FALSE, fBreakType, breaks); - } - - // Reload the loop variables for the next go-round - c = utext_current32(fText); - UTRIE_GET16(&fData->fTrie, c, category); - } - - // If we found breaks, build a new break cache. The first and last entries must - // be the original starting and ending position. - if (foundBreakCount > 0) { - U_ASSERT(foundBreakCount == breaks.size()); - int32_t totalBreaks = foundBreakCount; - if (startPos < breaks.elementAti(0)) { - totalBreaks += 1; - } - if (endPos > breaks.peeki()) { - totalBreaks += 1; - } - fCachedBreakPositions = (int32_t *)uprv_malloc(totalBreaks * sizeof(int32_t)); - if (fCachedBreakPositions != NULL) { - int32_t out = 0; - fNumCachedBreakPositions = totalBreaks; - if (startPos < breaks.elementAti(0)) { - fCachedBreakPositions[out++] = startPos; - } - for (int32_t i = 0; i < foundBreakCount; ++i) { - fCachedBreakPositions[out++] = breaks.elementAti(i); - } - if (endPos > fCachedBreakPositions[out-1]) { - fCachedBreakPositions[out] = endPos; - } - // If there are breaks, then by definition, we are replacing the original - // proposed break by one of the breaks we found. Use following() and - // preceding() to do the work. They should never recurse in this case. - if (reverse) { - return preceding(endPos); - } - else { - return following(startPos); - } - } - // If the allocation failed, just fall through to the "no breaks found" case. - } - - // If we get here, there were no language-based breaks. Set the text pointer - // to the original proposed break. - utext_setNativeIndex(fText, reverse ? startPos : endPos); - return (reverse ? startPos : endPos); -} - U_NAMESPACE_END -static icu::UStack *gLanguageBreakFactories = NULL; +static icu::UStack *gLanguageBreakFactories = nullptr; +static const icu::UnicodeString *gEmptyString = nullptr; static icu::UInitOnce gLanguageBreakFactoriesInitOnce = U_INITONCE_INITIALIZER; +static icu::UInitOnce gRBBIInitOnce = U_INITONCE_INITIALIZER; /** - * Release all static memory held by breakiterator. + * Release all static memory held by breakiterator. */ U_CDECL_BEGIN -static UBool U_CALLCONV breakiterator_cleanup_dict(void) { - if (gLanguageBreakFactories) { - delete gLanguageBreakFactories; - gLanguageBreakFactories = NULL; - } +static UBool U_CALLCONV rbbi_cleanup(void) { + delete gLanguageBreakFactories; + gLanguageBreakFactories = nullptr; + delete gEmptyString; + gEmptyString = nullptr; gLanguageBreakFactoriesInitOnce.reset(); + gRBBIInitOnce.reset(); return TRUE; } U_CDECL_END @@ -1741,6 +1223,11 @@ static void U_CALLCONV _deleteFactory(void *obj) { U_CDECL_END U_NAMESPACE_BEGIN +static void U_CALLCONV rbbiInit() { + gEmptyString = new UnicodeString(); + ucln_common_registerCleanup(UCLN_COMMON_RBBI, rbbi_cleanup); +} + static void U_CALLCONV initLanguageFactories() { UErrorCode status = U_ZERO_ERROR; U_ASSERT(gLanguageBreakFactories == NULL); @@ -1755,7 +1242,7 @@ static void U_CALLCONV initLanguageFactories() { } #endif } - ucln_common_registerCleanup(UCLN_COMMON_BREAKITERATOR_DICT, breakiterator_cleanup_dict); + ucln_common_registerCleanup(UCLN_COMMON_RBBI, rbbi_cleanup); } @@ -1766,7 +1253,7 @@ getLanguageBreakEngineFromFactory(UChar32 c, int32_t breakType) if (gLanguageBreakFactories == NULL) { return NULL; } - + int32_t i = gLanguageBreakFactories->size(); const LanguageBreakEngine *lbe = NULL; while (--i >= 0) { @@ -1790,7 +1277,7 @@ const LanguageBreakEngine * RuleBasedBreakIterator::getLanguageBreakEngine(UChar32 c) { const LanguageBreakEngine *lbe = NULL; UErrorCode status = U_ZERO_ERROR; - + if (fLanguageBreakEngines == NULL) { fLanguageBreakEngines = new UStack(status); if (fLanguageBreakEngines == NULL || U_FAILURE(status)) { @@ -1799,7 +1286,7 @@ RuleBasedBreakIterator::getLanguageBreakEngine(UChar32 c) { return NULL; } } - + int32_t i = fLanguageBreakEngines->size(); while (--i >= 0) { lbe = (const LanguageBreakEngine *)(fLanguageBreakEngines->elementAt(i)); @@ -1807,11 +1294,11 @@ RuleBasedBreakIterator::getLanguageBreakEngine(UChar32 c) { return lbe; } } - + // No existing dictionary took the character. See if a factory wants to // give us a new LanguageBreakEngine for this character. lbe = getLanguageBreakEngineFromFactory(c, fBreakType); - + // If we got one, use it and push it on our stack. if (lbe != NULL) { fLanguageBreakEngines->push((void *)lbe, status); @@ -1819,7 +1306,7 @@ RuleBasedBreakIterator::getLanguageBreakEngine(UChar32 c) { // return it even if the push fails. return lbe; } - + // No engine is forthcoming for this character. Add it to the // reject set. Create the reject break engine if needed. if (fUnhandledBreakEngine == NULL) { @@ -1837,11 +1324,11 @@ RuleBasedBreakIterator::getLanguageBreakEngine(UChar32 c) { return NULL; } } - + // Tell the reject engine about the character; at its discretion, it may // add more than just the one character. fUnhandledBreakEngine->handleCharacter(c, fBreakType); - + return fUnhandledBreakEngine; } @@ -1853,7 +1340,24 @@ RuleBasedBreakIterator::getLanguageBreakEngine(UChar32 c) { void RuleBasedBreakIterator::setBreakType(int32_t type) { fBreakType = type; - reset(); +} + +void RuleBasedBreakIterator::dumpCache() { + fBreakCache->dumpCache(); +} + +/** + * Returns the description used to create this iterator + */ + +const UnicodeString& +RuleBasedBreakIterator::getRules() const { + if (fData != NULL) { + return fData->getRuleSourceString(); + } else { + umtx_initOnce(gRBBIInitOnce, &rbbiInit); + return *gEmptyString; + } } U_NAMESPACE_END diff --git a/Build/source/libs/icu/icu-src/source/common/rbbi_cache.cpp b/Build/source/libs/icu/icu-src/source/common/rbbi_cache.cpp new file mode 100644 index 00000000000..b3c3a38a0de --- /dev/null +++ b/Build/source/libs/icu/icu-src/source/common/rbbi_cache.cpp @@ -0,0 +1,630 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html + +// file: rbbi_cache.cpp + +#include "unicode/utypes.h" + +#if !UCONFIG_NO_BREAK_ITERATION + +#include "unicode/ubrk.h" +#include "unicode/rbbi.h" + +#include "rbbi_cache.h" + +#include "brkeng.h" +#include "cmemory.h" +#include "rbbidata.h" +#include "rbbirb.h" +#include "uassert.h" +#include "uvectr32.h" + +U_NAMESPACE_BEGIN + +/* + * DictionaryCache implementation + */ + +RuleBasedBreakIterator::DictionaryCache::DictionaryCache(RuleBasedBreakIterator *bi, UErrorCode &status) : + fBI(bi), fBreaks(NULL), fPositionInCache(-1), + fStart(0), fLimit(0), fFirstRuleStatusIndex(0), fOtherRuleStatusIndex(0) { + fBreaks = new UVector32(status); +} + +RuleBasedBreakIterator::DictionaryCache::~DictionaryCache() { + delete fBreaks; + fBreaks = NULL; +} + +void RuleBasedBreakIterator::DictionaryCache::reset() { + fPositionInCache = -1; + fStart = 0; + fLimit = 0; + fFirstRuleStatusIndex = 0; + fOtherRuleStatusIndex = 0; + fBreaks->removeAllElements(); +} + +UBool RuleBasedBreakIterator::DictionaryCache::following(int32_t fromPos, int32_t *result, int32_t *statusIndex) { + if (fromPos >= fLimit || fromPos < fStart) { + fPositionInCache = -1; + return FALSE; + } + + // Sequential iteration, move from previous boundary to the following + + int32_t r = 0; + if (fPositionInCache >= 0 && fPositionInCache < fBreaks->size() && fBreaks->elementAti(fPositionInCache) == fromPos) { + ++fPositionInCache; + if (fPositionInCache >= fBreaks->size()) { + fPositionInCache = -1; + return FALSE; + } + r = fBreaks->elementAti(fPositionInCache); + U_ASSERT(r > fromPos); + *result = r; + *statusIndex = fOtherRuleStatusIndex; + return TRUE; + } + + // Random indexing. Linear search for the boundary following the given position. + + for (fPositionInCache = 0; fPositionInCache < fBreaks->size(); ++fPositionInCache) { + r= fBreaks->elementAti(fPositionInCache); + if (r > fromPos) { + *result = r; + *statusIndex = fOtherRuleStatusIndex; + return TRUE; + } + } + U_ASSERT(FALSE); + fPositionInCache = -1; + return FALSE; +} + + +UBool RuleBasedBreakIterator::DictionaryCache::preceding(int32_t fromPos, int32_t *result, int32_t *statusIndex) { + if (fromPos <= fStart || fromPos > fLimit) { + fPositionInCache = -1; + return FALSE; + } + + if (fromPos == fLimit) { + fPositionInCache = fBreaks->size() - 1; + if (fPositionInCache >= 0) { + U_ASSERT(fBreaks->elementAti(fPositionInCache) == fromPos); + } + } + + int32_t r; + if (fPositionInCache > 0 && fPositionInCache < fBreaks->size() && fBreaks->elementAti(fPositionInCache) == fromPos) { + --fPositionInCache; + r = fBreaks->elementAti(fPositionInCache); + U_ASSERT(r < fromPos); + *result = r; + *statusIndex = ( r== fStart) ? fFirstRuleStatusIndex : fOtherRuleStatusIndex; + return TRUE; + } + + if (fPositionInCache == 0) { + fPositionInCache = -1; + return FALSE; + } + + for (fPositionInCache = fBreaks->size()-1; fPositionInCache >= 0; --fPositionInCache) { + r = fBreaks->elementAti(fPositionInCache); + if (r < fromPos) { + *result = r; + *statusIndex = ( r == fStart) ? fFirstRuleStatusIndex : fOtherRuleStatusIndex; + return TRUE; + } + } + U_ASSERT(FALSE); + fPositionInCache = -1; + return FALSE; +} + +void RuleBasedBreakIterator::DictionaryCache::populateDictionary(int32_t startPos, int32_t endPos, + int32_t firstRuleStatus, int32_t otherRuleStatus) { + if ((endPos - startPos) <= 1) { + return; + } + + reset(); + fFirstRuleStatusIndex = firstRuleStatus; + fOtherRuleStatusIndex = otherRuleStatus; + + int32_t rangeStart = startPos; + int32_t rangeEnd = endPos; + + uint16_t category; + int32_t current; + UErrorCode status = U_ZERO_ERROR; + int32_t foundBreakCount = 0; + UText *text = fBI->fText; + + // Loop through the text, looking for ranges of dictionary characters. + // For each span, find the appropriate break engine, and ask it to find + // any breaks within the span. + + utext_setNativeIndex(text, rangeStart); + UChar32 c = utext_current32(text); + category = UTRIE2_GET16(fBI->fData->fTrie, c); + + while(U_SUCCESS(status)) { + while((current = (int32_t)UTEXT_GETNATIVEINDEX(text)) < rangeEnd && (category & 0x4000) == 0) { + utext_next32(text); // TODO: cleaner loop structure. + c = utext_current32(text); + category = UTRIE2_GET16(fBI->fData->fTrie, c); + } + if (current >= rangeEnd) { + break; + } + + // We now have a dictionary character. Get the appropriate language object + // to deal with it. + const LanguageBreakEngine *lbe = fBI->getLanguageBreakEngine(c); + + // Ask the language object if there are any breaks. It will add them to the cache and + // leave the text pointer on the other side of its range, ready to search for the next one. + if (lbe != NULL) { + foundBreakCount += lbe->findBreaks(text, rangeStart, rangeEnd, fBI->fBreakType, *fBreaks); + } + + // Reload the loop variables for the next go-round + c = utext_current32(text); + category = UTRIE2_GET16(fBI->fData->fTrie, c); + } + + // If we found breaks, ensure that the first and last entries are + // the original starting and ending position. And initialize the + // cache iteration position to the first entry. + + // printf("foundBreakCount = %d\n", foundBreakCount); + if (foundBreakCount > 0) { + U_ASSERT(foundBreakCount == fBreaks->size()); + if (startPos < fBreaks->elementAti(0)) { + // The dictionary did not place a boundary at the start of the segment of text. + // Add one now. This should not commonly happen, but it would be easy for interactions + // of the rules for dictionary segments and the break engine implementations to + // inadvertently cause it. Cover it here, just in case. + fBreaks->insertElementAt(startPos, 0, status); + } + if (endPos > fBreaks->peeki()) { + fBreaks->push(endPos, status); + } + fPositionInCache = 0; + // Note: Dictionary matching may extend beyond the original limit. + fStart = fBreaks->elementAti(0); + fLimit = fBreaks->peeki(); + } else { + // there were no language-based breaks, even though the segment contained + // dictionary characters. Subsequent attempts to fetch boundaries from the dictionary cache + // for this range will fail, and the calling code will fall back to the rule based boundaries. + } +} + + +/* + * BreakCache implemetation + */ + +RuleBasedBreakIterator::BreakCache::BreakCache(RuleBasedBreakIterator *bi, UErrorCode &status) : + fBI(bi), fSideBuffer(status) { + reset(); +} + + +RuleBasedBreakIterator::BreakCache::~BreakCache() { +} + + +void RuleBasedBreakIterator::BreakCache::reset(int32_t pos, int32_t ruleStatus) { + fStartBufIdx = 0; + fEndBufIdx = 0; + fTextIdx = pos; + fBufIdx = 0; + fBoundaries[0] = pos; + fStatuses[0] = (uint16_t)ruleStatus; +} + + +int32_t RuleBasedBreakIterator::BreakCache::current() { + fBI->fPosition = fTextIdx; + fBI->fRuleStatusIndex = fStatuses[fBufIdx]; + fBI->fDone = FALSE; + return fTextIdx; +} + + +void RuleBasedBreakIterator::BreakCache::following(int32_t startPos, UErrorCode &status) { + if (U_FAILURE(status)) { + return; + } + if (startPos == fTextIdx || seek(startPos) || populateNear(startPos, status)) { + // startPos is in the cache. Do a next() from that position. + // TODO: an awkward set of interactions with bi->fDone + // seek() does not clear it; it can't because of interactions with populateNear(). + // next() does not clear it in the fast-path case, where everything matters. Maybe it should. + // So clear it here, for the case where seek() succeeded on an iterator that had previously run off the end. + fBI->fDone = false; + next(); + } + return; +} + + +void RuleBasedBreakIterator::BreakCache::preceding(int32_t startPos, UErrorCode &status) { + if (U_FAILURE(status)) { + return; + } + if (startPos == fTextIdx || seek(startPos) || populateNear(startPos, status)) { + if (startPos == fTextIdx) { + previous(status); + } else { + // seek() leaves the BreakCache positioned at the preceding boundary + // if the requested position is between two bounaries. + // current() pushes the BreakCache position out to the BreakIterator itself. + U_ASSERT(startPos > fTextIdx); + current(); + } + } + return; +} + + +/* + * Out-of-line code for BreakCache::next(). + * Cache does not already contain the boundary + */ +void RuleBasedBreakIterator::BreakCache::nextOL() { + fBI->fDone = !populateFollowing(); + fBI->fPosition = fTextIdx; + fBI->fRuleStatusIndex = fStatuses[fBufIdx]; + return; +} + + +void RuleBasedBreakIterator::BreakCache::previous(UErrorCode &status) { + if (U_FAILURE(status)) { + return; + } + int32_t initialBufIdx = fBufIdx; + if (fBufIdx == fStartBufIdx) { + // At start of cache. Prepend to it. + populatePreceding(status); + } else { + // Cache already holds the next boundary + fBufIdx = modChunkSize(fBufIdx - 1); + fTextIdx = fBoundaries[fBufIdx]; + } + fBI->fDone = (fBufIdx == initialBufIdx); + fBI->fPosition = fTextIdx; + fBI->fRuleStatusIndex = fStatuses[fBufIdx]; + return; +} + + +UBool RuleBasedBreakIterator::BreakCache::seek(int32_t pos) { + if (pos < fBoundaries[fStartBufIdx] || pos > fBoundaries[fEndBufIdx]) { + return FALSE; + } + if (pos == fBoundaries[fStartBufIdx]) { + // Common case: seek(0), from BreakIterator::first() + fBufIdx = fStartBufIdx; + fTextIdx = fBoundaries[fBufIdx]; + return TRUE; + } + if (pos == fBoundaries[fEndBufIdx]) { + fBufIdx = fEndBufIdx; + fTextIdx = fBoundaries[fBufIdx]; + return TRUE; + } + + int32_t min = fStartBufIdx; + int32_t max = fEndBufIdx; + while (min != max) { + int32_t probe = (min + max + (min>max ? CACHE_SIZE : 0)) / 2; + probe = modChunkSize(probe); + if (fBoundaries[probe] > pos) { + max = probe; + } else { + min = modChunkSize(probe + 1); + } + } + U_ASSERT(fBoundaries[max] > pos); + fBufIdx = modChunkSize(max - 1); + fTextIdx = fBoundaries[fBufIdx]; + U_ASSERT(fTextIdx <= pos); + return TRUE; +} + + +UBool RuleBasedBreakIterator::BreakCache::populateNear(int32_t position, UErrorCode &status) { + if (U_FAILURE(status)) { + return FALSE; + } + U_ASSERT(position < fBoundaries[fStartBufIdx] || position > fBoundaries[fEndBufIdx]); + + // Find a boundary somewhere in the vicinity of the requested position. + // Depending on the safe rules and the text data, it could be either before, at, or after + // the requested position. + + + // If the requested position is not near already cached positions, clear the existing cache, + // find a near-by boundary and begin new cache contents there. + + if ((position < fBoundaries[fStartBufIdx] - 15) || position > (fBoundaries[fEndBufIdx] + 15)) { + int32_t aBoundary = 0; + int32_t ruleStatusIndex = 0; + // TODO: check for position == length of text. Although may still need to back up to get rule status. + if (position > 20) { + int32_t backupPos = fBI->handlePrevious(position); + fBI->fPosition = backupPos; + aBoundary = fBI->handleNext(); // Ignore dictionary, just finding a rule based boundary. + ruleStatusIndex = fBI->fRuleStatusIndex; + } + reset(aBoundary, ruleStatusIndex); // Reset cache to hold aBoundary as a single starting point. + } + + // Fill in boundaries between existing cache content and the new requested position. + + if (fBoundaries[fEndBufIdx] < position) { + // The last position in the cache precedes the requested position. + // Add following position(s) to the cache. + while (fBoundaries[fEndBufIdx] < position) { + if (!populateFollowing()) { + U_ASSERT(false); + return false; + } + } + fBufIdx = fEndBufIdx; // Set iterator position to the end of the buffer. + fTextIdx = fBoundaries[fBufIdx]; // Required because populateFollowing may add extra boundaries. + while (fTextIdx > position) { // Move backwards to a position at or preceding the requested pos. + previous(status); + } + return true; + } + + if (fBoundaries[fStartBufIdx] > position) { + // The first position in the cache is beyond the requested position. + // back up more until we get a boundary <= the requested position. + while (fBoundaries[fStartBufIdx] > position) { + populatePreceding(status); + } + fBufIdx = fStartBufIdx; // Set iterator position to the start of the buffer. + fTextIdx = fBoundaries[fBufIdx]; // Required because populatePreceding may add extra boundaries. + while (fTextIdx < position) { // Move forwards to a position at or following the requested pos. + next(); + } + if (fTextIdx > position) { + // If position is not itself a boundary, the next() loop above will overshoot. + // Back up one, leaving cache position at the boundary preceding the requested position. + previous(status); + } + return true; + } + + U_ASSERT(fTextIdx == position); + return true; +} + + + +UBool RuleBasedBreakIterator::BreakCache::populateFollowing() { + int32_t fromPosition = fBoundaries[fEndBufIdx]; + int32_t fromRuleStatusIdx = fStatuses[fEndBufIdx]; + int32_t pos = 0; + int32_t ruleStatusIdx = 0; + + if (fBI->fDictionaryCache->following(fromPosition, &pos, &ruleStatusIdx)) { + addFollowing(pos, ruleStatusIdx, UpdateCachePosition); + return TRUE; + } + + fBI->fPosition = fromPosition; + pos = fBI->handleNext(); + if (pos == UBRK_DONE) { + return FALSE; + } + + ruleStatusIdx = fBI->fRuleStatusIndex; + if (fBI->fDictionaryCharCount > 0) { + // The text segment obtained from the rules includes dictionary characters. + // Subdivide it, with subdivided results going into the dictionary cache. + fBI->fDictionaryCache->populateDictionary(fromPosition, pos, fromRuleStatusIdx, ruleStatusIdx); + if (fBI->fDictionaryCache->following(fromPosition, &pos, &ruleStatusIdx)) { + addFollowing(pos, ruleStatusIdx, UpdateCachePosition); + return TRUE; + // TODO: may want to move a sizable chunk of dictionary cache to break cache at this point. + // But be careful with interactions with populateNear(). + } + } + + // Rule based segment did not include dictionary characters. + // Or, it did contain dictionary chars, but the dictionary segmenter didn't handle them, + // meaning that we didn't take the return, above. + // Add its end point to the cache. + addFollowing(pos, ruleStatusIdx, UpdateCachePosition); + + // Add several non-dictionary boundaries at this point, to optimize straight forward iteration. + // (subsequent calls to BreakIterator::next() will take the fast path, getting cached results. + // + for (int count=0; count<6; ++count) { + pos = fBI->handleNext(); + if (pos == UBRK_DONE || fBI->fDictionaryCharCount > 0) { + break; + } + addFollowing(pos, fBI->fRuleStatusIndex, RetainCachePosition); + } + + return TRUE; +} + + +UBool RuleBasedBreakIterator::BreakCache::populatePreceding(UErrorCode &status) { + if (U_FAILURE(status)) { + return FALSE; + } + + int32_t fromPosition = fBoundaries[fStartBufIdx]; + if (fromPosition == 0) { + return FALSE; + } + + int32_t position = 0; + int32_t positionStatusIdx = 0; + + if (fBI->fDictionaryCache->preceding(fromPosition, &position, &positionStatusIdx)) { + addPreceding(position, positionStatusIdx, UpdateCachePosition); + return TRUE; + } + + int32_t backupPosition = fromPosition; + + // Find a boundary somewhere preceding the first already-cached boundary + do { + backupPosition = backupPosition - 30; + if (backupPosition <= 0) { + backupPosition = 0; + } else { + backupPosition = fBI->handlePrevious(backupPosition); + } + if (backupPosition == UBRK_DONE || backupPosition == 0) { + position = 0; + positionStatusIdx = 0; + } else { + fBI->fPosition = backupPosition; // TODO: pass starting position in a clearer way. + position = fBI->handleNext(); + positionStatusIdx = fBI->fRuleStatusIndex; + + } + } while (position >= fromPosition); + + // Find boundaries between the one we just located and the first already-cached boundary + // Put them in a side buffer, because we don't yet know where they will fall in the circular cache buffer.. + + fSideBuffer.removeAllElements(); + fSideBuffer.addElement(position, status); + fSideBuffer.addElement(positionStatusIdx, status); + + do { + int32_t prevPosition = fBI->fPosition = position; + int32_t prevStatusIdx = positionStatusIdx; + position = fBI->handleNext(); + positionStatusIdx = fBI->fRuleStatusIndex; + if (position == UBRK_DONE) { + break; + } + + UBool segmentHandledByDictionary = FALSE; + if (fBI->fDictionaryCharCount != 0) { + // Segment from the rules includes dictionary characters. + // Subdivide it, with subdivided results going into the dictionary cache. + int32_t dictSegEndPosition = position; + fBI->fDictionaryCache->populateDictionary(prevPosition, dictSegEndPosition, prevStatusIdx, positionStatusIdx); + while (fBI->fDictionaryCache->following(prevPosition, &position, &positionStatusIdx)) { + segmentHandledByDictionary = true; + U_ASSERT(position > prevPosition); + if (position >= fromPosition) { + break; + } + U_ASSERT(position <= dictSegEndPosition); + fSideBuffer.addElement(position, status); + fSideBuffer.addElement(positionStatusIdx, status); + prevPosition = position; + } + U_ASSERT(position==dictSegEndPosition || position>=fromPosition); + } + + if (!segmentHandledByDictionary && position < fromPosition) { + fSideBuffer.addElement(position, status); + fSideBuffer.addElement(positionStatusIdx, status); + } + } while (position < fromPosition); + + // Move boundaries from the side buffer to the main circular buffer. + UBool success = FALSE; + if (!fSideBuffer.isEmpty()) { + positionStatusIdx = fSideBuffer.popi(); + position = fSideBuffer.popi(); + addPreceding(position, positionStatusIdx, UpdateCachePosition); + success = TRUE; + } + + while (!fSideBuffer.isEmpty()) { + positionStatusIdx = fSideBuffer.popi(); + position = fSideBuffer.popi(); + if (!addPreceding(position, positionStatusIdx, RetainCachePosition)) { + // No space in circular buffer to hold a new preceding result while + // also retaining the current cache (iteration) position. + // Bailing out is safe; the cache will refill again if needed. + break; + } + } + + return success; +} + + +void RuleBasedBreakIterator::BreakCache::addFollowing(int32_t position, int32_t ruleStatusIdx, UpdatePositionValues update) { + U_ASSERT(position > fBoundaries[fEndBufIdx]); + U_ASSERT(ruleStatusIdx <= UINT16_MAX); + int32_t nextIdx = modChunkSize(fEndBufIdx + 1); + if (nextIdx == fStartBufIdx) { + fStartBufIdx = modChunkSize(fStartBufIdx + 6); // TODO: experiment. Probably revert to 1. + } + fBoundaries[nextIdx] = position; + fStatuses[nextIdx] = ruleStatusIdx; + fEndBufIdx = nextIdx; + if (update == UpdateCachePosition) { + // Set current position to the newly added boundary. + fBufIdx = nextIdx; + fTextIdx = position; + } else { + // Retaining the original cache position. + // Check if the added boundary wraps around the buffer, and would over-write the original position. + // It's the responsibility of callers of this function to not add too many. + U_ASSERT(nextIdx != fBufIdx); + } +} + +bool RuleBasedBreakIterator::BreakCache::addPreceding(int32_t position, int32_t ruleStatusIdx, UpdatePositionValues update) { + U_ASSERT(position < fBoundaries[fStartBufIdx]); + U_ASSERT(ruleStatusIdx <= UINT16_MAX); + int32_t nextIdx = modChunkSize(fStartBufIdx - 1); + if (nextIdx == fEndBufIdx) { + if (fBufIdx == fEndBufIdx && update == RetainCachePosition) { + // Failure. The insertion of the new boundary would claim the buffer position that is the + // current iteration position. And we also want to retain the current iteration position. + // (The buffer is already completely full of entries that precede the iteration position.) + return false; + } + fEndBufIdx = modChunkSize(fEndBufIdx - 1); + } + fBoundaries[nextIdx] = position; + fStatuses[nextIdx] = ruleStatusIdx; + fStartBufIdx = nextIdx; + if (update == UpdateCachePosition) { + fBufIdx = nextIdx; + fTextIdx = position; + } + return true; +} + + +void RuleBasedBreakIterator::BreakCache::dumpCache() { +#ifdef RBBI_DEBUG + RBBIDebugPrintf("fTextIdx:%d fBufIdx:%d\n", fTextIdx, fBufIdx); + for (int32_t i=fStartBufIdx; ; i=modChunkSize(i+1)) { + RBBIDebugPrintf("%d %d\n", i, fBoundaries[i]); + if (i == fEndBufIdx) { + break; + } + } +#endif +} + +U_NAMESPACE_END + +#endif // #if !UCONFIG_NO_BREAK_ITERATION diff --git a/Build/source/libs/icu/icu-src/source/common/rbbi_cache.h b/Build/source/libs/icu/icu-src/source/common/rbbi_cache.h new file mode 100644 index 00000000000..dea017a9126 --- /dev/null +++ b/Build/source/libs/icu/icu-src/source/common/rbbi_cache.h @@ -0,0 +1,203 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html + +// file: rbbi_cache.h +// +#ifndef RBBI_CACHE_H +#define RBBI_CACHE_H + +#include "unicode/utypes.h" + +#if !UCONFIG_NO_BREAK_ITERATION + +#include "unicode/rbbi.h" +#include "unicode/uobject.h" + +#include "uvectr32.h" + +U_NAMESPACE_BEGIN + +/* DictionaryCache stores the boundaries obtained from a run of dictionary characters. + * Dictionary boundaries are moved first to this cache, then from here + * to the main BreakCache, where they may inter-leave with non-dictionary + * boundaries. The public BreakIterator API always fetches directly + * from the main BreakCache, not from here. + * + * In common situations, the number of boundaries in a single dictionary run + * should be quite small, it will be terminated by punctuation, spaces, + * or any other non-dictionary characters. The main BreakCache may end + * up with boundaries from multiple dictionary based runs. + * + * The boundaries are stored in a simple ArrayList (vector), with the + * assumption that they will be accessed sequentially. + */ +class RuleBasedBreakIterator::DictionaryCache: public UMemory { + public: + DictionaryCache(RuleBasedBreakIterator *bi, UErrorCode &status); + ~DictionaryCache(); + + void reset(); + + UBool following(int32_t fromPos, int32_t *pos, int32_t *statusIndex); + UBool preceding(int32_t fromPos, int32_t *pos, int32_t *statusIndex); + + /** + * Populate the cache with the dictionary based boundaries within a region of text. + * @param startPos The start position of a range of text + * @param endPos The end position of a range of text + * @param firstRuleStatus The rule status index that applies to the break at startPos + * @param otherRuleStatus The rule status index that applies to boundaries other than startPos + * @internal + */ + void populateDictionary(int32_t startPos, int32_t endPos, + int32_t firstRuleStatus, int32_t otherRuleStatus); + + + + RuleBasedBreakIterator *fBI; + + UVector32 *fBreaks; // A vector containing the boundaries. + int32_t fPositionInCache; // Index in fBreaks of last boundary returned by following() + // or preceding(). Optimizes sequential access. + int32_t fStart; // Text position of first boundary in cache. + int32_t fLimit; // Last boundary in cache. Which is the limit of the + // text segment being handled by the dictionary. + int32_t fFirstRuleStatusIndex; // Rule status info for first boundary. + int32_t fOtherRuleStatusIndex; // Rule status info for 2nd through last boundaries. +}; + + +/* + * class BreakCache + * + * Cache of break boundary positions and rule status values. + * Break iterator API functions, next(), previous(), etc., will use cached results + * when possible, and otherwise cache new results as they are obtained. + * + * Uniformly caches both dictionary and rule based (non-dictionary) boundaries. + * + * The cache is implemented as a single circular buffer. + */ + +/* + * size of the circular cache buffer. + */ + +class RuleBasedBreakIterator::BreakCache: public UMemory { + public: + BreakCache(RuleBasedBreakIterator *bi, UErrorCode &status); + virtual ~BreakCache(); + void reset(int32_t pos = 0, int32_t ruleStatus = 0); + void next() { if (fBufIdx == fEndBufIdx) { + nextOL(); + } else { + fBufIdx = modChunkSize(fBufIdx + 1); + fTextIdx = fBI->fPosition = fBoundaries[fBufIdx]; + fBI->fRuleStatusIndex = fStatuses[fBufIdx]; + } + }; + + + void nextOL(); + void previous(UErrorCode &status); + + // Move the iteration state to the position following the startPosition. + // Input position must be pinned to the input length. + void following(int32_t startPosition, UErrorCode &status); + + void preceding(int32_t startPosition, UErrorCode &status); + + /* + * Update the state of the public BreakIterator (fBI) to reflect the + * current state of the break iterator cache (this). + */ + int32_t current(); + + /** + * Add boundaries to the cache near the specified position. + * The given position need not be a boundary itself. + * The input position must be within the range of the text, and + * on a code point boundary. + * If the requested position is a break boundary, leave the iteration + * position on it. + * If the requested position is not a boundary, leave the iteration + * position on the preceding boundary and include both the + * preceding and following boundaries in the cache. + * Additional boundaries, either preceding or following, may be added + * to the cache as a side effect. + * + * Return FALSE if the operation failed. + */ + UBool populateNear(int32_t position, UErrorCode &status); + + /** + * Add boundary(s) to the cache following the current last boundary. + * Return FALSE if at the end of the text, and no more boundaries can be added. + * Leave iteration position at the first newly added boundary, or unchanged if no boundary was added. + */ + UBool populateFollowing(); + + /** + * Add one or more boundaries to the cache preceding the first currently cached boundary. + * Leave the iteration position on the first added boundary. + * Return false if no boundaries could be added (if at the start of the text.) + */ + UBool populatePreceding(UErrorCode &status); + + enum UpdatePositionValues { + RetainCachePosition = 0, + UpdateCachePosition = 1 + }; + + /* + * Add the boundary following the current position. + * The current position can be left as it was, or changed to the newly added boundary, + * as specified by the update parameter. + */ + void addFollowing(int32_t position, int32_t ruleStatusIdx, UpdatePositionValues update); + + + /* + * Add the boundary preceding the current position. + * The current position can be left as it was, or changed to the newly added boundary, + * as specified by the update parameter. + */ + bool addPreceding(int32_t position, int32_t ruleStatusIdx, UpdatePositionValues update); + + /** + * Set the cache position to the specified position, or, if the position + * falls between to cached boundaries, to the preceding boundary. + * Fails if the requested position is outside of the range of boundaries currently held by the cache. + * The startPosition must be on a code point boundary. + * + * Return TRUE if successful, FALSE if the specified position is after + * the last cached boundary or before the first. + */ + UBool seek(int32_t startPosition); + + void dumpCache(); + + private: + static inline int32_t modChunkSize(int index) { return index & (CACHE_SIZE - 1); }; + + static constexpr int32_t CACHE_SIZE = 128; + static_assert((CACHE_SIZE & (CACHE_SIZE-1)) == 0, "CACHE_SIZE must be power of two."); + + RuleBasedBreakIterator *fBI; + int32_t fStartBufIdx; + int32_t fEndBufIdx; // inclusive + + int32_t fTextIdx; + int32_t fBufIdx; + + int32_t fBoundaries[CACHE_SIZE]; + uint16_t fStatuses[CACHE_SIZE]; + + UVector32 fSideBuffer; +}; + +U_NAMESPACE_END + +#endif // #if !UCONFIG_NO_BREAK_ITERATION + +#endif // RBBI_CACHE_H diff --git a/Build/source/libs/icu/icu-src/source/common/rbbidata.cpp b/Build/source/libs/icu/icu-src/source/common/rbbidata.cpp index 26e11ac2eb6..33405708c06 100644 --- a/Build/source/libs/icu/icu-src/source/common/rbbidata.cpp +++ b/Build/source/libs/icu/icu-src/source/common/rbbidata.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* *************************************************************************** @@ -14,7 +14,7 @@ #include "unicode/utypes.h" #include "rbbidata.h" #include "rbbirb.h" -#include "utrie.h" +#include "utrie2.h" #include "udatamem.h" #include "cmemory.h" #include "cstring.h" @@ -23,23 +23,6 @@ #include "uassert.h" -//----------------------------------------------------------------------------------- -// -// Trie access folding function. Copied as-is from properties code in uchar.c -// -//----------------------------------------------------------------------------------- -U_CDECL_BEGIN -static int32_t U_CALLCONV -getFoldingOffset(uint32_t data) { - /* if bit 15 is set, then the folding offset is in bits 14..0 of the 16-bit trie result */ - if(data&0x8000) { - return (int32_t)(data&0x7fff); - } else { - return 0; - } -} -U_CDECL_END - U_NAMESPACE_BEGIN //----------------------------------------------------------------------------- @@ -71,9 +54,8 @@ RBBIDataWrapper::RBBIDataWrapper(UDataMemory* udm, UErrorCode &status) { dh->info.dataFormat[0] == 0x42 && // dataFormat="Brk " dh->info.dataFormat[1] == 0x72 && dh->info.dataFormat[2] == 0x6b && - dh->info.dataFormat[3] == 0x20) - // Note: info.fFormatVersion is duplicated in the RBBIDataHeader, and is - // validated when checking that. + dh->info.dataFormat[3] == 0x20 && + isDataVersionAcceptable(dh->info.formatVersion)) ) { status = U_INVALID_FORMAT_ERROR; return; @@ -84,6 +66,11 @@ RBBIDataWrapper::RBBIDataWrapper(UDataMemory* udm, UErrorCode &status) { fUDataMem = udm; } +UBool RBBIDataWrapper::isDataVersionAcceptable(const UVersionInfo version) { + return RBBI_DATA_FORMAT_VERSION[0] == version[0]; +} + + //----------------------------------------------------------------------------- // // init(). Does most of the work of construction, shared between the @@ -96,10 +83,11 @@ void RBBIDataWrapper::init0() { fReverseTable = NULL; fSafeFwdTable = NULL; fSafeRevTable = NULL; - fRuleSource = NULL; + fRuleSource = NULL; fRuleStatusTable = NULL; - fUDataMem = NULL; - fRefCount = 0; + fTrie = NULL; + fUDataMem = NULL; + fRefCount = 0; fDontFreeData = TRUE; } @@ -108,8 +96,7 @@ void RBBIDataWrapper::init(const RBBIDataHeader *data, UErrorCode &status) { return; } fHeader = data; - if (fHeader->fMagic != 0xb1a0 || fHeader->fFormatVersion[0] != 3) - { + if (fHeader->fMagic != 0xb1a0 || !isDataVersionAcceptable(fHeader->fFormatVersion)) { status = U_INVALID_FORMAT_ERROR; return; } @@ -131,16 +118,23 @@ void RBBIDataWrapper::init(const RBBIDataHeader *data, UErrorCode &status) { fSafeRevTable = (RBBIStateTable *)((char *)data + fHeader->fSRTable); } + // Rule Compatibility Hacks + // If a rule set includes reverse rules but does not explicitly include safe reverse rules, + // the reverse rules are to be treated as safe reverse rules. + + if (fSafeRevTable == NULL && fReverseTable != NULL) { + fSafeRevTable = fReverseTable; + fReverseTable = NULL; + } - utrie_unserialize(&fTrie, - (uint8_t *)data + fHeader->fTrie, - fHeader->fTrieLen, - &status); + fTrie = utrie2_openFromSerialized(UTRIE2_16_VALUE_BITS, + (uint8_t *)data + fHeader->fTrie, + fHeader->fTrieLen, + NULL, // *actual length + &status); if (U_FAILURE(status)) { return; } - fTrie.getFoldingOffset=getFoldingOffset; - fRuleSource = (UChar *)((char *)data + fHeader->fRuleSource); fRuleString.setTo(TRUE, fRuleSource, -1); @@ -165,6 +159,8 @@ void RBBIDataWrapper::init(const RBBIDataHeader *data, UErrorCode &status) { //----------------------------------------------------------------------------- RBBIDataWrapper::~RBBIDataWrapper() { U_ASSERT(fRefCount == 0); + utrie2_close(fTrie); + fTrie = NULL; if (fUDataMem) { udata_close(fUDataMem); } else if (!fDontFreeData) { @@ -323,7 +319,7 @@ ubrk_swap(const UDataSwapper *ds, const void *inData, int32_t length, void *outD pInfo->dataFormat[1]==0x72 && pInfo->dataFormat[2]==0x6b && pInfo->dataFormat[3]==0x20 && - pInfo->formatVersion[0]==3 )) { + RBBIDataWrapper::isDataVersionAcceptable(pInfo->formatVersion) )) { udata_printError(ds, "ubrk_swap(): data format %02x.%02x.%02x.%02x (format version %02x) is not recognized\n", pInfo->dataFormat[0], pInfo->dataFormat[1], pInfo->dataFormat[2], pInfo->dataFormat[3], @@ -344,17 +340,11 @@ ubrk_swap(const UDataSwapper *ds, const void *inData, int32_t length, void *outD // // Get the RRBI Data Header, and check that it appears to be OK. // - // Note: ICU 3.2 and earlier, RBBIDataHeader::fDataFormat was actually - // an int32_t with a value of 1. Starting with ICU 3.4, - // RBBI's fDataFormat matches the dataFormat field from the - // UDataInfo header, four int8_t bytes. The value is {3,1,0,0} - // const uint8_t *inBytes =(const uint8_t *)inData+headerSize; RBBIDataHeader *rbbiDH = (RBBIDataHeader *)inBytes; if (ds->readUInt32(rbbiDH->fMagic) != 0xb1a0 || - rbbiDH->fFormatVersion[0] != 3 || - ds->readUInt32(rbbiDH->fLength) < sizeof(RBBIDataHeader)) - { + !RBBIDataWrapper::isDataVersionAcceptable(rbbiDH->fFormatVersion) || + ds->readUInt32(rbbiDH->fLength) < sizeof(RBBIDataHeader)) { udata_printError(ds, "ubrk_swap(): RBBI Data header is invalid.\n"); *status=U_UNSUPPORTED_ERROR; return 0; @@ -451,8 +441,8 @@ ubrk_swap(const UDataSwapper *ds, const void *inData, int32_t length, void *outD } // Trie table for character categories - utrie_swap(ds, inBytes+ds->readUInt32(rbbiDH->fTrie), ds->readUInt32(rbbiDH->fTrieLen), - outBytes+ds->readUInt32(rbbiDH->fTrie), status); + utrie2_swap(ds, inBytes+ds->readUInt32(rbbiDH->fTrie), ds->readUInt32(rbbiDH->fTrieLen), + outBytes+ds->readUInt32(rbbiDH->fTrie), status); // Source Rules Text. It's UChar data ds->swapArray16(ds, inBytes+ds->readUInt32(rbbiDH->fRuleSource), ds->readUInt32(rbbiDH->fRuleSourceLen), diff --git a/Build/source/libs/icu/icu-src/source/common/rbbidata.h b/Build/source/libs/icu/icu-src/source/common/rbbidata.h index 1d6f37d4b4f..bd25e06d201 100644 --- a/Build/source/libs/icu/icu-src/source/common/rbbidata.h +++ b/Build/source/libs/icu/icu-src/source/common/rbbidata.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* @@ -8,7 +8,7 @@ * ******************************************************************************* * file name: rbbidata.h -* encoding: US-ASCII +* encoding: UTF-8 * tab size: 8 (not used) * indentation:4 * @@ -51,22 +51,23 @@ ubrk_swap(const UDataSwapper *ds, #include "unicode/uobject.h" #include "unicode/unistr.h" +#include "unicode/uversion.h" #include "umutex.h" -#include "utrie.h" +#include "utrie2.h" U_NAMESPACE_BEGIN +// The current RBBI data format version. +static const uint8_t RBBI_DATA_FORMAT_VERSION[] = {4, 0, 0, 0}; + /* * The following structs map exactly onto the raw data from ICU common data file. */ struct RBBIDataHeader { uint32_t fMagic; /* == 0xbla0 */ - uint8_t fFormatVersion[4]; /* Data Format. Same as the value in struct UDataInfo */ + UVersionInfo fFormatVersion; /* Data Format. Same as the value in struct UDataInfo */ /* if there is one associated with this data. */ /* (version originates in rbbi, is copied to UDataInfo) */ - /* For ICU 3.2 and earlier, this field was */ - /* uint32_t fVersion */ - /* with a value of 1. */ uint32_t fLength; /* Total length in bytes of this RBBI Data, */ /* including all sections, not just the header. */ uint32_t fCatCount; /* Number of character categories. */ @@ -152,6 +153,8 @@ public: RBBIDataWrapper(UDataMemory* udm, UErrorCode &status); ~RBBIDataWrapper(); + static UBool isDataVersionAcceptable(const UVersionInfo version); + void init0(); void init(const RBBIDataHeader *data, UErrorCode &status); RBBIDataWrapper *addReference(); @@ -181,11 +184,11 @@ public: /* number of int32_t values in the rule status table. Used to sanity check indexing */ int32_t fStatusMaxIdx; - UTrie fTrie; + UTrie2 *fTrie; private: u_atomic_int32_t fRefCount; - UDataMemory *fUDataMem; + UDataMemory *fUDataMem; UnicodeString fRuleString; UBool fDontFreeData; diff --git a/Build/source/libs/icu/icu-src/source/common/rbbinode.cpp b/Build/source/libs/icu/icu-src/source/common/rbbinode.cpp index 123c21e44cf..69d84151fe8 100644 --- a/Build/source/libs/icu/icu-src/source/common/rbbinode.cpp +++ b/Build/source/libs/icu/icu-src/source/common/rbbinode.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* *************************************************************************** diff --git a/Build/source/libs/icu/icu-src/source/common/rbbinode.h b/Build/source/libs/icu/icu-src/source/common/rbbinode.h index 74096cc8141..f3525960225 100644 --- a/Build/source/libs/icu/icu-src/source/common/rbbinode.h +++ b/Build/source/libs/icu/icu-src/source/common/rbbinode.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /******************************************************************** * COPYRIGHT: diff --git a/Build/source/libs/icu/icu-src/source/common/rbbirb.cpp b/Build/source/libs/icu/icu-src/source/common/rbbirb.cpp index 3d9fe6fd340..72447d88f00 100644 --- a/Build/source/libs/icu/icu-src/source/common/rbbirb.cpp +++ b/Build/source/libs/icu/icu-src/source/common/rbbirb.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html // // file: rbbirb.cpp @@ -24,16 +24,16 @@ #include "unicode/uchriter.h" #include "unicode/parsepos.h" #include "unicode/parseerr.h" + #include "cmemory.h" #include "cstring.h" - #include "rbbirb.h" #include "rbbinode.h" - #include "rbbiscan.h" #include "rbbisetb.h" #include "rbbitblb.h" #include "rbbidata.h" +#include "uassert.h" U_NAMESPACE_BEGIN @@ -164,8 +164,13 @@ RBBIDataHeader *RBBIRuleBuilder::flattenData() { int32_t statusTableSize = align8(fRuleStatusVals->size() * sizeof(int32_t)); int32_t rulesSize = align8((strippedRules.length()+1) * sizeof(UChar)); - int32_t totalSize = headerSize + forwardTableSize + reverseTableSize - + safeFwdTableSize + safeRevTableSize + (void)safeFwdTableSize; + + int32_t totalSize = headerSize + + forwardTableSize + + /* reverseTableSize */ 0 + + /* safeFwdTableSize */ 0 + + (safeRevTableSize ? safeRevTableSize : reverseTableSize) + statusTableSize + trieSize + rulesSize; RBBIDataHeader *data = (RBBIDataHeader *)uprv_malloc(totalSize); @@ -177,23 +182,45 @@ RBBIDataHeader *RBBIRuleBuilder::flattenData() { data->fMagic = 0xb1a0; - data->fFormatVersion[0] = 3; - data->fFormatVersion[1] = 1; - data->fFormatVersion[2] = 0; - data->fFormatVersion[3] = 0; + data->fFormatVersion[0] = RBBI_DATA_FORMAT_VERSION[0]; + data->fFormatVersion[1] = RBBI_DATA_FORMAT_VERSION[1]; + data->fFormatVersion[2] = RBBI_DATA_FORMAT_VERSION[2]; + data->fFormatVersion[3] = RBBI_DATA_FORMAT_VERSION[3]; data->fLength = totalSize; data->fCatCount = fSetBuilder->getNumCharCategories(); + // Only save the forward table and the safe reverse table, + // because these are the only ones used at run-time. + // + // For the moment, we still build the other tables if they are present in the rule source files, + // for backwards compatibility. Old rule files need to work, and this is the simplest approach. + // + // Additional backwards compatibility consideration: if no safe rules are provided, consider the + // reverse rules to actually be the safe reverse rules. + data->fFTable = headerSize; data->fFTableLen = forwardTableSize; + + // Do not save Reverse Table. data->fRTable = data->fFTable + forwardTableSize; - data->fRTableLen = reverseTableSize; - data->fSFTable = data->fRTable + reverseTableSize; - data->fSFTableLen = safeFwdTableSize; - data->fSRTable = data->fSFTable + safeFwdTableSize; - data->fSRTableLen = safeRevTableSize; + data->fRTableLen = 0; + + // Do not save the Safe Forward table. + data->fSFTable = data->fRTable + 0; + data->fSFTableLen = 0; + + data->fSRTable = data->fSFTable + 0; + if (safeRevTableSize > 0) { + data->fSRTableLen = safeRevTableSize; + } else if (reverseTableSize > 0) { + data->fSRTableLen = reverseTableSize; + } else { + U_ASSERT(FALSE); // Rule build should have failed for lack of a reverse table + // before reaching this point. + } + - data->fTrie = data->fSRTable + safeRevTableSize; + data->fTrie = data->fSRTable + data->fSRTableLen; data->fTrieLen = fSetBuilder->getTrieSize(); data->fStatusTable = data->fTrie + trieSize; data->fStatusTableLen= statusTableSize; @@ -203,9 +230,14 @@ RBBIDataHeader *RBBIRuleBuilder::flattenData() { uprv_memset(data->fReserved, 0, sizeof(data->fReserved)); fForwardTables->exportTable((uint8_t *)data + data->fFTable); - fReverseTables->exportTable((uint8_t *)data + data->fRTable); - fSafeFwdTables->exportTable((uint8_t *)data + data->fSFTable); - fSafeRevTables->exportTable((uint8_t *)data + data->fSRTable); + // fReverseTables->exportTable((uint8_t *)data + data->fRTable); + // fSafeFwdTables->exportTable((uint8_t *)data + data->fSFTable); + if (safeRevTableSize > 0) { + fSafeRevTables->exportTable((uint8_t *)data + data->fSRTable); + } else { + fReverseTables->exportTable((uint8_t *)data + data->fSRTable); + } + fSetBuilder->serializeTrie ((uint8_t *)data + data->fTrie); int32_t *ruleStatusTable = (int32_t *)((uint8_t *)data + data->fStatusTable); diff --git a/Build/source/libs/icu/icu-src/source/common/rbbirb.h b/Build/source/libs/icu/icu-src/source/common/rbbirb.h index e4f736c8f39..f00f58e5dff 100644 --- a/Build/source/libs/icu/icu-src/source/common/rbbirb.h +++ b/Build/source/libs/icu/icu-src/source/common/rbbirb.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html // // rbbirb.h @@ -15,6 +15,9 @@ #define RBBIRB_H #include "unicode/utypes.h" + +#if !UCONFIG_NO_BREAK_ITERATION + #include "unicode/uobject.h" #include "unicode/rbbi.h" #include "unicode/uniset.h" @@ -207,6 +210,9 @@ struct RBBISetTableEl { #endif U_NAMESPACE_END + +#endif /* #if !UCONFIG_NO_BREAK_ITERATION */ + #endif diff --git a/Build/source/libs/icu/icu-src/source/common/rbbirpt.h b/Build/source/libs/icu/icu-src/source/common/rbbirpt.h index b5bc8f7bf31..586953c90c6 100644 --- a/Build/source/libs/icu/icu-src/source/common/rbbirpt.h +++ b/Build/source/libs/icu/icu-src/source/common/rbbirpt.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html //--------------------------------------------------------------------------------- // diff --git a/Build/source/libs/icu/icu-src/source/common/rbbiscan.cpp b/Build/source/libs/icu/icu-src/source/common/rbbiscan.cpp index df30f2c204a..db0d7614238 100644 --- a/Build/source/libs/icu/icu-src/source/common/rbbiscan.cpp +++ b/Build/source/libs/icu/icu-src/source/common/rbbiscan.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html // // file: rbbiscan.cpp @@ -47,6 +47,7 @@ // //------------------------------------------------------------------------------ static const UChar gRuleSet_rule_char_pattern[] = { + // Characters that may appear as literals in patterns without escaping or quoting. // [ ^ [ \ p { Z } \ u 0 0 2 0 0x5b, 0x5e, 0x5b, 0x5c, 0x70, 0x7b, 0x5a, 0x7d, 0x5c, 0x75, 0x30, 0x30, 0x32, 0x30, // - \ u 0 0 7 f ] - [ \ p @@ -558,6 +559,10 @@ UBool RBBIRuleScanner::doParseActions(int32_t action) fRB->fDefaultTree = &fRB->fSafeRevTree; } else if (opt == UNICODE_STRING("lookAheadHardBreak", 18)) { fRB->fLookAheadHardBreak = TRUE; + } else if (opt == UNICODE_STRING("quoted_literals_only", 20)) { + fRuleSets[kRuleSet_rule_char-128].clear(); + } else if (opt == UNICODE_STRING("unquoted_literals", 17)) { + fRuleSets[kRuleSet_rule_char-128].applyPattern(UnicodeString(gRuleSet_rule_char_pattern), *fRB->fStatus); } else { error(U_BRK_UNRECOGNIZED_OPTION); } @@ -1179,13 +1184,12 @@ RBBINode *RBBIRuleScanner::pushNewNode(RBBINode::NodeType t) { if (U_FAILURE(*fRB->fStatus)) { return NULL; } - fNodeStackPtr++; - if (fNodeStackPtr >= kStackSize) { - error(U_BRK_INTERNAL_ERROR); + if (fNodeStackPtr >= kStackSize - 1) { + error(U_BRK_RULE_SYNTAX); RBBIDebugPuts("RBBIRuleScanner::pushNewNode - stack overflow."); - *fRB->fStatus = U_BRK_INTERNAL_ERROR; return NULL; } + fNodeStackPtr++; fNodeStack[fNodeStackPtr] = new RBBINode(t); if (fNodeStack[fNodeStackPtr] == NULL) { *fRB->fStatus = U_MEMORY_ALLOCATION_ERROR; diff --git a/Build/source/libs/icu/icu-src/source/common/rbbiscan.h b/Build/source/libs/icu/icu-src/source/common/rbbiscan.h index 6f3267e21ac..8bec8234e58 100644 --- a/Build/source/libs/icu/icu-src/source/common/rbbiscan.h +++ b/Build/source/libs/icu/icu-src/source/common/rbbiscan.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html // // rbbiscan.h diff --git a/Build/source/libs/icu/icu-src/source/common/rbbisetb.cpp b/Build/source/libs/icu/icu-src/source/common/rbbisetb.cpp index ebdf8b7fb90..e97eba8d14d 100644 --- a/Build/source/libs/icu/icu-src/source/common/rbbisetb.cpp +++ b/Build/source/libs/icu/icu-src/source/common/rbbisetb.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html // // rbbisetb.cpp @@ -35,7 +35,7 @@ #if !UCONFIG_NO_BREAK_ITERATION #include "unicode/uniset.h" -#include "utrie.h" +#include "utrie2.h" #include "uvector.h" #include "uassert.h" #include "cmemory.h" @@ -44,43 +44,6 @@ #include "rbbisetb.h" #include "rbbinode.h" - -//------------------------------------------------------------------------ -// -// getFoldedRBBIValue Call-back function used during building of Trie table. -// Folding value: just store the offset (16 bits) -// if there is any non-0 entry. -// (It'd really be nice if the Trie builder would provide a -// simple default, so this function could go away from here.) -// -//------------------------------------------------------------------------ -/* folding value: just store the offset (16 bits) if there is any non-0 entry */ -U_CDECL_BEGIN -static uint32_t U_CALLCONV -getFoldedRBBIValue(UNewTrie *trie, UChar32 start, int32_t offset) { - uint32_t value; - UChar32 limit; - UBool inBlockZero; - - limit=start+0x400; - while(startfNext) { - utrie_setRange32(fTrie, rlRange->fStartChar, rlRange->fEndChar+1, rlRange->fNum, TRUE); + fTrie = utrie2_open(0, // Initial value for all code points. + 0, // Error value for out-of-range input. + fStatus); + + for (rlRange = fRangeList; rlRange!=0 && U_SUCCESS(*fStatus); rlRange=rlRange->fNext) { + utrie2_setRange32(fTrie, + rlRange->fStartChar, // Range start + rlRange->fEndChar, // Range end (inclusive) + rlRange->fNum, // value for range + TRUE, // Overwrite previously written values + fStatus); } } - //----------------------------------------------------------------------------------- // // getTrieSize() Return the size that will be required to serialize the Trie. // //----------------------------------------------------------------------------------- -int32_t RBBISetBuilder::getTrieSize() /*const*/ { - fTrieSize = utrie_serialize(fTrie, - NULL, // Buffer - 0, // Capacity - getFoldedRBBIValue, - TRUE, // Reduce to 16 bits - fStatus); +int32_t RBBISetBuilder::getTrieSize() { + if (U_FAILURE(*fStatus)) { + return 0; + } + utrie2_freeze(fTrie, UTRIE2_16_VALUE_BITS, fStatus); + fTrieSize = utrie2_serialize(fTrie, + NULL, // Buffer + 0, // Capacity + fStatus); + if (*fStatus == U_BUFFER_OVERFLOW_ERROR) { + *fStatus = U_ZERO_ERROR; + } // RBBIDebugPrintf("Trie table size is %d\n", trieSize); return fTrieSize; } @@ -327,12 +295,10 @@ int32_t RBBISetBuilder::getTrieSize() /*const*/ { // //----------------------------------------------------------------------------------- void RBBISetBuilder::serializeTrie(uint8_t *where) { - utrie_serialize(fTrie, - where, // Buffer - fTrieSize, // Capacity - getFoldedRBBIValue, - TRUE, // Reduce to 16 bits - fStatus); + utrie2_serialize(fTrie, + where, // Buffer + fTrieSize, // Capacity + fStatus); } //------------------------------------------------------------------------ diff --git a/Build/source/libs/icu/icu-src/source/common/rbbisetb.h b/Build/source/libs/icu/icu-src/source/common/rbbisetb.h index 89bfb9865cd..7cedb45b335 100644 --- a/Build/source/libs/icu/icu-src/source/common/rbbisetb.h +++ b/Build/source/libs/icu/icu-src/source/common/rbbisetb.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html // // rbbisetb.h @@ -13,12 +13,14 @@ #define RBBISETB_H #include "unicode/utypes.h" + +#if !UCONFIG_NO_BREAK_ITERATION + #include "unicode/uobject.h" #include "rbbirb.h" +#include "utrie2.h" #include "uvector.h" -struct UNewTrie; - U_NAMESPACE_BEGIN // @@ -109,8 +111,8 @@ private: RangeDescriptor *fRangeList; // Head of the linked list of RangeDescriptors - UNewTrie *fTrie; // The mapping TRIE that is the end result of processing - uint32_t fTrieSize; // the Unicode Sets. + UTrie2 *fTrie; // The mapping TRIE that is the end result of processing + uint32_t fTrieSize; // the Unicode Sets. // Groups correspond to character categories - // groups of ranges that are in the same original UnicodeSets. @@ -129,4 +131,7 @@ private: U_NAMESPACE_END + +#endif /* #if !UCONFIG_NO_BREAK_ITERATION */ + #endif diff --git a/Build/source/libs/icu/icu-src/source/common/rbbistbl.cpp b/Build/source/libs/icu/icu-src/source/common/rbbistbl.cpp index d937edbd7c3..5303f760969 100644 --- a/Build/source/libs/icu/icu-src/source/common/rbbistbl.cpp +++ b/Build/source/libs/icu/icu-src/source/common/rbbistbl.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html // // file: rbbistbl.cpp Implementation of the ICU RBBISymbolTable class diff --git a/Build/source/libs/icu/icu-src/source/common/rbbitblb.cpp b/Build/source/libs/icu/icu-src/source/common/rbbitblb.cpp index 2738c750088..0f1a901ffc5 100644 --- a/Build/source/libs/icu/icu-src/source/common/rbbitblb.cpp +++ b/Build/source/libs/icu/icu-src/source/common/rbbitblb.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** diff --git a/Build/source/libs/icu/icu-src/source/common/rbbitblb.h b/Build/source/libs/icu/icu-src/source/common/rbbitblb.h index d71a0245874..10415018785 100644 --- a/Build/source/libs/icu/icu-src/source/common/rbbitblb.h +++ b/Build/source/libs/icu/icu-src/source/common/rbbitblb.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html // // rbbitblb.h diff --git a/Build/source/libs/icu/icu-src/source/common/resbund.cpp b/Build/source/libs/icu/icu-src/source/common/resbund.cpp index 7bd6b32b081..512bd531f23 100644 --- a/Build/source/libs/icu/icu-src/source/common/resbund.cpp +++ b/Build/source/libs/icu/icu-src/source/common/resbund.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** diff --git a/Build/source/libs/icu/icu-src/source/common/resbund_cnv.cpp b/Build/source/libs/icu/icu-src/source/common/resbund_cnv.cpp index 65c32b52071..45c0b399bff 100644 --- a/Build/source/libs/icu/icu-src/source/common/resbund_cnv.cpp +++ b/Build/source/libs/icu/icu-src/source/common/resbund_cnv.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* @@ -8,7 +8,7 @@ * ******************************************************************************* * file name: resbund_cnv.cpp -* encoding: US-ASCII +* encoding: UTF-8 * tab size: 8 (not used) * indentation:4 * diff --git a/Build/source/libs/icu/icu-src/source/common/resource.cpp b/Build/source/libs/icu/icu-src/source/common/resource.cpp index 62b3aa46a5c..3d41a16029f 100644 --- a/Build/source/libs/icu/icu-src/source/common/resource.cpp +++ b/Build/source/libs/icu/icu-src/source/common/resource.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* diff --git a/Build/source/libs/icu/icu-src/source/common/resource.h b/Build/source/libs/icu/icu-src/source/common/resource.h index 43c3309b5e9..3dbff785ef1 100644 --- a/Build/source/libs/icu/icu-src/source/common/resource.h +++ b/Build/source/libs/icu/icu-src/source/common/resource.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* diff --git a/Build/source/libs/icu/icu-src/source/common/ruleiter.cpp b/Build/source/libs/icu/icu-src/source/common/ruleiter.cpp index 6e27b4dd8c6..41eea23c0dc 100644 --- a/Build/source/libs/icu/icu-src/source/common/ruleiter.cpp +++ b/Build/source/libs/icu/icu-src/source/common/ruleiter.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** diff --git a/Build/source/libs/icu/icu-src/source/common/ruleiter.h b/Build/source/libs/icu/icu-src/source/common/ruleiter.h index 1221396fe48..4e1be53823d 100644 --- a/Build/source/libs/icu/icu-src/source/common/ruleiter.h +++ b/Build/source/libs/icu/icu-src/source/common/ruleiter.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** diff --git a/Build/source/libs/icu/icu-src/source/common/schriter.cpp b/Build/source/libs/icu/icu-src/source/common/schriter.cpp index cc413666f1a..f852800aaae 100644 --- a/Build/source/libs/icu/icu-src/source/common/schriter.cpp +++ b/Build/source/libs/icu/icu-src/source/common/schriter.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ****************************************************************************** diff --git a/Build/source/libs/icu/icu-src/source/common/serv.cpp b/Build/source/libs/icu/icu-src/source/common/serv.cpp index c650ef3a4e0..de29c64140c 100644 --- a/Build/source/libs/icu/icu-src/source/common/serv.cpp +++ b/Build/source/libs/icu/icu-src/source/common/serv.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /** ******************************************************************************* diff --git a/Build/source/libs/icu/icu-src/source/common/serv.h b/Build/source/libs/icu/icu-src/source/common/serv.h index 679c4435a1e..e1f69cd4119 100644 --- a/Build/source/libs/icu/icu-src/source/common/serv.h +++ b/Build/source/libs/icu/icu-src/source/common/serv.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /** ******************************************************************************* diff --git a/Build/source/libs/icu/icu-src/source/common/servlk.cpp b/Build/source/libs/icu/icu-src/source/common/servlk.cpp index 319d7b87fac..538982ca362 100644 --- a/Build/source/libs/icu/icu-src/source/common/servlk.cpp +++ b/Build/source/libs/icu/icu-src/source/common/servlk.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /** ******************************************************************************* diff --git a/Build/source/libs/icu/icu-src/source/common/servlkf.cpp b/Build/source/libs/icu/icu-src/source/common/servlkf.cpp index 114d64389bf..84f2347cdde 100644 --- a/Build/source/libs/icu/icu-src/source/common/servlkf.cpp +++ b/Build/source/libs/icu/icu-src/source/common/servlkf.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /** ******************************************************************************* diff --git a/Build/source/libs/icu/icu-src/source/common/servloc.h b/Build/source/libs/icu/icu-src/source/common/servloc.h index 7faec510790..ccf6433379d 100644 --- a/Build/source/libs/icu/icu-src/source/common/servloc.h +++ b/Build/source/libs/icu/icu-src/source/common/servloc.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /** ******************************************************************************* diff --git a/Build/source/libs/icu/icu-src/source/common/servls.cpp b/Build/source/libs/icu/icu-src/source/common/servls.cpp index 71c6c44a8f0..f4579d0eecd 100644 --- a/Build/source/libs/icu/icu-src/source/common/servls.cpp +++ b/Build/source/libs/icu/icu-src/source/common/servls.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /** ******************************************************************************* diff --git a/Build/source/libs/icu/icu-src/source/common/servnotf.cpp b/Build/source/libs/icu/icu-src/source/common/servnotf.cpp index 69a81da2525..dc77c7b857d 100644 --- a/Build/source/libs/icu/icu-src/source/common/servnotf.cpp +++ b/Build/source/libs/icu/icu-src/source/common/servnotf.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /** ******************************************************************************* diff --git a/Build/source/libs/icu/icu-src/source/common/servnotf.h b/Build/source/libs/icu/icu-src/source/common/servnotf.h index 05606ff6b32..dba7a0fea3b 100644 --- a/Build/source/libs/icu/icu-src/source/common/servnotf.h +++ b/Build/source/libs/icu/icu-src/source/common/servnotf.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /** ******************************************************************************* diff --git a/Build/source/libs/icu/icu-src/source/common/servrbf.cpp b/Build/source/libs/icu/icu-src/source/common/servrbf.cpp index 299695e2af8..94279ab3a15 100644 --- a/Build/source/libs/icu/icu-src/source/common/servrbf.cpp +++ b/Build/source/libs/icu/icu-src/source/common/servrbf.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /** ******************************************************************************* diff --git a/Build/source/libs/icu/icu-src/source/common/servslkf.cpp b/Build/source/libs/icu/icu-src/source/common/servslkf.cpp index 4cf66b9d20d..09154d1b919 100644 --- a/Build/source/libs/icu/icu-src/source/common/servslkf.cpp +++ b/Build/source/libs/icu/icu-src/source/common/servslkf.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /** ******************************************************************************* diff --git a/Build/source/libs/icu/icu-src/source/common/sharedobject.cpp b/Build/source/libs/icu/icu-src/source/common/sharedobject.cpp index 8e5095e1292..37aa458e00f 100644 --- a/Build/source/libs/icu/icu-src/source/common/sharedobject.cpp +++ b/Build/source/libs/icu/icu-src/source/common/sharedobject.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ****************************************************************************** diff --git a/Build/source/libs/icu/icu-src/source/common/sharedobject.h b/Build/source/libs/icu/icu-src/source/common/sharedobject.h index 0e53cfb7abc..d13265182d4 100644 --- a/Build/source/libs/icu/icu-src/source/common/sharedobject.h +++ b/Build/source/libs/icu/icu-src/source/common/sharedobject.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ****************************************************************************** diff --git a/Build/source/libs/icu/icu-src/source/common/simpleformatter.cpp b/Build/source/libs/icu/icu-src/source/common/simpleformatter.cpp index eaeb60de143..f866e0a1a12 100644 --- a/Build/source/libs/icu/icu-src/source/common/simpleformatter.cpp +++ b/Build/source/libs/icu/icu-src/source/common/simpleformatter.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ****************************************************************************** diff --git a/Build/source/libs/icu/icu-src/source/common/sprpimpl.h b/Build/source/libs/icu/icu-src/source/common/sprpimpl.h index 6e0bad0ae6c..12f18a5e917 100644 --- a/Build/source/libs/icu/icu-src/source/common/sprpimpl.h +++ b/Build/source/libs/icu/icu-src/source/common/sprpimpl.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* @@ -8,7 +8,7 @@ * ******************************************************************************* * file name: sprpimpl.h - * encoding: US-ASCII + * encoding: UTF-8 * tab size: 8 (not used) * indentation:4 * diff --git a/Build/source/libs/icu/icu-src/source/common/stringpiece.cpp b/Build/source/libs/icu/icu-src/source/common/stringpiece.cpp index b032b474f65..d4f7f310baf 100644 --- a/Build/source/libs/icu/icu-src/source/common/stringpiece.cpp +++ b/Build/source/libs/icu/icu-src/source/common/stringpiece.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html // Copyright (C) 2009-2013, International Business Machines // Corporation and others. All Rights Reserved. diff --git a/Build/source/libs/icu/icu-src/source/common/stringtriebuilder.cpp b/Build/source/libs/icu/icu-src/source/common/stringtriebuilder.cpp index 075d7c4324b..cf5b7b73ae2 100644 --- a/Build/source/libs/icu/icu-src/source/common/stringtriebuilder.cpp +++ b/Build/source/libs/icu/icu-src/source/common/stringtriebuilder.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* @@ -6,7 +6,7 @@ * Corporation and others. All Rights Reserved. ******************************************************************************* * file name: stringtriebuilder.cpp -* encoding: US-ASCII +* encoding: UTF-8 * tab size: 8 (not used) * indentation:4 * diff --git a/Build/source/libs/icu/icu-src/source/common/uarrsort.c b/Build/source/libs/icu/icu-src/source/common/uarrsort.c deleted file mode 100644 index bb1b5bdd785..00000000000 --- a/Build/source/libs/icu/icu-src/source/common/uarrsort.c +++ /dev/null @@ -1,285 +0,0 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. -// License & terms of use: http://www.unicode.org/copyright.html -/* -******************************************************************************* -* -* Copyright (C) 2003-2013, International Business Machines -* Corporation and others. All Rights Reserved. -* -******************************************************************************* -* file name: uarrsort.c -* encoding: US-ASCII -* tab size: 8 (not used) -* indentation:4 -* -* created on: 2003aug04 -* created by: Markus W. Scherer -* -* Internal function for sorting arrays. -*/ - -#include "unicode/utypes.h" -#include "cmemory.h" -#include "uarrsort.h" - -enum { - /** - * "from Knuth" - * - * A binary search over 8 items performs 4 comparisons: - * log2(8)=3 to subdivide, +1 to check for equality. - * A linear search over 8 items on average also performs 4 comparisons. - */ - MIN_QSORT=9, - STACK_ITEM_SIZE=200 -}; - -/* UComparator convenience implementations ---------------------------------- */ - -U_CAPI int32_t U_EXPORT2 -uprv_uint16Comparator(const void *context, const void *left, const void *right) { - return (int32_t)*(const uint16_t *)left - (int32_t)*(const uint16_t *)right; -} - -U_CAPI int32_t U_EXPORT2 -uprv_int32Comparator(const void *context, const void *left, const void *right) { - return *(const int32_t *)left - *(const int32_t *)right; -} - -U_CAPI int32_t U_EXPORT2 -uprv_uint32Comparator(const void *context, const void *left, const void *right) { - uint32_t l=*(const uint32_t *)left, r=*(const uint32_t *)right; - - /* compare directly because (l-r) would overflow the int32_t result */ - if(lr */ { - return 1; - } -} - -/* Insertion sort using binary search --------------------------------------- */ - -U_CAPI int32_t U_EXPORT2 -uprv_stableBinarySearch(char *array, int32_t limit, void *item, int32_t itemSize, - UComparator *cmp, const void *context) { - int32_t start=0; - UBool found=FALSE; - - /* Binary search until we get down to a tiny sub-array. */ - while((limit-start)>=MIN_QSORT) { - int32_t i=(start+limit)/2; - int32_t diff=cmp(context, item, array+i*itemSize); - if(diff==0) { - /* - * Found the item. We look for the *last* occurrence of such - * an item, for stable sorting. - * If we knew that there will be only few equal items, - * we could break now and enter the linear search. - * However, if there are many equal items, then it should be - * faster to continue with the binary search. - * It seems likely that we either have all unique items - * (where found will never become TRUE in the insertion sort) - * or potentially many duplicates. - */ - found=TRUE; - start=i+1; - } else if(diff<0) { - limit=i; - } else { - start=i; - } - } - - /* Linear search over the remaining tiny sub-array. */ - while(start=limit) { - doInsertionSort(array+start*itemSize, limit-start, itemSize, cmp, context, px); - break; - } - - left=start; - right=limit; - - /* x=array[middle] */ - uprv_memcpy(px, array+(size_t)((start+limit)/2)*itemSize, itemSize); - - do { - while(/* array[left]0 && array==NULL) || length<0 || itemSize<=0 || cmp==NULL) { - *pErrorCode=U_ILLEGAL_ARGUMENT_ERROR; - return; - } - - if(length<=1) { - return; - } else if(lengthr */ { + return 1; + } +} + +/* Insertion sort using binary search --------------------------------------- */ + +U_CAPI int32_t U_EXPORT2 +uprv_stableBinarySearch(char *array, int32_t limit, void *item, int32_t itemSize, + UComparator *cmp, const void *context) { + int32_t start=0; + UBool found=FALSE; + + /* Binary search until we get down to a tiny sub-array. */ + while((limit-start)>=MIN_QSORT) { + int32_t i=(start+limit)/2; + int32_t diff=cmp(context, item, array+i*itemSize); + if(diff==0) { + /* + * Found the item. We look for the *last* occurrence of such + * an item, for stable sorting. + * If we knew that there will be only few equal items, + * we could break now and enter the linear search. + * However, if there are many equal items, then it should be + * faster to continue with the binary search. + * It seems likely that we either have all unique items + * (where found will never become TRUE in the insertion sort) + * or potentially many duplicates. + */ + found=TRUE; + start=i+1; + } else if(diff<0) { + limit=i; + } else { + start=i; + } + } + + /* Linear search over the remaining tiny sub-array. */ + while(start=limit) { + doInsertionSort(array+start*itemSize, limit-start, itemSize, cmp, context, px); + break; + } + + left=start; + right=limit; + + /* x=array[middle] */ + uprv_memcpy(px, array+(size_t)((start+limit)/2)*itemSize, itemSize); + + do { + while(/* array[left]0 && array==NULL) || length<0 || itemSize<=0 || cmp==NULL) { + *pErrorCode=U_ILLEGAL_ARGUMENT_ERROR; + return; + } + + if(length<=1) { + return; + } else if(lengthbdp=ubidi_getSingleton(); - - /* allocate memory for arrays as requested */ - if(maxLength>0) { - if( !getInitialDirPropsMemory(pBiDi, maxLength) || - !getInitialLevelsMemory(pBiDi, maxLength) - ) { - *pErrorCode=U_MEMORY_ALLOCATION_ERROR; - } - } else { - pBiDi->mayAllocateText=TRUE; - } - - if(maxRunCount>0) { - if(maxRunCount==1) { - /* use simpleRuns[] */ - pBiDi->runsSize=sizeof(Run); - } else if(!getInitialRunsMemory(pBiDi, maxRunCount)) { - *pErrorCode=U_MEMORY_ALLOCATION_ERROR; - } - } else { - pBiDi->mayAllocateRuns=TRUE; - } - - if(U_SUCCESS(*pErrorCode)) { - return pBiDi; - } else { - ubidi_close(pBiDi); - return NULL; - } -} - -/* - * We are allowed to allocate memory if memory==NULL or - * mayAllocate==TRUE for each array that we need. - * We also try to grow memory as needed if we - * allocate it. - * - * Assume sizeNeeded>0. - * If *pMemory!=NULL, then assume *pSize>0. - * - * ### this realloc() may unnecessarily copy the old data, - * which we know we don't need any more; - * is this the best way to do this?? - */ -U_CFUNC UBool -ubidi_getMemory(BidiMemoryForAllocation *bidiMem, int32_t *pSize, UBool mayAllocate, int32_t sizeNeeded) { - void **pMemory = (void **)bidiMem; - /* check for existing memory */ - if(*pMemory==NULL) { - /* we need to allocate memory */ - if(mayAllocate && (*pMemory=uprv_malloc(sizeNeeded))!=NULL) { - *pSize=sizeNeeded; - return TRUE; - } else { - return FALSE; - } - } else { - if(sizeNeeded<=*pSize) { - /* there is already enough memory */ - return TRUE; - } - else if(!mayAllocate) { - /* not enough memory, and we must not allocate */ - return FALSE; - } else { - /* we try to grow */ - void *memory; - /* in most cases, we do not need the copy-old-data part of - * realloc, but it is needed when adding runs using getRunsMemory() - * in setParaRunsOnly() - */ - if((memory=uprv_realloc(*pMemory, sizeNeeded))!=NULL) { - *pMemory=memory; - *pSize=sizeNeeded; - return TRUE; - } else { - /* we failed to grow */ - return FALSE; - } - } - } -} - -U_CAPI void U_EXPORT2 -ubidi_close(UBiDi *pBiDi) { - if(pBiDi!=NULL) { - pBiDi->pParaBiDi=NULL; /* in case one tries to reuse this block */ - if(pBiDi->dirPropsMemory!=NULL) { - uprv_free(pBiDi->dirPropsMemory); - } - if(pBiDi->levelsMemory!=NULL) { - uprv_free(pBiDi->levelsMemory); - } - if(pBiDi->openingsMemory!=NULL) { - uprv_free(pBiDi->openingsMemory); - } - if(pBiDi->parasMemory!=NULL) { - uprv_free(pBiDi->parasMemory); - } - if(pBiDi->runsMemory!=NULL) { - uprv_free(pBiDi->runsMemory); - } - if(pBiDi->isolatesMemory!=NULL) { - uprv_free(pBiDi->isolatesMemory); - } - if(pBiDi->insertPoints.points!=NULL) { - uprv_free(pBiDi->insertPoints.points); - } - - uprv_free(pBiDi); - } -} - -/* set to approximate "inverse BiDi" ---------------------------------------- */ - -U_CAPI void U_EXPORT2 -ubidi_setInverse(UBiDi *pBiDi, UBool isInverse) { - if(pBiDi!=NULL) { - pBiDi->isInverse=isInverse; - pBiDi->reorderingMode = isInverse ? UBIDI_REORDER_INVERSE_NUMBERS_AS_L - : UBIDI_REORDER_DEFAULT; - } -} - -U_CAPI UBool U_EXPORT2 -ubidi_isInverse(UBiDi *pBiDi) { - if(pBiDi!=NULL) { - return pBiDi->isInverse; - } else { - return FALSE; - } -} - -/* FOOD FOR THOUGHT: currently the reordering modes are a mixture of - * algorithm for direct BiDi, algorithm for inverse BiDi and the bizarre - * concept of RUNS_ONLY which is a double operation. - * It could be advantageous to divide this into 3 concepts: - * a) Operation: direct / inverse / RUNS_ONLY - * b) Direct algorithm: default / NUMBERS_SPECIAL / GROUP_NUMBERS_WITH_R - * c) Inverse algorithm: default / INVERSE_LIKE_DIRECT / NUMBERS_SPECIAL - * This would allow combinations not possible today like RUNS_ONLY with - * NUMBERS_SPECIAL. - * Also allow to set INSERT_MARKS for the direct step of RUNS_ONLY and - * REMOVE_CONTROLS for the inverse step. - * Not all combinations would be supported, and probably not all do make sense. - * This would need to document which ones are supported and what are the - * fallbacks for unsupported combinations. - */ -U_CAPI void U_EXPORT2 -ubidi_setReorderingMode(UBiDi *pBiDi, UBiDiReorderingMode reorderingMode) { - if ((pBiDi!=NULL) && (reorderingMode >= UBIDI_REORDER_DEFAULT) - && (reorderingMode < UBIDI_REORDER_COUNT)) { - pBiDi->reorderingMode = reorderingMode; - pBiDi->isInverse = (UBool)(reorderingMode == UBIDI_REORDER_INVERSE_NUMBERS_AS_L); - } -} - -U_CAPI UBiDiReorderingMode U_EXPORT2 -ubidi_getReorderingMode(UBiDi *pBiDi) { - if (pBiDi!=NULL) { - return pBiDi->reorderingMode; - } else { - return UBIDI_REORDER_DEFAULT; - } -} - -U_CAPI void U_EXPORT2 -ubidi_setReorderingOptions(UBiDi *pBiDi, uint32_t reorderingOptions) { - if (reorderingOptions & UBIDI_OPTION_REMOVE_CONTROLS) { - reorderingOptions&=~UBIDI_OPTION_INSERT_MARKS; - } - if (pBiDi!=NULL) { - pBiDi->reorderingOptions=reorderingOptions; - } -} - -U_CAPI uint32_t U_EXPORT2 -ubidi_getReorderingOptions(UBiDi *pBiDi) { - if (pBiDi!=NULL) { - return pBiDi->reorderingOptions; - } else { - return 0; - } -} - -U_CAPI UBiDiDirection U_EXPORT2 -ubidi_getBaseDirection(const UChar *text, -int32_t length){ - - int32_t i; - UChar32 uchar; - UCharDirection dir; - - if( text==NULL || length<-1 ){ - return UBIDI_NEUTRAL; - } - - if(length==-1) { - length=u_strlen(text); - } - - for( i = 0 ; i < length; ) { - /* i is incremented by U16_NEXT */ - U16_NEXT(text, i, length, uchar); - dir = u_charDirection(uchar); - if( dir == U_LEFT_TO_RIGHT ) - return UBIDI_LTR; - if( dir == U_RIGHT_TO_LEFT || dir ==U_RIGHT_TO_LEFT_ARABIC ) - return UBIDI_RTL; - } - return UBIDI_NEUTRAL; -} - -/* perform (P2)..(P3) ------------------------------------------------------- */ - -/** - * Returns the directionality of the first strong character - * after the last B in prologue, if any. - * Requires prologue!=null. - */ -static DirProp -firstL_R_AL(UBiDi *pBiDi) { - const UChar *text=pBiDi->prologue; - int32_t length=pBiDi->proLength; - int32_t i; - UChar32 uchar; - DirProp dirProp, result=ON; - for(i=0; iparas - */ -static UBool -checkParaCount(UBiDi *pBiDi) { - int32_t count=pBiDi->paraCount; - if(pBiDi->paras==pBiDi->simpleParas) { - if(count<=SIMPLE_PARAS_COUNT) - return TRUE; - if(!getInitialParasMemory(pBiDi, SIMPLE_PARAS_COUNT * 2)) - return FALSE; - pBiDi->paras=pBiDi->parasMemory; - uprv_memcpy(pBiDi->parasMemory, pBiDi->simpleParas, SIMPLE_PARAS_COUNT * sizeof(Para)); - return TRUE; - } - if(!getInitialParasMemory(pBiDi, count * 2)) - return FALSE; - pBiDi->paras=pBiDi->parasMemory; - return TRUE; -} - -/* - * Get the directional properties for the text, calculate the flags bit-set, and - * determine the paragraph level if necessary (in pBiDi->paras[i].level). - * FSI initiators are also resolved and their dirProp replaced with LRI or RLI. - * When encountering an FSI, it is initially replaced with an LRI, which is the - * default. Only if a strong R or AL is found within its scope will the LRI be - * replaced by an RLI. - */ -static UBool -getDirProps(UBiDi *pBiDi) { - const UChar *text=pBiDi->text; - DirProp *dirProps=pBiDi->dirPropsMemory; /* pBiDi->dirProps is const */ - - int32_t i=0, originalLength=pBiDi->originalLength; - Flags flags=0; /* collect all directionalities in the text */ - UChar32 uchar; - DirProp dirProp=0, defaultParaLevel=0; /* initialize to avoid compiler warnings */ - UBool isDefaultLevel=IS_DEFAULT_LEVEL(pBiDi->paraLevel); - /* for inverse BiDi, the default para level is set to RTL if there is a - strong R or AL character at either end of the text */ - UBool isDefaultLevelInverse=isDefaultLevel && (UBool) - (pBiDi->reorderingMode==UBIDI_REORDER_INVERSE_LIKE_DIRECT || - pBiDi->reorderingMode==UBIDI_REORDER_INVERSE_FOR_NUMBERS_SPECIAL); - int32_t lastArabicPos=-1; - int32_t controlCount=0; - UBool removeBiDiControls = (UBool)(pBiDi->reorderingOptions & - UBIDI_OPTION_REMOVE_CONTROLS); - - typedef enum { - NOT_SEEKING_STRONG, /* 0: not contextual paraLevel, not after FSI */ - SEEKING_STRONG_FOR_PARA, /* 1: looking for first strong char in para */ - SEEKING_STRONG_FOR_FSI, /* 2: looking for first strong after FSI */ - LOOKING_FOR_PDI /* 3: found strong after FSI, looking for PDI */ - } State; - State state; - DirProp lastStrong=ON; /* for default level & inverse BiDi */ - /* The following stacks are used to manage isolate sequences. Those - sequences may be nested, but obviously never more deeply than the - maximum explicit embedding level. - lastStack is the index of the last used entry in the stack. A value of -1 - means that there is no open isolate sequence. - lastStack is reset to -1 on paragraph boundaries. */ - /* The following stack contains the position of the initiator of - each open isolate sequence */ - int32_t isolateStartStack[UBIDI_MAX_EXPLICIT_LEVEL+1]; - /* The following stack contains the last known state before - encountering the initiator of an isolate sequence */ - int8_t previousStateStack[UBIDI_MAX_EXPLICIT_LEVEL+1]; - int32_t stackLast=-1; - - if(pBiDi->reorderingOptions & UBIDI_OPTION_STREAMING) - pBiDi->length=0; - defaultParaLevel=pBiDi->paraLevel&1; - if(isDefaultLevel) { - pBiDi->paras[0].level=defaultParaLevel; - lastStrong=defaultParaLevel; - if(pBiDi->proLength>0 && /* there is a prologue */ - (dirProp=firstL_R_AL(pBiDi))!=ON) { /* with a strong character */ - if(dirProp==L) - pBiDi->paras[0].level=0; /* set the default para level */ - else - pBiDi->paras[0].level=1; /* set the default para level */ - state=NOT_SEEKING_STRONG; - } else { - state=SEEKING_STRONG_FOR_PARA; - } - } else { - pBiDi->paras[0].level=pBiDi->paraLevel; - state=NOT_SEEKING_STRONG; - } - /* count paragraphs and determine the paragraph level (P2..P3) */ - /* - * see comment in ubidi.h: - * the UBIDI_DEFAULT_XXX values are designed so that - * their bit 0 alone yields the intended default - */ - for( /* i=0 above */ ; i0xffff) { /* set the lead surrogate's property to BN */ - flags|=DIRPROP_FLAG(BN); - dirProps[i-2]=BN; - } - if(removeBiDiControls && IS_BIDI_CONTROL_CHAR(uchar)) - controlCount++; - if(dirProp==L) { - if(state==SEEKING_STRONG_FOR_PARA) { - pBiDi->paras[pBiDi->paraCount-1].level=0; - state=NOT_SEEKING_STRONG; - } - else if(state==SEEKING_STRONG_FOR_FSI) { - if(stackLast<=UBIDI_MAX_EXPLICIT_LEVEL) { - /* no need for next statement, already set by default */ - /* dirProps[isolateStartStack[stackLast]]=LRI; */ - flags|=DIRPROP_FLAG(LRI); - } - state=LOOKING_FOR_PDI; - } - lastStrong=L; - continue; - } - if(dirProp==R || dirProp==AL) { - if(state==SEEKING_STRONG_FOR_PARA) { - pBiDi->paras[pBiDi->paraCount-1].level=1; - state=NOT_SEEKING_STRONG; - } - else if(state==SEEKING_STRONG_FOR_FSI) { - if(stackLast<=UBIDI_MAX_EXPLICIT_LEVEL) { - dirProps[isolateStartStack[stackLast]]=RLI; - flags|=DIRPROP_FLAG(RLI); - } - state=LOOKING_FOR_PDI; - } - lastStrong=R; - if(dirProp==AL) - lastArabicPos=i-1; - continue; - } - if(dirProp>=FSI && dirProp<=RLI) { /* FSI, LRI or RLI */ - stackLast++; - if(stackLast<=UBIDI_MAX_EXPLICIT_LEVEL) { - isolateStartStack[stackLast]=i-1; - previousStateStack[stackLast]=state; - } - if(dirProp==FSI) { - dirProps[i-1]=LRI; /* default if no strong char */ - state=SEEKING_STRONG_FOR_FSI; - } - else - state=LOOKING_FOR_PDI; - continue; - } - if(dirProp==PDI) { - if(state==SEEKING_STRONG_FOR_FSI) { - if(stackLast<=UBIDI_MAX_EXPLICIT_LEVEL) { - /* no need for next statement, already set by default */ - /* dirProps[isolateStartStack[stackLast]]=LRI; */ - flags|=DIRPROP_FLAG(LRI); - } - } - if(stackLast>=0) { - if(stackLast<=UBIDI_MAX_EXPLICIT_LEVEL) - state=previousStateStack[stackLast]; - stackLast--; - } - continue; - } - if(dirProp==B) { - if(iparas[pBiDi->paraCount-1].limit=i; - if(isDefaultLevelInverse && lastStrong==R) - pBiDi->paras[pBiDi->paraCount-1].level=1; - if(pBiDi->reorderingOptions & UBIDI_OPTION_STREAMING) { - /* When streaming, we only process whole paragraphs - thus some updates are only done on paragraph boundaries */ - pBiDi->length=i; /* i is index to next character */ - pBiDi->controlCount=controlCount; - } - if(iparaCount++; - if(checkParaCount(pBiDi)==FALSE) /* not enough memory for a new para entry */ - return FALSE; - if(isDefaultLevel) { - pBiDi->paras[pBiDi->paraCount-1].level=defaultParaLevel; - state=SEEKING_STRONG_FOR_PARA; - lastStrong=defaultParaLevel; - } else { - pBiDi->paras[pBiDi->paraCount-1].level=pBiDi->paraLevel; - state=NOT_SEEKING_STRONG; - } - stackLast=-1; - } - continue; - } - } - /* Ignore still open isolate sequences with overflow */ - if(stackLast>UBIDI_MAX_EXPLICIT_LEVEL) { - stackLast=UBIDI_MAX_EXPLICIT_LEVEL; - state=SEEKING_STRONG_FOR_FSI; /* to be on the safe side */ - } - /* Resolve direction of still unresolved open FSI sequences */ - while(stackLast>=0) { - if(state==SEEKING_STRONG_FOR_FSI) { - /* no need for next statement, already set by default */ - /* dirProps[isolateStartStack[stackLast]]=LRI; */ - flags|=DIRPROP_FLAG(LRI); - break; - } - state=previousStateStack[stackLast]; - stackLast--; - } - /* When streaming, ignore text after the last paragraph separator */ - if(pBiDi->reorderingOptions & UBIDI_OPTION_STREAMING) { - if(pBiDi->lengthparaCount--; - } else { - pBiDi->paras[pBiDi->paraCount-1].limit=originalLength; - pBiDi->controlCount=controlCount; - } - /* For inverse bidi, default para direction is RTL if there is - a strong R or AL at either end of the paragraph */ - if(isDefaultLevelInverse && lastStrong==R) { - pBiDi->paras[pBiDi->paraCount-1].level=1; - } - if(isDefaultLevel) { - pBiDi->paraLevel=pBiDi->paras[0].level; - } - /* The following is needed to resolve the text direction for default level - paragraphs containing no strong character */ - for(i=0; iparaCount; i++) - flags|=DIRPROP_FLAG_LR(pBiDi->paras[i].level); - - if(pBiDi->orderParagraphsLTR && (flags&DIRPROP_FLAG(B))) { - flags|=DIRPROP_FLAG(L); - } - pBiDi->flags=flags; - pBiDi->lastArabicPos=lastArabicPos; - return TRUE; -} - -/* determine the paragraph level at position index */ -U_CFUNC UBiDiLevel -ubidi_getParaLevelAtIndex(const UBiDi *pBiDi, int32_t pindex) { - int32_t i; - for(i=0; iparaCount; i++) - if(pindexparas[i].limit) - break; - if(i>=pBiDi->paraCount) - i=pBiDi->paraCount-1; - return (UBiDiLevel)(pBiDi->paras[i].level); -} - -/* Functions for handling paired brackets ----------------------------------- */ - -/* In the isoRuns array, the first entry is used for text outside of any - isolate sequence. Higher entries are used for each more deeply nested - isolate sequence. isoRunLast is the index of the last used entry. The - openings array is used to note the data of opening brackets not yet - matched by a closing bracket, or matched but still susceptible to change - level. - Each isoRun entry contains the index of the first and - one-after-last openings entries for pending opening brackets it - contains. The next openings entry to use is the one-after-last of the - most deeply nested isoRun entry. - isoRun entries also contain their current embedding level and the last - encountered strong character, since these will be needed to resolve - the level of paired brackets. */ - -static void -bracketInit(UBiDi *pBiDi, BracketData *bd) { - bd->pBiDi=pBiDi; - bd->isoRunLast=0; - bd->isoRuns[0].start=0; - bd->isoRuns[0].limit=0; - bd->isoRuns[0].level=GET_PARALEVEL(pBiDi, 0); - bd->isoRuns[0].lastStrong=bd->isoRuns[0].lastBase=bd->isoRuns[0].contextDir=GET_PARALEVEL(pBiDi, 0)&1; - bd->isoRuns[0].contextPos=0; - if(pBiDi->openingsMemory) { - bd->openings=pBiDi->openingsMemory; - bd->openingsCount=pBiDi->openingsSize / sizeof(Opening); - } else { - bd->openings=bd->simpleOpenings; - bd->openingsCount=SIMPLE_OPENINGS_COUNT; - } - bd->isNumbersSpecial=bd->pBiDi->reorderingMode==UBIDI_REORDER_NUMBERS_SPECIAL || - bd->pBiDi->reorderingMode==UBIDI_REORDER_INVERSE_FOR_NUMBERS_SPECIAL; -} - -/* paragraph boundary */ -static void -bracketProcessB(BracketData *bd, UBiDiLevel level) { - bd->isoRunLast=0; - bd->isoRuns[0].limit=0; - bd->isoRuns[0].level=level; - bd->isoRuns[0].lastStrong=bd->isoRuns[0].lastBase=bd->isoRuns[0].contextDir=level&1; - bd->isoRuns[0].contextPos=0; -} - -/* LRE, LRO, RLE, RLO, PDF */ -static void -bracketProcessBoundary(BracketData *bd, int32_t lastCcPos, - UBiDiLevel contextLevel, UBiDiLevel embeddingLevel) { - IsoRun *pLastIsoRun=&bd->isoRuns[bd->isoRunLast]; - DirProp *dirProps=bd->pBiDi->dirProps; - if(DIRPROP_FLAG(dirProps[lastCcPos])&MASK_ISO) /* after an isolate */ - return; - if(NO_OVERRIDE(embeddingLevel)>NO_OVERRIDE(contextLevel)) /* not a PDF */ - contextLevel=embeddingLevel; - pLastIsoRun->limit=pLastIsoRun->start; - pLastIsoRun->level=embeddingLevel; - pLastIsoRun->lastStrong=pLastIsoRun->lastBase=pLastIsoRun->contextDir=contextLevel&1; - pLastIsoRun->contextPos=lastCcPos; -} - -/* LRI or RLI */ -static void -bracketProcessLRI_RLI(BracketData *bd, UBiDiLevel level) { - IsoRun *pLastIsoRun=&bd->isoRuns[bd->isoRunLast]; - int16_t lastLimit; - pLastIsoRun->lastBase=ON; - lastLimit=pLastIsoRun->limit; - bd->isoRunLast++; - pLastIsoRun++; - pLastIsoRun->start=pLastIsoRun->limit=lastLimit; - pLastIsoRun->level=level; - pLastIsoRun->lastStrong=pLastIsoRun->lastBase=pLastIsoRun->contextDir=level&1; - pLastIsoRun->contextPos=0; -} - -/* PDI */ -static void -bracketProcessPDI(BracketData *bd) { - IsoRun *pLastIsoRun; - bd->isoRunLast--; - pLastIsoRun=&bd->isoRuns[bd->isoRunLast]; - pLastIsoRun->lastBase=ON; -} - -/* newly found opening bracket: create an openings entry */ -static UBool /* return TRUE if success */ -bracketAddOpening(BracketData *bd, UChar match, int32_t position) { - IsoRun *pLastIsoRun=&bd->isoRuns[bd->isoRunLast]; - Opening *pOpening; - if(pLastIsoRun->limit>=bd->openingsCount) { /* no available new entry */ - UBiDi *pBiDi=bd->pBiDi; - if(!getInitialOpeningsMemory(pBiDi, pLastIsoRun->limit * 2)) - return FALSE; - if(bd->openings==bd->simpleOpenings) - uprv_memcpy(pBiDi->openingsMemory, bd->simpleOpenings, - SIMPLE_OPENINGS_COUNT * sizeof(Opening)); - bd->openings=pBiDi->openingsMemory; /* may have changed */ - bd->openingsCount=pBiDi->openingsSize / sizeof(Opening); - } - pOpening=&bd->openings[pLastIsoRun->limit]; - pOpening->position=position; - pOpening->match=match; - pOpening->contextDir=pLastIsoRun->contextDir; - pOpening->contextPos=pLastIsoRun->contextPos; - pOpening->flags=0; - pLastIsoRun->limit++; - return TRUE; -} - -/* change N0c1 to N0c2 when a preceding bracket is assigned the embedding level */ -static void -fixN0c(BracketData *bd, int32_t openingIndex, int32_t newPropPosition, DirProp newProp) { - /* This function calls itself recursively */ - IsoRun *pLastIsoRun=&bd->isoRuns[bd->isoRunLast]; - Opening *qOpening; - DirProp *dirProps=bd->pBiDi->dirProps; - int32_t k, openingPosition, closingPosition; - for(k=openingIndex+1, qOpening=&bd->openings[k]; klimit; k++, qOpening++) { - if(qOpening->match>=0) /* not an N0c match */ - continue; - if(newPropPositioncontextPos) - break; - if(newPropPosition>=qOpening->position) - continue; - if(newProp==qOpening->contextDir) - break; - openingPosition=qOpening->position; - dirProps[openingPosition]=newProp; - closingPosition=-(qOpening->match); - dirProps[closingPosition]=newProp; - qOpening->match=0; /* prevent further changes */ - fixN0c(bd, k, openingPosition, newProp); - fixN0c(bd, k, closingPosition, newProp); - } -} - -/* process closing bracket */ -static DirProp /* return L or R if N0b or N0c, ON if N0d */ -bracketProcessClosing(BracketData *bd, int32_t openIdx, int32_t position) { - IsoRun *pLastIsoRun=&bd->isoRuns[bd->isoRunLast]; - Opening *pOpening, *qOpening; - UBiDiDirection direction; - UBool stable; - DirProp newProp; - pOpening=&bd->openings[openIdx]; - direction=pLastIsoRun->level&1; - stable=TRUE; /* assume stable until proved otherwise */ - - /* The stable flag is set when brackets are paired and their - level is resolved and cannot be changed by what will be - found later in the source string. - An unstable match can occur only when applying N0c, where - the resolved level depends on the preceding context, and - this context may be affected by text occurring later. - Example: RTL paragraph containing: abc[(latin) HEBREW] - When the closing parenthesis is encountered, it appears - that N0c1 must be applied since 'abc' sets an opposite - direction context and both parentheses receive level 2. - However, when the closing square bracket is processed, - N0b applies because of 'HEBREW' being included within the - brackets, thus the square brackets are treated like R and - receive level 1. However, this changes the preceding - context of the opening parenthesis, and it now appears - that N0c2 must be applied to the parentheses rather than - N0c1. */ - - if((direction==0 && pOpening->flags&FOUND_L) || - (direction==1 && pOpening->flags&FOUND_R)) { /* N0b */ - newProp=direction; - } - else if(pOpening->flags&(FOUND_L|FOUND_R)) { /* N0c */ - /* it is stable if there is no containing pair or in - conditions too complicated and not worth checking */ - stable=(openIdx==pLastIsoRun->start); - if(direction!=pOpening->contextDir) - newProp=pOpening->contextDir; /* N0c1 */ - else - newProp=direction; /* N0c2 */ - } else { - /* forget this and any brackets nested within this pair */ - pLastIsoRun->limit=openIdx; - return ON; /* N0d */ - } - bd->pBiDi->dirProps[pOpening->position]=newProp; - bd->pBiDi->dirProps[position]=newProp; - /* Update nested N0c pairs that may be affected */ - fixN0c(bd, openIdx, pOpening->position, newProp); - if(stable) { - pLastIsoRun->limit=openIdx; /* forget any brackets nested within this pair */ - /* remove lower located synonyms if any */ - while(pLastIsoRun->limit>pLastIsoRun->start && - bd->openings[pLastIsoRun->limit-1].position==pOpening->position) - pLastIsoRun->limit--; - } else { - int32_t k; - pOpening->match=-position; - /* neutralize lower located synonyms if any */ - k=openIdx-1; - while(k>=pLastIsoRun->start && - bd->openings[k].position==pOpening->position) - bd->openings[k--].match=0; - /* neutralize any unmatched opening between the current pair; - this will also neutralize higher located synonyms if any */ - for(k=openIdx+1; klimit; k++) { - qOpening=&bd->openings[k]; - if(qOpening->position>=position) - break; - if(qOpening->match>0) - qOpening->match=0; - } - } - return newProp; -} - -/* handle strong characters, digits and candidates for closing brackets */ -static UBool /* return TRUE if success */ -bracketProcessChar(BracketData *bd, int32_t position) { - IsoRun *pLastIsoRun=&bd->isoRuns[bd->isoRunLast]; - DirProp *dirProps, dirProp, newProp; - UBiDiLevel level; - dirProps=bd->pBiDi->dirProps; - dirProp=dirProps[position]; - if(dirProp==ON) { - UChar c, match; - int32_t idx; - /* First see if it is a matching closing bracket. Hopefully, this is - more efficient than checking if it is a closing bracket at all */ - c=bd->pBiDi->text[position]; - for(idx=pLastIsoRun->limit-1; idx>=pLastIsoRun->start; idx--) { - if(bd->openings[idx].match!=c) - continue; - /* We have a match */ - newProp=bracketProcessClosing(bd, idx, position); - if(newProp==ON) { /* N0d */ - c=0; /* prevent handling as an opening */ - break; - } - pLastIsoRun->lastBase=ON; - pLastIsoRun->contextDir=newProp; - pLastIsoRun->contextPos=position; - level=bd->pBiDi->levels[position]; - if(level&UBIDI_LEVEL_OVERRIDE) { /* X4, X5 */ - uint16_t flag; - int32_t i; - newProp=level&1; - pLastIsoRun->lastStrong=newProp; - flag=DIRPROP_FLAG(newProp); - for(i=pLastIsoRun->start; iopenings[i].flags|=flag; - /* matching brackets are not overridden by LRO/RLO */ - bd->pBiDi->levels[position]&=~UBIDI_LEVEL_OVERRIDE; - } - /* matching brackets are not overridden by LRO/RLO */ - bd->pBiDi->levels[bd->openings[idx].position]&=~UBIDI_LEVEL_OVERRIDE; - return TRUE; - } - /* We get here only if the ON character is not a matching closing - bracket or it is a case of N0d */ - /* Now see if it is an opening bracket */ - if(c) - match=u_getBidiPairedBracket(c); /* get the matching char */ - else - match=0; - if(match!=c && /* has a matching char */ - ubidi_getPairedBracketType(bd->pBiDi->bdp, c)==U_BPT_OPEN) { /* opening bracket */ - /* special case: process synonyms - create an opening entry for each synonym */ - if(match==0x232A) { /* RIGHT-POINTING ANGLE BRACKET */ - if(!bracketAddOpening(bd, 0x3009, position)) - return FALSE; - } - else if(match==0x3009) { /* RIGHT ANGLE BRACKET */ - if(!bracketAddOpening(bd, 0x232A, position)) - return FALSE; - } - if(!bracketAddOpening(bd, match, position)) - return FALSE; - } - } - level=bd->pBiDi->levels[position]; - if(level&UBIDI_LEVEL_OVERRIDE) { /* X4, X5 */ - newProp=level&1; - if(dirProp!=S && dirProp!=WS && dirProp!=ON) - dirProps[position]=newProp; - pLastIsoRun->lastBase=newProp; - pLastIsoRun->lastStrong=newProp; - pLastIsoRun->contextDir=newProp; - pLastIsoRun->contextPos=position; - } - else if(dirProp<=R || dirProp==AL) { - newProp=DIR_FROM_STRONG(dirProp); - pLastIsoRun->lastBase=dirProp; - pLastIsoRun->lastStrong=dirProp; - pLastIsoRun->contextDir=newProp; - pLastIsoRun->contextPos=position; - } - else if(dirProp==EN) { - pLastIsoRun->lastBase=EN; - if(pLastIsoRun->lastStrong==L) { - newProp=L; /* W7 */ - if(!bd->isNumbersSpecial) - dirProps[position]=ENL; - pLastIsoRun->contextDir=L; - pLastIsoRun->contextPos=position; - } - else { - newProp=R; /* N0 */ - if(pLastIsoRun->lastStrong==AL) - dirProps[position]=AN; /* W2 */ - else - dirProps[position]=ENR; - pLastIsoRun->contextDir=R; - pLastIsoRun->contextPos=position; - } - } - else if(dirProp==AN) { - newProp=R; /* N0 */ - pLastIsoRun->lastBase=AN; - pLastIsoRun->contextDir=R; - pLastIsoRun->contextPos=position; - } - else if(dirProp==NSM) { - /* if the last real char was ON, change NSM to ON so that it - will stay ON even if the last real char is a bracket which - may be changed to L or R */ - newProp=pLastIsoRun->lastBase; - if(newProp==ON) - dirProps[position]=newProp; - } - else { - newProp=dirProp; - pLastIsoRun->lastBase=dirProp; - } - if(newProp<=R || newProp==AL) { - int32_t i; - uint16_t flag=DIRPROP_FLAG(DIR_FROM_STRONG(newProp)); - for(i=pLastIsoRun->start; ilimit; i++) - if(position>bd->openings[i].position) - bd->openings[i].flags|=flag; - } - return TRUE; -} - -/* perform (X1)..(X9) ------------------------------------------------------- */ - -/* determine if the text is mixed-directional or single-directional */ -static UBiDiDirection -directionFromFlags(UBiDi *pBiDi) { - Flags flags=pBiDi->flags; - /* if the text contains AN and neutrals, then some neutrals may become RTL */ - if(!(flags&MASK_RTL || ((flags&DIRPROP_FLAG(AN)) && (flags&MASK_POSSIBLE_N)))) { - return UBIDI_LTR; - } else if(!(flags&MASK_LTR)) { - return UBIDI_RTL; - } else { - return UBIDI_MIXED; - } -} - -/* - * Resolve the explicit levels as specified by explicit embedding codes. - * Recalculate the flags to have them reflect the real properties - * after taking the explicit embeddings into account. - * - * The BiDi algorithm is designed to result in the same behavior whether embedding - * levels are externally specified (from "styled text", supposedly the preferred - * method) or set by explicit embedding codes (LRx, RLx, PDF, FSI, PDI) in the plain text. - * That is why (X9) instructs to remove all not-isolate explicit codes (and BN). - * However, in a real implementation, the removal of these codes and their index - * positions in the plain text is undesirable since it would result in - * reallocated, reindexed text. - * Instead, this implementation leaves the codes in there and just ignores them - * in the subsequent processing. - * In order to get the same reordering behavior, positions with a BN or a not-isolate - * explicit embedding code just get the same level assigned as the last "real" - * character. - * - * Some implementations, not this one, then overwrite some of these - * directionality properties at "real" same-level-run boundaries by - * L or R codes so that the resolution of weak types can be performed on the - * entire paragraph at once instead of having to parse it once more and - * perform that resolution on same-level-runs. - * This limits the scope of the implicit rules in effectively - * the same way as the run limits. - * - * Instead, this implementation does not modify these codes, except for - * paired brackets whose properties (ON) may be replaced by L or R. - * On one hand, the paragraph has to be scanned for same-level-runs, but - * on the other hand, this saves another loop to reset these codes, - * or saves making and modifying a copy of dirProps[]. - * - * - * Note that (Pn) and (Xn) changed significantly from version 4 of the BiDi algorithm. - * - * - * Handling the stack of explicit levels (Xn): - * - * With the BiDi stack of explicit levels, as pushed with each - * LRE, RLE, LRO, RLO, LRI, RLI and FSI and popped with each PDF and PDI, - * the explicit level must never exceed UBIDI_MAX_EXPLICIT_LEVEL. - * - * In order to have a correct push-pop semantics even in the case of overflows, - * overflow counters and a valid isolate counter are used as described in UAX#9 - * section 3.3.2 "Explicit Levels and Directions". - * - * This implementation assumes that UBIDI_MAX_EXPLICIT_LEVEL is odd. - * - * Returns normally the direction; -1 if there was a memory shortage - * - */ -static UBiDiDirection -resolveExplicitLevels(UBiDi *pBiDi, UErrorCode *pErrorCode) { - DirProp *dirProps=pBiDi->dirProps; - UBiDiLevel *levels=pBiDi->levels; - const UChar *text=pBiDi->text; - - int32_t i=0, length=pBiDi->length; - Flags flags=pBiDi->flags; /* collect all directionalities in the text */ - DirProp dirProp; - UBiDiLevel level=GET_PARALEVEL(pBiDi, 0); - UBiDiDirection direction; - pBiDi->isolateCount=0; - - if(U_FAILURE(*pErrorCode)) { return UBIDI_LTR; } - - /* determine if the text is mixed-directional or single-directional */ - direction=directionFromFlags(pBiDi); - - /* we may not need to resolve any explicit levels */ - if((direction!=UBIDI_MIXED)) { - /* not mixed directionality: levels don't matter - trailingWSStart will be 0 */ - return direction; - } - if(pBiDi->reorderingMode > UBIDI_REORDER_LAST_LOGICAL_TO_VISUAL) { - /* inverse BiDi: mixed, but all characters are at the same embedding level */ - /* set all levels to the paragraph level */ - int32_t paraIndex, start, limit; - for(paraIndex=0; paraIndexparaCount; paraIndex++) { - if(paraIndex==0) - start=0; - else - start=pBiDi->paras[paraIndex-1].limit; - limit=pBiDi->paras[paraIndex].limit; - level=pBiDi->paras[paraIndex].level; - for(i=start; iparaCount; paraIndex++) { - if(paraIndex==0) - start=0; - else - start=pBiDi->paras[paraIndex-1].limit; - limit=pBiDi->paras[paraIndex].limit; - level=pBiDi->paras[paraIndex].level; - for(i=start; i=UBIDI_MAX_EXPLICIT_LEVEL - but we need one more entry as base */ - uint32_t stackLast=0; - int32_t overflowIsolateCount=0; - int32_t overflowEmbeddingCount=0; - int32_t validIsolateCount=0; - BracketData bracketData; - bracketInit(pBiDi, &bracketData); - stack[0]=level; /* initialize base entry to para level, no override, no isolate */ - - /* recalculate the flags */ - flags=0; - - for(i=0; i0 && stack[stackLast]pBiDi->isolateCount) - pBiDi->isolateCount=validIsolateCount; - embeddingLevel=newLevel; - /* we can increment stackLast without checking because newLevel - will exceed UBIDI_MAX_EXPLICIT_LEVEL before stackLast overflows */ - stackLast++; - stack[stackLast]=embeddingLevel+ISOLATE; - bracketProcessLRI_RLI(&bracketData, embeddingLevel); - } else { - /* make it WS so that it is handled by adjustWSLevels() */ - dirProps[i]=WS; - overflowIsolateCount++; - } - break; - case PDI: - if(NO_OVERRIDE(embeddingLevel)!=NO_OVERRIDE(previousLevel)) { - bracketProcessBoundary(&bracketData, lastCcPos, - previousLevel, embeddingLevel); - flags|=DIRPROP_FLAG_MULTI_RUNS; - } - /* (X6a) */ - if(overflowIsolateCount) { - overflowIsolateCount--; - /* make it WS so that it is handled by adjustWSLevels() */ - dirProps[i]=WS; - } - else if(validIsolateCount) { - flags|=DIRPROP_FLAG(PDI); - lastCcPos=i; - overflowEmbeddingCount=0; - while(stack[stackLast]paraLevel); - if(pBiDi->orderParagraphsLTR && (flags&DIRPROP_FLAG(B))) - flags|=DIRPROP_FLAG(L); - /* again, determine if the text is mixed-directional or single-directional */ - pBiDi->flags=flags; - direction=directionFromFlags(pBiDi); - } - return direction; -} - -/* - * Use a pre-specified embedding levels array: - * - * Adjust the directional properties for overrides (->LEVEL_OVERRIDE), - * ignore all explicit codes (X9), - * and check all the preset levels. - * - * Recalculate the flags to have them reflect the real properties - * after taking the explicit embeddings into account. - */ -static UBiDiDirection -checkExplicitLevels(UBiDi *pBiDi, UErrorCode *pErrorCode) { - DirProp *dirProps=pBiDi->dirProps; - DirProp dirProp; - UBiDiLevel *levels=pBiDi->levels; - int32_t isolateCount=0; - - int32_t i, length=pBiDi->length; - Flags flags=0; /* collect all directionalities in the text */ - UBiDiLevel level; - pBiDi->isolateCount=0; - - for(i=0; ipBiDi->isolateCount) - pBiDi->isolateCount=isolateCount; - } - else if(dirProp==PDI) - isolateCount--; - else if(dirProp==B) - isolateCount=0; - if(level&UBIDI_LEVEL_OVERRIDE) { - /* keep the override flag in levels[i] but adjust the flags */ - level&=~UBIDI_LEVEL_OVERRIDE; /* make the range check below simpler */ - flags|=DIRPROP_FLAG_O(level); - } else { - /* set the flags */ - flags|=DIRPROP_FLAG_E(level)|DIRPROP_FLAG(dirProp); - } - if((levelparaLevel); - /* determine if the text is mixed-directional or single-directional */ - pBiDi->flags=flags; - return directionFromFlags(pBiDi); -} - -/****************************************************************** - The Properties state machine table -******************************************************************* - - All table cells are 8 bits: - bits 0..4: next state - bits 5..7: action to perform (if > 0) - - Cells may be of format "n" where n represents the next state - (except for the rightmost column). - Cells may also be of format "s(x,y)" where x represents an action - to perform and y represents the next state. - -******************************************************************* - Definitions and type for properties state table -******************************************************************* -*/ -#define IMPTABPROPS_COLUMNS 16 -#define IMPTABPROPS_RES (IMPTABPROPS_COLUMNS - 1) -#define GET_STATEPROPS(cell) ((cell)&0x1f) -#define GET_ACTIONPROPS(cell) ((cell)>>5) -#define s(action, newState) ((uint8_t)(newState+(action<<5))) - -static const uint8_t groupProp[] = /* dirProp regrouped */ -{ -/* L R EN ES ET AN CS B S WS ON LRE LRO AL RLE RLO PDF NSM BN FSI LRI RLI PDI ENL ENR */ - 0, 1, 2, 7, 8, 3, 9, 6, 5, 4, 4, 10, 10, 12, 10, 10, 10, 11, 10, 4, 4, 4, 4, 13, 14 -}; -enum { DirProp_L=0, DirProp_R=1, DirProp_EN=2, DirProp_AN=3, DirProp_ON=4, DirProp_S=5, DirProp_B=6 }; /* reduced dirProp */ - -/****************************************************************** - - PROPERTIES STATE TABLE - - In table impTabProps, - - the ON column regroups ON and WS, FSI, RLI, LRI and PDI - - the BN column regroups BN, LRE, RLE, LRO, RLO, PDF - - the Res column is the reduced property assigned to a run - - Action 1: process current run1, init new run1 - 2: init new run2 - 3: process run1, process run2, init new run1 - 4: process run1, set run1=run2, init new run2 - - Notes: - 1) This table is used in resolveImplicitLevels(). - 2) This table triggers actions when there is a change in the Bidi - property of incoming characters (action 1). - 3) Most such property sequences are processed immediately (in - fact, passed to processPropertySeq(). - 4) However, numbers are assembled as one sequence. This means - that undefined situations (like CS following digits, until - it is known if the next char will be a digit) are held until - following chars define them. - Example: digits followed by CS, then comes another CS or ON; - the digits will be processed, then the CS assigned - as the start of an ON sequence (action 3). - 5) There are cases where more than one sequence must be - processed, for instance digits followed by CS followed by L: - the digits must be processed as one sequence, and the CS - must be processed as an ON sequence, all this before starting - assembling chars for the opening L sequence. - - -*/ -static const uint8_t impTabProps[][IMPTABPROPS_COLUMNS] = -{ -/* L , R , EN , AN , ON , S , B , ES , ET , CS , BN , NSM , AL , ENL , ENR , Res */ -/* 0 Init */ { 1 , 2 , 4 , 5 , 7 , 15 , 17 , 7 , 9 , 7 , 0 , 7 , 3 , 18 , 21 , DirProp_ON }, -/* 1 L */ { 1 , s(1,2), s(1,4), s(1,5), s(1,7),s(1,15),s(1,17), s(1,7), s(1,9), s(1,7), 1 , 1 , s(1,3),s(1,18),s(1,21), DirProp_L }, -/* 2 R */ { s(1,1), 2 , s(1,4), s(1,5), s(1,7),s(1,15),s(1,17), s(1,7), s(1,9), s(1,7), 2 , 2 , s(1,3),s(1,18),s(1,21), DirProp_R }, -/* 3 AL */ { s(1,1), s(1,2), s(1,6), s(1,6), s(1,8),s(1,16),s(1,17), s(1,8), s(1,8), s(1,8), 3 , 3 , 3 ,s(1,18),s(1,21), DirProp_R }, -/* 4 EN */ { s(1,1), s(1,2), 4 , s(1,5), s(1,7),s(1,15),s(1,17),s(2,10), 11 ,s(2,10), 4 , 4 , s(1,3), 18 , 21 , DirProp_EN }, -/* 5 AN */ { s(1,1), s(1,2), s(1,4), 5 , s(1,7),s(1,15),s(1,17), s(1,7), s(1,9),s(2,12), 5 , 5 , s(1,3),s(1,18),s(1,21), DirProp_AN }, -/* 6 AL:EN/AN */ { s(1,1), s(1,2), 6 , 6 , s(1,8),s(1,16),s(1,17), s(1,8), s(1,8),s(2,13), 6 , 6 , s(1,3), 18 , 21 , DirProp_AN }, -/* 7 ON */ { s(1,1), s(1,2), s(1,4), s(1,5), 7 ,s(1,15),s(1,17), 7 ,s(2,14), 7 , 7 , 7 , s(1,3),s(1,18),s(1,21), DirProp_ON }, -/* 8 AL:ON */ { s(1,1), s(1,2), s(1,6), s(1,6), 8 ,s(1,16),s(1,17), 8 , 8 , 8 , 8 , 8 , s(1,3),s(1,18),s(1,21), DirProp_ON }, -/* 9 ET */ { s(1,1), s(1,2), 4 , s(1,5), 7 ,s(1,15),s(1,17), 7 , 9 , 7 , 9 , 9 , s(1,3), 18 , 21 , DirProp_ON }, -/*10 EN+ES/CS */ { s(3,1), s(3,2), 4 , s(3,5), s(4,7),s(3,15),s(3,17), s(4,7),s(4,14), s(4,7), 10 , s(4,7), s(3,3), 18 , 21 , DirProp_EN }, -/*11 EN+ET */ { s(1,1), s(1,2), 4 , s(1,5), s(1,7),s(1,15),s(1,17), s(1,7), 11 , s(1,7), 11 , 11 , s(1,3), 18 , 21 , DirProp_EN }, -/*12 AN+CS */ { s(3,1), s(3,2), s(3,4), 5 , s(4,7),s(3,15),s(3,17), s(4,7),s(4,14), s(4,7), 12 , s(4,7), s(3,3),s(3,18),s(3,21), DirProp_AN }, -/*13 AL:EN/AN+CS */ { s(3,1), s(3,2), 6 , 6 , s(4,8),s(3,16),s(3,17), s(4,8), s(4,8), s(4,8), 13 , s(4,8), s(3,3), 18 , 21 , DirProp_AN }, -/*14 ON+ET */ { s(1,1), s(1,2), s(4,4), s(1,5), 7 ,s(1,15),s(1,17), 7 , 14 , 7 , 14 , 14 , s(1,3),s(4,18),s(4,21), DirProp_ON }, -/*15 S */ { s(1,1), s(1,2), s(1,4), s(1,5), s(1,7), 15 ,s(1,17), s(1,7), s(1,9), s(1,7), 15 , s(1,7), s(1,3),s(1,18),s(1,21), DirProp_S }, -/*16 AL:S */ { s(1,1), s(1,2), s(1,6), s(1,6), s(1,8), 16 ,s(1,17), s(1,8), s(1,8), s(1,8), 16 , s(1,8), s(1,3),s(1,18),s(1,21), DirProp_S }, -/*17 B */ { s(1,1), s(1,2), s(1,4), s(1,5), s(1,7),s(1,15), 17 , s(1,7), s(1,9), s(1,7), 17 , s(1,7), s(1,3),s(1,18),s(1,21), DirProp_B }, -/*18 ENL */ { s(1,1), s(1,2), 18 , s(1,5), s(1,7),s(1,15),s(1,17),s(2,19), 20 ,s(2,19), 18 , 18 , s(1,3), 18 , 21 , DirProp_L }, -/*19 ENL+ES/CS */ { s(3,1), s(3,2), 18 , s(3,5), s(4,7),s(3,15),s(3,17), s(4,7),s(4,14), s(4,7), 19 , s(4,7), s(3,3), 18 , 21 , DirProp_L }, -/*20 ENL+ET */ { s(1,1), s(1,2), 18 , s(1,5), s(1,7),s(1,15),s(1,17), s(1,7), 20 , s(1,7), 20 , 20 , s(1,3), 18 , 21 , DirProp_L }, -/*21 ENR */ { s(1,1), s(1,2), 21 , s(1,5), s(1,7),s(1,15),s(1,17),s(2,22), 23 ,s(2,22), 21 , 21 , s(1,3), 18 , 21 , DirProp_AN }, -/*22 ENR+ES/CS */ { s(3,1), s(3,2), 21 , s(3,5), s(4,7),s(3,15),s(3,17), s(4,7),s(4,14), s(4,7), 22 , s(4,7), s(3,3), 18 , 21 , DirProp_AN }, -/*23 ENR+ET */ { s(1,1), s(1,2), 21 , s(1,5), s(1,7),s(1,15),s(1,17), s(1,7), 23 , s(1,7), 23 , 23 , s(1,3), 18 , 21 , DirProp_AN } -}; - -/* we must undef macro s because the levels tables have a different - * structure (4 bits for action and 4 bits for next state. - */ -#undef s - -/****************************************************************** - The levels state machine tables -******************************************************************* - - All table cells are 8 bits: - bits 0..3: next state - bits 4..7: action to perform (if > 0) - - Cells may be of format "n" where n represents the next state - (except for the rightmost column). - Cells may also be of format "s(x,y)" where x represents an action - to perform and y represents the next state. - - This format limits each table to 16 states each and to 15 actions. - -******************************************************************* - Definitions and type for levels state tables -******************************************************************* -*/ -#define IMPTABLEVELS_COLUMNS (DirProp_B + 2) -#define IMPTABLEVELS_RES (IMPTABLEVELS_COLUMNS - 1) -#define GET_STATE(cell) ((cell)&0x0f) -#define GET_ACTION(cell) ((cell)>>4) -#define s(action, newState) ((uint8_t)(newState+(action<<4))) - -typedef uint8_t ImpTab[][IMPTABLEVELS_COLUMNS]; -typedef uint8_t ImpAct[]; - -/* FOOD FOR THOUGHT: each ImpTab should have its associated ImpAct, - * instead of having a pair of ImpTab and a pair of ImpAct. - */ -typedef struct ImpTabPair { - const void * pImpTab[2]; - const void * pImpAct[2]; -} ImpTabPair; - -/****************************************************************** - - LEVELS STATE TABLES - - In all levels state tables, - - state 0 is the initial state - - the Res column is the increment to add to the text level - for this property sequence. - - The impAct arrays for each table of a pair map the local action - numbers of the table to the total list of actions. For instance, - action 2 in a given table corresponds to the action number which - appears in entry [2] of the impAct array for that table. - The first entry of all impAct arrays must be 0. - - Action 1: init conditional sequence - 2: prepend conditional sequence to current sequence - 3: set ON sequence to new level - 1 - 4: init EN/AN/ON sequence - 5: fix EN/AN/ON sequence followed by R - 6: set previous level sequence to level 2 - - Notes: - 1) These tables are used in processPropertySeq(). The input - is property sequences as determined by resolveImplicitLevels. - 2) Most such property sequences are processed immediately - (levels are assigned). - 3) However, some sequences cannot be assigned a final level till - one or more following sequences are received. For instance, - ON following an R sequence within an even-level paragraph. - If the following sequence is R, the ON sequence will be - assigned basic run level+1, and so will the R sequence. - 4) S is generally handled like ON, since its level will be fixed - to paragraph level in adjustWSLevels(). - -*/ - -static const ImpTab impTabL_DEFAULT = /* Even paragraph level */ -/* In this table, conditional sequences receive the lower possible level - until proven otherwise. -*/ -{ -/* L , R , EN , AN , ON , S , B , Res */ -/* 0 : init */ { 0 , 1 , 0 , 2 , 0 , 0 , 0 , 0 }, -/* 1 : R */ { 0 , 1 , 3 , 3 , s(1,4), s(1,4), 0 , 1 }, -/* 2 : AN */ { 0 , 1 , 0 , 2 , s(1,5), s(1,5), 0 , 2 }, -/* 3 : R+EN/AN */ { 0 , 1 , 3 , 3 , s(1,4), s(1,4), 0 , 2 }, -/* 4 : R+ON */ { 0 , s(2,1), s(3,3), s(3,3), 4 , 4 , 0 , 0 }, -/* 5 : AN+ON */ { 0 , s(2,1), 0 , s(3,2), 5 , 5 , 0 , 0 } -}; -static const ImpTab impTabR_DEFAULT = /* Odd paragraph level */ -/* In this table, conditional sequences receive the lower possible level - until proven otherwise. -*/ -{ -/* L , R , EN , AN , ON , S , B , Res */ -/* 0 : init */ { 1 , 0 , 2 , 2 , 0 , 0 , 0 , 0 }, -/* 1 : L */ { 1 , 0 , 1 , 3 , s(1,4), s(1,4), 0 , 1 }, -/* 2 : EN/AN */ { 1 , 0 , 2 , 2 , 0 , 0 , 0 , 1 }, -/* 3 : L+AN */ { 1 , 0 , 1 , 3 , 5 , 5 , 0 , 1 }, -/* 4 : L+ON */ { s(2,1), 0 , s(2,1), 3 , 4 , 4 , 0 , 0 }, -/* 5 : L+AN+ON */ { 1 , 0 , 1 , 3 , 5 , 5 , 0 , 0 } -}; -static const ImpAct impAct0 = {0,1,2,3,4}; -static const ImpTabPair impTab_DEFAULT = {{&impTabL_DEFAULT, - &impTabR_DEFAULT}, - {&impAct0, &impAct0}}; - -static const ImpTab impTabL_NUMBERS_SPECIAL = /* Even paragraph level */ -/* In this table, conditional sequences receive the lower possible level - until proven otherwise. -*/ -{ -/* L , R , EN , AN , ON , S , B , Res */ -/* 0 : init */ { 0 , 2 , s(1,1), s(1,1), 0 , 0 , 0 , 0 }, -/* 1 : L+EN/AN */ { 0 , s(4,2), 1 , 1 , 0 , 0 , 0 , 0 }, -/* 2 : R */ { 0 , 2 , 4 , 4 , s(1,3), s(1,3), 0 , 1 }, -/* 3 : R+ON */ { 0 , s(2,2), s(3,4), s(3,4), 3 , 3 , 0 , 0 }, -/* 4 : R+EN/AN */ { 0 , 2 , 4 , 4 , s(1,3), s(1,3), 0 , 2 } -}; -static const ImpTabPair impTab_NUMBERS_SPECIAL = {{&impTabL_NUMBERS_SPECIAL, - &impTabR_DEFAULT}, - {&impAct0, &impAct0}}; - -static const ImpTab impTabL_GROUP_NUMBERS_WITH_R = -/* In this table, EN/AN+ON sequences receive levels as if associated with R - until proven that there is L or sor/eor on both sides. AN is handled like EN. -*/ -{ -/* L , R , EN , AN , ON , S , B , Res */ -/* 0 init */ { 0 , 3 , s(1,1), s(1,1), 0 , 0 , 0 , 0 }, -/* 1 EN/AN */ { s(2,0), 3 , 1 , 1 , 2 , s(2,0), s(2,0), 2 }, -/* 2 EN/AN+ON */ { s(2,0), 3 , 1 , 1 , 2 , s(2,0), s(2,0), 1 }, -/* 3 R */ { 0 , 3 , 5 , 5 , s(1,4), 0 , 0 , 1 }, -/* 4 R+ON */ { s(2,0), 3 , 5 , 5 , 4 , s(2,0), s(2,0), 1 }, -/* 5 R+EN/AN */ { 0 , 3 , 5 , 5 , s(1,4), 0 , 0 , 2 } -}; -static const ImpTab impTabR_GROUP_NUMBERS_WITH_R = -/* In this table, EN/AN+ON sequences receive levels as if associated with R - until proven that there is L on both sides. AN is handled like EN. -*/ -{ -/* L , R , EN , AN , ON , S , B , Res */ -/* 0 init */ { 2 , 0 , 1 , 1 , 0 , 0 , 0 , 0 }, -/* 1 EN/AN */ { 2 , 0 , 1 , 1 , 0 , 0 , 0 , 1 }, -/* 2 L */ { 2 , 0 , s(1,4), s(1,4), s(1,3), 0 , 0 , 1 }, -/* 3 L+ON */ { s(2,2), 0 , 4 , 4 , 3 , 0 , 0 , 0 }, -/* 4 L+EN/AN */ { s(2,2), 0 , 4 , 4 , 3 , 0 , 0 , 1 } -}; -static const ImpTabPair impTab_GROUP_NUMBERS_WITH_R = { - {&impTabL_GROUP_NUMBERS_WITH_R, - &impTabR_GROUP_NUMBERS_WITH_R}, - {&impAct0, &impAct0}}; - - -static const ImpTab impTabL_INVERSE_NUMBERS_AS_L = -/* This table is identical to the Default LTR table except that EN and AN are - handled like L. -*/ -{ -/* L , R , EN , AN , ON , S , B , Res */ -/* 0 : init */ { 0 , 1 , 0 , 0 , 0 , 0 , 0 , 0 }, -/* 1 : R */ { 0 , 1 , 0 , 0 , s(1,4), s(1,4), 0 , 1 }, -/* 2 : AN */ { 0 , 1 , 0 , 0 , s(1,5), s(1,5), 0 , 2 }, -/* 3 : R+EN/AN */ { 0 , 1 , 0 , 0 , s(1,4), s(1,4), 0 , 2 }, -/* 4 : R+ON */ { s(2,0), 1 , s(2,0), s(2,0), 4 , 4 , s(2,0), 1 }, -/* 5 : AN+ON */ { s(2,0), 1 , s(2,0), s(2,0), 5 , 5 , s(2,0), 1 } -}; -static const ImpTab impTabR_INVERSE_NUMBERS_AS_L = -/* This table is identical to the Default RTL table except that EN and AN are - handled like L. -*/ -{ -/* L , R , EN , AN , ON , S , B , Res */ -/* 0 : init */ { 1 , 0 , 1 , 1 , 0 , 0 , 0 , 0 }, -/* 1 : L */ { 1 , 0 , 1 , 1 , s(1,4), s(1,4), 0 , 1 }, -/* 2 : EN/AN */ { 1 , 0 , 1 , 1 , 0 , 0 , 0 , 1 }, -/* 3 : L+AN */ { 1 , 0 , 1 , 1 , 5 , 5 , 0 , 1 }, -/* 4 : L+ON */ { s(2,1), 0 , s(2,1), s(2,1), 4 , 4 , 0 , 0 }, -/* 5 : L+AN+ON */ { 1 , 0 , 1 , 1 , 5 , 5 , 0 , 0 } -}; -static const ImpTabPair impTab_INVERSE_NUMBERS_AS_L = { - {&impTabL_INVERSE_NUMBERS_AS_L, - &impTabR_INVERSE_NUMBERS_AS_L}, - {&impAct0, &impAct0}}; - -static const ImpTab impTabR_INVERSE_LIKE_DIRECT = /* Odd paragraph level */ -/* In this table, conditional sequences receive the lower possible level - until proven otherwise. -*/ -{ -/* L , R , EN , AN , ON , S , B , Res */ -/* 0 : init */ { 1 , 0 , 2 , 2 , 0 , 0 , 0 , 0 }, -/* 1 : L */ { 1 , 0 , 1 , 2 , s(1,3), s(1,3), 0 , 1 }, -/* 2 : EN/AN */ { 1 , 0 , 2 , 2 , 0 , 0 , 0 , 1 }, -/* 3 : L+ON */ { s(2,1), s(3,0), 6 , 4 , 3 , 3 , s(3,0), 0 }, -/* 4 : L+ON+AN */ { s(2,1), s(3,0), 6 , 4 , 5 , 5 , s(3,0), 3 }, -/* 5 : L+AN+ON */ { s(2,1), s(3,0), 6 , 4 , 5 , 5 , s(3,0), 2 }, -/* 6 : L+ON+EN */ { s(2,1), s(3,0), 6 , 4 , 3 , 3 , s(3,0), 1 } -}; -static const ImpAct impAct1 = {0,1,13,14}; -/* FOOD FOR THOUGHT: in LTR table below, check case "JKL 123abc" - */ -static const ImpTabPair impTab_INVERSE_LIKE_DIRECT = { - {&impTabL_DEFAULT, - &impTabR_INVERSE_LIKE_DIRECT}, - {&impAct0, &impAct1}}; - -static const ImpTab impTabL_INVERSE_LIKE_DIRECT_WITH_MARKS = -/* The case handled in this table is (visually): R EN L -*/ -{ -/* L , R , EN , AN , ON , S , B , Res */ -/* 0 : init */ { 0 , s(6,3), 0 , 1 , 0 , 0 , 0 , 0 }, -/* 1 : L+AN */ { 0 , s(6,3), 0 , 1 , s(1,2), s(3,0), 0 , 4 }, -/* 2 : L+AN+ON */ { s(2,0), s(6,3), s(2,0), 1 , 2 , s(3,0), s(2,0), 3 }, -/* 3 : R */ { 0 , s(6,3), s(5,5), s(5,6), s(1,4), s(3,0), 0 , 3 }, -/* 4 : R+ON */ { s(3,0), s(4,3), s(5,5), s(5,6), 4 , s(3,0), s(3,0), 3 }, -/* 5 : R+EN */ { s(3,0), s(4,3), 5 , s(5,6), s(1,4), s(3,0), s(3,0), 4 }, -/* 6 : R+AN */ { s(3,0), s(4,3), s(5,5), 6 , s(1,4), s(3,0), s(3,0), 4 } -}; -static const ImpTab impTabR_INVERSE_LIKE_DIRECT_WITH_MARKS = -/* The cases handled in this table are (visually): R EN L - R L AN L -*/ -{ -/* L , R , EN , AN , ON , S , B , Res */ -/* 0 : init */ { s(1,3), 0 , 1 , 1 , 0 , 0 , 0 , 0 }, -/* 1 : R+EN/AN */ { s(2,3), 0 , 1 , 1 , 2 , s(4,0), 0 , 1 }, -/* 2 : R+EN/AN+ON */ { s(2,3), 0 , 1 , 1 , 2 , s(4,0), 0 , 0 }, -/* 3 : L */ { 3 , 0 , 3 , s(3,6), s(1,4), s(4,0), 0 , 1 }, -/* 4 : L+ON */ { s(5,3), s(4,0), 5 , s(3,6), 4 , s(4,0), s(4,0), 0 }, -/* 5 : L+ON+EN */ { s(5,3), s(4,0), 5 , s(3,6), 4 , s(4,0), s(4,0), 1 }, -/* 6 : L+AN */ { s(5,3), s(4,0), 6 , 6 , 4 , s(4,0), s(4,0), 3 } -}; -static const ImpAct impAct2 = {0,1,2,5,6,7,8}; -static const ImpAct impAct3 = {0,1,9,10,11,12}; -static const ImpTabPair impTab_INVERSE_LIKE_DIRECT_WITH_MARKS = { - {&impTabL_INVERSE_LIKE_DIRECT_WITH_MARKS, - &impTabR_INVERSE_LIKE_DIRECT_WITH_MARKS}, - {&impAct2, &impAct3}}; - -static const ImpTabPair impTab_INVERSE_FOR_NUMBERS_SPECIAL = { - {&impTabL_NUMBERS_SPECIAL, - &impTabR_INVERSE_LIKE_DIRECT}, - {&impAct0, &impAct1}}; - -static const ImpTab impTabL_INVERSE_FOR_NUMBERS_SPECIAL_WITH_MARKS = -/* The case handled in this table is (visually): R EN L -*/ -{ -/* L , R , EN , AN , ON , S , B , Res */ -/* 0 : init */ { 0 , s(6,2), 1 , 1 , 0 , 0 , 0 , 0 }, -/* 1 : L+EN/AN */ { 0 , s(6,2), 1 , 1 , 0 , s(3,0), 0 , 4 }, -/* 2 : R */ { 0 , s(6,2), s(5,4), s(5,4), s(1,3), s(3,0), 0 , 3 }, -/* 3 : R+ON */ { s(3,0), s(4,2), s(5,4), s(5,4), 3 , s(3,0), s(3,0), 3 }, -/* 4 : R+EN/AN */ { s(3,0), s(4,2), 4 , 4 , s(1,3), s(3,0), s(3,0), 4 } -}; -static const ImpTabPair impTab_INVERSE_FOR_NUMBERS_SPECIAL_WITH_MARKS = { - {&impTabL_INVERSE_FOR_NUMBERS_SPECIAL_WITH_MARKS, - &impTabR_INVERSE_LIKE_DIRECT_WITH_MARKS}, - {&impAct2, &impAct3}}; - -#undef s - -typedef struct { - const ImpTab * pImpTab; /* level table pointer */ - const ImpAct * pImpAct; /* action map array */ - int32_t startON; /* start of ON sequence */ - int32_t startL2EN; /* start of level 2 sequence */ - int32_t lastStrongRTL; /* index of last found R or AL */ - int32_t state; /* current state */ - int32_t runStart; /* start position of the run */ - UBiDiLevel runLevel; /* run level before implicit solving */ -} LevState; - -/*------------------------------------------------------------------------*/ - -static void -addPoint(UBiDi *pBiDi, int32_t pos, int32_t flag) - /* param pos: position where to insert - param flag: one of LRM_BEFORE, LRM_AFTER, RLM_BEFORE, RLM_AFTER - */ -{ -#define FIRSTALLOC 10 - Point point; - InsertPoints * pInsertPoints=&(pBiDi->insertPoints); - - if (pInsertPoints->capacity == 0) - { - pInsertPoints->points=uprv_malloc(sizeof(Point)*FIRSTALLOC); - if (pInsertPoints->points == NULL) - { - pInsertPoints->errorCode=U_MEMORY_ALLOCATION_ERROR; - return; - } - pInsertPoints->capacity=FIRSTALLOC; - } - if (pInsertPoints->size >= pInsertPoints->capacity) /* no room for new point */ - { - void * savePoints=pInsertPoints->points; - pInsertPoints->points=uprv_realloc(pInsertPoints->points, - pInsertPoints->capacity*2*sizeof(Point)); - if (pInsertPoints->points == NULL) - { - pInsertPoints->points=savePoints; - pInsertPoints->errorCode=U_MEMORY_ALLOCATION_ERROR; - return; - } - else pInsertPoints->capacity*=2; - } - point.pos=pos; - point.flag=flag; - pInsertPoints->points[pInsertPoints->size]=point; - pInsertPoints->size++; -#undef FIRSTALLOC -} - -static void -setLevelsOutsideIsolates(UBiDi *pBiDi, int32_t start, int32_t limit, UBiDiLevel level) -{ - DirProp *dirProps=pBiDi->dirProps, dirProp; - UBiDiLevel *levels=pBiDi->levels; - int32_t isolateCount=0, k; - for(k=start; kpImpTab; - const ImpAct * pImpAct=pLevState->pImpAct; - UBiDiLevel * levels=pBiDi->levels; - UBiDiLevel level, addLevel; - InsertPoints * pInsertPoints; - int32_t start0, k; - - start0=start; /* save original start position */ - oldStateSeq=(uint8_t)pLevState->state; - cell=(*pImpTab)[oldStateSeq][_prop]; - pLevState->state=GET_STATE(cell); /* isolate the new state */ - actionSeq=(*pImpAct)[GET_ACTION(cell)]; /* isolate the action */ - addLevel=(*pImpTab)[pLevState->state][IMPTABLEVELS_RES]; - - if(actionSeq) { - switch(actionSeq) { - case 1: /* init ON seq */ - pLevState->startON=start0; - break; - - case 2: /* prepend ON seq to current seq */ - start=pLevState->startON; - break; - - case 3: /* EN/AN after R+ON */ - level=pLevState->runLevel+1; - setLevelsOutsideIsolates(pBiDi, pLevState->startON, start0, level); - break; - - case 4: /* EN/AN before R for NUMBERS_SPECIAL */ - level=pLevState->runLevel+2; - setLevelsOutsideIsolates(pBiDi, pLevState->startON, start0, level); - break; - - case 5: /* L or S after possible relevant EN/AN */ - /* check if we had EN after R/AL */ - if (pLevState->startL2EN >= 0) { - addPoint(pBiDi, pLevState->startL2EN, LRM_BEFORE); - } - pLevState->startL2EN=-1; /* not within previous if since could also be -2 */ - /* check if we had any relevant EN/AN after R/AL */ - pInsertPoints=&(pBiDi->insertPoints); - if ((pInsertPoints->capacity == 0) || - (pInsertPoints->size <= pInsertPoints->confirmed)) - { - /* nothing, just clean up */ - pLevState->lastStrongRTL=-1; - /* check if we have a pending conditional segment */ - level=(*pImpTab)[oldStateSeq][IMPTABLEVELS_RES]; - if ((level & 1) && (pLevState->startON > 0)) { /* after ON */ - start=pLevState->startON; /* reset to basic run level */ - } - if (_prop == DirProp_S) /* add LRM before S */ - { - addPoint(pBiDi, start0, LRM_BEFORE); - pInsertPoints->confirmed=pInsertPoints->size; - } - break; - } - /* reset previous RTL cont to level for LTR text */ - for (k=pLevState->lastStrongRTL+1; kconfirmed=pInsertPoints->size; - pLevState->lastStrongRTL=-1; - if (_prop == DirProp_S) /* add LRM before S */ - { - addPoint(pBiDi, start0, LRM_BEFORE); - pInsertPoints->confirmed=pInsertPoints->size; - } - break; - - case 6: /* R/AL after possible relevant EN/AN */ - /* just clean up */ - pInsertPoints=&(pBiDi->insertPoints); - if (pInsertPoints->capacity > 0) - /* remove all non confirmed insert points */ - pInsertPoints->size=pInsertPoints->confirmed; - pLevState->startON=-1; - pLevState->startL2EN=-1; - pLevState->lastStrongRTL=limit - 1; - break; - - case 7: /* EN/AN after R/AL + possible cont */ - /* check for real AN */ - if ((_prop == DirProp_AN) && (pBiDi->dirProps[start0] == AN) && - (pBiDi->reorderingMode!=UBIDI_REORDER_INVERSE_FOR_NUMBERS_SPECIAL)) - { - /* real AN */ - if (pLevState->startL2EN == -1) /* if no relevant EN already found */ - { - /* just note the righmost digit as a strong RTL */ - pLevState->lastStrongRTL=limit - 1; - break; - } - if (pLevState->startL2EN >= 0) /* after EN, no AN */ - { - addPoint(pBiDi, pLevState->startL2EN, LRM_BEFORE); - pLevState->startL2EN=-2; - } - /* note AN */ - addPoint(pBiDi, start0, LRM_BEFORE); - break; - } - /* if first EN/AN after R/AL */ - if (pLevState->startL2EN == -1) { - pLevState->startL2EN=start0; - } - break; - - case 8: /* note location of latest R/AL */ - pLevState->lastStrongRTL=limit - 1; - pLevState->startON=-1; - break; - - case 9: /* L after R+ON/EN/AN */ - /* include possible adjacent number on the left */ - for (k=start0-1; k>=0 && !(levels[k]&1); k--); - if(k>=0) { - addPoint(pBiDi, k, RLM_BEFORE); /* add RLM before */ - pInsertPoints=&(pBiDi->insertPoints); - pInsertPoints->confirmed=pInsertPoints->size; /* confirm it */ - } - pLevState->startON=start0; - break; - - case 10: /* AN after L */ - /* AN numbers between L text on both sides may be trouble. */ - /* tentatively bracket with LRMs; will be confirmed if followed by L */ - addPoint(pBiDi, start0, LRM_BEFORE); /* add LRM before */ - addPoint(pBiDi, start0, LRM_AFTER); /* add LRM after */ - break; - - case 11: /* R after L+ON/EN/AN */ - /* false alert, infirm LRMs around previous AN */ - pInsertPoints=&(pBiDi->insertPoints); - pInsertPoints->size=pInsertPoints->confirmed; - if (_prop == DirProp_S) /* add RLM before S */ - { - addPoint(pBiDi, start0, RLM_BEFORE); - pInsertPoints->confirmed=pInsertPoints->size; - } - break; - - case 12: /* L after L+ON/AN */ - level=pLevState->runLevel + addLevel; - for(k=pLevState->startON; kinsertPoints); - pInsertPoints->confirmed=pInsertPoints->size; /* confirm inserts */ - pLevState->startON=start0; - break; - - case 13: /* L after L+ON+EN/AN/ON */ - level=pLevState->runLevel; - for(k=start0-1; k>=pLevState->startON; k--) { - if(levels[k]==level+3) { - while(levels[k]==level+3) { - levels[k--]-=2; - } - while(levels[k]==level) { - k--; - } - } - if(levels[k]==level+2) { - levels[k]=level; - continue; - } - levels[k]=level+1; - } - break; - - case 14: /* R after L+ON+EN/AN/ON */ - level=pLevState->runLevel+1; - for(k=start0-1; k>=pLevState->startON; k--) { - if(levels[k]>level) { - levels[k]-=2; - } - } - break; - - default: /* we should never get here */ - U_ASSERT(FALSE); - break; - } - } - if((addLevel) || (start < start0)) { - level=pLevState->runLevel + addLevel; - if(start>=pLevState->runStart) { - for(k=start; kprologue; - int32_t length=pBiDi->proLength; - int32_t i; - UChar32 uchar; - DirProp dirProp; - for(i=length; i>0; ) { - /* i is decremented by U16_PREV */ - U16_PREV(text, 0, i, uchar); - dirProp=(DirProp)ubidi_getCustomizedClass(pBiDi, uchar); - if(dirProp==L) { - return DirProp_L; - } - if(dirProp==R || dirProp==AL) { - return DirProp_R; - } - if(dirProp==B) { - return DirProp_ON; - } - } - return DirProp_ON; -} - -/** - * Returns the directionality of the first strong character, or digit, in the epilogue, if any. - * Requires epilogue!=null. - */ -static DirProp -firstL_R_AL_EN_AN(UBiDi *pBiDi) { - const UChar *text=pBiDi->epilogue; - int32_t length=pBiDi->epiLength; - int32_t i; - UChar32 uchar; - DirProp dirProp; - for(i=0; idirProps; - DirProp dirProp; - LevState levState; - int32_t i, start1, start2; - uint16_t oldStateImp, stateImp, actionImp; - uint8_t gprop, resProp, cell; - UBool inverseRTL; - DirProp nextStrongProp=R; - int32_t nextStrongPos=-1; - - /* check for RTL inverse BiDi mode */ - /* FOOD FOR THOUGHT: in case of RTL inverse BiDi, it would make sense to - * loop on the text characters from end to start. - * This would need a different properties state table (at least different - * actions) and different levels state tables (maybe very similar to the - * LTR corresponding ones. - */ - inverseRTL=(UBool) - ((startlastArabicPos) && (GET_PARALEVEL(pBiDi, start) & 1) && - (pBiDi->reorderingMode==UBIDI_REORDER_INVERSE_LIKE_DIRECT || - pBiDi->reorderingMode==UBIDI_REORDER_INVERSE_FOR_NUMBERS_SPECIAL)); - - /* initialize for property and levels state tables */ - levState.startL2EN=-1; /* used for INVERSE_LIKE_DIRECT_WITH_MARKS */ - levState.lastStrongRTL=-1; /* used for INVERSE_LIKE_DIRECT_WITH_MARKS */ - levState.runStart=start; - levState.runLevel=pBiDi->levels[start]; - levState.pImpTab=(const ImpTab*)((pBiDi->pImpTabPair)->pImpTab)[levState.runLevel&1]; - levState.pImpAct=(const ImpAct*)((pBiDi->pImpTabPair)->pImpAct)[levState.runLevel&1]; - if(start==0 && pBiDi->proLength>0) { - DirProp lastStrong=lastL_R_AL(pBiDi); - if(lastStrong!=DirProp_ON) { - sor=lastStrong; - } - } - /* The isolates[] entries contain enough information to - resume the bidi algorithm in the same state as it was - when it was interrupted by an isolate sequence. */ - if(dirProps[start]==PDI && pBiDi->isolateCount >= 0) { - levState.startON=pBiDi->isolates[pBiDi->isolateCount].startON; - start1=pBiDi->isolates[pBiDi->isolateCount].start1; - stateImp=pBiDi->isolates[pBiDi->isolateCount].stateImp; - levState.state=pBiDi->isolates[pBiDi->isolateCount].state; - pBiDi->isolateCount--; - } else { - levState.startON=-1; - start1=start; - if(dirProps[start]==NSM) - stateImp = 1 + sor; - else - stateImp=0; - levState.state=0; - processPropertySeq(pBiDi, &levState, sor, start, start); - } - start2=start; /* to make Java compiler happy */ - - for(i=start; i<=limit; i++) { - if(i>=limit) { - int32_t k; - for(k=limit-1; k>start&&(DIRPROP_FLAG(dirProps[k])&MASK_BN_EXPLICIT); k--); - dirProp=dirProps[k]; - if(dirProp==LRI || dirProp==RLI) - break; /* no forced closing for sequence ending with LRI/RLI */ - gprop=eor; - } else { - DirProp prop, prop1; - prop=dirProps[i]; - if(prop==B) { - pBiDi->isolateCount=-1; /* current isolates stack entry == none */ - } - if(inverseRTL) { - if(prop==AL) { - /* AL before EN does not make it AN */ - prop=R; - } else if(prop==EN) { - if(nextStrongPos<=i) { - /* look for next strong char (L/R/AL) */ - int32_t j; - nextStrongProp=R; /* set default */ - nextStrongPos=limit; - for(j=i+1; jlength && pBiDi->epiLength>0) { - DirProp firstStrong=firstL_R_AL_EN_AN(pBiDi); - if(firstStrong!=DirProp_ON) { - eor=firstStrong; - } - } - - /* look for the last char not a BN or LRE/RLE/LRO/RLO/PDF */ - for(i=limit-1; i>start&&(DIRPROP_FLAG(dirProps[i])&MASK_BN_EXPLICIT); i--); - dirProp=dirProps[i]; - if((dirProp==LRI || dirProp==RLI) && limitlength) { - pBiDi->isolateCount++; - pBiDi->isolates[pBiDi->isolateCount].stateImp=stateImp; - pBiDi->isolates[pBiDi->isolateCount].state=levState.state; - pBiDi->isolates[pBiDi->isolateCount].start1=start1; - pBiDi->isolates[pBiDi->isolateCount].startON=levState.startON; - } - else - processPropertySeq(pBiDi, &levState, eor, limit, limit); -} - -/* perform (L1) and (X9) ---------------------------------------------------- */ - -/* - * Reset the embedding levels for some non-graphic characters (L1). - * This function also sets appropriate levels for BN, and - * explicit embedding types that are supposed to have been removed - * from the paragraph in (X9). - */ -static void -adjustWSLevels(UBiDi *pBiDi) { - const DirProp *dirProps=pBiDi->dirProps; - UBiDiLevel *levels=pBiDi->levels; - int32_t i; - - if(pBiDi->flags&MASK_WS) { - UBool orderParagraphsLTR=pBiDi->orderParagraphsLTR; - Flags flag; - - i=pBiDi->trailingWSStart; - while(i>0) { - /* reset a sequence of WS/BN before eop and B/S to the paragraph paraLevel */ - while(i>0 && (flag=DIRPROP_FLAG(dirProps[--i]))&MASK_WS) { - if(orderParagraphsLTR&&(flag&DIRPROP_FLAG(B))) { - levels[i]=0; - } else { - levels[i]=GET_PARALEVEL(pBiDi, i); - } - } - - /* reset BN to the next character's paraLevel until B/S, which restarts above loop */ - /* here, i+1 is guaranteed to be 0) { - flag=DIRPROP_FLAG(dirProps[--i]); - if(flag&MASK_BN_EXPLICIT) { - levels[i]=levels[i+1]; - } else if(orderParagraphsLTR&&(flag&DIRPROP_FLAG(B))) { - levels[i]=0; - break; - } else if(flag&MASK_B_S) { - levels[i]=GET_PARALEVEL(pBiDi, i); - break; - } - } - } - } -} - -U_CAPI void U_EXPORT2 -ubidi_setContext(UBiDi *pBiDi, - const UChar *prologue, int32_t proLength, - const UChar *epilogue, int32_t epiLength, - UErrorCode *pErrorCode) { - /* check the argument values */ - RETURN_VOID_IF_NULL_OR_FAILING_ERRCODE(pErrorCode); - if(pBiDi==NULL || proLength<-1 || epiLength<-1 || - (prologue==NULL && proLength!=0) || (epilogue==NULL && epiLength!=0)) { - *pErrorCode=U_ILLEGAL_ARGUMENT_ERROR; - return; - } - - if(proLength==-1) { - pBiDi->proLength=u_strlen(prologue); - } else { - pBiDi->proLength=proLength; - } - if(epiLength==-1) { - pBiDi->epiLength=u_strlen(epilogue); - } else { - pBiDi->epiLength=epiLength; - } - pBiDi->prologue=prologue; - pBiDi->epilogue=epilogue; -} - -static void -setParaSuccess(UBiDi *pBiDi) { - pBiDi->proLength=0; /* forget the last context */ - pBiDi->epiLength=0; - pBiDi->pParaBiDi=pBiDi; /* mark successful setPara */ -} - -#define BIDI_MIN(x, y) ((x)<(y) ? (x) : (y)) -#define BIDI_ABS(x) ((x)>=0 ? (x) : (-(x))) - -static void -setParaRunsOnly(UBiDi *pBiDi, const UChar *text, int32_t length, - UBiDiLevel paraLevel, UErrorCode *pErrorCode) { - void *runsOnlyMemory = NULL; - int32_t *visualMap; - UChar *visualText; - int32_t saveLength, saveTrailingWSStart; - const UBiDiLevel *levels; - UBiDiLevel *saveLevels; - UBiDiDirection saveDirection; - UBool saveMayAllocateText; - Run *runs; - int32_t visualLength, i, j, visualStart, logicalStart, - runCount, runLength, addedRuns, insertRemove, - start, limit, step, indexOddBit, logicalPos, - index0, index1; - uint32_t saveOptions; - - pBiDi->reorderingMode=UBIDI_REORDER_DEFAULT; - if(length==0) { - ubidi_setPara(pBiDi, text, length, paraLevel, NULL, pErrorCode); - goto cleanup3; - } - /* obtain memory for mapping table and visual text */ - runsOnlyMemory=uprv_malloc(length*(sizeof(int32_t)+sizeof(UChar)+sizeof(UBiDiLevel))); - if(runsOnlyMemory==NULL) { - *pErrorCode=U_MEMORY_ALLOCATION_ERROR; - goto cleanup3; - } - visualMap=runsOnlyMemory; - visualText=(UChar *)&visualMap[length]; - saveLevels=(UBiDiLevel *)&visualText[length]; - saveOptions=pBiDi->reorderingOptions; - if(saveOptions & UBIDI_OPTION_INSERT_MARKS) { - pBiDi->reorderingOptions&=~UBIDI_OPTION_INSERT_MARKS; - pBiDi->reorderingOptions|=UBIDI_OPTION_REMOVE_CONTROLS; - } - paraLevel&=1; /* accept only 0 or 1 */ - ubidi_setPara(pBiDi, text, length, paraLevel, NULL, pErrorCode); - if(U_FAILURE(*pErrorCode)) { - goto cleanup3; - } - /* we cannot access directly pBiDi->levels since it is not yet set if - * direction is not MIXED - */ - levels=ubidi_getLevels(pBiDi, pErrorCode); - uprv_memcpy(saveLevels, levels, (size_t)pBiDi->length*sizeof(UBiDiLevel)); - saveTrailingWSStart=pBiDi->trailingWSStart; - saveLength=pBiDi->length; - saveDirection=pBiDi->direction; - - /* FOOD FOR THOUGHT: instead of writing the visual text, we could use - * the visual map and the dirProps array to drive the second call - * to ubidi_setPara (but must make provision for possible removal of - * BiDi controls. Alternatively, only use the dirProps array via - * customized classifier callback. - */ - visualLength=ubidi_writeReordered(pBiDi, visualText, length, - UBIDI_DO_MIRRORING, pErrorCode); - ubidi_getVisualMap(pBiDi, visualMap, pErrorCode); - if(U_FAILURE(*pErrorCode)) { - goto cleanup2; - } - pBiDi->reorderingOptions=saveOptions; - - pBiDi->reorderingMode=UBIDI_REORDER_INVERSE_LIKE_DIRECT; - paraLevel^=1; - /* Because what we did with reorderingOptions, visualText may be shorter - * than the original text. But we don't want the levels memory to be - * reallocated shorter than the original length, since we need to restore - * the levels as after the first call to ubidi_setpara() before returning. - * We will force mayAllocateText to FALSE before the second call to - * ubidi_setpara(), and will restore it afterwards. - */ - saveMayAllocateText=pBiDi->mayAllocateText; - pBiDi->mayAllocateText=FALSE; - ubidi_setPara(pBiDi, visualText, visualLength, paraLevel, NULL, pErrorCode); - pBiDi->mayAllocateText=saveMayAllocateText; - ubidi_getRuns(pBiDi, pErrorCode); - if(U_FAILURE(*pErrorCode)) { - goto cleanup1; - } - /* check if some runs must be split, count how many splits */ - addedRuns=0; - runCount=pBiDi->runCount; - runs=pBiDi->runs; - visualStart=0; - for(i=0; irunsMemory[0]=runs[0]; - } - runs=pBiDi->runs=pBiDi->runsMemory; - pBiDi->runCount+=addedRuns; - } else { - goto cleanup1; - } - } - /* split runs which are not consecutive in source text */ - for(i=runCount-1; i>=0; i--) { - runLength= i==0 ? runs[0].visualLimit : - runs[i].visualLimit-runs[i-1].visualLimit; - logicalStart=runs[i].logicalStart; - indexOddBit=GET_ODD_BIT(logicalStart); - logicalStart=GET_INDEX(logicalStart); - if(runLength<2) { - if(addedRuns) { - runs[i+addedRuns]=runs[i]; - } - logicalPos=visualMap[logicalStart]; - runs[i+addedRuns].logicalStart=MAKE_INDEX_ODD_PAIR(logicalPos, - saveLevels[logicalPos]^indexOddBit); - continue; - } - if(indexOddBit) { - start=logicalStart; - limit=logicalStart+runLength-1; - step=1; - } else { - start=logicalStart+runLength-1; - limit=logicalStart; - step=-1; - } - for(j=start; j!=limit; j+=step) { - index0=visualMap[j]; - index1=visualMap[j+step]; - if((BIDI_ABS(index0-index1)!=1) || (saveLevels[index0]!=saveLevels[index1])) { - logicalPos=BIDI_MIN(visualMap[start], index0); - runs[i+addedRuns].logicalStart=MAKE_INDEX_ODD_PAIR(logicalPos, - saveLevels[logicalPos]^indexOddBit); - runs[i+addedRuns].visualLimit=runs[i].visualLimit; - runs[i].visualLimit-=BIDI_ABS(j-start)+1; - insertRemove=runs[i].insertRemove&(LRM_AFTER|RLM_AFTER); - runs[i+addedRuns].insertRemove=insertRemove; - runs[i].insertRemove&=~insertRemove; - start=j+step; - addedRuns--; - } - } - if(addedRuns) { - runs[i+addedRuns]=runs[i]; - } - logicalPos=BIDI_MIN(visualMap[start], visualMap[limit]); - runs[i+addedRuns].logicalStart=MAKE_INDEX_ODD_PAIR(logicalPos, - saveLevels[logicalPos]^indexOddBit); - } - - cleanup1: - /* restore initial paraLevel */ - pBiDi->paraLevel^=1; - cleanup2: - /* restore real text */ - pBiDi->text=text; - pBiDi->length=saveLength; - pBiDi->originalLength=length; - pBiDi->direction=saveDirection; - /* the saved levels should never excess levelsSize, but we check anyway */ - if(saveLength>pBiDi->levelsSize) { - saveLength=pBiDi->levelsSize; - } - uprv_memcpy(pBiDi->levels, saveLevels, (size_t)saveLength*sizeof(UBiDiLevel)); - pBiDi->trailingWSStart=saveTrailingWSStart; - if(pBiDi->runCount>1) { - pBiDi->direction=UBIDI_MIXED; - } - cleanup3: - /* free memory for mapping table and visual text */ - uprv_free(runsOnlyMemory); - - pBiDi->reorderingMode=UBIDI_REORDER_RUNS_ONLY; -} - -/* ubidi_setPara ------------------------------------------------------------ */ - -U_CAPI void U_EXPORT2 -ubidi_setPara(UBiDi *pBiDi, const UChar *text, int32_t length, - UBiDiLevel paraLevel, UBiDiLevel *embeddingLevels, - UErrorCode *pErrorCode) { - UBiDiDirection direction; - DirProp *dirProps; - - /* check the argument values */ - RETURN_VOID_IF_NULL_OR_FAILING_ERRCODE(pErrorCode); - if(pBiDi==NULL || text==NULL || length<-1 || - (paraLevel>UBIDI_MAX_EXPLICIT_LEVEL && paraLevelreorderingMode==UBIDI_REORDER_RUNS_ONLY) { - setParaRunsOnly(pBiDi, text, length, paraLevel, pErrorCode); - return; - } - - /* initialize the UBiDi structure */ - pBiDi->pParaBiDi=NULL; /* mark unfinished setPara */ - pBiDi->text=text; - pBiDi->length=pBiDi->originalLength=pBiDi->resultLength=length; - pBiDi->paraLevel=paraLevel; - pBiDi->direction=paraLevel&1; - pBiDi->paraCount=1; - - pBiDi->dirProps=NULL; - pBiDi->levels=NULL; - pBiDi->runs=NULL; - pBiDi->insertPoints.size=0; /* clean up from last call */ - pBiDi->insertPoints.confirmed=0; /* clean up from last call */ - - /* - * Save the original paraLevel if contextual; otherwise, set to 0. - */ - pBiDi->defaultParaLevel=IS_DEFAULT_LEVEL(paraLevel); - - if(length==0) { - /* - * For an empty paragraph, create a UBiDi object with the paraLevel and - * the flags and the direction set but without allocating zero-length arrays. - * There is nothing more to do. - */ - if(IS_DEFAULT_LEVEL(paraLevel)) { - pBiDi->paraLevel&=1; - pBiDi->defaultParaLevel=0; - } - pBiDi->flags=DIRPROP_FLAG_LR(paraLevel); - pBiDi->runCount=0; - pBiDi->paraCount=0; - setParaSuccess(pBiDi); /* mark successful setPara */ - return; - } - - pBiDi->runCount=-1; - - /* allocate paras memory */ - if(pBiDi->parasMemory) - pBiDi->paras=pBiDi->parasMemory; - else - pBiDi->paras=pBiDi->simpleParas; - - /* - * Get the directional properties, - * the flags bit-set, and - * determine the paragraph level if necessary. - */ - if(getDirPropsMemory(pBiDi, length)) { - pBiDi->dirProps=pBiDi->dirPropsMemory; - if(!getDirProps(pBiDi)) { - *pErrorCode=U_MEMORY_ALLOCATION_ERROR; - return; - } - } else { - *pErrorCode=U_MEMORY_ALLOCATION_ERROR; - return; - } - dirProps=pBiDi->dirProps; - /* the processed length may have changed if UBIDI_OPTION_STREAMING */ - length= pBiDi->length; - pBiDi->trailingWSStart=length; /* the levels[] will reflect the WS run */ - - /* are explicit levels specified? */ - if(embeddingLevels==NULL) { - /* no: determine explicit levels according to the (Xn) rules */\ - if(getLevelsMemory(pBiDi, length)) { - pBiDi->levels=pBiDi->levelsMemory; - direction=resolveExplicitLevels(pBiDi, pErrorCode); - if(U_FAILURE(*pErrorCode)) { - return; - } - } else { - *pErrorCode=U_MEMORY_ALLOCATION_ERROR; - return; - } - } else { - /* set BN for all explicit codes, check that all levels are 0 or paraLevel..UBIDI_MAX_EXPLICIT_LEVEL */ - pBiDi->levels=embeddingLevels; - direction=checkExplicitLevels(pBiDi, pErrorCode); - if(U_FAILURE(*pErrorCode)) { - return; - } - } - - /* allocate isolate memory */ - if(pBiDi->isolateCount<=SIMPLE_ISOLATES_COUNT) - pBiDi->isolates=pBiDi->simpleIsolates; - else - if((int32_t)(pBiDi->isolateCount*sizeof(Isolate))<=pBiDi->isolatesSize) - pBiDi->isolates=pBiDi->isolatesMemory; - else { - if(getInitialIsolatesMemory(pBiDi, pBiDi->isolateCount)) { - pBiDi->isolates=pBiDi->isolatesMemory; - } else { - *pErrorCode=U_MEMORY_ALLOCATION_ERROR; - return; - } - } - pBiDi->isolateCount=-1; /* current isolates stack entry == none */ - - /* - * The steps after (X9) in the UBiDi algorithm are performed only if - * the paragraph text has mixed directionality! - */ - pBiDi->direction=direction; - switch(direction) { - case UBIDI_LTR: - /* all levels are implicitly at paraLevel (important for ubidi_getLevels()) */ - pBiDi->trailingWSStart=0; - break; - case UBIDI_RTL: - /* all levels are implicitly at paraLevel (important for ubidi_getLevels()) */ - pBiDi->trailingWSStart=0; - break; - default: - /* - * Choose the right implicit state table - */ - switch(pBiDi->reorderingMode) { - case UBIDI_REORDER_DEFAULT: - pBiDi->pImpTabPair=&impTab_DEFAULT; - break; - case UBIDI_REORDER_NUMBERS_SPECIAL: - pBiDi->pImpTabPair=&impTab_NUMBERS_SPECIAL; - break; - case UBIDI_REORDER_GROUP_NUMBERS_WITH_R: - pBiDi->pImpTabPair=&impTab_GROUP_NUMBERS_WITH_R; - break; - case UBIDI_REORDER_INVERSE_NUMBERS_AS_L: - pBiDi->pImpTabPair=&impTab_INVERSE_NUMBERS_AS_L; - break; - case UBIDI_REORDER_INVERSE_LIKE_DIRECT: - if (pBiDi->reorderingOptions & UBIDI_OPTION_INSERT_MARKS) { - pBiDi->pImpTabPair=&impTab_INVERSE_LIKE_DIRECT_WITH_MARKS; - } else { - pBiDi->pImpTabPair=&impTab_INVERSE_LIKE_DIRECT; - } - break; - case UBIDI_REORDER_INVERSE_FOR_NUMBERS_SPECIAL: - if (pBiDi->reorderingOptions & UBIDI_OPTION_INSERT_MARKS) { - pBiDi->pImpTabPair=&impTab_INVERSE_FOR_NUMBERS_SPECIAL_WITH_MARKS; - } else { - pBiDi->pImpTabPair=&impTab_INVERSE_FOR_NUMBERS_SPECIAL; - } - break; - default: - /* we should never get here */ - U_ASSERT(FALSE); - break; - } - /* - * If there are no external levels specified and there - * are no significant explicit level codes in the text, - * then we can treat the entire paragraph as one run. - * Otherwise, we need to perform the following rules on runs of - * the text with the same embedding levels. (X10) - * "Significant" explicit level codes are ones that actually - * affect non-BN characters. - * Examples for "insignificant" ones are empty embeddings - * LRE-PDF, LRE-RLE-PDF-PDF, etc. - */ - if(embeddingLevels==NULL && pBiDi->paraCount<=1 && - !(pBiDi->flags&DIRPROP_FLAG_MULTI_RUNS)) { - resolveImplicitLevels(pBiDi, 0, length, - GET_LR_FROM_LEVEL(GET_PARALEVEL(pBiDi, 0)), - GET_LR_FROM_LEVEL(GET_PARALEVEL(pBiDi, length-1))); - } else { - /* sor, eor: start and end types of same-level-run */ - UBiDiLevel *levels=pBiDi->levels; - int32_t start, limit=0; - UBiDiLevel level, nextLevel; - DirProp sor, eor; - - /* determine the first sor and set eor to it because of the loop body (sor=eor there) */ - level=GET_PARALEVEL(pBiDi, 0); - nextLevel=levels[0]; - if(level0) && (dirProps[start-1]==B)) { - /* except if this is a new paragraph, then set sor = para level */ - sor=GET_LR_FROM_LEVEL(GET_PARALEVEL(pBiDi, start)); - } else { - sor=eor; - } - - /* search for the limit of this run */ - while((++limitinsertPoints.errorCode)) - { - *pErrorCode=pBiDi->insertPoints.errorCode; - return; - } - /* reset the embedding levels for some non-graphic characters (L1), (X9) */ - adjustWSLevels(pBiDi); - break; - } - /* add RLM for inverse Bidi with contextual orientation resolving - * to RTL which would not round-trip otherwise - */ - if((pBiDi->defaultParaLevel>0) && - (pBiDi->reorderingOptions & UBIDI_OPTION_INSERT_MARKS) && - ((pBiDi->reorderingMode==UBIDI_REORDER_INVERSE_LIKE_DIRECT) || - (pBiDi->reorderingMode==UBIDI_REORDER_INVERSE_FOR_NUMBERS_SPECIAL))) { - int32_t i, j, start, last; - UBiDiLevel level; - DirProp dirProp; - for(i=0; iparaCount; i++) { - last=(pBiDi->paras[i].limit)-1; - level=pBiDi->paras[i].level; - if(level==0) - continue; /* LTR paragraph */ - start= i==0 ? 0 : pBiDi->paras[i-1].limit; - for(j=last; j>=start; j--) { - dirProp=dirProps[j]; - if(dirProp==L) { - if(jreorderingOptions & UBIDI_OPTION_REMOVE_CONTROLS) { - pBiDi->resultLength -= pBiDi->controlCount; - } else { - pBiDi->resultLength += pBiDi->insertPoints.size; - } - setParaSuccess(pBiDi); /* mark successful setPara */ -} - -U_CAPI void U_EXPORT2 -ubidi_orderParagraphsLTR(UBiDi *pBiDi, UBool orderParagraphsLTR) { - if(pBiDi!=NULL) { - pBiDi->orderParagraphsLTR=orderParagraphsLTR; - } -} - -U_CAPI UBool U_EXPORT2 -ubidi_isOrderParagraphsLTR(UBiDi *pBiDi) { - if(pBiDi!=NULL) { - return pBiDi->orderParagraphsLTR; - } else { - return FALSE; - } -} - -U_CAPI UBiDiDirection U_EXPORT2 -ubidi_getDirection(const UBiDi *pBiDi) { - if(IS_VALID_PARA_OR_LINE(pBiDi)) { - return pBiDi->direction; - } else { - return UBIDI_LTR; - } -} - -U_CAPI const UChar * U_EXPORT2 -ubidi_getText(const UBiDi *pBiDi) { - if(IS_VALID_PARA_OR_LINE(pBiDi)) { - return pBiDi->text; - } else { - return NULL; - } -} - -U_CAPI int32_t U_EXPORT2 -ubidi_getLength(const UBiDi *pBiDi) { - if(IS_VALID_PARA_OR_LINE(pBiDi)) { - return pBiDi->originalLength; - } else { - return 0; - } -} - -U_CAPI int32_t U_EXPORT2 -ubidi_getProcessedLength(const UBiDi *pBiDi) { - if(IS_VALID_PARA_OR_LINE(pBiDi)) { - return pBiDi->length; - } else { - return 0; - } -} - -U_CAPI int32_t U_EXPORT2 -ubidi_getResultLength(const UBiDi *pBiDi) { - if(IS_VALID_PARA_OR_LINE(pBiDi)) { - return pBiDi->resultLength; - } else { - return 0; - } -} - -/* paragraphs API functions ------------------------------------------------- */ - -U_CAPI UBiDiLevel U_EXPORT2 -ubidi_getParaLevel(const UBiDi *pBiDi) { - if(IS_VALID_PARA_OR_LINE(pBiDi)) { - return pBiDi->paraLevel; - } else { - return 0; - } -} - -U_CAPI int32_t U_EXPORT2 -ubidi_countParagraphs(UBiDi *pBiDi) { - if(!IS_VALID_PARA_OR_LINE(pBiDi)) { - return 0; - } else { - return pBiDi->paraCount; - } -} - -U_CAPI void U_EXPORT2 -ubidi_getParagraphByIndex(const UBiDi *pBiDi, int32_t paraIndex, - int32_t *pParaStart, int32_t *pParaLimit, - UBiDiLevel *pParaLevel, UErrorCode *pErrorCode) { - int32_t paraStart; - - /* check the argument values */ - RETURN_VOID_IF_NULL_OR_FAILING_ERRCODE(pErrorCode); - RETURN_VOID_IF_NOT_VALID_PARA_OR_LINE(pBiDi, *pErrorCode); - RETURN_VOID_IF_BAD_RANGE(paraIndex, 0, pBiDi->paraCount, *pErrorCode); - - pBiDi=pBiDi->pParaBiDi; /* get Para object if Line object */ - if(paraIndex) { - paraStart=pBiDi->paras[paraIndex-1].limit; - } else { - paraStart=0; - } - if(pParaStart!=NULL) { - *pParaStart=paraStart; - } - if(pParaLimit!=NULL) { - *pParaLimit=pBiDi->paras[paraIndex].limit; - } - if(pParaLevel!=NULL) { - *pParaLevel=GET_PARALEVEL(pBiDi, paraStart); - } -} - -U_CAPI int32_t U_EXPORT2 -ubidi_getParagraph(const UBiDi *pBiDi, int32_t charIndex, - int32_t *pParaStart, int32_t *pParaLimit, - UBiDiLevel *pParaLevel, UErrorCode *pErrorCode) { - int32_t paraIndex; - - /* check the argument values */ - /* pErrorCode will be checked by the call to ubidi_getParagraphByIndex */ - RETURN_IF_NULL_OR_FAILING_ERRCODE(pErrorCode, -1); - RETURN_IF_NOT_VALID_PARA_OR_LINE(pBiDi, *pErrorCode, -1); - pBiDi=pBiDi->pParaBiDi; /* get Para object if Line object */ - RETURN_IF_BAD_RANGE(charIndex, 0, pBiDi->length, *pErrorCode, -1); - - for(paraIndex=0; charIndex>=pBiDi->paras[paraIndex].limit; paraIndex++); - ubidi_getParagraphByIndex(pBiDi, paraIndex, pParaStart, pParaLimit, pParaLevel, pErrorCode); - return paraIndex; -} - -U_CAPI void U_EXPORT2 -ubidi_setClassCallback(UBiDi *pBiDi, UBiDiClassCallback *newFn, - const void *newContext, UBiDiClassCallback **oldFn, - const void **oldContext, UErrorCode *pErrorCode) -{ - RETURN_VOID_IF_NULL_OR_FAILING_ERRCODE(pErrorCode); - if(pBiDi==NULL) { - *pErrorCode=U_ILLEGAL_ARGUMENT_ERROR; - return; - } - if( oldFn ) - { - *oldFn = pBiDi->fnClassCallback; - } - if( oldContext ) - { - *oldContext = pBiDi->coClassCallback; - } - pBiDi->fnClassCallback = newFn; - pBiDi->coClassCallback = newContext; -} - -U_CAPI void U_EXPORT2 -ubidi_getClassCallback(UBiDi *pBiDi, UBiDiClassCallback **fn, const void **context) -{ - if(pBiDi==NULL) { - return; - } - if( fn ) - { - *fn = pBiDi->fnClassCallback; - } - if( context ) - { - *context = pBiDi->coClassCallback; - } -} - -U_CAPI UCharDirection U_EXPORT2 -ubidi_getCustomizedClass(UBiDi *pBiDi, UChar32 c) -{ - UCharDirection dir; - - if( pBiDi->fnClassCallback == NULL || - (dir = (*pBiDi->fnClassCallback)(pBiDi->coClassCallback, c)) == U_BIDI_CLASS_DEFAULT ) - { - dir = ubidi_getClass(pBiDi->bdp, c); - } - if(dir >= U_CHAR_DIRECTION_COUNT) { - dir = ON; - } - return dir; -} diff --git a/Build/source/libs/icu/icu-src/source/common/ubidi.cpp b/Build/source/libs/icu/icu-src/source/common/ubidi.cpp new file mode 100644 index 00000000000..8e2fc36e5f1 --- /dev/null +++ b/Build/source/libs/icu/icu-src/source/common/ubidi.cpp @@ -0,0 +1,3042 @@ +// © 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html +/* +****************************************************************************** +* +* Copyright (C) 1999-2015, International Business Machines +* Corporation and others. All Rights Reserved. +* +****************************************************************************** +* file name: ubidi.c +* encoding: UTF-8 +* tab size: 8 (not used) +* indentation:4 +* +* created on: 1999jul27 +* created by: Markus W. Scherer, updated by Matitiahu Allouche +* +*/ + +#include "cmemory.h" +#include "unicode/utypes.h" +#include "unicode/ustring.h" +#include "unicode/uchar.h" +#include "unicode/ubidi.h" +#include "unicode/utf16.h" +#include "ubidi_props.h" +#include "ubidiimp.h" +#include "uassert.h" + +/* + * General implementation notes: + * + * Throughout the implementation, there are comments like (W2) that refer to + * rules of the BiDi algorithm, in this example to the second rule of the + * resolution of weak types. + * + * For handling surrogate pairs, where two UChar's form one "abstract" (or UTF-32) + * character according to UTF-16, the second UChar gets the directional property of + * the entire character assigned, while the first one gets a BN, a boundary + * neutral, type, which is ignored by most of the algorithm according to + * rule (X9) and the implementation suggestions of the BiDi algorithm. + * + * Later, adjustWSLevels() will set the level for each BN to that of the + * following character (UChar), which results in surrogate pairs getting the + * same level on each of their surrogates. + * + * In a UTF-8 implementation, the same thing could be done: the last byte of + * a multi-byte sequence would get the "real" property, while all previous + * bytes of that sequence would get BN. + * + * It is not possible to assign all those parts of a character the same real + * property because this would fail in the resolution of weak types with rules + * that look at immediately surrounding types. + * + * As a related topic, this implementation does not remove Boundary Neutral + * types from the input, but ignores them wherever this is relevant. + * For example, the loop for the resolution of the weak types reads + * types until it finds a non-BN. + * Also, explicit embedding codes are neither changed into BN nor removed. + * They are only treated the same way real BNs are. + * As stated before, adjustWSLevels() takes care of them at the end. + * For the purpose of conformance, the levels of all these codes + * do not matter. + * + * Note that this implementation modifies the dirProps + * after the initial setup, when applying X5c (replace FSI by LRI or RLI), + * X6, N0 (replace paired brackets by L or R). + * + * In this implementation, the resolution of weak types (W1 to W6), + * neutrals (N1 and N2), and the assignment of the resolved level (In) + * are all done in one single loop, in resolveImplicitLevels(). + * Changes of dirProp values are done on the fly, without writing + * them back to the dirProps array. + * + * + * This implementation contains code that allows to bypass steps of the + * algorithm that are not needed on the specific paragraph + * in order to speed up the most common cases considerably, + * like text that is entirely LTR, or RTL text without numbers. + * + * Most of this is done by setting a bit for each directional property + * in a flags variable and later checking for whether there are + * any LTR characters or any RTL characters, or both, whether + * there are any explicit embedding codes, etc. + * + * If the (Xn) steps are performed, then the flags are re-evaluated, + * because they will then not contain the embedding codes any more + * and will be adjusted for override codes, so that subsequently + * more bypassing may be possible than what the initial flags suggested. + * + * If the text is not mixed-directional, then the + * algorithm steps for the weak type resolution are not performed, + * and all levels are set to the paragraph level. + * + * If there are no explicit embedding codes, then the (Xn) steps + * are not performed. + * + * If embedding levels are supplied as a parameter, then all + * explicit embedding codes are ignored, and the (Xn) steps + * are not performed. + * + * White Space types could get the level of the run they belong to, + * and are checked with a test of (flags&MASK_EMBEDDING) to + * consider if the paragraph direction should be considered in + * the flags variable. + * + * If there are no White Space types in the paragraph, then + * (L1) is not necessary in adjustWSLevels(). + */ + +/* to avoid some conditional statements, use tiny constant arrays */ +static const Flags flagLR[2]={ DIRPROP_FLAG(L), DIRPROP_FLAG(R) }; +static const Flags flagE[2]={ DIRPROP_FLAG(LRE), DIRPROP_FLAG(RLE) }; +static const Flags flagO[2]={ DIRPROP_FLAG(LRO), DIRPROP_FLAG(RLO) }; + +#define DIRPROP_FLAG_LR(level) flagLR[(level)&1] +#define DIRPROP_FLAG_E(level) flagE[(level)&1] +#define DIRPROP_FLAG_O(level) flagO[(level)&1] + +#define DIR_FROM_STRONG(strong) ((strong)==L ? L : R) + +#define NO_OVERRIDE(level) ((level)&~UBIDI_LEVEL_OVERRIDE) + +/* UBiDi object management -------------------------------------------------- */ + +U_CAPI UBiDi * U_EXPORT2 +ubidi_open(void) +{ + UErrorCode errorCode=U_ZERO_ERROR; + return ubidi_openSized(0, 0, &errorCode); +} + +U_CAPI UBiDi * U_EXPORT2 +ubidi_openSized(int32_t maxLength, int32_t maxRunCount, UErrorCode *pErrorCode) { + UBiDi *pBiDi; + + /* check the argument values */ + if(pErrorCode==NULL || U_FAILURE(*pErrorCode)) { + return NULL; + } else if(maxLength<0 || maxRunCount<0) { + *pErrorCode=U_ILLEGAL_ARGUMENT_ERROR; + return NULL; /* invalid arguments */ + } + + /* allocate memory for the object */ + pBiDi=(UBiDi *)uprv_malloc(sizeof(UBiDi)); + if(pBiDi==NULL) { + *pErrorCode=U_MEMORY_ALLOCATION_ERROR; + return NULL; + } + + /* reset the object, all pointers NULL, all flags FALSE, all sizes 0 */ + uprv_memset(pBiDi, 0, sizeof(UBiDi)); + + /* get BiDi properties */ + pBiDi->bdp=ubidi_getSingleton(); + + /* allocate memory for arrays as requested */ + if(maxLength>0) { + if( !getInitialDirPropsMemory(pBiDi, maxLength) || + !getInitialLevelsMemory(pBiDi, maxLength) + ) { + *pErrorCode=U_MEMORY_ALLOCATION_ERROR; + } + } else { + pBiDi->mayAllocateText=TRUE; + } + + if(maxRunCount>0) { + if(maxRunCount==1) { + /* use simpleRuns[] */ + pBiDi->runsSize=sizeof(Run); + } else if(!getInitialRunsMemory(pBiDi, maxRunCount)) { + *pErrorCode=U_MEMORY_ALLOCATION_ERROR; + } + } else { + pBiDi->mayAllocateRuns=TRUE; + } + + if(U_SUCCESS(*pErrorCode)) { + return pBiDi; + } else { + ubidi_close(pBiDi); + return NULL; + } +} + +/* + * We are allowed to allocate memory if memory==NULL or + * mayAllocate==TRUE for each array that we need. + * We also try to grow memory as needed if we + * allocate it. + * + * Assume sizeNeeded>0. + * If *pMemory!=NULL, then assume *pSize>0. + * + * ### this realloc() may unnecessarily copy the old data, + * which we know we don't need any more; + * is this the best way to do this?? + */ +U_CFUNC UBool +ubidi_getMemory(BidiMemoryForAllocation *bidiMem, int32_t *pSize, UBool mayAllocate, int32_t sizeNeeded) { + void **pMemory = (void **)bidiMem; + /* check for existing memory */ + if(*pMemory==NULL) { + /* we need to allocate memory */ + if(mayAllocate && (*pMemory=uprv_malloc(sizeNeeded))!=NULL) { + *pSize=sizeNeeded; + return TRUE; + } else { + return FALSE; + } + } else { + if(sizeNeeded<=*pSize) { + /* there is already enough memory */ + return TRUE; + } + else if(!mayAllocate) { + /* not enough memory, and we must not allocate */ + return FALSE; + } else { + /* we try to grow */ + void *memory; + /* in most cases, we do not need the copy-old-data part of + * realloc, but it is needed when adding runs using getRunsMemory() + * in setParaRunsOnly() + */ + if((memory=uprv_realloc(*pMemory, sizeNeeded))!=NULL) { + *pMemory=memory; + *pSize=sizeNeeded; + return TRUE; + } else { + /* we failed to grow */ + return FALSE; + } + } + } +} + +U_CAPI void U_EXPORT2 +ubidi_close(UBiDi *pBiDi) { + if(pBiDi!=NULL) { + pBiDi->pParaBiDi=NULL; /* in case one tries to reuse this block */ + if(pBiDi->dirPropsMemory!=NULL) { + uprv_free(pBiDi->dirPropsMemory); + } + if(pBiDi->levelsMemory!=NULL) { + uprv_free(pBiDi->levelsMemory); + } + if(pBiDi->openingsMemory!=NULL) { + uprv_free(pBiDi->openingsMemory); + } + if(pBiDi->parasMemory!=NULL) { + uprv_free(pBiDi->parasMemory); + } + if(pBiDi->runsMemory!=NULL) { + uprv_free(pBiDi->runsMemory); + } + if(pBiDi->isolatesMemory!=NULL) { + uprv_free(pBiDi->isolatesMemory); + } + if(pBiDi->insertPoints.points!=NULL) { + uprv_free(pBiDi->insertPoints.points); + } + + uprv_free(pBiDi); + } +} + +/* set to approximate "inverse BiDi" ---------------------------------------- */ + +U_CAPI void U_EXPORT2 +ubidi_setInverse(UBiDi *pBiDi, UBool isInverse) { + if(pBiDi!=NULL) { + pBiDi->isInverse=isInverse; + pBiDi->reorderingMode = isInverse ? UBIDI_REORDER_INVERSE_NUMBERS_AS_L + : UBIDI_REORDER_DEFAULT; + } +} + +U_CAPI UBool U_EXPORT2 +ubidi_isInverse(UBiDi *pBiDi) { + if(pBiDi!=NULL) { + return pBiDi->isInverse; + } else { + return FALSE; + } +} + +/* FOOD FOR THOUGHT: currently the reordering modes are a mixture of + * algorithm for direct BiDi, algorithm for inverse BiDi and the bizarre + * concept of RUNS_ONLY which is a double operation. + * It could be advantageous to divide this into 3 concepts: + * a) Operation: direct / inverse / RUNS_ONLY + * b) Direct algorithm: default / NUMBERS_SPECIAL / GROUP_NUMBERS_WITH_R + * c) Inverse algorithm: default / INVERSE_LIKE_DIRECT / NUMBERS_SPECIAL + * This would allow combinations not possible today like RUNS_ONLY with + * NUMBERS_SPECIAL. + * Also allow to set INSERT_MARKS for the direct step of RUNS_ONLY and + * REMOVE_CONTROLS for the inverse step. + * Not all combinations would be supported, and probably not all do make sense. + * This would need to document which ones are supported and what are the + * fallbacks for unsupported combinations. + */ +U_CAPI void U_EXPORT2 +ubidi_setReorderingMode(UBiDi *pBiDi, UBiDiReorderingMode reorderingMode) { + if ((pBiDi!=NULL) && (reorderingMode >= UBIDI_REORDER_DEFAULT) + && (reorderingMode < UBIDI_REORDER_COUNT)) { + pBiDi->reorderingMode = reorderingMode; + pBiDi->isInverse = (UBool)(reorderingMode == UBIDI_REORDER_INVERSE_NUMBERS_AS_L); + } +} + +U_CAPI UBiDiReorderingMode U_EXPORT2 +ubidi_getReorderingMode(UBiDi *pBiDi) { + if (pBiDi!=NULL) { + return pBiDi->reorderingMode; + } else { + return UBIDI_REORDER_DEFAULT; + } +} + +U_CAPI void U_EXPORT2 +ubidi_setReorderingOptions(UBiDi *pBiDi, uint32_t reorderingOptions) { + if (reorderingOptions & UBIDI_OPTION_REMOVE_CONTROLS) { + reorderingOptions&=~UBIDI_OPTION_INSERT_MARKS; + } + if (pBiDi!=NULL) { + pBiDi->reorderingOptions=reorderingOptions; + } +} + +U_CAPI uint32_t U_EXPORT2 +ubidi_getReorderingOptions(UBiDi *pBiDi) { + if (pBiDi!=NULL) { + return pBiDi->reorderingOptions; + } else { + return 0; + } +} + +U_CAPI UBiDiDirection U_EXPORT2 +ubidi_getBaseDirection(const UChar *text, +int32_t length){ + + int32_t i; + UChar32 uchar; + UCharDirection dir; + + if( text==NULL || length<-1 ){ + return UBIDI_NEUTRAL; + } + + if(length==-1) { + length=u_strlen(text); + } + + for( i = 0 ; i < length; ) { + /* i is incremented by U16_NEXT */ + U16_NEXT(text, i, length, uchar); + dir = u_charDirection(uchar); + if( dir == U_LEFT_TO_RIGHT ) + return UBIDI_LTR; + if( dir == U_RIGHT_TO_LEFT || dir ==U_RIGHT_TO_LEFT_ARABIC ) + return UBIDI_RTL; + } + return UBIDI_NEUTRAL; +} + +/* perform (P2)..(P3) ------------------------------------------------------- */ + +/** + * Returns the directionality of the first strong character + * after the last B in prologue, if any. + * Requires prologue!=null. + */ +static DirProp +firstL_R_AL(UBiDi *pBiDi) { + const UChar *text=pBiDi->prologue; + int32_t length=pBiDi->proLength; + int32_t i; + UChar32 uchar; + DirProp dirProp, result=ON; + for(i=0; iparas + */ +static UBool +checkParaCount(UBiDi *pBiDi) { + int32_t count=pBiDi->paraCount; + if(pBiDi->paras==pBiDi->simpleParas) { + if(count<=SIMPLE_PARAS_COUNT) + return TRUE; + if(!getInitialParasMemory(pBiDi, SIMPLE_PARAS_COUNT * 2)) + return FALSE; + pBiDi->paras=pBiDi->parasMemory; + uprv_memcpy(pBiDi->parasMemory, pBiDi->simpleParas, SIMPLE_PARAS_COUNT * sizeof(Para)); + return TRUE; + } + if(!getInitialParasMemory(pBiDi, count * 2)) + return FALSE; + pBiDi->paras=pBiDi->parasMemory; + return TRUE; +} + +/* + * Get the directional properties for the text, calculate the flags bit-set, and + * determine the paragraph level if necessary (in pBiDi->paras[i].level). + * FSI initiators are also resolved and their dirProp replaced with LRI or RLI. + * When encountering an FSI, it is initially replaced with an LRI, which is the + * default. Only if a strong R or AL is found within its scope will the LRI be + * replaced by an RLI. + */ +static UBool +getDirProps(UBiDi *pBiDi) { + const UChar *text=pBiDi->text; + DirProp *dirProps=pBiDi->dirPropsMemory; /* pBiDi->dirProps is const */ + + int32_t i=0, originalLength=pBiDi->originalLength; + Flags flags=0; /* collect all directionalities in the text */ + UChar32 uchar; + DirProp dirProp=0, defaultParaLevel=0; /* initialize to avoid compiler warnings */ + UBool isDefaultLevel=IS_DEFAULT_LEVEL(pBiDi->paraLevel); + /* for inverse BiDi, the default para level is set to RTL if there is a + strong R or AL character at either end of the text */ + UBool isDefaultLevelInverse=isDefaultLevel && (UBool) + (pBiDi->reorderingMode==UBIDI_REORDER_INVERSE_LIKE_DIRECT || + pBiDi->reorderingMode==UBIDI_REORDER_INVERSE_FOR_NUMBERS_SPECIAL); + int32_t lastArabicPos=-1; + int32_t controlCount=0; + UBool removeBiDiControls = (UBool)(pBiDi->reorderingOptions & + UBIDI_OPTION_REMOVE_CONTROLS); + + enum State { + NOT_SEEKING_STRONG, /* 0: not contextual paraLevel, not after FSI */ + SEEKING_STRONG_FOR_PARA, /* 1: looking for first strong char in para */ + SEEKING_STRONG_FOR_FSI, /* 2: looking for first strong after FSI */ + LOOKING_FOR_PDI /* 3: found strong after FSI, looking for PDI */ + }; + State state; + DirProp lastStrong=ON; /* for default level & inverse BiDi */ + /* The following stacks are used to manage isolate sequences. Those + sequences may be nested, but obviously never more deeply than the + maximum explicit embedding level. + lastStack is the index of the last used entry in the stack. A value of -1 + means that there is no open isolate sequence. + lastStack is reset to -1 on paragraph boundaries. */ + /* The following stack contains the position of the initiator of + each open isolate sequence */ + int32_t isolateStartStack[UBIDI_MAX_EXPLICIT_LEVEL+1]; + /* The following stack contains the last known state before + encountering the initiator of an isolate sequence */ + State previousStateStack[UBIDI_MAX_EXPLICIT_LEVEL+1]; + int32_t stackLast=-1; + + if(pBiDi->reorderingOptions & UBIDI_OPTION_STREAMING) + pBiDi->length=0; + defaultParaLevel=pBiDi->paraLevel&1; + if(isDefaultLevel) { + pBiDi->paras[0].level=defaultParaLevel; + lastStrong=defaultParaLevel; + if(pBiDi->proLength>0 && /* there is a prologue */ + (dirProp=firstL_R_AL(pBiDi))!=ON) { /* with a strong character */ + if(dirProp==L) + pBiDi->paras[0].level=0; /* set the default para level */ + else + pBiDi->paras[0].level=1; /* set the default para level */ + state=NOT_SEEKING_STRONG; + } else { + state=SEEKING_STRONG_FOR_PARA; + } + } else { + pBiDi->paras[0].level=pBiDi->paraLevel; + state=NOT_SEEKING_STRONG; + } + /* count paragraphs and determine the paragraph level (P2..P3) */ + /* + * see comment in ubidi.h: + * the UBIDI_DEFAULT_XXX values are designed so that + * their bit 0 alone yields the intended default + */ + for( /* i=0 above */ ; i0xffff) { /* set the lead surrogate's property to BN */ + flags|=DIRPROP_FLAG(BN); + dirProps[i-2]=BN; + } + if(removeBiDiControls && IS_BIDI_CONTROL_CHAR(uchar)) + controlCount++; + if(dirProp==L) { + if(state==SEEKING_STRONG_FOR_PARA) { + pBiDi->paras[pBiDi->paraCount-1].level=0; + state=NOT_SEEKING_STRONG; + } + else if(state==SEEKING_STRONG_FOR_FSI) { + if(stackLast<=UBIDI_MAX_EXPLICIT_LEVEL) { + /* no need for next statement, already set by default */ + /* dirProps[isolateStartStack[stackLast]]=LRI; */ + flags|=DIRPROP_FLAG(LRI); + } + state=LOOKING_FOR_PDI; + } + lastStrong=L; + continue; + } + if(dirProp==R || dirProp==AL) { + if(state==SEEKING_STRONG_FOR_PARA) { + pBiDi->paras[pBiDi->paraCount-1].level=1; + state=NOT_SEEKING_STRONG; + } + else if(state==SEEKING_STRONG_FOR_FSI) { + if(stackLast<=UBIDI_MAX_EXPLICIT_LEVEL) { + dirProps[isolateStartStack[stackLast]]=RLI; + flags|=DIRPROP_FLAG(RLI); + } + state=LOOKING_FOR_PDI; + } + lastStrong=R; + if(dirProp==AL) + lastArabicPos=i-1; + continue; + } + if(dirProp>=FSI && dirProp<=RLI) { /* FSI, LRI or RLI */ + stackLast++; + if(stackLast<=UBIDI_MAX_EXPLICIT_LEVEL) { + isolateStartStack[stackLast]=i-1; + previousStateStack[stackLast]=state; + } + if(dirProp==FSI) { + dirProps[i-1]=LRI; /* default if no strong char */ + state=SEEKING_STRONG_FOR_FSI; + } + else + state=LOOKING_FOR_PDI; + continue; + } + if(dirProp==PDI) { + if(state==SEEKING_STRONG_FOR_FSI) { + if(stackLast<=UBIDI_MAX_EXPLICIT_LEVEL) { + /* no need for next statement, already set by default */ + /* dirProps[isolateStartStack[stackLast]]=LRI; */ + flags|=DIRPROP_FLAG(LRI); + } + } + if(stackLast>=0) { + if(stackLast<=UBIDI_MAX_EXPLICIT_LEVEL) + state=previousStateStack[stackLast]; + stackLast--; + } + continue; + } + if(dirProp==B) { + if(iparas[pBiDi->paraCount-1].limit=i; + if(isDefaultLevelInverse && lastStrong==R) + pBiDi->paras[pBiDi->paraCount-1].level=1; + if(pBiDi->reorderingOptions & UBIDI_OPTION_STREAMING) { + /* When streaming, we only process whole paragraphs + thus some updates are only done on paragraph boundaries */ + pBiDi->length=i; /* i is index to next character */ + pBiDi->controlCount=controlCount; + } + if(iparaCount++; + if(checkParaCount(pBiDi)==FALSE) /* not enough memory for a new para entry */ + return FALSE; + if(isDefaultLevel) { + pBiDi->paras[pBiDi->paraCount-1].level=defaultParaLevel; + state=SEEKING_STRONG_FOR_PARA; + lastStrong=defaultParaLevel; + } else { + pBiDi->paras[pBiDi->paraCount-1].level=pBiDi->paraLevel; + state=NOT_SEEKING_STRONG; + } + stackLast=-1; + } + continue; + } + } + /* Ignore still open isolate sequences with overflow */ + if(stackLast>UBIDI_MAX_EXPLICIT_LEVEL) { + stackLast=UBIDI_MAX_EXPLICIT_LEVEL; + state=SEEKING_STRONG_FOR_FSI; /* to be on the safe side */ + } + /* Resolve direction of still unresolved open FSI sequences */ + while(stackLast>=0) { + if(state==SEEKING_STRONG_FOR_FSI) { + /* no need for next statement, already set by default */ + /* dirProps[isolateStartStack[stackLast]]=LRI; */ + flags|=DIRPROP_FLAG(LRI); + break; + } + state=previousStateStack[stackLast]; + stackLast--; + } + /* When streaming, ignore text after the last paragraph separator */ + if(pBiDi->reorderingOptions & UBIDI_OPTION_STREAMING) { + if(pBiDi->lengthparaCount--; + } else { + pBiDi->paras[pBiDi->paraCount-1].limit=originalLength; + pBiDi->controlCount=controlCount; + } + /* For inverse bidi, default para direction is RTL if there is + a strong R or AL at either end of the paragraph */ + if(isDefaultLevelInverse && lastStrong==R) { + pBiDi->paras[pBiDi->paraCount-1].level=1; + } + if(isDefaultLevel) { + pBiDi->paraLevel=pBiDi->paras[0].level; + } + /* The following is needed to resolve the text direction for default level + paragraphs containing no strong character */ + for(i=0; iparaCount; i++) + flags|=DIRPROP_FLAG_LR(pBiDi->paras[i].level); + + if(pBiDi->orderParagraphsLTR && (flags&DIRPROP_FLAG(B))) { + flags|=DIRPROP_FLAG(L); + } + pBiDi->flags=flags; + pBiDi->lastArabicPos=lastArabicPos; + return TRUE; +} + +/* determine the paragraph level at position index */ +U_CFUNC UBiDiLevel +ubidi_getParaLevelAtIndex(const UBiDi *pBiDi, int32_t pindex) { + int32_t i; + for(i=0; iparaCount; i++) + if(pindexparas[i].limit) + break; + if(i>=pBiDi->paraCount) + i=pBiDi->paraCount-1; + return (UBiDiLevel)(pBiDi->paras[i].level); +} + +/* Functions for handling paired brackets ----------------------------------- */ + +/* In the isoRuns array, the first entry is used for text outside of any + isolate sequence. Higher entries are used for each more deeply nested + isolate sequence. isoRunLast is the index of the last used entry. The + openings array is used to note the data of opening brackets not yet + matched by a closing bracket, or matched but still susceptible to change + level. + Each isoRun entry contains the index of the first and + one-after-last openings entries for pending opening brackets it + contains. The next openings entry to use is the one-after-last of the + most deeply nested isoRun entry. + isoRun entries also contain their current embedding level and the last + encountered strong character, since these will be needed to resolve + the level of paired brackets. */ + +static void +bracketInit(UBiDi *pBiDi, BracketData *bd) { + bd->pBiDi=pBiDi; + bd->isoRunLast=0; + bd->isoRuns[0].start=0; + bd->isoRuns[0].limit=0; + bd->isoRuns[0].level=GET_PARALEVEL(pBiDi, 0); + UBiDiLevel t = GET_PARALEVEL(pBiDi, 0) & 1; + bd->isoRuns[0].lastStrong = bd->isoRuns[0].lastBase = t; + bd->isoRuns[0].contextDir = (UBiDiDirection)t; + bd->isoRuns[0].contextPos=0; + if(pBiDi->openingsMemory) { + bd->openings=pBiDi->openingsMemory; + bd->openingsCount=pBiDi->openingsSize / sizeof(Opening); + } else { + bd->openings=bd->simpleOpenings; + bd->openingsCount=SIMPLE_OPENINGS_COUNT; + } + bd->isNumbersSpecial=bd->pBiDi->reorderingMode==UBIDI_REORDER_NUMBERS_SPECIAL || + bd->pBiDi->reorderingMode==UBIDI_REORDER_INVERSE_FOR_NUMBERS_SPECIAL; +} + +/* paragraph boundary */ +static void +bracketProcessB(BracketData *bd, UBiDiLevel level) { + bd->isoRunLast=0; + bd->isoRuns[0].limit=0; + bd->isoRuns[0].level=level; + bd->isoRuns[0].lastStrong=bd->isoRuns[0].lastBase=level&1; + bd->isoRuns[0].contextDir=(UBiDiDirection)(level&1); + bd->isoRuns[0].contextPos=0; +} + +/* LRE, LRO, RLE, RLO, PDF */ +static void +bracketProcessBoundary(BracketData *bd, int32_t lastCcPos, + UBiDiLevel contextLevel, UBiDiLevel embeddingLevel) { + IsoRun *pLastIsoRun=&bd->isoRuns[bd->isoRunLast]; + DirProp *dirProps=bd->pBiDi->dirProps; + if(DIRPROP_FLAG(dirProps[lastCcPos])&MASK_ISO) /* after an isolate */ + return; + if(NO_OVERRIDE(embeddingLevel)>NO_OVERRIDE(contextLevel)) /* not a PDF */ + contextLevel=embeddingLevel; + pLastIsoRun->limit=pLastIsoRun->start; + pLastIsoRun->level=embeddingLevel; + pLastIsoRun->lastStrong=pLastIsoRun->lastBase=contextLevel&1; + pLastIsoRun->contextDir=(UBiDiDirection)(contextLevel&1); + pLastIsoRun->contextPos=(UBiDiDirection)lastCcPos; +} + +/* LRI or RLI */ +static void +bracketProcessLRI_RLI(BracketData *bd, UBiDiLevel level) { + IsoRun *pLastIsoRun=&bd->isoRuns[bd->isoRunLast]; + int16_t lastLimit; + pLastIsoRun->lastBase=ON; + lastLimit=pLastIsoRun->limit; + bd->isoRunLast++; + pLastIsoRun++; + pLastIsoRun->start=pLastIsoRun->limit=lastLimit; + pLastIsoRun->level=level; + pLastIsoRun->lastStrong=pLastIsoRun->lastBase=level&1; + pLastIsoRun->contextDir=(UBiDiDirection)(level&1); + pLastIsoRun->contextPos=0; +} + +/* PDI */ +static void +bracketProcessPDI(BracketData *bd) { + IsoRun *pLastIsoRun; + bd->isoRunLast--; + pLastIsoRun=&bd->isoRuns[bd->isoRunLast]; + pLastIsoRun->lastBase=ON; +} + +/* newly found opening bracket: create an openings entry */ +static UBool /* return TRUE if success */ +bracketAddOpening(BracketData *bd, UChar match, int32_t position) { + IsoRun *pLastIsoRun=&bd->isoRuns[bd->isoRunLast]; + Opening *pOpening; + if(pLastIsoRun->limit>=bd->openingsCount) { /* no available new entry */ + UBiDi *pBiDi=bd->pBiDi; + if(!getInitialOpeningsMemory(pBiDi, pLastIsoRun->limit * 2)) + return FALSE; + if(bd->openings==bd->simpleOpenings) + uprv_memcpy(pBiDi->openingsMemory, bd->simpleOpenings, + SIMPLE_OPENINGS_COUNT * sizeof(Opening)); + bd->openings=pBiDi->openingsMemory; /* may have changed */ + bd->openingsCount=pBiDi->openingsSize / sizeof(Opening); + } + pOpening=&bd->openings[pLastIsoRun->limit]; + pOpening->position=position; + pOpening->match=match; + pOpening->contextDir=pLastIsoRun->contextDir; + pOpening->contextPos=pLastIsoRun->contextPos; + pOpening->flags=0; + pLastIsoRun->limit++; + return TRUE; +} + +/* change N0c1 to N0c2 when a preceding bracket is assigned the embedding level */ +static void +fixN0c(BracketData *bd, int32_t openingIndex, int32_t newPropPosition, DirProp newProp) { + /* This function calls itself recursively */ + IsoRun *pLastIsoRun=&bd->isoRuns[bd->isoRunLast]; + Opening *qOpening; + DirProp *dirProps=bd->pBiDi->dirProps; + int32_t k, openingPosition, closingPosition; + for(k=openingIndex+1, qOpening=&bd->openings[k]; klimit; k++, qOpening++) { + if(qOpening->match>=0) /* not an N0c match */ + continue; + if(newPropPositioncontextPos) + break; + if(newPropPosition>=qOpening->position) + continue; + if(newProp==qOpening->contextDir) + break; + openingPosition=qOpening->position; + dirProps[openingPosition]=newProp; + closingPosition=-(qOpening->match); + dirProps[closingPosition]=newProp; + qOpening->match=0; /* prevent further changes */ + fixN0c(bd, k, openingPosition, newProp); + fixN0c(bd, k, closingPosition, newProp); + } +} + +/* process closing bracket */ +static DirProp /* return L or R if N0b or N0c, ON if N0d */ +bracketProcessClosing(BracketData *bd, int32_t openIdx, int32_t position) { + IsoRun *pLastIsoRun=&bd->isoRuns[bd->isoRunLast]; + Opening *pOpening, *qOpening; + UBiDiDirection direction; + UBool stable; + DirProp newProp; + pOpening=&bd->openings[openIdx]; + direction=(UBiDiDirection)(pLastIsoRun->level&1); + stable=TRUE; /* assume stable until proved otherwise */ + + /* The stable flag is set when brackets are paired and their + level is resolved and cannot be changed by what will be + found later in the source string. + An unstable match can occur only when applying N0c, where + the resolved level depends on the preceding context, and + this context may be affected by text occurring later. + Example: RTL paragraph containing: abc[(latin) HEBREW] + When the closing parenthesis is encountered, it appears + that N0c1 must be applied since 'abc' sets an opposite + direction context and both parentheses receive level 2. + However, when the closing square bracket is processed, + N0b applies because of 'HEBREW' being included within the + brackets, thus the square brackets are treated like R and + receive level 1. However, this changes the preceding + context of the opening parenthesis, and it now appears + that N0c2 must be applied to the parentheses rather than + N0c1. */ + + if((direction==0 && pOpening->flags&FOUND_L) || + (direction==1 && pOpening->flags&FOUND_R)) { /* N0b */ + newProp=direction; + } + else if(pOpening->flags&(FOUND_L|FOUND_R)) { /* N0c */ + /* it is stable if there is no containing pair or in + conditions too complicated and not worth checking */ + stable=(openIdx==pLastIsoRun->start); + if(direction!=pOpening->contextDir) + newProp=pOpening->contextDir; /* N0c1 */ + else + newProp=direction; /* N0c2 */ + } else { + /* forget this and any brackets nested within this pair */ + pLastIsoRun->limit=openIdx; + return ON; /* N0d */ + } + bd->pBiDi->dirProps[pOpening->position]=newProp; + bd->pBiDi->dirProps[position]=newProp; + /* Update nested N0c pairs that may be affected */ + fixN0c(bd, openIdx, pOpening->position, newProp); + if(stable) { + pLastIsoRun->limit=openIdx; /* forget any brackets nested within this pair */ + /* remove lower located synonyms if any */ + while(pLastIsoRun->limit>pLastIsoRun->start && + bd->openings[pLastIsoRun->limit-1].position==pOpening->position) + pLastIsoRun->limit--; + } else { + int32_t k; + pOpening->match=-position; + /* neutralize lower located synonyms if any */ + k=openIdx-1; + while(k>=pLastIsoRun->start && + bd->openings[k].position==pOpening->position) + bd->openings[k--].match=0; + /* neutralize any unmatched opening between the current pair; + this will also neutralize higher located synonyms if any */ + for(k=openIdx+1; klimit; k++) { + qOpening=&bd->openings[k]; + if(qOpening->position>=position) + break; + if(qOpening->match>0) + qOpening->match=0; + } + } + return newProp; +} + +/* handle strong characters, digits and candidates for closing brackets */ +static UBool /* return TRUE if success */ +bracketProcessChar(BracketData *bd, int32_t position) { + IsoRun *pLastIsoRun=&bd->isoRuns[bd->isoRunLast]; + DirProp *dirProps, dirProp, newProp; + UBiDiLevel level; + dirProps=bd->pBiDi->dirProps; + dirProp=dirProps[position]; + if(dirProp==ON) { + UChar c, match; + int32_t idx; + /* First see if it is a matching closing bracket. Hopefully, this is + more efficient than checking if it is a closing bracket at all */ + c=bd->pBiDi->text[position]; + for(idx=pLastIsoRun->limit-1; idx>=pLastIsoRun->start; idx--) { + if(bd->openings[idx].match!=c) + continue; + /* We have a match */ + newProp=bracketProcessClosing(bd, idx, position); + if(newProp==ON) { /* N0d */ + c=0; /* prevent handling as an opening */ + break; + } + pLastIsoRun->lastBase=ON; + pLastIsoRun->contextDir=(UBiDiDirection)newProp; + pLastIsoRun->contextPos=position; + level=bd->pBiDi->levels[position]; + if(level&UBIDI_LEVEL_OVERRIDE) { /* X4, X5 */ + uint16_t flag; + int32_t i; + newProp=level&1; + pLastIsoRun->lastStrong=newProp; + flag=DIRPROP_FLAG(newProp); + for(i=pLastIsoRun->start; iopenings[i].flags|=flag; + /* matching brackets are not overridden by LRO/RLO */ + bd->pBiDi->levels[position]&=~UBIDI_LEVEL_OVERRIDE; + } + /* matching brackets are not overridden by LRO/RLO */ + bd->pBiDi->levels[bd->openings[idx].position]&=~UBIDI_LEVEL_OVERRIDE; + return TRUE; + } + /* We get here only if the ON character is not a matching closing + bracket or it is a case of N0d */ + /* Now see if it is an opening bracket */ + if(c) + match=u_getBidiPairedBracket(c); /* get the matching char */ + else + match=0; + if(match!=c && /* has a matching char */ + ubidi_getPairedBracketType(bd->pBiDi->bdp, c)==U_BPT_OPEN) { /* opening bracket */ + /* special case: process synonyms + create an opening entry for each synonym */ + if(match==0x232A) { /* RIGHT-POINTING ANGLE BRACKET */ + if(!bracketAddOpening(bd, 0x3009, position)) + return FALSE; + } + else if(match==0x3009) { /* RIGHT ANGLE BRACKET */ + if(!bracketAddOpening(bd, 0x232A, position)) + return FALSE; + } + if(!bracketAddOpening(bd, match, position)) + return FALSE; + } + } + level=bd->pBiDi->levels[position]; + if(level&UBIDI_LEVEL_OVERRIDE) { /* X4, X5 */ + newProp=level&1; + if(dirProp!=S && dirProp!=WS && dirProp!=ON) + dirProps[position]=newProp; + pLastIsoRun->lastBase=newProp; + pLastIsoRun->lastStrong=newProp; + pLastIsoRun->contextDir=(UBiDiDirection)newProp; + pLastIsoRun->contextPos=position; + } + else if(dirProp<=R || dirProp==AL) { + newProp=DIR_FROM_STRONG(dirProp); + pLastIsoRun->lastBase=dirProp; + pLastIsoRun->lastStrong=dirProp; + pLastIsoRun->contextDir=(UBiDiDirection)newProp; + pLastIsoRun->contextPos=position; + } + else if(dirProp==EN) { + pLastIsoRun->lastBase=EN; + if(pLastIsoRun->lastStrong==L) { + newProp=L; /* W7 */ + if(!bd->isNumbersSpecial) + dirProps[position]=ENL; + pLastIsoRun->contextDir=(UBiDiDirection)L; + pLastIsoRun->contextPos=position; + } + else { + newProp=R; /* N0 */ + if(pLastIsoRun->lastStrong==AL) + dirProps[position]=AN; /* W2 */ + else + dirProps[position]=ENR; + pLastIsoRun->contextDir=(UBiDiDirection)R; + pLastIsoRun->contextPos=position; + } + } + else if(dirProp==AN) { + newProp=R; /* N0 */ + pLastIsoRun->lastBase=AN; + pLastIsoRun->contextDir=(UBiDiDirection)R; + pLastIsoRun->contextPos=position; + } + else if(dirProp==NSM) { + /* if the last real char was ON, change NSM to ON so that it + will stay ON even if the last real char is a bracket which + may be changed to L or R */ + newProp=pLastIsoRun->lastBase; + if(newProp==ON) + dirProps[position]=newProp; + } + else { + newProp=dirProp; + pLastIsoRun->lastBase=dirProp; + } + if(newProp<=R || newProp==AL) { + int32_t i; + uint16_t flag=DIRPROP_FLAG(DIR_FROM_STRONG(newProp)); + for(i=pLastIsoRun->start; ilimit; i++) + if(position>bd->openings[i].position) + bd->openings[i].flags|=flag; + } + return TRUE; +} + +/* perform (X1)..(X9) ------------------------------------------------------- */ + +/* determine if the text is mixed-directional or single-directional */ +static UBiDiDirection +directionFromFlags(UBiDi *pBiDi) { + Flags flags=pBiDi->flags; + /* if the text contains AN and neutrals, then some neutrals may become RTL */ + if(!(flags&MASK_RTL || ((flags&DIRPROP_FLAG(AN)) && (flags&MASK_POSSIBLE_N)))) { + return UBIDI_LTR; + } else if(!(flags&MASK_LTR)) { + return UBIDI_RTL; + } else { + return UBIDI_MIXED; + } +} + +/* + * Resolve the explicit levels as specified by explicit embedding codes. + * Recalculate the flags to have them reflect the real properties + * after taking the explicit embeddings into account. + * + * The BiDi algorithm is designed to result in the same behavior whether embedding + * levels are externally specified (from "styled text", supposedly the preferred + * method) or set by explicit embedding codes (LRx, RLx, PDF, FSI, PDI) in the plain text. + * That is why (X9) instructs to remove all not-isolate explicit codes (and BN). + * However, in a real implementation, the removal of these codes and their index + * positions in the plain text is undesirable since it would result in + * reallocated, reindexed text. + * Instead, this implementation leaves the codes in there and just ignores them + * in the subsequent processing. + * In order to get the same reordering behavior, positions with a BN or a not-isolate + * explicit embedding code just get the same level assigned as the last "real" + * character. + * + * Some implementations, not this one, then overwrite some of these + * directionality properties at "real" same-level-run boundaries by + * L or R codes so that the resolution of weak types can be performed on the + * entire paragraph at once instead of having to parse it once more and + * perform that resolution on same-level-runs. + * This limits the scope of the implicit rules in effectively + * the same way as the run limits. + * + * Instead, this implementation does not modify these codes, except for + * paired brackets whose properties (ON) may be replaced by L or R. + * On one hand, the paragraph has to be scanned for same-level-runs, but + * on the other hand, this saves another loop to reset these codes, + * or saves making and modifying a copy of dirProps[]. + * + * + * Note that (Pn) and (Xn) changed significantly from version 4 of the BiDi algorithm. + * + * + * Handling the stack of explicit levels (Xn): + * + * With the BiDi stack of explicit levels, as pushed with each + * LRE, RLE, LRO, RLO, LRI, RLI and FSI and popped with each PDF and PDI, + * the explicit level must never exceed UBIDI_MAX_EXPLICIT_LEVEL. + * + * In order to have a correct push-pop semantics even in the case of overflows, + * overflow counters and a valid isolate counter are used as described in UAX#9 + * section 3.3.2 "Explicit Levels and Directions". + * + * This implementation assumes that UBIDI_MAX_EXPLICIT_LEVEL is odd. + * + * Returns normally the direction; -1 if there was a memory shortage + * + */ +static UBiDiDirection +resolveExplicitLevels(UBiDi *pBiDi, UErrorCode *pErrorCode) { + DirProp *dirProps=pBiDi->dirProps; + UBiDiLevel *levels=pBiDi->levels; + const UChar *text=pBiDi->text; + + int32_t i=0, length=pBiDi->length; + Flags flags=pBiDi->flags; /* collect all directionalities in the text */ + DirProp dirProp; + UBiDiLevel level=GET_PARALEVEL(pBiDi, 0); + UBiDiDirection direction; + pBiDi->isolateCount=0; + + if(U_FAILURE(*pErrorCode)) { return UBIDI_LTR; } + + /* determine if the text is mixed-directional or single-directional */ + direction=directionFromFlags(pBiDi); + + /* we may not need to resolve any explicit levels */ + if((direction!=UBIDI_MIXED)) { + /* not mixed directionality: levels don't matter - trailingWSStart will be 0 */ + return direction; + } + if(pBiDi->reorderingMode > UBIDI_REORDER_LAST_LOGICAL_TO_VISUAL) { + /* inverse BiDi: mixed, but all characters are at the same embedding level */ + /* set all levels to the paragraph level */ + int32_t paraIndex, start, limit; + for(paraIndex=0; paraIndexparaCount; paraIndex++) { + if(paraIndex==0) + start=0; + else + start=pBiDi->paras[paraIndex-1].limit; + limit=pBiDi->paras[paraIndex].limit; + level=pBiDi->paras[paraIndex].level; + for(i=start; iparaCount; paraIndex++) { + if(paraIndex==0) + start=0; + else + start=pBiDi->paras[paraIndex-1].limit; + limit=pBiDi->paras[paraIndex].limit; + level=pBiDi->paras[paraIndex].level; + for(i=start; i=UBIDI_MAX_EXPLICIT_LEVEL + but we need one more entry as base */ + uint32_t stackLast=0; + int32_t overflowIsolateCount=0; + int32_t overflowEmbeddingCount=0; + int32_t validIsolateCount=0; + BracketData bracketData; + bracketInit(pBiDi, &bracketData); + stack[0]=level; /* initialize base entry to para level, no override, no isolate */ + + /* recalculate the flags */ + flags=0; + + for(i=0; i0 && stack[stackLast]pBiDi->isolateCount) + pBiDi->isolateCount=validIsolateCount; + embeddingLevel=newLevel; + /* we can increment stackLast without checking because newLevel + will exceed UBIDI_MAX_EXPLICIT_LEVEL before stackLast overflows */ + stackLast++; + stack[stackLast]=embeddingLevel+ISOLATE; + bracketProcessLRI_RLI(&bracketData, embeddingLevel); + } else { + /* make it WS so that it is handled by adjustWSLevels() */ + dirProps[i]=WS; + overflowIsolateCount++; + } + break; + case PDI: + if(NO_OVERRIDE(embeddingLevel)!=NO_OVERRIDE(previousLevel)) { + bracketProcessBoundary(&bracketData, lastCcPos, + previousLevel, embeddingLevel); + flags|=DIRPROP_FLAG_MULTI_RUNS; + } + /* (X6a) */ + if(overflowIsolateCount) { + overflowIsolateCount--; + /* make it WS so that it is handled by adjustWSLevels() */ + dirProps[i]=WS; + } + else if(validIsolateCount) { + flags|=DIRPROP_FLAG(PDI); + lastCcPos=i; + overflowEmbeddingCount=0; + while(stack[stackLast]paraLevel); + if(pBiDi->orderParagraphsLTR && (flags&DIRPROP_FLAG(B))) + flags|=DIRPROP_FLAG(L); + /* again, determine if the text is mixed-directional or single-directional */ + pBiDi->flags=flags; + direction=directionFromFlags(pBiDi); + } + return direction; +} + +/* + * Use a pre-specified embedding levels array: + * + * Adjust the directional properties for overrides (->LEVEL_OVERRIDE), + * ignore all explicit codes (X9), + * and check all the preset levels. + * + * Recalculate the flags to have them reflect the real properties + * after taking the explicit embeddings into account. + */ +static UBiDiDirection +checkExplicitLevels(UBiDi *pBiDi, UErrorCode *pErrorCode) { + DirProp *dirProps=pBiDi->dirProps; + UBiDiLevel *levels=pBiDi->levels; + int32_t isolateCount=0; + + int32_t length=pBiDi->length; + Flags flags=0; /* collect all directionalities in the text */ + pBiDi->isolateCount=0; + + int32_t currentParaIndex = 0; + int32_t currentParaLimit = pBiDi->paras[0].limit; + int32_t currentParaLevel = pBiDi->paraLevel; + + for(int32_t i=0; ipBiDi->isolateCount) + pBiDi->isolateCount=isolateCount; + } + else if(dirProp==PDI) + isolateCount--; + else if(dirProp==B) + isolateCount=0; + + // optimized version of int32_t currentParaLevel = GET_PARALEVEL(pBiDi, i); + if (pBiDi->defaultParaLevel != 0 && + i == currentParaLimit && (currentParaIndex + 1) < pBiDi->paraCount) { + currentParaLevel = pBiDi->paras[++currentParaIndex].level; + currentParaLimit = pBiDi->paras[currentParaIndex].limit; + } + + UBiDiLevel overrideFlag = level & UBIDI_LEVEL_OVERRIDE; + level &= ~UBIDI_LEVEL_OVERRIDE; + if (level < currentParaLevel || UBIDI_MAX_EXPLICIT_LEVEL < level) { + if (level == 0) { + if (dirProp == B) { + // Paragraph separators are ok with explicit level 0. + // Prevents reordering of paragraphs. + } else { + // Treat explicit level 0 as a wildcard for the paragraph level. + // Avoid making the caller guess what the paragraph level would be. + level = (UBiDiLevel)currentParaLevel; + levels[i] = level | overrideFlag; + } + } else { + // 1 <= level < currentParaLevel or UBIDI_MAX_EXPLICIT_LEVEL < level + /* level out of bounds */ + *pErrorCode=U_ILLEGAL_ARGUMENT_ERROR; + return UBIDI_LTR; + } + } + if (overrideFlag != 0) { + /* keep the override flag in levels[i] but adjust the flags */ + flags|=DIRPROP_FLAG_O(level); + } else { + /* set the flags */ + flags|=DIRPROP_FLAG_E(level)|DIRPROP_FLAG(dirProp); + } + } + if(flags&MASK_EMBEDDING) + flags|=DIRPROP_FLAG_LR(pBiDi->paraLevel); + /* determine if the text is mixed-directional or single-directional */ + pBiDi->flags=flags; + return directionFromFlags(pBiDi); +} + +/****************************************************************** + The Properties state machine table +******************************************************************* + + All table cells are 8 bits: + bits 0..4: next state + bits 5..7: action to perform (if > 0) + + Cells may be of format "n" where n represents the next state + (except for the rightmost column). + Cells may also be of format "s(x,y)" where x represents an action + to perform and y represents the next state. + +******************************************************************* + Definitions and type for properties state table +******************************************************************* +*/ +#define IMPTABPROPS_COLUMNS 16 +#define IMPTABPROPS_RES (IMPTABPROPS_COLUMNS - 1) +#define GET_STATEPROPS(cell) ((cell)&0x1f) +#define GET_ACTIONPROPS(cell) ((cell)>>5) +#define s(action, newState) ((uint8_t)(newState+(action<<5))) + +static const uint8_t groupProp[] = /* dirProp regrouped */ +{ +/* L R EN ES ET AN CS B S WS ON LRE LRO AL RLE RLO PDF NSM BN FSI LRI RLI PDI ENL ENR */ + 0, 1, 2, 7, 8, 3, 9, 6, 5, 4, 4, 10, 10, 12, 10, 10, 10, 11, 10, 4, 4, 4, 4, 13, 14 +}; +enum { DirProp_L=0, DirProp_R=1, DirProp_EN=2, DirProp_AN=3, DirProp_ON=4, DirProp_S=5, DirProp_B=6 }; /* reduced dirProp */ + +/****************************************************************** + + PROPERTIES STATE TABLE + + In table impTabProps, + - the ON column regroups ON and WS, FSI, RLI, LRI and PDI + - the BN column regroups BN, LRE, RLE, LRO, RLO, PDF + - the Res column is the reduced property assigned to a run + + Action 1: process current run1, init new run1 + 2: init new run2 + 3: process run1, process run2, init new run1 + 4: process run1, set run1=run2, init new run2 + + Notes: + 1) This table is used in resolveImplicitLevels(). + 2) This table triggers actions when there is a change in the Bidi + property of incoming characters (action 1). + 3) Most such property sequences are processed immediately (in + fact, passed to processPropertySeq(). + 4) However, numbers are assembled as one sequence. This means + that undefined situations (like CS following digits, until + it is known if the next char will be a digit) are held until + following chars define them. + Example: digits followed by CS, then comes another CS or ON; + the digits will be processed, then the CS assigned + as the start of an ON sequence (action 3). + 5) There are cases where more than one sequence must be + processed, for instance digits followed by CS followed by L: + the digits must be processed as one sequence, and the CS + must be processed as an ON sequence, all this before starting + assembling chars for the opening L sequence. + + +*/ +static const uint8_t impTabProps[][IMPTABPROPS_COLUMNS] = +{ +/* L , R , EN , AN , ON , S , B , ES , ET , CS , BN , NSM , AL , ENL , ENR , Res */ +/* 0 Init */ { 1 , 2 , 4 , 5 , 7 , 15 , 17 , 7 , 9 , 7 , 0 , 7 , 3 , 18 , 21 , DirProp_ON }, +/* 1 L */ { 1 , s(1,2), s(1,4), s(1,5), s(1,7),s(1,15),s(1,17), s(1,7), s(1,9), s(1,7), 1 , 1 , s(1,3),s(1,18),s(1,21), DirProp_L }, +/* 2 R */ { s(1,1), 2 , s(1,4), s(1,5), s(1,7),s(1,15),s(1,17), s(1,7), s(1,9), s(1,7), 2 , 2 , s(1,3),s(1,18),s(1,21), DirProp_R }, +/* 3 AL */ { s(1,1), s(1,2), s(1,6), s(1,6), s(1,8),s(1,16),s(1,17), s(1,8), s(1,8), s(1,8), 3 , 3 , 3 ,s(1,18),s(1,21), DirProp_R }, +/* 4 EN */ { s(1,1), s(1,2), 4 , s(1,5), s(1,7),s(1,15),s(1,17),s(2,10), 11 ,s(2,10), 4 , 4 , s(1,3), 18 , 21 , DirProp_EN }, +/* 5 AN */ { s(1,1), s(1,2), s(1,4), 5 , s(1,7),s(1,15),s(1,17), s(1,7), s(1,9),s(2,12), 5 , 5 , s(1,3),s(1,18),s(1,21), DirProp_AN }, +/* 6 AL:EN/AN */ { s(1,1), s(1,2), 6 , 6 , s(1,8),s(1,16),s(1,17), s(1,8), s(1,8),s(2,13), 6 , 6 , s(1,3), 18 , 21 , DirProp_AN }, +/* 7 ON */ { s(1,1), s(1,2), s(1,4), s(1,5), 7 ,s(1,15),s(1,17), 7 ,s(2,14), 7 , 7 , 7 , s(1,3),s(1,18),s(1,21), DirProp_ON }, +/* 8 AL:ON */ { s(1,1), s(1,2), s(1,6), s(1,6), 8 ,s(1,16),s(1,17), 8 , 8 , 8 , 8 , 8 , s(1,3),s(1,18),s(1,21), DirProp_ON }, +/* 9 ET */ { s(1,1), s(1,2), 4 , s(1,5), 7 ,s(1,15),s(1,17), 7 , 9 , 7 , 9 , 9 , s(1,3), 18 , 21 , DirProp_ON }, +/*10 EN+ES/CS */ { s(3,1), s(3,2), 4 , s(3,5), s(4,7),s(3,15),s(3,17), s(4,7),s(4,14), s(4,7), 10 , s(4,7), s(3,3), 18 , 21 , DirProp_EN }, +/*11 EN+ET */ { s(1,1), s(1,2), 4 , s(1,5), s(1,7),s(1,15),s(1,17), s(1,7), 11 , s(1,7), 11 , 11 , s(1,3), 18 , 21 , DirProp_EN }, +/*12 AN+CS */ { s(3,1), s(3,2), s(3,4), 5 , s(4,7),s(3,15),s(3,17), s(4,7),s(4,14), s(4,7), 12 , s(4,7), s(3,3),s(3,18),s(3,21), DirProp_AN }, +/*13 AL:EN/AN+CS */ { s(3,1), s(3,2), 6 , 6 , s(4,8),s(3,16),s(3,17), s(4,8), s(4,8), s(4,8), 13 , s(4,8), s(3,3), 18 , 21 , DirProp_AN }, +/*14 ON+ET */ { s(1,1), s(1,2), s(4,4), s(1,5), 7 ,s(1,15),s(1,17), 7 , 14 , 7 , 14 , 14 , s(1,3),s(4,18),s(4,21), DirProp_ON }, +/*15 S */ { s(1,1), s(1,2), s(1,4), s(1,5), s(1,7), 15 ,s(1,17), s(1,7), s(1,9), s(1,7), 15 , s(1,7), s(1,3),s(1,18),s(1,21), DirProp_S }, +/*16 AL:S */ { s(1,1), s(1,2), s(1,6), s(1,6), s(1,8), 16 ,s(1,17), s(1,8), s(1,8), s(1,8), 16 , s(1,8), s(1,3),s(1,18),s(1,21), DirProp_S }, +/*17 B */ { s(1,1), s(1,2), s(1,4), s(1,5), s(1,7),s(1,15), 17 , s(1,7), s(1,9), s(1,7), 17 , s(1,7), s(1,3),s(1,18),s(1,21), DirProp_B }, +/*18 ENL */ { s(1,1), s(1,2), 18 , s(1,5), s(1,7),s(1,15),s(1,17),s(2,19), 20 ,s(2,19), 18 , 18 , s(1,3), 18 , 21 , DirProp_L }, +/*19 ENL+ES/CS */ { s(3,1), s(3,2), 18 , s(3,5), s(4,7),s(3,15),s(3,17), s(4,7),s(4,14), s(4,7), 19 , s(4,7), s(3,3), 18 , 21 , DirProp_L }, +/*20 ENL+ET */ { s(1,1), s(1,2), 18 , s(1,5), s(1,7),s(1,15),s(1,17), s(1,7), 20 , s(1,7), 20 , 20 , s(1,3), 18 , 21 , DirProp_L }, +/*21 ENR */ { s(1,1), s(1,2), 21 , s(1,5), s(1,7),s(1,15),s(1,17),s(2,22), 23 ,s(2,22), 21 , 21 , s(1,3), 18 , 21 , DirProp_AN }, +/*22 ENR+ES/CS */ { s(3,1), s(3,2), 21 , s(3,5), s(4,7),s(3,15),s(3,17), s(4,7),s(4,14), s(4,7), 22 , s(4,7), s(3,3), 18 , 21 , DirProp_AN }, +/*23 ENR+ET */ { s(1,1), s(1,2), 21 , s(1,5), s(1,7),s(1,15),s(1,17), s(1,7), 23 , s(1,7), 23 , 23 , s(1,3), 18 , 21 , DirProp_AN } +}; + +/* we must undef macro s because the levels tables have a different + * structure (4 bits for action and 4 bits for next state. + */ +#undef s + +/****************************************************************** + The levels state machine tables +******************************************************************* + + All table cells are 8 bits: + bits 0..3: next state + bits 4..7: action to perform (if > 0) + + Cells may be of format "n" where n represents the next state + (except for the rightmost column). + Cells may also be of format "s(x,y)" where x represents an action + to perform and y represents the next state. + + This format limits each table to 16 states each and to 15 actions. + +******************************************************************* + Definitions and type for levels state tables +******************************************************************* +*/ +#define IMPTABLEVELS_COLUMNS (DirProp_B + 2) +#define IMPTABLEVELS_RES (IMPTABLEVELS_COLUMNS - 1) +#define GET_STATE(cell) ((cell)&0x0f) +#define GET_ACTION(cell) ((cell)>>4) +#define s(action, newState) ((uint8_t)(newState+(action<<4))) + +typedef uint8_t ImpTab[][IMPTABLEVELS_COLUMNS]; +typedef uint8_t ImpAct[]; + +/* FOOD FOR THOUGHT: each ImpTab should have its associated ImpAct, + * instead of having a pair of ImpTab and a pair of ImpAct. + */ +typedef struct ImpTabPair { + const void * pImpTab[2]; + const void * pImpAct[2]; +} ImpTabPair; + +/****************************************************************** + + LEVELS STATE TABLES + + In all levels state tables, + - state 0 is the initial state + - the Res column is the increment to add to the text level + for this property sequence. + + The impAct arrays for each table of a pair map the local action + numbers of the table to the total list of actions. For instance, + action 2 in a given table corresponds to the action number which + appears in entry [2] of the impAct array for that table. + The first entry of all impAct arrays must be 0. + + Action 1: init conditional sequence + 2: prepend conditional sequence to current sequence + 3: set ON sequence to new level - 1 + 4: init EN/AN/ON sequence + 5: fix EN/AN/ON sequence followed by R + 6: set previous level sequence to level 2 + + Notes: + 1) These tables are used in processPropertySeq(). The input + is property sequences as determined by resolveImplicitLevels. + 2) Most such property sequences are processed immediately + (levels are assigned). + 3) However, some sequences cannot be assigned a final level till + one or more following sequences are received. For instance, + ON following an R sequence within an even-level paragraph. + If the following sequence is R, the ON sequence will be + assigned basic run level+1, and so will the R sequence. + 4) S is generally handled like ON, since its level will be fixed + to paragraph level in adjustWSLevels(). + +*/ + +static const ImpTab impTabL_DEFAULT = /* Even paragraph level */ +/* In this table, conditional sequences receive the lower possible level + until proven otherwise. +*/ +{ +/* L , R , EN , AN , ON , S , B , Res */ +/* 0 : init */ { 0 , 1 , 0 , 2 , 0 , 0 , 0 , 0 }, +/* 1 : R */ { 0 , 1 , 3 , 3 , s(1,4), s(1,4), 0 , 1 }, +/* 2 : AN */ { 0 , 1 , 0 , 2 , s(1,5), s(1,5), 0 , 2 }, +/* 3 : R+EN/AN */ { 0 , 1 , 3 , 3 , s(1,4), s(1,4), 0 , 2 }, +/* 4 : R+ON */ { 0 , s(2,1), s(3,3), s(3,3), 4 , 4 , 0 , 0 }, +/* 5 : AN+ON */ { 0 , s(2,1), 0 , s(3,2), 5 , 5 , 0 , 0 } +}; +static const ImpTab impTabR_DEFAULT = /* Odd paragraph level */ +/* In this table, conditional sequences receive the lower possible level + until proven otherwise. +*/ +{ +/* L , R , EN , AN , ON , S , B , Res */ +/* 0 : init */ { 1 , 0 , 2 , 2 , 0 , 0 , 0 , 0 }, +/* 1 : L */ { 1 , 0 , 1 , 3 , s(1,4), s(1,4), 0 , 1 }, +/* 2 : EN/AN */ { 1 , 0 , 2 , 2 , 0 , 0 , 0 , 1 }, +/* 3 : L+AN */ { 1 , 0 , 1 , 3 , 5 , 5 , 0 , 1 }, +/* 4 : L+ON */ { s(2,1), 0 , s(2,1), 3 , 4 , 4 , 0 , 0 }, +/* 5 : L+AN+ON */ { 1 , 0 , 1 , 3 , 5 , 5 , 0 , 0 } +}; +static const ImpAct impAct0 = {0,1,2,3,4}; +static const ImpTabPair impTab_DEFAULT = {{&impTabL_DEFAULT, + &impTabR_DEFAULT}, + {&impAct0, &impAct0}}; + +static const ImpTab impTabL_NUMBERS_SPECIAL = /* Even paragraph level */ +/* In this table, conditional sequences receive the lower possible level + until proven otherwise. +*/ +{ +/* L , R , EN , AN , ON , S , B , Res */ +/* 0 : init */ { 0 , 2 , s(1,1), s(1,1), 0 , 0 , 0 , 0 }, +/* 1 : L+EN/AN */ { 0 , s(4,2), 1 , 1 , 0 , 0 , 0 , 0 }, +/* 2 : R */ { 0 , 2 , 4 , 4 , s(1,3), s(1,3), 0 , 1 }, +/* 3 : R+ON */ { 0 , s(2,2), s(3,4), s(3,4), 3 , 3 , 0 , 0 }, +/* 4 : R+EN/AN */ { 0 , 2 , 4 , 4 , s(1,3), s(1,3), 0 , 2 } +}; +static const ImpTabPair impTab_NUMBERS_SPECIAL = {{&impTabL_NUMBERS_SPECIAL, + &impTabR_DEFAULT}, + {&impAct0, &impAct0}}; + +static const ImpTab impTabL_GROUP_NUMBERS_WITH_R = +/* In this table, EN/AN+ON sequences receive levels as if associated with R + until proven that there is L or sor/eor on both sides. AN is handled like EN. +*/ +{ +/* L , R , EN , AN , ON , S , B , Res */ +/* 0 init */ { 0 , 3 , s(1,1), s(1,1), 0 , 0 , 0 , 0 }, +/* 1 EN/AN */ { s(2,0), 3 , 1 , 1 , 2 , s(2,0), s(2,0), 2 }, +/* 2 EN/AN+ON */ { s(2,0), 3 , 1 , 1 , 2 , s(2,0), s(2,0), 1 }, +/* 3 R */ { 0 , 3 , 5 , 5 , s(1,4), 0 , 0 , 1 }, +/* 4 R+ON */ { s(2,0), 3 , 5 , 5 , 4 , s(2,0), s(2,0), 1 }, +/* 5 R+EN/AN */ { 0 , 3 , 5 , 5 , s(1,4), 0 , 0 , 2 } +}; +static const ImpTab impTabR_GROUP_NUMBERS_WITH_R = +/* In this table, EN/AN+ON sequences receive levels as if associated with R + until proven that there is L on both sides. AN is handled like EN. +*/ +{ +/* L , R , EN , AN , ON , S , B , Res */ +/* 0 init */ { 2 , 0 , 1 , 1 , 0 , 0 , 0 , 0 }, +/* 1 EN/AN */ { 2 , 0 , 1 , 1 , 0 , 0 , 0 , 1 }, +/* 2 L */ { 2 , 0 , s(1,4), s(1,4), s(1,3), 0 , 0 , 1 }, +/* 3 L+ON */ { s(2,2), 0 , 4 , 4 , 3 , 0 , 0 , 0 }, +/* 4 L+EN/AN */ { s(2,2), 0 , 4 , 4 , 3 , 0 , 0 , 1 } +}; +static const ImpTabPair impTab_GROUP_NUMBERS_WITH_R = { + {&impTabL_GROUP_NUMBERS_WITH_R, + &impTabR_GROUP_NUMBERS_WITH_R}, + {&impAct0, &impAct0}}; + + +static const ImpTab impTabL_INVERSE_NUMBERS_AS_L = +/* This table is identical to the Default LTR table except that EN and AN are + handled like L. +*/ +{ +/* L , R , EN , AN , ON , S , B , Res */ +/* 0 : init */ { 0 , 1 , 0 , 0 , 0 , 0 , 0 , 0 }, +/* 1 : R */ { 0 , 1 , 0 , 0 , s(1,4), s(1,4), 0 , 1 }, +/* 2 : AN */ { 0 , 1 , 0 , 0 , s(1,5), s(1,5), 0 , 2 }, +/* 3 : R+EN/AN */ { 0 , 1 , 0 , 0 , s(1,4), s(1,4), 0 , 2 }, +/* 4 : R+ON */ { s(2,0), 1 , s(2,0), s(2,0), 4 , 4 , s(2,0), 1 }, +/* 5 : AN+ON */ { s(2,0), 1 , s(2,0), s(2,0), 5 , 5 , s(2,0), 1 } +}; +static const ImpTab impTabR_INVERSE_NUMBERS_AS_L = +/* This table is identical to the Default RTL table except that EN and AN are + handled like L. +*/ +{ +/* L , R , EN , AN , ON , S , B , Res */ +/* 0 : init */ { 1 , 0 , 1 , 1 , 0 , 0 , 0 , 0 }, +/* 1 : L */ { 1 , 0 , 1 , 1 , s(1,4), s(1,4), 0 , 1 }, +/* 2 : EN/AN */ { 1 , 0 , 1 , 1 , 0 , 0 , 0 , 1 }, +/* 3 : L+AN */ { 1 , 0 , 1 , 1 , 5 , 5 , 0 , 1 }, +/* 4 : L+ON */ { s(2,1), 0 , s(2,1), s(2,1), 4 , 4 , 0 , 0 }, +/* 5 : L+AN+ON */ { 1 , 0 , 1 , 1 , 5 , 5 , 0 , 0 } +}; +static const ImpTabPair impTab_INVERSE_NUMBERS_AS_L = { + {&impTabL_INVERSE_NUMBERS_AS_L, + &impTabR_INVERSE_NUMBERS_AS_L}, + {&impAct0, &impAct0}}; + +static const ImpTab impTabR_INVERSE_LIKE_DIRECT = /* Odd paragraph level */ +/* In this table, conditional sequences receive the lower possible level + until proven otherwise. +*/ +{ +/* L , R , EN , AN , ON , S , B , Res */ +/* 0 : init */ { 1 , 0 , 2 , 2 , 0 , 0 , 0 , 0 }, +/* 1 : L */ { 1 , 0 , 1 , 2 , s(1,3), s(1,3), 0 , 1 }, +/* 2 : EN/AN */ { 1 , 0 , 2 , 2 , 0 , 0 , 0 , 1 }, +/* 3 : L+ON */ { s(2,1), s(3,0), 6 , 4 , 3 , 3 , s(3,0), 0 }, +/* 4 : L+ON+AN */ { s(2,1), s(3,0), 6 , 4 , 5 , 5 , s(3,0), 3 }, +/* 5 : L+AN+ON */ { s(2,1), s(3,0), 6 , 4 , 5 , 5 , s(3,0), 2 }, +/* 6 : L+ON+EN */ { s(2,1), s(3,0), 6 , 4 , 3 , 3 , s(3,0), 1 } +}; +static const ImpAct impAct1 = {0,1,13,14}; +/* FOOD FOR THOUGHT: in LTR table below, check case "JKL 123abc" + */ +static const ImpTabPair impTab_INVERSE_LIKE_DIRECT = { + {&impTabL_DEFAULT, + &impTabR_INVERSE_LIKE_DIRECT}, + {&impAct0, &impAct1}}; + +static const ImpTab impTabL_INVERSE_LIKE_DIRECT_WITH_MARKS = +/* The case handled in this table is (visually): R EN L +*/ +{ +/* L , R , EN , AN , ON , S , B , Res */ +/* 0 : init */ { 0 , s(6,3), 0 , 1 , 0 , 0 , 0 , 0 }, +/* 1 : L+AN */ { 0 , s(6,3), 0 , 1 , s(1,2), s(3,0), 0 , 4 }, +/* 2 : L+AN+ON */ { s(2,0), s(6,3), s(2,0), 1 , 2 , s(3,0), s(2,0), 3 }, +/* 3 : R */ { 0 , s(6,3), s(5,5), s(5,6), s(1,4), s(3,0), 0 , 3 }, +/* 4 : R+ON */ { s(3,0), s(4,3), s(5,5), s(5,6), 4 , s(3,0), s(3,0), 3 }, +/* 5 : R+EN */ { s(3,0), s(4,3), 5 , s(5,6), s(1,4), s(3,0), s(3,0), 4 }, +/* 6 : R+AN */ { s(3,0), s(4,3), s(5,5), 6 , s(1,4), s(3,0), s(3,0), 4 } +}; +static const ImpTab impTabR_INVERSE_LIKE_DIRECT_WITH_MARKS = +/* The cases handled in this table are (visually): R EN L + R L AN L +*/ +{ +/* L , R , EN , AN , ON , S , B , Res */ +/* 0 : init */ { s(1,3), 0 , 1 , 1 , 0 , 0 , 0 , 0 }, +/* 1 : R+EN/AN */ { s(2,3), 0 , 1 , 1 , 2 , s(4,0), 0 , 1 }, +/* 2 : R+EN/AN+ON */ { s(2,3), 0 , 1 , 1 , 2 , s(4,0), 0 , 0 }, +/* 3 : L */ { 3 , 0 , 3 , s(3,6), s(1,4), s(4,0), 0 , 1 }, +/* 4 : L+ON */ { s(5,3), s(4,0), 5 , s(3,6), 4 , s(4,0), s(4,0), 0 }, +/* 5 : L+ON+EN */ { s(5,3), s(4,0), 5 , s(3,6), 4 , s(4,0), s(4,0), 1 }, +/* 6 : L+AN */ { s(5,3), s(4,0), 6 , 6 , 4 , s(4,0), s(4,0), 3 } +}; +static const ImpAct impAct2 = {0,1,2,5,6,7,8}; +static const ImpAct impAct3 = {0,1,9,10,11,12}; +static const ImpTabPair impTab_INVERSE_LIKE_DIRECT_WITH_MARKS = { + {&impTabL_INVERSE_LIKE_DIRECT_WITH_MARKS, + &impTabR_INVERSE_LIKE_DIRECT_WITH_MARKS}, + {&impAct2, &impAct3}}; + +static const ImpTabPair impTab_INVERSE_FOR_NUMBERS_SPECIAL = { + {&impTabL_NUMBERS_SPECIAL, + &impTabR_INVERSE_LIKE_DIRECT}, + {&impAct0, &impAct1}}; + +static const ImpTab impTabL_INVERSE_FOR_NUMBERS_SPECIAL_WITH_MARKS = +/* The case handled in this table is (visually): R EN L +*/ +{ +/* L , R , EN , AN , ON , S , B , Res */ +/* 0 : init */ { 0 , s(6,2), 1 , 1 , 0 , 0 , 0 , 0 }, +/* 1 : L+EN/AN */ { 0 , s(6,2), 1 , 1 , 0 , s(3,0), 0 , 4 }, +/* 2 : R */ { 0 , s(6,2), s(5,4), s(5,4), s(1,3), s(3,0), 0 , 3 }, +/* 3 : R+ON */ { s(3,0), s(4,2), s(5,4), s(5,4), 3 , s(3,0), s(3,0), 3 }, +/* 4 : R+EN/AN */ { s(3,0), s(4,2), 4 , 4 , s(1,3), s(3,0), s(3,0), 4 } +}; +static const ImpTabPair impTab_INVERSE_FOR_NUMBERS_SPECIAL_WITH_MARKS = { + {&impTabL_INVERSE_FOR_NUMBERS_SPECIAL_WITH_MARKS, + &impTabR_INVERSE_LIKE_DIRECT_WITH_MARKS}, + {&impAct2, &impAct3}}; + +#undef s + +typedef struct { + const ImpTab * pImpTab; /* level table pointer */ + const ImpAct * pImpAct; /* action map array */ + int32_t startON; /* start of ON sequence */ + int32_t startL2EN; /* start of level 2 sequence */ + int32_t lastStrongRTL; /* index of last found R or AL */ + int32_t state; /* current state */ + int32_t runStart; /* start position of the run */ + UBiDiLevel runLevel; /* run level before implicit solving */ +} LevState; + +/*------------------------------------------------------------------------*/ + +static void +addPoint(UBiDi *pBiDi, int32_t pos, int32_t flag) + /* param pos: position where to insert + param flag: one of LRM_BEFORE, LRM_AFTER, RLM_BEFORE, RLM_AFTER + */ +{ +#define FIRSTALLOC 10 + Point point; + InsertPoints * pInsertPoints=&(pBiDi->insertPoints); + + if (pInsertPoints->capacity == 0) + { + pInsertPoints->points=static_cast(uprv_malloc(sizeof(Point)*FIRSTALLOC)); + if (pInsertPoints->points == NULL) + { + pInsertPoints->errorCode=U_MEMORY_ALLOCATION_ERROR; + return; + } + pInsertPoints->capacity=FIRSTALLOC; + } + if (pInsertPoints->size >= pInsertPoints->capacity) /* no room for new point */ + { + Point * savePoints=pInsertPoints->points; + pInsertPoints->points=static_cast(uprv_realloc(pInsertPoints->points, + pInsertPoints->capacity*2*sizeof(Point))); + if (pInsertPoints->points == NULL) + { + pInsertPoints->points=savePoints; + pInsertPoints->errorCode=U_MEMORY_ALLOCATION_ERROR; + return; + } + else pInsertPoints->capacity*=2; + } + point.pos=pos; + point.flag=flag; + pInsertPoints->points[pInsertPoints->size]=point; + pInsertPoints->size++; +#undef FIRSTALLOC +} + +static void +setLevelsOutsideIsolates(UBiDi *pBiDi, int32_t start, int32_t limit, UBiDiLevel level) +{ + DirProp *dirProps=pBiDi->dirProps, dirProp; + UBiDiLevel *levels=pBiDi->levels; + int32_t isolateCount=0, k; + for(k=start; kpImpTab; + const ImpAct * pImpAct=pLevState->pImpAct; + UBiDiLevel * levels=pBiDi->levels; + UBiDiLevel level, addLevel; + InsertPoints * pInsertPoints; + int32_t start0, k; + + start0=start; /* save original start position */ + oldStateSeq=(uint8_t)pLevState->state; + cell=(*pImpTab)[oldStateSeq][_prop]; + pLevState->state=GET_STATE(cell); /* isolate the new state */ + actionSeq=(*pImpAct)[GET_ACTION(cell)]; /* isolate the action */ + addLevel=(*pImpTab)[pLevState->state][IMPTABLEVELS_RES]; + + if(actionSeq) { + switch(actionSeq) { + case 1: /* init ON seq */ + pLevState->startON=start0; + break; + + case 2: /* prepend ON seq to current seq */ + start=pLevState->startON; + break; + + case 3: /* EN/AN after R+ON */ + level=pLevState->runLevel+1; + setLevelsOutsideIsolates(pBiDi, pLevState->startON, start0, level); + break; + + case 4: /* EN/AN before R for NUMBERS_SPECIAL */ + level=pLevState->runLevel+2; + setLevelsOutsideIsolates(pBiDi, pLevState->startON, start0, level); + break; + + case 5: /* L or S after possible relevant EN/AN */ + /* check if we had EN after R/AL */ + if (pLevState->startL2EN >= 0) { + addPoint(pBiDi, pLevState->startL2EN, LRM_BEFORE); + } + pLevState->startL2EN=-1; /* not within previous if since could also be -2 */ + /* check if we had any relevant EN/AN after R/AL */ + pInsertPoints=&(pBiDi->insertPoints); + if ((pInsertPoints->capacity == 0) || + (pInsertPoints->size <= pInsertPoints->confirmed)) + { + /* nothing, just clean up */ + pLevState->lastStrongRTL=-1; + /* check if we have a pending conditional segment */ + level=(*pImpTab)[oldStateSeq][IMPTABLEVELS_RES]; + if ((level & 1) && (pLevState->startON > 0)) { /* after ON */ + start=pLevState->startON; /* reset to basic run level */ + } + if (_prop == DirProp_S) /* add LRM before S */ + { + addPoint(pBiDi, start0, LRM_BEFORE); + pInsertPoints->confirmed=pInsertPoints->size; + } + break; + } + /* reset previous RTL cont to level for LTR text */ + for (k=pLevState->lastStrongRTL+1; kconfirmed=pInsertPoints->size; + pLevState->lastStrongRTL=-1; + if (_prop == DirProp_S) /* add LRM before S */ + { + addPoint(pBiDi, start0, LRM_BEFORE); + pInsertPoints->confirmed=pInsertPoints->size; + } + break; + + case 6: /* R/AL after possible relevant EN/AN */ + /* just clean up */ + pInsertPoints=&(pBiDi->insertPoints); + if (pInsertPoints->capacity > 0) + /* remove all non confirmed insert points */ + pInsertPoints->size=pInsertPoints->confirmed; + pLevState->startON=-1; + pLevState->startL2EN=-1; + pLevState->lastStrongRTL=limit - 1; + break; + + case 7: /* EN/AN after R/AL + possible cont */ + /* check for real AN */ + if ((_prop == DirProp_AN) && (pBiDi->dirProps[start0] == AN) && + (pBiDi->reorderingMode!=UBIDI_REORDER_INVERSE_FOR_NUMBERS_SPECIAL)) + { + /* real AN */ + if (pLevState->startL2EN == -1) /* if no relevant EN already found */ + { + /* just note the righmost digit as a strong RTL */ + pLevState->lastStrongRTL=limit - 1; + break; + } + if (pLevState->startL2EN >= 0) /* after EN, no AN */ + { + addPoint(pBiDi, pLevState->startL2EN, LRM_BEFORE); + pLevState->startL2EN=-2; + } + /* note AN */ + addPoint(pBiDi, start0, LRM_BEFORE); + break; + } + /* if first EN/AN after R/AL */ + if (pLevState->startL2EN == -1) { + pLevState->startL2EN=start0; + } + break; + + case 8: /* note location of latest R/AL */ + pLevState->lastStrongRTL=limit - 1; + pLevState->startON=-1; + break; + + case 9: /* L after R+ON/EN/AN */ + /* include possible adjacent number on the left */ + for (k=start0-1; k>=0 && !(levels[k]&1); k--); + if(k>=0) { + addPoint(pBiDi, k, RLM_BEFORE); /* add RLM before */ + pInsertPoints=&(pBiDi->insertPoints); + pInsertPoints->confirmed=pInsertPoints->size; /* confirm it */ + } + pLevState->startON=start0; + break; + + case 10: /* AN after L */ + /* AN numbers between L text on both sides may be trouble. */ + /* tentatively bracket with LRMs; will be confirmed if followed by L */ + addPoint(pBiDi, start0, LRM_BEFORE); /* add LRM before */ + addPoint(pBiDi, start0, LRM_AFTER); /* add LRM after */ + break; + + case 11: /* R after L+ON/EN/AN */ + /* false alert, infirm LRMs around previous AN */ + pInsertPoints=&(pBiDi->insertPoints); + pInsertPoints->size=pInsertPoints->confirmed; + if (_prop == DirProp_S) /* add RLM before S */ + { + addPoint(pBiDi, start0, RLM_BEFORE); + pInsertPoints->confirmed=pInsertPoints->size; + } + break; + + case 12: /* L after L+ON/AN */ + level=pLevState->runLevel + addLevel; + for(k=pLevState->startON; kinsertPoints); + pInsertPoints->confirmed=pInsertPoints->size; /* confirm inserts */ + pLevState->startON=start0; + break; + + case 13: /* L after L+ON+EN/AN/ON */ + level=pLevState->runLevel; + for(k=start0-1; k>=pLevState->startON; k--) { + if(levels[k]==level+3) { + while(levels[k]==level+3) { + levels[k--]-=2; + } + while(levels[k]==level) { + k--; + } + } + if(levels[k]==level+2) { + levels[k]=level; + continue; + } + levels[k]=level+1; + } + break; + + case 14: /* R after L+ON+EN/AN/ON */ + level=pLevState->runLevel+1; + for(k=start0-1; k>=pLevState->startON; k--) { + if(levels[k]>level) { + levels[k]-=2; + } + } + break; + + default: /* we should never get here */ + U_ASSERT(FALSE); + break; + } + } + if((addLevel) || (start < start0)) { + level=pLevState->runLevel + addLevel; + if(start>=pLevState->runStart) { + for(k=start; kprologue; + int32_t length=pBiDi->proLength; + int32_t i; + UChar32 uchar; + DirProp dirProp; + for(i=length; i>0; ) { + /* i is decremented by U16_PREV */ + U16_PREV(text, 0, i, uchar); + dirProp=(DirProp)ubidi_getCustomizedClass(pBiDi, uchar); + if(dirProp==L) { + return DirProp_L; + } + if(dirProp==R || dirProp==AL) { + return DirProp_R; + } + if(dirProp==B) { + return DirProp_ON; + } + } + return DirProp_ON; +} + +/** + * Returns the directionality of the first strong character, or digit, in the epilogue, if any. + * Requires epilogue!=null. + */ +static DirProp +firstL_R_AL_EN_AN(UBiDi *pBiDi) { + const UChar *text=pBiDi->epilogue; + int32_t length=pBiDi->epiLength; + int32_t i; + UChar32 uchar; + DirProp dirProp; + for(i=0; idirProps; + DirProp dirProp; + LevState levState; + int32_t i, start1, start2; + uint16_t oldStateImp, stateImp, actionImp; + uint8_t gprop, resProp, cell; + UBool inverseRTL; + DirProp nextStrongProp=R; + int32_t nextStrongPos=-1; + + /* check for RTL inverse BiDi mode */ + /* FOOD FOR THOUGHT: in case of RTL inverse BiDi, it would make sense to + * loop on the text characters from end to start. + * This would need a different properties state table (at least different + * actions) and different levels state tables (maybe very similar to the + * LTR corresponding ones. + */ + inverseRTL=(UBool) + ((startlastArabicPos) && (GET_PARALEVEL(pBiDi, start) & 1) && + (pBiDi->reorderingMode==UBIDI_REORDER_INVERSE_LIKE_DIRECT || + pBiDi->reorderingMode==UBIDI_REORDER_INVERSE_FOR_NUMBERS_SPECIAL)); + + /* initialize for property and levels state tables */ + levState.startL2EN=-1; /* used for INVERSE_LIKE_DIRECT_WITH_MARKS */ + levState.lastStrongRTL=-1; /* used for INVERSE_LIKE_DIRECT_WITH_MARKS */ + levState.runStart=start; + levState.runLevel=pBiDi->levels[start]; + levState.pImpTab=(const ImpTab*)((pBiDi->pImpTabPair)->pImpTab)[levState.runLevel&1]; + levState.pImpAct=(const ImpAct*)((pBiDi->pImpTabPair)->pImpAct)[levState.runLevel&1]; + if(start==0 && pBiDi->proLength>0) { + DirProp lastStrong=lastL_R_AL(pBiDi); + if(lastStrong!=DirProp_ON) { + sor=lastStrong; + } + } + /* The isolates[] entries contain enough information to + resume the bidi algorithm in the same state as it was + when it was interrupted by an isolate sequence. */ + if(dirProps[start]==PDI && pBiDi->isolateCount >= 0) { + levState.startON=pBiDi->isolates[pBiDi->isolateCount].startON; + start1=pBiDi->isolates[pBiDi->isolateCount].start1; + stateImp=pBiDi->isolates[pBiDi->isolateCount].stateImp; + levState.state=pBiDi->isolates[pBiDi->isolateCount].state; + pBiDi->isolateCount--; + } else { + levState.startON=-1; + start1=start; + if(dirProps[start]==NSM) + stateImp = 1 + sor; + else + stateImp=0; + levState.state=0; + processPropertySeq(pBiDi, &levState, sor, start, start); + } + start2=start; /* to make Java compiler happy */ + + for(i=start; i<=limit; i++) { + if(i>=limit) { + int32_t k; + for(k=limit-1; k>start&&(DIRPROP_FLAG(dirProps[k])&MASK_BN_EXPLICIT); k--); + dirProp=dirProps[k]; + if(dirProp==LRI || dirProp==RLI) + break; /* no forced closing for sequence ending with LRI/RLI */ + gprop=eor; + } else { + DirProp prop, prop1; + prop=dirProps[i]; + if(prop==B) { + pBiDi->isolateCount=-1; /* current isolates stack entry == none */ + } + if(inverseRTL) { + if(prop==AL) { + /* AL before EN does not make it AN */ + prop=R; + } else if(prop==EN) { + if(nextStrongPos<=i) { + /* look for next strong char (L/R/AL) */ + int32_t j; + nextStrongProp=R; /* set default */ + nextStrongPos=limit; + for(j=i+1; jlength && pBiDi->epiLength>0) { + DirProp firstStrong=firstL_R_AL_EN_AN(pBiDi); + if(firstStrong!=DirProp_ON) { + eor=firstStrong; + } + } + + /* look for the last char not a BN or LRE/RLE/LRO/RLO/PDF */ + for(i=limit-1; i>start&&(DIRPROP_FLAG(dirProps[i])&MASK_BN_EXPLICIT); i--); + dirProp=dirProps[i]; + if((dirProp==LRI || dirProp==RLI) && limitlength) { + pBiDi->isolateCount++; + pBiDi->isolates[pBiDi->isolateCount].stateImp=stateImp; + pBiDi->isolates[pBiDi->isolateCount].state=levState.state; + pBiDi->isolates[pBiDi->isolateCount].start1=start1; + pBiDi->isolates[pBiDi->isolateCount].startON=levState.startON; + } + else + processPropertySeq(pBiDi, &levState, eor, limit, limit); +} + +/* perform (L1) and (X9) ---------------------------------------------------- */ + +/* + * Reset the embedding levels for some non-graphic characters (L1). + * This function also sets appropriate levels for BN, and + * explicit embedding types that are supposed to have been removed + * from the paragraph in (X9). + */ +static void +adjustWSLevels(UBiDi *pBiDi) { + const DirProp *dirProps=pBiDi->dirProps; + UBiDiLevel *levels=pBiDi->levels; + int32_t i; + + if(pBiDi->flags&MASK_WS) { + UBool orderParagraphsLTR=pBiDi->orderParagraphsLTR; + Flags flag; + + i=pBiDi->trailingWSStart; + while(i>0) { + /* reset a sequence of WS/BN before eop and B/S to the paragraph paraLevel */ + while(i>0 && (flag=DIRPROP_FLAG(dirProps[--i]))&MASK_WS) { + if(orderParagraphsLTR&&(flag&DIRPROP_FLAG(B))) { + levels[i]=0; + } else { + levels[i]=GET_PARALEVEL(pBiDi, i); + } + } + + /* reset BN to the next character's paraLevel until B/S, which restarts above loop */ + /* here, i+1 is guaranteed to be 0) { + flag=DIRPROP_FLAG(dirProps[--i]); + if(flag&MASK_BN_EXPLICIT) { + levels[i]=levels[i+1]; + } else if(orderParagraphsLTR&&(flag&DIRPROP_FLAG(B))) { + levels[i]=0; + break; + } else if(flag&MASK_B_S) { + levels[i]=GET_PARALEVEL(pBiDi, i); + break; + } + } + } + } +} + +U_CAPI void U_EXPORT2 +ubidi_setContext(UBiDi *pBiDi, + const UChar *prologue, int32_t proLength, + const UChar *epilogue, int32_t epiLength, + UErrorCode *pErrorCode) { + /* check the argument values */ + RETURN_VOID_IF_NULL_OR_FAILING_ERRCODE(pErrorCode); + if(pBiDi==NULL || proLength<-1 || epiLength<-1 || + (prologue==NULL && proLength!=0) || (epilogue==NULL && epiLength!=0)) { + *pErrorCode=U_ILLEGAL_ARGUMENT_ERROR; + return; + } + + if(proLength==-1) { + pBiDi->proLength=u_strlen(prologue); + } else { + pBiDi->proLength=proLength; + } + if(epiLength==-1) { + pBiDi->epiLength=u_strlen(epilogue); + } else { + pBiDi->epiLength=epiLength; + } + pBiDi->prologue=prologue; + pBiDi->epilogue=epilogue; +} + +static void +setParaSuccess(UBiDi *pBiDi) { + pBiDi->proLength=0; /* forget the last context */ + pBiDi->epiLength=0; + pBiDi->pParaBiDi=pBiDi; /* mark successful setPara */ +} + +#define BIDI_MIN(x, y) ((x)<(y) ? (x) : (y)) +#define BIDI_ABS(x) ((x)>=0 ? (x) : (-(x))) + +static void +setParaRunsOnly(UBiDi *pBiDi, const UChar *text, int32_t length, + UBiDiLevel paraLevel, UErrorCode *pErrorCode) { + int32_t *runsOnlyMemory = NULL; + int32_t *visualMap; + UChar *visualText; + int32_t saveLength, saveTrailingWSStart; + const UBiDiLevel *levels; + UBiDiLevel *saveLevels; + UBiDiDirection saveDirection; + UBool saveMayAllocateText; + Run *runs; + int32_t visualLength, i, j, visualStart, logicalStart, + runCount, runLength, addedRuns, insertRemove, + start, limit, step, indexOddBit, logicalPos, + index0, index1; + uint32_t saveOptions; + + pBiDi->reorderingMode=UBIDI_REORDER_DEFAULT; + if(length==0) { + ubidi_setPara(pBiDi, text, length, paraLevel, NULL, pErrorCode); + goto cleanup3; + } + /* obtain memory for mapping table and visual text */ + runsOnlyMemory=static_cast(uprv_malloc(length*(sizeof(int32_t)+sizeof(UChar)+sizeof(UBiDiLevel)))); + if(runsOnlyMemory==NULL) { + *pErrorCode=U_MEMORY_ALLOCATION_ERROR; + goto cleanup3; + } + visualMap=runsOnlyMemory; + visualText=(UChar *)&visualMap[length]; + saveLevels=(UBiDiLevel *)&visualText[length]; + saveOptions=pBiDi->reorderingOptions; + if(saveOptions & UBIDI_OPTION_INSERT_MARKS) { + pBiDi->reorderingOptions&=~UBIDI_OPTION_INSERT_MARKS; + pBiDi->reorderingOptions|=UBIDI_OPTION_REMOVE_CONTROLS; + } + paraLevel&=1; /* accept only 0 or 1 */ + ubidi_setPara(pBiDi, text, length, paraLevel, NULL, pErrorCode); + if(U_FAILURE(*pErrorCode)) { + goto cleanup3; + } + /* we cannot access directly pBiDi->levels since it is not yet set if + * direction is not MIXED + */ + levels=ubidi_getLevels(pBiDi, pErrorCode); + uprv_memcpy(saveLevels, levels, (size_t)pBiDi->length*sizeof(UBiDiLevel)); + saveTrailingWSStart=pBiDi->trailingWSStart; + saveLength=pBiDi->length; + saveDirection=pBiDi->direction; + + /* FOOD FOR THOUGHT: instead of writing the visual text, we could use + * the visual map and the dirProps array to drive the second call + * to ubidi_setPara (but must make provision for possible removal of + * BiDi controls. Alternatively, only use the dirProps array via + * customized classifier callback. + */ + visualLength=ubidi_writeReordered(pBiDi, visualText, length, + UBIDI_DO_MIRRORING, pErrorCode); + ubidi_getVisualMap(pBiDi, visualMap, pErrorCode); + if(U_FAILURE(*pErrorCode)) { + goto cleanup2; + } + pBiDi->reorderingOptions=saveOptions; + + pBiDi->reorderingMode=UBIDI_REORDER_INVERSE_LIKE_DIRECT; + paraLevel^=1; + /* Because what we did with reorderingOptions, visualText may be shorter + * than the original text. But we don't want the levels memory to be + * reallocated shorter than the original length, since we need to restore + * the levels as after the first call to ubidi_setpara() before returning. + * We will force mayAllocateText to FALSE before the second call to + * ubidi_setpara(), and will restore it afterwards. + */ + saveMayAllocateText=pBiDi->mayAllocateText; + pBiDi->mayAllocateText=FALSE; + ubidi_setPara(pBiDi, visualText, visualLength, paraLevel, NULL, pErrorCode); + pBiDi->mayAllocateText=saveMayAllocateText; + ubidi_getRuns(pBiDi, pErrorCode); + if(U_FAILURE(*pErrorCode)) { + goto cleanup1; + } + /* check if some runs must be split, count how many splits */ + addedRuns=0; + runCount=pBiDi->runCount; + runs=pBiDi->runs; + visualStart=0; + for(i=0; irunsMemory[0]=runs[0]; + } + runs=pBiDi->runs=pBiDi->runsMemory; + pBiDi->runCount+=addedRuns; + } else { + goto cleanup1; + } + } + /* split runs which are not consecutive in source text */ + for(i=runCount-1; i>=0; i--) { + runLength= i==0 ? runs[0].visualLimit : + runs[i].visualLimit-runs[i-1].visualLimit; + logicalStart=runs[i].logicalStart; + indexOddBit=GET_ODD_BIT(logicalStart); + logicalStart=GET_INDEX(logicalStart); + if(runLength<2) { + if(addedRuns) { + runs[i+addedRuns]=runs[i]; + } + logicalPos=visualMap[logicalStart]; + runs[i+addedRuns].logicalStart=MAKE_INDEX_ODD_PAIR(logicalPos, + saveLevels[logicalPos]^indexOddBit); + continue; + } + if(indexOddBit) { + start=logicalStart; + limit=logicalStart+runLength-1; + step=1; + } else { + start=logicalStart+runLength-1; + limit=logicalStart; + step=-1; + } + for(j=start; j!=limit; j+=step) { + index0=visualMap[j]; + index1=visualMap[j+step]; + if((BIDI_ABS(index0-index1)!=1) || (saveLevels[index0]!=saveLevels[index1])) { + logicalPos=BIDI_MIN(visualMap[start], index0); + runs[i+addedRuns].logicalStart=MAKE_INDEX_ODD_PAIR(logicalPos, + saveLevels[logicalPos]^indexOddBit); + runs[i+addedRuns].visualLimit=runs[i].visualLimit; + runs[i].visualLimit-=BIDI_ABS(j-start)+1; + insertRemove=runs[i].insertRemove&(LRM_AFTER|RLM_AFTER); + runs[i+addedRuns].insertRemove=insertRemove; + runs[i].insertRemove&=~insertRemove; + start=j+step; + addedRuns--; + } + } + if(addedRuns) { + runs[i+addedRuns]=runs[i]; + } + logicalPos=BIDI_MIN(visualMap[start], visualMap[limit]); + runs[i+addedRuns].logicalStart=MAKE_INDEX_ODD_PAIR(logicalPos, + saveLevels[logicalPos]^indexOddBit); + } + + cleanup1: + /* restore initial paraLevel */ + pBiDi->paraLevel^=1; + cleanup2: + /* restore real text */ + pBiDi->text=text; + pBiDi->length=saveLength; + pBiDi->originalLength=length; + pBiDi->direction=saveDirection; + /* the saved levels should never excess levelsSize, but we check anyway */ + if(saveLength>pBiDi->levelsSize) { + saveLength=pBiDi->levelsSize; + } + uprv_memcpy(pBiDi->levels, saveLevels, (size_t)saveLength*sizeof(UBiDiLevel)); + pBiDi->trailingWSStart=saveTrailingWSStart; + if(pBiDi->runCount>1) { + pBiDi->direction=UBIDI_MIXED; + } + cleanup3: + /* free memory for mapping table and visual text */ + uprv_free(runsOnlyMemory); + + pBiDi->reorderingMode=UBIDI_REORDER_RUNS_ONLY; +} + +/* ubidi_setPara ------------------------------------------------------------ */ + +U_CAPI void U_EXPORT2 +ubidi_setPara(UBiDi *pBiDi, const UChar *text, int32_t length, + UBiDiLevel paraLevel, UBiDiLevel *embeddingLevels, + UErrorCode *pErrorCode) { + UBiDiDirection direction; + DirProp *dirProps; + + /* check the argument values */ + RETURN_VOID_IF_NULL_OR_FAILING_ERRCODE(pErrorCode); + if(pBiDi==NULL || text==NULL || length<-1 || + (paraLevel>UBIDI_MAX_EXPLICIT_LEVEL && paraLevelreorderingMode==UBIDI_REORDER_RUNS_ONLY) { + setParaRunsOnly(pBiDi, text, length, paraLevel, pErrorCode); + return; + } + + /* initialize the UBiDi structure */ + pBiDi->pParaBiDi=NULL; /* mark unfinished setPara */ + pBiDi->text=text; + pBiDi->length=pBiDi->originalLength=pBiDi->resultLength=length; + pBiDi->paraLevel=paraLevel; + pBiDi->direction=(UBiDiDirection)(paraLevel&1); + pBiDi->paraCount=1; + + pBiDi->dirProps=NULL; + pBiDi->levels=NULL; + pBiDi->runs=NULL; + pBiDi->insertPoints.size=0; /* clean up from last call */ + pBiDi->insertPoints.confirmed=0; /* clean up from last call */ + + /* + * Save the original paraLevel if contextual; otherwise, set to 0. + */ + pBiDi->defaultParaLevel=IS_DEFAULT_LEVEL(paraLevel); + + if(length==0) { + /* + * For an empty paragraph, create a UBiDi object with the paraLevel and + * the flags and the direction set but without allocating zero-length arrays. + * There is nothing more to do. + */ + if(IS_DEFAULT_LEVEL(paraLevel)) { + pBiDi->paraLevel&=1; + pBiDi->defaultParaLevel=0; + } + pBiDi->flags=DIRPROP_FLAG_LR(paraLevel); + pBiDi->runCount=0; + pBiDi->paraCount=0; + setParaSuccess(pBiDi); /* mark successful setPara */ + return; + } + + pBiDi->runCount=-1; + + /* allocate paras memory */ + if(pBiDi->parasMemory) + pBiDi->paras=pBiDi->parasMemory; + else + pBiDi->paras=pBiDi->simpleParas; + + /* + * Get the directional properties, + * the flags bit-set, and + * determine the paragraph level if necessary. + */ + if(getDirPropsMemory(pBiDi, length)) { + pBiDi->dirProps=pBiDi->dirPropsMemory; + if(!getDirProps(pBiDi)) { + *pErrorCode=U_MEMORY_ALLOCATION_ERROR; + return; + } + } else { + *pErrorCode=U_MEMORY_ALLOCATION_ERROR; + return; + } + dirProps=pBiDi->dirProps; + /* the processed length may have changed if UBIDI_OPTION_STREAMING */ + length= pBiDi->length; + pBiDi->trailingWSStart=length; /* the levels[] will reflect the WS run */ + + /* are explicit levels specified? */ + if(embeddingLevels==NULL) { + /* no: determine explicit levels according to the (Xn) rules */\ + if(getLevelsMemory(pBiDi, length)) { + pBiDi->levels=pBiDi->levelsMemory; + direction=resolveExplicitLevels(pBiDi, pErrorCode); + if(U_FAILURE(*pErrorCode)) { + return; + } + } else { + *pErrorCode=U_MEMORY_ALLOCATION_ERROR; + return; + } + } else { + /* set BN for all explicit codes, check that all levels are 0 or paraLevel..UBIDI_MAX_EXPLICIT_LEVEL */ + pBiDi->levels=embeddingLevels; + direction=checkExplicitLevels(pBiDi, pErrorCode); + if(U_FAILURE(*pErrorCode)) { + return; + } + } + + /* allocate isolate memory */ + if(pBiDi->isolateCount<=SIMPLE_ISOLATES_COUNT) + pBiDi->isolates=pBiDi->simpleIsolates; + else + if((int32_t)(pBiDi->isolateCount*sizeof(Isolate))<=pBiDi->isolatesSize) + pBiDi->isolates=pBiDi->isolatesMemory; + else { + if(getInitialIsolatesMemory(pBiDi, pBiDi->isolateCount)) { + pBiDi->isolates=pBiDi->isolatesMemory; + } else { + *pErrorCode=U_MEMORY_ALLOCATION_ERROR; + return; + } + } + pBiDi->isolateCount=-1; /* current isolates stack entry == none */ + + /* + * The steps after (X9) in the UBiDi algorithm are performed only if + * the paragraph text has mixed directionality! + */ + pBiDi->direction=direction; + switch(direction) { + case UBIDI_LTR: + /* all levels are implicitly at paraLevel (important for ubidi_getLevels()) */ + pBiDi->trailingWSStart=0; + break; + case UBIDI_RTL: + /* all levels are implicitly at paraLevel (important for ubidi_getLevels()) */ + pBiDi->trailingWSStart=0; + break; + default: + /* + * Choose the right implicit state table + */ + switch(pBiDi->reorderingMode) { + case UBIDI_REORDER_DEFAULT: + pBiDi->pImpTabPair=&impTab_DEFAULT; + break; + case UBIDI_REORDER_NUMBERS_SPECIAL: + pBiDi->pImpTabPair=&impTab_NUMBERS_SPECIAL; + break; + case UBIDI_REORDER_GROUP_NUMBERS_WITH_R: + pBiDi->pImpTabPair=&impTab_GROUP_NUMBERS_WITH_R; + break; + case UBIDI_REORDER_INVERSE_NUMBERS_AS_L: + pBiDi->pImpTabPair=&impTab_INVERSE_NUMBERS_AS_L; + break; + case UBIDI_REORDER_INVERSE_LIKE_DIRECT: + if (pBiDi->reorderingOptions & UBIDI_OPTION_INSERT_MARKS) { + pBiDi->pImpTabPair=&impTab_INVERSE_LIKE_DIRECT_WITH_MARKS; + } else { + pBiDi->pImpTabPair=&impTab_INVERSE_LIKE_DIRECT; + } + break; + case UBIDI_REORDER_INVERSE_FOR_NUMBERS_SPECIAL: + if (pBiDi->reorderingOptions & UBIDI_OPTION_INSERT_MARKS) { + pBiDi->pImpTabPair=&impTab_INVERSE_FOR_NUMBERS_SPECIAL_WITH_MARKS; + } else { + pBiDi->pImpTabPair=&impTab_INVERSE_FOR_NUMBERS_SPECIAL; + } + break; + default: + /* we should never get here */ + U_ASSERT(FALSE); + break; + } + /* + * If there are no external levels specified and there + * are no significant explicit level codes in the text, + * then we can treat the entire paragraph as one run. + * Otherwise, we need to perform the following rules on runs of + * the text with the same embedding levels. (X10) + * "Significant" explicit level codes are ones that actually + * affect non-BN characters. + * Examples for "insignificant" ones are empty embeddings + * LRE-PDF, LRE-RLE-PDF-PDF, etc. + */ + if(embeddingLevels==NULL && pBiDi->paraCount<=1 && + !(pBiDi->flags&DIRPROP_FLAG_MULTI_RUNS)) { + resolveImplicitLevels(pBiDi, 0, length, + GET_LR_FROM_LEVEL(GET_PARALEVEL(pBiDi, 0)), + GET_LR_FROM_LEVEL(GET_PARALEVEL(pBiDi, length-1))); + } else { + /* sor, eor: start and end types of same-level-run */ + UBiDiLevel *levels=pBiDi->levels; + int32_t start, limit=0; + UBiDiLevel level, nextLevel; + DirProp sor, eor; + + /* determine the first sor and set eor to it because of the loop body (sor=eor there) */ + level=GET_PARALEVEL(pBiDi, 0); + nextLevel=levels[0]; + if(level0) && (dirProps[start-1]==B)) { + /* except if this is a new paragraph, then set sor = para level */ + sor=GET_LR_FROM_LEVEL(GET_PARALEVEL(pBiDi, start)); + } else { + sor=eor; + } + + /* search for the limit of this run */ + while((++limitinsertPoints.errorCode)) + { + *pErrorCode=pBiDi->insertPoints.errorCode; + return; + } + /* reset the embedding levels for some non-graphic characters (L1), (X9) */ + adjustWSLevels(pBiDi); + break; + } + /* add RLM for inverse Bidi with contextual orientation resolving + * to RTL which would not round-trip otherwise + */ + if((pBiDi->defaultParaLevel>0) && + (pBiDi->reorderingOptions & UBIDI_OPTION_INSERT_MARKS) && + ((pBiDi->reorderingMode==UBIDI_REORDER_INVERSE_LIKE_DIRECT) || + (pBiDi->reorderingMode==UBIDI_REORDER_INVERSE_FOR_NUMBERS_SPECIAL))) { + int32_t i, j, start, last; + UBiDiLevel level; + DirProp dirProp; + for(i=0; iparaCount; i++) { + last=(pBiDi->paras[i].limit)-1; + level=pBiDi->paras[i].level; + if(level==0) + continue; /* LTR paragraph */ + start= i==0 ? 0 : pBiDi->paras[i-1].limit; + for(j=last; j>=start; j--) { + dirProp=dirProps[j]; + if(dirProp==L) { + if(jreorderingOptions & UBIDI_OPTION_REMOVE_CONTROLS) { + pBiDi->resultLength -= pBiDi->controlCount; + } else { + pBiDi->resultLength += pBiDi->insertPoints.size; + } + setParaSuccess(pBiDi); /* mark successful setPara */ +} + +U_CAPI void U_EXPORT2 +ubidi_orderParagraphsLTR(UBiDi *pBiDi, UBool orderParagraphsLTR) { + if(pBiDi!=NULL) { + pBiDi->orderParagraphsLTR=orderParagraphsLTR; + } +} + +U_CAPI UBool U_EXPORT2 +ubidi_isOrderParagraphsLTR(UBiDi *pBiDi) { + if(pBiDi!=NULL) { + return pBiDi->orderParagraphsLTR; + } else { + return FALSE; + } +} + +U_CAPI UBiDiDirection U_EXPORT2 +ubidi_getDirection(const UBiDi *pBiDi) { + if(IS_VALID_PARA_OR_LINE(pBiDi)) { + return pBiDi->direction; + } else { + return UBIDI_LTR; + } +} + +U_CAPI const UChar * U_EXPORT2 +ubidi_getText(const UBiDi *pBiDi) { + if(IS_VALID_PARA_OR_LINE(pBiDi)) { + return pBiDi->text; + } else { + return NULL; + } +} + +U_CAPI int32_t U_EXPORT2 +ubidi_getLength(const UBiDi *pBiDi) { + if(IS_VALID_PARA_OR_LINE(pBiDi)) { + return pBiDi->originalLength; + } else { + return 0; + } +} + +U_CAPI int32_t U_EXPORT2 +ubidi_getProcessedLength(const UBiDi *pBiDi) { + if(IS_VALID_PARA_OR_LINE(pBiDi)) { + return pBiDi->length; + } else { + return 0; + } +} + +U_CAPI int32_t U_EXPORT2 +ubidi_getResultLength(const UBiDi *pBiDi) { + if(IS_VALID_PARA_OR_LINE(pBiDi)) { + return pBiDi->resultLength; + } else { + return 0; + } +} + +/* paragraphs API functions ------------------------------------------------- */ + +U_CAPI UBiDiLevel U_EXPORT2 +ubidi_getParaLevel(const UBiDi *pBiDi) { + if(IS_VALID_PARA_OR_LINE(pBiDi)) { + return pBiDi->paraLevel; + } else { + return 0; + } +} + +U_CAPI int32_t U_EXPORT2 +ubidi_countParagraphs(UBiDi *pBiDi) { + if(!IS_VALID_PARA_OR_LINE(pBiDi)) { + return 0; + } else { + return pBiDi->paraCount; + } +} + +U_CAPI void U_EXPORT2 +ubidi_getParagraphByIndex(const UBiDi *pBiDi, int32_t paraIndex, + int32_t *pParaStart, int32_t *pParaLimit, + UBiDiLevel *pParaLevel, UErrorCode *pErrorCode) { + int32_t paraStart; + + /* check the argument values */ + RETURN_VOID_IF_NULL_OR_FAILING_ERRCODE(pErrorCode); + RETURN_VOID_IF_NOT_VALID_PARA_OR_LINE(pBiDi, *pErrorCode); + RETURN_VOID_IF_BAD_RANGE(paraIndex, 0, pBiDi->paraCount, *pErrorCode); + + pBiDi=pBiDi->pParaBiDi; /* get Para object if Line object */ + if(paraIndex) { + paraStart=pBiDi->paras[paraIndex-1].limit; + } else { + paraStart=0; + } + if(pParaStart!=NULL) { + *pParaStart=paraStart; + } + if(pParaLimit!=NULL) { + *pParaLimit=pBiDi->paras[paraIndex].limit; + } + if(pParaLevel!=NULL) { + *pParaLevel=GET_PARALEVEL(pBiDi, paraStart); + } +} + +U_CAPI int32_t U_EXPORT2 +ubidi_getParagraph(const UBiDi *pBiDi, int32_t charIndex, + int32_t *pParaStart, int32_t *pParaLimit, + UBiDiLevel *pParaLevel, UErrorCode *pErrorCode) { + int32_t paraIndex; + + /* check the argument values */ + /* pErrorCode will be checked by the call to ubidi_getParagraphByIndex */ + RETURN_IF_NULL_OR_FAILING_ERRCODE(pErrorCode, -1); + RETURN_IF_NOT_VALID_PARA_OR_LINE(pBiDi, *pErrorCode, -1); + pBiDi=pBiDi->pParaBiDi; /* get Para object if Line object */ + RETURN_IF_BAD_RANGE(charIndex, 0, pBiDi->length, *pErrorCode, -1); + + for(paraIndex=0; charIndex>=pBiDi->paras[paraIndex].limit; paraIndex++); + ubidi_getParagraphByIndex(pBiDi, paraIndex, pParaStart, pParaLimit, pParaLevel, pErrorCode); + return paraIndex; +} + +U_CAPI void U_EXPORT2 +ubidi_setClassCallback(UBiDi *pBiDi, UBiDiClassCallback *newFn, + const void *newContext, UBiDiClassCallback **oldFn, + const void **oldContext, UErrorCode *pErrorCode) +{ + RETURN_VOID_IF_NULL_OR_FAILING_ERRCODE(pErrorCode); + if(pBiDi==NULL) { + *pErrorCode=U_ILLEGAL_ARGUMENT_ERROR; + return; + } + if( oldFn ) + { + *oldFn = pBiDi->fnClassCallback; + } + if( oldContext ) + { + *oldContext = pBiDi->coClassCallback; + } + pBiDi->fnClassCallback = newFn; + pBiDi->coClassCallback = newContext; +} + +U_CAPI void U_EXPORT2 +ubidi_getClassCallback(UBiDi *pBiDi, UBiDiClassCallback **fn, const void **context) +{ + if(pBiDi==NULL) { + return; + } + if( fn ) + { + *fn = pBiDi->fnClassCallback; + } + if( context ) + { + *context = pBiDi->coClassCallback; + } +} + +U_CAPI UCharDirection U_EXPORT2 +ubidi_getCustomizedClass(UBiDi *pBiDi, UChar32 c) +{ + UCharDirection dir; + + if( pBiDi->fnClassCallback == NULL || + (dir = (*pBiDi->fnClassCallback)(pBiDi->coClassCallback, c)) == U_BIDI_CLASS_DEFAULT ) + { + dir = ubidi_getClass(pBiDi->bdp, c); + } + if(dir >= U_CHAR_DIRECTION_COUNT) { + dir = (UCharDirection)ON; + } + return dir; +} diff --git a/Build/source/libs/icu/icu-src/source/common/ubidi_props.c b/Build/source/libs/icu/icu-src/source/common/ubidi_props.c deleted file mode 100644 index 7c7a6ce25ef..00000000000 --- a/Build/source/libs/icu/icu-src/source/common/ubidi_props.c +++ /dev/null @@ -1,265 +0,0 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. -// License & terms of use: http://www.unicode.org/copyright.html -/* -******************************************************************************* -* -* Copyright (C) 2004-2014, International Business Machines -* Corporation and others. All Rights Reserved. -* -******************************************************************************* -* file name: ubidi_props.c -* encoding: US-ASCII -* tab size: 8 (not used) -* indentation:4 -* -* created on: 2004dec30 -* created by: Markus W. Scherer -* -* Low-level Unicode bidi/shaping properties access. -*/ - -#include "unicode/utypes.h" -#include "unicode/uset.h" -#include "unicode/udata.h" /* UDataInfo */ -#include "ucmndata.h" /* DataHeader */ -#include "udatamem.h" -#include "uassert.h" -#include "cmemory.h" -#include "utrie2.h" -#include "ubidi_props.h" -#include "ucln_cmn.h" - -struct UBiDiProps { - UDataMemory *mem; - const int32_t *indexes; - const uint32_t *mirrors; - const uint8_t *jgArray; - const uint8_t *jgArray2; - - UTrie2 trie; - uint8_t formatVersion[4]; -}; - -/* ubidi_props_data.h is machine-generated by genbidi --csource */ -#define INCLUDED_FROM_UBIDI_PROPS_C -#include "ubidi_props_data.h" - -/* UBiDiProps singleton ----------------------------------------------------- */ - -U_CFUNC const UBiDiProps * -ubidi_getSingleton() { - return &ubidi_props_singleton; -} - -/* set of property starts for UnicodeSet ------------------------------------ */ - -static UBool U_CALLCONV -_enumPropertyStartsRange(const void *context, UChar32 start, UChar32 end, uint32_t value) { - /* add the start code point to the USet */ - const USetAdder *sa=(const USetAdder *)context; - sa->add(sa->set, start); - return TRUE; -} - -U_CFUNC void -ubidi_addPropertyStarts(const UBiDiProps *bdp, const USetAdder *sa, UErrorCode *pErrorCode) { - int32_t i, length; - UChar32 c, start, limit; - - const uint8_t *jgArray; - uint8_t prev, jg; - - if(U_FAILURE(*pErrorCode)) { - return; - } - - /* add the start code point of each same-value range of the trie */ - utrie2_enum(&bdp->trie, NULL, _enumPropertyStartsRange, sa); - - /* add the code points from the bidi mirroring table */ - length=bdp->indexes[UBIDI_IX_MIRROR_LENGTH]; - for(i=0; imirrors[i]); - sa->addRange(sa->set, c, c+1); - } - - /* add the code points from the Joining_Group array where the value changes */ - start=bdp->indexes[UBIDI_IX_JG_START]; - limit=bdp->indexes[UBIDI_IX_JG_LIMIT]; - jgArray=bdp->jgArray; - for(;;) { - prev=0; - while(startadd(sa->set, start); - prev=jg; - } - ++start; - } - if(prev!=0) { - /* add the limit code point if the last value was not 0 (it is now start==limit) */ - sa->add(sa->set, limit); - } - if(limit==bdp->indexes[UBIDI_IX_JG_LIMIT]) { - /* switch to the second Joining_Group range */ - start=bdp->indexes[UBIDI_IX_JG_START2]; - limit=bdp->indexes[UBIDI_IX_JG_LIMIT2]; - jgArray=bdp->jgArray2; - } else { - break; - } - } - - /* add code points with hardcoded properties, plus the ones following them */ - - /* (none right now) */ -} - -/* property access functions ------------------------------------------------ */ - -U_CFUNC int32_t -ubidi_getMaxValue(const UBiDiProps *bdp, UProperty which) { - int32_t max; - - if(bdp==NULL) { - return -1; - } - - max=bdp->indexes[UBIDI_MAX_VALUES_INDEX]; - switch(which) { - case UCHAR_BIDI_CLASS: - return (max&UBIDI_CLASS_MASK); - case UCHAR_JOINING_GROUP: - return (max&UBIDI_MAX_JG_MASK)>>UBIDI_MAX_JG_SHIFT; - case UCHAR_JOINING_TYPE: - return (max&UBIDI_JT_MASK)>>UBIDI_JT_SHIFT; - case UCHAR_BIDI_PAIRED_BRACKET_TYPE: - return (max&UBIDI_BPT_MASK)>>UBIDI_BPT_SHIFT; - default: - return -1; /* undefined */ - } -} - -U_CAPI UCharDirection -ubidi_getClass(const UBiDiProps *bdp, UChar32 c) { - uint16_t props=UTRIE2_GET16(&bdp->trie, c); - return (UCharDirection)UBIDI_GET_CLASS(props); -} - -U_CFUNC UBool -ubidi_isMirrored(const UBiDiProps *bdp, UChar32 c) { - uint16_t props=UTRIE2_GET16(&bdp->trie, c); - return (UBool)UBIDI_GET_FLAG(props, UBIDI_IS_MIRRORED_SHIFT); -} - -static UChar32 -getMirror(const UBiDiProps *bdp, UChar32 c, uint16_t props) { - int32_t delta=UBIDI_GET_MIRROR_DELTA(props); - if(delta!=UBIDI_ESC_MIRROR_DELTA) { - return c+delta; - } else { - /* look for mirror code point in the mirrors[] table */ - const uint32_t *mirrors; - uint32_t m; - int32_t i, length; - UChar32 c2; - - mirrors=bdp->mirrors; - length=bdp->indexes[UBIDI_IX_MIRROR_LENGTH]; - - /* linear search */ - for(i=0; itrie, c); - return getMirror(bdp, c, props); -} - -U_CFUNC UBool -ubidi_isBidiControl(const UBiDiProps *bdp, UChar32 c) { - uint16_t props=UTRIE2_GET16(&bdp->trie, c); - return (UBool)UBIDI_GET_FLAG(props, UBIDI_BIDI_CONTROL_SHIFT); -} - -U_CFUNC UBool -ubidi_isJoinControl(const UBiDiProps *bdp, UChar32 c) { - uint16_t props=UTRIE2_GET16(&bdp->trie, c); - return (UBool)UBIDI_GET_FLAG(props, UBIDI_JOIN_CONTROL_SHIFT); -} - -U_CFUNC UJoiningType -ubidi_getJoiningType(const UBiDiProps *bdp, UChar32 c) { - uint16_t props=UTRIE2_GET16(&bdp->trie, c); - return (UJoiningType)((props&UBIDI_JT_MASK)>>UBIDI_JT_SHIFT); -} - -U_CFUNC UJoiningGroup -ubidi_getJoiningGroup(const UBiDiProps *bdp, UChar32 c) { - UChar32 start, limit; - - start=bdp->indexes[UBIDI_IX_JG_START]; - limit=bdp->indexes[UBIDI_IX_JG_LIMIT]; - if(start<=c && cjgArray[c-start]; - } - start=bdp->indexes[UBIDI_IX_JG_START2]; - limit=bdp->indexes[UBIDI_IX_JG_LIMIT2]; - if(start<=c && cjgArray2[c-start]; - } - return U_JG_NO_JOINING_GROUP; -} - -U_CFUNC UBidiPairedBracketType -ubidi_getPairedBracketType(const UBiDiProps *bdp, UChar32 c) { - uint16_t props=UTRIE2_GET16(&bdp->trie, c); - return (UBidiPairedBracketType)((props&UBIDI_BPT_MASK)>>UBIDI_BPT_SHIFT); -} - -U_CFUNC UChar32 -ubidi_getPairedBracket(const UBiDiProps *bdp, UChar32 c) { - uint16_t props=UTRIE2_GET16(&bdp->trie, c); - if((props&UBIDI_BPT_MASK)==0) { - return c; - } else { - return getMirror(bdp, c, props); - } -} - -/* public API (see uchar.h) ------------------------------------------------- */ - -U_CFUNC UCharDirection -u_charDirection(UChar32 c) { - return ubidi_getClass(&ubidi_props_singleton, c); -} - -U_CFUNC UBool -u_isMirrored(UChar32 c) { - return ubidi_isMirrored(&ubidi_props_singleton, c); -} - -U_CFUNC UChar32 -u_charMirror(UChar32 c) { - return ubidi_getMirror(&ubidi_props_singleton, c); -} - -U_STABLE UChar32 U_EXPORT2 -u_getBidiPairedBracket(UChar32 c) { - return ubidi_getPairedBracket(&ubidi_props_singleton, c); -} diff --git a/Build/source/libs/icu/icu-src/source/common/ubidi_props.cpp b/Build/source/libs/icu/icu-src/source/common/ubidi_props.cpp new file mode 100644 index 00000000000..103e21ca45e --- /dev/null +++ b/Build/source/libs/icu/icu-src/source/common/ubidi_props.cpp @@ -0,0 +1,267 @@ +// © 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html +/* +******************************************************************************* +* +* Copyright (C) 2004-2014, International Business Machines +* Corporation and others. All Rights Reserved. +* +******************************************************************************* +* file name: ubidi_props.c +* encoding: UTF-8 +* tab size: 8 (not used) +* indentation:4 +* +* created on: 2004dec30 +* created by: Markus W. Scherer +* +* Low-level Unicode bidi/shaping properties access. +*/ + +#include "unicode/utypes.h" +#include "unicode/uset.h" +#include "unicode/udata.h" /* UDataInfo */ +#include "ucmndata.h" /* DataHeader */ +#include "udatamem.h" +#include "uassert.h" +#include "cmemory.h" +#include "utrie2.h" +#include "ubidi_props.h" +#include "ucln_cmn.h" + +struct UBiDiProps { + UDataMemory *mem; + const int32_t *indexes; + const uint32_t *mirrors; + const uint8_t *jgArray; + const uint8_t *jgArray2; + + UTrie2 trie; + uint8_t formatVersion[4]; +}; + +/* ubidi_props_data.h is machine-generated by genbidi --csource */ +#define INCLUDED_FROM_UBIDI_PROPS_C +#include "ubidi_props_data.h" + +/* UBiDiProps singleton ----------------------------------------------------- */ + +U_CFUNC const UBiDiProps * +ubidi_getSingleton() { + return &ubidi_props_singleton; +} + +/* set of property starts for UnicodeSet ------------------------------------ */ + +static UBool U_CALLCONV +_enumPropertyStartsRange(const void *context, UChar32 start, UChar32 end, uint32_t value) { + (void)end; + (void)value; + /* add the start code point to the USet */ + const USetAdder *sa=(const USetAdder *)context; + sa->add(sa->set, start); + return TRUE; +} + +U_CFUNC void +ubidi_addPropertyStarts(const UBiDiProps *bdp, const USetAdder *sa, UErrorCode *pErrorCode) { + int32_t i, length; + UChar32 c, start, limit; + + const uint8_t *jgArray; + uint8_t prev, jg; + + if(U_FAILURE(*pErrorCode)) { + return; + } + + /* add the start code point of each same-value range of the trie */ + utrie2_enum(&bdp->trie, NULL, _enumPropertyStartsRange, sa); + + /* add the code points from the bidi mirroring table */ + length=bdp->indexes[UBIDI_IX_MIRROR_LENGTH]; + for(i=0; imirrors[i]); + sa->addRange(sa->set, c, c+1); + } + + /* add the code points from the Joining_Group array where the value changes */ + start=bdp->indexes[UBIDI_IX_JG_START]; + limit=bdp->indexes[UBIDI_IX_JG_LIMIT]; + jgArray=bdp->jgArray; + for(;;) { + prev=0; + while(startadd(sa->set, start); + prev=jg; + } + ++start; + } + if(prev!=0) { + /* add the limit code point if the last value was not 0 (it is now start==limit) */ + sa->add(sa->set, limit); + } + if(limit==bdp->indexes[UBIDI_IX_JG_LIMIT]) { + /* switch to the second Joining_Group range */ + start=bdp->indexes[UBIDI_IX_JG_START2]; + limit=bdp->indexes[UBIDI_IX_JG_LIMIT2]; + jgArray=bdp->jgArray2; + } else { + break; + } + } + + /* add code points with hardcoded properties, plus the ones following them */ + + /* (none right now) */ +} + +/* property access functions ------------------------------------------------ */ + +U_CFUNC int32_t +ubidi_getMaxValue(const UBiDiProps *bdp, UProperty which) { + int32_t max; + + if(bdp==NULL) { + return -1; + } + + max=bdp->indexes[UBIDI_MAX_VALUES_INDEX]; + switch(which) { + case UCHAR_BIDI_CLASS: + return (max&UBIDI_CLASS_MASK); + case UCHAR_JOINING_GROUP: + return (max&UBIDI_MAX_JG_MASK)>>UBIDI_MAX_JG_SHIFT; + case UCHAR_JOINING_TYPE: + return (max&UBIDI_JT_MASK)>>UBIDI_JT_SHIFT; + case UCHAR_BIDI_PAIRED_BRACKET_TYPE: + return (max&UBIDI_BPT_MASK)>>UBIDI_BPT_SHIFT; + default: + return -1; /* undefined */ + } +} + +U_CAPI UCharDirection +ubidi_getClass(const UBiDiProps *bdp, UChar32 c) { + uint16_t props=UTRIE2_GET16(&bdp->trie, c); + return (UCharDirection)UBIDI_GET_CLASS(props); +} + +U_CFUNC UBool +ubidi_isMirrored(const UBiDiProps *bdp, UChar32 c) { + uint16_t props=UTRIE2_GET16(&bdp->trie, c); + return (UBool)UBIDI_GET_FLAG(props, UBIDI_IS_MIRRORED_SHIFT); +} + +static UChar32 +getMirror(const UBiDiProps *bdp, UChar32 c, uint16_t props) { + int32_t delta=UBIDI_GET_MIRROR_DELTA(props); + if(delta!=UBIDI_ESC_MIRROR_DELTA) { + return c+delta; + } else { + /* look for mirror code point in the mirrors[] table */ + const uint32_t *mirrors; + uint32_t m; + int32_t i, length; + UChar32 c2; + + mirrors=bdp->mirrors; + length=bdp->indexes[UBIDI_IX_MIRROR_LENGTH]; + + /* linear search */ + for(i=0; itrie, c); + return getMirror(bdp, c, props); +} + +U_CFUNC UBool +ubidi_isBidiControl(const UBiDiProps *bdp, UChar32 c) { + uint16_t props=UTRIE2_GET16(&bdp->trie, c); + return (UBool)UBIDI_GET_FLAG(props, UBIDI_BIDI_CONTROL_SHIFT); +} + +U_CFUNC UBool +ubidi_isJoinControl(const UBiDiProps *bdp, UChar32 c) { + uint16_t props=UTRIE2_GET16(&bdp->trie, c); + return (UBool)UBIDI_GET_FLAG(props, UBIDI_JOIN_CONTROL_SHIFT); +} + +U_CFUNC UJoiningType +ubidi_getJoiningType(const UBiDiProps *bdp, UChar32 c) { + uint16_t props=UTRIE2_GET16(&bdp->trie, c); + return (UJoiningType)((props&UBIDI_JT_MASK)>>UBIDI_JT_SHIFT); +} + +U_CFUNC UJoiningGroup +ubidi_getJoiningGroup(const UBiDiProps *bdp, UChar32 c) { + UChar32 start, limit; + + start=bdp->indexes[UBIDI_IX_JG_START]; + limit=bdp->indexes[UBIDI_IX_JG_LIMIT]; + if(start<=c && cjgArray[c-start]; + } + start=bdp->indexes[UBIDI_IX_JG_START2]; + limit=bdp->indexes[UBIDI_IX_JG_LIMIT2]; + if(start<=c && cjgArray2[c-start]; + } + return U_JG_NO_JOINING_GROUP; +} + +U_CFUNC UBidiPairedBracketType +ubidi_getPairedBracketType(const UBiDiProps *bdp, UChar32 c) { + uint16_t props=UTRIE2_GET16(&bdp->trie, c); + return (UBidiPairedBracketType)((props&UBIDI_BPT_MASK)>>UBIDI_BPT_SHIFT); +} + +U_CFUNC UChar32 +ubidi_getPairedBracket(const UBiDiProps *bdp, UChar32 c) { + uint16_t props=UTRIE2_GET16(&bdp->trie, c); + if((props&UBIDI_BPT_MASK)==0) { + return c; + } else { + return getMirror(bdp, c, props); + } +} + +/* public API (see uchar.h) ------------------------------------------------- */ + +U_CFUNC UCharDirection +u_charDirection(UChar32 c) { + return ubidi_getClass(&ubidi_props_singleton, c); +} + +U_CFUNC UBool +u_isMirrored(UChar32 c) { + return ubidi_isMirrored(&ubidi_props_singleton, c); +} + +U_CFUNC UChar32 +u_charMirror(UChar32 c) { + return ubidi_getMirror(&ubidi_props_singleton, c); +} + +U_STABLE UChar32 U_EXPORT2 +u_getBidiPairedBracket(UChar32 c) { + return ubidi_getPairedBracket(&ubidi_props_singleton, c); +} diff --git a/Build/source/libs/icu/icu-src/source/common/ubidi_props.h b/Build/source/libs/icu/icu-src/source/common/ubidi_props.h index 4312230bc09..69e8853e69b 100644 --- a/Build/source/libs/icu/icu-src/source/common/ubidi_props.h +++ b/Build/source/libs/icu/icu-src/source/common/ubidi_props.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* @@ -8,7 +8,7 @@ * ******************************************************************************* * file name: ubidi_props.h -* encoding: US-ASCII +* encoding: UTF-8 * tab size: 8 (not used) * indentation:4 * diff --git a/Build/source/libs/icu/icu-src/source/common/ubidi_props_data.h b/Build/source/libs/icu/icu-src/source/common/ubidi_props_data.h index 685d2b1e844..98f21510e7d 100644 --- a/Build/source/libs/icu/icu-src/source/common/ubidi_props_data.h +++ b/Build/source/libs/icu/icu-src/source/common/ubidi_props_data.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html // // Copyright (C) 1999-2016, International Business Machines @@ -11,37 +11,37 @@ #ifdef INCLUDED_FROM_UBIDI_PROPS_C -static const UVersionInfo ubidi_props_dataVersion={9,0,0,0}; +static const UVersionInfo ubidi_props_dataVersion={0xa,0,0,0}; -static const int32_t ubidi_props_indexes[UBIDI_IX_TOP]={0x10,0x5df0,0x5a78,0x1a,0x620,0x8c0,0x10ac0,0x10af0,0,0,0,0,0,0,0,0x5802b6}; +static const int32_t ubidi_props_indexes[UBIDI_IX_TOP]={0x10,0x6028,0x5cb0,0x1a,0x620,0x8c0,0x10ac0,0x10af0,0,0,0,0,0,0,0,0x6302b6}; -static const uint16_t ubidi_props_trieIndex[11572]={ +static const uint16_t ubidi_props_trieIndex[11856]={ 0x36a,0x372,0x37a,0x382,0x39a,0x3a2,0x3aa,0x3b2,0x38a,0x392,0x38a,0x392,0x38a,0x392,0x38a,0x392, 0x38a,0x392,0x38a,0x392,0x3b8,0x3c0,0x3c8,0x3d0,0x3d8,0x3e0,0x3dc,0x3e4,0x3ec,0x3f4,0x3ef,0x3f7, 0x38a,0x392,0x38a,0x392,0x3ff,0x407,0x38a,0x392,0x38a,0x392,0x38a,0x392,0x40d,0x415,0x41d,0x425, 0x42d,0x435,0x43d,0x445,0x44b,0x453,0x45b,0x463,0x46b,0x473,0x479,0x481,0x489,0x491,0x499,0x4a1, -0x4ad,0x4a9,0x4b5,0x41f,0x41f,0x4c5,0x4cd,0x4bd,0x4d5,0x4d7,0x4df,0x4e7,0x4ef,0x4f0,0x4f8,0x500, -0x508,0x4f0,0x510,0x515,0x508,0x4f0,0x51d,0x525,0x4ef,0x52a,0x532,0x4e7,0x537,0x38a,0x53f,0x543, -0x54b,0x54c,0x554,0x55c,0x4ef,0x564,0x56c,0x4e7,0x4ef,0x38a,0x4f8,0x4e7,0x38a,0x38a,0x572,0x38a, -0x38a,0x578,0x580,0x38a,0x38a,0x584,0x58c,0x38a,0x590,0x597,0x38a,0x59f,0x5a7,0x5ae,0x536,0x38a, -0x38a,0x5b6,0x5be,0x5c6,0x5ce,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a, -0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x5d6,0x38a,0x5de,0x38a,0x38a,0x38a, -0x5e6,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a, -0x38a,0x38a,0x38a,0x38a,0x5ee,0x38a,0x38a,0x38a,0x5f6,0x5f6,0x4fc,0x4fc,0x38a,0x5fc,0x604,0x5de, -0x61a,0x60c,0x60c,0x622,0x629,0x612,0x38a,0x38a,0x38a,0x631,0x639,0x38a,0x38a,0x38a,0x63b,0x643, -0x64b,0x38a,0x652,0x65a,0x38a,0x662,0x38a,0x38a,0x66a,0x66d,0x537,0x675,0x401,0x67d,0x38a,0x684, -0x38a,0x689,0x38a,0x38a,0x38a,0x38a,0x68f,0x697,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x3d8,0x69f, -0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x6a7,0x6af,0x6b3, -0x6cb,0x6d1,0x6bb,0x6c3,0x6d9,0x6e1,0x6e5,0x5b1,0x6ed,0x6f5,0x6fd,0x38a,0x705,0x643,0x643,0x643, -0x715,0x71d,0x725,0x72d,0x732,0x73a,0x742,0x70d,0x74a,0x752,0x38a,0x758,0x75f,0x643,0x643,0x765, -0x643,0x562,0x76a,0x643,0x772,0x38a,0x38a,0x640,0x643,0x643,0x643,0x643,0x643,0x643,0x643,0x643, -0x643,0x643,0x643,0x643,0x643,0x77a,0x643,0x643,0x643,0x643,0x643,0x780,0x643,0x643,0x788,0x790, -0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x643,0x643,0x643,0x643,0x7a0,0x7a7,0x7af,0x798, -0x7bf,0x7c7,0x7cf,0x7d6,0x7de,0x7e6,0x7ed,0x7b7,0x643,0x643,0x643,0x7f5,0x7fb,0x801,0x809,0x80e, -0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x815,0x38a,0x38a,0x38a,0x81d,0x38a,0x38a,0x38a,0x3d8, -0x825,0x82d,0x834,0x38a,0x83c,0x643,0x643,0x646,0x643,0x643,0x643,0x643,0x643,0x643,0x843,0x849, -0x859,0x851,0x38a,0x38a,0x861,0x5e6,0x38a,0x3b1,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x643,0x81c, -0x3bf,0x38a,0x838,0x869,0x38a,0x871,0x80e,0x38a,0x38a,0x38a,0x38a,0x879,0x38a,0x38a,0x63b,0x3b0, +0x4ad,0x4a9,0x4b5,0x4bd,0x41f,0x4cd,0x4d5,0x4c5,0x4dd,0x4df,0x4e7,0x4ef,0x4f7,0x4f8,0x500,0x508, +0x510,0x4f8,0x518,0x51d,0x510,0x4f8,0x525,0x52d,0x4f7,0x535,0x53d,0x4ef,0x542,0x38a,0x54a,0x54e, +0x556,0x557,0x55f,0x567,0x4f7,0x56f,0x577,0x4ef,0x401,0x57b,0x500,0x4ef,0x38a,0x38a,0x583,0x38a, +0x38a,0x589,0x591,0x38a,0x38a,0x595,0x59d,0x38a,0x5a1,0x5a8,0x38a,0x5b0,0x5b8,0x5bf,0x541,0x38a, +0x38a,0x5c7,0x5cf,0x5d7,0x5df,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a, +0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x5e7,0x38a,0x5ef,0x38a,0x38a,0x38a, +0x5f7,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a, +0x38a,0x38a,0x38a,0x38a,0x5ff,0x38a,0x38a,0x38a,0x607,0x607,0x504,0x504,0x38a,0x60d,0x615,0x5ef, +0x62b,0x61d,0x61d,0x633,0x63a,0x623,0x38a,0x38a,0x38a,0x642,0x64a,0x38a,0x38a,0x38a,0x64c,0x654, +0x65c,0x38a,0x663,0x66b,0x38a,0x673,0x38a,0x38a,0x534,0x67b,0x542,0x683,0x401,0x68b,0x38a,0x692, +0x38a,0x697,0x38a,0x38a,0x38a,0x38a,0x69d,0x6a5,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x3d8,0x6ad, +0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x6b5,0x6bd,0x6c1, +0x6d9,0x6df,0x6c9,0x6d1,0x6e7,0x6ef,0x6f3,0x5c2,0x6fb,0x703,0x70b,0x38a,0x713,0x654,0x654,0x654, +0x723,0x72b,0x733,0x73b,0x740,0x748,0x750,0x71b,0x758,0x760,0x38a,0x766,0x76d,0x654,0x654,0x654, +0x654,0x56d,0x773,0x654,0x77b,0x38a,0x38a,0x651,0x654,0x654,0x654,0x654,0x654,0x654,0x654,0x654, +0x654,0x654,0x654,0x654,0x654,0x783,0x654,0x654,0x654,0x654,0x654,0x789,0x654,0x654,0x791,0x799, +0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x654,0x654,0x654,0x654,0x7a9,0x7b0,0x7b8,0x7a1, +0x7c8,0x7d0,0x7d8,0x7df,0x7e7,0x7ef,0x7f6,0x7c0,0x654,0x654,0x654,0x7fe,0x804,0x80a,0x812,0x817, +0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x81e,0x38a,0x38a,0x38a,0x826,0x38a,0x38a,0x38a,0x3d8, +0x82e,0x836,0x763,0x38a,0x839,0x654,0x654,0x657,0x654,0x654,0x654,0x654,0x654,0x654,0x840,0x846, +0x856,0x84e,0x38a,0x38a,0x85e,0x5f7,0x38a,0x3b1,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x654,0x825, +0x3bf,0x38a,0x866,0x86e,0x38a,0x876,0x817,0x38a,0x38a,0x38a,0x38a,0x87e,0x38a,0x38a,0x64c,0x3b0, 0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a, 0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a, 0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a, @@ -54,7 +54,7 @@ static const uint16_t ubidi_props_trieIndex[11572]={ 0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a, 0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a, 0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a, -0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x643,0x643, +0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x654,0x654, 0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a, 0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a, 0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a, @@ -98,10 +98,10 @@ static const uint16_t ubidi_props_trieIndex[11572]={ 0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a, 0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a, 0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a, -0x38a,0x38a,0x38a,0x38a,0x838,0x643,0x562,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a, -0x880,0x38a,0x38a,0x885,0x54c,0x38a,0x38a,0x592,0x643,0x63a,0x38a,0x38a,0x88d,0x38a,0x38a,0x38a, -0x895,0x89c,0x60c,0x8a4,0x38a,0x38a,0x8ab,0x8b3,0x38a,0x8ba,0x8c1,0x38a,0x4d5,0x8c6,0x38a,0x4ee, -0x38a,0x8ce,0x8d6,0x4f0,0x38a,0x8da,0x4ef,0x8e2,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x8e9, +0x38a,0x38a,0x38a,0x38a,0x866,0x654,0x56d,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a, +0x885,0x38a,0x38a,0x88a,0x557,0x38a,0x38a,0x5a3,0x654,0x64b,0x38a,0x38a,0x892,0x38a,0x38a,0x38a, +0x89a,0x8a1,0x61d,0x8a9,0x38a,0x38a,0x579,0x8b1,0x38a,0x8b8,0x8bf,0x38a,0x4dd,0x8c4,0x38a,0x4f6, +0x38a,0x8cc,0x8d4,0x4f8,0x38a,0x8d8,0x4f7,0x8e0,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x8e7, 0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a, 0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a, 0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a, @@ -141,100 +141,100 @@ static const uint16_t ubidi_props_trieIndex[11572]={ 0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a, 0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a, 0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a, -0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x8fd,0x8f1,0x8f5,0x489,0x489,0x489,0x489,0x489, -0x489,0x489,0x489,0x489,0x489,0x489,0x489,0x489,0x489,0x905,0x489,0x489,0x489,0x489,0x90d,0x911, -0x919,0x921,0x925,0x92d,0x489,0x489,0x489,0x931,0x939,0x37a,0x941,0x949,0x38a,0x38a,0x38a,0x951, +0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x8fb,0x8ef,0x8f3,0x489,0x489,0x489,0x489,0x489, +0x489,0x489,0x489,0x489,0x489,0x489,0x489,0x489,0x489,0x903,0x489,0x489,0x489,0x489,0x90b,0x90f, +0x917,0x91f,0x923,0x92b,0x489,0x489,0x489,0x92f,0x937,0x37a,0x93f,0x947,0x38a,0x38a,0x38a,0x94f, 0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a, 0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a, 0xe28,0xe28,0xe68,0xea8,0xe28,0xe28,0xe28,0xe28,0xe28,0xe28,0xee0,0xf20,0xf60,0xf70,0xfb0,0xfbc, 0xe28,0xe28,0xffc,0xe28,0xe28,0xe28,0x1034,0x1074,0x10b4,0x10f4,0x112c,0x116c,0x11ac,0x11e4,0x1224,0x1264, -0xa40,0xa80,0xac0,0xafa,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0xb23,0x1a0,0x1a0, -0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0xb60,0x1a0,0x1a0,0xb95,0xbd5,0xc15,0xc55,0xc95,0xcd5, +0xa40,0xa80,0xac0,0xafa,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0xb25,0x1a0,0x1a0, +0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0xb62,0x1a0,0x1a0,0xb97,0xbd7,0xc17,0xc57,0xc97,0xcd7, 0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0, -0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0xd15, +0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0xd17, 0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0, -0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0xd15, +0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0xd17, 0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0, -0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0xd15, +0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0xd17, 0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0, -0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0xd15, +0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0xd17, 0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0, -0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0xd15, +0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0xd17, 0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0, -0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0xd15, +0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0xd17, 0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0, -0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0xd15, +0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0xd17, 0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0, -0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0xd15, +0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0xd17, 0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0, -0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0xd15, +0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0xd17, 0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0, -0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0xd15, +0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0xd17, 0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0, -0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0xd15, +0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0xd17, 0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0, -0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0xd15, -0xd55,0xd65,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0, -0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0xd15, +0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0xd17, +0xd57,0xd67,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0, +0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0xd17, 0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0, -0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0xd15, +0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0xd17, 0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0, -0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0xd15, -0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x959,0x38a,0x643,0x643,0x961,0x5e6,0x38a,0x4e8, -0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x969,0x38a,0x38a,0x38a,0x970,0x38a,0x38a,0x38a,0x38a, +0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0xd17, +0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x957,0x38a,0x654,0x654,0x95f,0x5f7,0x38a,0x4f0, +0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x967,0x38a,0x38a,0x38a,0x96e,0x38a,0x38a,0x38a,0x38a, 0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a, 0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a, -0x41f,0x41f,0x41f,0x41f,0x41f,0x41f,0x41f,0x41f,0x978,0x41f,0x41f,0x41f,0x41f,0x41f,0x41f,0x41f, -0x980,0x984,0x41f,0x41f,0x41f,0x41f,0x994,0x98c,0x41f,0x99c,0x41f,0x41f,0x9a4,0x9aa,0x41f,0x41f, +0x41f,0x41f,0x41f,0x41f,0x41f,0x41f,0x41f,0x41f,0x976,0x41f,0x41f,0x41f,0x41f,0x41f,0x41f,0x41f, +0x97e,0x982,0x41f,0x41f,0x41f,0x41f,0x992,0x98a,0x41f,0x99a,0x41f,0x41f,0x9a2,0x9a8,0x41f,0x41f, 0x41f,0x41f,0x41f,0x41f,0x41f,0x41f,0x41f,0x41f,0x41f,0x41f,0x41f,0x41f,0x41f,0x41f,0x41f,0x41f, -0x41f,0x41f,0x41f,0x9b2,0x41f,0x41f,0x41f,0x41f,0x41f,0x41f,0x41f,0x41f,0x41f,0x41f,0x41f,0x41f, -0x4ef,0x8ad,0x9ba,0x9c1,0x401,0x9c4,0x38a,0x38a,0x4d5,0x9cc,0x38a,0x9d2,0x401,0x9d7,0x5f8,0x38a, -0x38a,0x9df,0x38a,0x38a,0x38a,0x38a,0x81d,0x9e7,0x401,0x4f0,0x54b,0x9ee,0x38a,0x38a,0x38a,0x38a, -0x38a,0x8ad,0x9f6,0x38a,0x38a,0x9fa,0xa02,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0xa06,0xa0e,0x38a, -0x38a,0xa16,0x54b,0x832,0x38a,0xa1e,0x38a,0x38a,0x5d6,0xa26,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a, +0x41f,0x41f,0x41f,0x9b0,0x41f,0x41f,0x41f,0x41f,0x41f,0x41f,0x41f,0x41f,0x41f,0x41f,0x41f,0x41f, +0x4f7,0x9b8,0x9bf,0x9c6,0x401,0x9c9,0x38a,0x38a,0x4dd,0x9d1,0x38a,0x9d7,0x401,0x9dc,0x609,0x38a, +0x38a,0x9e4,0x38a,0x38a,0x38a,0x38a,0x826,0x9ec,0x401,0x4f8,0x556,0x9f3,0x38a,0x38a,0x38a,0x38a, +0x38a,0x9b8,0x9fb,0x38a,0x38a,0x9ff,0xa07,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0xa0b,0xa13,0x38a, +0x38a,0xa1b,0x556,0xa23,0x38a,0xa29,0x38a,0x38a,0x5e7,0xa31,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a, +0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0xa39,0xa3d,0xa45,0x38a,0xa4c,0x38a, +0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0xa53,0x38a,0x38a,0xa61,0xa5b, +0x38a,0x38a,0x38a,0xa69,0xa71,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a, +0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0xa75,0x38a,0xa7b,0x38a, 0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a, -0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0xa2a,0x38a,0x38a,0xa32,0xa38, 0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a, -0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0xa3e,0x38a,0xa44,0x38a,0x38a,0x38a, +0x38a,0xa81,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a, 0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a, -0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0xa4a, +0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x511,0xa89,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a, 0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a, +0x38a,0x38a,0xa90,0xa98,0xa9e,0x38a,0x38a,0x654,0x654,0xaa6,0x38a,0x38a,0x38a,0x38a,0x38a,0x654, +0x654,0xaae,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a, +0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0xab4,0x38a,0xabb, +0x38a,0xab7,0x38a,0xabe,0x38a,0xac6,0xaca,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a, +0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x3d8,0xad2,0x3d8,0xad9,0xae0,0xae8,0x38a,0x38a,0x38a, 0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a, -0x38a,0x38a,0x38a,0x38a,0x509,0xa52,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a, 0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a, -0xa59,0xa61,0xa67,0x38a,0x38a,0x643,0x643,0xa6f,0x38a,0x38a,0x38a,0x38a,0x38a,0x643,0x643,0x767, +0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0xaf0,0xaf8,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a, 0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a, -0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0xa71,0x38a,0xa78,0x38a,0xa74, -0x38a,0xa7b,0x38a,0xa83,0xa87,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a, -0x38a,0x38a,0x38a,0x38a,0x38a,0x3d8,0xa8f,0x3d8,0xa96,0xa9d,0xaa5,0x38a,0x38a,0x38a,0x38a,0x38a, 0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a, 0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a, -0x38a,0x38a,0x38a,0x38a,0x38a,0xaad,0xab5,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a, -0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a, -0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a, -0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a, -0x38a,0x38a,0x38a,0x38a,0x38a,0x41f,0x41f,0x41f,0x41f,0x41f,0x41f,0xabd,0x41f,0xac5,0xac5,0xacc, +0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x41f,0x41f,0x41f,0x41f,0x41f,0x41f,0xb00,0x41f,0xb08, +0xb08,0xb0f,0x41f,0x41f,0x41f,0x41f,0x41f,0x41f,0x41f,0x41f,0x41f,0x41f,0x41f,0x41f,0x41f,0x41f, 0x41f,0x41f,0x41f,0x41f,0x41f,0x41f,0x41f,0x41f,0x41f,0x41f,0x41f,0x41f,0x41f,0x41f,0x41f,0x41f, -0x41f,0x41f,0x41f,0x41f,0x41f,0x41f,0x41f,0x41f,0x41f,0x41f,0x41f,0x41f,0x41f,0x41f,0x41f,0x41f, -0x41f,0x41f,0x41f,0x41f,0x41f,0x489,0x489,0x489,0x489,0x489,0x489,0x489,0xad4,0x41f,0x41f,0x41f, -0x41f,0x41f,0x41f,0x41f,0x41f,0x643,0xadc,0x643,0x643,0x646,0xae1,0xae5,0x843,0xaed,0x38a,0x38a, -0xaf3,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x643,0x643,0x643, -0x643,0x643,0x643,0x643,0x643,0x643,0x643,0x643,0x643,0x643,0x643,0x643,0x643,0x643,0x643,0x643, -0x643,0x643,0x643,0x643,0x643,0x643,0x643,0x643,0x643,0x643,0x643,0x768,0xafb,0x643,0x643,0x643, -0x646,0x643,0x643,0x830,0x38a,0xadc,0x643,0xb03,0x643,0xb0b,0x845,0x38a,0x38a,0xb1b,0xb23,0xb2b, -0x38a,0x844,0x38a,0x5e6,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a, +0x41f,0x41f,0x41f,0x41f,0x41f,0x41f,0x41f,0x489,0x489,0x489,0x489,0x489,0x489,0x489,0xb17,0x41f, +0x41f,0x41f,0x41f,0x41f,0x41f,0x41f,0x41f,0x654,0xb1f,0x654,0x654,0x657,0xb24,0xb28,0x840,0xb30, +0x38a,0x38a,0xb36,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x764,0x38a,0x38a,0x38a,0x38a,0x654, +0x654,0x654,0x654,0x654,0x654,0x654,0x654,0x654,0x654,0x654,0x654,0x654,0x654,0x654,0x654,0x654, +0x654,0x654,0x654,0x654,0x654,0x654,0x654,0x654,0x654,0x654,0x654,0x654,0x654,0xb3e,0xb46,0x654, +0x654,0x654,0x657,0x654,0x654,0xb3e,0x38a,0xb1f,0x654,0xb4e,0x654,0xb56,0x842,0x38a,0x38a,0xb1f, +0xb5a,0xb62,0x659,0x656,0x38a,0xb6a,0x56d,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a, 0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a, 0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a, -0x38a,0x38a,0x38a,0x38a,0xb13,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a, +0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0xb72,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a, 0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a, 0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a, 0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a, -0x38a,0x38a,0x38a,0x38a,0xb13,0xb3b,0xb33,0xb33,0xb33,0xb3c,0xb3c,0xb3c,0xb3c,0x3d8,0x3d8,0x3d8, -0x3d8,0x3d8,0x3d8,0x3d8,0xb44,0xb3c,0xb3c,0xb3c,0xb3c,0xb3c,0xb3c,0xb3c,0xb3c,0xb3c,0xb3c,0xb3c, -0xb3c,0xb3c,0xb3c,0xb3c,0xb3c,0xb3c,0xb3c,0xb3c,0xb3c,0xb3c,0xb3c,0xb3c,0xb3c,0xb3c,0xb3c,0xb3c, -0xb3c,0xb3c,0xb3c,0xb3c,0xb3c,0xb3c,0xb3c,0xb3c,0xb3c,0xb3c,0xb3c,0xb3c,0xb3c,0xb3c,0xb3c,0xb3c, -0xb3c,0xb3c,0xb3c,0xb3c,0xb3c,0xb3c,0xb3c,0xb3c,0xb3c,0xb3c,0xb3c,0xb3c,0xb3c,0xb3c,0xb3c,0xb3c, -0xb3c,0xb3c,0xb3c,0xb3c,0xb3c,0x369,0x369,0x369,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12, +0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0xb72,0xb82,0xb7a,0xb7a,0xb7a,0xb83,0xb83,0xb83,0xb83,0x3d8, +0x3d8,0x3d8,0x3d8,0x3d8,0x3d8,0x3d8,0xb8b,0xb83,0xb83,0xb83,0xb83,0xb83,0xb83,0xb83,0xb83,0xb83, +0xb83,0xb83,0xb83,0xb83,0xb83,0xb83,0xb83,0xb83,0xb83,0xb83,0xb83,0xb83,0xb83,0xb83,0xb83,0xb83, +0xb83,0xb83,0xb83,0xb83,0xb83,0xb83,0xb83,0xb83,0xb83,0xb83,0xb83,0xb83,0xb83,0xb83,0xb83,0xb83, +0xb83,0xb83,0xb83,0xb83,0xb83,0xb83,0xb83,0xb83,0xb83,0xb83,0xb83,0xb83,0xb83,0xb83,0xb83,0xb83, +0xb83,0xb83,0xb83,0xb83,0xb83,0xb83,0xb83,0x369,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12, 0x12,8,7,8,9,7,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12, 0x12,0x12,0x12,0x12,7,7,7,8,9,0xa,0xa,4,4,4,0xa,0xa, 0x310a,0xf20a,0xa,3,6,3,6,6,2,2,2,2,2,2,2,2, @@ -319,6 +319,8 @@ static const uint16_t ubidi_props_trieIndex[11572]={ 1,1,1,1,1,1,1,1,1,1,0xb1,0xb1,0xb1,0xb1,1,0xb1, 0xb1,0xb1,0xb1,0xb1,0x81,0x41,0x41,0x41,0x41,0x41,0x81,0x81,0x41,0x81,0x41,0x41, 0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x81,0x41,1,1,1,0xb1,0xb1,0xb1, +1,1,1,1,0x4d,0xd,0x4d,0x4d,0x4d,0x4d,0xd,0x8d,0x4d,0x8d,0x8d,0xd, +0xd,0xd,0xd,0xd,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,0xb1,0xb1,5,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1, 0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1, 0xb1,0xb1,0xb1,0xb1,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x8d,0x8d, @@ -346,400 +348,415 @@ static const uint16_t ubidi_props_trieIndex[11572]={ 0,0,0,0,0,0xb1,0xb1,0xb1,0xb1,0xb1,0,0xb1,0xb1,0,0,0, 0,0xb1,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0xb1,0xb1,0,0,0,0,0,0,0,0, -0,0,0,0,0,4,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0xb1,0,0,0xb1,0,0xb1,0xb1,0xb1,0xb1,0,0,0, -0,0,0,0,0,0xb1,0,0,0,0,0,0,0,0,0xb1,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0xb1,0,0,0, -0,0,0,0,0,0,0,0,0,0xb1,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0xa, -0xa,0xa,0xa,0xa,0xa,4,0xa,0,0,0,0,0,0xb1,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0xb1,0xb1, -0xb1,0,0,0,0,0,0xb1,0xb1,0xb1,0,0xb1,0xb1,0xb1,0xb1,0,0, -0,0,0,0,0,0xb1,0xb1,0,0,0,0,0,0,0,0,0, -0,0,0xb1,0xb1,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0, +0,0,0,0,0,4,0,0,0,0,0,0,0,0,0xb1,0xb1, +0xb1,0xb1,0xb1,0xb1,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0xb1,0,0,0xa0, -0,0,0,0,0,0,0xa0,0,0,0,0,0,0xb1,0xb1,0,0, +0xb1,0,0,0xb1,0,0xb1,0xb1,0xb1,0xb1,0,0,0,0,0,0,0, +0,0xb1,0,0,0,0,0,0,0,0,0xb1,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0xb1,0,0,0,0,0,0,0,0xb1,0xb1,0xb1,0,0xb1,0, +0,0,0,0,0,0,0,0,0xb1,0,0,0,0,0,0,0, +0,0,0,0,0,0xb1,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0xa,0xa,0xa,0xa,0xa, +0xa,4,0xa,0,0,0,0,0,0xb1,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0xb1,0,0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0,0,0,0,4, -0,0,0,0,0,0,0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0, +0,0,0,0,0,0,0,0,0,0,0xb1,0xb1,0xb1,0,0,0, +0,0,0xb1,0xb1,0xb1,0,0xb1,0xb1,0xb1,0xb1,0,0,0,0,0,0, +0,0xb1,0xb1,0,0,0,0,0,0,0,0,0,0,0,0xb1,0xb1, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0xb1,0,0,0xa0,0,0,0,0, +0,0,0xa0,0,0,0,0,0,0xb1,0xb1,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0xb1,0xb1,0,0,0,0,0,0,0, +0,0,0,0,0,0,0xb1,0,0,0,0,0,0,0,0xb1,0xb1, +0xb1,0,0xb1,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0xb1,0,0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0, +0,0,0,4,0,0,0,0,0,0,0,0xb1,0xb1,0xb1,0xb1,0xb1, +0xb1,0xb1,0xb1,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0xb1,0,0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0,0xb1, +0xb1,0,0,0,0,0,0,0,0,0,0,0,0xb1,0xb1,0xb1,0xb1, +0xb1,0xb1,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0xb1,0xb1,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0xb1,0,0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0,0xb1,0xb1,0,0,0, -0,0,0,0,0,0,0,0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0,0, +0,0,0,0,0,0xb1,0,0xb1,0,0xb1,0x310a,0xf20a,0x310a,0xf20a,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0xb1,0xb1,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0xb1,0,0xb1,0,0xb1,0x310a,0xf20a,0x310a,0xf20a,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0xb1,0xb1,0xb1, -0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0,0xb1,0xb1,0xb1,0xb1, -0xb1,0,0xb1,0xb1,0,0,0,0,0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1, -0xb1,0xb1,0xb1,0xb1,0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1, +0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0, +0xb1,0xb1,0xb1,0xb1,0xb1,0,0xb1,0xb1,0,0,0,0,0,0xb1,0xb1,0xb1, +0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1, 0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1, -0xb1,0xb1,0xb1,0xb1,0xb1,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0xb1,0xb1,0xb1,0xb1,0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1, -0,0xb1,0xb1,0,0,0xb1,0xb1,0,0,0,0,0,0,0,0,0, +0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0xb1,0xb1,0xb1,0xb1,0,0xb1,0xb1, +0xb1,0xb1,0xb1,0xb1,0,0xb1,0xb1,0,0,0xb1,0xb1,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0xb1,0xb1,0,0,0,0,0xb1,0xb1,0xb1,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0xb1,0xb1,0xb1,0xb1,0,0,0, -0,0,0,0,0,0,0,0,0,0,0xb1,0,0,0xb1,0xb1,0, -0,0,0,0,0,0xb1,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0xb1,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0xb1,0xb1,0xb1,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa, -0xa,0xa,0,0,0,0,0,0,0xa,0,0,0,0,0,0,0, +0,0,0,0,0xb1,0xb1,0,0,0,0,0xb1,0xb1,0xb1,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0xb1,0xb1,0xb1, +0xb1,0,0,0,0,0,0,0,0,0,0,0,0,0,0xb1,0, +0,0xb1,0xb1,0,0,0,0,0,0,0xb1,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0xb1,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,9,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0xb1,0xb1,0xb1,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0xa,0xa,0xa,0xa, +0xa,0xa,0xa,0xa,0xa,0xa,0,0,0,0,0,0,0xa,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0x310a,0xf20a,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0xb1,0xb1,0xb1,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,9,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0xb1,0xb1,0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0,0, -0,0,0,0,0,0,0xb1,0,0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1, -0xb1,0xb1,0xb1,0xb1,0,0,0,0,0,0,0,4,0,0xb1,0,0, -0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40, +0,0,0,0,0,0,0,0x310a,0xf20a,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0xb1,0xb1, +0xb1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0xb1,0xb1,0,0xb1,0xb1,0xb1,0xb1,0xb1, +0xb1,0xb1,0,0,0,0,0,0,0,0,0xb1,0,0,0xb1,0xb1,0xb1, +0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0,0,0,0,0,0,0,4, +0,0xb1,0,0,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40, 0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40, -0x40,0xb1,0x40,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0x4a, -0xa,0xa,0x2a,0xb1,0xb1,0xb1,0x12,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40, +0x40,0x40,0x40,0x40,0x40,0xb1,0x40,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0xa,0xa,0xa,0xa, +0xa,0xa,0xa,0x4a,0xa,0xa,0x2a,0xb1,0xb1,0xb1,0x12,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0x40,0x40,0x40,0x40, 0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40, -0,0,0,0,0,0,0,0,0,0xb1,0xb1,0x40,0x40,0x40,0x40,0x40, +0x40,0x40,0x40,0x40,0,0,0,0,0,0,0,0,0,0xb1,0xb1,0x40, 0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40, -0x40,0x40,0x40,0x40,0xb1,0xb1,0xb1,0,0,0,0,0xb1,0xb1,0,0,0, -0,0,0,0,0,0,0xb1,0,0,0,0,0,0,0xb1,0xb1,0xb1, -0,0,0,0,0xa,0,0,0,0xa,0xa,0,0,0,0,0,0, +0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0xb1,0xb1,0xb1,0,0,0,0,0xb1, +0xb1,0,0,0,0,0,0,0,0,0,0xb1,0,0,0,0,0, +0,0xb1,0xb1,0xb1,0,0,0,0,0xa,0,0,0,0xa,0xa,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0xa,0xa,0xa,0xa,0xa,0xa, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0xa,0xa, +0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa, 0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa, -0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0xb1,0xb1,0,0,0xb1,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0xb1,0xb1,0,0,0xb1,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0xb1,0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0,0xb1,0,0xb1,0, +0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0,0,0,0,0,0,0xb1, +0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0,0,0xb1,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0xb1,0xb1,0xb1,0xb1, +0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0xb1,0,0xb1,0xb1,0xb1,0xb1,0xb1,0,0xb1,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0xb1,0xb1, +0xb1,0xb1,0,0,0xb1,0xb1,0,0xb1,0xb1,0xb1,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0xb1,0, -0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0,0xb1,0,0xb1,0,0,0xb1,0xb1,0xb1, -0xb1,0xb1,0xb1,0xb1,0xb1,0,0,0,0,0,0,0xb1,0xb1,0xb1,0xb1,0xb1, -0xb1,0xb1,0xb1,0xb1,0xb1,0,0,0xb1,0,0,0,0,0,0,0,0, +0xb1,0xb1,0,0,0,0xb1,0,0xb1,0xb1,0xb1,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1, -0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0,0xb1,0xb1,0xb1,0xb1,0,0,0,0, +0,0,0xb1,0xb1,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0xb1,0xb1,0xb1,0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1, +0xb1,0xb1,0xb1,0xb1,0xb1,0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0,0,0, +0,0xb1,0,0,0,0,0,0,0xb1,0,0,0,0xb1,0xb1,0,0, +0,0,0,0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1, +0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0,0xb1, +0xb1,0xb1,0xb1,0xb1,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0xb1,0,0xb1,0xb1,0xb1,0xb1,0xb1,0, -0xb1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0xb1, -0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0xb1,0xb1,0xb1,0xb1,0,0,0xb1,0xb1,0,0xb1, -0xb1,0xb1,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0xb1,0,0xb1,0xb1,0,0,0,0xb1,0,0xb1, -0xb1,0xb1,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0,0,0xb1,0xb1,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0xb1,0xb1,0xb1,0, -0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0,0xb1,0xb1, -0xb1,0xb1,0xb1,0xb1,0xb1,0,0,0,0,0xb1,0,0,0,0,0,0, -0xb1,0,0,0,0xb1,0xb1,0,0,0,0,0,0,0xb1,0xb1,0xb1,0xb1, -0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1, -0xb1,0xb1,0,0,0,0,0,0xb1,0xb1,0xb1,0xb1,0xb1,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0xa,0,0xa,0xa,0xa,0,0, -0,0,0,0,0,0,0,0,0,0xa,0xa,0xa,0,0,0,0, -0,0,0,0,0,0,0,0,0,0xa,0xa,0xa,0,0,0,0, -0,0,0,0,0,0,0,0,0,0xa,0xa,0,0xa,0xa,0xa,0xa, -6,0x310a,0xf20a,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa, -0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,9,0xb2,0xb2,0xb2,0xb2, -0xb2,0x12,0x814,0x815,0x813,0x816,0xb2,0xb2,0xb2,0xb2,0xb2,0xb2,2,0,0,0, -2,2,2,2,2,2,3,3,0xa,0x310a,0xf20a,0,9,9,9,9, -9,9,9,9,9,9,9,0xb2,0x412,0x432,0x8a0,0x8a1,0xa,0xa,0xa,0xa, -0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,9,7,0x8ab,0x8ae, -0x8b0,0x8ac,0x8af,6,4,4,4,4,4,0xa,0xa,0xa,0xa,0x300a,0xf00a,0xa, -0xa,0xa,0xa,0xa,2,2,2,2,2,2,2,2,2,2,3,3, -0xa,0x310a,0xf20a,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,4,4,4,4,4,4,4,4,4,4,4,4, +0,0xa,0,0xa,0xa,0xa,0,0,0,0,0,0,0,0,0,0, +0,0xa,0xa,0xa,0,0,0,0,0,0,0,0,0,0,0,0, +0,0xa,0xa,0xa,0,0,0,0,0,0,0,0,0,0,0,0, +0,0xa,0xa,0,0xa,0xa,0xa,0xa,6,0x310a,0xf20a,0xa,0xa,0xa,0xa,0xa, +0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa, +0xa,0xa,0xa,9,0xb2,0xb2,0xb2,0xb2,0xb2,0x12,0x814,0x815,0x813,0x816,0xb2,0xb2, +0xb2,0xb2,0xb2,0xb2,2,0,0,0,2,2,2,2,2,2,3,3, +0xa,0x310a,0xf20a,0,9,9,9,9,9,9,9,9,9,9,9,0xb2, +0x412,0x432,0x8a0,0x8a1,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa, +0xa,0xa,0xa,0xa,9,7,0x8ab,0x8ae,0x8b0,0x8ac,0x8af,6,4,4,4,4, +4,0xa,0xa,0xa,0xa,0x300a,0xf00a,0xa,0xa,0xa,0xa,0xa,2,2,2,2, +2,2,2,2,2,2,3,3,0xa,0x310a,0xf20a,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,4,4,4,4, 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, -4,4,4,4,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1, -0xb1,0xb1,0xb1,0xb1,0xa,0xa,0,0xa,0xa,0xa,0xa,0,0xa,0xa,0,0, -0,0,0,0,0,0,0,0,0xa,0,0xa,0xa,0xa,0,0,0, -0,0,0xa,0xa,0xa,0xa,0xa,0xa,0,0xa,0,0xa,0,0xa,0,0, -0,0,4,0,0,0,0,0,0,0,0,0,0,0,0xa,0xa, -0,0,0,0,0x100a,0xa,0xa,0xa,0xa,0,0,0,0,0,0xa,0xa, -0xa,0xa,0,0,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa, -0xa,0xa,0xa,0xa,0,0,0,0,0,0,0,0,0,0xa,0xa,0xa, -0,0,0,0,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa, -0xa,0xa,0xa,0xa,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a, -0x300a,0xf00a,0xa,0xa,0x300a,0xf00a,0x900a,0x900a,0x900a,0x100a,0x900a,0x900a,0x100a,0x100a,0x900a,0x900a, -0x900a,0x900a,0x900a,0x100a,0xa,0x100a,0x100a,0x100a,0x100a,0xa,0xa,0xa,0x700a,0x700a,0x700a,0xb00a, -0xb00a,0xb00a,0xa,0xa,0xa,0x100a,3,4,0xa,0x900a,0x100a,0xa,0xa,0xa,0x100a,0x100a, -0x100a,0x100a,0xa,0x100a,0x100a,0x100a,0x100a,0xa,0x100a,0xa,0x100a,0xa,0xa,0xa,0xa,0x100a, -0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0xa,0xa,0xa,0xa,0xa,0x100a,0xa,0x100a, -0x300a,0xf00a,0x100a,0x100a,0x100a,0x100a,0x100a,0x900a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a, -0x100a,0xa,0xa,0xa,0xa,0xa,0x300a,0xf00a,0x300a,0xf00a,0xa,0xa,0xa,0xa,0xa,0xa, -0xa,0xa,0xa,0x100a,0x100a,0xa,0x100a,0xa,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a, -0xa,0xa,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a, -0x300a,0xf00a,0x300a,0xf00a,0x100a,0xa,0xa,0x300a,0xf00a,0x300a,0xf00a,0xa,0xa,0xa,0xa,0xa, -0x900a,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0x300a,0xf00a,0xa,0xa,0x900a,0x100a, -0x900a,0x900a,0x100a,0x900a,0x100a,0x100a,0x100a,0x100a,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a, -0x100a,0xa,0xa,0xa,0xa,0xa,0x100a,0x100a,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa, -0xa,0x300a,0xf00a,0x300a,0xf00a,0x900a,0xa,0xa,0x300a,0xf00a,0xa,0xa,0xa,0xa,0x300a,0xf00a, -0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa, -0x310a,0xf20a,0x310a,0xf20a,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa, -0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0x100a,0x100a,0xa,0xa,0xa,0xa,0xa,0xa, -0xa,0x310a,0xf20a,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0xa,0xa,0xa,0xa,0xa, +4,4,4,4,4,4,4,4,4,4,4,4,0xb1,0xb1,0xb1,0xb1, +0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xa,0xa,0,0xa, +0xa,0xa,0xa,0,0xa,0xa,0,0,0,0,0,0,0,0,0,0, +0xa,0,0xa,0xa,0xa,0,0,0,0,0,0xa,0xa,0xa,0xa,0xa,0xa, +0,0xa,0,0xa,0,0xa,0,0,0,0,4,0,0,0,0,0, +0,0,0,0,0,0,0xa,0xa,0,0,0,0,0x100a,0xa,0xa,0xa, +0xa,0,0,0,0,0,0xa,0xa,0xa,0xa,0,0,0xa,0xa,0xa,0xa, +0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0,0,0,0, +0,0,0,0,0,0xa,0xa,0xa,0,0,0,0,0xa,0xa,0xa,0xa, +0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0x300a,0xf00a,0x300a,0xf00a, +0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0xa,0xa,0x300a,0xf00a,0x900a,0x900a, +0x900a,0x100a,0x900a,0x900a,0x100a,0x100a,0x900a,0x900a,0x900a,0x900a,0x900a,0x100a,0xa,0x100a,0x100a,0x100a, +0x100a,0xa,0xa,0xa,0x700a,0x700a,0x700a,0xb00a,0xb00a,0xb00a,0xa,0xa,0xa,0x100a,3,4, +0xa,0x900a,0x100a,0xa,0xa,0xa,0x100a,0x100a,0x100a,0x100a,0xa,0x100a,0x100a,0x100a,0x100a,0xa, +0x100a,0xa,0x100a,0xa,0xa,0xa,0xa,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a, +0xa,0xa,0xa,0xa,0xa,0x100a,0xa,0x100a,0x300a,0xf00a,0x100a,0x100a,0x100a,0x100a,0x100a,0x900a, +0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0xa,0xa,0xa,0xa,0xa,0x300a,0xf00a, +0x300a,0xf00a,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0x100a,0x100a,0xa,0x100a,0xa, +0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0xa,0xa,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a, +0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0x100a,0xa,0xa,0x300a, +0xf00a,0x300a,0xf00a,0xa,0xa,0xa,0xa,0xa,0x900a,0xa,0xa,0xa,0xa,0xa,0xa,0xa, +0xa,0xa,0x300a,0xf00a,0xa,0xa,0x900a,0x100a,0x900a,0x900a,0x100a,0x900a,0x100a,0x100a,0x100a,0x100a, +0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0x100a,0xa,0xa,0xa,0xa,0xa,0x100a,0x100a, +0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0x300a,0xf00a,0x300a,0xf00a,0x900a,0xa,0xa, +0x300a,0xf00a,0xa,0xa,0xa,0xa,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a, +0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0x310a,0xf20a,0x310a,0xf20a,0xa,0xa,0xa,0xa, 0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa, -0xa,0,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa, +0x100a,0x100a,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0x310a,0xf20a,0xa,0xa,0xa,0xa,0xa, +0xa,0xa,0xa,0xa,0xa,0xa,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa, +0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0,0xa,0xa,0xa,0xa,0xa,0xa, +0xa,0xa,0xa,0xa,0xa,0xa,0xa,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0xa,0xa,0xa,0xa, +0xa,0xa,0xa,0xa,2,2,2,2,2,2,2,2,2,2,2,2, +2,2,2,2,2,2,2,2,0,0,0,0,0xa,0xa,0xa,0xa, +0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0,0xa,0xa,0xa,0xa,0xa,0xa,0xa, +0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0x310a,0xf20a,0x310a,0xf20a, +0x310a,0xf20a,0x310a,0xf20a,0x310a,0xf20a,0x310a,0xf20a,0x310a,0xf20a,0xa,0xa,0xa,0xa,0xa,0xa, +0xa,0xa,0xa,0xa,0x100a,0xa,0xa,0x300a,0xf00a,0x310a,0xf20a,0xa,0x300a,0xf00a,0xa,0x500a, +0x100a,0xd00a,0xa,0xa,0xa,0xa,0xa,0x100a,0x100a,0x300a,0xf00a,0xa,0xa,0xa,0xa,0xa, +0x100a,0x300a,0xf00a,0xa,0xa,0xa,0x300a,0xf00a,0x300a,0xf00a,0x310a,0xf20a,0x310a,0xf20a,0x310a,0xf20a, +0x310a,0xf20a,0x310a,0xf20a,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa, +0xa,0xa,0xa,0xa,0xa,0x100a,0xa,0x100a,0x100a,0x100a,0xa,0xa,0x100a,0x100a,0xa,0xa, +0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0x100a,0x900a,0x100a,0x100a,0x300a,0xf00a,0xa,0xa, +0x310a,0xf20a,0xa,0xa,0xa,0xa,0xa,0x310a,0xf20a,0x310a,0xf20a,0x310a,0xf20a,0x310a,0xf20a,0x310a, +0xf20a,0x710a,0x320a,0xf10a,0xb20a,0x310a,0xf20a,0x310a,0xf20a,0x310a,0xf20a,0x310a,0xf20a,0xa,0xa,0x100a, +0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a, +0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0x900a,0xa,0xa,0xa,0xa,0xa,0xa,0xa, +0x300a,0xf00a,0x100a,0x100a,0x300a,0xf00a,0xa,0xa,0xa,0x100a,0xa,0xa,0xa,0xa,0x100a,0x300a, +0xf00a,0x300a,0xf00a,0xa,0x300a,0xf00a,0xa,0xa,0x310a,0xf20a,0x310a,0xf20a,0x100a,0xa,0xa,0xa, +0xa,0xa,0x100a,0x900a,0x900a,0x900a,0x100a,0xa,0xa,0xa,0xa,0xa,0x300a,0xf00a,0x100a,0xa, +0xa,0xa,0xa,0x100a,0xa,0xa,0xa,0x300a,0xf00a,0x300a,0xf00a,0x100a,0xa,0x100a,0xa,0xa, +0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a, +0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0xa,0x100a,0x100a, +0x100a,0x100a,0xa,0xa,0x100a,0xa,0x100a,0xa,0xa,0x100a,0xa,0x300a,0xf00a,0x300a,0xf00a,0xa, +0xa,0xa,0xa,0xa,0x300a,0xf00a,0xa,0xa,0xa,0xa,0xa,0xa,0x300a,0xf00a,0x100a,0xa, 0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa, -0xa,0xa,0xa,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa, -2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, -2,2,2,2,0,0,0,0,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa, -0xa,0xa,0xa,0xa,0,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa, -0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0x310a,0xf20a,0x310a,0xf20a,0x310a,0xf20a,0x310a,0xf20a, -0x310a,0xf20a,0x310a,0xf20a,0x310a,0xf20a,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa, -0x100a,0xa,0xa,0x300a,0xf00a,0x310a,0xf20a,0xa,0x300a,0xf00a,0xa,0x500a,0x100a,0xd00a,0xa,0xa, -0xa,0xa,0xa,0x100a,0x100a,0x300a,0xf00a,0xa,0xa,0xa,0xa,0xa,0x100a,0x300a,0xf00a,0xa, -0xa,0xa,0x300a,0xf00a,0x300a,0xf00a,0x310a,0xf20a,0x310a,0xf20a,0x310a,0xf20a,0x310a,0xf20a,0x310a,0xf20a, +0xa,0xa,0xa,0xa,0xa,0xa,0xa,0x100a,0x100a,0xa,0xa,0xa,0xa,0xa,0xa,0xa, +0x300a,0xf00a,0xa,0xa,0xa,0xa,0x100a,0x100a,0x100a,0x100a,0xa,0x100a,0x100a,0xa,0xa,0x100a, +0x100a,0xa,0xa,0xa,0xa,0x300a,0xf00a,0x100a,0x100a,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0x300a, +0xf00a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x300a,0xf00a,0x100a,0x100a,0x100a,0x100a,0x300a,0xf00a,0x300a, +0xf00a,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0x100a,0x100a,0x100a,0x100a,0x300a,0xf00a,0x100a, +0xa,0xa,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0xa,0x300a,0xf00a,0x100a,0x100a,0x300a, +0xf00a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0x100a, +0x100a,0x100a,0x100a,0x100a,0x100a,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0xa, +0xa,0xa,0xa,0xa,0x100a,0xa,0x900a,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa, +0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0,0,0xa,0xa, 0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa, -0xa,0x100a,0xa,0x100a,0x100a,0x100a,0xa,0xa,0x100a,0x100a,0xa,0xa,0xa,0xa,0xa,0xa, -0xa,0xa,0xa,0xa,0x100a,0x900a,0x100a,0x100a,0x300a,0xf00a,0xa,0xa,0x310a,0xf20a,0xa,0xa, -0xa,0xa,0xa,0x310a,0xf20a,0x310a,0xf20a,0x310a,0xf20a,0x310a,0xf20a,0x310a,0xf20a,0x710a,0x320a,0xf10a, -0xb20a,0x310a,0xf20a,0x310a,0xf20a,0x310a,0xf20a,0x310a,0xf20a,0xa,0xa,0x100a,0x100a,0x100a,0x100a,0x100a, -0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0xa,0xa,0xa,0xa, -0xa,0xa,0xa,0xa,0x900a,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0x300a,0xf00a,0x100a,0x100a, -0x300a,0xf00a,0xa,0xa,0xa,0x100a,0xa,0xa,0xa,0xa,0x100a,0x300a,0xf00a,0x300a,0xf00a,0xa, -0x300a,0xf00a,0xa,0xa,0x310a,0xf20a,0x310a,0xf20a,0x100a,0xa,0xa,0xa,0xa,0xa,0x100a,0x900a, -0x900a,0x900a,0x100a,0xa,0xa,0xa,0xa,0xa,0x300a,0xf00a,0x100a,0xa,0xa,0xa,0xa,0x100a, -0xa,0xa,0xa,0x300a,0xf00a,0x300a,0xf00a,0x100a,0xa,0x100a,0xa,0xa,0xa,0xa,0xa,0xa, -0xa,0xa,0xa,0xa,0xa,0xa,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a, -0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0xa,0x100a,0x100a,0x100a,0x100a,0xa,0xa, -0x100a,0xa,0x100a,0xa,0xa,0x100a,0xa,0x300a,0xf00a,0x300a,0xf00a,0xa,0xa,0xa,0xa,0xa, -0x300a,0xf00a,0xa,0xa,0xa,0xa,0xa,0xa,0x300a,0xf00a,0x100a,0xa,0xa,0xa,0xa,0xa, +0xa,0xa,0xa,0xa,0xa,0xa,0,0,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa, 0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa, -0xa,0xa,0xa,0x100a,0x100a,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0x300a,0xf00a,0xa,0xa, -0xa,0xa,0x100a,0x100a,0x100a,0x100a,0xa,0x100a,0x100a,0xa,0xa,0x100a,0x100a,0xa,0xa,0xa, -0xa,0x300a,0xf00a,0x100a,0x100a,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0x100a,0x100a,0x100a, -0x100a,0x100a,0x100a,0x300a,0xf00a,0x100a,0x100a,0x100a,0x100a,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0x300a, -0xf00a,0x300a,0xf00a,0x300a,0xf00a,0x100a,0x100a,0x100a,0x100a,0x300a,0xf00a,0x100a,0xa,0xa,0x300a,0xf00a, -0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0xa,0x300a,0xf00a,0x100a,0x100a,0x300a,0xf00a,0x100a,0x100a,0x100a, -0x100a,0x100a,0x100a,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0x100a,0x100a,0x100a,0x100a,0x100a, -0x100a,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0xa,0xa,0xa,0xa,0xa, -0x100a,0xa,0x900a,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa, -0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0,0,0xa,0xa,0xa,0xa,0xa,0xa, +0xa,0xa,0,0,0,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa, +0xa,0,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0,0,0,0,0, +0,0,0,0,0,0,0,0,0xa,0xa,0xa,0xa,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0xa,0xa,0xa, +0xa,0xa,0xa,0,0,0,0,0xb1,0xb1,0xb1,0,0,0,0,0,0, +0,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0xb1,0xa,0xa,0x300a,0xf00a,0x300a,0xf00a,0xa,0xa, +0xa,0x300a,0xf00a,0xa,0x300a,0xf00a,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa, +0xa,0xa,0xa,0xa,0x300a,0xf00a,0xa,0xa,0x300a,0xf00a,0x310a,0xf20a,0x310a,0xf20a,0x310a,0xf20a, +0x310a,0xf20a,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa, +0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0,0xa, 0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa, -0xa,0xa,0,0,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa, -0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0,0, -0,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0,0xa,0xa, 0xa,0xa,0xa,0xa,0xa,0xa,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0xa,0xa,0xa,0xa,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0xa,0xa,0xa,0xa,0xa,0xa,0, -0,0,0,0xb1,0xb1,0xb1,0,0,0,0,0,0,0,0xa,0xa,0xa, -0xa,0xa,0xa,0xa,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0xb1,0xa,0xa,0x300a,0xf00a,0x300a,0xf00a,0xa,0xa,0xa,0x300a,0xf00a,0xa, -0x300a,0xf00a,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa, -0x300a,0xf00a,0xa,0xa,0x300a,0xf00a,0x310a,0xf20a,0x310a,0xf20a,0x310a,0xf20a,0x310a,0xf20a,0xa,0xa, -0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa, -0xa,0xa,0xa,0xa,0xa,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa, +0xa,0xa,0xa,0xa,0,0,0,0,0xa,0,0,0,0,0,0,0, +0,0,0xb1,0xb1,0xb1,0xb1,0,0,0xa,0,0,0,0,0,0xa,0xa, +0,0,0,0,0,0xa,0xa,0xa,9,0xa,0xa,0xa,0xa,0,0,0, +0x310a,0xf20a,0x310a,0xf20a,0x310a,0xf20a,0x310a,0xf20a,0x310a,0xf20a,0xa,0xa,0x310a,0xf20a,0x310a,0xf20a, +0x310a,0xf20a,0x310a,0xf20a,0xa,0xa,0xa,0xa,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa, -0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0,0xa,0xa,0xa,0xa,0xa, -0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa, -0xa,0xa,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa, -0,0,0,0,0xa,0,0,0,0,0,0,0,0,0,0xb1,0xb1, -0xb1,0xb1,0,0,0xa,0,0,0,0,0,0xa,0xa,0,0,0,0, -0,0xa,0xa,0xa,9,0xa,0xa,0xa,0xa,0,0,0,0x310a,0xf20a,0x310a,0xf20a, -0x310a,0xf20a,0x310a,0xf20a,0x310a,0xf20a,0xa,0xa,0x310a,0xf20a,0x310a,0xf20a,0x310a,0xf20a,0x310a,0xf20a, -0xa,0xa,0xa,0xa,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0xb1,0xb1,0xa, -0xa,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0xb1,0xb1,0xa,0xa,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa, +0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0xa,0xa,0xa,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0xa,0xa,0xa,0xa,0xa,0xa,0xa, +0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0xa, 0xa,0xa,0xa,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa, -0xa,0xa,0xa,0xa,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0xa,0xa,0xa,0xa,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0xa,0xa,0xa, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0xb1,0xb1,0xb1,0xb1,0xa,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1, -0xb1,0xb1,0xa,0xa,0,0,0,0,0,0,0,0,0xa,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0xb1,0,0,0,0xb1,0,0,0,0,0xb1, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0xb1,0xb1,0,0xa,0xa,0xa,0xa,0,0,0,0, -0,0,0,0,0,0,0,0,4,4,0,0,0,0,0,0, -0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40, -0x40,0x40,0x60,0,0xa,0xa,0xa,0xa,0,0,0,0,0,0,0,0, -0xb1,0xb1,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0xb1,0xb1,0xb1,0xb1, -0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0xb1,0xb1, -0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0xb1,0xb1,0xb1,0xb1,0xb1, +0,0xa,0xa,0xa,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0xb1,0xb1,0xb1,0xb1,0xa,0xb1,0xb1,0xb1,0xb1, +0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xa,0xa,0,0,0,0,0,0,0,0, +0xa,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0xb1,0,0,0,0xb1,0, +0,0,0,0xb1,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0xb1,0xb1,0,0xa,0xa,0xa,0xa, +0,0,0,0,0,0,0,0,0,0,0,0,4,4,0,0, +0,0,0,0,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40, +0x40,0x40,0x40,0x40,0x40,0x40,0x60,0,0xa,0xa,0xa,0xa,0,0,0,0, +0,0,0,0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1, 0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0xb1,0,0,0xb1,0xb1, -0xb1,0xb1,0,0,0xb1,0,0,0,0,0,0,0,0,0,0,0, -0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0,0,0xb1,0xb1,0,0,0xb1,0xb1,0, -0,0,0,0,0,0,0,0,0,0,0,0xb1,0,0,0,0, -0,0,0,0,0xb1,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0xb1,0,0xb1,0xb1,0xb1,0,0,0xb1, -0xb1,0,0,0,0,0,0xb1,0xb1,0,0,0,0,0,0,0,0, -0,0,0,0,0xb1,0xb1,0,0,0,0,0,0,0,0,0xb1,0, -0,0,0,0,0,0,0,0,0,0xb1,0,0,0xb1,0,0,0, -0,0xb1,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,1,1,1,1,1,1,1,1,1,3,1,1, -1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, -1,1,1,1,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd, -0xd,0xd,0xd,0xd,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,1,0xb1,1,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd, +0,0,0,0xb1,0,0,0xb1,0xb1,0xb1,0xb1,0,0,0xb1,0,0,0, +0,0,0,0,0,0,0,0,0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0, +0,0xb1,0xb1,0,0,0xb1,0xb1,0,0,0,0,0,0,0,0,0, +0,0,0,0xb1,0,0,0,0,0,0,0,0,0xb1,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0xb1,0,0xb1,0xb1,0xb1,0,0,0xb1,0xb1,0,0,0,0,0,0xb1,0xb1, +0,0,0,0,0,0,0,0,0,0,0,0,0xb1,0xb1,0,0, +0,0,0,0,0,0,0xb1,0,0,0,0,0,0,0,0,0, +0,0xb1,0,0,0xb1,0,0,0,0,0xb1,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1, +1,1,1,1,1,3,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,0xd,0xd,0xd,0xd, +0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0,0,0,0, +0,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,0xb1,1,0xd,0xd,0xd,0xd, 0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd, -0xd,0xd,0xa,0xa,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd, -0xd,0xd,0xd,0xd,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12, -0x12,0x12,0x12,0x12,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd, -0xd,0xa,0xd,0xd,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1, -0xb1,0xb1,0xb1,0xb1,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0,0, -0,0,0,0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1, -0xb1,0xb1,0xb1,0xb1,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa, -0xa,0xa,0xa,0xa,6,0xa,6,0,0xa,6,0xa,0xa,0xa,0x310a,0xf20a,0x310a, -0xf20a,0x310a,0xf20a,4,0xa,0xa,3,3,0x300a,0xf00a,0xa,0,0xa,4,4,0xa, -0,0,0,0,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd, +0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xa,0xa,0xd,0xd,0xd,0xd, +0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0x12,0x12,0x12,0x12, +0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0xd,0xd,0xd,0xd, +0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xa,0xd,0xd,0xb1,0xb1,0xb1,0xb1, +0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xa,0xa,0xa,0xa, +0xa,0xa,0xa,0xa,0xa,0xa,0,0,0,0,0,0,0xb1,0xb1,0xb1,0xb1, +0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xa,0xa,0xa,0xa, +0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,6,0xa,6,0, +0xa,6,0xa,0xa,0xa,0x310a,0xf20a,0x310a,0xf20a,0x310a,0xf20a,4,0xa,0xa,3,3, +0x300a,0xf00a,0xa,0,0xa,4,4,0xa,0,0,0,0,0xd,0xd,0xd,0xd, 0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd, -0xd,0xd,0xd,0xb2,0,0xa,0xa,4,4,4,0xa,0xa,0x310a,0xf20a,0xa,3, -6,3,6,6,2,2,2,2,2,2,2,2,2,2,6,0xa, -0x500a,0xa,0xd00a,0xa,0xa,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0x510a, -0xa,0xd20a,0xa,0x310a,0xf20a,0xa,0x310a,0xf20a,0xa,0xa,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,4,4,0xa,0xa,0xa,4,4,0,0xa,0xa,0xa,0xa, -0xa,0xa,0xa,0,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0xaa,0xaa,0xaa, -0xa,0xa,0x12,0x12,0,0xa,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa, -0xa,0,0,0,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa, -0,0,0,0,0xb1,2,2,2,2,2,2,2,2,2,2,2, -2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, +0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xb2,0,0xa,0xa,4, +4,4,0xa,0xa,0x310a,0xf20a,0xa,3,6,3,6,6,2,2,2,2, +2,2,2,2,2,2,6,0xa,0x500a,0xa,0xd00a,0xa,0xa,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0x510a,0xa,0xd20a,0xa,0x310a,0xf20a,0xa,0x310a,0xf20a, +0xa,0xa,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,4,4,0xa,0xa, +0xa,4,4,0,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0,0x12,0x12,0x12,0x12, +0x12,0x12,0x12,0x12,0x12,0xaa,0xaa,0xaa,0xa,0xa,0x12,0x12,0,0xa,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0xb1,0xb1,0xb1,0xb1,0xb1,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0xa,0xa,0xa,0xa, +0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0,0,0,0xa,0xa,0xa,0xa, +0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0,0,0,0,0xb1,2,2,2, +2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, +2,2,2,2,2,2,2,2,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0xb1,0xb1, +0xb1,0xb1,0xb1,0,0,0,0,0,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, -1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0xa, -1,0xb1,0xb1,0xb1,1,0xb1,0xb1,1,1,1,1,1,0xb1,0xb1,0xb1,0xb1, +1,1,1,1,1,1,1,0xa,1,0xb1,0xb1,0xb1,1,0xb1,0xb1,1, +1,1,1,1,0xb1,0xb1,0xb1,0xb1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, -1,1,1,1,1,1,1,1,0xb1,0xb1,0xb1,1,1,1,1,0xb1, -0x41,0x81,1,1,0x81,0xb1,0xb1,1,1,1,1,0x41,0x41,0x41,0x41,0x81, +0xb1,0xb1,0xb1,1,1,1,1,0xb1,0x41,0x81,1,1,0x81,0xb1,0xb1,1, +1,1,1,0x41,0x41,0x41,0x41,0x81,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,0x41,0x41,0x41,0x41,0x41,0x81,1,0x81, +1,0x81,0x81,1,1,0x61,0x81,0x81,0x81,0x81,0x81,0x41,0x41,0x41,0x41,0x61, +0x41,0x41,0x41,0x41,0x41,0x81,0x41,0x41,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, -0x41,0x41,0x41,0x41,0x41,0x81,1,0x81,1,0x81,0x81,1,1,0x61,0x81,0x81, -0x81,0x81,0x81,0x41,0x41,0x41,0x41,0x61,0x41,0x41,0x41,0x41,0x41,0x81,0x41,0x41, +1,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0x41,0x81,0x41,0x81,0x81,0x81,0x41,0x41, +0x41,0x81,0x41,0x41,0x81,0x41,0x81,0x81,0x41,0x81,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,0x81,0x81,0x81,0x81,0x41,0x41,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, -1,1,1,1,1,1,1,1,1,0xa,0xa,0xa,0xa,0xa,0xa,0xa, -0x41,0x81,0x41,0x81,0x81,0x81,0x41,0x41,0x41,0x81,0x41,0x41,0x81,0x41,0x81,0x81, -0x41,0x81,1,1,1,1,1,1,1,1,1,1,1,1,1,1, -1,0x81,0x81,0x81,0x81,0x41,0x41,1,1,1,1,1,1,1,1,1, -1,1,1,1,1,1,1,1,5,5,5,5,5,5,5,5, 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,5,5,5,5,5,1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0, -0,0,0,0,0,0,0,0,0,0,0xa,0xa,0xa,0xa,0xa,0xa, -0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0xb1,0xb1,0xb1,0xb1,0,0,0xb1,0xb1,0,0,0xa0,0,0, -0,0,0,0,0,0,0,0xb1,0xb1,0xb1,0xb1,0xb1,0,0xb1,0xb1,0xb1, -0xb1,0xb1,0xb1,0xb1,0xb1,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0xb1,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0xb1,0xb1,0xb1,0,0, -0xb1,0,0xb1,0xb1,0,0,0,0,0,0,0xb1,0,0,0,0,0xb1, -0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0,0,0,0,0,0,0,0,0, +5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,1, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1, +0xb1,0xb1,0xb1,0,0,0,0,0,0,0,0,0,0,0,0xa,0xa, +0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0xb1,0xb1,0xb1,0xb1,0,0,0xb1,0xb1,0, +0,0xa0,0,0,0,0,0,0,0,0,0,0xb1,0xb1,0xb1,0xb1,0xb1, +0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0xb1, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0xb1, +0xb1,0xb1,0,0,0xb1,0,0xb1,0xb1,0,0,0,0,0,0,0xb1,0, +0,0,0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0,0,0,0xb1,0xb1,0xb1,0xb1, +0xb1,0,0,0,0,0,0,0,0,0,0,0,0,0,0xb1,0xb1, +0xb1,0,0xb1,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0xb1, +0xb1,0xb1,0xb1,0xb1,0xb1,0,0xb1,0,0,0,0,0xb1,0xb1,0,0xb1,0xb1, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0xb1,0xb1, -0xb1,0xb1,0xb1,0xb1,0xb1,0,0,0,0xb1,0xb1,0xb1,0xb1,0xb1,0,0,0, -0,0,0,0,0,0,0,0,0,0,0xb1,0xb1,0xb1,0,0xb1,0, +0xb1,0xb1,0,0,0,0,0,0,0xb1,0xb1,0,0xb1,0xb1,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0xb1,0xb1,0xb1,0xb1,0xb1, -0xb1,0,0xb1,0,0,0,0,0xb1,0xb1,0,0xb1,0xb1,0,0,0,0, +0,0,0,0,0,0,0,0,0xb1,0xb1,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0xb1, +0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0,0,0xb1,0,0xb1,0xa,0xa,0xa,0xa, +0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0xb1, +0,0xb1,0,0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0,0xb1,0,0,0,0, +0,0,0,0,0,0,0xb1,0xb1,0xb1,0xb1,0,0xb1,0xb1,0xb1,0xb1,0xb1, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0xb1,0xb1,0xb1,0xb1,0,0, -0,0,0,0,0xb1,0xb1,0,0xb1,0xb1,0,0,0,0,0,0,0, +0,0,0,0,0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0,0,0xb1,0xb1,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0xb1,0xb1,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0xb1,0xb1,0xb1,0xb1,0xb1, -0xb1,0xb1,0xb1,0,0,0xb1,0,0xb1,0,0,0,0,0,0,0,0, -0,0,0,0xb1,0,0xb1,0,0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0,0xb1, -0,0,0,0,0,0,0,0,0,0,0xb1,0xb1,0xb1,0xb1,0,0xb1, -0xb1,0xb1,0xb1,0xb1,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0, -0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0,0xa0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0,0,0xb1, +0xb1,0xb1,0xb1,0,0,0,0,0,0,0,0,0xb1,0,0,0,0, +0,0,0,0,0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0,0,0xb1,0xb1,0xb1, 0,0,0,0,0,0,0,0,0,0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1, -0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0,0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1, -0xb1,0,0xb1,0xb1,0,0xb1,0xb1,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0xb1,0xb1,0xb1,0xb1,0xb1,0,0,0, +0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0,0xb1,0xb1,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0xb1,0xb1,0xb1,0xb1, +0xb1,0xb1,0xb1,0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0,0xa0,0xb1,0xb1,0xb1,0xb1, +0xb1,0xb1,0xb1,0xb1,0,0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0,0xb1,0xb1, +0,0xb1,0xb1,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1, +0xb1,0xb1,0xb1,0xb1,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0,0,0,0xb1,0, +0xb1,0xb1,0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0,0xb1,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0xb1,0xb1,0xb1,0xb1,0,0,0,0,0, -0,0,0,0,0,0,0,0,0xb2,0xb2,0xb2,0xb2,0,0,0,0, +0,0,0,0,0xb1,0xb1,0xb1,0xb1,0xb1,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0xb1,0xb1,0xb1,0xb1, +0xb1,0xb1,0xb1,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0xb1,0xb1,0xb1,0xb1,0,0,0,0,0,0,0,0,0, +0,0,0,0,0xb2,0xb2,0xb2,0xb2,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0xb1,0xb1,0xb1,0,0, -0,0,0,0,0,0,0,0xb2,0xb2,0xb2,0xb2,0xb2,0xb2,0xb2,0xb2,0xb1, -0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0,0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1, +0,0,0,0,0,0,0,0xb1,0xb1,0xb1,0,0,0,0,0,0, +0,0,0,0xb2,0xb2,0xb2,0xb2,0xb2,0xb2,0xb2,0xb2,0xb1,0xb1,0xb1,0xb1,0xb1, +0xb1,0xb1,0xb1,0,0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0xb1,0xb1,0xb1,0xb1,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0xa,0xa,0xb1,0xb1, -0xb1,0xa,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0x100a, +0,0,0xb1,0xb1,0xb1,0xb1,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0xa,0xa,0xb1,0xb1,0xb1,0xa,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0x100a,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0x100a, -0,0,0,0,0,0,0,0,0,0,2,2,2,2,2,2, +0,0,0,0,0,0,0,0,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa, +0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0x100a,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0x100a,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0x100a,0,0,0,0, +0,0,0,0,0,0,2,2,2,2,2,2,2,2,2,2, 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, -2,2,2,2,2,2,2,2,2,2,2,2,0xb1,0xb1,0xb1,0xb1, -0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1, -0xb1,0xb1,0xb1,0,0,0,0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1, -0xb1,0xb1,0xb1,0xb1,0xb1,0,0,0,0,0,0,0,0,0xb1,0,0, -0,0,0,0,0,0,0,0,0xb1,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0xb1, -0xb1,0xb1,0xb1,0xb1,0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1, -0xb1,0xb1,0xb1,0xb1,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0,0xb1,0xb1,0xb1,0xb1, -0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0,0,0xb1, -0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0,0xb1,0xb1,0,0xb1,0xb1,0xb1,0xb1,0xb1,0, +2,2,2,2,2,2,2,2,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1, +0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0, +0,0,0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1, +0xb1,0,0,0,0,0,0,0,0,0xb1,0,0,0,0,0,0, +0,0,0,0,0xb1,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0xb1,0xb1,0xb1,0xb1,0xb1, +0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1, +0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0,0,0xb1,0xb1,0xb1,0xb1,0xb1, +0xb1,0xb1,0,0xb1,0xb1,0,0xb1,0xb1,0xb1,0xb1,0xb1,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1, -1,1,1,1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,1,1,1,1,1, -1,1,1,1,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41, -0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41, -0x41,0x41,0x41,0x41,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, -0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd, -0xa,0xa,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd, -0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0,0,0,0, +0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,1,1,1,1,1,1,1,1,1, +0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41, +0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41, +0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,0xd,0xd,0xd,0xd, +0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xa,0xa,0xd,0xd, +0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xa,0xa,0xa,0xa, +0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0,0,0,0,0xa,0xa,0xa,0xa, +0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0, +0,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa, +0,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa, +2,2,2,2,2,2,2,2,2,2,2,0xa,0xa,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0xa,0xa,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa, +0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0,0,0, +0,0,0,0,0,0,0,0,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa, +0xa,0xa,0xa,0xa,0xa,0,0,0,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa, +0xa,0,0,0,0,0,0,0,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa, +0,0,0,0,0,0,0,0,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa, +0xa,0xa,0,0,0,0,0,0,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa, +0,0,0,0,0,0,0,0,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa, 0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa, -0xa,0xa,0xa,0,0,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa, -0xa,0xa,0xa,0xa,0,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa, -0xa,0xa,0xa,0xa,2,2,2,2,2,2,2,2,2,2,2,0xa, -0xa,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0xa,0xa,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0xa,0xa,0xa,0xa, -0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0,0,0,0xa,0xa,0xa,0xa, -0xa,0xa,0xa,0,0,0,0,0,0,0,0,0,0xa,0xa,0xa,0xa, -0xa,0xa,0xa,0xa,0,0,0,0,0,0,0,0,0xa,0xa,0xa,0xa, -0xa,0xa,0xa,0xa,0xa,0xa,0,0,0,0,0,0,0xa,0xa,0xa,0xa, -0xa,0xa,0xa,0xa,0,0,0,0,0,0,0,0,0xa,0xa,0xa,0xa, -0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0,0,0,0, +0xa,0xa,0xa,0xa,0xa,0xa,0xa,0,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa, +0xa,0xa,0xa,0xa,0xa,0,0,0,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa, +0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa, +0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0x12,0x12,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0xa,0xa,0xa,0xa, -0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0,0xa,0xa,0xa,0xa, -0xa,0xa,0xa,0xa,0,0,0,0,0,0,0,0,0xa,0,0,0xa, -0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0,0xa,0xa,0xa,0xa, -0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0,0,0,0,0xa,0xa,0xa,0xa, -0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0,0xb2,0xb2,0xb2,0xb2, +0,0,0,0,0,0,0x12,0x12,0xb2,0xb2,0xb2,0xb2,0xb2,0xb2,0xb2,0xb2, 0xb2,0xb2,0xb2,0xb2,0xb2,0xb2,0xb2,0xb2,0xb2,0xb2,0xb2,0xb2,0xb2,0xb2,0xb2,0xb2, -0xb2,0xb2,0xb2,0xb2,0xb2,0xb2,0xb2,0xb2,0xb2,0xb2,0xb2,0xb2,0x12,0xb2,0x12,0x12, +0xb2,0xb2,0xb2,0xb2,0xb2,0xb2,0xb2,0xb2,0x12,0xb2,0x12,0x12,0x12,0x12,0x12,0x12, 0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12, -0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12, -0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1, -0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12, -0,0,0,0 +0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0xb1,0xb1,0xb1,0xb1, +0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0x12,0x12,0x12,0x12, +0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0,0,0,0 }; static const uint32_t ubidi_props_mirrors[26]={ @@ -784,7 +801,7 @@ static const uint8_t ubidi_props_jgArray[672]={ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0x5d,0x5a,0x60,0x63,0x5e,0x5f,0x59,0x61,0x5b,0x5c,0x62,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, @@ -809,13 +826,13 @@ static const UBiDiProps ubidi_props_singleton={ ubidi_props_trieIndex+3496, NULL, 3496, - 8076, + 8360, 0x1a0, 0xe28, 0x0, 0x0, 0x110000, - 0x2d30, + 0x2e4c, NULL, 0, FALSE, FALSE, 0, NULL }, { 2,2,0,0 } diff --git a/Build/source/libs/icu/icu-src/source/common/ubidiimp.h b/Build/source/libs/icu/icu-src/source/common/ubidiimp.h index a62d8b259ec..fd64fac34de 100644 --- a/Build/source/libs/icu/icu-src/source/common/ubidiimp.h +++ b/Build/source/libs/icu/icu-src/source/common/ubidiimp.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ****************************************************************************** @@ -8,7 +8,7 @@ * ****************************************************************************** * file name: ubidiimp.h -* encoding: US-ASCII +* encoding: UTF-8 * tab size: 8 (not used) * indentation:4 * diff --git a/Build/source/libs/icu/icu-src/source/common/ubidiln.c b/Build/source/libs/icu/icu-src/source/common/ubidiln.c deleted file mode 100644 index 688ca4c31ed..00000000000 --- a/Build/source/libs/icu/icu-src/source/common/ubidiln.c +++ /dev/null @@ -1,1349 +0,0 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. -// License & terms of use: http://www.unicode.org/copyright.html -/* -****************************************************************************** -* -* Copyright (C) 1999-2015, International Business Machines -* Corporation and others. All Rights Reserved. -* -****************************************************************************** -* file name: ubidiln.c -* encoding: US-ASCII -* tab size: 8 (not used) -* indentation:4 -* -* created on: 1999aug06 -* created by: Markus W. Scherer, updated by Matitiahu Allouche -*/ - -#include "cmemory.h" -#include "unicode/utypes.h" -#include "unicode/ustring.h" -#include "unicode/uchar.h" -#include "unicode/ubidi.h" -#include "ubidiimp.h" -#include "uassert.h" - -/* - * General remarks about the functions in this file: - * - * These functions deal with the aspects of potentially mixed-directional - * text in a single paragraph or in a line of a single paragraph - * which has already been processed according to - * the Unicode 6.3 BiDi algorithm as defined in - * http://www.unicode.org/unicode/reports/tr9/ , version 28, - * also described in The Unicode Standard, Version 6.3.0 . - * - * This means that there is a UBiDi object with a levels - * and a dirProps array. - * paraLevel and direction are also set. - * Only if the length of the text is zero, then levels==dirProps==NULL. - * - * The overall directionality of the paragraph - * or line is used to bypass the reordering steps if possible. - * Even purely RTL text does not need reordering there because - * the ubidi_getLogical/VisualIndex() functions can compute the - * index on the fly in such a case. - * - * The implementation of the access to same-level-runs and of the reordering - * do attempt to provide better performance and less memory usage compared to - * a direct implementation of especially rule (L2) with an array of - * one (32-bit) integer per text character. - * - * Here, the levels array is scanned as soon as necessary, and a vector of - * same-level-runs is created. Reordering then is done on this vector. - * For each run of text positions that were resolved to the same level, - * only 8 bytes are stored: the first text position of the run and the visual - * position behind the run after reordering. - * One sign bit is used to hold the directionality of the run. - * This is inefficient if there are many very short runs. If the average run - * length is <2, then this uses more memory. - * - * In a further attempt to save memory, the levels array is never changed - * after all the resolution rules (Xn, Wn, Nn, In). - * Many functions have to consider the field trailingWSStart: - * if it is less than length, then there is an implicit trailing run - * at the paraLevel, - * which is not reflected in the levels array. - * This allows a line UBiDi object to use the same levels array as - * its paragraph parent object. - * - * When a UBiDi object is created for a line of a paragraph, then the - * paragraph's levels and dirProps arrays are reused by way of setting - * a pointer into them, not by copying. This again saves memory and forbids to - * change the now shared levels for (L1). - */ - -/* handle trailing WS (L1) -------------------------------------------------- */ - -/* - * setTrailingWSStart() sets the start index for a trailing - * run of WS in the line. This is necessary because we do not modify - * the paragraph's levels array that we just point into. - * Using trailingWSStart is another form of performing (L1). - * - * To make subsequent operations easier, we also include the run - * before the WS if it is at the paraLevel - we merge the two here. - * - * This function is called only from ubidi_setLine(), so pBiDi->paraLevel is - * set correctly for the line even when contextual multiple paragraphs. - */ -static void -setTrailingWSStart(UBiDi *pBiDi) { - /* pBiDi->direction!=UBIDI_MIXED */ - - const DirProp *dirProps=pBiDi->dirProps; - UBiDiLevel *levels=pBiDi->levels; - int32_t start=pBiDi->length; - UBiDiLevel paraLevel=pBiDi->paraLevel; - - /* If the line is terminated by a block separator, all preceding WS etc... - are already set to paragraph level. - Setting trailingWSStart to pBidi->length will avoid changing the - level of B chars from 0 to paraLevel in ubidi_getLevels when - orderParagraphsLTR==TRUE. - */ - if(dirProps[start-1]==B) { - pBiDi->trailingWSStart=start; /* currently == pBiDi->length */ - return; - } - /* go backwards across all WS, BN, explicit codes */ - while(start>0 && DIRPROP_FLAG(dirProps[start-1])&MASK_WS) { - --start; - } - - /* if the WS run can be merged with the previous run then do so here */ - while(start>0 && levels[start-1]==paraLevel) { - --start; - } - - pBiDi->trailingWSStart=start; -} - -/* ubidi_setLine ------------------------------------------------------------ */ - -U_CAPI void U_EXPORT2 -ubidi_setLine(const UBiDi *pParaBiDi, - int32_t start, int32_t limit, - UBiDi *pLineBiDi, - UErrorCode *pErrorCode) { - int32_t length; - - /* check the argument values */ - RETURN_VOID_IF_NULL_OR_FAILING_ERRCODE(pErrorCode); - RETURN_VOID_IF_NOT_VALID_PARA(pParaBiDi, *pErrorCode); - RETURN_VOID_IF_BAD_RANGE(start, 0, limit, *pErrorCode); - RETURN_VOID_IF_BAD_RANGE(limit, 0, pParaBiDi->length+1, *pErrorCode); - if(pLineBiDi==NULL) { - *pErrorCode=U_ILLEGAL_ARGUMENT_ERROR; - return; - } - if(ubidi_getParagraph(pParaBiDi, start, NULL, NULL, NULL, pErrorCode) != - ubidi_getParagraph(pParaBiDi, limit-1, NULL, NULL, NULL, pErrorCode)) { - /* the line crosses a paragraph boundary */ - *pErrorCode=U_ILLEGAL_ARGUMENT_ERROR; - return; - } - - /* set the values in pLineBiDi from its pParaBiDi parent */ - pLineBiDi->pParaBiDi=NULL; /* mark unfinished setLine */ - pLineBiDi->text=pParaBiDi->text+start; - length=pLineBiDi->length=limit-start; - pLineBiDi->resultLength=pLineBiDi->originalLength=length; - pLineBiDi->paraLevel=GET_PARALEVEL(pParaBiDi, start); - pLineBiDi->paraCount=pParaBiDi->paraCount; - pLineBiDi->runs=NULL; - pLineBiDi->flags=0; - pLineBiDi->reorderingMode=pParaBiDi->reorderingMode; - pLineBiDi->reorderingOptions=pParaBiDi->reorderingOptions; - pLineBiDi->controlCount=0; - if(pParaBiDi->controlCount>0) { - int32_t j; - for(j=start; jtext[j])) { - pLineBiDi->controlCount++; - } - } - pLineBiDi->resultLength-=pLineBiDi->controlCount; - } - - pLineBiDi->dirProps=pParaBiDi->dirProps+start; - pLineBiDi->levels=pParaBiDi->levels+start; - pLineBiDi->runCount=-1; - - if(pParaBiDi->direction!=UBIDI_MIXED) { - /* the parent is already trivial */ - pLineBiDi->direction=pParaBiDi->direction; - - /* - * The parent's levels are all either - * implicitly or explicitly ==paraLevel; - * do the same here. - */ - if(pParaBiDi->trailingWSStart<=start) { - pLineBiDi->trailingWSStart=0; - } else if(pParaBiDi->trailingWSStarttrailingWSStart=pParaBiDi->trailingWSStart-start; - } else { - pLineBiDi->trailingWSStart=length; - } - } else { - const UBiDiLevel *levels=pLineBiDi->levels; - int32_t i, trailingWSStart; - UBiDiLevel level; - - setTrailingWSStart(pLineBiDi); - trailingWSStart=pLineBiDi->trailingWSStart; - - /* recalculate pLineBiDi->direction */ - if(trailingWSStart==0) { - /* all levels are at paraLevel */ - pLineBiDi->direction=(UBiDiDirection)(pLineBiDi->paraLevel&1); - } else { - /* get the level of the first character */ - level=(UBiDiLevel)(levels[0]&1); - - /* if there is anything of a different level, then the line is mixed */ - if(trailingWSStartparaLevel&1)!=level) { - /* the trailing WS is at paraLevel, which differs from levels[0] */ - pLineBiDi->direction=UBIDI_MIXED; - } else { - /* see if levels[1..trailingWSStart-1] have the same direction as levels[0] and paraLevel */ - i=1; - for(;;) { - if(i==trailingWSStart) { - /* the direction values match those in level */ - pLineBiDi->direction=(UBiDiDirection)level; - break; - } else if((levels[i]&1)!=level) { - pLineBiDi->direction=UBIDI_MIXED; - break; - } - ++i; - } - } - } - - switch(pLineBiDi->direction) { - case UBIDI_LTR: - /* make sure paraLevel is even */ - pLineBiDi->paraLevel=(UBiDiLevel)((pLineBiDi->paraLevel+1)&~1); - - /* all levels are implicitly at paraLevel (important for ubidi_getLevels()) */ - pLineBiDi->trailingWSStart=0; - break; - case UBIDI_RTL: - /* make sure paraLevel is odd */ - pLineBiDi->paraLevel|=1; - - /* all levels are implicitly at paraLevel (important for ubidi_getLevels()) */ - pLineBiDi->trailingWSStart=0; - break; - default: - break; - } - } - pLineBiDi->pParaBiDi=pParaBiDi; /* mark successful setLine */ - return; -} - -U_CAPI UBiDiLevel U_EXPORT2 -ubidi_getLevelAt(const UBiDi *pBiDi, int32_t charIndex) { - /* return paraLevel if in the trailing WS run, otherwise the real level */ - if(!IS_VALID_PARA_OR_LINE(pBiDi) || charIndex<0 || pBiDi->length<=charIndex) { - return 0; - } else if(pBiDi->direction!=UBIDI_MIXED || charIndex>=pBiDi->trailingWSStart) { - return GET_PARALEVEL(pBiDi, charIndex); - } else { - return pBiDi->levels[charIndex]; - } -} - -U_CAPI const UBiDiLevel * U_EXPORT2 -ubidi_getLevels(UBiDi *pBiDi, UErrorCode *pErrorCode) { - int32_t start, length; - - RETURN_IF_NULL_OR_FAILING_ERRCODE(pErrorCode, NULL); - RETURN_IF_NOT_VALID_PARA_OR_LINE(pBiDi, *pErrorCode, NULL); - if((length=pBiDi->length)<=0) { - *pErrorCode=U_ILLEGAL_ARGUMENT_ERROR; - return NULL; - } - if((start=pBiDi->trailingWSStart)==length) { - /* the current levels array reflects the WS run */ - return pBiDi->levels; - } - - /* - * After the previous if(), we know that the levels array - * has an implicit trailing WS run and therefore does not fully - * reflect itself all the levels. - * This must be a UBiDi object for a line, and - * we need to create a new levels array. - */ - if(getLevelsMemory(pBiDi, length)) { - UBiDiLevel *levels=pBiDi->levelsMemory; - - if(start>0 && levels!=pBiDi->levels) { - uprv_memcpy(levels, pBiDi->levels, start); - } - /* pBiDi->paraLevel is ok even if contextual multiple paragraphs, - since pBidi is a line object */ - uprv_memset(levels+start, pBiDi->paraLevel, length-start); - - /* this new levels array is set for the line and reflects the WS run */ - pBiDi->trailingWSStart=length; - return pBiDi->levels=levels; - } else { - /* out of memory */ - *pErrorCode=U_MEMORY_ALLOCATION_ERROR; - return NULL; - } -} - -U_CAPI void U_EXPORT2 -ubidi_getLogicalRun(const UBiDi *pBiDi, int32_t logicalPosition, - int32_t *pLogicalLimit, UBiDiLevel *pLevel) { - UErrorCode errorCode; - int32_t runCount, visualStart, logicalLimit, logicalFirst, i; - Run iRun; - - errorCode=U_ZERO_ERROR; - RETURN_VOID_IF_BAD_RANGE(logicalPosition, 0, pBiDi->length, errorCode); - /* ubidi_countRuns will check VALID_PARA_OR_LINE */ - runCount=ubidi_countRuns((UBiDi *)pBiDi, &errorCode); - if(U_FAILURE(errorCode)) { - return; - } - /* this is done based on runs rather than on levels since levels have - a special interpretation when UBIDI_REORDER_RUNS_ONLY - */ - visualStart=logicalLimit=0; - iRun=pBiDi->runs[0]; - - for(i=0; iruns[i]; - logicalFirst=GET_INDEX(iRun.logicalStart); - logicalLimit=logicalFirst+iRun.visualLimit-visualStart; - if((logicalPosition>=logicalFirst) && - (logicalPositionreorderingMode==UBIDI_REORDER_RUNS_ONLY) { - *pLevel=(UBiDiLevel)GET_ODD_BIT(iRun.logicalStart); - } - else if(pBiDi->direction!=UBIDI_MIXED || logicalPosition>=pBiDi->trailingWSStart) { - *pLevel=GET_PARALEVEL(pBiDi, logicalPosition); - } else { - *pLevel=pBiDi->levels[logicalPosition]; - } - } -} - -/* runs API functions ------------------------------------------------------- */ - -U_CAPI int32_t U_EXPORT2 -ubidi_countRuns(UBiDi *pBiDi, UErrorCode *pErrorCode) { - RETURN_IF_NULL_OR_FAILING_ERRCODE(pErrorCode, -1); - RETURN_IF_NOT_VALID_PARA_OR_LINE(pBiDi, *pErrorCode, -1); - ubidi_getRuns(pBiDi, pErrorCode); - if(U_FAILURE(*pErrorCode)) { - return -1; - } - return pBiDi->runCount; -} - -U_CAPI UBiDiDirection U_EXPORT2 -ubidi_getVisualRun(UBiDi *pBiDi, int32_t runIndex, - int32_t *pLogicalStart, int32_t *pLength) -{ - int32_t start; - UErrorCode errorCode = U_ZERO_ERROR; - RETURN_IF_NOT_VALID_PARA_OR_LINE(pBiDi, errorCode, UBIDI_LTR); - ubidi_getRuns(pBiDi, &errorCode); - if(U_FAILURE(errorCode)) { - return UBIDI_LTR; - } - RETURN_IF_BAD_RANGE(runIndex, 0, pBiDi->runCount, errorCode, UBIDI_LTR); - - start=pBiDi->runs[runIndex].logicalStart; - if(pLogicalStart!=NULL) { - *pLogicalStart=GET_INDEX(start); - } - if(pLength!=NULL) { - if(runIndex>0) { - *pLength=pBiDi->runs[runIndex].visualLimit- - pBiDi->runs[runIndex-1].visualLimit; - } else { - *pLength=pBiDi->runs[0].visualLimit; - } - } - return (UBiDiDirection)GET_ODD_BIT(start); -} - -/* in trivial cases there is only one trivial run; called by ubidi_getRuns() */ -static void -getSingleRun(UBiDi *pBiDi, UBiDiLevel level) { - /* simple, single-run case */ - pBiDi->runs=pBiDi->simpleRuns; - pBiDi->runCount=1; - - /* fill and reorder the single run */ - pBiDi->runs[0].logicalStart=MAKE_INDEX_ODD_PAIR(0, level); - pBiDi->runs[0].visualLimit=pBiDi->length; - pBiDi->runs[0].insertRemove=0; -} - -/* reorder the runs array (L2) ---------------------------------------------- */ - -/* - * Reorder the same-level runs in the runs array. - * Here, runCount>1 and maxLevel>=minLevel>=paraLevel. - * All the visualStart fields=logical start before reordering. - * The "odd" bits are not set yet. - * - * Reordering with this data structure lends itself to some handy shortcuts: - * - * Since each run is moved but not modified, and since at the initial maxLevel - * each sequence of same-level runs consists of only one run each, we - * don't need to do anything there and can predecrement maxLevel. - * In many simple cases, the reordering is thus done entirely in the - * index mapping. - * Also, reordering occurs only down to the lowest odd level that occurs, - * which is minLevel|1. However, if the lowest level itself is odd, then - * in the last reordering the sequence of the runs at this level or higher - * will be all runs, and we don't need the elaborate loop to search for them. - * This is covered by ++minLevel instead of minLevel|=1 followed - * by an extra reorder-all after the reorder-some loop. - * About a trailing WS run: - * Such a run would need special treatment because its level is not - * reflected in levels[] if this is not a paragraph object. - * Instead, all characters from trailingWSStart on are implicitly at - * paraLevel. - * However, for all maxLevel>paraLevel, this run will never be reordered - * and does not need to be taken into account. maxLevel==paraLevel is only reordered - * if minLevel==paraLevel is odd, which is done in the extra segment. - * This means that for the main reordering loop we don't need to consider - * this run and can --runCount. If it is later part of the all-runs - * reordering, then runCount is adjusted accordingly. - */ -static void -reorderLine(UBiDi *pBiDi, UBiDiLevel minLevel, UBiDiLevel maxLevel) { - Run *runs, tempRun; - UBiDiLevel *levels; - int32_t firstRun, endRun, limitRun, runCount; - - /* nothing to do? */ - if(maxLevel<=(minLevel|1)) { - return; - } - - /* - * Reorder only down to the lowest odd level - * and reorder at an odd minLevel in a separate, simpler loop. - * See comments above for why minLevel is always incremented. - */ - ++minLevel; - - runs=pBiDi->runs; - levels=pBiDi->levels; - runCount=pBiDi->runCount; - - /* do not include the WS run at paraLevel<=old minLevel except in the simple loop */ - if(pBiDi->trailingWSStartlength) { - --runCount; - } - - while(--maxLevel>=minLevel) { - firstRun=0; - - /* loop for all sequences of runs */ - for(;;) { - /* look for a sequence of runs that are all at >=maxLevel */ - /* look for the first run of such a sequence */ - while(firstRun=runCount) { - break; /* no more such runs */ - } - - /* look for the limit run of such a sequence (the run behind it) */ - for(limitRun=firstRun; ++limitRun=maxLevel;) {} - - /* Swap the entire sequence of runs from firstRun to limitRun-1. */ - endRun=limitRun-1; - while(firstRuntrailingWSStart==pBiDi->length) { - --runCount; - } - - /* Swap the entire sequence of all runs. (endRun==runCount) */ - while(firstRunruns; - int32_t runCount=pBiDi->runCount, visualStart=0, i, length, logicalStart; - - for(i=0; i=logicalStart) && (logicalIndex<(logicalStart+length))) { - return i; - } - visualStart+=length; - } - /* we should never get here */ - U_ASSERT(FALSE); - *pErrorCode = U_INVALID_STATE_ERROR; - return 0; -} - -/* - * Compute the runs array from the levels array. - * After ubidi_getRuns() returns TRUE, runCount is guaranteed to be >0 - * and the runs are reordered. - * Odd-level runs have visualStart on their visual right edge and - * they progress visually to the left. - * If option UBIDI_OPTION_INSERT_MARKS is set, insertRemove will contain the - * sum of appropriate LRM/RLM_BEFORE/AFTER flags. - * If option UBIDI_OPTION_REMOVE_CONTROLS is set, insertRemove will contain the - * negative number of BiDi control characters within this run. - */ -U_CFUNC UBool -ubidi_getRuns(UBiDi *pBiDi, UErrorCode *pErrorCode) { - /* - * This method returns immediately if the runs are already set. This - * includes the case of length==0 (handled in setPara).. - */ - if (pBiDi->runCount>=0) { - return TRUE; - } - - if(pBiDi->direction!=UBIDI_MIXED) { - /* simple, single-run case - this covers length==0 */ - /* pBiDi->paraLevel is ok even for contextual multiple paragraphs */ - getSingleRun(pBiDi, pBiDi->paraLevel); - } else /* UBIDI_MIXED, length>0 */ { - /* mixed directionality */ - int32_t length=pBiDi->length, limit; - UBiDiLevel *levels=pBiDi->levels; - int32_t i, runCount; - UBiDiLevel level=UBIDI_DEFAULT_LTR; /* initialize with no valid level */ - /* - * If there are WS characters at the end of the line - * and the run preceding them has a level different from - * paraLevel, then they will form their own run at paraLevel (L1). - * Count them separately. - * We need some special treatment for this in order to not - * modify the levels array which a line UBiDi object shares - * with its paragraph parent and its other line siblings. - * In other words, for the trailing WS, it may be - * levels[]!=paraLevel but we have to treat it like it were so. - */ - limit=pBiDi->trailingWSStart; - /* count the runs, there is at least one non-WS run, and limit>0 */ - runCount=0; - for(i=0; i1 || limit1 */ - if(getRunsMemory(pBiDi, runCount)) { - runs=pBiDi->runsMemory; - } else { - return FALSE; - } - - /* set the runs */ - /* FOOD FOR THOUGHT: this could be optimized, e.g.: - * 464->444, 484->444, 575->555, 595->555 - * However, that would take longer. Check also how it would - * interact with BiDi control removal and inserting Marks. - */ - runIndex=0; - - /* search for the run limits and initialize visualLimit values with the run lengths */ - i=0; - do { - /* prepare this run */ - start=i; - level=levels[i]; - if(levelmaxLevel) { - maxLevel=level; - } - - /* look for the run limit */ - while(++iparaLevel is ok even - if contextual multiple paragraphs. */ - if(pBiDi->paraLevelparaLevel; - } - } - - /* set the object fields */ - pBiDi->runs=runs; - pBiDi->runCount=runCount; - - reorderLine(pBiDi, minLevel, maxLevel); - - /* now add the direction flags and adjust the visualLimit's to be just that */ - /* this loop will also handle the trailing WS run */ - limit=0; - for(i=0; iparaLevel is ok even if - contextual multiple paragraphs. */ - if(runIndexparaLevel & 1) != 0)? 0 : runIndex; - - ADD_ODD_BIT_FROM_LEVEL(runs[trailingRun].logicalStart, pBiDi->paraLevel); - } - } - } - - /* handle insert LRM/RLM BEFORE/AFTER run */ - if(pBiDi->insertPoints.size>0) { - Point *point, *start=pBiDi->insertPoints.points, - *limit=start+pBiDi->insertPoints.size; - int32_t runIndex; - for(point=start; pointpos, pErrorCode); - pBiDi->runs[runIndex].insertRemove|=point->flag; - } - } - - /* handle remove BiDi control characters */ - if(pBiDi->controlCount>0) { - int32_t runIndex; - const UChar *start=pBiDi->text, *limit=start+pBiDi->length, *pu; - for(pu=start; puruns[runIndex].insertRemove--; - } - } - } - - return TRUE; -} - -static UBool -prepareReorder(const UBiDiLevel *levels, int32_t length, - int32_t *indexMap, - UBiDiLevel *pMinLevel, UBiDiLevel *pMaxLevel) { - int32_t start; - UBiDiLevel level, minLevel, maxLevel; - - if(levels==NULL || length<=0) { - return FALSE; - } - - /* determine minLevel and maxLevel */ - minLevel=UBIDI_MAX_EXPLICIT_LEVEL+1; - maxLevel=0; - for(start=length; start>0;) { - level=levels[--start]; - if(level>UBIDI_MAX_EXPLICIT_LEVEL+1) { - return FALSE; - } - if(levelmaxLevel) { - maxLevel=level; - } - } - *pMinLevel=minLevel; - *pMaxLevel=maxLevel; - - /* initialize the index map */ - for(start=length; start>0;) { - --start; - indexMap[start]=start; - } - - return TRUE; -} - -/* reorder a line based on a levels array (L2) ------------------------------ */ - -U_CAPI void U_EXPORT2 -ubidi_reorderLogical(const UBiDiLevel *levels, int32_t length, int32_t *indexMap) { - int32_t start, limit, sumOfSosEos; - UBiDiLevel minLevel = 0, maxLevel = 0; - - if(indexMap==NULL || !prepareReorder(levels, length, indexMap, &minLevel, &maxLevel)) { - return; - } - - /* nothing to do? */ - if(minLevel==maxLevel && (minLevel&1)==0) { - return; - } - - /* reorder only down to the lowest odd level */ - minLevel|=1; - - /* loop maxLevel..minLevel */ - do { - start=0; - - /* loop for all sequences of levels to reorder at the current maxLevel */ - for(;;) { - /* look for a sequence of levels that are all at >=maxLevel */ - /* look for the first index of such a sequence */ - while(start=length) { - break; /* no more such sequences */ - } - - /* look for the limit of such a sequence (the index behind it) */ - for(limit=start; ++limit=maxLevel;) {} - - /* - * sos=start of sequence, eos=end of sequence - * - * The closed (inclusive) interval from sos to eos includes all the logical - * and visual indexes within this sequence. They are logically and - * visually contiguous and in the same range. - * - * For each run, the new visual index=sos+eos-old visual index; - * we pre-add sos+eos into sumOfSosEos -> - * new visual index=sumOfSosEos-old visual index; - */ - sumOfSosEos=start+limit-1; - - /* reorder each index in the sequence */ - do { - indexMap[start]=sumOfSosEos-indexMap[start]; - } while(++start=minLevel); -} - -U_CAPI void U_EXPORT2 -ubidi_reorderVisual(const UBiDiLevel *levels, int32_t length, int32_t *indexMap) { - int32_t start, end, limit, temp; - UBiDiLevel minLevel = 0, maxLevel = 0; - - if(indexMap==NULL || !prepareReorder(levels, length, indexMap, &minLevel, &maxLevel)) { - return; - } - - /* nothing to do? */ - if(minLevel==maxLevel && (minLevel&1)==0) { - return; - } - - /* reorder only down to the lowest odd level */ - minLevel|=1; - - /* loop maxLevel..minLevel */ - do { - start=0; - - /* loop for all sequences of levels to reorder at the current maxLevel */ - for(;;) { - /* look for a sequence of levels that are all at >=maxLevel */ - /* look for the first index of such a sequence */ - while(start=length) { - break; /* no more such runs */ - } - - /* look for the limit of such a sequence (the index behind it) */ - for(limit=start; ++limit=maxLevel;) {} - - /* - * Swap the entire interval of indexes from start to limit-1. - * We don't need to swap the levels for the purpose of this - * algorithm: the sequence of levels that we look at does not - * move anyway. - */ - end=limit-1; - while(start=minLevel); -} - -/* API functions for logical<->visual mapping ------------------------------- */ - -U_CAPI int32_t U_EXPORT2 -ubidi_getVisualIndex(UBiDi *pBiDi, int32_t logicalIndex, UErrorCode *pErrorCode) { - int32_t visualIndex=UBIDI_MAP_NOWHERE; - RETURN_IF_NULL_OR_FAILING_ERRCODE(pErrorCode, -1); - RETURN_IF_NOT_VALID_PARA_OR_LINE(pBiDi, *pErrorCode, -1); - RETURN_IF_BAD_RANGE(logicalIndex, 0, pBiDi->length, *pErrorCode, -1); - - /* we can do the trivial cases without the runs array */ - switch(pBiDi->direction) { - case UBIDI_LTR: - visualIndex=logicalIndex; - break; - case UBIDI_RTL: - visualIndex=pBiDi->length-logicalIndex-1; - break; - default: - if(!ubidi_getRuns(pBiDi, pErrorCode)) { - *pErrorCode=U_MEMORY_ALLOCATION_ERROR; - return -1; - } else { - Run *runs=pBiDi->runs; - int32_t i, visualStart=0, offset, length; - - /* linear search for the run, search on the visual runs */ - for(i=0; irunCount; ++i) { - length=runs[i].visualLimit-visualStart; - offset=logicalIndex-GET_INDEX(runs[i].logicalStart); - if(offset>=0 && offset=pBiDi->runCount) { - return UBIDI_MAP_NOWHERE; - } - } - } - - if(pBiDi->insertPoints.size>0) { - /* add the number of added marks until the calculated visual index */ - Run *runs=pBiDi->runs; - int32_t i, length, insertRemove; - int32_t visualStart=0, markFound=0; - for(i=0; ; i++, visualStart+=length) { - length=runs[i].visualLimit-visualStart; - insertRemove=runs[i].insertRemove; - if(insertRemove & (LRM_BEFORE|RLM_BEFORE)) { - markFound++; - } - /* is it the run containing the visual index? */ - if(visualIndexcontrolCount>0) { - /* subtract the number of controls until the calculated visual index */ - Run *runs=pBiDi->runs; - int32_t i, j, start, limit, length, insertRemove; - int32_t visualStart=0, controlFound=0; - UChar uchar=pBiDi->text[logicalIndex]; - /* is the logical index pointing to a control ? */ - if(IS_BIDI_CONTROL_CHAR(uchar)) { - return UBIDI_MAP_NOWHERE; - } - /* loop on runs */ - for(i=0; ; i++, visualStart+=length) { - length=runs[i].visualLimit-visualStart; - insertRemove=runs[i].insertRemove; - /* calculated visual index is beyond this run? */ - if(visualIndex>=runs[i].visualLimit) { - controlFound-=insertRemove; - continue; - } - /* calculated visual index must be within current run */ - if(insertRemove==0) { - return visualIndex-controlFound; - } - if(IS_EVEN_RUN(runs[i].logicalStart)) { - /* LTR: check from run start to logical index */ - start=runs[i].logicalStart; - limit=logicalIndex; - } else { - /* RTL: check from logical index to run end */ - start=logicalIndex+1; - limit=GET_INDEX(runs[i].logicalStart)+length; - } - for(j=start; jtext[j]; - if(IS_BIDI_CONTROL_CHAR(uchar)) { - controlFound++; - } - } - return visualIndex-controlFound; - } - } - - return visualIndex; -} - -U_CAPI int32_t U_EXPORT2 -ubidi_getLogicalIndex(UBiDi *pBiDi, int32_t visualIndex, UErrorCode *pErrorCode) { - Run *runs; - int32_t i, runCount, start; - RETURN_IF_NULL_OR_FAILING_ERRCODE(pErrorCode, -1); - RETURN_IF_NOT_VALID_PARA_OR_LINE(pBiDi, *pErrorCode, -1); - RETURN_IF_BAD_RANGE(visualIndex, 0, pBiDi->resultLength, *pErrorCode, -1); - /* we can do the trivial cases without the runs array */ - if(pBiDi->insertPoints.size==0 && pBiDi->controlCount==0) { - if(pBiDi->direction==UBIDI_LTR) { - return visualIndex; - } - else if(pBiDi->direction==UBIDI_RTL) { - return pBiDi->length-visualIndex-1; - } - } - if(!ubidi_getRuns(pBiDi, pErrorCode)) { - *pErrorCode=U_MEMORY_ALLOCATION_ERROR; - return -1; - } - - runs=pBiDi->runs; - runCount=pBiDi->runCount; - if(pBiDi->insertPoints.size>0) { - /* handle inserted LRM/RLM */ - int32_t markFound=0, insertRemove; - int32_t visualStart=0, length; - runs=pBiDi->runs; - /* subtract number of marks until visual index */ - for(i=0; ; i++, visualStart+=length) { - length=runs[i].visualLimit-visualStart; - insertRemove=runs[i].insertRemove; - if(insertRemove&(LRM_BEFORE|RLM_BEFORE)) { - if(visualIndex<=(visualStart+markFound)) { - return UBIDI_MAP_NOWHERE; - } - markFound++; - } - /* is adjusted visual index within this run? */ - if(visualIndex<(runs[i].visualLimit+markFound)) { - visualIndex-=markFound; - break; - } - if(insertRemove&(LRM_AFTER|RLM_AFTER)) { - if(visualIndex==(visualStart+length+markFound)) { - return UBIDI_MAP_NOWHERE; - } - markFound++; - } - } - } - else if(pBiDi->controlCount>0) { - /* handle removed BiDi control characters */ - int32_t controlFound=0, insertRemove, length; - int32_t logicalStart, logicalEnd, visualStart=0, j, k; - UChar uchar; - UBool evenRun; - /* add number of controls until visual index */ - for(i=0; ; i++, visualStart+=length) { - length=runs[i].visualLimit-visualStart; - insertRemove=runs[i].insertRemove; - /* is adjusted visual index beyond current run? */ - if(visualIndex>=(runs[i].visualLimit-controlFound+insertRemove)) { - controlFound-=insertRemove; - continue; - } - /* adjusted visual index is within current run */ - if(insertRemove==0) { - visualIndex+=controlFound; - break; - } - /* count non-control chars until visualIndex */ - logicalStart=runs[i].logicalStart; - evenRun=IS_EVEN_RUN(logicalStart); - REMOVE_ODD_BIT(logicalStart); - logicalEnd=logicalStart+length-1; - for(j=0; jtext[k]; - if(IS_BIDI_CONTROL_CHAR(uchar)) { - controlFound++; - } - if((visualIndex+controlFound)==(visualStart+j)) { - break; - } - } - visualIndex+=controlFound; - break; - } - } - /* handle all cases */ - if(runCount<=10) { - /* linear search for the run */ - for(i=0; visualIndex>=runs[i].visualLimit; ++i) {} - } else { - /* binary search for the run */ - int32_t begin=0, limit=runCount; - - /* the middle if() is guaranteed to find the run, we don't need a loop limit */ - for(;;) { - i=(begin+limit)/2; - if(visualIndex>=runs[i].visualLimit) { - begin=i+1; - } else if(i==0 || visualIndex>=runs[i-1].visualLimit) { - break; - } else { - limit=i; - } - } - } - - start=runs[i].logicalStart; - if(IS_EVEN_RUN(start)) { - /* LTR */ - /* the offset in runs[i] is visualIndex-runs[i-1].visualLimit */ - if(i>0) { - visualIndex-=runs[i-1].visualLimit; - } - return start+visualIndex; - } else { - /* RTL */ - return GET_INDEX(start)+runs[i].visualLimit-visualIndex-1; - } -} - -U_CAPI void U_EXPORT2 -ubidi_getLogicalMap(UBiDi *pBiDi, int32_t *indexMap, UErrorCode *pErrorCode) { - RETURN_VOID_IF_NULL_OR_FAILING_ERRCODE(pErrorCode); - /* ubidi_countRuns() checks for VALID_PARA_OR_LINE */ - ubidi_countRuns(pBiDi, pErrorCode); - if(U_FAILURE(*pErrorCode)) { - /* no op */ - } else if(indexMap==NULL) { - *pErrorCode=U_ILLEGAL_ARGUMENT_ERROR; - } else { - /* fill a logical-to-visual index map using the runs[] */ - int32_t visualStart, visualLimit, i, j, k; - int32_t logicalStart, logicalLimit; - Run *runs=pBiDi->runs; - if (pBiDi->length<=0) { - return; - } - if (pBiDi->length>pBiDi->resultLength) { - uprv_memset(indexMap, 0xFF, pBiDi->length*sizeof(int32_t)); - } - - visualStart=0; - for(j=0; jrunCount; ++j) { - logicalStart=GET_INDEX(runs[j].logicalStart); - visualLimit=runs[j].visualLimit; - if(IS_EVEN_RUN(runs[j].logicalStart)) { - do { /* LTR */ - indexMap[logicalStart++]=visualStart++; - } while(visualStartinsertPoints.size>0) { - int32_t markFound=0, runCount=pBiDi->runCount; - int32_t length, insertRemove; - visualStart=0; - /* add number of marks found until each index */ - for(i=0; i0) { - logicalStart=GET_INDEX(runs[i].logicalStart); - logicalLimit=logicalStart+length; - for(j=logicalStart; jcontrolCount>0) { - int32_t controlFound=0, runCount=pBiDi->runCount; - int32_t length, insertRemove; - UBool evenRun; - UChar uchar; - visualStart=0; - /* subtract number of controls found until each index */ - for(i=0; itext[k]; - if(IS_BIDI_CONTROL_CHAR(uchar)) { - controlFound++; - indexMap[k]=UBIDI_MAP_NOWHERE; - continue; - } - indexMap[k]-=controlFound; - } - } - } - } -} - -U_CAPI void U_EXPORT2 -ubidi_getVisualMap(UBiDi *pBiDi, int32_t *indexMap, UErrorCode *pErrorCode) { - RETURN_VOID_IF_NULL_OR_FAILING_ERRCODE(pErrorCode); - if(indexMap==NULL) { - *pErrorCode=U_ILLEGAL_ARGUMENT_ERROR; - return; - } - /* ubidi_countRuns() checks for VALID_PARA_OR_LINE */ - ubidi_countRuns(pBiDi, pErrorCode); - if(U_SUCCESS(*pErrorCode)) { - /* fill a visual-to-logical index map using the runs[] */ - Run *runs=pBiDi->runs, *runsLimit=runs+pBiDi->runCount; - int32_t logicalStart, visualStart, visualLimit, *pi=indexMap; - - if (pBiDi->resultLength<=0) { - return; - } - visualStart=0; - for(; runslogicalStart; - visualLimit=runs->visualLimit; - if(IS_EVEN_RUN(logicalStart)) { - do { /* LTR */ - *pi++ = logicalStart++; - } while(++visualStartinsertPoints.size>0) { - int32_t markFound=0, runCount=pBiDi->runCount; - int32_t insertRemove, i, j, k; - runs=pBiDi->runs; - /* count all inserted marks */ - for(i=0; iresultLength; - for(i=runCount-1; i>=0 && markFound>0; i--) { - insertRemove=runs[i].insertRemove; - if(insertRemove&(LRM_AFTER|RLM_AFTER)) { - indexMap[--k]= UBIDI_MAP_NOWHERE; - markFound--; - } - visualStart= i>0 ? runs[i-1].visualLimit : 0; - for(j=runs[i].visualLimit-1; j>=visualStart && markFound>0; j--) { - indexMap[--k]=indexMap[j]; - } - if(insertRemove&(LRM_BEFORE|RLM_BEFORE)) { - indexMap[--k]= UBIDI_MAP_NOWHERE; - markFound--; - } - } - } - else if(pBiDi->controlCount>0) { - int32_t runCount=pBiDi->runCount, logicalEnd; - int32_t insertRemove, length, i, j, k, m; - UChar uchar; - UBool evenRun; - runs=pBiDi->runs; - visualStart=0; - /* move forward indexes by number of preceding controls */ - k=0; - for(i=0; itext[m]; - if(!IS_BIDI_CONTROL_CHAR(uchar)) { - indexMap[k++]=m; - } - } - } - } - } -} - -U_CAPI void U_EXPORT2 -ubidi_invertMap(const int32_t *srcMap, int32_t *destMap, int32_t length) { - if(srcMap!=NULL && destMap!=NULL && length>0) { - const int32_t *pi; - int32_t destLength=-1, count=0; - /* find highest value and count positive indexes in srcMap */ - pi=srcMap+length; - while(pi>srcMap) { - if(*--pi>destLength) { - destLength=*pi; - } - if(*pi>=0) { - count++; - } - } - destLength++; /* add 1 for origin 0 */ - if(count0) { - if(*--pi>=0) { - destMap[*pi]=--length; - } else { - --length; - } - } - } -} diff --git a/Build/source/libs/icu/icu-src/source/common/ubidiln.cpp b/Build/source/libs/icu/icu-src/source/common/ubidiln.cpp new file mode 100644 index 00000000000..71c581fe1c7 --- /dev/null +++ b/Build/source/libs/icu/icu-src/source/common/ubidiln.cpp @@ -0,0 +1,1349 @@ +// © 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html +/* +****************************************************************************** +* +* Copyright (C) 1999-2015, International Business Machines +* Corporation and others. All Rights Reserved. +* +****************************************************************************** +* file name: ubidiln.c +* encoding: UTF-8 +* tab size: 8 (not used) +* indentation:4 +* +* created on: 1999aug06 +* created by: Markus W. Scherer, updated by Matitiahu Allouche +*/ + +#include "cmemory.h" +#include "unicode/utypes.h" +#include "unicode/ustring.h" +#include "unicode/uchar.h" +#include "unicode/ubidi.h" +#include "ubidiimp.h" +#include "uassert.h" + +/* + * General remarks about the functions in this file: + * + * These functions deal with the aspects of potentially mixed-directional + * text in a single paragraph or in a line of a single paragraph + * which has already been processed according to + * the Unicode 6.3 BiDi algorithm as defined in + * http://www.unicode.org/unicode/reports/tr9/ , version 28, + * also described in The Unicode Standard, Version 6.3.0 . + * + * This means that there is a UBiDi object with a levels + * and a dirProps array. + * paraLevel and direction are also set. + * Only if the length of the text is zero, then levels==dirProps==NULL. + * + * The overall directionality of the paragraph + * or line is used to bypass the reordering steps if possible. + * Even purely RTL text does not need reordering there because + * the ubidi_getLogical/VisualIndex() functions can compute the + * index on the fly in such a case. + * + * The implementation of the access to same-level-runs and of the reordering + * do attempt to provide better performance and less memory usage compared to + * a direct implementation of especially rule (L2) with an array of + * one (32-bit) integer per text character. + * + * Here, the levels array is scanned as soon as necessary, and a vector of + * same-level-runs is created. Reordering then is done on this vector. + * For each run of text positions that were resolved to the same level, + * only 8 bytes are stored: the first text position of the run and the visual + * position behind the run after reordering. + * One sign bit is used to hold the directionality of the run. + * This is inefficient if there are many very short runs. If the average run + * length is <2, then this uses more memory. + * + * In a further attempt to save memory, the levels array is never changed + * after all the resolution rules (Xn, Wn, Nn, In). + * Many functions have to consider the field trailingWSStart: + * if it is less than length, then there is an implicit trailing run + * at the paraLevel, + * which is not reflected in the levels array. + * This allows a line UBiDi object to use the same levels array as + * its paragraph parent object. + * + * When a UBiDi object is created for a line of a paragraph, then the + * paragraph's levels and dirProps arrays are reused by way of setting + * a pointer into them, not by copying. This again saves memory and forbids to + * change the now shared levels for (L1). + */ + +/* handle trailing WS (L1) -------------------------------------------------- */ + +/* + * setTrailingWSStart() sets the start index for a trailing + * run of WS in the line. This is necessary because we do not modify + * the paragraph's levels array that we just point into. + * Using trailingWSStart is another form of performing (L1). + * + * To make subsequent operations easier, we also include the run + * before the WS if it is at the paraLevel - we merge the two here. + * + * This function is called only from ubidi_setLine(), so pBiDi->paraLevel is + * set correctly for the line even when contextual multiple paragraphs. + */ +static void +setTrailingWSStart(UBiDi *pBiDi) { + /* pBiDi->direction!=UBIDI_MIXED */ + + const DirProp *dirProps=pBiDi->dirProps; + UBiDiLevel *levels=pBiDi->levels; + int32_t start=pBiDi->length; + UBiDiLevel paraLevel=pBiDi->paraLevel; + + /* If the line is terminated by a block separator, all preceding WS etc... + are already set to paragraph level. + Setting trailingWSStart to pBidi->length will avoid changing the + level of B chars from 0 to paraLevel in ubidi_getLevels when + orderParagraphsLTR==TRUE. + */ + if(dirProps[start-1]==B) { + pBiDi->trailingWSStart=start; /* currently == pBiDi->length */ + return; + } + /* go backwards across all WS, BN, explicit codes */ + while(start>0 && DIRPROP_FLAG(dirProps[start-1])&MASK_WS) { + --start; + } + + /* if the WS run can be merged with the previous run then do so here */ + while(start>0 && levels[start-1]==paraLevel) { + --start; + } + + pBiDi->trailingWSStart=start; +} + +/* ubidi_setLine ------------------------------------------------------------ */ + +U_CAPI void U_EXPORT2 +ubidi_setLine(const UBiDi *pParaBiDi, + int32_t start, int32_t limit, + UBiDi *pLineBiDi, + UErrorCode *pErrorCode) { + int32_t length; + + /* check the argument values */ + RETURN_VOID_IF_NULL_OR_FAILING_ERRCODE(pErrorCode); + RETURN_VOID_IF_NOT_VALID_PARA(pParaBiDi, *pErrorCode); + RETURN_VOID_IF_BAD_RANGE(start, 0, limit, *pErrorCode); + RETURN_VOID_IF_BAD_RANGE(limit, 0, pParaBiDi->length+1, *pErrorCode); + if(pLineBiDi==NULL) { + *pErrorCode=U_ILLEGAL_ARGUMENT_ERROR; + return; + } + if(ubidi_getParagraph(pParaBiDi, start, NULL, NULL, NULL, pErrorCode) != + ubidi_getParagraph(pParaBiDi, limit-1, NULL, NULL, NULL, pErrorCode)) { + /* the line crosses a paragraph boundary */ + *pErrorCode=U_ILLEGAL_ARGUMENT_ERROR; + return; + } + + /* set the values in pLineBiDi from its pParaBiDi parent */ + pLineBiDi->pParaBiDi=NULL; /* mark unfinished setLine */ + pLineBiDi->text=pParaBiDi->text+start; + length=pLineBiDi->length=limit-start; + pLineBiDi->resultLength=pLineBiDi->originalLength=length; + pLineBiDi->paraLevel=GET_PARALEVEL(pParaBiDi, start); + pLineBiDi->paraCount=pParaBiDi->paraCount; + pLineBiDi->runs=NULL; + pLineBiDi->flags=0; + pLineBiDi->reorderingMode=pParaBiDi->reorderingMode; + pLineBiDi->reorderingOptions=pParaBiDi->reorderingOptions; + pLineBiDi->controlCount=0; + if(pParaBiDi->controlCount>0) { + int32_t j; + for(j=start; jtext[j])) { + pLineBiDi->controlCount++; + } + } + pLineBiDi->resultLength-=pLineBiDi->controlCount; + } + + pLineBiDi->dirProps=pParaBiDi->dirProps+start; + pLineBiDi->levels=pParaBiDi->levels+start; + pLineBiDi->runCount=-1; + + if(pParaBiDi->direction!=UBIDI_MIXED) { + /* the parent is already trivial */ + pLineBiDi->direction=pParaBiDi->direction; + + /* + * The parent's levels are all either + * implicitly or explicitly ==paraLevel; + * do the same here. + */ + if(pParaBiDi->trailingWSStart<=start) { + pLineBiDi->trailingWSStart=0; + } else if(pParaBiDi->trailingWSStarttrailingWSStart=pParaBiDi->trailingWSStart-start; + } else { + pLineBiDi->trailingWSStart=length; + } + } else { + const UBiDiLevel *levels=pLineBiDi->levels; + int32_t i, trailingWSStart; + UBiDiLevel level; + + setTrailingWSStart(pLineBiDi); + trailingWSStart=pLineBiDi->trailingWSStart; + + /* recalculate pLineBiDi->direction */ + if(trailingWSStart==0) { + /* all levels are at paraLevel */ + pLineBiDi->direction=(UBiDiDirection)(pLineBiDi->paraLevel&1); + } else { + /* get the level of the first character */ + level=(UBiDiLevel)(levels[0]&1); + + /* if there is anything of a different level, then the line is mixed */ + if(trailingWSStartparaLevel&1)!=level) { + /* the trailing WS is at paraLevel, which differs from levels[0] */ + pLineBiDi->direction=UBIDI_MIXED; + } else { + /* see if levels[1..trailingWSStart-1] have the same direction as levels[0] and paraLevel */ + i=1; + for(;;) { + if(i==trailingWSStart) { + /* the direction values match those in level */ + pLineBiDi->direction=(UBiDiDirection)level; + break; + } else if((levels[i]&1)!=level) { + pLineBiDi->direction=UBIDI_MIXED; + break; + } + ++i; + } + } + } + + switch(pLineBiDi->direction) { + case UBIDI_LTR: + /* make sure paraLevel is even */ + pLineBiDi->paraLevel=(UBiDiLevel)((pLineBiDi->paraLevel+1)&~1); + + /* all levels are implicitly at paraLevel (important for ubidi_getLevels()) */ + pLineBiDi->trailingWSStart=0; + break; + case UBIDI_RTL: + /* make sure paraLevel is odd */ + pLineBiDi->paraLevel|=1; + + /* all levels are implicitly at paraLevel (important for ubidi_getLevels()) */ + pLineBiDi->trailingWSStart=0; + break; + default: + break; + } + } + pLineBiDi->pParaBiDi=pParaBiDi; /* mark successful setLine */ + return; +} + +U_CAPI UBiDiLevel U_EXPORT2 +ubidi_getLevelAt(const UBiDi *pBiDi, int32_t charIndex) { + /* return paraLevel if in the trailing WS run, otherwise the real level */ + if(!IS_VALID_PARA_OR_LINE(pBiDi) || charIndex<0 || pBiDi->length<=charIndex) { + return 0; + } else if(pBiDi->direction!=UBIDI_MIXED || charIndex>=pBiDi->trailingWSStart) { + return GET_PARALEVEL(pBiDi, charIndex); + } else { + return pBiDi->levels[charIndex]; + } +} + +U_CAPI const UBiDiLevel * U_EXPORT2 +ubidi_getLevels(UBiDi *pBiDi, UErrorCode *pErrorCode) { + int32_t start, length; + + RETURN_IF_NULL_OR_FAILING_ERRCODE(pErrorCode, NULL); + RETURN_IF_NOT_VALID_PARA_OR_LINE(pBiDi, *pErrorCode, NULL); + if((length=pBiDi->length)<=0) { + *pErrorCode=U_ILLEGAL_ARGUMENT_ERROR; + return NULL; + } + if((start=pBiDi->trailingWSStart)==length) { + /* the current levels array reflects the WS run */ + return pBiDi->levels; + } + + /* + * After the previous if(), we know that the levels array + * has an implicit trailing WS run and therefore does not fully + * reflect itself all the levels. + * This must be a UBiDi object for a line, and + * we need to create a new levels array. + */ + if(getLevelsMemory(pBiDi, length)) { + UBiDiLevel *levels=pBiDi->levelsMemory; + + if(start>0 && levels!=pBiDi->levels) { + uprv_memcpy(levels, pBiDi->levels, start); + } + /* pBiDi->paraLevel is ok even if contextual multiple paragraphs, + since pBidi is a line object */ + uprv_memset(levels+start, pBiDi->paraLevel, length-start); + + /* this new levels array is set for the line and reflects the WS run */ + pBiDi->trailingWSStart=length; + return pBiDi->levels=levels; + } else { + /* out of memory */ + *pErrorCode=U_MEMORY_ALLOCATION_ERROR; + return NULL; + } +} + +U_CAPI void U_EXPORT2 +ubidi_getLogicalRun(const UBiDi *pBiDi, int32_t logicalPosition, + int32_t *pLogicalLimit, UBiDiLevel *pLevel) { + UErrorCode errorCode; + int32_t runCount, visualStart, logicalLimit, logicalFirst, i; + Run iRun; + + errorCode=U_ZERO_ERROR; + RETURN_VOID_IF_BAD_RANGE(logicalPosition, 0, pBiDi->length, errorCode); + /* ubidi_countRuns will check VALID_PARA_OR_LINE */ + runCount=ubidi_countRuns((UBiDi *)pBiDi, &errorCode); + if(U_FAILURE(errorCode)) { + return; + } + /* this is done based on runs rather than on levels since levels have + a special interpretation when UBIDI_REORDER_RUNS_ONLY + */ + visualStart=logicalLimit=0; + iRun=pBiDi->runs[0]; + + for(i=0; iruns[i]; + logicalFirst=GET_INDEX(iRun.logicalStart); + logicalLimit=logicalFirst+iRun.visualLimit-visualStart; + if((logicalPosition>=logicalFirst) && + (logicalPositionreorderingMode==UBIDI_REORDER_RUNS_ONLY) { + *pLevel=(UBiDiLevel)GET_ODD_BIT(iRun.logicalStart); + } + else if(pBiDi->direction!=UBIDI_MIXED || logicalPosition>=pBiDi->trailingWSStart) { + *pLevel=GET_PARALEVEL(pBiDi, logicalPosition); + } else { + *pLevel=pBiDi->levels[logicalPosition]; + } + } +} + +/* runs API functions ------------------------------------------------------- */ + +U_CAPI int32_t U_EXPORT2 +ubidi_countRuns(UBiDi *pBiDi, UErrorCode *pErrorCode) { + RETURN_IF_NULL_OR_FAILING_ERRCODE(pErrorCode, -1); + RETURN_IF_NOT_VALID_PARA_OR_LINE(pBiDi, *pErrorCode, -1); + ubidi_getRuns(pBiDi, pErrorCode); + if(U_FAILURE(*pErrorCode)) { + return -1; + } + return pBiDi->runCount; +} + +U_CAPI UBiDiDirection U_EXPORT2 +ubidi_getVisualRun(UBiDi *pBiDi, int32_t runIndex, + int32_t *pLogicalStart, int32_t *pLength) +{ + int32_t start; + UErrorCode errorCode = U_ZERO_ERROR; + RETURN_IF_NOT_VALID_PARA_OR_LINE(pBiDi, errorCode, UBIDI_LTR); + ubidi_getRuns(pBiDi, &errorCode); + if(U_FAILURE(errorCode)) { + return UBIDI_LTR; + } + RETURN_IF_BAD_RANGE(runIndex, 0, pBiDi->runCount, errorCode, UBIDI_LTR); + + start=pBiDi->runs[runIndex].logicalStart; + if(pLogicalStart!=NULL) { + *pLogicalStart=GET_INDEX(start); + } + if(pLength!=NULL) { + if(runIndex>0) { + *pLength=pBiDi->runs[runIndex].visualLimit- + pBiDi->runs[runIndex-1].visualLimit; + } else { + *pLength=pBiDi->runs[0].visualLimit; + } + } + return (UBiDiDirection)GET_ODD_BIT(start); +} + +/* in trivial cases there is only one trivial run; called by ubidi_getRuns() */ +static void +getSingleRun(UBiDi *pBiDi, UBiDiLevel level) { + /* simple, single-run case */ + pBiDi->runs=pBiDi->simpleRuns; + pBiDi->runCount=1; + + /* fill and reorder the single run */ + pBiDi->runs[0].logicalStart=MAKE_INDEX_ODD_PAIR(0, level); + pBiDi->runs[0].visualLimit=pBiDi->length; + pBiDi->runs[0].insertRemove=0; +} + +/* reorder the runs array (L2) ---------------------------------------------- */ + +/* + * Reorder the same-level runs in the runs array. + * Here, runCount>1 and maxLevel>=minLevel>=paraLevel. + * All the visualStart fields=logical start before reordering. + * The "odd" bits are not set yet. + * + * Reordering with this data structure lends itself to some handy shortcuts: + * + * Since each run is moved but not modified, and since at the initial maxLevel + * each sequence of same-level runs consists of only one run each, we + * don't need to do anything there and can predecrement maxLevel. + * In many simple cases, the reordering is thus done entirely in the + * index mapping. + * Also, reordering occurs only down to the lowest odd level that occurs, + * which is minLevel|1. However, if the lowest level itself is odd, then + * in the last reordering the sequence of the runs at this level or higher + * will be all runs, and we don't need the elaborate loop to search for them. + * This is covered by ++minLevel instead of minLevel|=1 followed + * by an extra reorder-all after the reorder-some loop. + * About a trailing WS run: + * Such a run would need special treatment because its level is not + * reflected in levels[] if this is not a paragraph object. + * Instead, all characters from trailingWSStart on are implicitly at + * paraLevel. + * However, for all maxLevel>paraLevel, this run will never be reordered + * and does not need to be taken into account. maxLevel==paraLevel is only reordered + * if minLevel==paraLevel is odd, which is done in the extra segment. + * This means that for the main reordering loop we don't need to consider + * this run and can --runCount. If it is later part of the all-runs + * reordering, then runCount is adjusted accordingly. + */ +static void +reorderLine(UBiDi *pBiDi, UBiDiLevel minLevel, UBiDiLevel maxLevel) { + Run *runs, tempRun; + UBiDiLevel *levels; + int32_t firstRun, endRun, limitRun, runCount; + + /* nothing to do? */ + if(maxLevel<=(minLevel|1)) { + return; + } + + /* + * Reorder only down to the lowest odd level + * and reorder at an odd minLevel in a separate, simpler loop. + * See comments above for why minLevel is always incremented. + */ + ++minLevel; + + runs=pBiDi->runs; + levels=pBiDi->levels; + runCount=pBiDi->runCount; + + /* do not include the WS run at paraLevel<=old minLevel except in the simple loop */ + if(pBiDi->trailingWSStartlength) { + --runCount; + } + + while(--maxLevel>=minLevel) { + firstRun=0; + + /* loop for all sequences of runs */ + for(;;) { + /* look for a sequence of runs that are all at >=maxLevel */ + /* look for the first run of such a sequence */ + while(firstRun=runCount) { + break; /* no more such runs */ + } + + /* look for the limit run of such a sequence (the run behind it) */ + for(limitRun=firstRun; ++limitRun=maxLevel;) {} + + /* Swap the entire sequence of runs from firstRun to limitRun-1. */ + endRun=limitRun-1; + while(firstRuntrailingWSStart==pBiDi->length) { + --runCount; + } + + /* Swap the entire sequence of all runs. (endRun==runCount) */ + while(firstRunruns; + int32_t runCount=pBiDi->runCount, visualStart=0, i, length, logicalStart; + + for(i=0; i=logicalStart) && (logicalIndex<(logicalStart+length))) { + return i; + } + visualStart+=length; + } + /* we should never get here */ + U_ASSERT(FALSE); + *pErrorCode = U_INVALID_STATE_ERROR; + return 0; +} + +/* + * Compute the runs array from the levels array. + * After ubidi_getRuns() returns TRUE, runCount is guaranteed to be >0 + * and the runs are reordered. + * Odd-level runs have visualStart on their visual right edge and + * they progress visually to the left. + * If option UBIDI_OPTION_INSERT_MARKS is set, insertRemove will contain the + * sum of appropriate LRM/RLM_BEFORE/AFTER flags. + * If option UBIDI_OPTION_REMOVE_CONTROLS is set, insertRemove will contain the + * negative number of BiDi control characters within this run. + */ +U_CFUNC UBool +ubidi_getRuns(UBiDi *pBiDi, UErrorCode *pErrorCode) { + /* + * This method returns immediately if the runs are already set. This + * includes the case of length==0 (handled in setPara).. + */ + if (pBiDi->runCount>=0) { + return TRUE; + } + + if(pBiDi->direction!=UBIDI_MIXED) { + /* simple, single-run case - this covers length==0 */ + /* pBiDi->paraLevel is ok even for contextual multiple paragraphs */ + getSingleRun(pBiDi, pBiDi->paraLevel); + } else /* UBIDI_MIXED, length>0 */ { + /* mixed directionality */ + int32_t length=pBiDi->length, limit; + UBiDiLevel *levels=pBiDi->levels; + int32_t i, runCount; + UBiDiLevel level=UBIDI_DEFAULT_LTR; /* initialize with no valid level */ + /* + * If there are WS characters at the end of the line + * and the run preceding them has a level different from + * paraLevel, then they will form their own run at paraLevel (L1). + * Count them separately. + * We need some special treatment for this in order to not + * modify the levels array which a line UBiDi object shares + * with its paragraph parent and its other line siblings. + * In other words, for the trailing WS, it may be + * levels[]!=paraLevel but we have to treat it like it were so. + */ + limit=pBiDi->trailingWSStart; + /* count the runs, there is at least one non-WS run, and limit>0 */ + runCount=0; + for(i=0; i1 || limit1 */ + if(getRunsMemory(pBiDi, runCount)) { + runs=pBiDi->runsMemory; + } else { + return FALSE; + } + + /* set the runs */ + /* FOOD FOR THOUGHT: this could be optimized, e.g.: + * 464->444, 484->444, 575->555, 595->555 + * However, that would take longer. Check also how it would + * interact with BiDi control removal and inserting Marks. + */ + runIndex=0; + + /* search for the run limits and initialize visualLimit values with the run lengths */ + i=0; + do { + /* prepare this run */ + start=i; + level=levels[i]; + if(levelmaxLevel) { + maxLevel=level; + } + + /* look for the run limit */ + while(++iparaLevel is ok even + if contextual multiple paragraphs. */ + if(pBiDi->paraLevelparaLevel; + } + } + + /* set the object fields */ + pBiDi->runs=runs; + pBiDi->runCount=runCount; + + reorderLine(pBiDi, minLevel, maxLevel); + + /* now add the direction flags and adjust the visualLimit's to be just that */ + /* this loop will also handle the trailing WS run */ + limit=0; + for(i=0; iparaLevel is ok even if + contextual multiple paragraphs. */ + if(runIndexparaLevel & 1) != 0)? 0 : runIndex; + + ADD_ODD_BIT_FROM_LEVEL(runs[trailingRun].logicalStart, pBiDi->paraLevel); + } + } + } + + /* handle insert LRM/RLM BEFORE/AFTER run */ + if(pBiDi->insertPoints.size>0) { + Point *point, *start=pBiDi->insertPoints.points, + *limit=start+pBiDi->insertPoints.size; + int32_t runIndex; + for(point=start; pointpos, pErrorCode); + pBiDi->runs[runIndex].insertRemove|=point->flag; + } + } + + /* handle remove BiDi control characters */ + if(pBiDi->controlCount>0) { + int32_t runIndex; + const UChar *start=pBiDi->text, *limit=start+pBiDi->length, *pu; + for(pu=start; puruns[runIndex].insertRemove--; + } + } + } + + return TRUE; +} + +static UBool +prepareReorder(const UBiDiLevel *levels, int32_t length, + int32_t *indexMap, + UBiDiLevel *pMinLevel, UBiDiLevel *pMaxLevel) { + int32_t start; + UBiDiLevel level, minLevel, maxLevel; + + if(levels==NULL || length<=0) { + return FALSE; + } + + /* determine minLevel and maxLevel */ + minLevel=UBIDI_MAX_EXPLICIT_LEVEL+1; + maxLevel=0; + for(start=length; start>0;) { + level=levels[--start]; + if(level>UBIDI_MAX_EXPLICIT_LEVEL+1) { + return FALSE; + } + if(levelmaxLevel) { + maxLevel=level; + } + } + *pMinLevel=minLevel; + *pMaxLevel=maxLevel; + + /* initialize the index map */ + for(start=length; start>0;) { + --start; + indexMap[start]=start; + } + + return TRUE; +} + +/* reorder a line based on a levels array (L2) ------------------------------ */ + +U_CAPI void U_EXPORT2 +ubidi_reorderLogical(const UBiDiLevel *levels, int32_t length, int32_t *indexMap) { + int32_t start, limit, sumOfSosEos; + UBiDiLevel minLevel = 0, maxLevel = 0; + + if(indexMap==NULL || !prepareReorder(levels, length, indexMap, &minLevel, &maxLevel)) { + return; + } + + /* nothing to do? */ + if(minLevel==maxLevel && (minLevel&1)==0) { + return; + } + + /* reorder only down to the lowest odd level */ + minLevel|=1; + + /* loop maxLevel..minLevel */ + do { + start=0; + + /* loop for all sequences of levels to reorder at the current maxLevel */ + for(;;) { + /* look for a sequence of levels that are all at >=maxLevel */ + /* look for the first index of such a sequence */ + while(start=length) { + break; /* no more such sequences */ + } + + /* look for the limit of such a sequence (the index behind it) */ + for(limit=start; ++limit=maxLevel;) {} + + /* + * sos=start of sequence, eos=end of sequence + * + * The closed (inclusive) interval from sos to eos includes all the logical + * and visual indexes within this sequence. They are logically and + * visually contiguous and in the same range. + * + * For each run, the new visual index=sos+eos-old visual index; + * we pre-add sos+eos into sumOfSosEos -> + * new visual index=sumOfSosEos-old visual index; + */ + sumOfSosEos=start+limit-1; + + /* reorder each index in the sequence */ + do { + indexMap[start]=sumOfSosEos-indexMap[start]; + } while(++start=minLevel); +} + +U_CAPI void U_EXPORT2 +ubidi_reorderVisual(const UBiDiLevel *levels, int32_t length, int32_t *indexMap) { + int32_t start, end, limit, temp; + UBiDiLevel minLevel = 0, maxLevel = 0; + + if(indexMap==NULL || !prepareReorder(levels, length, indexMap, &minLevel, &maxLevel)) { + return; + } + + /* nothing to do? */ + if(minLevel==maxLevel && (minLevel&1)==0) { + return; + } + + /* reorder only down to the lowest odd level */ + minLevel|=1; + + /* loop maxLevel..minLevel */ + do { + start=0; + + /* loop for all sequences of levels to reorder at the current maxLevel */ + for(;;) { + /* look for a sequence of levels that are all at >=maxLevel */ + /* look for the first index of such a sequence */ + while(start=length) { + break; /* no more such runs */ + } + + /* look for the limit of such a sequence (the index behind it) */ + for(limit=start; ++limit=maxLevel;) {} + + /* + * Swap the entire interval of indexes from start to limit-1. + * We don't need to swap the levels for the purpose of this + * algorithm: the sequence of levels that we look at does not + * move anyway. + */ + end=limit-1; + while(start=minLevel); +} + +/* API functions for logical<->visual mapping ------------------------------- */ + +U_CAPI int32_t U_EXPORT2 +ubidi_getVisualIndex(UBiDi *pBiDi, int32_t logicalIndex, UErrorCode *pErrorCode) { + int32_t visualIndex=UBIDI_MAP_NOWHERE; + RETURN_IF_NULL_OR_FAILING_ERRCODE(pErrorCode, -1); + RETURN_IF_NOT_VALID_PARA_OR_LINE(pBiDi, *pErrorCode, -1); + RETURN_IF_BAD_RANGE(logicalIndex, 0, pBiDi->length, *pErrorCode, -1); + + /* we can do the trivial cases without the runs array */ + switch(pBiDi->direction) { + case UBIDI_LTR: + visualIndex=logicalIndex; + break; + case UBIDI_RTL: + visualIndex=pBiDi->length-logicalIndex-1; + break; + default: + if(!ubidi_getRuns(pBiDi, pErrorCode)) { + *pErrorCode=U_MEMORY_ALLOCATION_ERROR; + return -1; + } else { + Run *runs=pBiDi->runs; + int32_t i, visualStart=0, offset, length; + + /* linear search for the run, search on the visual runs */ + for(i=0; irunCount; ++i) { + length=runs[i].visualLimit-visualStart; + offset=logicalIndex-GET_INDEX(runs[i].logicalStart); + if(offset>=0 && offset=pBiDi->runCount) { + return UBIDI_MAP_NOWHERE; + } + } + } + + if(pBiDi->insertPoints.size>0) { + /* add the number of added marks until the calculated visual index */ + Run *runs=pBiDi->runs; + int32_t i, length, insertRemove; + int32_t visualStart=0, markFound=0; + for(i=0; ; i++, visualStart+=length) { + length=runs[i].visualLimit-visualStart; + insertRemove=runs[i].insertRemove; + if(insertRemove & (LRM_BEFORE|RLM_BEFORE)) { + markFound++; + } + /* is it the run containing the visual index? */ + if(visualIndexcontrolCount>0) { + /* subtract the number of controls until the calculated visual index */ + Run *runs=pBiDi->runs; + int32_t i, j, start, limit, length, insertRemove; + int32_t visualStart=0, controlFound=0; + UChar uchar=pBiDi->text[logicalIndex]; + /* is the logical index pointing to a control ? */ + if(IS_BIDI_CONTROL_CHAR(uchar)) { + return UBIDI_MAP_NOWHERE; + } + /* loop on runs */ + for(i=0; ; i++, visualStart+=length) { + length=runs[i].visualLimit-visualStart; + insertRemove=runs[i].insertRemove; + /* calculated visual index is beyond this run? */ + if(visualIndex>=runs[i].visualLimit) { + controlFound-=insertRemove; + continue; + } + /* calculated visual index must be within current run */ + if(insertRemove==0) { + return visualIndex-controlFound; + } + if(IS_EVEN_RUN(runs[i].logicalStart)) { + /* LTR: check from run start to logical index */ + start=runs[i].logicalStart; + limit=logicalIndex; + } else { + /* RTL: check from logical index to run end */ + start=logicalIndex+1; + limit=GET_INDEX(runs[i].logicalStart)+length; + } + for(j=start; jtext[j]; + if(IS_BIDI_CONTROL_CHAR(uchar)) { + controlFound++; + } + } + return visualIndex-controlFound; + } + } + + return visualIndex; +} + +U_CAPI int32_t U_EXPORT2 +ubidi_getLogicalIndex(UBiDi *pBiDi, int32_t visualIndex, UErrorCode *pErrorCode) { + Run *runs; + int32_t i, runCount, start; + RETURN_IF_NULL_OR_FAILING_ERRCODE(pErrorCode, -1); + RETURN_IF_NOT_VALID_PARA_OR_LINE(pBiDi, *pErrorCode, -1); + RETURN_IF_BAD_RANGE(visualIndex, 0, pBiDi->resultLength, *pErrorCode, -1); + /* we can do the trivial cases without the runs array */ + if(pBiDi->insertPoints.size==0 && pBiDi->controlCount==0) { + if(pBiDi->direction==UBIDI_LTR) { + return visualIndex; + } + else if(pBiDi->direction==UBIDI_RTL) { + return pBiDi->length-visualIndex-1; + } + } + if(!ubidi_getRuns(pBiDi, pErrorCode)) { + *pErrorCode=U_MEMORY_ALLOCATION_ERROR; + return -1; + } + + runs=pBiDi->runs; + runCount=pBiDi->runCount; + if(pBiDi->insertPoints.size>0) { + /* handle inserted LRM/RLM */ + int32_t markFound=0, insertRemove; + int32_t visualStart=0, length; + runs=pBiDi->runs; + /* subtract number of marks until visual index */ + for(i=0; ; i++, visualStart+=length) { + length=runs[i].visualLimit-visualStart; + insertRemove=runs[i].insertRemove; + if(insertRemove&(LRM_BEFORE|RLM_BEFORE)) { + if(visualIndex<=(visualStart+markFound)) { + return UBIDI_MAP_NOWHERE; + } + markFound++; + } + /* is adjusted visual index within this run? */ + if(visualIndex<(runs[i].visualLimit+markFound)) { + visualIndex-=markFound; + break; + } + if(insertRemove&(LRM_AFTER|RLM_AFTER)) { + if(visualIndex==(visualStart+length+markFound)) { + return UBIDI_MAP_NOWHERE; + } + markFound++; + } + } + } + else if(pBiDi->controlCount>0) { + /* handle removed BiDi control characters */ + int32_t controlFound=0, insertRemove, length; + int32_t logicalStart, logicalEnd, visualStart=0, j, k; + UChar uchar; + UBool evenRun; + /* add number of controls until visual index */ + for(i=0; ; i++, visualStart+=length) { + length=runs[i].visualLimit-visualStart; + insertRemove=runs[i].insertRemove; + /* is adjusted visual index beyond current run? */ + if(visualIndex>=(runs[i].visualLimit-controlFound+insertRemove)) { + controlFound-=insertRemove; + continue; + } + /* adjusted visual index is within current run */ + if(insertRemove==0) { + visualIndex+=controlFound; + break; + } + /* count non-control chars until visualIndex */ + logicalStart=runs[i].logicalStart; + evenRun=IS_EVEN_RUN(logicalStart); + REMOVE_ODD_BIT(logicalStart); + logicalEnd=logicalStart+length-1; + for(j=0; jtext[k]; + if(IS_BIDI_CONTROL_CHAR(uchar)) { + controlFound++; + } + if((visualIndex+controlFound)==(visualStart+j)) { + break; + } + } + visualIndex+=controlFound; + break; + } + } + /* handle all cases */ + if(runCount<=10) { + /* linear search for the run */ + for(i=0; visualIndex>=runs[i].visualLimit; ++i) {} + } else { + /* binary search for the run */ + int32_t begin=0, limit=runCount; + + /* the middle if() is guaranteed to find the run, we don't need a loop limit */ + for(;;) { + i=(begin+limit)/2; + if(visualIndex>=runs[i].visualLimit) { + begin=i+1; + } else if(i==0 || visualIndex>=runs[i-1].visualLimit) { + break; + } else { + limit=i; + } + } + } + + start=runs[i].logicalStart; + if(IS_EVEN_RUN(start)) { + /* LTR */ + /* the offset in runs[i] is visualIndex-runs[i-1].visualLimit */ + if(i>0) { + visualIndex-=runs[i-1].visualLimit; + } + return start+visualIndex; + } else { + /* RTL */ + return GET_INDEX(start)+runs[i].visualLimit-visualIndex-1; + } +} + +U_CAPI void U_EXPORT2 +ubidi_getLogicalMap(UBiDi *pBiDi, int32_t *indexMap, UErrorCode *pErrorCode) { + RETURN_VOID_IF_NULL_OR_FAILING_ERRCODE(pErrorCode); + /* ubidi_countRuns() checks for VALID_PARA_OR_LINE */ + ubidi_countRuns(pBiDi, pErrorCode); + if(U_FAILURE(*pErrorCode)) { + /* no op */ + } else if(indexMap==NULL) { + *pErrorCode=U_ILLEGAL_ARGUMENT_ERROR; + } else { + /* fill a logical-to-visual index map using the runs[] */ + int32_t visualStart, visualLimit, i, j, k; + int32_t logicalStart, logicalLimit; + Run *runs=pBiDi->runs; + if (pBiDi->length<=0) { + return; + } + if (pBiDi->length>pBiDi->resultLength) { + uprv_memset(indexMap, 0xFF, pBiDi->length*sizeof(int32_t)); + } + + visualStart=0; + for(j=0; jrunCount; ++j) { + logicalStart=GET_INDEX(runs[j].logicalStart); + visualLimit=runs[j].visualLimit; + if(IS_EVEN_RUN(runs[j].logicalStart)) { + do { /* LTR */ + indexMap[logicalStart++]=visualStart++; + } while(visualStartinsertPoints.size>0) { + int32_t markFound=0, runCount=pBiDi->runCount; + int32_t length, insertRemove; + visualStart=0; + /* add number of marks found until each index */ + for(i=0; i0) { + logicalStart=GET_INDEX(runs[i].logicalStart); + logicalLimit=logicalStart+length; + for(j=logicalStart; jcontrolCount>0) { + int32_t controlFound=0, runCount=pBiDi->runCount; + int32_t length, insertRemove; + UBool evenRun; + UChar uchar; + visualStart=0; + /* subtract number of controls found until each index */ + for(i=0; itext[k]; + if(IS_BIDI_CONTROL_CHAR(uchar)) { + controlFound++; + indexMap[k]=UBIDI_MAP_NOWHERE; + continue; + } + indexMap[k]-=controlFound; + } + } + } + } +} + +U_CAPI void U_EXPORT2 +ubidi_getVisualMap(UBiDi *pBiDi, int32_t *indexMap, UErrorCode *pErrorCode) { + RETURN_VOID_IF_NULL_OR_FAILING_ERRCODE(pErrorCode); + if(indexMap==NULL) { + *pErrorCode=U_ILLEGAL_ARGUMENT_ERROR; + return; + } + /* ubidi_countRuns() checks for VALID_PARA_OR_LINE */ + ubidi_countRuns(pBiDi, pErrorCode); + if(U_SUCCESS(*pErrorCode)) { + /* fill a visual-to-logical index map using the runs[] */ + Run *runs=pBiDi->runs, *runsLimit=runs+pBiDi->runCount; + int32_t logicalStart, visualStart, visualLimit, *pi=indexMap; + + if (pBiDi->resultLength<=0) { + return; + } + visualStart=0; + for(; runslogicalStart; + visualLimit=runs->visualLimit; + if(IS_EVEN_RUN(logicalStart)) { + do { /* LTR */ + *pi++ = logicalStart++; + } while(++visualStartinsertPoints.size>0) { + int32_t markFound=0, runCount=pBiDi->runCount; + int32_t insertRemove, i, j, k; + runs=pBiDi->runs; + /* count all inserted marks */ + for(i=0; iresultLength; + for(i=runCount-1; i>=0 && markFound>0; i--) { + insertRemove=runs[i].insertRemove; + if(insertRemove&(LRM_AFTER|RLM_AFTER)) { + indexMap[--k]= UBIDI_MAP_NOWHERE; + markFound--; + } + visualStart= i>0 ? runs[i-1].visualLimit : 0; + for(j=runs[i].visualLimit-1; j>=visualStart && markFound>0; j--) { + indexMap[--k]=indexMap[j]; + } + if(insertRemove&(LRM_BEFORE|RLM_BEFORE)) { + indexMap[--k]= UBIDI_MAP_NOWHERE; + markFound--; + } + } + } + else if(pBiDi->controlCount>0) { + int32_t runCount=pBiDi->runCount, logicalEnd; + int32_t insertRemove, length, i, j, k, m; + UChar uchar; + UBool evenRun; + runs=pBiDi->runs; + visualStart=0; + /* move forward indexes by number of preceding controls */ + k=0; + for(i=0; itext[m]; + if(!IS_BIDI_CONTROL_CHAR(uchar)) { + indexMap[k++]=m; + } + } + } + } + } +} + +U_CAPI void U_EXPORT2 +ubidi_invertMap(const int32_t *srcMap, int32_t *destMap, int32_t length) { + if(srcMap!=NULL && destMap!=NULL && length>0) { + const int32_t *pi; + int32_t destLength=-1, count=0; + /* find highest value and count positive indexes in srcMap */ + pi=srcMap+length; + while(pi>srcMap) { + if(*--pi>destLength) { + destLength=*pi; + } + if(*pi>=0) { + count++; + } + } + destLength++; /* add 1 for origin 0 */ + if(count0) { + if(*--pi>=0) { + destMap[*pi]=--length; + } else { + --length; + } + } + } +} diff --git a/Build/source/libs/icu/icu-src/source/common/ubiditransform.c b/Build/source/libs/icu/icu-src/source/common/ubiditransform.c deleted file mode 100644 index 5f83a2b5a62..00000000000 --- a/Build/source/libs/icu/icu-src/source/common/ubiditransform.c +++ /dev/null @@ -1,528 +0,0 @@ -/* -****************************************************************************** -* -* Copyright (C) 2016 and later: Unicode, Inc. and others. -* License & terms of use: http://www.unicode.org/copyright.html -* -****************************************************************************** -* file name: ubiditransform.c -* encoding: US-ASCII -* tab size: 8 (not used) -* indentation:4 -* -* created on: 2016jul24 -* created by: Lina Kemmel -* -*/ - -#include "cmemory.h" -#include "unicode/ubidi.h" -#include "unicode/ustring.h" -#include "unicode/ushape.h" -#include "unicode/utf16.h" -#include "ustr_imp.h" -#include "unicode/ubiditransform.h" - -/* Some convenience defines */ -#define LTR UBIDI_LTR -#define RTL UBIDI_RTL -#define LOGICAL UBIDI_LOGICAL -#define VISUAL UBIDI_VISUAL -#define SHAPE_LOGICAL U_SHAPE_TEXT_DIRECTION_LOGICAL -#define SHAPE_VISUAL U_SHAPE_TEXT_DIRECTION_VISUAL_LTR - -#define CHECK_LEN(STR, LEN, ERROR) { \ - if (LEN == 0) return 0; \ - if (LEN < -1) { *(ERROR) = U_ILLEGAL_ARGUMENT_ERROR; return 0; } \ - if (LEN == -1) LEN = u_strlen(STR); \ - } - -#define MAX_ACTIONS 7 - -/** - * Typedef for a pointer to a function, which performs some operation (such as - * reordering, setting "inverse" mode, character mirroring, etc.). Return value - * indicates whether the text was changed in the course of this operation or - * not. - */ -typedef UBool (*UBiDiAction)(UBiDiTransform *, UErrorCode *); - -/** - * Structure that holds a predefined reordering scheme, including the following - * information: - *

        - *
      • an input base direction,
      • - *
      • an input order,
      • - *
      • an output base direction,
      • - *
      • an output order,
      • - *
      • a digit shaping direction,
      • - *
      • a letter shaping direction,
      • - *
      • a base direction that should be applied when the reordering engine is - * invoked (which can not always be derived from the caller-defined - * options),
      • - *
      • an array of pointers to functions that accomplish the bidi layout - * transformation.
      • - *
      - */ -typedef struct { - UBiDiLevel inLevel; /* input level */ - UBiDiOrder inOrder; /* input order */ - UBiDiLevel outLevel; /* output level */ - UBiDiOrder outOrder; /* output order */ - uint32_t digitsDir; /* digit shaping direction */ - uint32_t lettersDir; /* letter shaping direction */ - UBiDiLevel baseLevel; /* paragraph level to be used with setPara */ - const UBiDiAction actions[MAX_ACTIONS]; /* array of pointers to functions carrying out the transformation */ -} ReorderingScheme; - -struct UBiDiTransform { - UBiDi *pBidi; /* pointer to a UBiDi object */ - const ReorderingScheme *pActiveScheme; /* effective reordering scheme */ - UChar *src; /* input text */ - UChar *dest; /* output text */ - uint32_t srcLength; /* input text length - not really needed as we are zero-terminated and can u_strlen */ - uint32_t srcSize; /* input text capacity excluding the trailing zero */ - uint32_t destSize; /* output text capacity */ - uint32_t *pDestLength; /* number of UChars written to dest */ - uint32_t reorderingOptions; /* reordering options - currently only suppot DO_MIRRORING */ - uint32_t digits; /* digit option for ArabicShaping */ - uint32_t letters; /* letter option for ArabicShaping */ -}; - -U_DRAFT UBiDiTransform* U_EXPORT2 -ubiditransform_open(UErrorCode *pErrorCode) -{ - UBiDiTransform *pBiDiTransform = NULL; - if (U_SUCCESS(*pErrorCode)) { - pBiDiTransform = (UBiDiTransform*) uprv_calloc(1, sizeof(UBiDiTransform)); - if (pBiDiTransform == NULL) { - *pErrorCode = U_MEMORY_ALLOCATION_ERROR; - } - } - return pBiDiTransform; -} - -U_DRAFT void U_EXPORT2 -ubiditransform_close(UBiDiTransform *pBiDiTransform) -{ - if (pBiDiTransform != NULL) { - if (pBiDiTransform->pBidi != NULL) { - ubidi_close(pBiDiTransform->pBidi); - } - if (pBiDiTransform->src != NULL) { - uprv_free(pBiDiTransform->src); - } - uprv_free(pBiDiTransform); - } -} - -/** - * Performs Bidi resolution of text. - * - * @param pTransform Pointer to the UBiDiTransform structure. - * @param pErrorCode Pointer to the error code value. - * - * @return Whether or not this function modifies the text. Besides the return - * value, the caller should also check U_SUCCESS(*pErrorCode). - */ -static UBool -action_resolve(UBiDiTransform *pTransform, UErrorCode *pErrorCode) -{ - ubidi_setPara(pTransform->pBidi, pTransform->src, pTransform->srcLength, - pTransform->pActiveScheme->baseLevel, NULL, pErrorCode); - return FALSE; -} - -/** - * Performs basic reordering of text (Logical -> Visual LTR). - * - * @param pTransform Pointer to the UBiDiTransform structure. - * @param pErrorCode Pointer to the error code value. - * - * @return Whether or not this function modifies the text. Besides the return - * value, the caller should also check U_SUCCESS(*pErrorCode). - */ -static UBool -action_reorder(UBiDiTransform *pTransform, UErrorCode *pErrorCode) -{ - ubidi_writeReordered(pTransform->pBidi, pTransform->dest, pTransform->destSize, - pTransform->reorderingOptions, pErrorCode); - - *pTransform->pDestLength = pTransform->srcLength; - pTransform->reorderingOptions = UBIDI_REORDER_DEFAULT; - return TRUE; -} - -/** - * Sets "inverse" mode on the UBiDi object. - * - * @param pTransform Pointer to the UBiDiTransform structure. - * @param pErrorCode Pointer to the error code value. - * - * @return Whether or not this function modifies the text. Besides the return - * value, the caller should also check U_SUCCESS(*pErrorCode). - */ -static UBool -action_setInverse(UBiDiTransform *pTransform, UErrorCode *pErrorCode) -{ - ubidi_setInverse(pTransform->pBidi, TRUE); - ubidi_setReorderingMode(pTransform->pBidi, UBIDI_REORDER_INVERSE_LIKE_DIRECT); - return FALSE; -} - -/** - * Sets "runs only" reordering mode indicating a Logical LTR <-> Logical RTL - * transformation. - * - * @param pTransform Pointer to the UBiDiTransform structure. - * @param pErrorCode Pointer to the error code value. - * - * @return Whether or not this function modifies the text. Besides the return - * value, the caller should also check U_SUCCESS(*pErrorCode). - */ -static UBool -action_setRunsOnly(UBiDiTransform *pTransform, UErrorCode *pErrorCode) -{ - ubidi_setReorderingMode(pTransform->pBidi, UBIDI_REORDER_RUNS_ONLY); - return FALSE; -} - -/** - * Performs string reverse. - * - * @param pTransform Pointer to the UBiDiTransform structure. - * @param pErrorCode Pointer to the error code value. - * - * @return Whether or not this function modifies the text. Besides the return - * value, the caller should also check U_SUCCESS(*pErrorCode). - */ -static UBool -action_reverse(UBiDiTransform *pTransform, UErrorCode *pErrorCode) -{ - ubidi_writeReverse(pTransform->src, pTransform->srcLength, - pTransform->dest, pTransform->destSize, - UBIDI_REORDER_DEFAULT, pErrorCode); - *pTransform->pDestLength = pTransform->srcLength; - return TRUE; -} - -/** - * Applies a new value to the text that serves as input at the current - * processing step. This value is identical to the original one when we begin - * the processing, but usually changes as the transformation progresses. - * - * @param pTransform A pointer to the UBiDiTransform structure. - * @param newSrc A pointer whose value is to be used as input text. - * @param newLength A length of the new text in UChars. - * @param newSize A new source capacity in UChars. - * @param pErrorCode Pointer to the error code value. - */ -static void -updateSrc(UBiDiTransform *pTransform, const UChar *newSrc, uint32_t newLength, - uint32_t newSize, UErrorCode *pErrorCode) -{ - if (newSize < newLength) { - *pErrorCode = U_BUFFER_OVERFLOW_ERROR; - return; - } - if (newSize > pTransform->srcSize) { - newSize += 50; // allocate slightly more than needed right now - if (pTransform->src != NULL) { - uprv_free(pTransform->src); - pTransform->src = NULL; - } - pTransform->src = (UChar *)uprv_malloc(newSize * sizeof(UChar)); - if (pTransform->src == NULL) { - *pErrorCode = U_MEMORY_ALLOCATION_ERROR; - //pTransform->srcLength = pTransform->srcSize = 0; - return; - } - pTransform->srcSize = newSize; - } - u_strncpy(pTransform->src, newSrc, newLength); - pTransform->srcLength = u_terminateUChars(pTransform->src, - pTransform->srcSize, newLength, pErrorCode); -} - -/** - * Calls a lower level shaping function. - * - * @param pTransform Pointer to the UBiDiTransform structure. - * @param options Shaping options. - * @param pErrorCode Pointer to the error code value. - */ -static void -doShape(UBiDiTransform *pTransform, uint32_t options, UErrorCode *pErrorCode) -{ - *pTransform->pDestLength = u_shapeArabic(pTransform->src, - pTransform->srcLength, pTransform->dest, pTransform->destSize, - options, pErrorCode); -} - -/** - * Performs digit and letter shaping. - * - * @param pTransform Pointer to the UBiDiTransform structure. - * @param pErrorCode Pointer to the error code value. - * - * @return Whether or not this function modifies the text. Besides the return - * value, the caller should also check U_SUCCESS(*pErrorCode). - */ -static UBool -action_shapeArabic(UBiDiTransform *pTransform, UErrorCode *pErrorCode) -{ - if ((pTransform->letters | pTransform->digits) == 0) { - return FALSE; - } - if (pTransform->pActiveScheme->lettersDir == pTransform->pActiveScheme->digitsDir) { - doShape(pTransform, pTransform->letters | pTransform->digits | pTransform->pActiveScheme->lettersDir, - pErrorCode); - } else { - doShape(pTransform, pTransform->digits | pTransform->pActiveScheme->digitsDir, pErrorCode); - if (U_SUCCESS(*pErrorCode)) { - updateSrc(pTransform, pTransform->dest, *pTransform->pDestLength, - *pTransform->pDestLength, pErrorCode); - doShape(pTransform, pTransform->letters | pTransform->pActiveScheme->lettersDir, - pErrorCode); - } - } - return TRUE; -} - -/** - * Performs character mirroring. - * - * @param pTransform Pointer to the UBiDiTransform structure. - * @param pErrorCode Pointer to the error code value. - * - * @return Whether or not this function modifies the text. Besides the return - * value, the caller should also check U_SUCCESS(*pErrorCode). - */ -static UBool -action_mirror(UBiDiTransform *pTransform, UErrorCode *pErrorCode) -{ - UChar32 c; - uint32_t i = 0, j = 0; - if (0 == (pTransform->reorderingOptions & UBIDI_DO_MIRRORING)) { - return FALSE; - } - if (pTransform->destSize < pTransform->srcLength) { - *pErrorCode = U_BUFFER_OVERFLOW_ERROR; - return FALSE; - } - do { - UBool isOdd = ubidi_getLevelAt(pTransform->pBidi, i) & 1; - U16_NEXT(pTransform->src, i, pTransform->srcLength, c); - U16_APPEND_UNSAFE(pTransform->dest, j, isOdd ? u_charMirror(c) : c); - } while (i < pTransform->srcLength); - - *pTransform->pDestLength = pTransform->srcLength; - pTransform->reorderingOptions = UBIDI_REORDER_DEFAULT; - return TRUE; -} - -/** - * All possible reordering schemes. - * - */ -static const ReorderingScheme Schemes[] = -{ - /* 0: Logical LTR => Visual LTR */ - {LTR, LOGICAL, LTR, VISUAL, SHAPE_LOGICAL, SHAPE_LOGICAL, LTR, - {action_shapeArabic, action_resolve, action_reorder, NULL}}, - /* 1: Logical RTL => Visual LTR */ - {RTL, LOGICAL, LTR, VISUAL, SHAPE_LOGICAL, SHAPE_VISUAL, RTL, - {action_resolve, action_reorder, action_shapeArabic, NULL}}, - /* 2: Logical LTR => Visual RTL */ - {LTR, LOGICAL, RTL, VISUAL, SHAPE_LOGICAL, SHAPE_LOGICAL, LTR, - {action_shapeArabic, action_resolve, action_reorder, action_reverse, NULL}}, - /* 3: Logical RTL => Visual RTL */ - {RTL, LOGICAL, RTL, VISUAL, SHAPE_LOGICAL, SHAPE_VISUAL, RTL, - {action_resolve, action_reorder, action_shapeArabic, action_reverse, NULL}}, - /* 4: Visual LTR => Logical RTL */ - {LTR, VISUAL, RTL, LOGICAL, SHAPE_LOGICAL, SHAPE_VISUAL, RTL, - {action_shapeArabic, action_setInverse, action_resolve, action_reorder, NULL}}, - /* 5: Visual RTL => Logical RTL */ - {RTL, VISUAL, RTL, LOGICAL, SHAPE_LOGICAL, SHAPE_VISUAL, RTL, - {action_reverse, action_shapeArabic, action_setInverse, action_resolve, action_reorder, NULL}}, - /* 6: Visual LTR => Logical LTR */ - {LTR, VISUAL, LTR, LOGICAL, SHAPE_LOGICAL, SHAPE_LOGICAL, LTR, - {action_setInverse, action_resolve, action_reorder, action_shapeArabic, NULL}}, - /* 7: Visual RTL => Logical LTR */ - {RTL, VISUAL, LTR, LOGICAL, SHAPE_LOGICAL, SHAPE_LOGICAL, LTR, - {action_reverse, action_setInverse, action_resolve, action_reorder, action_shapeArabic, NULL}}, - /* 8: Logical LTR => Logical RTL */ - {LTR, LOGICAL, RTL, LOGICAL, SHAPE_LOGICAL, SHAPE_LOGICAL, LTR, - {action_shapeArabic, action_resolve, action_mirror, action_setRunsOnly, action_resolve, action_reorder, NULL}}, - /* 9: Logical RTL => Logical LTR */ - {RTL, LOGICAL, LTR, LOGICAL, SHAPE_LOGICAL, SHAPE_LOGICAL, RTL, - {action_resolve, action_mirror, action_setRunsOnly, action_resolve, action_reorder, action_shapeArabic, NULL}}, - /* 10: Visual LTR => Visual RTL */ - {LTR, VISUAL, RTL, VISUAL, SHAPE_LOGICAL, SHAPE_VISUAL, LTR, - {action_shapeArabic, action_setInverse, action_resolve, action_mirror, action_reverse, NULL}}, - /* 11: Visual RTL => Visual LTR */ - {RTL, VISUAL, LTR, VISUAL, SHAPE_LOGICAL, SHAPE_VISUAL, LTR, - {action_reverse, action_shapeArabic, action_setInverse, action_resolve, action_mirror, NULL}}, - /* 12: Logical LTR => Logical LTR */ - {LTR, LOGICAL, LTR, LOGICAL, SHAPE_LOGICAL, SHAPE_LOGICAL, LTR, - {action_resolve, action_mirror, action_shapeArabic, NULL}}, - /* 13: Logical RTL => Logical RTL */ - {RTL, LOGICAL, RTL, LOGICAL, SHAPE_VISUAL, SHAPE_LOGICAL, RTL, - {action_resolve, action_mirror, action_shapeArabic, NULL}}, - /* 14: Visual LTR => Visual LTR */ - {LTR, VISUAL, LTR, VISUAL, SHAPE_LOGICAL, SHAPE_VISUAL, LTR, - {action_resolve, action_mirror, action_shapeArabic, NULL}}, - /* 15: Visual RTL => Visual RTL */ - {RTL, VISUAL, RTL, VISUAL, SHAPE_LOGICAL, SHAPE_VISUAL, LTR, - {action_reverse, action_resolve, action_mirror, action_shapeArabic, action_reverse, NULL}} -}; - -static const uint32_t nSchemes = sizeof(Schemes) / sizeof(*Schemes); - -/** - * When the direction option is UBIDI_DEFAULT_LTR or - * UBIDI_DEFAULT_RTL, resolve the base direction according to that - * of the first strong bidi character. - */ -static void -resolveBaseDirection(const UChar *text, uint32_t length, - UBiDiLevel *pInLevel, UBiDiLevel *pOutLevel) -{ - switch (*pInLevel) { - case UBIDI_DEFAULT_LTR: - case UBIDI_DEFAULT_RTL: { - UBiDiLevel level = ubidi_getBaseDirection(text, length); - *pInLevel = level != UBIDI_NEUTRAL ? level - : *pInLevel == UBIDI_DEFAULT_RTL ? RTL : LTR; - break; - } - default: - *pInLevel &= 1; - break; - } - switch (*pOutLevel) { - case UBIDI_DEFAULT_LTR: - case UBIDI_DEFAULT_RTL: - *pOutLevel = *pInLevel; - break; - default: - *pOutLevel &= 1; - break; - } -} - -/** - * Finds a valid ReorderingScheme matching the - * caller-defined scheme. - * - * @return A valid ReorderingScheme object or NULL - */ -static const ReorderingScheme* -findMatchingScheme(UBiDiLevel inLevel, UBiDiLevel outLevel, - UBiDiOrder inOrder, UBiDiOrder outOrder) -{ - uint32_t i; - for (i = 0; i < nSchemes; i++) { - const ReorderingScheme *pScheme = Schemes + i; - if (inLevel == pScheme->inLevel && outLevel == pScheme->outLevel - && inOrder == pScheme->inOrder && outOrder == pScheme->outOrder) { - return pScheme; - } - } - return NULL; -} - -U_DRAFT uint32_t U_EXPORT2 -ubiditransform_transform(UBiDiTransform *pBiDiTransform, - const UChar *src, int32_t srcLength, - UChar *dest, int32_t destSize, - UBiDiLevel inParaLevel, UBiDiOrder inOrder, - UBiDiLevel outParaLevel, UBiDiOrder outOrder, - UBiDiMirroring doMirroring, uint32_t shapingOptions, - UErrorCode *pErrorCode) -{ - uint32_t destLength = 0; - UBool textChanged = FALSE; - const UBiDiTransform *pOrigTransform = pBiDiTransform; - const UBiDiAction *action = NULL; - - if (U_FAILURE(*pErrorCode)) { - return 0; - } - if (src == NULL || dest == NULL) { - *pErrorCode = U_ILLEGAL_ARGUMENT_ERROR; - return 0; - } - CHECK_LEN(src, srcLength, pErrorCode); - CHECK_LEN(dest, destSize, pErrorCode); - - if (pBiDiTransform == NULL) { - pBiDiTransform = ubiditransform_open(pErrorCode); - if (U_FAILURE(*pErrorCode)) { - return 0; - } - } - /* Current limitation: in multiple paragraphs will be resolved according - to the 1st paragraph */ - resolveBaseDirection(src, srcLength, &inParaLevel, &outParaLevel); - - pBiDiTransform->pActiveScheme = findMatchingScheme(inParaLevel, outParaLevel, - inOrder, outOrder); - if (pBiDiTransform->pActiveScheme == NULL) { - goto cleanup; - } - pBiDiTransform->reorderingOptions = doMirroring ? UBIDI_DO_MIRRORING - : UBIDI_REORDER_DEFAULT; - - /* Ignore TEXT_DIRECTION_* flags, as we apply our own depending on the text - scheme at the time shaping is invoked. */ - shapingOptions &= ~U_SHAPE_TEXT_DIRECTION_MASK; - pBiDiTransform->digits = shapingOptions & ~U_SHAPE_LETTERS_MASK; - pBiDiTransform->letters = shapingOptions & ~U_SHAPE_DIGITS_MASK; - - updateSrc(pBiDiTransform, src, srcLength, destSize > srcLength ? destSize : srcLength, pErrorCode); - if (U_FAILURE(*pErrorCode)) { - goto cleanup; - } - if (pBiDiTransform->pBidi == NULL) { - pBiDiTransform->pBidi = ubidi_openSized(0, 0, pErrorCode); - if (U_FAILURE(*pErrorCode)) { - goto cleanup; - } - } - pBiDiTransform->dest = dest; - pBiDiTransform->destSize = destSize; - pBiDiTransform->pDestLength = &destLength; - - /* Checking for U_SUCCESS() within the loop to bail out on first failure. */ - for (action = pBiDiTransform->pActiveScheme->actions; *action && U_SUCCESS(*pErrorCode); action++) { - if ((*action)(pBiDiTransform, pErrorCode)) { - if (action + 1) { - updateSrc(pBiDiTransform, pBiDiTransform->dest, *pBiDiTransform->pDestLength, - *pBiDiTransform->pDestLength, pErrorCode); - } - textChanged = TRUE; - } - } - ubidi_setInverse(pBiDiTransform->pBidi, FALSE); - - if (!textChanged && U_SUCCESS(*pErrorCode)) { - /* Text was not changed - just copy src to dest */ - if (destSize < srcLength) { - *pErrorCode = U_BUFFER_OVERFLOW_ERROR; - } else { - u_strncpy(dest, src, srcLength); - destLength = srcLength; - } - } -cleanup: - if (pOrigTransform != pBiDiTransform) { - ubiditransform_close(pBiDiTransform); - } else { - pBiDiTransform->dest = NULL; - pBiDiTransform->pDestLength = NULL; - pBiDiTransform->srcLength = 0; - pBiDiTransform->destSize = 0; - } - return U_FAILURE(*pErrorCode) ? 0 : destLength; -} diff --git a/Build/source/libs/icu/icu-src/source/common/ubiditransform.cpp b/Build/source/libs/icu/icu-src/source/common/ubiditransform.cpp new file mode 100644 index 00000000000..fd7b90fd37c --- /dev/null +++ b/Build/source/libs/icu/icu-src/source/common/ubiditransform.cpp @@ -0,0 +1,530 @@ +/* +****************************************************************************** +* +* © 2016 and later: Unicode, Inc. and others. +* License & terms of use: http://www.unicode.org/copyright.html +* +****************************************************************************** +* file name: ubiditransform.c +* encoding: UTF-8 +* tab size: 8 (not used) +* indentation:4 +* +* created on: 2016jul24 +* created by: Lina Kemmel +* +*/ + +#include "cmemory.h" +#include "unicode/ubidi.h" +#include "unicode/ustring.h" +#include "unicode/ushape.h" +#include "unicode/utf16.h" +#include "ustr_imp.h" +#include "unicode/ubiditransform.h" + +/* Some convenience defines */ +#define LTR UBIDI_LTR +#define RTL UBIDI_RTL +#define LOGICAL UBIDI_LOGICAL +#define VISUAL UBIDI_VISUAL +#define SHAPE_LOGICAL U_SHAPE_TEXT_DIRECTION_LOGICAL +#define SHAPE_VISUAL U_SHAPE_TEXT_DIRECTION_VISUAL_LTR + +#define CHECK_LEN(STR, LEN, ERROR) { \ + if (LEN == 0) return 0; \ + if (LEN < -1) { *(ERROR) = U_ILLEGAL_ARGUMENT_ERROR; return 0; } \ + if (LEN == -1) LEN = u_strlen(STR); \ + } + +#define MAX_ACTIONS 7 + +/** + * Typedef for a pointer to a function, which performs some operation (such as + * reordering, setting "inverse" mode, character mirroring, etc.). Return value + * indicates whether the text was changed in the course of this operation or + * not. + */ +typedef UBool (*UBiDiAction)(UBiDiTransform *, UErrorCode *); + +/** + * Structure that holds a predefined reordering scheme, including the following + * information: + *
        + *
      • an input base direction,
      • + *
      • an input order,
      • + *
      • an output base direction,
      • + *
      • an output order,
      • + *
      • a digit shaping direction,
      • + *
      • a letter shaping direction,
      • + *
      • a base direction that should be applied when the reordering engine is + * invoked (which can not always be derived from the caller-defined + * options),
      • + *
      • an array of pointers to functions that accomplish the bidi layout + * transformation.
      • + *
      + */ +typedef struct { + UBiDiLevel inLevel; /* input level */ + UBiDiOrder inOrder; /* input order */ + UBiDiLevel outLevel; /* output level */ + UBiDiOrder outOrder; /* output order */ + uint32_t digitsDir; /* digit shaping direction */ + uint32_t lettersDir; /* letter shaping direction */ + UBiDiLevel baseLevel; /* paragraph level to be used with setPara */ + const UBiDiAction actions[MAX_ACTIONS]; /* array of pointers to functions carrying out the transformation */ +} ReorderingScheme; + +struct UBiDiTransform { + UBiDi *pBidi; /* pointer to a UBiDi object */ + const ReorderingScheme *pActiveScheme; /* effective reordering scheme */ + UChar *src; /* input text */ + UChar *dest; /* output text */ + uint32_t srcLength; /* input text length - not really needed as we are zero-terminated and can u_strlen */ + uint32_t srcSize; /* input text capacity excluding the trailing zero */ + uint32_t destSize; /* output text capacity */ + uint32_t *pDestLength; /* number of UChars written to dest */ + uint32_t reorderingOptions; /* reordering options - currently only suppot DO_MIRRORING */ + uint32_t digits; /* digit option for ArabicShaping */ + uint32_t letters; /* letter option for ArabicShaping */ +}; + +U_DRAFT UBiDiTransform* U_EXPORT2 +ubiditransform_open(UErrorCode *pErrorCode) +{ + UBiDiTransform *pBiDiTransform = NULL; + if (U_SUCCESS(*pErrorCode)) { + pBiDiTransform = (UBiDiTransform*) uprv_calloc(1, sizeof(UBiDiTransform)); + if (pBiDiTransform == NULL) { + *pErrorCode = U_MEMORY_ALLOCATION_ERROR; + } + } + return pBiDiTransform; +} + +U_DRAFT void U_EXPORT2 +ubiditransform_close(UBiDiTransform *pBiDiTransform) +{ + if (pBiDiTransform != NULL) { + if (pBiDiTransform->pBidi != NULL) { + ubidi_close(pBiDiTransform->pBidi); + } + if (pBiDiTransform->src != NULL) { + uprv_free(pBiDiTransform->src); + } + uprv_free(pBiDiTransform); + } +} + +/** + * Performs Bidi resolution of text. + * + * @param pTransform Pointer to the UBiDiTransform structure. + * @param pErrorCode Pointer to the error code value. + * + * @return Whether or not this function modifies the text. Besides the return + * value, the caller should also check U_SUCCESS(*pErrorCode). + */ +static UBool +action_resolve(UBiDiTransform *pTransform, UErrorCode *pErrorCode) +{ + ubidi_setPara(pTransform->pBidi, pTransform->src, pTransform->srcLength, + pTransform->pActiveScheme->baseLevel, NULL, pErrorCode); + return FALSE; +} + +/** + * Performs basic reordering of text (Logical -> Visual LTR). + * + * @param pTransform Pointer to the UBiDiTransform structure. + * @param pErrorCode Pointer to the error code value. + * + * @return Whether or not this function modifies the text. Besides the return + * value, the caller should also check U_SUCCESS(*pErrorCode). + */ +static UBool +action_reorder(UBiDiTransform *pTransform, UErrorCode *pErrorCode) +{ + ubidi_writeReordered(pTransform->pBidi, pTransform->dest, pTransform->destSize, + pTransform->reorderingOptions, pErrorCode); + + *pTransform->pDestLength = pTransform->srcLength; + pTransform->reorderingOptions = UBIDI_REORDER_DEFAULT; + return TRUE; +} + +/** + * Sets "inverse" mode on the UBiDi object. + * + * @param pTransform Pointer to the UBiDiTransform structure. + * @param pErrorCode Pointer to the error code value. + * + * @return Whether or not this function modifies the text. Besides the return + * value, the caller should also check U_SUCCESS(*pErrorCode). + */ +static UBool +action_setInverse(UBiDiTransform *pTransform, UErrorCode *pErrorCode) +{ + (void)pErrorCode; + ubidi_setInverse(pTransform->pBidi, TRUE); + ubidi_setReorderingMode(pTransform->pBidi, UBIDI_REORDER_INVERSE_LIKE_DIRECT); + return FALSE; +} + +/** + * Sets "runs only" reordering mode indicating a Logical LTR <-> Logical RTL + * transformation. + * + * @param pTransform Pointer to the UBiDiTransform structure. + * @param pErrorCode Pointer to the error code value. + * + * @return Whether or not this function modifies the text. Besides the return + * value, the caller should also check U_SUCCESS(*pErrorCode). + */ +static UBool +action_setRunsOnly(UBiDiTransform *pTransform, UErrorCode *pErrorCode) +{ + (void)pErrorCode; + ubidi_setReorderingMode(pTransform->pBidi, UBIDI_REORDER_RUNS_ONLY); + return FALSE; +} + +/** + * Performs string reverse. + * + * @param pTransform Pointer to the UBiDiTransform structure. + * @param pErrorCode Pointer to the error code value. + * + * @return Whether or not this function modifies the text. Besides the return + * value, the caller should also check U_SUCCESS(*pErrorCode). + */ +static UBool +action_reverse(UBiDiTransform *pTransform, UErrorCode *pErrorCode) +{ + ubidi_writeReverse(pTransform->src, pTransform->srcLength, + pTransform->dest, pTransform->destSize, + UBIDI_REORDER_DEFAULT, pErrorCode); + *pTransform->pDestLength = pTransform->srcLength; + return TRUE; +} + +/** + * Applies a new value to the text that serves as input at the current + * processing step. This value is identical to the original one when we begin + * the processing, but usually changes as the transformation progresses. + * + * @param pTransform A pointer to the UBiDiTransform structure. + * @param newSrc A pointer whose value is to be used as input text. + * @param newLength A length of the new text in UChars. + * @param newSize A new source capacity in UChars. + * @param pErrorCode Pointer to the error code value. + */ +static void +updateSrc(UBiDiTransform *pTransform, const UChar *newSrc, uint32_t newLength, + uint32_t newSize, UErrorCode *pErrorCode) +{ + if (newSize < newLength) { + *pErrorCode = U_BUFFER_OVERFLOW_ERROR; + return; + } + if (newSize > pTransform->srcSize) { + newSize += 50; // allocate slightly more than needed right now + if (pTransform->src != NULL) { + uprv_free(pTransform->src); + pTransform->src = NULL; + } + pTransform->src = (UChar *)uprv_malloc(newSize * sizeof(UChar)); + if (pTransform->src == NULL) { + *pErrorCode = U_MEMORY_ALLOCATION_ERROR; + //pTransform->srcLength = pTransform->srcSize = 0; + return; + } + pTransform->srcSize = newSize; + } + u_strncpy(pTransform->src, newSrc, newLength); + pTransform->srcLength = u_terminateUChars(pTransform->src, + pTransform->srcSize, newLength, pErrorCode); +} + +/** + * Calls a lower level shaping function. + * + * @param pTransform Pointer to the UBiDiTransform structure. + * @param options Shaping options. + * @param pErrorCode Pointer to the error code value. + */ +static void +doShape(UBiDiTransform *pTransform, uint32_t options, UErrorCode *pErrorCode) +{ + *pTransform->pDestLength = u_shapeArabic(pTransform->src, + pTransform->srcLength, pTransform->dest, pTransform->destSize, + options, pErrorCode); +} + +/** + * Performs digit and letter shaping. + * + * @param pTransform Pointer to the UBiDiTransform structure. + * @param pErrorCode Pointer to the error code value. + * + * @return Whether or not this function modifies the text. Besides the return + * value, the caller should also check U_SUCCESS(*pErrorCode). + */ +static UBool +action_shapeArabic(UBiDiTransform *pTransform, UErrorCode *pErrorCode) +{ + if ((pTransform->letters | pTransform->digits) == 0) { + return FALSE; + } + if (pTransform->pActiveScheme->lettersDir == pTransform->pActiveScheme->digitsDir) { + doShape(pTransform, pTransform->letters | pTransform->digits | pTransform->pActiveScheme->lettersDir, + pErrorCode); + } else { + doShape(pTransform, pTransform->digits | pTransform->pActiveScheme->digitsDir, pErrorCode); + if (U_SUCCESS(*pErrorCode)) { + updateSrc(pTransform, pTransform->dest, *pTransform->pDestLength, + *pTransform->pDestLength, pErrorCode); + doShape(pTransform, pTransform->letters | pTransform->pActiveScheme->lettersDir, + pErrorCode); + } + } + return TRUE; +} + +/** + * Performs character mirroring. + * + * @param pTransform Pointer to the UBiDiTransform structure. + * @param pErrorCode Pointer to the error code value. + * + * @return Whether or not this function modifies the text. Besides the return + * value, the caller should also check U_SUCCESS(*pErrorCode). + */ +static UBool +action_mirror(UBiDiTransform *pTransform, UErrorCode *pErrorCode) +{ + UChar32 c; + uint32_t i = 0, j = 0; + if (0 == (pTransform->reorderingOptions & UBIDI_DO_MIRRORING)) { + return FALSE; + } + if (pTransform->destSize < pTransform->srcLength) { + *pErrorCode = U_BUFFER_OVERFLOW_ERROR; + return FALSE; + } + do { + UBool isOdd = ubidi_getLevelAt(pTransform->pBidi, i) & 1; + U16_NEXT(pTransform->src, i, pTransform->srcLength, c); + U16_APPEND_UNSAFE(pTransform->dest, j, isOdd ? u_charMirror(c) : c); + } while (i < pTransform->srcLength); + + *pTransform->pDestLength = pTransform->srcLength; + pTransform->reorderingOptions = UBIDI_REORDER_DEFAULT; + return TRUE; +} + +/** + * All possible reordering schemes. + * + */ +static const ReorderingScheme Schemes[] = +{ + /* 0: Logical LTR => Visual LTR */ + {LTR, LOGICAL, LTR, VISUAL, SHAPE_LOGICAL, SHAPE_LOGICAL, LTR, + {action_shapeArabic, action_resolve, action_reorder, NULL}}, + /* 1: Logical RTL => Visual LTR */ + {RTL, LOGICAL, LTR, VISUAL, SHAPE_LOGICAL, SHAPE_VISUAL, RTL, + {action_resolve, action_reorder, action_shapeArabic, NULL}}, + /* 2: Logical LTR => Visual RTL */ + {LTR, LOGICAL, RTL, VISUAL, SHAPE_LOGICAL, SHAPE_LOGICAL, LTR, + {action_shapeArabic, action_resolve, action_reorder, action_reverse, NULL}}, + /* 3: Logical RTL => Visual RTL */ + {RTL, LOGICAL, RTL, VISUAL, SHAPE_LOGICAL, SHAPE_VISUAL, RTL, + {action_resolve, action_reorder, action_shapeArabic, action_reverse, NULL}}, + /* 4: Visual LTR => Logical RTL */ + {LTR, VISUAL, RTL, LOGICAL, SHAPE_LOGICAL, SHAPE_VISUAL, RTL, + {action_shapeArabic, action_setInverse, action_resolve, action_reorder, NULL}}, + /* 5: Visual RTL => Logical RTL */ + {RTL, VISUAL, RTL, LOGICAL, SHAPE_LOGICAL, SHAPE_VISUAL, RTL, + {action_reverse, action_shapeArabic, action_setInverse, action_resolve, action_reorder, NULL}}, + /* 6: Visual LTR => Logical LTR */ + {LTR, VISUAL, LTR, LOGICAL, SHAPE_LOGICAL, SHAPE_LOGICAL, LTR, + {action_setInverse, action_resolve, action_reorder, action_shapeArabic, NULL}}, + /* 7: Visual RTL => Logical LTR */ + {RTL, VISUAL, LTR, LOGICAL, SHAPE_LOGICAL, SHAPE_LOGICAL, LTR, + {action_reverse, action_setInverse, action_resolve, action_reorder, action_shapeArabic, NULL}}, + /* 8: Logical LTR => Logical RTL */ + {LTR, LOGICAL, RTL, LOGICAL, SHAPE_LOGICAL, SHAPE_LOGICAL, LTR, + {action_shapeArabic, action_resolve, action_mirror, action_setRunsOnly, action_resolve, action_reorder, NULL}}, + /* 9: Logical RTL => Logical LTR */ + {RTL, LOGICAL, LTR, LOGICAL, SHAPE_LOGICAL, SHAPE_LOGICAL, RTL, + {action_resolve, action_mirror, action_setRunsOnly, action_resolve, action_reorder, action_shapeArabic, NULL}}, + /* 10: Visual LTR => Visual RTL */ + {LTR, VISUAL, RTL, VISUAL, SHAPE_LOGICAL, SHAPE_VISUAL, LTR, + {action_shapeArabic, action_setInverse, action_resolve, action_mirror, action_reverse, NULL}}, + /* 11: Visual RTL => Visual LTR */ + {RTL, VISUAL, LTR, VISUAL, SHAPE_LOGICAL, SHAPE_VISUAL, LTR, + {action_reverse, action_shapeArabic, action_setInverse, action_resolve, action_mirror, NULL}}, + /* 12: Logical LTR => Logical LTR */ + {LTR, LOGICAL, LTR, LOGICAL, SHAPE_LOGICAL, SHAPE_LOGICAL, LTR, + {action_resolve, action_mirror, action_shapeArabic, NULL}}, + /* 13: Logical RTL => Logical RTL */ + {RTL, LOGICAL, RTL, LOGICAL, SHAPE_VISUAL, SHAPE_LOGICAL, RTL, + {action_resolve, action_mirror, action_shapeArabic, NULL}}, + /* 14: Visual LTR => Visual LTR */ + {LTR, VISUAL, LTR, VISUAL, SHAPE_LOGICAL, SHAPE_VISUAL, LTR, + {action_resolve, action_mirror, action_shapeArabic, NULL}}, + /* 15: Visual RTL => Visual RTL */ + {RTL, VISUAL, RTL, VISUAL, SHAPE_LOGICAL, SHAPE_VISUAL, LTR, + {action_reverse, action_resolve, action_mirror, action_shapeArabic, action_reverse, NULL}} +}; + +static const uint32_t nSchemes = sizeof(Schemes) / sizeof(*Schemes); + +/** + * When the direction option is UBIDI_DEFAULT_LTR or + * UBIDI_DEFAULT_RTL, resolve the base direction according to that + * of the first strong bidi character. + */ +static void +resolveBaseDirection(const UChar *text, uint32_t length, + UBiDiLevel *pInLevel, UBiDiLevel *pOutLevel) +{ + switch (*pInLevel) { + case UBIDI_DEFAULT_LTR: + case UBIDI_DEFAULT_RTL: { + UBiDiLevel level = ubidi_getBaseDirection(text, length); + *pInLevel = level != UBIDI_NEUTRAL ? level + : *pInLevel == UBIDI_DEFAULT_RTL ? RTL : LTR; + break; + } + default: + *pInLevel &= 1; + break; + } + switch (*pOutLevel) { + case UBIDI_DEFAULT_LTR: + case UBIDI_DEFAULT_RTL: + *pOutLevel = *pInLevel; + break; + default: + *pOutLevel &= 1; + break; + } +} + +/** + * Finds a valid ReorderingScheme matching the + * caller-defined scheme. + * + * @return A valid ReorderingScheme object or NULL + */ +static const ReorderingScheme* +findMatchingScheme(UBiDiLevel inLevel, UBiDiLevel outLevel, + UBiDiOrder inOrder, UBiDiOrder outOrder) +{ + uint32_t i; + for (i = 0; i < nSchemes; i++) { + const ReorderingScheme *pScheme = Schemes + i; + if (inLevel == pScheme->inLevel && outLevel == pScheme->outLevel + && inOrder == pScheme->inOrder && outOrder == pScheme->outOrder) { + return pScheme; + } + } + return NULL; +} + +U_DRAFT uint32_t U_EXPORT2 +ubiditransform_transform(UBiDiTransform *pBiDiTransform, + const UChar *src, int32_t srcLength, + UChar *dest, int32_t destSize, + UBiDiLevel inParaLevel, UBiDiOrder inOrder, + UBiDiLevel outParaLevel, UBiDiOrder outOrder, + UBiDiMirroring doMirroring, uint32_t shapingOptions, + UErrorCode *pErrorCode) +{ + uint32_t destLength = 0; + UBool textChanged = FALSE; + const UBiDiTransform *pOrigTransform = pBiDiTransform; + const UBiDiAction *action = NULL; + + if (U_FAILURE(*pErrorCode)) { + return 0; + } + if (src == NULL || dest == NULL) { + *pErrorCode = U_ILLEGAL_ARGUMENT_ERROR; + return 0; + } + CHECK_LEN(src, srcLength, pErrorCode); + CHECK_LEN(dest, destSize, pErrorCode); + + if (pBiDiTransform == NULL) { + pBiDiTransform = ubiditransform_open(pErrorCode); + if (U_FAILURE(*pErrorCode)) { + return 0; + } + } + /* Current limitation: in multiple paragraphs will be resolved according + to the 1st paragraph */ + resolveBaseDirection(src, srcLength, &inParaLevel, &outParaLevel); + + pBiDiTransform->pActiveScheme = findMatchingScheme(inParaLevel, outParaLevel, + inOrder, outOrder); + if (pBiDiTransform->pActiveScheme == NULL) { + goto cleanup; + } + pBiDiTransform->reorderingOptions = doMirroring ? UBIDI_DO_MIRRORING + : UBIDI_REORDER_DEFAULT; + + /* Ignore TEXT_DIRECTION_* flags, as we apply our own depending on the text + scheme at the time shaping is invoked. */ + shapingOptions &= ~U_SHAPE_TEXT_DIRECTION_MASK; + pBiDiTransform->digits = shapingOptions & ~U_SHAPE_LETTERS_MASK; + pBiDiTransform->letters = shapingOptions & ~U_SHAPE_DIGITS_MASK; + + updateSrc(pBiDiTransform, src, srcLength, destSize > srcLength ? destSize : srcLength, pErrorCode); + if (U_FAILURE(*pErrorCode)) { + goto cleanup; + } + if (pBiDiTransform->pBidi == NULL) { + pBiDiTransform->pBidi = ubidi_openSized(0, 0, pErrorCode); + if (U_FAILURE(*pErrorCode)) { + goto cleanup; + } + } + pBiDiTransform->dest = dest; + pBiDiTransform->destSize = destSize; + pBiDiTransform->pDestLength = &destLength; + + /* Checking for U_SUCCESS() within the loop to bail out on first failure. */ + for (action = pBiDiTransform->pActiveScheme->actions; *action && U_SUCCESS(*pErrorCode); action++) { + if ((*action)(pBiDiTransform, pErrorCode)) { + if (action + 1) { + updateSrc(pBiDiTransform, pBiDiTransform->dest, *pBiDiTransform->pDestLength, + *pBiDiTransform->pDestLength, pErrorCode); + } + textChanged = TRUE; + } + } + ubidi_setInverse(pBiDiTransform->pBidi, FALSE); + + if (!textChanged && U_SUCCESS(*pErrorCode)) { + /* Text was not changed - just copy src to dest */ + if (destSize < srcLength) { + *pErrorCode = U_BUFFER_OVERFLOW_ERROR; + } else { + u_strncpy(dest, src, srcLength); + destLength = srcLength; + } + } +cleanup: + if (pOrigTransform != pBiDiTransform) { + ubiditransform_close(pBiDiTransform); + } else { + pBiDiTransform->dest = NULL; + pBiDiTransform->pDestLength = NULL; + pBiDiTransform->srcLength = 0; + pBiDiTransform->destSize = 0; + } + return U_FAILURE(*pErrorCode) ? 0 : destLength; +} diff --git a/Build/source/libs/icu/icu-src/source/common/ubidiwrt.c b/Build/source/libs/icu/icu-src/source/common/ubidiwrt.c deleted file mode 100644 index 1d0c36a5d28..00000000000 --- a/Build/source/libs/icu/icu-src/source/common/ubidiwrt.c +++ /dev/null @@ -1,640 +0,0 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. -// License & terms of use: http://www.unicode.org/copyright.html -/* -****************************************************************************** -* -* Copyright (C) 2000-2015, International Business Machines -* Corporation and others. All Rights Reserved. -* -****************************************************************************** -* file name: ubidiwrt.c -* encoding: US-ASCII -* tab size: 8 (not used) -* indentation:4 -* -* created on: 1999aug06 -* created by: Markus W. Scherer, updated by Matitiahu Allouche -* -* This file contains implementations for BiDi functions that use -* the core algorithm and core API to write reordered text. -*/ - -#include "unicode/utypes.h" -#include "unicode/ustring.h" -#include "unicode/uchar.h" -#include "unicode/ubidi.h" -#include "unicode/utf16.h" -#include "cmemory.h" -#include "ustr_imp.h" -#include "ubidiimp.h" - -/* - * The function implementations in this file are designed - * for UTF-16 and UTF-32, not for UTF-8. - * - * Assumptions that are not true for UTF-8: - * - Any code point always needs the same number of code units - * ("minimum-length-problem" of UTF-8) - * - The BiDi control characters need only one code unit each - * - * Further assumptions for all UTFs: - * - u_charMirror(c) needs the same number of code units as c - */ -#if UTF_SIZE==8 -# error reimplement ubidi_writeReordered() for UTF-8, see comment above -#endif - -#define IS_COMBINING(type) ((1UL<<(type))&(1UL<0); - return srcLength; - } - case UBIDI_DO_MIRRORING: { - /* do mirroring */ - int32_t i=0, j=0; - UChar32 c; - - if(destSize0) { - c=*src++; - if(!IS_BIDI_CONTROL_CHAR(c)) { - --remaining; - } - } - return destSize-remaining; - } - *dest++=c; - } - } while(--srcLength>0); - return destSize-remaining; - } - default: { - /* remove BiDi control characters and do mirroring */ - int32_t remaining=destSize; - int32_t i, j=0; - UChar32 c; - do { - i=0; - U16_NEXT(src, i, srcLength, c); - src+=i; - srcLength-=i; - if(!IS_BIDI_CONTROL_CHAR(c)) { - remaining-=i; - if(remaining<0) { - *pErrorCode=U_BUFFER_OVERFLOW_ERROR; - - /* preflight the length */ - while(srcLength>0) { - c=*src++; - if(!IS_BIDI_CONTROL_CHAR(c)) { - --remaining; - } - --srcLength; - } - return destSize-remaining; - } - c=u_charMirror(c); - U16_APPEND_UNSAFE(dest, j, c); - } - } while(srcLength>0); - return j; - } - } /* end of switch */ -} - -static int32_t -doWriteReverse(const UChar *src, int32_t srcLength, - UChar *dest, int32_t destSize, - uint16_t options, - UErrorCode *pErrorCode) { - /* - * RTL run - - * - * RTL runs need to be copied to the destination in reverse order - * of code points, not code units, to keep Unicode characters intact. - * - * The general strategy for this is to read the source text - * in backward order, collect all code units for a code point - * (and optionally following combining characters, see below), - * and copy all these code units in ascending order - * to the destination for this run. - * - * Several options request whether combining characters - * should be kept after their base characters, - * whether BiDi control characters should be removed, and - * whether characters should be replaced by their mirror-image - * equivalent Unicode characters. - */ - int32_t i, j; - UChar32 c; - - /* optimize for several combinations of options */ - switch(options&(UBIDI_REMOVE_BIDI_CONTROLS|UBIDI_DO_MIRRORING|UBIDI_KEEP_BASE_COMBINING)) { - case 0: - /* - * With none of the "complicated" options set, the destination - * run will have the same length as the source run, - * and there is no mirroring and no keeping combining characters - * with their base characters. - */ - if(destSize0); - break; - case UBIDI_KEEP_BASE_COMBINING: - /* - * Here, too, the destination - * run will have the same length as the source run, - * and there is no mirroring. - * We do need to keep combining characters with their base characters. - */ - if(destSize0 && IS_COMBINING(u_charType(c))); - - /* copy this "user character" */ - j=srcLength; - do { - *dest++=src[j++]; - } while(j0); - break; - default: - /* - * With several "complicated" options set, this is the most - * general and the slowest copying of an RTL run. - * We will do mirroring, remove BiDi controls, and - * keep combining characters with their base characters - * as requested. - */ - if(!(options&UBIDI_REMOVE_BIDI_CONTROLS)) { - i=srcLength; - } else { - /* we need to find out the destination length of the run, - which will not include the BiDi control characters */ - int32_t length=srcLength; - UChar ch; - - i=0; - do { - ch=*src++; - if(!IS_BIDI_CONTROL_CHAR(ch)) { - ++i; - } - } while(--length>0); - src-=srcLength; - } - - if(destSize0 && IS_COMBINING(u_charType(c))) { - U16_PREV(src, 0, srcLength, c); - } - } - - if(options&UBIDI_REMOVE_BIDI_CONTROLS && IS_BIDI_CONTROL_CHAR(c)) { - /* do not copy this BiDi control character */ - continue; - } - - /* copy this "user character" */ - j=srcLength; - if(options&UBIDI_DO_MIRRORING) { - /* mirror only the base character */ - int32_t k=0; - c=u_charMirror(c); - U16_APPEND_UNSAFE(dest, k, c); - dest+=k; - j+=k; - } - while(j0); - break; - } /* end of switch */ - - return destSize; -} - -U_CAPI int32_t U_EXPORT2 -ubidi_writeReverse(const UChar *src, int32_t srcLength, - UChar *dest, int32_t destSize, - uint16_t options, - UErrorCode *pErrorCode) { - int32_t destLength; - - if(pErrorCode==NULL || U_FAILURE(*pErrorCode)) { - return 0; - } - - /* more error checking */ - if( src==NULL || srcLength<-1 || - destSize<0 || (destSize>0 && dest==NULL)) - { - *pErrorCode=U_ILLEGAL_ARGUMENT_ERROR; - return 0; - } - - /* do input and output overlap? */ - if( dest!=NULL && - ((src>=dest && src=src && dest0) { - destLength=doWriteReverse(src, srcLength, dest, destSize, options, pErrorCode); - } else { - /* nothing to do */ - destLength=0; - } - - return u_terminateUChars(dest, destSize, destLength, pErrorCode); -} - -U_CAPI int32_t U_EXPORT2 -ubidi_writeReordered(UBiDi *pBiDi, - UChar *dest, int32_t destSize, - uint16_t options, - UErrorCode *pErrorCode) { - const UChar *text; - UChar *saveDest; - int32_t length, destCapacity; - int32_t run, runCount, logicalStart, runLength; - - if(pErrorCode==NULL || U_FAILURE(*pErrorCode)) { - return 0; - } - - /* more error checking */ - if( pBiDi==NULL || - (text=pBiDi->text)==NULL || (length=pBiDi->length)<0 || - destSize<0 || (destSize>0 && dest==NULL)) - { - *pErrorCode=U_ILLEGAL_ARGUMENT_ERROR; - return 0; - } - - /* do input and output overlap? */ - if( dest!=NULL && - ((text>=dest && text=text && destoriginalLength))) - { - *pErrorCode=U_ILLEGAL_ARGUMENT_ERROR; - return 0; - } - - if(length==0) { - /* nothing to do */ - return u_terminateUChars(dest, destSize, 0, pErrorCode); - } - - runCount=ubidi_countRuns(pBiDi, pErrorCode); - if(U_FAILURE(*pErrorCode)) { - return 0; - } - - /* destSize shrinks, later destination length=destCapacity-destSize */ - saveDest=dest; - destCapacity=destSize; - - /* - * Option "insert marks" implies UBIDI_INSERT_LRM_FOR_NUMERIC if the - * reordering mode (checked below) is appropriate. - */ - if(pBiDi->reorderingOptions & UBIDI_OPTION_INSERT_MARKS) { - options|=UBIDI_INSERT_LRM_FOR_NUMERIC; - options&=~UBIDI_REMOVE_BIDI_CONTROLS; - } - /* - * Option "remove controls" implies UBIDI_REMOVE_BIDI_CONTROLS - * and cancels UBIDI_INSERT_LRM_FOR_NUMERIC. - */ - if(pBiDi->reorderingOptions & UBIDI_OPTION_REMOVE_CONTROLS) { - options|=UBIDI_REMOVE_BIDI_CONTROLS; - options&=~UBIDI_INSERT_LRM_FOR_NUMERIC; - } - /* - * If we do not perform the "inverse BiDi" algorithm, then we - * don't need to insert any LRMs, and don't need to test for it. - */ - if((pBiDi->reorderingMode != UBIDI_REORDER_INVERSE_NUMBERS_AS_L) && - (pBiDi->reorderingMode != UBIDI_REORDER_INVERSE_LIKE_DIRECT) && - (pBiDi->reorderingMode != UBIDI_REORDER_INVERSE_FOR_NUMBERS_SPECIAL) && - (pBiDi->reorderingMode != UBIDI_REORDER_RUNS_ONLY)) { - options&=~UBIDI_INSERT_LRM_FOR_NUMERIC; - } - /* - * Iterate through all visual runs and copy the run text segments to - * the destination, according to the options. - * - * The tests for where to insert LRMs ignore the fact that there may be - * BN codes or non-BMP code points at the beginning and end of a run; - * they may insert LRMs unnecessarily but the tests are faster this way - * (this would have to be improved for UTF-8). - * - * Note that the only errors that are set by doWriteXY() are buffer overflow - * errors. Ignore them until the end, and continue for preflighting. - */ - if(!(options&UBIDI_OUTPUT_REVERSE)) { - /* forward output */ - if(!(options&UBIDI_INSERT_LRM_FOR_NUMERIC)) { - /* do not insert BiDi controls */ - for(run=0; rundirProps; - const UChar *src; - UChar uc; - UBiDiDirection dir; - int32_t markFlag; - - for(run=0; runruns[run].insertRemove; - if(markFlag<0) { /* BiDi controls count */ - markFlag=0; - } - - if(UBIDI_LTR==dir) { - if((pBiDi->isInverse) && - (/*run>0 &&*/ dirProps[logicalStart]!=L)) { - markFlag |= LRM_BEFORE; - } - if (markFlag & LRM_BEFORE) { - uc=LRM_CHAR; - } - else if (markFlag & RLM_BEFORE) { - uc=RLM_CHAR; - } - else uc=0; - if(uc) { - if(destSize>0) { - *dest++=uc; - } - --destSize; - } - - runLength=doWriteForward(src, runLength, - dest, destSize, - (uint16_t)(options&~UBIDI_DO_MIRRORING), pErrorCode); - if(dest!=NULL) { - dest+=runLength; - } - destSize-=runLength; - - if((pBiDi->isInverse) && - (/*run0) { - *dest++=uc; - } - --destSize; - } - } else { /* RTL run */ - if((pBiDi->isInverse) && - (/*run>0 &&*/ !(MASK_R_AL&DIRPROP_FLAG(dirProps[logicalStart+runLength-1])))) { - markFlag |= RLM_BEFORE; - } - if (markFlag & LRM_BEFORE) { - uc=LRM_CHAR; - } - else if (markFlag & RLM_BEFORE) { - uc=RLM_CHAR; - } - else uc=0; - if(uc) { - if(destSize>0) { - *dest++=uc; - } - --destSize; - } - - runLength=doWriteReverse(src, runLength, - dest, destSize, - options, pErrorCode); - if(dest!=NULL) { - dest+=runLength; - } - destSize-=runLength; - - if((pBiDi->isInverse) && - (/*run0) { - *dest++=uc; - } - --destSize; - } - } - } - } - } else { - /* reverse output */ - if(!(options&UBIDI_INSERT_LRM_FOR_NUMERIC)) { - /* do not insert BiDi controls */ - for(run=runCount; --run>=0;) { - if(UBIDI_LTR==ubidi_getVisualRun(pBiDi, run, &logicalStart, &runLength)) { - runLength=doWriteReverse(text+logicalStart, runLength, - dest, destSize, - (uint16_t)(options&~UBIDI_DO_MIRRORING), pErrorCode); - } else { - runLength=doWriteForward(text+logicalStart, runLength, - dest, destSize, - options, pErrorCode); - } - if(dest!=NULL) { - dest+=runLength; - } - destSize-=runLength; - } - } else { - /* insert BiDi controls for "inverse BiDi" */ - const DirProp *dirProps=pBiDi->dirProps; - const UChar *src; - UBiDiDirection dir; - - for(run=runCount; --run>=0;) { - /* reverse output */ - dir=ubidi_getVisualRun(pBiDi, run, &logicalStart, &runLength); - src=text+logicalStart; - - if(UBIDI_LTR==dir) { - if(/*run0) { - *dest++=LRM_CHAR; - } - --destSize; - } - - runLength=doWriteReverse(src, runLength, - dest, destSize, - (uint16_t)(options&~UBIDI_DO_MIRRORING), pErrorCode); - if(dest!=NULL) { - dest+=runLength; - } - destSize-=runLength; - - if(/*run>0 &&*/ dirProps[logicalStart]!=L) { - if(destSize>0) { - *dest++=LRM_CHAR; - } - --destSize; - } - } else { - if(/*run0) { - *dest++=RLM_CHAR; - } - --destSize; - } - - runLength=doWriteForward(src, runLength, - dest, destSize, - options, pErrorCode); - if(dest!=NULL) { - dest+=runLength; - } - destSize-=runLength; - - if(/*run>0 &&*/ !(MASK_R_AL&DIRPROP_FLAG(dirProps[logicalStart+runLength-1]))) { - if(destSize>0) { - *dest++=RLM_CHAR; - } - --destSize; - } - } - } - } - } - - return u_terminateUChars(saveDest, destCapacity, destCapacity-destSize, pErrorCode); -} diff --git a/Build/source/libs/icu/icu-src/source/common/ubidiwrt.cpp b/Build/source/libs/icu/icu-src/source/common/ubidiwrt.cpp new file mode 100644 index 00000000000..a89099dad0e --- /dev/null +++ b/Build/source/libs/icu/icu-src/source/common/ubidiwrt.cpp @@ -0,0 +1,640 @@ +// © 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html +/* +****************************************************************************** +* +* Copyright (C) 2000-2015, International Business Machines +* Corporation and others. All Rights Reserved. +* +****************************************************************************** +* file name: ubidiwrt.c +* encoding: UTF-8 +* tab size: 8 (not used) +* indentation:4 +* +* created on: 1999aug06 +* created by: Markus W. Scherer, updated by Matitiahu Allouche +* +* This file contains implementations for BiDi functions that use +* the core algorithm and core API to write reordered text. +*/ + +#include "unicode/utypes.h" +#include "unicode/ustring.h" +#include "unicode/uchar.h" +#include "unicode/ubidi.h" +#include "unicode/utf16.h" +#include "cmemory.h" +#include "ustr_imp.h" +#include "ubidiimp.h" + +/* + * The function implementations in this file are designed + * for UTF-16 and UTF-32, not for UTF-8. + * + * Assumptions that are not true for UTF-8: + * - Any code point always needs the same number of code units + * ("minimum-length-problem" of UTF-8) + * - The BiDi control characters need only one code unit each + * + * Further assumptions for all UTFs: + * - u_charMirror(c) needs the same number of code units as c + */ +#if UTF_SIZE==8 +# error reimplement ubidi_writeReordered() for UTF-8, see comment above +#endif + +#define IS_COMBINING(type) ((1UL<<(type))&(1UL<0); + return srcLength; + } + case UBIDI_DO_MIRRORING: { + /* do mirroring */ + int32_t i=0, j=0; + UChar32 c; + + if(destSize0) { + c=*src++; + if(!IS_BIDI_CONTROL_CHAR(c)) { + --remaining; + } + } + return destSize-remaining; + } + *dest++=c; + } + } while(--srcLength>0); + return destSize-remaining; + } + default: { + /* remove BiDi control characters and do mirroring */ + int32_t remaining=destSize; + int32_t i, j=0; + UChar32 c; + do { + i=0; + U16_NEXT(src, i, srcLength, c); + src+=i; + srcLength-=i; + if(!IS_BIDI_CONTROL_CHAR(c)) { + remaining-=i; + if(remaining<0) { + *pErrorCode=U_BUFFER_OVERFLOW_ERROR; + + /* preflight the length */ + while(srcLength>0) { + c=*src++; + if(!IS_BIDI_CONTROL_CHAR(c)) { + --remaining; + } + --srcLength; + } + return destSize-remaining; + } + c=u_charMirror(c); + U16_APPEND_UNSAFE(dest, j, c); + } + } while(srcLength>0); + return j; + } + } /* end of switch */ +} + +static int32_t +doWriteReverse(const UChar *src, int32_t srcLength, + UChar *dest, int32_t destSize, + uint16_t options, + UErrorCode *pErrorCode) { + /* + * RTL run - + * + * RTL runs need to be copied to the destination in reverse order + * of code points, not code units, to keep Unicode characters intact. + * + * The general strategy for this is to read the source text + * in backward order, collect all code units for a code point + * (and optionally following combining characters, see below), + * and copy all these code units in ascending order + * to the destination for this run. + * + * Several options request whether combining characters + * should be kept after their base characters, + * whether BiDi control characters should be removed, and + * whether characters should be replaced by their mirror-image + * equivalent Unicode characters. + */ + int32_t i, j; + UChar32 c; + + /* optimize for several combinations of options */ + switch(options&(UBIDI_REMOVE_BIDI_CONTROLS|UBIDI_DO_MIRRORING|UBIDI_KEEP_BASE_COMBINING)) { + case 0: + /* + * With none of the "complicated" options set, the destination + * run will have the same length as the source run, + * and there is no mirroring and no keeping combining characters + * with their base characters. + */ + if(destSize0); + break; + case UBIDI_KEEP_BASE_COMBINING: + /* + * Here, too, the destination + * run will have the same length as the source run, + * and there is no mirroring. + * We do need to keep combining characters with their base characters. + */ + if(destSize0 && IS_COMBINING(u_charType(c))); + + /* copy this "user character" */ + j=srcLength; + do { + *dest++=src[j++]; + } while(j0); + break; + default: + /* + * With several "complicated" options set, this is the most + * general and the slowest copying of an RTL run. + * We will do mirroring, remove BiDi controls, and + * keep combining characters with their base characters + * as requested. + */ + if(!(options&UBIDI_REMOVE_BIDI_CONTROLS)) { + i=srcLength; + } else { + /* we need to find out the destination length of the run, + which will not include the BiDi control characters */ + int32_t length=srcLength; + UChar ch; + + i=0; + do { + ch=*src++; + if(!IS_BIDI_CONTROL_CHAR(ch)) { + ++i; + } + } while(--length>0); + src-=srcLength; + } + + if(destSize0 && IS_COMBINING(u_charType(c))) { + U16_PREV(src, 0, srcLength, c); + } + } + + if(options&UBIDI_REMOVE_BIDI_CONTROLS && IS_BIDI_CONTROL_CHAR(c)) { + /* do not copy this BiDi control character */ + continue; + } + + /* copy this "user character" */ + j=srcLength; + if(options&UBIDI_DO_MIRRORING) { + /* mirror only the base character */ + int32_t k=0; + c=u_charMirror(c); + U16_APPEND_UNSAFE(dest, k, c); + dest+=k; + j+=k; + } + while(j0); + break; + } /* end of switch */ + + return destSize; +} + +U_CAPI int32_t U_EXPORT2 +ubidi_writeReverse(const UChar *src, int32_t srcLength, + UChar *dest, int32_t destSize, + uint16_t options, + UErrorCode *pErrorCode) { + int32_t destLength; + + if(pErrorCode==NULL || U_FAILURE(*pErrorCode)) { + return 0; + } + + /* more error checking */ + if( src==NULL || srcLength<-1 || + destSize<0 || (destSize>0 && dest==NULL)) + { + *pErrorCode=U_ILLEGAL_ARGUMENT_ERROR; + return 0; + } + + /* do input and output overlap? */ + if( dest!=NULL && + ((src>=dest && src=src && dest0) { + destLength=doWriteReverse(src, srcLength, dest, destSize, options, pErrorCode); + } else { + /* nothing to do */ + destLength=0; + } + + return u_terminateUChars(dest, destSize, destLength, pErrorCode); +} + +U_CAPI int32_t U_EXPORT2 +ubidi_writeReordered(UBiDi *pBiDi, + UChar *dest, int32_t destSize, + uint16_t options, + UErrorCode *pErrorCode) { + const UChar *text; + UChar *saveDest; + int32_t length, destCapacity; + int32_t run, runCount, logicalStart, runLength; + + if(pErrorCode==NULL || U_FAILURE(*pErrorCode)) { + return 0; + } + + /* more error checking */ + if( pBiDi==NULL || + (text=pBiDi->text)==NULL || (length=pBiDi->length)<0 || + destSize<0 || (destSize>0 && dest==NULL)) + { + *pErrorCode=U_ILLEGAL_ARGUMENT_ERROR; + return 0; + } + + /* do input and output overlap? */ + if( dest!=NULL && + ((text>=dest && text=text && destoriginalLength))) + { + *pErrorCode=U_ILLEGAL_ARGUMENT_ERROR; + return 0; + } + + if(length==0) { + /* nothing to do */ + return u_terminateUChars(dest, destSize, 0, pErrorCode); + } + + runCount=ubidi_countRuns(pBiDi, pErrorCode); + if(U_FAILURE(*pErrorCode)) { + return 0; + } + + /* destSize shrinks, later destination length=destCapacity-destSize */ + saveDest=dest; + destCapacity=destSize; + + /* + * Option "insert marks" implies UBIDI_INSERT_LRM_FOR_NUMERIC if the + * reordering mode (checked below) is appropriate. + */ + if(pBiDi->reorderingOptions & UBIDI_OPTION_INSERT_MARKS) { + options|=UBIDI_INSERT_LRM_FOR_NUMERIC; + options&=~UBIDI_REMOVE_BIDI_CONTROLS; + } + /* + * Option "remove controls" implies UBIDI_REMOVE_BIDI_CONTROLS + * and cancels UBIDI_INSERT_LRM_FOR_NUMERIC. + */ + if(pBiDi->reorderingOptions & UBIDI_OPTION_REMOVE_CONTROLS) { + options|=UBIDI_REMOVE_BIDI_CONTROLS; + options&=~UBIDI_INSERT_LRM_FOR_NUMERIC; + } + /* + * If we do not perform the "inverse BiDi" algorithm, then we + * don't need to insert any LRMs, and don't need to test for it. + */ + if((pBiDi->reorderingMode != UBIDI_REORDER_INVERSE_NUMBERS_AS_L) && + (pBiDi->reorderingMode != UBIDI_REORDER_INVERSE_LIKE_DIRECT) && + (pBiDi->reorderingMode != UBIDI_REORDER_INVERSE_FOR_NUMBERS_SPECIAL) && + (pBiDi->reorderingMode != UBIDI_REORDER_RUNS_ONLY)) { + options&=~UBIDI_INSERT_LRM_FOR_NUMERIC; + } + /* + * Iterate through all visual runs and copy the run text segments to + * the destination, according to the options. + * + * The tests for where to insert LRMs ignore the fact that there may be + * BN codes or non-BMP code points at the beginning and end of a run; + * they may insert LRMs unnecessarily but the tests are faster this way + * (this would have to be improved for UTF-8). + * + * Note that the only errors that are set by doWriteXY() are buffer overflow + * errors. Ignore them until the end, and continue for preflighting. + */ + if(!(options&UBIDI_OUTPUT_REVERSE)) { + /* forward output */ + if(!(options&UBIDI_INSERT_LRM_FOR_NUMERIC)) { + /* do not insert BiDi controls */ + for(run=0; rundirProps; + const UChar *src; + UChar uc; + UBiDiDirection dir; + int32_t markFlag; + + for(run=0; runruns[run].insertRemove; + if(markFlag<0) { /* BiDi controls count */ + markFlag=0; + } + + if(UBIDI_LTR==dir) { + if((pBiDi->isInverse) && + (/*run>0 &&*/ dirProps[logicalStart]!=L)) { + markFlag |= LRM_BEFORE; + } + if (markFlag & LRM_BEFORE) { + uc=LRM_CHAR; + } + else if (markFlag & RLM_BEFORE) { + uc=RLM_CHAR; + } + else uc=0; + if(uc) { + if(destSize>0) { + *dest++=uc; + } + --destSize; + } + + runLength=doWriteForward(src, runLength, + dest, destSize, + (uint16_t)(options&~UBIDI_DO_MIRRORING), pErrorCode); + if(dest!=NULL) { + dest+=runLength; + } + destSize-=runLength; + + if((pBiDi->isInverse) && + (/*run0) { + *dest++=uc; + } + --destSize; + } + } else { /* RTL run */ + if((pBiDi->isInverse) && + (/*run>0 &&*/ !(MASK_R_AL&DIRPROP_FLAG(dirProps[logicalStart+runLength-1])))) { + markFlag |= RLM_BEFORE; + } + if (markFlag & LRM_BEFORE) { + uc=LRM_CHAR; + } + else if (markFlag & RLM_BEFORE) { + uc=RLM_CHAR; + } + else uc=0; + if(uc) { + if(destSize>0) { + *dest++=uc; + } + --destSize; + } + + runLength=doWriteReverse(src, runLength, + dest, destSize, + options, pErrorCode); + if(dest!=NULL) { + dest+=runLength; + } + destSize-=runLength; + + if((pBiDi->isInverse) && + (/*run0) { + *dest++=uc; + } + --destSize; + } + } + } + } + } else { + /* reverse output */ + if(!(options&UBIDI_INSERT_LRM_FOR_NUMERIC)) { + /* do not insert BiDi controls */ + for(run=runCount; --run>=0;) { + if(UBIDI_LTR==ubidi_getVisualRun(pBiDi, run, &logicalStart, &runLength)) { + runLength=doWriteReverse(text+logicalStart, runLength, + dest, destSize, + (uint16_t)(options&~UBIDI_DO_MIRRORING), pErrorCode); + } else { + runLength=doWriteForward(text+logicalStart, runLength, + dest, destSize, + options, pErrorCode); + } + if(dest!=NULL) { + dest+=runLength; + } + destSize-=runLength; + } + } else { + /* insert BiDi controls for "inverse BiDi" */ + const DirProp *dirProps=pBiDi->dirProps; + const UChar *src; + UBiDiDirection dir; + + for(run=runCount; --run>=0;) { + /* reverse output */ + dir=ubidi_getVisualRun(pBiDi, run, &logicalStart, &runLength); + src=text+logicalStart; + + if(UBIDI_LTR==dir) { + if(/*run0) { + *dest++=LRM_CHAR; + } + --destSize; + } + + runLength=doWriteReverse(src, runLength, + dest, destSize, + (uint16_t)(options&~UBIDI_DO_MIRRORING), pErrorCode); + if(dest!=NULL) { + dest+=runLength; + } + destSize-=runLength; + + if(/*run>0 &&*/ dirProps[logicalStart]!=L) { + if(destSize>0) { + *dest++=LRM_CHAR; + } + --destSize; + } + } else { + if(/*run0) { + *dest++=RLM_CHAR; + } + --destSize; + } + + runLength=doWriteForward(src, runLength, + dest, destSize, + options, pErrorCode); + if(dest!=NULL) { + dest+=runLength; + } + destSize-=runLength; + + if(/*run>0 &&*/ !(MASK_R_AL&DIRPROP_FLAG(dirProps[logicalStart+runLength-1]))) { + if(destSize>0) { + *dest++=RLM_CHAR; + } + --destSize; + } + } + } + } + } + + return u_terminateUChars(saveDest, destCapacity, destCapacity-destSize, pErrorCode); +} diff --git a/Build/source/libs/icu/icu-src/source/common/ubrk.cpp b/Build/source/libs/icu/icu-src/source/common/ubrk.cpp index b02c966b107..f8bdf5a6b65 100644 --- a/Build/source/libs/icu/icu-src/source/common/ubrk.cpp +++ b/Build/source/libs/icu/icu-src/source/common/ubrk.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************** @@ -20,6 +20,7 @@ #include "unicode/rbbi.h" #include "rbbirb.h" #include "uassert.h" +#include "cmemory.h" U_NAMESPACE_USE @@ -119,7 +120,28 @@ ubrk_openRules( const UChar *rules, } - +U_CAPI UBreakIterator* U_EXPORT2 +ubrk_openBinaryRules(const uint8_t *binaryRules, int32_t rulesLength, + const UChar * text, int32_t textLength, + UErrorCode * status) +{ + if (U_FAILURE(*status)) { + return NULL; + } + if (rulesLength < 0) { + *status = U_ILLEGAL_ARGUMENT_ERROR; + return NULL; + } + LocalPointer lpRBBI(new RuleBasedBreakIterator(binaryRules, rulesLength, *status), *status); + if (U_FAILURE(*status)) { + return NULL; + } + UBreakIterator *uBI = reinterpret_cast(lpRBBI.orphan()); + if (text != NULL) { + ubrk_setText(uBI, text, textLength, status); + } + return uBI; +} U_CAPI UBreakIterator * U_EXPORT2 @@ -288,7 +310,8 @@ ubrk_getLocaleByType(const UBreakIterator *bi, } -void ubrk_refreshUText(UBreakIterator *bi, +U_CAPI void U_EXPORT2 +ubrk_refreshUText(UBreakIterator *bi, UText *text, UErrorCode *status) { @@ -296,6 +319,39 @@ void ubrk_refreshUText(UBreakIterator *bi, bii->refreshInputText(text, *status); } +U_CAPI int32_t U_EXPORT2 +ubrk_getBinaryRules(UBreakIterator *bi, + uint8_t * binaryRules, int32_t rulesCapacity, + UErrorCode * status) +{ + if (U_FAILURE(*status)) { + return 0; + } + if ((binaryRules == NULL && rulesCapacity > 0) || rulesCapacity < 0) { + *status = U_ILLEGAL_ARGUMENT_ERROR; + return 0; + } + RuleBasedBreakIterator* rbbi; + if ((rbbi = dynamic_cast(reinterpret_cast(bi))) == NULL) { + *status = U_ILLEGAL_ARGUMENT_ERROR; + return 0; + } + uint32_t rulesLength; + const uint8_t * returnedRules = rbbi->getBinaryRules(rulesLength); + if (rulesLength > INT32_MAX) { + *status = U_INDEX_OUTOFBOUNDS_ERROR; + return 0; + } + if (binaryRules != NULL) { // if not preflighting + // Here we know rulesLength <= INT32_MAX and rulesCapacity >= 0, can cast safely + if ((int32_t)rulesLength > rulesCapacity) { + *status = U_BUFFER_OVERFLOW_ERROR; + } else { + uprv_memcpy(binaryRules, returnedRules, rulesLength); + } + } + return (int32_t)rulesLength; +} #endif /* #if !UCONFIG_NO_BREAK_ITERATION */ diff --git a/Build/source/libs/icu/icu-src/source/common/ubrkimpl.h b/Build/source/libs/icu/icu-src/source/common/ubrkimpl.h index 36ca6688593..8197f66339e 100644 --- a/Build/source/libs/icu/icu-src/source/common/ubrkimpl.h +++ b/Build/source/libs/icu/icu-src/source/common/ubrkimpl.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** diff --git a/Build/source/libs/icu/icu-src/source/common/ucase.cpp b/Build/source/libs/icu/icu-src/source/common/ucase.cpp index 97ded9ee2d1..6b22f9e37bf 100644 --- a/Build/source/libs/icu/icu-src/source/common/ucase.cpp +++ b/Build/source/libs/icu/icu-src/source/common/ucase.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* @@ -8,7 +8,7 @@ * ******************************************************************************* * file name: ucase.cpp -* encoding: US-ASCII +* encoding: UTF-8 * tab size: 8 (not used) * indentation:4 * @@ -46,13 +46,6 @@ struct UCaseProps { #define INCLUDED_FROM_UCASE_CPP #include "ucase_props_data.h" -/* UCaseProps singleton ----------------------------------------------------- */ - -U_CAPI const UCaseProps * U_EXPORT2 -ucase_getSingleton() { - return &ucase_props_singleton; -} - /* set of property starts for UnicodeSet ------------------------------------ */ static UBool U_CALLCONV @@ -64,13 +57,13 @@ _enumPropertyStartsRange(const void *context, UChar32 start, UChar32 /*end*/, ui } U_CFUNC void U_EXPORT2 -ucase_addPropertyStarts(const UCaseProps *csp, const USetAdder *sa, UErrorCode *pErrorCode) { +ucase_addPropertyStarts(const USetAdder *sa, UErrorCode *pErrorCode) { if(U_FAILURE(*pErrorCode)) { return; } /* add the start code point of each same-value range of the trie */ - utrie2_enum(&csp->trie, NULL, _enumPropertyStartsRange, sa); + utrie2_enum(&ucase_props_singleton.trie, NULL, _enumPropertyStartsRange, sa); /* add code points with hardcoded properties, plus the ones following them */ @@ -133,14 +126,14 @@ static const uint8_t flagsOffset[256]={ /* simple case mappings ----------------------------------------------------- */ U_CAPI UChar32 U_EXPORT2 -ucase_tolower(const UCaseProps *csp, UChar32 c) { - uint16_t props=UTRIE2_GET16(&csp->trie, c); +ucase_tolower(UChar32 c) { + uint16_t props=UTRIE2_GET16(&ucase_props_singleton.trie, c); if(!PROPS_HAS_EXCEPTION(props)) { if(UCASE_GET_TYPE(props)>=UCASE_UPPER) { c+=UCASE_GET_DELTA(props); } } else { - const uint16_t *pe=GET_EXCEPTIONS(csp, props); + const uint16_t *pe=GET_EXCEPTIONS(&ucase_props_singleton, props); uint16_t excWord=*pe++; if(HAS_SLOT(excWord, UCASE_EXC_LOWER)) { GET_SLOT_VALUE(excWord, UCASE_EXC_LOWER, pe, c); @@ -150,14 +143,14 @@ ucase_tolower(const UCaseProps *csp, UChar32 c) { } U_CAPI UChar32 U_EXPORT2 -ucase_toupper(const UCaseProps *csp, UChar32 c) { - uint16_t props=UTRIE2_GET16(&csp->trie, c); +ucase_toupper(UChar32 c) { + uint16_t props=UTRIE2_GET16(&ucase_props_singleton.trie, c); if(!PROPS_HAS_EXCEPTION(props)) { if(UCASE_GET_TYPE(props)==UCASE_LOWER) { c+=UCASE_GET_DELTA(props); } } else { - const uint16_t *pe=GET_EXCEPTIONS(csp, props); + const uint16_t *pe=GET_EXCEPTIONS(&ucase_props_singleton, props); uint16_t excWord=*pe++; if(HAS_SLOT(excWord, UCASE_EXC_UPPER)) { GET_SLOT_VALUE(excWord, UCASE_EXC_UPPER, pe, c); @@ -167,14 +160,14 @@ ucase_toupper(const UCaseProps *csp, UChar32 c) { } U_CAPI UChar32 U_EXPORT2 -ucase_totitle(const UCaseProps *csp, UChar32 c) { - uint16_t props=UTRIE2_GET16(&csp->trie, c); +ucase_totitle(UChar32 c) { + uint16_t props=UTRIE2_GET16(&ucase_props_singleton.trie, c); if(!PROPS_HAS_EXCEPTION(props)) { if(UCASE_GET_TYPE(props)==UCASE_LOWER) { c+=UCASE_GET_DELTA(props); } } else { - const uint16_t *pe=GET_EXCEPTIONS(csp, props); + const uint16_t *pe=GET_EXCEPTIONS(&ucase_props_singleton, props); uint16_t excWord=*pe++; int32_t idx; if(HAS_SLOT(excWord, UCASE_EXC_TITLE)) { @@ -198,7 +191,7 @@ static const UChar iDotTilde[3] = { 0x69, 0x307, 0x303 }; U_CFUNC void U_EXPORT2 -ucase_addCaseClosure(const UCaseProps *csp, UChar32 c, const USetAdder *sa) { +ucase_addCaseClosure(UChar32 c, const USetAdder *sa) { uint16_t props; /* @@ -229,7 +222,7 @@ ucase_addCaseClosure(const UCaseProps *csp, UChar32 c, const USetAdder *sa) { break; } - props=UTRIE2_GET16(&csp->trie, c); + props=UTRIE2_GET16(&ucase_props_singleton.trie, c); if(!PROPS_HAS_EXCEPTION(props)) { if(UCASE_GET_TYPE(props)!=UCASE_NONE) { /* add the one simple case mapping, no matter what type it is */ @@ -243,7 +236,7 @@ ucase_addCaseClosure(const UCaseProps *csp, UChar32 c, const USetAdder *sa) { * c has exceptions, so there may be multiple simple and/or * full case mappings. Add them all. */ - const uint16_t *pe0, *pe=GET_EXCEPTIONS(csp, props); + const uint16_t *pe0, *pe=GET_EXCEPTIONS(&ucase_props_singleton, props); const UChar *closure; uint16_t excWord=*pe++; int32_t idx, closureLength, fullLength, length; @@ -338,10 +331,10 @@ strcmpMax(const UChar *s, int32_t length, const UChar *t, int32_t max) { } U_CFUNC UBool U_EXPORT2 -ucase_addStringCaseClosure(const UCaseProps *csp, const UChar *s, int32_t length, const USetAdder *sa) { +ucase_addStringCaseClosure(const UChar *s, int32_t length, const USetAdder *sa) { int32_t i, start, limit, result, unfoldRows, unfoldRowWidth, unfoldStringWidth; - if(csp->unfold==NULL || s==NULL) { + if(ucase_props_singleton.unfold==NULL || s==NULL) { return FALSE; /* no reverse case folding data, or no string */ } if(length<=1) { @@ -355,7 +348,7 @@ ucase_addStringCaseClosure(const UCaseProps *csp, const UChar *s, int32_t length return FALSE; } - const uint16_t *unfold=csp->unfold; + const uint16_t *unfold=ucase_props_singleton.unfold; unfoldRows=unfold[UCASE_UNFOLD_ROWS]; unfoldRowWidth=unfold[UCASE_UNFOLD_ROW_WIDTH]; unfoldStringWidth=unfold[UCASE_UNFOLD_STRING_WIDTH]; @@ -381,7 +374,7 @@ ucase_addStringCaseClosure(const UCaseProps *csp, const UChar *s, int32_t length for(i=unfoldStringWidth; iadd(sa->set, c); - ucase_addCaseClosure(csp, c, sa); + ucase_addCaseClosure(c, sa); } return TRUE; } else if(result<0) { @@ -430,38 +423,38 @@ U_NAMESPACE_END /** @return UCASE_NONE, UCASE_LOWER, UCASE_UPPER, UCASE_TITLE */ U_CAPI int32_t U_EXPORT2 -ucase_getType(const UCaseProps *csp, UChar32 c) { - uint16_t props=UTRIE2_GET16(&csp->trie, c); +ucase_getType(UChar32 c) { + uint16_t props=UTRIE2_GET16(&ucase_props_singleton.trie, c); return UCASE_GET_TYPE(props); } /** @return same as ucase_getType() and set bit 2 if c is case-ignorable */ U_CAPI int32_t U_EXPORT2 -ucase_getTypeOrIgnorable(const UCaseProps *csp, UChar32 c) { - uint16_t props=UTRIE2_GET16(&csp->trie, c); +ucase_getTypeOrIgnorable(UChar32 c) { + uint16_t props=UTRIE2_GET16(&ucase_props_singleton.trie, c); return UCASE_GET_TYPE_AND_IGNORABLE(props); } /** @return UCASE_NO_DOT, UCASE_SOFT_DOTTED, UCASE_ABOVE, UCASE_OTHER_ACCENT */ static inline int32_t -getDotType(const UCaseProps *csp, UChar32 c) { - uint16_t props=UTRIE2_GET16(&csp->trie, c); +getDotType(UChar32 c) { + uint16_t props=UTRIE2_GET16(&ucase_props_singleton.trie, c); if(!PROPS_HAS_EXCEPTION(props)) { return props&UCASE_DOT_MASK; } else { - const uint16_t *pe=GET_EXCEPTIONS(csp, props); + const uint16_t *pe=GET_EXCEPTIONS(&ucase_props_singleton, props); return (*pe>>UCASE_EXC_DOT_SHIFT)&UCASE_DOT_MASK; } } U_CAPI UBool U_EXPORT2 -ucase_isSoftDotted(const UCaseProps *csp, UChar32 c) { - return (UBool)(getDotType(csp, c)==UCASE_SOFT_DOTTED); +ucase_isSoftDotted(UChar32 c) { + return (UBool)(getDotType(c)==UCASE_SOFT_DOTTED); } U_CAPI UBool U_EXPORT2 -ucase_isCaseSensitive(const UCaseProps *csp, UChar32 c) { - uint16_t props=UTRIE2_GET16(&csp->trie, c); +ucase_isCaseSensitive(UChar32 c) { + uint16_t props=UTRIE2_GET16(&ucase_props_singleton.trie, c); return (UBool)((props&UCASE_SENSITIVE)!=0); } @@ -545,12 +538,10 @@ ucase_isCaseSensitive(const UCaseProps *csp, UChar32 c) { * zero or more case-ignorable characters. */ -#define is_a(c) ((c)=='a' || (c)=='A') #define is_d(c) ((c)=='d' || (c)=='D') #define is_e(c) ((c)=='e' || (c)=='E') #define is_i(c) ((c)=='i' || (c)=='I') #define is_l(c) ((c)=='l' || (c)=='L') -#define is_n(c) ((c)=='n' || (c)=='N') #define is_r(c) ((c)=='r' || (c)=='R') #define is_t(c) ((c)=='t' || (c)=='T') #define is_u(c) ((c)=='u' || (c)=='U') @@ -565,16 +556,7 @@ ucase_isCaseSensitive(const UCaseProps *csp, UChar32 c) { * Accepts both 2- and 3-letter codes and accepts case variants. */ U_CFUNC int32_t -ucase_getCaseLocale(const char *locale, int32_t *locCache) { - int32_t result; - char c; - - if(locCache!=NULL && (result=*locCache)!=UCASE_LOC_UNKNOWN) { - return result; - } - - result=UCASE_LOC_ROOT; - +ucase_getCaseLocale(const char *locale) { /* * This function used to use uloc_getLanguage(), but the current code * removes the dependency of this low-level code on uloc implementation code @@ -584,73 +566,149 @@ ucase_getCaseLocale(const char *locale, int32_t *locCache) { * Because this code does not want to depend on uloc, the caller must * pass in a non-NULL locale, i.e., may need to call uloc_getDefault(). */ - c=*locale++; - if(is_t(c)) { - /* tr or tur? */ + char c=*locale++; + // Fastpath for English "en" which is often used for default (=root locale) case mappings, + // and for Chinese "zh": Very common but no special case mapping behavior. + // Then check lowercase vs. uppercase to reduce the number of comparisons + // for other locales without special behavior. + if(c=='e') { + /* el or ell? */ c=*locale++; - if(is_u(c)) { + if(is_l(c)) { c=*locale++; - } - if(is_r(c)) { - c=*locale; + if(is_l(c)) { + c=*locale; + } if(is_sep(c)) { - result=UCASE_LOC_TURKISH; + return UCASE_LOC_GREEK; } } - } else if(is_a(c)) { - /* az or aze? */ - c=*locale++; - if(is_z(c)) { + // en, es, ... -> root + } else if(c=='z') { + return UCASE_LOC_ROOT; +#if U_CHARSET_FAMILY==U_ASCII_FAMILY + } else if(c>='a') { // ASCII a-z = 0x61..0x7a, after A-Z +#elif U_CHARSET_FAMILY==U_EBCDIC_FAMILY + } else if(c<='z') { // EBCDIC a-z = 0x81..0xa9 with two gaps, before A-Z +#else +# error Unknown charset family! +#endif + // lowercase c + if(c=='t') { + /* tr or tur? */ c=*locale++; - if(is_e(c)) { + if(is_u(c)) { + c=*locale++; + } + if(is_r(c)) { c=*locale; + if(is_sep(c)) { + return UCASE_LOC_TURKISH; + } } - if(is_sep(c)) { - result=UCASE_LOC_TURKISH; + } else if(c=='a') { + /* az or aze? */ + c=*locale++; + if(is_z(c)) { + c=*locale++; + if(is_e(c)) { + c=*locale; + } + if(is_sep(c)) { + return UCASE_LOC_TURKISH; + } } - } - } else if(is_l(c)) { - /* lt or lit? */ - c=*locale++; - if(is_i(c)) { + } else if(c=='l') { + /* lt or lit? */ c=*locale++; - } - if(is_t(c)) { - c=*locale; - if(is_sep(c)) { - result=UCASE_LOC_LITHUANIAN; + if(is_i(c)) { + c=*locale++; } - } - } else if(is_e(c)) { - /* el or ell? */ - c=*locale++; - if(is_l(c)) { + if(is_t(c)) { + c=*locale; + if(is_sep(c)) { + return UCASE_LOC_LITHUANIAN; + } + } + } else if(c=='n') { + /* nl or nld? */ c=*locale++; if(is_l(c)) { + c=*locale++; + if(is_d(c)) { + c=*locale; + } + if(is_sep(c)) { + return UCASE_LOC_DUTCH; + } + } + } + } else { + // uppercase c + // Same code as for lowercase c but also check for 'E'. + if(c=='T') { + /* tr or tur? */ + c=*locale++; + if(is_u(c)) { + c=*locale++; + } + if(is_r(c)) { c=*locale; + if(is_sep(c)) { + return UCASE_LOC_TURKISH; + } } - if(is_sep(c)) { - result=UCASE_LOC_GREEK; + } else if(c=='A') { + /* az or aze? */ + c=*locale++; + if(is_z(c)) { + c=*locale++; + if(is_e(c)) { + c=*locale; + } + if(is_sep(c)) { + return UCASE_LOC_TURKISH; + } } - } - } else if(is_n(c)) { - /* nl or nld? */ - c=*locale++; - if(is_l(c)) { + } else if(c=='L') { + /* lt or lit? */ c=*locale++; - if(is_d(c)) { + if(is_i(c)) { + c=*locale++; + } + if(is_t(c)) { c=*locale; + if(is_sep(c)) { + return UCASE_LOC_LITHUANIAN; + } } - if(is_sep(c)) { - result=UCASE_LOC_DUTCH; + } else if(c=='E') { + /* el or ell? */ + c=*locale++; + if(is_l(c)) { + c=*locale++; + if(is_l(c)) { + c=*locale; + } + if(is_sep(c)) { + return UCASE_LOC_GREEK; + } + } + } else if(c=='N') { + /* nl or nld? */ + c=*locale++; + if(is_l(c)) { + c=*locale++; + if(is_d(c)) { + c=*locale; + } + if(is_sep(c)) { + return UCASE_LOC_DUTCH; + } } } } - - if(locCache!=NULL) { - *locCache=result; - } - return result; + return UCASE_LOC_ROOT; } /* @@ -662,7 +720,7 @@ ucase_getCaseLocale(const char *locale, int32_t *locCache) { * it is also cased or not. */ static UBool -isFollowedByCasedLetter(const UCaseProps *csp, UCaseContextIterator *iter, void *context, int8_t dir) { +isFollowedByCasedLetter(UCaseContextIterator *iter, void *context, int8_t dir) { UChar32 c; if(iter==NULL) { @@ -670,7 +728,7 @@ isFollowedByCasedLetter(const UCaseProps *csp, UCaseContextIterator *iter, void } for(/* dir!=0 sets direction */; (c=iter(context, dir))>=0; dir=0) { - int32_t type=ucase_getTypeOrIgnorable(csp, c); + int32_t type=ucase_getTypeOrIgnorable(c); if(type&4) { /* case-ignorable, continue with the loop */ } else if(type!=UCASE_NONE) { @@ -685,7 +743,7 @@ isFollowedByCasedLetter(const UCaseProps *csp, UCaseContextIterator *iter, void /* Is preceded by Soft_Dotted character with no intervening cc=230 ? */ static UBool -isPrecededBySoftDotted(const UCaseProps *csp, UCaseContextIterator *iter, void *context) { +isPrecededBySoftDotted(UCaseContextIterator *iter, void *context) { UChar32 c; int32_t dotType; int8_t dir; @@ -695,7 +753,7 @@ isPrecededBySoftDotted(const UCaseProps *csp, UCaseContextIterator *iter, void * } for(dir=-1; (c=iter(context, dir))>=0; dir=0) { - dotType=getDotType(csp, c); + dotType=getDotType(c); if(dotType==UCASE_SOFT_DOTTED) { return TRUE; /* preceded by TYPE_i */ } else if(dotType!=UCASE_OTHER_ACCENT) { @@ -742,7 +800,7 @@ isPrecededBySoftDotted(const UCaseProps *csp, UCaseContextIterator *iter, void * /* Is preceded by base character 'I' with no intervening cc=230 ? */ static UBool -isPrecededBy_I(const UCaseProps *csp, UCaseContextIterator *iter, void *context) { +isPrecededBy_I(UCaseContextIterator *iter, void *context) { UChar32 c; int32_t dotType; int8_t dir; @@ -755,7 +813,7 @@ isPrecededBy_I(const UCaseProps *csp, UCaseContextIterator *iter, void *context) if(c==0x49) { return TRUE; /* preceded by I */ } - dotType=getDotType(csp, c); + dotType=getDotType(c); if(dotType!=UCASE_OTHER_ACCENT) { return FALSE; /* preceded by different base character (not I), or intervening cc==230 */ } @@ -766,7 +824,7 @@ isPrecededBy_I(const UCaseProps *csp, UCaseContextIterator *iter, void *context) /* Is followed by one or more cc==230 ? */ static UBool -isFollowedByMoreAbove(const UCaseProps *csp, UCaseContextIterator *iter, void *context) { +isFollowedByMoreAbove(UCaseContextIterator *iter, void *context) { UChar32 c; int32_t dotType; int8_t dir; @@ -776,7 +834,7 @@ isFollowedByMoreAbove(const UCaseProps *csp, UCaseContextIterator *iter, void *c } for(dir=1; (c=iter(context, dir))>=0; dir=0) { - dotType=getDotType(csp, c); + dotType=getDotType(c); if(dotType==UCASE_ABOVE) { return TRUE; /* at least one cc==230 following */ } else if(dotType!=UCASE_OTHER_ACCENT) { @@ -789,7 +847,7 @@ isFollowedByMoreAbove(const UCaseProps *csp, UCaseContextIterator *iter, void *c /* Is followed by a dot above (without cc==230 in between) ? */ static UBool -isFollowedByDotAbove(const UCaseProps *csp, UCaseContextIterator *iter, void *context) { +isFollowedByDotAbove(UCaseContextIterator *iter, void *context) { UChar32 c; int32_t dotType; int8_t dir; @@ -802,7 +860,7 @@ isFollowedByDotAbove(const UCaseProps *csp, UCaseContextIterator *iter, void *co if(c==0x307) { return TRUE; } - dotType=getDotType(csp, c); + dotType=getDotType(c); if(dotType!=UCASE_OTHER_ACCENT) { return FALSE; /* next base character or cc==230 in between */ } @@ -812,20 +870,20 @@ isFollowedByDotAbove(const UCaseProps *csp, UCaseContextIterator *iter, void *co } U_CAPI int32_t U_EXPORT2 -ucase_toFullLower(const UCaseProps *csp, UChar32 c, +ucase_toFullLower(UChar32 c, UCaseContextIterator *iter, void *context, const UChar **pString, - const char *locale, int32_t *locCache) { + int32_t loc) { // The sign of the result has meaning, input must be non-negative so that it can be returned as is. U_ASSERT(c >= 0); UChar32 result=c; - uint16_t props=UTRIE2_GET16(&csp->trie, c); + uint16_t props=UTRIE2_GET16(&ucase_props_singleton.trie, c); if(!PROPS_HAS_EXCEPTION(props)) { if(UCASE_GET_TYPE(props)>=UCASE_UPPER) { result=c+UCASE_GET_DELTA(props); } } else { - const uint16_t *pe=GET_EXCEPTIONS(csp, props), *pe2; + const uint16_t *pe=GET_EXCEPTIONS(&ucase_props_singleton, props), *pe2; uint16_t excWord=*pe++; int32_t full; @@ -833,7 +891,6 @@ ucase_toFullLower(const UCaseProps *csp, UChar32 c, if(excWord&UCASE_EXC_CONDITIONAL_SPECIAL) { /* use hardcoded conditions and mappings */ - int32_t loc=ucase_getCaseLocale(locale, locCache); /* * Test for conditional mappings first @@ -844,7 +901,7 @@ ucase_toFullLower(const UCaseProps *csp, UChar32 c, if( loc==UCASE_LOC_LITHUANIAN && /* base characters, find accents above */ (((c==0x49 || c==0x4a || c==0x12e) && - isFollowedByMoreAbove(csp, iter, context)) || + isFollowedByMoreAbove(iter, context)) || /* precomposed with accent above, no need to find one */ (c==0xcc || c==0xcd || c==0x128)) ) { @@ -896,7 +953,7 @@ ucase_toFullLower(const UCaseProps *csp, UChar32 c, 0130; 0069; 0130; 0130; az # LATIN CAPITAL LETTER I WITH DOT ABOVE */ return 0x69; - } else if(loc==UCASE_LOC_TURKISH && c==0x307 && isPrecededBy_I(csp, iter, context)) { + } else if(loc==UCASE_LOC_TURKISH && c==0x307 && isPrecededBy_I(iter, context)) { /* # When lowercasing, remove dot_above in the sequence I + dot_above, which will turn into i. # This matches the behavior of the canonically equivalent I-dot_above @@ -904,8 +961,9 @@ ucase_toFullLower(const UCaseProps *csp, UChar32 c, 0307; ; 0307; 0307; tr After_I; # COMBINING DOT ABOVE 0307; ; 0307; 0307; az After_I; # COMBINING DOT ABOVE */ + *pString=nullptr; return 0; /* remove the dot (continue without output) */ - } else if(loc==UCASE_LOC_TURKISH && c==0x49 && !isFollowedByDotAbove(csp, iter, context)) { + } else if(loc==UCASE_LOC_TURKISH && c==0x49 && !isFollowedByDotAbove(iter, context)) { /* # When lowercasing, unless an I is before a dot_above, it turns into a dotless i. @@ -922,8 +980,8 @@ ucase_toFullLower(const UCaseProps *csp, UChar32 c, *pString=iDot; return 2; } else if( c==0x3a3 && - !isFollowedByCasedLetter(csp, iter, context, 1) && - isFollowedByCasedLetter(csp, iter, context, -1) /* -1=preceded */ + !isFollowedByCasedLetter(iter, context, 1) && + isFollowedByCasedLetter(iter, context, -1) /* -1=preceded */ ) { /* greek capital sigma maps depending on surrounding cased letters (see SpecialCasing.txt) */ /* @@ -957,21 +1015,21 @@ ucase_toFullLower(const UCaseProps *csp, UChar32 c, /* internal */ static int32_t -toUpperOrTitle(const UCaseProps *csp, UChar32 c, +toUpperOrTitle(UChar32 c, UCaseContextIterator *iter, void *context, const UChar **pString, - const char *locale, int32_t *locCache, + int32_t loc, UBool upperNotTitle) { // The sign of the result has meaning, input must be non-negative so that it can be returned as is. U_ASSERT(c >= 0); UChar32 result=c; - uint16_t props=UTRIE2_GET16(&csp->trie, c); + uint16_t props=UTRIE2_GET16(&ucase_props_singleton.trie, c); if(!PROPS_HAS_EXCEPTION(props)) { if(UCASE_GET_TYPE(props)==UCASE_LOWER) { result=c+UCASE_GET_DELTA(props); } } else { - const uint16_t *pe=GET_EXCEPTIONS(csp, props), *pe2; + const uint16_t *pe=GET_EXCEPTIONS(&ucase_props_singleton, props), *pe2; uint16_t excWord=*pe++; int32_t full, idx; @@ -979,8 +1037,6 @@ toUpperOrTitle(const UCaseProps *csp, UChar32 c, if(excWord&UCASE_EXC_CONDITIONAL_SPECIAL) { /* use hardcoded conditions and mappings */ - int32_t loc=ucase_getCaseLocale(locale, locCache); - if(loc==UCASE_LOC_TURKISH && c==0x69) { /* # Turkish and Azeri @@ -994,7 +1050,7 @@ toUpperOrTitle(const UCaseProps *csp, UChar32 c, 0069; 0069; 0130; 0130; az; # LATIN SMALL LETTER I */ return 0x130; - } else if(loc==UCASE_LOC_LITHUANIAN && c==0x307 && isPrecededBySoftDotted(csp, iter, context)) { + } else if(loc==UCASE_LOC_LITHUANIAN && c==0x307 && isPrecededBySoftDotted(iter, context)) { /* # Lithuanian @@ -1004,6 +1060,7 @@ toUpperOrTitle(const UCaseProps *csp, UChar32 c, 0307; 0307; ; ; lt After_Soft_Dotted; # COMBINING DOT ABOVE */ + *pString=nullptr; return 0; /* remove the dot (continue without output) */ } else { /* no known conditional special case mapping, use a normal mapping */ @@ -1052,19 +1109,19 @@ toUpperOrTitle(const UCaseProps *csp, UChar32 c, } U_CAPI int32_t U_EXPORT2 -ucase_toFullUpper(const UCaseProps *csp, UChar32 c, +ucase_toFullUpper(UChar32 c, UCaseContextIterator *iter, void *context, const UChar **pString, - const char *locale, int32_t *locCache) { - return toUpperOrTitle(csp, c, iter, context, pString, locale, locCache, TRUE); + int32_t caseLocale) { + return toUpperOrTitle(c, iter, context, pString, caseLocale, TRUE); } U_CAPI int32_t U_EXPORT2 -ucase_toFullTitle(const UCaseProps *csp, UChar32 c, +ucase_toFullTitle(UChar32 c, UCaseContextIterator *iter, void *context, const UChar **pString, - const char *locale, int32_t *locCache) { - return toUpperOrTitle(csp, c, iter, context, pString, locale, locCache, FALSE); + int32_t caseLocale) { + return toUpperOrTitle(c, iter, context, pString, caseLocale, FALSE); } /* case folding ------------------------------------------------------------- */ @@ -1110,14 +1167,14 @@ ucase_toFullTitle(const UCaseProps *csp, UChar32 c, /* return the simple case folding mapping for c */ U_CAPI UChar32 U_EXPORT2 -ucase_fold(const UCaseProps *csp, UChar32 c, uint32_t options) { - uint16_t props=UTRIE2_GET16(&csp->trie, c); +ucase_fold(UChar32 c, uint32_t options) { + uint16_t props=UTRIE2_GET16(&ucase_props_singleton.trie, c); if(!PROPS_HAS_EXCEPTION(props)) { if(UCASE_GET_TYPE(props)>=UCASE_UPPER) { c+=UCASE_GET_DELTA(props); } } else { - const uint16_t *pe=GET_EXCEPTIONS(csp, props); + const uint16_t *pe=GET_EXCEPTIONS(&ucase_props_singleton, props); uint16_t excWord=*pe++; int32_t idx; if(excWord&UCASE_EXC_CONDITIONAL_FOLD) { @@ -1170,19 +1227,19 @@ ucase_fold(const UCaseProps *csp, UChar32 c, uint32_t options) { */ U_CAPI int32_t U_EXPORT2 -ucase_toFullFolding(const UCaseProps *csp, UChar32 c, +ucase_toFullFolding(UChar32 c, const UChar **pString, uint32_t options) { // The sign of the result has meaning, input must be non-negative so that it can be returned as is. U_ASSERT(c >= 0); UChar32 result=c; - uint16_t props=UTRIE2_GET16(&csp->trie, c); + uint16_t props=UTRIE2_GET16(&ucase_props_singleton.trie, c); if(!PROPS_HAS_EXCEPTION(props)) { if(UCASE_GET_TYPE(props)>=UCASE_UPPER) { result=c+UCASE_GET_DELTA(props); } } else { - const uint16_t *pe=GET_EXCEPTIONS(csp, props), *pe2; + const uint16_t *pe=GET_EXCEPTIONS(&ucase_props_singleton, props), *pe2; uint16_t excWord=*pe++; int32_t full, idx; @@ -1244,66 +1301,59 @@ ucase_toFullFolding(const UCaseProps *csp, UChar32 c, /* case mapping properties API ---------------------------------------------- */ -#define GET_CASE_PROPS() &ucase_props_singleton - /* public API (see uchar.h) */ U_CAPI UBool U_EXPORT2 u_isULowercase(UChar32 c) { - return (UBool)(UCASE_LOWER==ucase_getType(GET_CASE_PROPS(), c)); + return (UBool)(UCASE_LOWER==ucase_getType(c)); } U_CAPI UBool U_EXPORT2 u_isUUppercase(UChar32 c) { - return (UBool)(UCASE_UPPER==ucase_getType(GET_CASE_PROPS(), c)); + return (UBool)(UCASE_UPPER==ucase_getType(c)); } /* Transforms the Unicode character to its lower case equivalent.*/ U_CAPI UChar32 U_EXPORT2 u_tolower(UChar32 c) { - return ucase_tolower(GET_CASE_PROPS(), c); + return ucase_tolower(c); } /* Transforms the Unicode character to its upper case equivalent.*/ U_CAPI UChar32 U_EXPORT2 u_toupper(UChar32 c) { - return ucase_toupper(GET_CASE_PROPS(), c); + return ucase_toupper(c); } /* Transforms the Unicode character to its title case equivalent.*/ U_CAPI UChar32 U_EXPORT2 u_totitle(UChar32 c) { - return ucase_totitle(GET_CASE_PROPS(), c); + return ucase_totitle(c); } /* return the simple case folding mapping for c */ U_CAPI UChar32 U_EXPORT2 u_foldCase(UChar32 c, uint32_t options) { - return ucase_fold(GET_CASE_PROPS(), c, options); + return ucase_fold(c, options); } U_CFUNC int32_t U_EXPORT2 ucase_hasBinaryProperty(UChar32 c, UProperty which) { /* case mapping properties */ const UChar *resultString; - int32_t locCache; - const UCaseProps *csp=GET_CASE_PROPS(); - if(csp==NULL) { - return FALSE; - } switch(which) { case UCHAR_LOWERCASE: - return (UBool)(UCASE_LOWER==ucase_getType(csp, c)); + return (UBool)(UCASE_LOWER==ucase_getType(c)); case UCHAR_UPPERCASE: - return (UBool)(UCASE_UPPER==ucase_getType(csp, c)); + return (UBool)(UCASE_UPPER==ucase_getType(c)); case UCHAR_SOFT_DOTTED: - return ucase_isSoftDotted(csp, c); + return ucase_isSoftDotted(c); case UCHAR_CASE_SENSITIVE: - return ucase_isCaseSensitive(csp, c); + return ucase_isCaseSensitive(c); case UCHAR_CASED: - return (UBool)(UCASE_NONE!=ucase_getType(csp, c)); + return (UBool)(UCASE_NONE!=ucase_getType(c)); case UCHAR_CASE_IGNORABLE: - return (UBool)(ucase_getTypeOrIgnorable(csp, c)>>2); + return (UBool)(ucase_getTypeOrIgnorable(c)>>2); /* * Note: The following Changes_When_Xyz are defined as testing whether * the NFD form of the input changes when Xyz-case-mapped. @@ -1317,21 +1367,17 @@ ucase_hasBinaryProperty(UChar32 c, UProperty which) { * start sets for normalization and case mappings. */ case UCHAR_CHANGES_WHEN_LOWERCASED: - locCache=UCASE_LOC_ROOT; - return (UBool)(ucase_toFullLower(csp, c, NULL, NULL, &resultString, "", &locCache)>=0); + return (UBool)(ucase_toFullLower(c, NULL, NULL, &resultString, UCASE_LOC_ROOT)>=0); case UCHAR_CHANGES_WHEN_UPPERCASED: - locCache=UCASE_LOC_ROOT; - return (UBool)(ucase_toFullUpper(csp, c, NULL, NULL, &resultString, "", &locCache)>=0); + return (UBool)(ucase_toFullUpper(c, NULL, NULL, &resultString, UCASE_LOC_ROOT)>=0); case UCHAR_CHANGES_WHEN_TITLECASED: - locCache=UCASE_LOC_ROOT; - return (UBool)(ucase_toFullTitle(csp, c, NULL, NULL, &resultString, "", &locCache)>=0); + return (UBool)(ucase_toFullTitle(c, NULL, NULL, &resultString, UCASE_LOC_ROOT)>=0); /* case UCHAR_CHANGES_WHEN_CASEFOLDED: -- in uprops.c */ case UCHAR_CHANGES_WHEN_CASEMAPPED: - locCache=UCASE_LOC_ROOT; return (UBool)( - ucase_toFullLower(csp, c, NULL, NULL, &resultString, "", &locCache)>=0 || - ucase_toFullUpper(csp, c, NULL, NULL, &resultString, "", &locCache)>=0 || - ucase_toFullTitle(csp, c, NULL, NULL, &resultString, "", &locCache)>=0); + ucase_toFullLower(c, NULL, NULL, &resultString, UCASE_LOC_ROOT)>=0 || + ucase_toFullUpper(c, NULL, NULL, &resultString, UCASE_LOC_ROOT)>=0 || + ucase_toFullTitle(c, NULL, NULL, &resultString, UCASE_LOC_ROOT)>=0); default: return FALSE; } diff --git a/Build/source/libs/icu/icu-src/source/common/ucase.h b/Build/source/libs/icu/icu-src/source/common/ucase.h index 29ea71a533d..9d6365eadfc 100644 --- a/Build/source/libs/icu/icu-src/source/common/ucase.h +++ b/Build/source/libs/icu/icu-src/source/common/ucase.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* @@ -8,7 +8,7 @@ * ******************************************************************************* * file name: ucase.h -* encoding: US-ASCII +* encoding: UTF-8 * tab size: 8 (not used) * indentation:4 * @@ -37,18 +37,8 @@ U_NAMESPACE_END /* library API -------------------------------------------------------------- */ -U_CDECL_BEGIN - -struct UCaseProps; -typedef struct UCaseProps UCaseProps; - -U_CDECL_END - -U_CAPI const UCaseProps * U_EXPORT2 -ucase_getSingleton(void); - U_CFUNC void U_EXPORT2 -ucase_addPropertyStarts(const UCaseProps *csp, const USetAdder *sa, UErrorCode *pErrorCode); +ucase_addPropertyStarts(const USetAdder *sa, UErrorCode *pErrorCode); /** * Requires non-NULL locale ID but otherwise does the equivalent of @@ -56,7 +46,7 @@ ucase_addPropertyStarts(const UCaseProps *csp, const USetAdder *sa, UErrorCode * * Accepts both 2- and 3-letter codes and accepts case variants. */ U_CFUNC int32_t -ucase_getCaseLocale(const char *locale, int32_t *locCache); +ucase_getCaseLocale(const char *locale); /* Casing locale types for ucase_getCaseLocale */ enum { @@ -71,7 +61,7 @@ enum { /** * Bit mask for getting just the options from a string compare options word * that are relevant for case-insensitive string comparison. - * See uchar.h. Also include _STRNCMP_STYLE and U_COMPARE_CODE_POINT_ORDER. + * See stringoptions.h. Also include _STRNCMP_STYLE and U_COMPARE_CODE_POINT_ORDER. * @internal */ #define _STRCASECMP_OPTIONS_MASK 0xffff @@ -79,24 +69,30 @@ enum { /** * Bit mask for getting just the options from a string compare options word * that are relevant for case folding (of a single string or code point). - * See uchar.h. + * + * Currently only bit 0 for U_FOLD_CASE_EXCLUDE_SPECIAL_I. + * It is conceivable that at some point we might use one more bit for using uppercase sharp s. + * It is conceivable that at some point we might want the option to use only simple case foldings + * when operating on strings. + * + * See stringoptions.h. * @internal */ -#define _FOLD_CASE_OPTIONS_MASK 0xff +#define _FOLD_CASE_OPTIONS_MASK 7 /* single-code point functions */ U_CAPI UChar32 U_EXPORT2 -ucase_tolower(const UCaseProps *csp, UChar32 c); +ucase_tolower(UChar32 c); U_CAPI UChar32 U_EXPORT2 -ucase_toupper(const UCaseProps *csp, UChar32 c); +ucase_toupper(UChar32 c); U_CAPI UChar32 U_EXPORT2 -ucase_totitle(const UCaseProps *csp, UChar32 c); +ucase_totitle(UChar32 c); U_CAPI UChar32 U_EXPORT2 -ucase_fold(const UCaseProps *csp, UChar32 c, uint32_t options); +ucase_fold(UChar32 c, uint32_t options); /** * Adds all simple case mappings and the full case folding for c to sa, @@ -108,7 +104,7 @@ ucase_fold(const UCaseProps *csp, UChar32 c, uint32_t options); * - for k include the Kelvin sign */ U_CFUNC void U_EXPORT2 -ucase_addCaseClosure(const UCaseProps *csp, UChar32 c, const USetAdder *sa); +ucase_addCaseClosure(UChar32 c, const USetAdder *sa); /** * Maps the string to single code points and adds the associated case closure @@ -123,7 +119,7 @@ ucase_addCaseClosure(const UCaseProps *csp, UChar32 c, const USetAdder *sa); * @return TRUE if the string was found */ U_CFUNC UBool U_EXPORT2 -ucase_addStringCaseClosure(const UCaseProps *csp, const UChar *s, int32_t length, const USetAdder *sa); +ucase_addStringCaseClosure(const UChar *s, int32_t length, const USetAdder *sa); #ifdef __cplusplus U_NAMESPACE_BEGIN @@ -157,17 +153,17 @@ U_NAMESPACE_END /** @return UCASE_NONE, UCASE_LOWER, UCASE_UPPER, UCASE_TITLE */ U_CAPI int32_t U_EXPORT2 -ucase_getType(const UCaseProps *csp, UChar32 c); +ucase_getType(UChar32 c); /** @return like ucase_getType() but also sets UCASE_IGNORABLE if c is case-ignorable */ U_CAPI int32_t U_EXPORT2 -ucase_getTypeOrIgnorable(const UCaseProps *csp, UChar32 c); +ucase_getTypeOrIgnorable(UChar32 c); U_CAPI UBool U_EXPORT2 -ucase_isSoftDotted(const UCaseProps *csp, UChar32 c); +ucase_isSoftDotted(UChar32 c); U_CAPI UBool U_EXPORT2 -ucase_isCaseSensitive(const UCaseProps *csp, UChar32 c); +ucase_isCaseSensitive(UChar32 c); /* string case mapping functions */ @@ -240,10 +236,7 @@ enum { * @param context Pointer to be passed into iter. * @param pString If the mapping result is a string, then the pointer is * written to *pString. - * @param locale Locale ID for locale-dependent mappings. - * @param locCache Initialize to 0; may be used to cache the result of parsing - * the locale ID for subsequent calls. - * Can be NULL. + * @param caseLocale Case locale value from ucase_getCaseLocale(). * @return Output code point or string length, see UCASE_MAX_STRING_LENGTH. * * @see UCaseContextIterator @@ -251,25 +244,25 @@ enum { * @internal */ U_CAPI int32_t U_EXPORT2 -ucase_toFullLower(const UCaseProps *csp, UChar32 c, +ucase_toFullLower(UChar32 c, UCaseContextIterator *iter, void *context, const UChar **pString, - const char *locale, int32_t *locCache); + int32_t caseLocale); U_CAPI int32_t U_EXPORT2 -ucase_toFullUpper(const UCaseProps *csp, UChar32 c, +ucase_toFullUpper(UChar32 c, UCaseContextIterator *iter, void *context, const UChar **pString, - const char *locale, int32_t *locCache); + int32_t caseLocale); U_CAPI int32_t U_EXPORT2 -ucase_toFullTitle(const UCaseProps *csp, UChar32 c, +ucase_toFullTitle(UChar32 c, UCaseContextIterator *iter, void *context, const UChar **pString, - const char *locale, int32_t *locCache); + int32_t caseLocale); U_CAPI int32_t U_EXPORT2 -ucase_toFullFolding(const UCaseProps *csp, UChar32 c, +ucase_toFullFolding(UChar32 c, const UChar **pString, uint32_t options); @@ -283,10 +276,10 @@ U_CDECL_BEGIN * @internal */ typedef int32_t U_CALLCONV -UCaseMapFull(const UCaseProps *csp, UChar32 c, +UCaseMapFull(UChar32 c, UCaseContextIterator *iter, void *context, const UChar **pString, - const char *locale, int32_t *locCache); + int32_t caseLocale); U_CDECL_END diff --git a/Build/source/libs/icu/icu-src/source/common/ucase_props_data.h b/Build/source/libs/icu/icu-src/source/common/ucase_props_data.h index aa51bac691c..fe620efc6e2 100644 --- a/Build/source/libs/icu/icu-src/source/common/ucase_props_data.h +++ b/Build/source/libs/icu/icu-src/source/common/ucase_props_data.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html // // Copyright (C) 1999-2016, International Business Machines @@ -11,36 +11,36 @@ #ifdef INCLUDED_FROM_UCASE_CPP -static const UVersionInfo ucase_props_dataVersion={9,0,0,0}; +static const UVersionInfo ucase_props_dataVersion={0xa,0,0,0}; -static const int32_t ucase_props_indexes[UCASE_IX_TOP]={0x10,0x6c6c,0x5a10,0x79c,0x172,0,0,0,0,0,0,0,0,0,0,3}; +static const int32_t ucase_props_indexes[UCASE_IX_TOP]={0x10,0x6dfc,0x5ba0,0x79c,0x172,0,0,0,0,0,0,0,0,0,0,3}; -static const uint16_t ucase_props_trieIndex[11520]={ +static const uint16_t ucase_props_trieIndex[11720]={ 0x327,0x32f,0x337,0x33f,0x34d,0x355,0x35d,0x365,0x36d,0x375,0x37c,0x384,0x38c,0x394,0x39c,0x3a4, 0x3aa,0x3b2,0x3ba,0x3c2,0x3ca,0x3d2,0x3da,0x3e2,0x3ea,0x3f2,0x3fa,0x402,0x40a,0x412,0x41a,0x422, 0x42a,0x432,0x43a,0x442,0x44a,0x452,0x45a,0x462,0x45e,0x466,0x46b,0x473,0x47a,0x482,0x48a,0x492, 0x49a,0x4a2,0x4aa,0x4b2,0x346,0x34e,0x4b7,0x4bf,0x4c4,0x4cc,0x4d4,0x4dc,0x4db,0x4e3,0x4e8,0x4f0, 0x4f7,0x4fe,0x502,0x346,0x346,0x327,0x512,0x50a,0x51a,0x51c,0x524,0x52c,0x530,0x531,0x539,0x541, -0x549,0x531,0x551,0x556,0x549,0x531,0x55e,0x541,0x530,0x562,0x56a,0x541,0x56f,0x346,0x577,0x346, -0x4a1,0x4dd,0x57f,0x541,0x530,0x562,0x586,0x541,0x530,0x346,0x539,0x541,0x346,0x346,0x58c,0x346, -0x346,0x592,0x599,0x346,0x346,0x59d,0x5a5,0x346,0x5a9,0x5b0,0x346,0x5b7,0x5bf,0x5c6,0x5ce,0x346, -0x346,0x5d3,0x5db,0x5e3,0x5eb,0x5f3,0x5fb,0x490,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346, -0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x5ff,0x346,0x346,0x60f,0x617,0x607, +0x549,0x531,0x551,0x556,0x549,0x531,0x55e,0x566,0x530,0x56e,0x576,0x541,0x57b,0x346,0x583,0x346, +0x4a1,0x4dd,0x58b,0x541,0x530,0x56e,0x592,0x541,0x59a,0x59c,0x539,0x541,0x346,0x346,0x5a4,0x346, +0x346,0x5aa,0x5b1,0x346,0x346,0x5b5,0x5bd,0x346,0x5c1,0x5c8,0x346,0x5cf,0x5d7,0x5de,0x5e6,0x346, +0x346,0x5eb,0x5f3,0x5fb,0x603,0x60b,0x613,0x490,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346, +0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x617,0x346,0x346,0x627,0x62f,0x61f, 0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346, -0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x61f,0x61f,0x53d,0x53d,0x346,0x625,0x62d,0x346, -0x635,0x346,0x63d,0x346,0x548,0x643,0x346,0x346,0x346,0x64b,0x346,0x346,0x346,0x346,0x346,0x346, -0x652,0x346,0x659,0x661,0x346,0x669,0x346,0x346,0x671,0x674,0x67c,0x682,0x68a,0x692,0x346,0x699, -0x346,0x69e,0x346,0x6a4,0x6ac,0x346,0x6b0,0x6b8,0x6c0,0x6c5,0x6c8,0x6d0,0x6e0,0x6d8,0x6f0,0x6e8, -0x36d,0x6f8,0x36d,0x700,0x703,0x36d,0x70b,0x36d,0x713,0x71b,0x723,0x72b,0x733,0x73b,0x743,0x74b, -0x753,0x75a,0x346,0x762,0x76a,0x346,0x772,0x77a,0x782,0x78a,0x792,0x79a,0x7a2,0x346,0x346,0x346, +0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x637,0x637,0x53d,0x53d,0x346,0x63d,0x645,0x346, +0x64d,0x346,0x655,0x346,0x548,0x65b,0x346,0x346,0x346,0x663,0x346,0x346,0x346,0x346,0x346,0x346, +0x66a,0x346,0x671,0x679,0x346,0x681,0x346,0x346,0x56d,0x689,0x691,0x697,0x59a,0x69f,0x346,0x6a6, +0x346,0x6ab,0x346,0x6b1,0x6b9,0x346,0x6bd,0x6c5,0x6cd,0x6d2,0x6d5,0x6dd,0x6ed,0x6e5,0x6fd,0x6f5, +0x36d,0x705,0x36d,0x70d,0x710,0x36d,0x718,0x36d,0x720,0x728,0x730,0x738,0x740,0x748,0x750,0x758, +0x760,0x767,0x346,0x76f,0x777,0x346,0x77f,0x787,0x78f,0x797,0x79f,0x7a7,0x7af,0x346,0x346,0x346, 0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346, -0x346,0x346,0x346,0x346,0x346,0x7a5,0x7ab,0x7b1,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346, +0x346,0x346,0x346,0x346,0x346,0x7b2,0x7b8,0x7be,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346, 0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346, 0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346, 0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346, -0x7b9,0x7be,0x7c2,0x7ca,0x36d,0x36d,0x36d,0x7d2,0x7da,0x7e2,0x346,0x7e7,0x346,0x346,0x346,0x7ef, -0x346,0x63a,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346, -0x52f,0x7f7,0x346,0x346,0x7fe,0x346,0x346,0x806,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346, +0x7c6,0x7cb,0x7cf,0x7d7,0x36d,0x36d,0x36d,0x7df,0x7e7,0x7ef,0x346,0x7f4,0x346,0x346,0x346,0x7fc, +0x346,0x652,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346, +0x52f,0x804,0x346,0x346,0x80b,0x346,0x346,0x813,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346, 0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346, 0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346, 0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346, @@ -96,12 +96,12 @@ static const uint16_t ucase_props_trieIndex[11520]={ 0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346, 0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346, 0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346, -0x80e,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346, +0x81b,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346, 0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346, -0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x6a4,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346, -0x814,0x346,0x81c,0x821,0x829,0x346,0x346,0x831,0x839,0x841,0x36d,0x846,0x84e,0x854,0x346,0x85a, -0x862,0x548,0x346,0x346,0x346,0x346,0x869,0x871,0x346,0x878,0x87f,0x346,0x51a,0x884,0x88c,0x548, -0x346,0x892,0x89a,0x89e,0x346,0x8a6,0x8ae,0x8b6,0x346,0x8bc,0x8c0,0x8c8,0x8d8,0x8d0,0x346,0x8e0, +0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x6b1,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346, +0x821,0x346,0x829,0x82e,0x836,0x346,0x346,0x83e,0x846,0x84e,0x36d,0x853,0x85b,0x861,0x346,0x867, +0x86f,0x548,0x346,0x346,0x346,0x346,0x876,0x87e,0x346,0x885,0x88c,0x346,0x51a,0x891,0x899,0x548, +0x346,0x89f,0x8a7,0x8ab,0x346,0x8b3,0x8bb,0x8c3,0x346,0x8c9,0x8cd,0x8d5,0x8e5,0x8dd,0x346,0x8ed, 0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346, 0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346, 0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346, @@ -141,15 +141,15 @@ static const uint16_t ucase_props_trieIndex[11520]={ 0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346, 0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346, 0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346, -0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x8e8,0x346,0x346,0x346,0x346,0x8f0,0x68a,0x346, +0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x8f5,0x346,0x346,0x346,0x346,0x8fd,0x59a,0x346, 0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346, -0x8f5,0x8fd,0x901,0x346,0x346,0x346,0x346,0x329,0x32f,0x909,0x911,0x918,0x4dd,0x346,0x346,0x920, +0x902,0x90a,0x90e,0x346,0x346,0x346,0x346,0x329,0x32f,0x916,0x91e,0x925,0x4dd,0x346,0x346,0x92d, 0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346, 0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346, 0xd1c,0xd1c,0xd34,0xd74,0xdb4,0xdf0,0xe30,0xe70,0xea8,0xee8,0xf28,0xf68,0xfa8,0xfe8,0x1028,0x1068, 0x10a8,0x10e8,0x1128,0x1168,0x1178,0x11ac,0x11e8,0x1228,0x1268,0x12a8,0xd18,0x12dc,0x1310,0x1350,0x136c,0x13a0, -0x9e1,0xa11,0xa51,0xa8c,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0xab5,0x188,0x188, -0x188,0x188,0x188,0x188,0x188,0x188,0x188,0xaf5,0x188,0x188,0xb2a,0xb69,0xba9,0xbe3,0xc1a,0x188, +0x9e1,0xa11,0xa51,0xa8c,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0xab7,0x188,0x188, +0x188,0x188,0x188,0x188,0x188,0x188,0x188,0xaf7,0x188,0x188,0xb2c,0xb6b,0xbab,0xbe5,0xc1c,0x188, 0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188, 0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188, 0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188, @@ -174,50 +174,50 @@ static const uint16_t ucase_props_trieIndex[11520]={ 0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188, 0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188, 0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188, -0xc5a,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346, -0x63e,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x928,0x346,0x346,0x346,0x92b,0x346,0x346,0x346, -0x346,0x933,0x939,0x93d,0x346,0x346,0x941,0x945,0x94b,0x346,0x346,0x346,0x346,0x346,0x346,0x346, +0xc5c,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346, +0x656,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x935,0x346,0x346,0x346,0x938,0x346,0x346,0x346, +0x346,0x940,0x946,0x94a,0x346,0x346,0x94e,0x952,0x958,0x346,0x346,0x346,0x346,0x346,0x346,0x346, 0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346, -0x346,0x953,0x957,0x346,0x346,0x346,0x346,0x346,0x95f,0x346,0x346,0x346,0x346,0x346,0x346,0x346, -0x346,0x346,0x346,0x346,0x346,0x967,0x96b,0x973,0x977,0x346,0x346,0x346,0x346,0x346,0x346,0x346, +0x346,0x960,0x964,0x346,0x346,0x346,0x346,0x346,0x96c,0x346,0x346,0x346,0x346,0x346,0x346,0x346, +0x346,0x346,0x346,0x346,0x346,0x974,0x978,0x980,0x984,0x346,0x346,0x346,0x346,0x346,0x346,0x346, 0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346, -0x346,0x530,0x97c,0x983,0x985,0x68a,0x98d,0x346,0x346,0x995,0x99c,0x346,0x988,0x68a,0x9a2,0x9aa, -0x346,0x346,0x9af,0x346,0x346,0x346,0x346,0x329,0x9b7,0x68a,0x531,0x9bf,0x9c6,0x346,0x346,0x346, -0x346,0x346,0x97c,0x9ce,0x346,0x346,0x9d2,0x9da,0x346,0x346,0x346,0x346,0x346,0x346,0x9de,0x9e6, -0x346,0x346,0x9ee,0x4a1,0x346,0x346,0x9f6,0x346,0x346,0x9fc,0xa04,0x346,0x346,0x346,0x346,0x346, -0x346,0xa0c,0xa14,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346, -0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0xa1c,0x346,0x346, -0x8f0,0xa24,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346, -0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0xa2a,0x346,0xa30,0x671, +0x346,0x530,0x989,0x990,0x59b,0x59a,0x994,0x346,0x346,0x99c,0x9a3,0x346,0x9a9,0x59a,0x9ae,0x9b6, +0x346,0x346,0x9bb,0x346,0x346,0x346,0x346,0x329,0x9c3,0x59a,0x531,0x9cb,0x9d2,0x346,0x346,0x346, +0x346,0x346,0x989,0x9da,0x346,0x346,0x9de,0x9e6,0x346,0x346,0x346,0x346,0x346,0x346,0x9ea,0x9f2, +0x346,0x346,0x9fa,0x4a1,0x346,0x346,0xa02,0x346,0x346,0xa08,0xa10,0x346,0x346,0x346,0x346,0x346, +0x346,0xa18,0xa20,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0xa28,0xa2c,0xa34,0x346, +0xa3b,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0xa42,0x346,0x346, +0x8fd,0xa4a,0x346,0x346,0x346,0xa50,0xa58,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346, +0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0xa5c,0x346, +0xa62,0x56d,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346, 0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346, +0x346,0x346,0x346,0xa68,0x346,0x346,0x59a,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346, 0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346, -0x346,0xa36,0x346,0x346,0x4a1,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346, +0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0xa70,0x56d,0x346,0x346,0x346, 0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346, -0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0xa3e,0x671,0x346,0x346,0x346,0x346,0x346, +0x346,0x346,0x346,0x346,0x346,0x346,0x346,0xa78,0xa80,0xa86,0x346,0x346,0x346,0x346,0xa8e,0x346, +0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0xa96,0xa9e,0xaa3,0xaa9, +0xab1,0xab9,0xac1,0xa9a,0xac9,0xad1,0xad9,0xae0,0xa9b,0xa96,0xa9e,0xa99,0xaa9,0xa9c,0xa97,0xae8, +0xa9a,0xaf0,0xaf8,0xb00,0xb07,0xaf3,0xafb,0xb03,0xb0a,0xaf6,0xb12,0x346,0x346,0x346,0x346,0x346, +0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x846,0xb1a,0x846,0xb21,0xb28, +0xb30,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346, 0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346, -0x346,0x346,0x346,0x346,0x346,0xa46,0xa4e,0xa54,0x346,0x346,0x346,0x346,0xa5c,0x346,0x346,0x346, -0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0xa64,0xa6c,0xa71,0xa77,0xa7f,0xa87, -0xa8f,0xa68,0xa97,0xa9f,0xaa7,0xaae,0xa69,0xa64,0xa6c,0xa67,0xa77,0xa6a,0xa65,0xab6,0xa68,0xabe, -0xac6,0xace,0xad5,0xac1,0xac9,0xad1,0xad8,0xac4,0xae0,0x346,0x346,0x346,0x346,0x346,0x346,0x346, -0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x839,0xae8,0x839,0xaef,0xaf6,0xafe,0x346, +0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0xb38,0xb40,0x346,0x346,0x346, 0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346, 0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346, -0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0xb06,0xb0e,0x346,0x346,0x346,0x346,0x346, 0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346, +0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0xb44,0x346,0xb4c,0xb54,0xb5b, 0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346, 0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346, -0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0xb12,0x346,0xb1a,0xb22,0xb29,0x346,0x346, 0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346, +0x346,0x346,0x346,0x346,0x346,0xa92,0xb63,0xb63,0xb69,0x346,0x346,0x346,0x346,0x346,0x346,0x346, +0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x99e,0x346,0x346,0x346,0x346, 0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346, +0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x530,0x846,0x846,0x846, +0x346,0x346,0x346,0x346,0x846,0x846,0x846,0x846,0x846,0x846,0x846,0xa6c,0x346,0x346,0x346,0x346, 0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346, -0x346,0x346,0x346,0xa60,0xb31,0xb31,0xb37,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346, -0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x997,0x346,0x346,0x346,0x346,0x346,0x346, 0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346, -0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x530,0x839,0x839,0x839,0x346,0x346, -0x346,0x346,0x839,0x839,0x839,0x839,0x839,0x839,0x839,0xa3a,0x346,0x346,0x346,0x346,0x346,0x346, -0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346, -0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346, -0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x326,0x326,0,0,0,0, +0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,4,0,0,0,0,0,0,4,0,0,0,0,0, @@ -361,6 +361,9 @@ static const uint16_t ucase_props_trieIndex[11520]={ 0,0,0,0,0,0,0,0,4,4,0,0,0,4,0,0, 0,0,0,0,0,0,0,0,0,4,4,4,4,4,0,4, 4,0,0,0,0,0x64,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,4,4,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,4,4,4,4,4,4,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0x64,0,0,4,0,4,4,4,4,0,0,0, 0,0,0,0,0,0x64,0,0,0,0,0,0,0,0,4,0, @@ -371,6 +374,9 @@ static const uint16_t ucase_props_trieIndex[11520]={ 0,0,4,4,4,0,4,4,4,0x64,0,0,0,0,0,0, 0,0x64,0x64,0,0,0,0,0,0,0,0,0,0,0,4,0, 0,0,0,0,4,0x64,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,4,4,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0x64,0x64,0,0,0, 0,0,0,0,0,0,0,0,0,0,0x64,0,0,0,0,0, 0,0,4,4,4,0,4,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,4,0,0,4,4,4,4, @@ -428,211 +434,208 @@ static const uint16_t ucase_props_trieIndex[11520]={ 4,0,0,0,0,0,0,4,4,0x44,0x44,0x44,0x44,0x44,0x44,0x44, 0x44,0,0,0x64,0,0,0,0,0,0,0,4,0,0,0,0, 0,0,0,0,0x44,0x44,0x44,0x44,0x44,0x64,0x64,0x64,0x64,0x64,0x64,0x44, -0x44,0x64,4,0,4,4,4,4,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0x64,0,4,4,4,4,4,0,4,0,0,0, -0,0,4,0,0x60,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0x44,0x64,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0,0,0,0, -0,0,0,0,0,0,0,0,4,4,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,4,4,4,4,0,0, -4,4,0x60,0x64,4,4,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0x64,0,4,4,0,0, -0,4,0,4,4,4,0x60,0x60,0,0,0,0,0,0,0,0, -0,0,0,0,4,4,4,4,4,4,4,4,0,0,4,0x64, +0x44,0x64,4,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0x64,0,4,4,4,4,4,0, +4,0,0,0,0,0,4,0,0x60,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,4,4,4,4,4,4,0,0, -0x5cd9,0x5d39,0x5d99,0x5df9,0x5e59,0x5ef9,0x5f99,0x5ff9,0x6059,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0x44,0x44,0x44,0,0x64,0x64,0x64,0x64,0x64,0x64,0x44,0x44,0x64,0x64,0x64,0x64, -0x44,0,0x64,0x64,0x64,0x64,0x64,0x64,0x64,0,0,0,0,0x64,0,0, -0,0,0,0,0x44,0,0,0,0x44,0x44,0,0,0,0,0,0, -1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +0,0,0,0,0,0,0,0x44,0x64,0x44,0x44,0x44,0x44,0x44,0x44,0x44, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,4, +4,4,0,0,4,4,0x60,0x64,4,4,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0x64,0, +4,4,0,0,0,4,0,4,4,4,0x60,0x60,0,0,0,0, +0,0,0,0,0,0,0,0,4,4,4,4,4,4,4,4, +0,0,4,0x64,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,4,4,4,4, +4,4,0,0,0x5cd9,0x5d39,0x5d99,0x5df9,0x5e59,0x5ef9,0x5f99,0x5ff9,0x6059,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0x44,0x44,0x44,0,0x64,0x64,0x64,0x64,0x64,0x64,0x44,0x44, +0x64,0x64,0x64,0x64,0x44,0,0x64,0x64,0x64,0x64,0x64,0x64,0x64,0,0,0, +0,0x64,0,0,0,0,0,0,0x44,0,0,0,0x44,0x44,0,0, +0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,5,5,5,5,5,5,5,5,5,5,5,5, 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, +5,5,5,5,5,5,0x25,5,5,5,5,5,5,5,5,1, +1,1,1,1,1,1,1,1,1,1,1,1,5,0x60b9,1,1, +1,0x60f9,1,1,5,5,5,5,0x25,5,5,5,0x25,5,5,5, 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,0x25,5,5,5,5,5,5,5,5,1,1,1,1,1, -1,1,1,1,1,1,1,1,5,0x60b9,1,1,1,0x60f9,1,1, -5,5,5,5,0x25,5,5,5,0x25,5,5,5,5,5,5,5, -5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, -1,1,1,1,1,1,0x21,1,1,1,1,5,5,5,5,5, -0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44, -0x44,0x44,0x44,0x44,0x44,0x44,0,0,0,0,0,0x44,0x64,0x64,0x44,0x64, -0x44,0x44,0x64,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x64,0x44,0x44,0x64,0x64,0x64, -0x64,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44, -0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0x8a,0xffa9,0x8a,0xff89, +5,5,5,5,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,0x21,1,1,1,1,5, +5,5,5,5,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44, +0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x64,0x64,0x64,0x64,0,0x44, +0x64,0x64,0x44,0x64,0x44,0x44,0x64,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x64,0x44, +0x44,0x64,0x64,0x64,0x64,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44, +0x44,0x44,0x44,0x44,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89, +0x8a,0xffa9,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89, +0x8a,0xff89,0x8a,0xff89,0x613a,0x61b9,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89, 0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89, -0x613a,0x61b9,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89, +0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0x6239,0x6339,0x6439,0x6539,0x6639,0x6739,1,1,0x679a,1, +0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0x8a,0xffa9,0x8a,0xff89,0x8a,0xff89, 0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89, -0x8a,0xff89,0x6239,0x6339,0x6439,0x6539,0x6639,0x6739,1,1,0x679a,1,0x8a,0xff89,0x8a,0xff89, -0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0x8a,0xffa9,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89, -0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0x409,0x409,0x409,0x409, -0x409,0x409,0x409,0x409,0xfc0a,0xfc0a,0xfc0a,0xfc0a,0xfc0a,0xfc0a,0xfc0a,0xfc0a,0x409,0x409,0x409,0x409, -0x409,0x409,0,0,0xfc0a,0xfc0a,0xfc0a,0xfc0a,0xfc0a,0xfc0a,0,0,0x409,0x409,0x409,0x409, -0x409,0x409,0x409,0x409,0xfc0a,0xfc0a,0xfc0a,0xfc0a,0xfc0a,0xfc0a,0xfc0a,0xfc0a,0x409,0x409,0x409,0x409, -0x409,0x409,0x409,0x409,0xfc0a,0xfc0a,0xfc0a,0xfc0a,0xfc0a,0xfc0a,0xfc0a,0xfc0a,0x409,0x409,0x409,0x409, -0x409,0x409,0,0,0xfc0a,0xfc0a,0xfc0a,0xfc0a,0xfc0a,0xfc0a,0,0,0x6839,0x409,0x6939,0x409, -0x6a99,0x409,0x6bf9,0x409,0,0xfc0a,0,0xfc0a,0,0xfc0a,0,0xfc0a,0x409,0x409,0x409,0x409, -0x409,0x409,0x409,0x409,0xfc0a,0xfc0a,0xfc0a,0xfc0a,0xfc0a,0xfc0a,0xfc0a,0xfc0a,0x2509,0x2509,0x2b09,0x2b09, -0x2b09,0x2b09,0x3209,0x3209,0x4009,0x4009,0x3809,0x3809,0x3f09,0x3f09,0,0,0x6d59,0x6e39,0x6f19,0x6ff9, -0x70d9,0x71b9,0x7299,0x7379,0x745b,0x753b,0x761b,0x76fb,0x77db,0x78bb,0x799b,0x7a7b,0x7b59,0x7c39,0x7d19,0x7df9, -0x7ed9,0x7fb9,0x8099,0x8179,0x825b,0x833b,0x841b,0x84fb,0x85db,0x86bb,0x879b,0x887b,0x8959,0x8a39,0x8b19,0x8bf9, -0x8cd9,0x8db9,0x8e99,0x8f79,0x905b,0x913b,0x921b,0x92fb,0x93db,0x94bb,0x959b,0x967b,0x409,0x409,0x9759,0x9859, -0x9939,0,0x9a39,0x9b39,0xfc0a,0xfc0a,0xdb0a,0xdb0a,0x9c9b,4,0x9d79,4,4,4,0x9e19,0x9f19, -0x9ff9,0,0xa0f9,0xa1f9,0xd50a,0xd50a,0xd50a,0xd50a,0xa35b,4,4,4,0x409,0x409,0xa439,0xa599, -0,0,0xa739,0xa839,0xfc0a,0xfc0a,0xce0a,0xce0a,0,4,4,4,0x409,0x409,0xa999,0xaaf9, -0xac99,0x389,0xad99,0xae99,0xfc0a,0xfc0a,0xc80a,0xc80a,0xfc8a,4,4,4,0,0,0xaff9,0xb0f9, -0xb1d9,0,0xb2d9,0xb3d9,0xc00a,0xc00a,0xc10a,0xc10a,0xb53b,4,4,0,0,0,0,0, -0,0,0,0,0,0,0,4,4,4,4,4,0,0,0,0, -0,0,0,0,4,4,0,0,0,0,0,0,4,0,0,4, -0,0,4,4,4,4,4,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,4,4,4,4,4,0,4,4, -4,4,4,4,4,4,4,4,0,0x25,0,0,0,0,0,0, -0,0,0,0,0,0,0,5,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,5,5,5,5,5,5,5,5, -5,5,5,5,5,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0x44,0x44,0x64,0x64,0x44,0x44,0x44,0x44, -0x64,0x64,0x64,0x44,0x44,4,4,4,4,0x44,4,4,4,0x64,0x64,0x44, -0x64,0x44,0x64,0x64,0x64,0x64,0x64,0x64,0x44,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,2, -0,0,1,2,2,2,1,1,2,2,2,1,0,2,0,0, -0,2,2,2,2,2,0,0,0,0,0,0,2,0,0xb61a,0, -2,0,0xb69a,0xb71a,2,2,0,1,2,2,0xe0a,2,1,0,0,0, -0,1,0,0,1,1,2,2,0,0,0,0,0,2,1,1, -0x21,0x21,0,0,0,0,0xf209,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0x80a,0x80a,0x80a,0x80a,0x80a,0x80a,0x80a,0x80a, -0x80a,0x80a,0x80a,0x80a,0x80a,0x80a,0x80a,0x80a,0xf809,0xf809,0xf809,0xf809,0xf809,0xf809,0xf809,0xf809, -0xf809,0xf809,0xf809,0xf809,0xf809,0xf809,0xf809,0xf809,0,0,0,0x8a,0xff89,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0xd0a,0xd0a,0xd0a,0xd0a,0xd0a,0xd0a, -0xd0a,0xd0a,0xd0a,0xd0a,0xd0a,0xd0a,0xd0a,0xd0a,0xd0a,0xd0a,0xd0a,0xd0a,0xf309,0xf309,0xf309,0xf309, -0xf309,0xf309,0xf309,0xf309,0xf309,0xf309,0xf309,0xf309,0xf309,0xf309,0xf309,0xf309,0xf309,0xf309,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0x180a,0x180a,0x180a,0x180a,0x180a,0x180a,0x180a,0x180a,0x180a,0x180a,0x180a,0x180a, +0x409,0x409,0x409,0x409,0x409,0x409,0x409,0x409,0xfc0a,0xfc0a,0xfc0a,0xfc0a,0xfc0a,0xfc0a,0xfc0a,0xfc0a, +0x409,0x409,0x409,0x409,0x409,0x409,0,0,0xfc0a,0xfc0a,0xfc0a,0xfc0a,0xfc0a,0xfc0a,0,0, +0x409,0x409,0x409,0x409,0x409,0x409,0x409,0x409,0xfc0a,0xfc0a,0xfc0a,0xfc0a,0xfc0a,0xfc0a,0xfc0a,0xfc0a, +0x409,0x409,0x409,0x409,0x409,0x409,0x409,0x409,0xfc0a,0xfc0a,0xfc0a,0xfc0a,0xfc0a,0xfc0a,0xfc0a,0xfc0a, +0x409,0x409,0x409,0x409,0x409,0x409,0,0,0xfc0a,0xfc0a,0xfc0a,0xfc0a,0xfc0a,0xfc0a,0,0, +0x6839,0x409,0x6939,0x409,0x6a99,0x409,0x6bf9,0x409,0,0xfc0a,0,0xfc0a,0,0xfc0a,0,0xfc0a, +0x409,0x409,0x409,0x409,0x409,0x409,0x409,0x409,0xfc0a,0xfc0a,0xfc0a,0xfc0a,0xfc0a,0xfc0a,0xfc0a,0xfc0a, +0x2509,0x2509,0x2b09,0x2b09,0x2b09,0x2b09,0x3209,0x3209,0x4009,0x4009,0x3809,0x3809,0x3f09,0x3f09,0,0, +0x6d59,0x6e39,0x6f19,0x6ff9,0x70d9,0x71b9,0x7299,0x7379,0x745b,0x753b,0x761b,0x76fb,0x77db,0x78bb,0x799b,0x7a7b, +0x7b59,0x7c39,0x7d19,0x7df9,0x7ed9,0x7fb9,0x8099,0x8179,0x825b,0x833b,0x841b,0x84fb,0x85db,0x86bb,0x879b,0x887b, +0x8959,0x8a39,0x8b19,0x8bf9,0x8cd9,0x8db9,0x8e99,0x8f79,0x905b,0x913b,0x921b,0x92fb,0x93db,0x94bb,0x959b,0x967b, +0x409,0x409,0x9759,0x9859,0x9939,0,0x9a39,0x9b39,0xfc0a,0xfc0a,0xdb0a,0xdb0a,0x9c9b,4,0x9d79,4, +4,4,0x9e19,0x9f19,0x9ff9,0,0xa0f9,0xa1f9,0xd50a,0xd50a,0xd50a,0xd50a,0xa35b,4,4,4, +0x409,0x409,0xa439,0xa599,0,0,0xa739,0xa839,0xfc0a,0xfc0a,0xce0a,0xce0a,0,4,4,4, +0x409,0x409,0xa999,0xaaf9,0xac99,0x389,0xad99,0xae99,0xfc0a,0xfc0a,0xc80a,0xc80a,0xfc8a,4,4,4, +0,0,0xaff9,0xb0f9,0xb1d9,0,0xb2d9,0xb3d9,0xc00a,0xc00a,0xc10a,0xc10a,0xb53b,4,4,0, +0,0,0,0,0,0,0,0,0,0,0,4,4,4,4,4, +0,0,0,0,0,0,0,0,4,4,0,0,0,0,0,0, +4,0,0,4,0,0,4,4,4,4,4,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,4,4,4,4, +4,0,4,4,4,4,4,4,4,4,4,4,0,0x25,0,0, +0,0,0,0,0,0,0,0,0,0,0,5,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,5,5,5,5, +5,5,5,5,5,5,5,5,5,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0x44,0x44,0x64,0x64, +0x44,0x44,0x44,0x44,0x64,0x64,0x64,0x44,0x44,4,4,4,4,0x44,4,4, +4,0x64,0x64,0x44,0x64,0x44,0x64,0x64,0x64,0x64,0x64,0x64,0x44,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0, +0,0,0,2,0,0,1,2,2,2,1,1,2,2,2,1, +0,2,0,0,0,2,2,2,2,2,0,0,0,0,0,0, +2,0,0xb61a,0,2,0,0xb69a,0xb71a,2,2,0,1,2,2,0xe0a,2, +1,0,0,0,0,1,0,0,1,1,2,2,0,0,0,0, +0,2,1,1,0x21,0x21,0,0,0,0,0xf209,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0x80a,0x80a,0x80a,0x80a, +0x80a,0x80a,0x80a,0x80a,0x80a,0x80a,0x80a,0x80a,0x80a,0x80a,0x80a,0x80a,0xf809,0xf809,0xf809,0xf809, +0xf809,0xf809,0xf809,0xf809,0xf809,0xf809,0xf809,0xf809,0xf809,0xf809,0xf809,0xf809,0,0,0,0x8a, +0xff89,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0xd0a,0xd0a, +0xd0a,0xd0a,0xd0a,0xd0a,0xd0a,0xd0a,0xd0a,0xd0a,0xd0a,0xd0a,0xd0a,0xd0a,0xd0a,0xd0a,0xd0a,0xd0a, +0xf309,0xf309,0xf309,0xf309,0xf309,0xf309,0xf309,0xf309,0xf309,0xf309,0xf309,0xf309,0xf309,0xf309,0xf309,0xf309, +0xf309,0xf309,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0x180a,0x180a,0x180a,0x180a,0x180a,0x180a,0x180a,0x180a, 0x180a,0x180a,0x180a,0x180a,0x180a,0x180a,0x180a,0x180a,0x180a,0x180a,0x180a,0x180a,0x180a,0x180a,0x180a,0x180a, -0x180a,0x180a,0x180a,0x180a,0x180a,0x180a,0x180a,0,0xe809,0xe809,0xe809,0xe809,0xe809,0xe809,0xe809,0xe809, +0x180a,0x180a,0x180a,0x180a,0x180a,0x180a,0x180a,0x180a,0x180a,0x180a,0x180a,0,0xe809,0xe809,0xe809,0xe809, 0xe809,0xe809,0xe809,0xe809,0xe809,0xe809,0xe809,0xe809,0xe809,0xe809,0xe809,0xe809,0xe809,0xe809,0xe809,0xe809, -0xe809,0xe809,0xe809,0xe809,0xe809,0xe809,0xe809,0,0x8a,0xff89,0xb79a,0xb7da,0xb81a,0xb859,0xb899,0x8a, -0xff89,0x8a,0xff89,0x8a,0xff89,0xb8da,0xb91a,0xb95a,0xb99a,1,0x8a,0xff89,1,0x8a,0xff89,1, -1,1,1,1,0x25,5,0xb9da,0xba1a,0x8a,0xff89,0x8a,0xff89,1,0,0,0, -0,0,0,0x8a,0xff89,0x8a,0xff89,0x44,0x44,0x44,0x8a,0xff89,0,0,0,0, -0,0,0,0,0,0,0,0,0xba59,0xba99,0xbad9,0xbb19,0xbb59,0xbb99,0xbbd9,0xbc19, -0xbc59,0xbc99,0xbcd9,0xbd19,0xbd59,0xbd99,0xbdd9,0xbe19,0xbe59,0xbe99,0xbed9,0xbf19,0xbf59,0xbf99,0xbfd9,0xc019, -0xc059,0xc099,0xc0d9,0xc119,0xc159,0xc199,0xc1d9,0xc219,0xc259,0xc299,0xc2d9,0xc319,0xc359,0xc399,0,0xc3d9, -0,0,0,0,0,0xc419,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0x64,0x44,0x44,0x44,0x44, +0xe809,0xe809,0xe809,0xe809,0xe809,0xe809,0xe809,0xe809,0xe809,0xe809,0xe809,0,0x8a,0xff89,0xb79a,0xb7da, +0xb81a,0xb859,0xb899,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0xb8da,0xb91a,0xb95a,0xb99a,1,0x8a,0xff89, +1,0x8a,0xff89,1,1,1,1,1,0x25,5,0xb9da,0xba1a,0x8a,0xff89,0x8a,0xff89, +1,0,0,0,0,0,0,0x8a,0xff89,0x8a,0xff89,0x44,0x44,0x44,0x8a,0xff89, +0,0,0,0,0,0,0,0,0,0,0,0,0xba59,0xba99,0xbad9,0xbb19, +0xbb59,0xbb99,0xbbd9,0xbc19,0xbc59,0xbc99,0xbcd9,0xbd19,0xbd59,0xbd99,0xbdd9,0xbe19,0xbe59,0xbe99,0xbed9,0xbf19, +0xbf59,0xbf99,0xbfd9,0xc019,0xc059,0xc099,0xc0d9,0xc119,0xc159,0xc199,0xc1d9,0xc219,0xc259,0xc299,0xc2d9,0xc319, +0xc359,0xc399,0,0xc3d9,0,0,0,0,0,0xc419,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0x64, +0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44, 0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44, -0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0,0,0,0, -0,0,0,0,0,0,0x64,0x64,0x64,0x64,0x60,0x60,0,4,4,4, -4,4,0,0,0,0,0,4,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0x64,0x64,0x64,0x64,0x60,0x60, +0,4,4,4,4,4,0,0,0,0,0,4,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0x64,0x64,4,4,4,4,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0x64,0x64,4,4,4,4,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,4,4,4,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,4,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0, +0,0,0,0,0,0,0,0,4,4,4,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0xc45a,0xc4d9,0x8a,0xff89,0x8a,0xff89, +0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0xc45a,0xc4d9, 0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89, -0x8a,0xff89,0,0x44,4,4,4,0,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44, -0x44,0x44,0,4,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89, +0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0,0x44,4,4,4,0,0x44,0x44,0x44,0x44, +0x44,0x44,0x44,0x44,0x44,0x44,0,4,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89, 0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89, -5,5,0x44,0x44,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0x44,0x44,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,4,4,4,4,4,4,4,4,4,4,4,4, +0x8a,0xff89,0x8a,0xff89,5,5,0x44,0x44,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0x44,0x44,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,4,4,4,4,4,4,4,4, 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, -4,4,4,4,4,4,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89, -0x8a,0xff89,0x8a,0xff89,1,1,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89, -0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,5,1,1,1,1,1,1,1, -1,0x8a,0xff89,0x8a,0xff89,0xc55a,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89, -4,4,4,0x8a,0xff89,0xc59a,1,0,0x8a,0xff89,0x8a,0xff89,1,1,0x8a,0xff89, -0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0xc5da,0xc61a,0xc65a,0xc69a,0xc6da,0, -0xc71a,0xc75a,0xc79a,0xc7da,0x8a,0xff89,0x8a,0xff89,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -5,5,1,0,0,0,0,0,0,0,4,0,0,0,0x64,0, -0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0x64,4,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44, -0x44,0x44,0x44,0x44,0x44,0x44,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,4,4,4,4,4,0x64,0x64,0x64,0,0, +4,4,4,4,4,4,4,4,4,4,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89, +0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,1,1,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89, +0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,5,1,1,1, +1,1,1,1,1,0x8a,0xff89,0x8a,0xff89,0xc55a,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89, +0x8a,0xff89,0x8a,0xff89,4,4,4,0x8a,0xff89,0xc59a,1,0,0x8a,0xff89,0x8a,0xff89, +1,1,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0xc5da,0xc61a, +0xc65a,0xc69a,0xc6da,0,0xc71a,0xc75a,0xc79a,0xc7da,0x8a,0xff89,0x8a,0xff89,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,5,5,1,0,0,0,0,0,0,0,4,0, +0,0,0x64,0,0,0,0,4,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0x64,4,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,4,4,4,4,4,4,4,4,4,4,4,0,0x60, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0x64,0,0,4,4,4,4,0,0,4,0,0,0, -0x60,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,4,4,4,4,4,4,0,0,4,4,0,0,4,4,0, -0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,0, -0,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44, +0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,4,4,4,4,4,0x64, +0x64,0x64,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,4,4,4,4,4,4,4,4,4, +4,4,0,0x60,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0x64,0,0,4,4,4,4,0,0, +4,0,0,0,0x60,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,4,4,4,4,4,4,0,0,4,4,0, +0,4,4,0,0,0,0,0,0,0,0,0,0,0,0,4, +0,0,0,0,0,0,0,0,4,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0, 0,0,0,0,0,0,0,0,4,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0x44,0,0x44,0x44, +0x64,0,0,0x44,0x44,0,0,0,0,0,0x44,0x44,0,0x44,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,4,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,4,4,0,0,0,0,0,4, +4,0,0x64,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,0xc819,1,1,1,1,1,1,1,4, +5,5,5,5,1,1,1,1,1,1,0,0,0,0,0,0, +0,0,0,0,0xc859,0xc8b9,0xc919,0xc979,0xc9d9,0xca39,0xca99,0xcaf9,0xcb59,0xcbb9,0xcc19,0xcc79, +0xccd9,0xcd39,0xcd99,0xcdf9,0xda59,0xdab9,0xdb19,0xdb79,0xdbd9,0xdc39,0xdc99,0xdcf9,0xdd59,0xddb9,0xde19,0xde79, +0xded9,0xdf39,0xdf99,0xdff9,0xe059,0xe0b9,0xe119,0xe179,0xe1d9,0xe239,0xe299,0xe2f9,0xe359,0xe3b9,0xe419,0xe479, +0xe4d9,0xe539,0xe599,0xe5f9,0xce59,0xceb9,0xcf19,0xcf79,0xcfd9,0xd039,0xd099,0xd0f9,0xd159,0xd1b9,0xd219,0xd279, +0xd2d9,0xd339,0xd399,0xd3f9,0xd459,0xd4b9,0xd519,0xd579,0xd5d9,0xd639,0xd699,0xd6f9,0xd759,0xd7b9,0xd819,0xd879, +0xd8d9,0xd939,0xd999,0xd9f9,0,0,0,0,0,4,0,0,4,0,0,0, +0,0x64,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0xe659,0xe759,0xe859,0xe959,0xeab9,0xec19,0xed59,0,0,0,0,0, +0,0,0,0,0,0,0,0xee99,0xef99,0xf099,0xf199,0xf299,0,0,0,0, +0,0,0x64,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,4,4,4,4,4,4,4,4,4,4, +4,4,4,4,4,4,4,4,0,0,0,4,0,0,0,0, +0,0,0,0,0,0,0,0,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x64, +0x64,0x64,0x64,0x64,0x64,0x64,0x44,0x44,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,4,0,0,4,0,0, +0,0,0,0,0,0,0,0,0,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a, +0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a, +0x100a,0x100a,0x100a,0,0,0,4,0,4,0xf009,0xf009,0xf009,0xf009,0xf009,0xf009,0xf009, +0xf009,0xf009,0xf009,0xf009,0xf009,0xf009,0xf009,0xf009,0xf009,0xf009,0xf009,0xf009,0xf009,0xf009,0xf009,0xf009, +0xf009,0xf009,0xf009,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0x44,0,0x44,0x44,0x64,0,0,0x44, -0x44,0,0,0,0,0,0x44,0x44,0,0x44,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,4,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,4,4,0,0,0,0,0,4,4,0,0x64,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, -1,1,1,0xc819,1,1,1,1,1,1,1,4,5,5,5,5, -1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0, -0xc859,0xc8b9,0xc919,0xc979,0xc9d9,0xca39,0xca99,0xcaf9,0xcb59,0xcbb9,0xcc19,0xcc79,0xccd9,0xcd39,0xcd99,0xcdf9, -0xda59,0xdab9,0xdb19,0xdb79,0xdbd9,0xdc39,0xdc99,0xdcf9,0xdd59,0xddb9,0xde19,0xde79,0xded9,0xdf39,0xdf99,0xdff9, -0xe059,0xe0b9,0xe119,0xe179,0xe1d9,0xe239,0xe299,0xe2f9,0xe359,0xe3b9,0xe419,0xe479,0xe4d9,0xe539,0xe599,0xe5f9, -0xce59,0xceb9,0xcf19,0xcf79,0xcfd9,0xd039,0xd099,0xd0f9,0xd159,0xd1b9,0xd219,0xd279,0xd2d9,0xd339,0xd399,0xd3f9, -0xd459,0xd4b9,0xd519,0xd579,0xd5d9,0xd639,0xd699,0xd6f9,0xd759,0xd7b9,0xd819,0xd879,0xd8d9,0xd939,0xd999,0xd9f9, -0,0,0,0,0,4,0,0,4,0,0,0,0,0x64,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0xe659,0xe759,0xe859,0xe959,0xeab9,0xec19,0xed59,0,0,0,0,0,0,0,0,0, -0,0,0,0xee99,0xef99,0xf099,0xf199,0xf299,0,0,0,0,0,0,0x64,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,4,4,4,4,4,4,4,4,4,4,4,4,4,4, -4,4,4,4,0,0,0,4,0,0,0,0,0,0,0,0, -0,0,0,0,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x64,0x64,0x64,0x64,0x64, -0x64,0x64,0x44,0x44,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,4,0,0,4,0,0,0,0,0,0, -0,0,0,0,0,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a, -0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0, -0,0,4,0,4,0xf009,0xf009,0xf009,0xf009,0xf009,0xf009,0xf009,0xf009,0xf009,0xf009,0xf009, -0xf009,0xf009,0xf009,0xf009,0xf009,0xf009,0xf009,0xf009,0xf009,0xf009,0xf009,0xf009,0xf009,0xf009,0xf009,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,4,4,4,0,0,0,0, -0x64,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,4,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,4,4,4, +0,0,0,0,0x64,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0x44,0x44,0x44,0x44,0x44,0,0,0,0,0,0x140a,0x140a,0x140a,0x140a, +0,0,0,0,0,0,0x44,0x44,0x44,0x44,0x44,0,0,0,0,0, +0x140a,0x140a,0x140a,0x140a,0x140a,0x140a,0x140a,0x140a,0x140a,0x140a,0x140a,0x140a,0x140a,0x140a,0x140a,0x140a, 0x140a,0x140a,0x140a,0x140a,0x140a,0x140a,0x140a,0x140a,0x140a,0x140a,0x140a,0x140a,0x140a,0x140a,0x140a,0x140a, -0x140a,0x140a,0x140a,0x140a,0x140a,0x140a,0x140a,0x140a,0x140a,0x140a,0x140a,0x140a,0xec09,0xec09,0xec09,0xec09, 0xec09,0xec09,0xec09,0xec09,0xec09,0xec09,0xec09,0xec09,0xec09,0xec09,0xec09,0xec09,0xec09,0xec09,0xec09,0xec09, -0xec09,0xec09,0xec09,0xec09,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0x140a,0x140a,0x140a,0x140a,0x140a,0x140a,0x140a,0x140a,0x140a,0x140a,0x140a,0x140a, -0x140a,0x140a,0x140a,0x140a,0x140a,0x140a,0x140a,0x140a,0,0,0,0,0xec09,0xec09,0xec09,0xec09, +0xec09,0xec09,0xec09,0xec09,0xec09,0xec09,0xec09,0xec09,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0x140a,0x140a,0x140a,0x140a,0x140a,0x140a,0x140a,0x140a, +0x140a,0x140a,0x140a,0x140a,0x140a,0x140a,0x140a,0x140a,0x140a,0x140a,0x140a,0x140a,0,0,0,0, 0xec09,0xec09,0xec09,0xec09,0xec09,0xec09,0xec09,0xec09,0xec09,0xec09,0xec09,0xec09,0xec09,0xec09,0xec09,0xec09, -0xec09,0xec09,0xec09,0xec09,0xec09,0xec09,0xec09,0xec09,0,0,0,0,0,4,4,4, -0,4,4,0,0,0,0,0,4,0x64,4,0x44,0,0,0,0, +0xec09,0xec09,0xec09,0xec09,0xec09,0xec09,0xec09,0xec09,0xec09,0xec09,0xec09,0xec09,0,0,0,0, +0,4,4,4,0,4,4,0,0,0,0,0,4,0x64,4,0x44, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0x44,0x64,0x64,0,0,0,0,0x64, +0,0,0,0,0,0x44,0x64,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0x44,0x64,0x64,0,0,0,0,0x64,0,0,0,0, -0,0x44,0x64,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0x200a,0x200a,0x200a,0x200a, 0x200a,0x200a,0x200a,0x200a,0x200a,0x200a,0x200a,0x200a,0x200a,0x200a,0x200a,0x200a,0x200a,0x200a,0x200a,0x200a, -0x200a,0x200a,0x200a,0x200a,0x200a,0x200a,0x200a,0x200a,0x200a,0x200a,0x200a,0x200a,0x200a,0x200a,0x200a,0, -0,0,0,0,0,0,0,0,0,0,0,0,0xe009,0xe009,0xe009,0xe009, +0x200a,0x200a,0x200a,0x200a,0x200a,0x200a,0x200a,0x200a,0x200a,0x200a,0x200a,0x200a,0x200a,0x200a,0x200a,0x200a, +0x200a,0x200a,0x200a,0,0,0,0,0,0,0,0,0,0,0,0,0, 0xe009,0xe009,0xe009,0xe009,0xe009,0xe009,0xe009,0xe009,0xe009,0xe009,0xe009,0xe009,0xe009,0xe009,0xe009,0xe009, -0xe009,0xe009,0xe009,0xe009,0xe009,0xe009,0xe009,0xe009,0xe009,0xe009,0xe009,0xe009,0xe009,0xe009,0xe009,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,4,4,4,4,4,4,4,4, -4,4,0x64,0,0,0,0,0,0,0,0,0,0,0,0,0, +0xe009,0xe009,0xe009,0xe009,0xe009,0xe009,0xe009,0xe009,0xe009,0xe009,0xe009,0xe009,0xe009,0xe009,0xe009,0xe009, +0xe009,0xe009,0xe009,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,4,4,4,4, +4,4,4,4,4,4,0x64,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0x64,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,4,4,4,4,0,0,0x64,0x64,0, -0,4,0,0,0x44,0x44,0x44,0,0,0,0,0,0,0,0,0, +0,0,0,4,4,4,4,0,0,0x64,0x64,0,0,4,0,0, +0x44,0x44,0x44,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,4,4,4,4,4,0,4,4,4, -4,4,4,0x64,0x64,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,4,4,4,4,4,0,4,4,4,4,4,4,0x64, +0x64,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0x64,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,4, 4,4,4,4,4,4,4,0,0x60,0,0,0,0,0,0,0, 0,0,0x64,4,4,0,0,0,0,0,0,0,0,0,0,0, @@ -663,79 +666,89 @@ static const uint16_t ucase_props_trieIndex[11520]={ 0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a, 0xf009,0xf009,0xf009,0xf009,0xf009,0xf009,0xf009,0xf009,0xf009,0xf009,0xf009,0xf009,0xf009,0xf009,0xf009,0xf009, 0xf009,0xf009,0xf009,0xf009,0xf009,0xf009,0xf009,0xf009,0xf009,0xf009,0xf009,0xf009,0xf009,0xf009,0xf009,0xf009, +0,4,4,4,4,4,4,0,0,4,4,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -4,4,4,4,4,4,4,0,4,4,4,4,4,4,0,0x64, -4,4,4,4,4,4,4,4,0,0,4,4,4,4,4,4, -4,0,4,4,0,4,4,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0x64,0x64,0x64,0x64,0x64,0,0,0, +0,0,0,4,0x64,4,4,4,4,0,0,4,4,4,4,0, +0,0,0,0,0,0,0,0x64,0,0,0,0,0,0,0,0, +0,4,4,4,4,4,4,0,0,4,4,4,0,0,0,0, +0,0,0,0,0,0,4,4,4,4,4,4,4,4,4,4, +4,4,4,0,4,0x64,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,4,4,4,4,4,4,4,0, +4,4,4,4,4,4,0,0x64,4,4,4,4,4,4,4,4, +0,0,4,4,4,4,4,4,4,0,4,4,0,4,4,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0x44,0x44,0x44,0x44,0x44,0x44,0x44,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,4,4,4,4,4,4,4,4,4, -4,4,4,4,4,4,4,4,0,0,0,0,0,0,0,0, +0,4,4,4,4,4,4,0,0,0,4,0,4,4,0,4, +4,4,0x64,4,0x64,0x64,0,4,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0x64,0x64,0x64,0x64,0x64,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4, +4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,4,0x64,0,0,0,0,0,0,0x60,0x60,0x64, -0x64,0x64,0,0,0,0x60,0x60,0x60,0x60,0x60,0x60,4,4,4,4,4, -4,4,4,0x64,0x64,0x64,0x64,0x64,0x64,0x64,0x64,0,0,0x44,0x44,0x44, -0x44,0x44,0x64,0x64,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0x44,0x44,0x44,0x44,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,4,0x64,0, +0,0,0,0,0,0x60,0x60,0x64,0x64,0x64,0,0,0,0x60,0x60,0x60, +0x60,0x60,0x60,4,4,4,4,4,4,4,4,0x64,0x64,0x64,0x64,0x64, +0x64,0x64,0x64,0,0,0x44,0x44,0x44,0x44,0x44,0x64,0x64,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0x44,0x44,0x44,0,0,0,0,0,0,0,0,0,0,0, +0,0,0x44,0x44,0x44,0x44,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0x44,0x44,0x44,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,2,2,2,2,2,2,2,2, 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, +2,2,1,1,1,1,1,1,1,1,0x21,0x21,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,2,2,2,2, 2,2,2,2,2,2,2,2,2,2,1,1,1,1,1,1, -1,1,0x21,0x21,1,1,1,1,1,1,1,1,1,1,1,1, -1,1,1,1,2,2,2,2,2,2,2,2,2,2,2,2, -2,2,1,1,1,1,1,1,1,0,0x21,0x21,1,1,1,1, -1,1,1,1,2,2,2,2,2,2,2,2,2,2,2,2, -2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,1, -1,1,1,1,1,1,0x21,0x21,1,1,1,1,1,1,1,1, -1,1,1,1,1,1,1,1,2,0,2,2,0,0,2,0, -0,2,2,0,0,2,2,2,2,0,2,2,2,2,2,2, -2,2,1,1,1,1,0,1,0,1,0x21,0x21,1,1,1,1, -0,1,1,1,1,1,1,1,1,1,1,1,2,2,2,2, -2,2,2,2,2,2,2,2,2,2,2,2,1,1,1,1, -2,2,0,2,2,2,2,0,0,2,2,2,2,2,2,2, -2,0,2,2,2,2,2,2,2,0,1,1,1,1,1,1, -1,1,0x21,0x21,1,1,1,1,1,1,1,1,1,1,1,1, -1,1,1,1,2,2,0,2,2,2,2,0,2,2,2,2, -2,0,2,0,0,0,2,2,2,2,2,2,2,0,1,1, -1,1,1,1,1,1,0x21,0x21,1,1,1,1,1,1,1,1, +1,0,0x21,0x21,1,1,1,1,1,1,1,1,2,2,2,2, +2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, +2,2,2,2,2,2,1,1,1,1,1,1,1,1,0x21,0x21, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +2,0,2,2,0,0,2,0,0,2,2,0,0,2,2,2, +2,0,2,2,2,2,2,2,2,2,1,1,1,1,0,1, +0,1,0x21,0x21,1,1,1,1,0,1,1,1,1,1,1,1, 1,1,1,1,2,2,2,2,2,2,2,2,2,2,2,2, -2,2,2,2,2,2,2,2,1,1,1,1,1,1,1,1, -1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2, -2,2,2,2,2,2,2,2,1,1,1,1,1,1,0,0, +2,2,2,2,1,1,1,1,2,2,0,2,2,2,2,0, +0,2,2,2,2,2,2,2,2,0,2,2,2,2,2,2, +2,0,1,1,1,1,1,1,1,1,0x21,0x21,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,2,2,0,2, +2,2,2,0,2,2,2,2,2,0,2,0,0,0,2,2, +2,2,2,2,2,0,1,1,1,1,1,1,1,1,0x21,0x21, +1,1,1,1,1,1,1,1,1,1,1,1,2,2,2,2, 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, -2,2,2,2,2,2,2,2,2,0,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, -1,1,1,0,1,1,1,1,1,1,2,2,2,2,2,2, 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, -2,2,2,0,1,1,1,1,1,1,1,1,1,1,1,1, -1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1, +1,1,1,1,1,1,0,0,2,2,2,2,2,2,2,2, 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, -1,1,1,0,1,1,1,1,1,1,2,1,0,0,0,0, +2,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1, +1,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2, +2,2,2,2,2,2,2,2,2,2,2,0,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,0,1,1,1,1,1,1,2,2,2,2,2,2,2,2, +2,2,2,2,2,2,2,2,1,1,1,0,1,1,1,1, +1,1,2,1,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,4,4,4,4,4,4,4,4, +4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,0, +0,0,0,4,4,4,4,4,4,4,4,4,4,4,4,4, +4,0,0,0,0,0,0,0,0,4,0,0,0,0,0,0, +0,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,4,4,4,4,4, +0,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, -4,4,4,4,4,4,4,0,0,0,0,4,4,4,4,4, -4,4,4,4,4,4,4,4,4,0,0,0,0,0,0,0, -0,4,0,0,0,0,0,0,0,0,0,0,4,0,0,0, +0x44,0x44,0x44,0x44,0x44,0x44,0x44,0,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44, +0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0,0,0x44,0x44,0x44,0x44,0x44, +0x44,0x44,0,0x44,0x44,0,0x44,0x44,0x44,0x44,0x44,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,4,4,4,4,4,0,4,4,4,4,4,4,4, -4,4,4,4,4,4,4,4,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0, -0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44, -0x44,0,0,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0,0x44,0x44,0,0x44,0x44, -0x44,0x44,0x44,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0x64,0x64,0x64,0x64,0x64,0x64,0x64,0, -0,0,0,0,0,0,0,0,0x110a,0x110a,0x110a,0x110a,0x110a,0x110a,0x110a,0x110a, +0x64,0x64,0x64,0x64,0x64,0x64,0x64,0,0,0,0,0,0,0,0,0, +0x110a,0x110a,0x110a,0x110a,0x110a,0x110a,0x110a,0x110a,0x110a,0x110a,0x110a,0x110a,0x110a,0x110a,0x110a,0x110a, 0x110a,0x110a,0x110a,0x110a,0x110a,0x110a,0x110a,0x110a,0x110a,0x110a,0x110a,0x110a,0x110a,0x110a,0x110a,0x110a, -0x110a,0x110a,0x110a,0x110a,0x110a,0x110a,0x110a,0x110a,0x110a,0x110a,0xef09,0xef09,0xef09,0xef09,0xef09,0xef09, +0x110a,0x110a,0xef09,0xef09,0xef09,0xef09,0xef09,0xef09,0xef09,0xef09,0xef09,0xef09,0xef09,0xef09,0xef09,0xef09, 0xef09,0xef09,0xef09,0xef09,0xef09,0xef09,0xef09,0xef09,0xef09,0xef09,0xef09,0xef09,0xef09,0xef09,0xef09,0xef09, -0xef09,0xef09,0xef09,0xef09,0xef09,0xef09,0xef09,0xef09,0x44,0x44,0x44,0x44,0x44,0x44,0x64,0, +0x44,0x44,0x44,0x44,0x44,0x44,0x64,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,2, +2,2,2,2,2,2,0,0,0,0,0,0,2,2,2,2, +2,2,2,2,2,2,2,2,2,2,2,2,2,2,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,2,2,2,2,2,2,2,2,2,2,0,0, -0,0,0,0,2,2,2,2,2,2,2,2,2,2,2,2, -2,2,2,2,2,2,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0 }; static const uint16_t ucase_props_exceptions[1948]={ @@ -900,13 +913,13 @@ static const UCaseProps ucase_props_singleton={ ucase_props_trieIndex+3228, NULL, 3228, - 8292, + 8492, 0x188, 0xd18, 0x0, 0x0, 0xe0800, - 0x2cfc, + 0x2dc4, NULL, 0, FALSE, FALSE, 0, NULL }, { 3,0,0,0 } diff --git a/Build/source/libs/icu/icu-src/source/common/ucasemap.cpp b/Build/source/libs/icu/icu-src/source/common/ucasemap.cpp index 0576a26ddd1..8eec93c6e3e 100644 --- a/Build/source/libs/icu/icu-src/source/common/ucasemap.cpp +++ b/Build/source/libs/icu/icu-src/source/common/ucasemap.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* @@ -8,7 +8,7 @@ * ******************************************************************************* * file name: ucasemap.cpp -* encoding: US-ASCII +* encoding: UTF-8 * tab size: 8 (not used) * indentation:4 * @@ -20,6 +20,11 @@ #include "unicode/utypes.h" #include "unicode/brkiter.h" +#include "unicode/bytestream.h" +#include "unicode/casemap.h" +#include "unicode/edits.h" +#include "unicode/stringoptions.h" +#include "unicode/stringpiece.h" #include "unicode/ubrk.h" #include "unicode/uloc.h" #include "unicode/ustring.h" @@ -30,49 +35,51 @@ #include "unicode/utf.h" #include "unicode/utf8.h" #include "unicode/utf16.h" +#include "bytesinkutil.h" #include "cmemory.h" #include "cstring.h" +#include "uassert.h" #include "ucase.h" +#include "ucasemap_imp.h" #include "ustr_imp.h" U_NAMESPACE_USE /* UCaseMap service object -------------------------------------------------- */ +UCaseMap::UCaseMap(const char *localeID, uint32_t opts, UErrorCode *pErrorCode) : +#if !UCONFIG_NO_BREAK_ITERATION + iter(NULL), +#endif + caseLocale(UCASE_LOC_UNKNOWN), options(opts) { + ucasemap_setLocale(this, localeID, pErrorCode); +} + +UCaseMap::~UCaseMap() { +#if !UCONFIG_NO_BREAK_ITERATION + delete iter; +#endif +} + U_CAPI UCaseMap * U_EXPORT2 ucasemap_open(const char *locale, uint32_t options, UErrorCode *pErrorCode) { - UCaseMap *csm; - if(U_FAILURE(*pErrorCode)) { return NULL; } - - csm=(UCaseMap *)uprv_malloc(sizeof(UCaseMap)); + UCaseMap *csm = new UCaseMap(locale, options, pErrorCode); if(csm==NULL) { + *pErrorCode = U_MEMORY_ALLOCATION_ERROR; return NULL; - } - uprv_memset(csm, 0, sizeof(UCaseMap)); - - csm->csp=ucase_getSingleton(); - ucasemap_setLocale(csm, locale, pErrorCode); - if(U_FAILURE(*pErrorCode)) { - uprv_free(csm); + } else if (U_FAILURE(*pErrorCode)) { + delete csm; return NULL; } - - csm->options=options; return csm; } U_CAPI void U_EXPORT2 ucasemap_close(UCaseMap *csm) { - if(csm!=NULL) { -#if !UCONFIG_NO_BREAK_ITERATION - // Do not call ubrk_close() so that we do not depend on all of the BreakIterator code. - delete reinterpret_cast(csm->iter); -#endif - uprv_free(csm); - } + delete csm; } U_CAPI const char * U_EXPORT2 @@ -87,13 +94,16 @@ ucasemap_getOptions(const UCaseMap *csm) { U_CAPI void U_EXPORT2 ucasemap_setLocale(UCaseMap *csm, const char *locale, UErrorCode *pErrorCode) { - int32_t length; - if(U_FAILURE(*pErrorCode)) { return; } + if (locale != NULL && *locale == 0) { + csm->locale[0] = 0; + csm->caseLocale = UCASE_LOC_ROOT; + return; + } - length=uloc_getName(locale, csm->locale, (int32_t)sizeof(csm->locale), pErrorCode); + int32_t length=uloc_getName(locale, csm->locale, (int32_t)sizeof(csm->locale), pErrorCode); if(*pErrorCode==U_BUFFER_OVERFLOW_ERROR || length==sizeof(csm->locale)) { *pErrorCode=U_ZERO_ERROR; /* we only really need the language code for case mappings */ @@ -102,124 +112,60 @@ ucasemap_setLocale(UCaseMap *csm, const char *locale, UErrorCode *pErrorCode) { if(length==sizeof(csm->locale)) { *pErrorCode=U_BUFFER_OVERFLOW_ERROR; } - csm->locCache=0; if(U_SUCCESS(*pErrorCode)) { - ucase_getCaseLocale(csm->locale, &csm->locCache); + csm->caseLocale=UCASE_LOC_UNKNOWN; + csm->caseLocale = ucase_getCaseLocale(csm->locale); } else { csm->locale[0]=0; + csm->caseLocale = UCASE_LOC_ROOT; } } U_CAPI void U_EXPORT2 -ucasemap_setOptions(UCaseMap *csm, uint32_t options, UErrorCode * /*pErrorCode*/) { +ucasemap_setOptions(UCaseMap *csm, uint32_t options, UErrorCode *pErrorCode) { + if(U_FAILURE(*pErrorCode)) { + return; + } csm->options=options; } /* UTF-8 string case mappings ----------------------------------------------- */ -/* TODO(markus): Move to a new, separate utf8case.c file. */ +/* TODO(markus): Move to a new, separate utf8case.cpp file. */ + +namespace { /* append a full case mapping result, see UCASE_MAX_STRING_LENGTH */ -static inline int32_t -appendResult(uint8_t *dest, int32_t destIndex, int32_t destCapacity, - int32_t result, const UChar *s) { - UChar32 c; - int32_t length; - UErrorCode errorCode; +inline UBool +appendResult(int32_t cpLength, int32_t result, const UChar *s, + ByteSink &sink, uint32_t options, icu::Edits *edits, UErrorCode &errorCode) { + U_ASSERT(U_SUCCESS(errorCode)); /* decode the result */ if(result<0) { /* (not) original code point */ - c=~result; - length=U8_LENGTH(c); - } else if(result<=UCASE_MAX_STRING_LENGTH) { - c=U_SENTINEL; - length=result; - } else { - c=result; - length=U8_LENGTH(c); - } - if(length>(INT32_MAX-destIndex)) { - return -1; // integer overflow - } - - if(destIndex=0) { - /* code point */ - UBool isError=FALSE; - U8_APPEND(dest, destIndex, destCapacity, c, isError); - if(isError) { - /* overflow, nothing written */ - destIndex+=length; - } - } else { - /* string */ - int32_t destLength; - errorCode=U_ZERO_ERROR; - u_strToUTF8( - (char *)(dest+destIndex), destCapacity-destIndex, &destLength, - s, length, - &errorCode); - if(U_FAILURE(errorCode) && errorCode != U_BUFFER_OVERFLOW_ERROR) { - return -1; - } - if(destLength>(INT32_MAX-destIndex)) { - return -1; // integer overflow - } - destIndex+=destLength; - /* we might have an overflow, but we know the actual length */ + if(edits!=NULL) { + edits->addUnchanged(cpLength); + } + if((options & U_OMIT_UNCHANGED_TEXT) == 0) { + ByteSinkUtil::appendCodePoint(cpLength, ~result, sink); } } else { - /* preflight */ - if(c>=0) { - destIndex+=length; + if(result<=UCASE_MAX_STRING_LENGTH) { + // string: "result" is the UTF-16 length + return ByteSinkUtil::appendChange(cpLength, s, result, sink, edits, errorCode); } else { - int32_t destLength; - errorCode=U_ZERO_ERROR; - u_strToUTF8( - NULL, 0, &destLength, - s, length, - &errorCode); - if(U_FAILURE(errorCode) && errorCode != U_BUFFER_OVERFLOW_ERROR) { - return -1; - } - if(destLength>(INT32_MAX-destIndex)) { - return -1; // integer overflow - } - destIndex+=destLength; + ByteSinkUtil::appendCodePoint(cpLength, result, sink, edits); } } - return destIndex; + return TRUE; } -static inline int32_t -appendUChar(uint8_t *dest, int32_t destIndex, int32_t destCapacity, UChar c) { - int32_t length=U8_LENGTH(c); - if(length>(INT32_MAX-destIndex)) { - return -1; // integer overflow - } - int32_t limit=destIndex+length; - if(limit<=destCapacity) { - U8_APPEND_UNSAFE(dest, destIndex, c); - } - return limit; -} +// See unicode/utf8.h U8_APPEND_UNSAFE(). +inline uint8_t getTwoByteLead(UChar32 c) { return (uint8_t)((c >> 6) | 0xc0); } +inline uint8_t getTwoByteTrail(UChar32 c) { return (uint8_t)((c & 0x3f) | 0x80); } -static inline int32_t -appendString(uint8_t *dest, int32_t destIndex, int32_t destCapacity, - const uint8_t *s, int32_t length) { - if(length>0) { - if(length>(INT32_MAX-destIndex)) { - return -1; // integer overflow - } - if((destIndex+length)<=destCapacity) { - uprv_memcpy(dest+destIndex, s, length); - } - destIndex+=length; - } - return destIndex; -} +} // namespace static UChar32 U_CALLCONV utf8_caseContextIterator(void *context, int8_t dir) { @@ -257,133 +203,96 @@ utf8_caseContextIterator(void *context, int8_t dir) { * Case-maps [srcStart..srcLimit[ but takes * context [0..srcLength[ into account. */ -static int32_t -_caseMap(const UCaseMap *csm, UCaseMapFull *map, - uint8_t *dest, int32_t destCapacity, +static void +_caseMap(int32_t caseLocale, uint32_t options, UCaseMapFull *map, const uint8_t *src, UCaseContext *csc, int32_t srcStart, int32_t srcLimit, - UErrorCode *pErrorCode) { - const UChar *s = NULL; - UChar32 c, c2 = 0; - int32_t srcIndex, destIndex; - int32_t locCache; - - locCache=csm->locCache; - + icu::ByteSink &sink, icu::Edits *edits, + UErrorCode &errorCode) { /* case mapping loop */ - srcIndex=srcStart; - destIndex=0; - while(srcIndexcpStart=srcIndex; + int32_t srcIndex=srcStart; + while (U_SUCCESS(errorCode) && srcIndexcpStart=cpStart=srcIndex; + UChar32 c; U8_NEXT(src, srcIndex, srcLimit, c); csc->cpLimit=srcIndex; if(c<0) { // Malformed UTF-8. - destIndex=appendString(dest, destIndex, destCapacity, src+csc->cpStart, srcIndex-csc->cpStart); - if(destIndex<0) { - *pErrorCode=U_INDEX_OUTOFBOUNDS_ERROR; - return 0; - } - continue; - } - c=map(csm->csp, c, utf8_caseContextIterator, csc, &s, csm->locale, &locCache); - if((destIndexdestCapacity) { - *pErrorCode=U_BUFFER_OVERFLOW_ERROR; - } - return destIndex; } #if !UCONFIG_NO_BREAK_ITERATION -U_CFUNC int32_t U_CALLCONV -ucasemap_internalUTF8ToTitle(const UCaseMap *csm, - uint8_t *dest, int32_t destCapacity, - const uint8_t *src, int32_t srcLength, - UErrorCode *pErrorCode) { - const UChar *s; - UChar32 c; - int32_t prev, titleStart, titleLimit, idx, destIndex; - UBool isFirstIndex; - - if(U_FAILURE(*pErrorCode)) { - return 0; +U_CFUNC void U_CALLCONV +ucasemap_internalUTF8ToTitle( + int32_t caseLocale, uint32_t options, BreakIterator *iter, + const uint8_t *src, int32_t srcLength, + ByteSink &sink, icu::Edits *edits, + UErrorCode &errorCode) { + if (!ustrcase_checkTitleAdjustmentOptions(options, errorCode)) { + return; } - // Use the C++ abstract base class to minimize dependencies. - // TODO: Change UCaseMap.iter to store a BreakIterator directly. - BreakIterator *bi=reinterpret_cast(csm->iter); - /* set up local variables */ - int32_t locCache=csm->locCache; UCaseContext csc=UCASECONTEXT_INITIALIZER; csc.p=(void *)src; csc.limit=srcLength; - destIndex=0; - prev=0; - isFirstIndex=TRUE; + int32_t prev=0; + UBool isFirstIndex=TRUE; /* titlecasing loop */ while(prevfirst(); + index=iter->first(); } else { - idx=bi->next(); + index=iter->next(); } - if(idx==UBRK_DONE || idx>srcLength) { - idx=srcLength; + if(index==UBRK_DONE || index>srcLength) { + index=srcLength; } /* - * Unicode 4 & 5 section 3.13 Default Case Operations: - * - * R3 toTitlecase(X): Find the word boundaries based on Unicode Standard Annex - * #29, "Text Boundaries." Between each pair of word boundaries, find the first - * cased character F. If F exists, map F to default_title(F); then map each - * subsequent character C to default_lower(C). - * - * In this implementation, segment [prev..index[ into 3 parts: - * a) uncased characters (copy as-is) [prev..titleStart[ - * b) first case letter (titlecase) [titleStart..titleLimit[ + * Segment [prev..index[ into 3 parts: + * a) skipped characters (copy as-is) [prev..titleStart[ + * b) first letter (titlecase) [titleStart..titleLimit[ * c) subsequent characters (lowercase) [titleLimit..index[ */ - if(prevoptions&U_TITLECASE_NO_BREAK_ADJUSTMENT)==0 && UCASE_NONE==ucase_getType(csm->csp, c)) { - /* Adjust the titlecasing index (titleStart) to the next cased character. */ - for(;;) { + if(prevcsp, c)) { - break; /* cased letter at [titleStart..titleLimit[ */ - } + U8_NEXT(src, titleLimit, index, c); } - destIndex=appendString(dest, destIndex, destCapacity, src+prev, titleStart-prev); - if(destIndex<0) { - *pErrorCode=U_INDEX_OUTOFBOUNDS_ERROR; - return 0; + if (prev < titleStart) { + if (!ByteSinkUtil::appendUnchanged(src+prev, titleStart-prev, + sink, options, edits, errorCode)) { + return; + } } } @@ -392,61 +301,60 @@ ucasemap_internalUTF8ToTitle(const UCaseMap *csm, if(c>=0) { csc.cpStart=titleStart; csc.cpLimit=titleLimit; - c=ucase_toFullTitle(csm->csp, c, utf8_caseContextIterator, &csc, &s, csm->locale, &locCache); - destIndex=appendResult(dest, destIndex, destCapacity, c, s); + const UChar *s; + c=ucase_toFullTitle(c, utf8_caseContextIterator, &csc, &s, caseLocale); + if (!appendResult(titleLimit-titleStart, c, s, sink, options, edits, errorCode)) { + return; + } } else { // Malformed UTF-8. - destIndex=appendString(dest, destIndex, destCapacity, src+titleStart, titleLimit-titleStart); - } - if(destIndex<0) { - *pErrorCode=U_INDEX_OUTOFBOUNDS_ERROR; - return 0; + if (!ByteSinkUtil::appendUnchanged(src+titleStart, titleLimit-titleStart, + sink, options, edits, errorCode)) { + return; + } } /* Special case Dutch IJ titlecasing */ - if (titleStart+1 < idx && - ucase_getCaseLocale(csm->locale, &locCache) == UCASE_LOC_DUTCH && - (src[titleStart] == 0x0049 || src[titleStart] == 0x0069) && - (src[titleStart+1] == 0x004A || src[titleStart+1] == 0x006A)) { - destIndex=appendUChar(dest, destIndex, destCapacity, 0x004A); - titleLimit++; + if (titleStart+1 < index && + caseLocale == UCASE_LOC_DUTCH && + (src[titleStart] == 0x0049 || src[titleStart] == 0x0069)) { + if (src[titleStart+1] == 0x006A) { + ByteSinkUtil::appendCodePoint(1, 0x004A, sink, edits); + titleLimit++; + } else if (src[titleStart+1] == 0x004A) { + // Keep the capital J from getting lowercased. + if (!ByteSinkUtil::appendUnchanged(src+titleStart+1, 1, + sink, options, edits, errorCode)) { + return; + } + titleLimit++; + } } + /* lowercase [titleLimit..index[ */ - if(titleLimitoptions&U_TITLECASE_NO_LOWERCASE)==0) { + if(titleLimitdestCapacity) { - *pErrorCode=U_BUFFER_OVERFLOW_ERROR; - } - return destIndex; } #endif @@ -454,11 +362,11 @@ ucasemap_internalUTF8ToTitle(const UCaseMap *csm, U_NAMESPACE_BEGIN namespace GreekUpper { -UBool isFollowedByCasedLetter(const UCaseProps *csp, const uint8_t *s, int32_t i, int32_t length) { +UBool isFollowedByCasedLetter(const uint8_t *s, int32_t i, int32_t length) { while (i < length) { UChar32 c; U8_NEXT(s, i, length, c); - int32_t type = ucase_getTypeOrIgnorable(csp, c); + int32_t type = ucase_getTypeOrIgnorable(c); if ((type & UCASE_IGNORABLE) != 0) { // Case-ignorable, continue with the loop. } else if (type != UCASE_NONE) { @@ -471,19 +379,17 @@ UBool isFollowedByCasedLetter(const UCaseProps *csp, const uint8_t *s, int32_t i } // Keep this consistent with the UTF-16 version in ustrcase.cpp and the Java version in CaseMap.java. -int32_t toUpper(const UCaseMap *csm, - uint8_t *dest, int32_t destCapacity, - const uint8_t *src, int32_t srcLength, - UErrorCode *pErrorCode) { - int32_t locCache = UCASE_LOC_GREEK; - int32_t destIndex=0; +void toUpper(uint32_t options, + const uint8_t *src, int32_t srcLength, + ByteSink &sink, Edits *edits, + UErrorCode &errorCode) { uint32_t state = 0; for (int32_t i = 0; i < srcLength;) { int32_t nextIndex = i; UChar32 c; U8_NEXT(src, nextIndex, srcLength, c); uint32_t nextState = 0; - int32_t type = ucase_getTypeOrIgnorable(csm->csp, c); + int32_t type = ucase_getTypeOrIgnorable(c); if ((type & UCASE_IGNORABLE) != 0) { // c is case-ignorable nextState |= (state & AFTER_CASED); @@ -533,7 +439,7 @@ int32_t toUpper(const UCaseMap *csm, (data & HAS_ACCENT) != 0 && numYpogegrammeni == 0 && (state & AFTER_CASED) == 0 && - !isFollowedByCasedLetter(csm->csp, src, nextIndex, srcLength)) { + !isFollowedByCasedLetter(src, nextIndex, srcLength)) { // Keep disjunctive "or" with (only) a tonos. // We use the same "word boundary" conditions as for the Final_Sigma test. if (i == nextIndex) { @@ -551,161 +457,183 @@ int32_t toUpper(const UCaseMap *csm, data &= ~HAS_EITHER_DIALYTIKA; } } - destIndex=appendUChar(dest, destIndex, destCapacity, (UChar)upper); - if (destIndex >= 0 && (data & HAS_EITHER_DIALYTIKA) != 0) { - destIndex=appendUChar(dest, destIndex, destCapacity, 0x308); // restore or add a dialytika - } - if (destIndex >= 0 && addTonos) { - destIndex=appendUChar(dest, destIndex, destCapacity, 0x301); - } - while (destIndex >= 0 && numYpogegrammeni > 0) { - destIndex=appendUChar(dest, destIndex, destCapacity, 0x399); - --numYpogegrammeni; + + UBool change; + if (edits == nullptr && (options & U_OMIT_UNCHANGED_TEXT) == 0) { + change = TRUE; // common, simple usage + } else { + // Find out first whether we are changing the text. + U_ASSERT(0x370 <= upper && upper <= 0x3ff); // 2-byte UTF-8, main Greek block + change = (i + 2) > nextIndex || + src[i] != getTwoByteLead(upper) || src[i + 1] != getTwoByteTrail(upper) || + numYpogegrammeni > 0; + int32_t i2 = i + 2; + if ((data & HAS_EITHER_DIALYTIKA) != 0) { + change |= (i2 + 2) > nextIndex || + src[i2] != (uint8_t)u8"\u0308"[0] || + src[i2 + 1] != (uint8_t)u8"\u0308"[1]; + i2 += 2; + } + if (addTonos) { + change |= (i2 + 2) > nextIndex || + src[i2] != (uint8_t)u8"\u0301"[0] || + src[i2 + 1] != (uint8_t)u8"\u0301"[1]; + i2 += 2; + } + int32_t oldLength = nextIndex - i; + int32_t newLength = (i2 - i) + numYpogegrammeni * 2; // 2 bytes per U+0399 + change |= oldLength != newLength; + if (change) { + if (edits != NULL) { + edits->addReplace(oldLength, newLength); + } + } else { + if (edits != NULL) { + edits->addUnchanged(oldLength); + } + // Write unchanged text? + change = (options & U_OMIT_UNCHANGED_TEXT) == 0; + } } - if(destIndex<0) { - *pErrorCode=U_INDEX_OUTOFBOUNDS_ERROR; - return 0; + + if (change) { + ByteSinkUtil::appendTwoBytes(upper, sink); + if ((data & HAS_EITHER_DIALYTIKA) != 0) { + sink.Append(u8"\u0308", 2); // restore or add a dialytika + } + if (addTonos) { + sink.Append(u8"\u0301", 2); + } + while (numYpogegrammeni > 0) { + sink.Append(u8"\u0399", 2); + --numYpogegrammeni; + } } } else if(c>=0) { const UChar *s; - UChar32 c2 = 0; - c=ucase_toFullUpper(csm->csp, c, NULL, NULL, &s, csm->locale, &locCache); - if((destIndexdestCapacity) { - *pErrorCode=U_BUFFER_OVERFLOW_ERROR; - } - return destIndex; } } // namespace GreekUpper U_NAMESPACE_END -static int32_t U_CALLCONV -ucasemap_internalUTF8ToLower(const UCaseMap *csm, - uint8_t *dest, int32_t destCapacity, +static void U_CALLCONV +ucasemap_internalUTF8ToLower(int32_t caseLocale, uint32_t options, UCASEMAP_BREAK_ITERATOR_UNUSED const uint8_t *src, int32_t srcLength, - UErrorCode *pErrorCode) { + icu::ByteSink &sink, icu::Edits *edits, + UErrorCode &errorCode) { UCaseContext csc=UCASECONTEXT_INITIALIZER; csc.p=(void *)src; csc.limit=srcLength; - return _caseMap( - csm, ucase_toFullLower, - dest, destCapacity, + _caseMap( + caseLocale, options, ucase_toFullLower, src, &csc, 0, srcLength, - pErrorCode); + sink, edits, errorCode); } -static int32_t U_CALLCONV -ucasemap_internalUTF8ToUpper(const UCaseMap *csm, - uint8_t *dest, int32_t destCapacity, +static void U_CALLCONV +ucasemap_internalUTF8ToUpper(int32_t caseLocale, uint32_t options, UCASEMAP_BREAK_ITERATOR_UNUSED const uint8_t *src, int32_t srcLength, - UErrorCode *pErrorCode) { - int32_t locCache = csm->locCache; - if (ucase_getCaseLocale(csm->locale, &locCache) == UCASE_LOC_GREEK) { - return GreekUpper::toUpper(csm, dest, destCapacity, src, srcLength, pErrorCode); + icu::ByteSink &sink, icu::Edits *edits, + UErrorCode &errorCode) { + if (caseLocale == UCASE_LOC_GREEK) { + GreekUpper::toUpper(options, src, srcLength, sink, edits, errorCode); + } else { + UCaseContext csc=UCASECONTEXT_INITIALIZER; + csc.p=(void *)src; + csc.limit=srcLength; + _caseMap( + caseLocale, options, ucase_toFullUpper, + src, &csc, 0, srcLength, + sink, edits, errorCode); } - UCaseContext csc=UCASECONTEXT_INITIALIZER; - csc.p=(void *)src; - csc.limit=srcLength; - return _caseMap( - csm, ucase_toFullUpper, - dest, destCapacity, - src, &csc, 0, srcLength, - pErrorCode); } -static int32_t -utf8_foldCase(const UCaseProps *csp, - uint8_t *dest, int32_t destCapacity, - const uint8_t *src, int32_t srcLength, - uint32_t options, - UErrorCode *pErrorCode) { - int32_t srcIndex, destIndex; - - const UChar *s; - UChar32 c, c2; - int32_t start; - +static void U_CALLCONV +ucasemap_internalUTF8Fold(int32_t /* caseLocale */, uint32_t options, UCASEMAP_BREAK_ITERATOR_UNUSED + const uint8_t *src, int32_t srcLength, + icu::ByteSink &sink, icu::Edits *edits, + UErrorCode &errorCode) { /* case mapping loop */ - srcIndex=destIndex=0; - while(srcIndexdestCapacity) { - *pErrorCode=U_BUFFER_OVERFLOW_ERROR; +void +ucasemap_mapUTF8(int32_t caseLocale, uint32_t options, UCASEMAP_BREAK_ITERATOR_PARAM + const char *src, int32_t srcLength, + UTF8CaseMapper *stringCaseMapper, + icu::ByteSink &sink, icu::Edits *edits, + UErrorCode &errorCode) { + /* check argument values */ + if (U_FAILURE(errorCode)) { + return; + } + if ((src == nullptr && srcLength != 0) || srcLength < -1) { + errorCode = U_ILLEGAL_ARGUMENT_ERROR; + return; } - return destIndex; -} -static int32_t U_CALLCONV -ucasemap_internalUTF8Fold(const UCaseMap *csm, - uint8_t *dest, int32_t destCapacity, - const uint8_t *src, int32_t srcLength, - UErrorCode *pErrorCode) { - return utf8_foldCase(csm->csp, dest, destCapacity, src, srcLength, csm->options, pErrorCode); + // Get the string length. + if (srcLength == -1) { + srcLength = (int32_t)uprv_strlen((const char *)src); + } + + if (edits != nullptr && (options & U_EDITS_NO_RESET) == 0) { + edits->reset(); + } + stringCaseMapper(caseLocale, options, UCASEMAP_BREAK_ITERATOR + (const uint8_t *)src, srcLength, sink, edits, errorCode); + sink.Flush(); + if (U_SUCCESS(errorCode)) { + if (edits != nullptr) { + edits->copyErrorTo(errorCode); + } + } } -U_CFUNC int32_t -ucasemap_mapUTF8(const UCaseMap *csm, - uint8_t *dest, int32_t destCapacity, - const uint8_t *src, int32_t srcLength, +int32_t +ucasemap_mapUTF8(int32_t caseLocale, uint32_t options, UCASEMAP_BREAK_ITERATOR_PARAM + char *dest, int32_t destCapacity, + const char *src, int32_t srcLength, UTF8CaseMapper *stringCaseMapper, - UErrorCode *pErrorCode) { - int32_t destLength; - + icu::Edits *edits, + UErrorCode &errorCode) { /* check argument values */ - if(U_FAILURE(*pErrorCode)) { + if(U_FAILURE(errorCode)) { return 0; } if( destCapacity<0 || (dest==NULL && destCapacity>0) || - src==NULL || - srcLength<-1 + (src==NULL && srcLength!=0) || srcLength<-1 ) { - *pErrorCode=U_ILLEGAL_ARGUMENT_ERROR; + errorCode=U_ILLEGAL_ARGUMENT_ERROR; return 0; } @@ -719,12 +647,25 @@ ucasemap_mapUTF8(const UCaseMap *csm, ((src>=dest && src<(dest+destCapacity)) || (dest>=src && dest<(src+srcLength))) ) { - *pErrorCode=U_ILLEGAL_ARGUMENT_ERROR; + errorCode=U_ILLEGAL_ARGUMENT_ERROR; return 0; } - destLength=stringCaseMapper(csm, dest, destCapacity, src, srcLength, pErrorCode); - return u_terminateChars((char *)dest, destCapacity, destLength, pErrorCode); + CheckedArrayByteSink sink(dest, destCapacity); + if (edits != nullptr && (options & U_EDITS_NO_RESET) == 0) { + edits->reset(); + } + stringCaseMapper(caseLocale, options, UCASEMAP_BREAK_ITERATOR + (const uint8_t *)src, srcLength, sink, edits, errorCode); + sink.Flush(); + if (U_SUCCESS(errorCode)) { + if (sink.Overflowed()) { + errorCode = U_BUFFER_OVERFLOW_ERROR; + } else if (edits != nullptr) { + edits->copyErrorTo(errorCode); + } + } + return u_terminateChars(dest, destCapacity, sink.NumberOfBytesAppended(), &errorCode); } /* public API functions */ @@ -734,10 +675,11 @@ ucasemap_utf8ToLower(const UCaseMap *csm, char *dest, int32_t destCapacity, const char *src, int32_t srcLength, UErrorCode *pErrorCode) { - return ucasemap_mapUTF8(csm, - (uint8_t *)dest, destCapacity, - (const uint8_t *)src, srcLength, - ucasemap_internalUTF8ToLower, pErrorCode); + return ucasemap_mapUTF8( + csm->caseLocale, csm->options, UCASEMAP_BREAK_ITERATOR_NULL + dest, destCapacity, + src, srcLength, + ucasemap_internalUTF8ToLower, NULL, *pErrorCode); } U_CAPI int32_t U_EXPORT2 @@ -745,10 +687,11 @@ ucasemap_utf8ToUpper(const UCaseMap *csm, char *dest, int32_t destCapacity, const char *src, int32_t srcLength, UErrorCode *pErrorCode) { - return ucasemap_mapUTF8(csm, - (uint8_t *)dest, destCapacity, - (const uint8_t *)src, srcLength, - ucasemap_internalUTF8ToUpper, pErrorCode); + return ucasemap_mapUTF8( + csm->caseLocale, csm->options, UCASEMAP_BREAK_ITERATOR_NULL + dest, destCapacity, + src, srcLength, + ucasemap_internalUTF8ToUpper, NULL, *pErrorCode); } U_CAPI int32_t U_EXPORT2 @@ -756,8 +699,79 @@ ucasemap_utf8FoldCase(const UCaseMap *csm, char *dest, int32_t destCapacity, const char *src, int32_t srcLength, UErrorCode *pErrorCode) { - return ucasemap_mapUTF8(csm, - (uint8_t *)dest, destCapacity, - (const uint8_t *)src, srcLength, - ucasemap_internalUTF8Fold, pErrorCode); + return ucasemap_mapUTF8( + UCASE_LOC_ROOT, csm->options, UCASEMAP_BREAK_ITERATOR_NULL + dest, destCapacity, + src, srcLength, + ucasemap_internalUTF8Fold, NULL, *pErrorCode); +} + +U_NAMESPACE_BEGIN + +void CaseMap::utf8ToLower( + const char *locale, uint32_t options, + StringPiece src, ByteSink &sink, Edits *edits, + UErrorCode &errorCode) { + ucasemap_mapUTF8( + ustrcase_getCaseLocale(locale), options, UCASEMAP_BREAK_ITERATOR_NULL + src.data(), src.length(), + ucasemap_internalUTF8ToLower, sink, edits, errorCode); +} + +void CaseMap::utf8ToUpper( + const char *locale, uint32_t options, + StringPiece src, ByteSink &sink, Edits *edits, + UErrorCode &errorCode) { + ucasemap_mapUTF8( + ustrcase_getCaseLocale(locale), options, UCASEMAP_BREAK_ITERATOR_NULL + src.data(), src.length(), + ucasemap_internalUTF8ToUpper, sink, edits, errorCode); +} + +void CaseMap::utf8Fold( + uint32_t options, + StringPiece src, ByteSink &sink, Edits *edits, + UErrorCode &errorCode) { + ucasemap_mapUTF8( + UCASE_LOC_ROOT, options, UCASEMAP_BREAK_ITERATOR_NULL + src.data(), src.length(), + ucasemap_internalUTF8Fold, sink, edits, errorCode); +} + +int32_t CaseMap::utf8ToLower( + const char *locale, uint32_t options, + const char *src, int32_t srcLength, + char *dest, int32_t destCapacity, Edits *edits, + UErrorCode &errorCode) { + return ucasemap_mapUTF8( + ustrcase_getCaseLocale(locale), options, UCASEMAP_BREAK_ITERATOR_NULL + dest, destCapacity, + src, srcLength, + ucasemap_internalUTF8ToLower, edits, errorCode); } + +int32_t CaseMap::utf8ToUpper( + const char *locale, uint32_t options, + const char *src, int32_t srcLength, + char *dest, int32_t destCapacity, Edits *edits, + UErrorCode &errorCode) { + return ucasemap_mapUTF8( + ustrcase_getCaseLocale(locale), options, UCASEMAP_BREAK_ITERATOR_NULL + dest, destCapacity, + src, srcLength, + ucasemap_internalUTF8ToUpper, edits, errorCode); +} + +int32_t CaseMap::utf8Fold( + uint32_t options, + const char *src, int32_t srcLength, + char *dest, int32_t destCapacity, Edits *edits, + UErrorCode &errorCode) { + return ucasemap_mapUTF8( + UCASE_LOC_ROOT, options, UCASEMAP_BREAK_ITERATOR_NULL + dest, destCapacity, + src, srcLength, + ucasemap_internalUTF8Fold, edits, errorCode); +} + +U_NAMESPACE_END diff --git a/Build/source/libs/icu/icu-src/source/common/ucasemap_imp.h b/Build/source/libs/icu/icu-src/source/common/ucasemap_imp.h new file mode 100644 index 00000000000..99a64902794 --- /dev/null +++ b/Build/source/libs/icu/icu-src/source/common/ucasemap_imp.h @@ -0,0 +1,291 @@ +// © 2017 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html + +// ucasemap_imp.h +// created: 2017feb08 Markus W. Scherer + +#ifndef __UCASEMAP_IMP_H__ +#define __UCASEMAP_IMP_H__ + +#include "unicode/utypes.h" +#include "unicode/ucasemap.h" +#include "unicode/uchar.h" +#include "ucase.h" + +/** + * Bit mask for the titlecasing iterator options bit field. + * Currently only 3 out of 8 values are used: + * 0 (words), U_TITLECASE_WHOLE_STRING, U_TITLECASE_SENTENCES. + * See stringoptions.h. + * @internal + */ +#define U_TITLECASE_ITERATOR_MASK 0xe0 + +/** + * Bit mask for the titlecasing index adjustment options bit set. + * Currently two bits are defined: + * U_TITLECASE_NO_BREAK_ADJUSTMENT, U_TITLECASE_ADJUST_TO_CASED. + * See stringoptions.h. + * @internal + */ +#define U_TITLECASE_ADJUSTMENT_MASK 0x600 + +/** + * Internal API, used by u_strcasecmp() etc. + * Compare strings case-insensitively, + * in code point order or code unit order. + */ +U_CFUNC int32_t +u_strcmpFold(const UChar *s1, int32_t length1, + const UChar *s2, int32_t length2, + uint32_t options, + UErrorCode *pErrorCode); + +/** + * Internal API, used for detecting length of + * shared prefix case-insensitively. + * @param s1 input string 1 + * @param length1 length of string 1, or -1 (NULL terminated) + * @param s2 input string 2 + * @param length2 length of string 2, or -1 (NULL terminated) + * @param options compare options + * @param matchLen1 (output) length of partial prefix match in s1 + * @param matchLen2 (output) length of partial prefix match in s2 + * @param pErrorCode receives error status + */ +U_CAPI void +u_caseInsensitivePrefixMatch(const UChar *s1, int32_t length1, + const UChar *s2, int32_t length2, + uint32_t options, + int32_t *matchLen1, int32_t *matchLen2, + UErrorCode *pErrorCode); + +/** + * Are the Unicode properties loaded? + * This must be used before internal functions are called that do + * not perform this check. + * Generate a debug assertion failure if data is not loaded. + */ +U_CFUNC UBool +uprv_haveProperties(UErrorCode *pErrorCode); + +#ifdef __cplusplus + +U_NAMESPACE_BEGIN + +class BreakIterator; // unicode/brkiter.h +class ByteSink; +class Locale; // unicode/locid.h + +/** Returns TRUE if the options are valid. Otherwise FALSE, and sets an error. */ +inline UBool ustrcase_checkTitleAdjustmentOptions(uint32_t options, UErrorCode &errorCode) { + if (U_FAILURE(errorCode)) { return FALSE; } + if ((options & U_TITLECASE_ADJUSTMENT_MASK) == U_TITLECASE_ADJUSTMENT_MASK) { + // Both options together. + errorCode = U_ILLEGAL_ARGUMENT_ERROR; + return FALSE; + } + return TRUE; +} + +inline UBool ustrcase_isLNS(UChar32 c) { + // Letter, number, symbol, + // or a private use code point because those are typically used as letters or numbers. + // Consider modifier letters only if they are cased. + const uint32_t LNS = (U_GC_L_MASK|U_GC_N_MASK|U_GC_S_MASK|U_GC_CO_MASK) & ~U_GC_LM_MASK; + int gc = u_charType(c); + return (U_MASK(gc) & LNS) != 0 || (gc == U_MODIFIER_LETTER && ucase_getType(c) != UCASE_NONE); +} + +#if !UCONFIG_NO_BREAK_ITERATION + +/** Returns nullptr if error. Pass in either locale or locID, not both. */ +U_CFUNC +BreakIterator *ustrcase_getTitleBreakIterator( + const Locale *locale, const char *locID, uint32_t options, BreakIterator *iter, + LocalPointer &ownedIter, UErrorCode &errorCode); + +#endif + +U_NAMESPACE_END + +#include "unicode/unistr.h" // for UStringCaseMapper + +/* + * Internal string casing functions implementing + * ustring.h/ustrcase.cpp and UnicodeString case mapping functions. + */ + +struct UCaseMap : public icu::UMemory { + /** Implements most of ucasemap_open(). */ + UCaseMap(const char *localeID, uint32_t opts, UErrorCode *pErrorCode); + ~UCaseMap(); + +#if !UCONFIG_NO_BREAK_ITERATION + icu::BreakIterator *iter; /* We adopt the iterator, so we own it. */ +#endif + char locale[32]; + int32_t caseLocale; + uint32_t options; +}; + +#if UCONFIG_NO_BREAK_ITERATION +# define UCASEMAP_BREAK_ITERATOR_PARAM +# define UCASEMAP_BREAK_ITERATOR_UNUSED +# define UCASEMAP_BREAK_ITERATOR +# define UCASEMAP_BREAK_ITERATOR_NULL +#else +# define UCASEMAP_BREAK_ITERATOR_PARAM icu::BreakIterator *iter, +# define UCASEMAP_BREAK_ITERATOR_UNUSED icu::BreakIterator *, +# define UCASEMAP_BREAK_ITERATOR iter, +# define UCASEMAP_BREAK_ITERATOR_NULL NULL, +#endif + +U_CFUNC int32_t +ustrcase_getCaseLocale(const char *locale); + +// TODO: swap src / dest if approved for new public api +/** Implements UStringCaseMapper. */ +U_CFUNC int32_t U_CALLCONV +ustrcase_internalToLower(int32_t caseLocale, uint32_t options, UCASEMAP_BREAK_ITERATOR_PARAM + UChar *dest, int32_t destCapacity, + const UChar *src, int32_t srcLength, + icu::Edits *edits, + UErrorCode &errorCode); + +/** Implements UStringCaseMapper. */ +U_CFUNC int32_t U_CALLCONV +ustrcase_internalToUpper(int32_t caseLocale, uint32_t options, UCASEMAP_BREAK_ITERATOR_PARAM + UChar *dest, int32_t destCapacity, + const UChar *src, int32_t srcLength, + icu::Edits *edits, + UErrorCode &errorCode); + +#if !UCONFIG_NO_BREAK_ITERATION + +/** Implements UStringCaseMapper. */ +U_CFUNC int32_t U_CALLCONV +ustrcase_internalToTitle(int32_t caseLocale, uint32_t options, + icu::BreakIterator *iter, + UChar *dest, int32_t destCapacity, + const UChar *src, int32_t srcLength, + icu::Edits *edits, + UErrorCode &errorCode); + +#endif + +/** Implements UStringCaseMapper. */ +U_CFUNC int32_t U_CALLCONV +ustrcase_internalFold(int32_t caseLocale, uint32_t options, UCASEMAP_BREAK_ITERATOR_PARAM + UChar *dest, int32_t destCapacity, + const UChar *src, int32_t srcLength, + icu::Edits *edits, + UErrorCode &errorCode); + +/** + * Common string case mapping implementation for ucasemap_toXyz() and UnicodeString::toXyz(). + * Implements argument checking. + */ +U_CFUNC int32_t +ustrcase_map(int32_t caseLocale, uint32_t options, UCASEMAP_BREAK_ITERATOR_PARAM + UChar *dest, int32_t destCapacity, + const UChar *src, int32_t srcLength, + UStringCaseMapper *stringCaseMapper, + icu::Edits *edits, + UErrorCode &errorCode); + +/** + * Common string case mapping implementation for old-fashioned u_strToXyz() functions + * that allow the source string to overlap the destination buffer. + * Implements argument checking and internally works with an intermediate buffer if necessary. + */ +U_CFUNC int32_t +ustrcase_mapWithOverlap(int32_t caseLocale, uint32_t options, UCASEMAP_BREAK_ITERATOR_PARAM + UChar *dest, int32_t destCapacity, + const UChar *src, int32_t srcLength, + UStringCaseMapper *stringCaseMapper, + UErrorCode &errorCode); + +/** + * UTF-8 string case mapping function type, used by ucasemap_mapUTF8(). + * UTF-8 version of UStringCaseMapper. + * All error checking must be done. + * The UCaseMap must be fully initialized, with locale and/or iter set as needed. + */ +typedef void U_CALLCONV +UTF8CaseMapper(int32_t caseLocale, uint32_t options, +#if !UCONFIG_NO_BREAK_ITERATION + icu::BreakIterator *iter, +#endif + const uint8_t *src, int32_t srcLength, + icu::ByteSink &sink, icu::Edits *edits, + UErrorCode &errorCode); + +#if !UCONFIG_NO_BREAK_ITERATION + +/** Implements UTF8CaseMapper. */ +U_CFUNC void U_CALLCONV +ucasemap_internalUTF8ToTitle(int32_t caseLocale, uint32_t options, + icu::BreakIterator *iter, + const uint8_t *src, int32_t srcLength, + icu::ByteSink &sink, icu::Edits *edits, + UErrorCode &errorCode); + +#endif + +void +ucasemap_mapUTF8(int32_t caseLocale, uint32_t options, UCASEMAP_BREAK_ITERATOR_PARAM + const char *src, int32_t srcLength, + UTF8CaseMapper *stringCaseMapper, + icu::ByteSink &sink, icu::Edits *edits, + UErrorCode &errorCode); + +/** + * Implements argument checking and buffer handling + * for UTF-8 string case mapping as a common function. + */ +int32_t +ucasemap_mapUTF8(int32_t caseLocale, uint32_t options, UCASEMAP_BREAK_ITERATOR_PARAM + char *dest, int32_t destCapacity, + const char *src, int32_t srcLength, + UTF8CaseMapper *stringCaseMapper, + icu::Edits *edits, + UErrorCode &errorCode); + +U_NAMESPACE_BEGIN +namespace GreekUpper { + +// Data bits. +static const uint32_t UPPER_MASK = 0x3ff; +static const uint32_t HAS_VOWEL = 0x1000; +static const uint32_t HAS_YPOGEGRAMMENI = 0x2000; +static const uint32_t HAS_ACCENT = 0x4000; +static const uint32_t HAS_DIALYTIKA = 0x8000; +// Further bits during data building and processing, not stored in the data map. +static const uint32_t HAS_COMBINING_DIALYTIKA = 0x10000; +static const uint32_t HAS_OTHER_GREEK_DIACRITIC = 0x20000; + +static const uint32_t HAS_VOWEL_AND_ACCENT = HAS_VOWEL | HAS_ACCENT; +static const uint32_t HAS_VOWEL_AND_ACCENT_AND_DIALYTIKA = + HAS_VOWEL_AND_ACCENT | HAS_DIALYTIKA; +static const uint32_t HAS_EITHER_DIALYTIKA = HAS_DIALYTIKA | HAS_COMBINING_DIALYTIKA; + +// State bits. +static const uint32_t AFTER_CASED = 1; +static const uint32_t AFTER_VOWEL_WITH_ACCENT = 2; + +uint32_t getLetterData(UChar32 c); + +/** + * Returns a non-zero value for each of the Greek combining diacritics + * listed in The Unicode Standard, version 8, chapter 7.2 Greek, + * plus some perispomeni look-alikes. + */ +uint32_t getDiacriticData(UChar32 c); + +} // namespace GreekUpper +U_NAMESPACE_END + +#endif // __cplusplus + +#endif // __UCASEMAP_IMP_H__ diff --git a/Build/source/libs/icu/icu-src/source/common/ucasemap_titlecase_brkiter.cpp b/Build/source/libs/icu/icu-src/source/common/ucasemap_titlecase_brkiter.cpp index ab61e21765b..c21dfb7698a 100644 --- a/Build/source/libs/icu/icu-src/source/common/ucasemap_titlecase_brkiter.cpp +++ b/Build/source/libs/icu/icu-src/source/common/ucasemap_titlecase_brkiter.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* @@ -6,7 +6,7 @@ * Corporation and others. All Rights Reserved. ******************************************************************************* * file name: ucasemap_titlecase_brkiter.cpp -* encoding: US-ASCII +* encoding: UTF-8 * tab size: 8 (not used) * indentation:4 * @@ -23,23 +23,79 @@ #include "unicode/brkiter.h" #include "unicode/ubrk.h" +#include "unicode/casemap.h" #include "unicode/ucasemap.h" #include "cmemory.h" #include "ucase.h" -#include "ustr_imp.h" +#include "ucasemap_imp.h" + +U_NAMESPACE_BEGIN + +void CaseMap::utf8ToTitle( + const char *locale, uint32_t options, BreakIterator *iter, + StringPiece src, ByteSink &sink, Edits *edits, + UErrorCode &errorCode) { + if (U_FAILURE(errorCode)) { + return; + } + UText utext = UTEXT_INITIALIZER; + utext_openUTF8(&utext, src.data(), src.length(), &errorCode); + LocalPointer ownedIter; + iter = ustrcase_getTitleBreakIterator(nullptr, locale, options, iter, ownedIter, errorCode); + if (iter == nullptr) { + utext_close(&utext); + return; + } + iter->setText(&utext, errorCode); + ucasemap_mapUTF8( + ustrcase_getCaseLocale(locale), options, iter, + src.data(), src.length(), + ucasemap_internalUTF8ToTitle, sink, edits, errorCode); + utext_close(&utext); +} + +int32_t CaseMap::utf8ToTitle( + const char *locale, uint32_t options, BreakIterator *iter, + const char *src, int32_t srcLength, + char *dest, int32_t destCapacity, Edits *edits, + UErrorCode &errorCode) { + if (U_FAILURE(errorCode)) { + return 0; + } + UText utext=UTEXT_INITIALIZER; + utext_openUTF8(&utext, src, srcLength, &errorCode); + LocalPointer ownedIter; + iter = ustrcase_getTitleBreakIterator(nullptr, locale, options, iter, ownedIter, errorCode); + if(iter==NULL) { + utext_close(&utext); + return 0; + } + iter->setText(&utext, errorCode); + int32_t length=ucasemap_mapUTF8( + ustrcase_getCaseLocale(locale), options, iter, + dest, destCapacity, + src, srcLength, + ucasemap_internalUTF8ToTitle, edits, errorCode); + utext_close(&utext); + return length; +} + +U_NAMESPACE_END U_NAMESPACE_USE U_CAPI const UBreakIterator * U_EXPORT2 ucasemap_getBreakIterator(const UCaseMap *csm) { - return csm->iter; + return reinterpret_cast(csm->iter); } U_CAPI void U_EXPORT2 -ucasemap_setBreakIterator(UCaseMap *csm, UBreakIterator *iterToAdopt, UErrorCode * /*pErrorCode*/) { - // Do not call ubrk_close() so that we do not depend on all of the BreakIterator code. - delete reinterpret_cast(csm->iter); - csm->iter=iterToAdopt; +ucasemap_setBreakIterator(UCaseMap *csm, UBreakIterator *iterToAdopt, UErrorCode *pErrorCode) { + if(U_FAILURE(*pErrorCode)) { + return; + } + delete csm->iter; + csm->iter=reinterpret_cast(iterToAdopt); } U_CAPI int32_t U_EXPORT2 @@ -47,21 +103,30 @@ ucasemap_utf8ToTitle(UCaseMap *csm, char *dest, int32_t destCapacity, const char *src, int32_t srcLength, UErrorCode *pErrorCode) { + if (U_FAILURE(*pErrorCode)) { + return 0; + } UText utext=UTEXT_INITIALIZER; utext_openUTF8(&utext, (const char *)src, srcLength, pErrorCode); - if(U_FAILURE(*pErrorCode)) { + if (U_FAILURE(*pErrorCode)) { return 0; } if(csm->iter==NULL) { - csm->iter=ubrk_open(UBRK_WORD, csm->locale, - NULL, 0, - pErrorCode); + LocalPointer ownedIter; + BreakIterator *iter = ustrcase_getTitleBreakIterator( + nullptr, csm->locale, csm->options, nullptr, ownedIter, *pErrorCode); + if (iter == nullptr) { + utext_close(&utext); + return 0; + } + csm->iter = ownedIter.orphan(); } - ubrk_setUText(csm->iter, &utext, pErrorCode); - int32_t length=ucasemap_mapUTF8(csm, - (uint8_t *)dest, destCapacity, - (const uint8_t *)src, srcLength, - ucasemap_internalUTF8ToTitle, pErrorCode); + csm->iter->setText(&utext, *pErrorCode); + int32_t length=ucasemap_mapUTF8( + csm->caseLocale, csm->options, csm->iter, + dest, destCapacity, + src, srcLength, + ucasemap_internalUTF8ToTitle, NULL, *pErrorCode); utext_close(&utext); return length; } diff --git a/Build/source/libs/icu/icu-src/source/common/ucat.c b/Build/source/libs/icu/icu-src/source/common/ucat.c deleted file mode 100644 index cfd8b532958..00000000000 --- a/Build/source/libs/icu/icu-src/source/common/ucat.c +++ /dev/null @@ -1,78 +0,0 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. -// License & terms of use: http://www.unicode.org/copyright.html -/* -********************************************************************** -* Copyright (c) 2003, International Business Machines -* Corporation and others. All Rights Reserved. -********************************************************************** -* Author: Alan Liu -* Created: March 19 2003 -* Since: ICU 2.6 -********************************************************************** -*/ -#include "unicode/ucat.h" -#include "unicode/ustring.h" -#include "cstring.h" -#include "uassert.h" - -/* Separator between set_num and msg_num */ -static const char SEPARATOR = '%'; - -/* Maximum length of a set_num/msg_num key, incl. terminating zero. - * Longest possible key is "-2147483648%-2147483648" */ -#define MAX_KEY_LEN (24) - -/** - * Fill in buffer with a set_num/msg_num key string, given the numeric - * values. Numeric values must be >= 0. Buffer must be of length - * MAX_KEY_LEN or more. - */ -static char* -_catkey(char* buffer, int32_t set_num, int32_t msg_num) { - int32_t i = 0; - i = T_CString_integerToString(buffer, set_num, 10); - buffer[i++] = SEPARATOR; - T_CString_integerToString(buffer+i, msg_num, 10); - return buffer; -} - -U_CAPI u_nl_catd U_EXPORT2 -u_catopen(const char* name, const char* locale, UErrorCode* ec) { - return (u_nl_catd) ures_open(name, locale, ec); -} - -U_CAPI void U_EXPORT2 -u_catclose(u_nl_catd catd) { - ures_close((UResourceBundle*) catd); /* may be NULL */ -} - -U_CAPI const UChar* U_EXPORT2 -u_catgets(u_nl_catd catd, int32_t set_num, int32_t msg_num, - const UChar* s, - int32_t* len, UErrorCode* ec) { - - char key[MAX_KEY_LEN]; - const UChar* result; - - if (ec == NULL || U_FAILURE(*ec)) { - goto ERROR; - } - - result = ures_getStringByKey((const UResourceBundle*) catd, - _catkey(key, set_num, msg_num), - len, ec); - if (U_FAILURE(*ec)) { - goto ERROR; - } - - return result; - - ERROR: - /* In case of any failure, return s */ - if (len != NULL) { - *len = u_strlen(s); - } - return s; -} - -/*eof*/ diff --git a/Build/source/libs/icu/icu-src/source/common/ucat.cpp b/Build/source/libs/icu/icu-src/source/common/ucat.cpp new file mode 100644 index 00000000000..dac56eeb5ce --- /dev/null +++ b/Build/source/libs/icu/icu-src/source/common/ucat.cpp @@ -0,0 +1,78 @@ +// © 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html +/* +********************************************************************** +* Copyright (c) 2003, International Business Machines +* Corporation and others. All Rights Reserved. +********************************************************************** +* Author: Alan Liu +* Created: March 19 2003 +* Since: ICU 2.6 +********************************************************************** +*/ +#include "unicode/ucat.h" +#include "unicode/ustring.h" +#include "cstring.h" +#include "uassert.h" + +/* Separator between set_num and msg_num */ +static const char SEPARATOR = '%'; + +/* Maximum length of a set_num/msg_num key, incl. terminating zero. + * Longest possible key is "-2147483648%-2147483648" */ +#define MAX_KEY_LEN (24) + +/** + * Fill in buffer with a set_num/msg_num key string, given the numeric + * values. Numeric values must be >= 0. Buffer must be of length + * MAX_KEY_LEN or more. + */ +static char* +_catkey(char* buffer, int32_t set_num, int32_t msg_num) { + int32_t i = 0; + i = T_CString_integerToString(buffer, set_num, 10); + buffer[i++] = SEPARATOR; + T_CString_integerToString(buffer+i, msg_num, 10); + return buffer; +} + +U_CAPI u_nl_catd U_EXPORT2 +u_catopen(const char* name, const char* locale, UErrorCode* ec) { + return (u_nl_catd) ures_open(name, locale, ec); +} + +U_CAPI void U_EXPORT2 +u_catclose(u_nl_catd catd) { + ures_close((UResourceBundle*) catd); /* may be NULL */ +} + +U_CAPI const UChar* U_EXPORT2 +u_catgets(u_nl_catd catd, int32_t set_num, int32_t msg_num, + const UChar* s, + int32_t* len, UErrorCode* ec) { + + char key[MAX_KEY_LEN]; + const UChar* result; + + if (ec == NULL || U_FAILURE(*ec)) { + goto ERROR; + } + + result = ures_getStringByKey((const UResourceBundle*) catd, + _catkey(key, set_num, msg_num), + len, ec); + if (U_FAILURE(*ec)) { + goto ERROR; + } + + return result; + + ERROR: + /* In case of any failure, return s */ + if (len != NULL) { + *len = u_strlen(s); + } + return s; +} + +/*eof*/ diff --git a/Build/source/libs/icu/icu-src/source/common/uchar.c b/Build/source/libs/icu/icu-src/source/common/uchar.c deleted file mode 100644 index 496df86f4ce..00000000000 --- a/Build/source/libs/icu/icu-src/source/common/uchar.c +++ /dev/null @@ -1,733 +0,0 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. -// License & terms of use: http://www.unicode.org/copyright.html -/* -******************************************************************************** -* Copyright (C) 1996-2016, International Business Machines -* Corporation and others. All Rights Reserved. -******************************************************************************** -* -* File UCHAR.C -* -* Modification History: -* -* Date Name Description -* 04/02/97 aliu Creation. -* 4/15/99 Madhu Updated all the function definitions for C Implementation -* 5/20/99 Madhu Added the function u_getVersion() -* 8/19/1999 srl Upgraded scripts to Unicode3.0 -* 11/11/1999 weiv added u_isalnum(), cleaned comments -* 01/11/2000 helena Renamed u_getVersion to u_getUnicodeVersion. -* 06/20/2000 helena OS/400 port changes; mostly typecast. -****************************************************************************** -*/ - -#include "unicode/utypes.h" -#include "unicode/uchar.h" -#include "unicode/uscript.h" -#include "unicode/udata.h" -#include "uassert.h" -#include "cmemory.h" -#include "ucln_cmn.h" -#include "utrie2.h" -#include "udataswp.h" -#include "uprops.h" -#include "ustr_imp.h" - -/* uchar_props_data.h is machine-generated by genprops --csource */ -#define INCLUDED_FROM_UCHAR_C -#include "uchar_props_data.h" - -/* constants and macros for access to the data ------------------------------ */ - -/* getting a uint32_t properties word from the data */ -#define GET_PROPS(c, result) ((result)=UTRIE2_GET16(&propsTrie, c)); - -U_CFUNC UBool -uprv_haveProperties(UErrorCode *pErrorCode) { - if(U_FAILURE(*pErrorCode)) { - return FALSE; - } - return TRUE; -} - -/* API functions ------------------------------------------------------------ */ - -/* Gets the Unicode character's general category.*/ -U_CAPI int8_t U_EXPORT2 -u_charType(UChar32 c) { - uint32_t props; - GET_PROPS(c, props); - return (int8_t)GET_CATEGORY(props); -} - -/* Enumerate all code points with their general categories. */ -struct _EnumTypeCallback { - UCharEnumTypeRange *enumRange; - const void *context; -}; - -static uint32_t U_CALLCONV -_enumTypeValue(const void *context, uint32_t value) { - return GET_CATEGORY(value); -} - -static UBool U_CALLCONV -_enumTypeRange(const void *context, UChar32 start, UChar32 end, uint32_t value) { - /* just cast the value to UCharCategory */ - return ((struct _EnumTypeCallback *)context)-> - enumRange(((struct _EnumTypeCallback *)context)->context, - start, end+1, (UCharCategory)value); -} - -U_CAPI void U_EXPORT2 -u_enumCharTypes(UCharEnumTypeRange *enumRange, const void *context) { - struct _EnumTypeCallback callback; - - if(enumRange==NULL) { - return; - } - - callback.enumRange=enumRange; - callback.context=context; - utrie2_enum(&propsTrie, _enumTypeValue, _enumTypeRange, &callback); -} - -/* Checks if ch is a lower case letter.*/ -U_CAPI UBool U_EXPORT2 -u_islower(UChar32 c) { - uint32_t props; - GET_PROPS(c, props); - return (UBool)(GET_CATEGORY(props)==U_LOWERCASE_LETTER); -} - -/* Checks if ch is an upper case letter.*/ -U_CAPI UBool U_EXPORT2 -u_isupper(UChar32 c) { - uint32_t props; - GET_PROPS(c, props); - return (UBool)(GET_CATEGORY(props)==U_UPPERCASE_LETTER); -} - -/* Checks if ch is a title case letter; usually upper case letters.*/ -U_CAPI UBool U_EXPORT2 -u_istitle(UChar32 c) { - uint32_t props; - GET_PROPS(c, props); - return (UBool)(GET_CATEGORY(props)==U_TITLECASE_LETTER); -} - -/* Checks if ch is a decimal digit. */ -U_CAPI UBool U_EXPORT2 -u_isdigit(UChar32 c) { - uint32_t props; - GET_PROPS(c, props); - return (UBool)(GET_CATEGORY(props)==U_DECIMAL_DIGIT_NUMBER); -} - -U_CAPI UBool U_EXPORT2 -u_isxdigit(UChar32 c) { - uint32_t props; - - /* check ASCII and Fullwidth ASCII a-fA-F */ - if( - (c<=0x66 && c>=0x41 && (c<=0x46 || c>=0x61)) || - (c>=0xff21 && c<=0xff46 && (c<=0xff26 || c>=0xff41)) - ) { - return TRUE; - } - - GET_PROPS(c, props); - return (UBool)(GET_CATEGORY(props)==U_DECIMAL_DIGIT_NUMBER); -} - -/* Checks if the Unicode character is a letter.*/ -U_CAPI UBool U_EXPORT2 -u_isalpha(UChar32 c) { - uint32_t props; - GET_PROPS(c, props); - return (UBool)((CAT_MASK(props)&U_GC_L_MASK)!=0); -} - -U_CAPI UBool U_EXPORT2 -u_isUAlphabetic(UChar32 c) { - return (u_getUnicodeProperties(c, 1)&U_MASK(UPROPS_ALPHABETIC))!=0; -} - -/* Checks if c is a letter or a decimal digit */ -U_CAPI UBool U_EXPORT2 -u_isalnum(UChar32 c) { - uint32_t props; - GET_PROPS(c, props); - return (UBool)((CAT_MASK(props)&(U_GC_L_MASK|U_GC_ND_MASK))!=0); -} - -/** - * Checks if c is alphabetic, or a decimal digit; implements UCHAR_POSIX_ALNUM. - * @internal - */ -U_CFUNC UBool -u_isalnumPOSIX(UChar32 c) { - return (UBool)(u_isUAlphabetic(c) || u_isdigit(c)); -} - -/* Checks if ch is a unicode character with assigned character type.*/ -U_CAPI UBool U_EXPORT2 -u_isdefined(UChar32 c) { - uint32_t props; - GET_PROPS(c, props); - return (UBool)(GET_CATEGORY(props)!=0); -} - -/* Checks if the Unicode character is a base form character that can take a diacritic.*/ -U_CAPI UBool U_EXPORT2 -u_isbase(UChar32 c) { - uint32_t props; - GET_PROPS(c, props); - return (UBool)((CAT_MASK(props)&(U_GC_L_MASK|U_GC_N_MASK|U_GC_MC_MASK|U_GC_ME_MASK))!=0); -} - -/* Checks if the Unicode character is a control character.*/ -U_CAPI UBool U_EXPORT2 -u_iscntrl(UChar32 c) { - uint32_t props; - GET_PROPS(c, props); - return (UBool)((CAT_MASK(props)&(U_GC_CC_MASK|U_GC_CF_MASK|U_GC_ZL_MASK|U_GC_ZP_MASK))!=0); -} - -U_CAPI UBool U_EXPORT2 -u_isISOControl(UChar32 c) { - return (uint32_t)c<=0x9f && (c<=0x1f || c>=0x7f); -} - -/* Some control characters that are used as space. */ -#define IS_THAT_CONTROL_SPACE(c) \ - (c<=0x9f && ((c>=TAB && c<=CR) || (c>=0x1c && c <=0x1f) || c==NL)) - -/* Java has decided that U+0085 New Line is not whitespace any more. */ -#define IS_THAT_ASCII_CONTROL_SPACE(c) \ - (c<=0x1f && c>=TAB && (c<=CR || c>=0x1c)) - -/* Checks if the Unicode character is a space character.*/ -U_CAPI UBool U_EXPORT2 -u_isspace(UChar32 c) { - uint32_t props; - GET_PROPS(c, props); - return (UBool)((CAT_MASK(props)&U_GC_Z_MASK)!=0 || IS_THAT_CONTROL_SPACE(c)); -} - -U_CAPI UBool U_EXPORT2 -u_isJavaSpaceChar(UChar32 c) { - uint32_t props; - GET_PROPS(c, props); - return (UBool)((CAT_MASK(props)&U_GC_Z_MASK)!=0); -} - -/* Checks if the Unicode character is a whitespace character.*/ -U_CAPI UBool U_EXPORT2 -u_isWhitespace(UChar32 c) { - uint32_t props; - GET_PROPS(c, props); - return (UBool)( - ((CAT_MASK(props)&U_GC_Z_MASK)!=0 && - c!=NBSP && c!=FIGURESP && c!=NNBSP) || /* exclude no-break spaces */ - IS_THAT_ASCII_CONTROL_SPACE(c) - ); -} - -U_CAPI UBool U_EXPORT2 -u_isblank(UChar32 c) { - if((uint32_t)c<=0x9f) { - return c==9 || c==0x20; /* TAB or SPACE */ - } else { - /* Zs */ - uint32_t props; - GET_PROPS(c, props); - return (UBool)(GET_CATEGORY(props)==U_SPACE_SEPARATOR); - } -} - -U_CAPI UBool U_EXPORT2 -u_isUWhiteSpace(UChar32 c) { - return (u_getUnicodeProperties(c, 1)&U_MASK(UPROPS_WHITE_SPACE))!=0; -} - -/* Checks if the Unicode character is printable.*/ -U_CAPI UBool U_EXPORT2 -u_isprint(UChar32 c) { - uint32_t props; - GET_PROPS(c, props); - /* comparing ==0 returns FALSE for the categories mentioned */ - return (UBool)((CAT_MASK(props)&U_GC_C_MASK)==0); -} - -/** - * Checks if c is in \p{graph}\p{blank} - \p{cntrl}. - * Implements UCHAR_POSIX_PRINT. - * @internal - */ -U_CFUNC UBool -u_isprintPOSIX(UChar32 c) { - uint32_t props; - GET_PROPS(c, props); - /* - * The only cntrl character in graph+blank is TAB (in blank). - * Here we implement (blank-TAB)=Zs instead of calling u_isblank(). - */ - return (UBool)((GET_CATEGORY(props)==U_SPACE_SEPARATOR) || u_isgraphPOSIX(c)); -} - -U_CAPI UBool U_EXPORT2 -u_isgraph(UChar32 c) { - uint32_t props; - GET_PROPS(c, props); - /* comparing ==0 returns FALSE for the categories mentioned */ - return (UBool)((CAT_MASK(props)& - (U_GC_CC_MASK|U_GC_CF_MASK|U_GC_CS_MASK|U_GC_CN_MASK|U_GC_Z_MASK)) - ==0); -} - -/** - * Checks if c is in - * [^\p{space}\p{gc=Control}\p{gc=Surrogate}\p{gc=Unassigned}] - * with space=\p{Whitespace} and Control=Cc. - * Implements UCHAR_POSIX_GRAPH. - * @internal - */ -U_CFUNC UBool -u_isgraphPOSIX(UChar32 c) { - uint32_t props; - GET_PROPS(c, props); - /* \p{space}\p{gc=Control} == \p{gc=Z}\p{Control} */ - /* comparing ==0 returns FALSE for the categories mentioned */ - return (UBool)((CAT_MASK(props)& - (U_GC_CC_MASK|U_GC_CS_MASK|U_GC_CN_MASK|U_GC_Z_MASK)) - ==0); -} - -U_CAPI UBool U_EXPORT2 -u_ispunct(UChar32 c) { - uint32_t props; - GET_PROPS(c, props); - return (UBool)((CAT_MASK(props)&U_GC_P_MASK)!=0); -} - -/* Checks if the Unicode character can start a Unicode identifier.*/ -U_CAPI UBool U_EXPORT2 -u_isIDStart(UChar32 c) { - /* same as u_isalpha() */ - uint32_t props; - GET_PROPS(c, props); - return (UBool)((CAT_MASK(props)&(U_GC_L_MASK|U_GC_NL_MASK))!=0); -} - -/* Checks if the Unicode character can be a Unicode identifier part other than starting the - identifier.*/ -U_CAPI UBool U_EXPORT2 -u_isIDPart(UChar32 c) { - uint32_t props; - GET_PROPS(c, props); - return (UBool)( - (CAT_MASK(props)& - (U_GC_ND_MASK|U_GC_NL_MASK| - U_GC_L_MASK| - U_GC_PC_MASK|U_GC_MC_MASK|U_GC_MN_MASK) - )!=0 || - u_isIDIgnorable(c)); -} - -/*Checks if the Unicode character can be ignorable in a Java or Unicode identifier.*/ -U_CAPI UBool U_EXPORT2 -u_isIDIgnorable(UChar32 c) { - if(c<=0x9f) { - return u_isISOControl(c) && !IS_THAT_ASCII_CONTROL_SPACE(c); - } else { - uint32_t props; - GET_PROPS(c, props); - return (UBool)(GET_CATEGORY(props)==U_FORMAT_CHAR); - } -} - -/*Checks if the Unicode character can start a Java identifier.*/ -U_CAPI UBool U_EXPORT2 -u_isJavaIDStart(UChar32 c) { - uint32_t props; - GET_PROPS(c, props); - return (UBool)((CAT_MASK(props)&(U_GC_L_MASK|U_GC_SC_MASK|U_GC_PC_MASK))!=0); -} - -/*Checks if the Unicode character can be a Java identifier part other than starting the - * identifier. - */ -U_CAPI UBool U_EXPORT2 -u_isJavaIDPart(UChar32 c) { - uint32_t props; - GET_PROPS(c, props); - return (UBool)( - (CAT_MASK(props)& - (U_GC_ND_MASK|U_GC_NL_MASK| - U_GC_L_MASK| - U_GC_SC_MASK|U_GC_PC_MASK| - U_GC_MC_MASK|U_GC_MN_MASK) - )!=0 || - u_isIDIgnorable(c)); -} - -U_CAPI int32_t U_EXPORT2 -u_charDigitValue(UChar32 c) { - uint32_t props; - int32_t value; - GET_PROPS(c, props); - value=(int32_t)GET_NUMERIC_TYPE_VALUE(props)-UPROPS_NTV_DECIMAL_START; - if(value<=9) { - return value; - } else { - return -1; - } -} - -U_CAPI double U_EXPORT2 -u_getNumericValue(UChar32 c) { - uint32_t props; - int32_t ntv; - GET_PROPS(c, props); - ntv=(int32_t)GET_NUMERIC_TYPE_VALUE(props); - - if(ntv==UPROPS_NTV_NONE) { - return U_NO_NUMERIC_VALUE; - } else if(ntv>4)-12; - int32_t denominator=(ntv&0xf)+1; - return (double)numerator/denominator; - } else if(ntv>5)-14; - int32_t exp=(ntv&0x1f)+2; - numValue=mant; - - /* multiply by 10^exp without math.h */ - while(exp>=4) { - numValue*=10000.; - exp-=4; - } - switch(exp) { - case 3: - numValue*=1000.; - break; - case 2: - numValue*=100.; - break; - case 1: - numValue*=10.; - break; - case 0: - default: - break; - } - - return numValue; - } else if(ntv>2)-0xbf; - int32_t exp=(ntv&3)+1; - - switch(exp) { - case 4: - numValue*=60*60*60*60; - break; - case 3: - numValue*=60*60*60; - break; - case 2: - numValue*=60*60; - break; - case 1: - numValue*=60; - break; - case 0: - default: - break; - } - - return numValue; - } else if(ntv>2); - return (double)numerator/denominator; - } else { - /* reserved */ - return U_NO_NUMERIC_VALUE; - } -} - -U_CAPI int32_t U_EXPORT2 -u_digit(UChar32 ch, int8_t radix) { - int8_t value; - if((uint8_t)(radix-2)<=(36-2)) { - value=(int8_t)u_charDigitValue(ch); - if(value<0) { - /* ch is not a decimal digit, try latin letters */ - if(ch>=0x61 && ch<=0x7A) { - value=(int8_t)(ch-0x57); /* ch - 'a' + 10 */ - } else if(ch>=0x41 && ch<=0x5A) { - value=(int8_t)(ch-0x37); /* ch - 'A' + 10 */ - } else if(ch>=0xFF41 && ch<=0xFF5A) { - value=(int8_t)(ch-0xFF37); /* fullwidth ASCII a-z */ - } else if(ch>=0xFF21 && ch<=0xFF3A) { - value=(int8_t)(ch-0xFF17); /* fullwidth ASCII A-Z */ - } - } - } else { - value=-1; /* invalid radix */ - } - return (int8_t)((value(36-2) || (uint32_t)digit>=(uint32_t)radix) { - return 0; - } else if(digit<10) { - return (UChar32)(0x30+digit); - } else { - return (UChar32)((0x61-10)+digit); - } -} - -/* miscellaneous, and support for uprops.cpp -------------------------------- */ - -U_CAPI void U_EXPORT2 -u_getUnicodeVersion(UVersionInfo versionArray) { - if(versionArray!=NULL) { - uprv_memcpy(versionArray, dataVersion, U_MAX_VERSION_LENGTH); - } -} - -U_CFUNC uint32_t -u_getMainProperties(UChar32 c) { - uint32_t props; - GET_PROPS(c, props); - return props; -} - -U_CFUNC uint32_t -u_getUnicodeProperties(UChar32 c, int32_t column) { - U_ASSERT(column>=0); - if(column>=propsVectorsColumns) { - return 0; - } else { - uint16_t vecIndex=UTRIE2_GET16(&propsVectorsTrie, c); - return propsVectors[vecIndex+column]; - } -} - -U_CFUNC int32_t -uprv_getMaxValues(int32_t column) { - switch(column) { - case 0: - return indexes[UPROPS_MAX_VALUES_INDEX]; - case 2: - return indexes[UPROPS_MAX_VALUES_2_INDEX]; - default: - return 0; - } -} - -U_CAPI void U_EXPORT2 -u_charAge(UChar32 c, UVersionInfo versionArray) { - if(versionArray!=NULL) { - uint32_t version=u_getUnicodeProperties(c, 0)>>UPROPS_AGE_SHIFT; - versionArray[0]=(uint8_t)(version>>4); - versionArray[1]=(uint8_t)(version&0xf); - versionArray[2]=versionArray[3]=0; - } -} - -U_CAPI UScriptCode U_EXPORT2 -uscript_getScript(UChar32 c, UErrorCode *pErrorCode) { - uint32_t scriptX; - if(pErrorCode==NULL || U_FAILURE(*pErrorCode)) { - return USCRIPT_INVALID_CODE; - } - if((uint32_t)c>0x10ffff) { - *pErrorCode=U_ILLEGAL_ARGUMENT_ERROR; - return USCRIPT_INVALID_CODE; - } - scriptX=u_getUnicodeProperties(c, 0)&UPROPS_SCRIPT_X_MASK; - if(scriptX=UPROPS_SCRIPT_X_WITH_OTHER) { - scx=scriptExtensions+scx[1]; - } - if(sc>=USCRIPT_CODE_LIMIT) { - /* Guard against bogus input that would make us go past the Script_Extensions terminator. */ - return FALSE; - } - while(sc>*scx) { - ++scx; - } - return sc==(*scx&0x7fff); -} - -U_CAPI int32_t U_EXPORT2 -uscript_getScriptExtensions(UChar32 c, - UScriptCode *scripts, int32_t capacity, - UErrorCode *pErrorCode) { - uint32_t scriptX; - int32_t length; - const uint16_t *scx; - uint16_t sx; - if(pErrorCode==NULL || U_FAILURE(*pErrorCode)) { - return 0; - } - if(capacity<0 || (capacity>0 && scripts==NULL)) { - *pErrorCode=U_ILLEGAL_ARGUMENT_ERROR; - return 0; - } - scriptX=u_getUnicodeProperties(c, 0)&UPROPS_SCRIPT_X_MASK; - if(scriptX=UPROPS_SCRIPT_X_WITH_OTHER) { - scx=scriptExtensions+scx[1]; - } - length=0; - do { - sx=*scx++; - if(lengthcapacity) { - *pErrorCode=U_BUFFER_OVERFLOW_ERROR; - } - return length; -} - -U_CAPI UBlockCode U_EXPORT2 -ublock_getCode(UChar32 c) { - return (UBlockCode)((u_getUnicodeProperties(c, 0)&UPROPS_BLOCK_MASK)>>UPROPS_BLOCK_SHIFT); -} - -/* property starts for UnicodeSet ------------------------------------------- */ - -static UBool U_CALLCONV -_enumPropertyStartsRange(const void *context, UChar32 start, UChar32 end, uint32_t value) { - /* add the start code point to the USet */ - const USetAdder *sa=(const USetAdder *)context; - sa->add(sa->set, start); - return TRUE; -} - -#define USET_ADD_CP_AND_NEXT(sa, cp) sa->add(sa->set, cp); sa->add(sa->set, cp+1) - -U_CFUNC void U_EXPORT2 -uchar_addPropertyStarts(const USetAdder *sa, UErrorCode *pErrorCode) { - if(U_FAILURE(*pErrorCode)) { - return; - } - - /* add the start code point of each same-value range of the main trie */ - utrie2_enum(&propsTrie, NULL, _enumPropertyStartsRange, sa); - - /* add code points with hardcoded properties, plus the ones following them */ - - /* add for u_isblank() */ - USET_ADD_CP_AND_NEXT(sa, TAB); - - /* add for IS_THAT_CONTROL_SPACE() */ - sa->add(sa->set, CR+1); /* range TAB..CR */ - sa->add(sa->set, 0x1c); - sa->add(sa->set, 0x1f+1); - USET_ADD_CP_AND_NEXT(sa, NL); - - /* add for u_isIDIgnorable() what was not added above */ - sa->add(sa->set, DEL); /* range DEL..NBSP-1, NBSP added below */ - sa->add(sa->set, HAIRSP); - sa->add(sa->set, RLM+1); - sa->add(sa->set, INHSWAP); - sa->add(sa->set, NOMDIG+1); - USET_ADD_CP_AND_NEXT(sa, ZWNBSP); - - /* add no-break spaces for u_isWhitespace() what was not added above */ - USET_ADD_CP_AND_NEXT(sa, NBSP); - USET_ADD_CP_AND_NEXT(sa, FIGURESP); - USET_ADD_CP_AND_NEXT(sa, NNBSP); - - /* add for u_digit() */ - sa->add(sa->set, U_a); - sa->add(sa->set, U_z+1); - sa->add(sa->set, U_A); - sa->add(sa->set, U_Z+1); - sa->add(sa->set, U_FW_a); - sa->add(sa->set, U_FW_z+1); - sa->add(sa->set, U_FW_A); - sa->add(sa->set, U_FW_Z+1); - - /* add for u_isxdigit() */ - sa->add(sa->set, U_f+1); - sa->add(sa->set, U_F+1); - sa->add(sa->set, U_FW_f+1); - sa->add(sa->set, U_FW_F+1); - - /* add for UCHAR_DEFAULT_IGNORABLE_CODE_POINT what was not added above */ - sa->add(sa->set, WJ); /* range WJ..NOMDIG */ - sa->add(sa->set, 0xfff0); - sa->add(sa->set, 0xfffb+1); - sa->add(sa->set, 0xe0000); - sa->add(sa->set, 0xe0fff+1); - - /* add for UCHAR_GRAPHEME_BASE and others */ - USET_ADD_CP_AND_NEXT(sa, CGJ); -} - -U_CFUNC void U_EXPORT2 -upropsvec_addPropertyStarts(const USetAdder *sa, UErrorCode *pErrorCode) { - if(U_FAILURE(*pErrorCode)) { - return; - } - - /* add the start code point of each same-value range of the properties vectors trie */ - if(propsVectorsColumns>0) { - /* if propsVectorsColumns==0 then the properties vectors trie may not be there at all */ - utrie2_enum(&propsVectorsTrie, NULL, _enumPropertyStartsRange, sa); - } -} diff --git a/Build/source/libs/icu/icu-src/source/common/uchar.cpp b/Build/source/libs/icu/icu-src/source/common/uchar.cpp new file mode 100644 index 00000000000..a7374b7e9ad --- /dev/null +++ b/Build/source/libs/icu/icu-src/source/common/uchar.cpp @@ -0,0 +1,733 @@ +// © 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html +/* +******************************************************************************** +* Copyright (C) 1996-2016, International Business Machines +* Corporation and others. All Rights Reserved. +******************************************************************************** +* +* File UCHAR.C +* +* Modification History: +* +* Date Name Description +* 04/02/97 aliu Creation. +* 4/15/99 Madhu Updated all the function definitions for C Implementation +* 5/20/99 Madhu Added the function u_getVersion() +* 8/19/1999 srl Upgraded scripts to Unicode3.0 +* 11/11/1999 weiv added u_isalnum(), cleaned comments +* 01/11/2000 helena Renamed u_getVersion to u_getUnicodeVersion. +* 06/20/2000 helena OS/400 port changes; mostly typecast. +****************************************************************************** +*/ + +#include "unicode/utypes.h" +#include "unicode/uchar.h" +#include "unicode/uscript.h" +#include "unicode/udata.h" +#include "uassert.h" +#include "cmemory.h" +#include "ucln_cmn.h" +#include "utrie2.h" +#include "udataswp.h" +#include "uprops.h" +#include "ustr_imp.h" + +/* uchar_props_data.h is machine-generated by genprops --csource */ +#define INCLUDED_FROM_UCHAR_C +#include "uchar_props_data.h" + +/* constants and macros for access to the data ------------------------------ */ + +/* getting a uint32_t properties word from the data */ +#define GET_PROPS(c, result) ((result)=UTRIE2_GET16(&propsTrie, c)); + +U_CFUNC UBool +uprv_haveProperties(UErrorCode *pErrorCode) { + if(U_FAILURE(*pErrorCode)) { + return FALSE; + } + return TRUE; +} + +/* API functions ------------------------------------------------------------ */ + +/* Gets the Unicode character's general category.*/ +U_CAPI int8_t U_EXPORT2 +u_charType(UChar32 c) { + uint32_t props; + GET_PROPS(c, props); + return (int8_t)GET_CATEGORY(props); +} + +/* Enumerate all code points with their general categories. */ +struct _EnumTypeCallback { + UCharEnumTypeRange *enumRange; + const void *context; +}; + +static uint32_t U_CALLCONV +_enumTypeValue(const void *context, uint32_t value) { + (void)context; + return GET_CATEGORY(value); +} + +static UBool U_CALLCONV +_enumTypeRange(const void *context, UChar32 start, UChar32 end, uint32_t value) { + /* just cast the value to UCharCategory */ + return ((struct _EnumTypeCallback *)context)-> + enumRange(((struct _EnumTypeCallback *)context)->context, + start, end+1, (UCharCategory)value); +} + +U_CAPI void U_EXPORT2 +u_enumCharTypes(UCharEnumTypeRange *enumRange, const void *context) { + struct _EnumTypeCallback callback; + + if(enumRange==NULL) { + return; + } + + callback.enumRange=enumRange; + callback.context=context; + utrie2_enum(&propsTrie, _enumTypeValue, _enumTypeRange, &callback); +} + +/* Checks if ch is a lower case letter.*/ +U_CAPI UBool U_EXPORT2 +u_islower(UChar32 c) { + uint32_t props; + GET_PROPS(c, props); + return (UBool)(GET_CATEGORY(props)==U_LOWERCASE_LETTER); +} + +/* Checks if ch is an upper case letter.*/ +U_CAPI UBool U_EXPORT2 +u_isupper(UChar32 c) { + uint32_t props; + GET_PROPS(c, props); + return (UBool)(GET_CATEGORY(props)==U_UPPERCASE_LETTER); +} + +/* Checks if ch is a title case letter; usually upper case letters.*/ +U_CAPI UBool U_EXPORT2 +u_istitle(UChar32 c) { + uint32_t props; + GET_PROPS(c, props); + return (UBool)(GET_CATEGORY(props)==U_TITLECASE_LETTER); +} + +/* Checks if ch is a decimal digit. */ +U_CAPI UBool U_EXPORT2 +u_isdigit(UChar32 c) { + uint32_t props; + GET_PROPS(c, props); + return (UBool)(GET_CATEGORY(props)==U_DECIMAL_DIGIT_NUMBER); +} + +U_CAPI UBool U_EXPORT2 +u_isxdigit(UChar32 c) { + uint32_t props; + + /* check ASCII and Fullwidth ASCII a-fA-F */ + if( + (c<=0x66 && c>=0x41 && (c<=0x46 || c>=0x61)) || + (c>=0xff21 && c<=0xff46 && (c<=0xff26 || c>=0xff41)) + ) { + return TRUE; + } + + GET_PROPS(c, props); + return (UBool)(GET_CATEGORY(props)==U_DECIMAL_DIGIT_NUMBER); +} + +/* Checks if the Unicode character is a letter.*/ +U_CAPI UBool U_EXPORT2 +u_isalpha(UChar32 c) { + uint32_t props; + GET_PROPS(c, props); + return (UBool)((CAT_MASK(props)&U_GC_L_MASK)!=0); +} + +U_CAPI UBool U_EXPORT2 +u_isUAlphabetic(UChar32 c) { + return (u_getUnicodeProperties(c, 1)&U_MASK(UPROPS_ALPHABETIC))!=0; +} + +/* Checks if c is a letter or a decimal digit */ +U_CAPI UBool U_EXPORT2 +u_isalnum(UChar32 c) { + uint32_t props; + GET_PROPS(c, props); + return (UBool)((CAT_MASK(props)&(U_GC_L_MASK|U_GC_ND_MASK))!=0); +} + +/** + * Checks if c is alphabetic, or a decimal digit; implements UCHAR_POSIX_ALNUM. + * @internal + */ +U_CFUNC UBool +u_isalnumPOSIX(UChar32 c) { + return (UBool)(u_isUAlphabetic(c) || u_isdigit(c)); +} + +/* Checks if ch is a unicode character with assigned character type.*/ +U_CAPI UBool U_EXPORT2 +u_isdefined(UChar32 c) { + uint32_t props; + GET_PROPS(c, props); + return (UBool)(GET_CATEGORY(props)!=0); +} + +/* Checks if the Unicode character is a base form character that can take a diacritic.*/ +U_CAPI UBool U_EXPORT2 +u_isbase(UChar32 c) { + uint32_t props; + GET_PROPS(c, props); + return (UBool)((CAT_MASK(props)&(U_GC_L_MASK|U_GC_N_MASK|U_GC_MC_MASK|U_GC_ME_MASK))!=0); +} + +/* Checks if the Unicode character is a control character.*/ +U_CAPI UBool U_EXPORT2 +u_iscntrl(UChar32 c) { + uint32_t props; + GET_PROPS(c, props); + return (UBool)((CAT_MASK(props)&(U_GC_CC_MASK|U_GC_CF_MASK|U_GC_ZL_MASK|U_GC_ZP_MASK))!=0); +} + +U_CAPI UBool U_EXPORT2 +u_isISOControl(UChar32 c) { + return (uint32_t)c<=0x9f && (c<=0x1f || c>=0x7f); +} + +/* Some control characters that are used as space. */ +#define IS_THAT_CONTROL_SPACE(c) \ + (c<=0x9f && ((c>=TAB && c<=CR) || (c>=0x1c && c <=0x1f) || c==NL)) + +/* Java has decided that U+0085 New Line is not whitespace any more. */ +#define IS_THAT_ASCII_CONTROL_SPACE(c) \ + (c<=0x1f && c>=TAB && (c<=CR || c>=0x1c)) + +/* Checks if the Unicode character is a space character.*/ +U_CAPI UBool U_EXPORT2 +u_isspace(UChar32 c) { + uint32_t props; + GET_PROPS(c, props); + return (UBool)((CAT_MASK(props)&U_GC_Z_MASK)!=0 || IS_THAT_CONTROL_SPACE(c)); +} + +U_CAPI UBool U_EXPORT2 +u_isJavaSpaceChar(UChar32 c) { + uint32_t props; + GET_PROPS(c, props); + return (UBool)((CAT_MASK(props)&U_GC_Z_MASK)!=0); +} + +/* Checks if the Unicode character is a whitespace character.*/ +U_CAPI UBool U_EXPORT2 +u_isWhitespace(UChar32 c) { + uint32_t props; + GET_PROPS(c, props); + return (UBool)( + ((CAT_MASK(props)&U_GC_Z_MASK)!=0 && + c!=NBSP && c!=FIGURESP && c!=NNBSP) || /* exclude no-break spaces */ + IS_THAT_ASCII_CONTROL_SPACE(c) + ); +} + +U_CAPI UBool U_EXPORT2 +u_isblank(UChar32 c) { + if((uint32_t)c<=0x9f) { + return c==9 || c==0x20; /* TAB or SPACE */ + } else { + /* Zs */ + uint32_t props; + GET_PROPS(c, props); + return (UBool)(GET_CATEGORY(props)==U_SPACE_SEPARATOR); + } +} + +U_CAPI UBool U_EXPORT2 +u_isUWhiteSpace(UChar32 c) { + return (u_getUnicodeProperties(c, 1)&U_MASK(UPROPS_WHITE_SPACE))!=0; +} + +/* Checks if the Unicode character is printable.*/ +U_CAPI UBool U_EXPORT2 +u_isprint(UChar32 c) { + uint32_t props; + GET_PROPS(c, props); + /* comparing ==0 returns FALSE for the categories mentioned */ + return (UBool)((CAT_MASK(props)&U_GC_C_MASK)==0); +} + +/** + * Checks if c is in \p{graph}\p{blank} - \p{cntrl}. + * Implements UCHAR_POSIX_PRINT. + * @internal + */ +U_CFUNC UBool +u_isprintPOSIX(UChar32 c) { + uint32_t props; + GET_PROPS(c, props); + /* + * The only cntrl character in graph+blank is TAB (in blank). + * Here we implement (blank-TAB)=Zs instead of calling u_isblank(). + */ + return (UBool)((GET_CATEGORY(props)==U_SPACE_SEPARATOR) || u_isgraphPOSIX(c)); +} + +U_CAPI UBool U_EXPORT2 +u_isgraph(UChar32 c) { + uint32_t props; + GET_PROPS(c, props); + /* comparing ==0 returns FALSE for the categories mentioned */ + return (UBool)((CAT_MASK(props)& + (U_GC_CC_MASK|U_GC_CF_MASK|U_GC_CS_MASK|U_GC_CN_MASK|U_GC_Z_MASK)) + ==0); +} + +/** + * Checks if c is in + * [^\p{space}\p{gc=Control}\p{gc=Surrogate}\p{gc=Unassigned}] + * with space=\p{Whitespace} and Control=Cc. + * Implements UCHAR_POSIX_GRAPH. + * @internal + */ +U_CFUNC UBool +u_isgraphPOSIX(UChar32 c) { + uint32_t props; + GET_PROPS(c, props); + /* \p{space}\p{gc=Control} == \p{gc=Z}\p{Control} */ + /* comparing ==0 returns FALSE for the categories mentioned */ + return (UBool)((CAT_MASK(props)& + (U_GC_CC_MASK|U_GC_CS_MASK|U_GC_CN_MASK|U_GC_Z_MASK)) + ==0); +} + +U_CAPI UBool U_EXPORT2 +u_ispunct(UChar32 c) { + uint32_t props; + GET_PROPS(c, props); + return (UBool)((CAT_MASK(props)&U_GC_P_MASK)!=0); +} + +/* Checks if the Unicode character can start a Unicode identifier.*/ +U_CAPI UBool U_EXPORT2 +u_isIDStart(UChar32 c) { + /* same as u_isalpha() */ + uint32_t props; + GET_PROPS(c, props); + return (UBool)((CAT_MASK(props)&(U_GC_L_MASK|U_GC_NL_MASK))!=0); +} + +/* Checks if the Unicode character can be a Unicode identifier part other than starting the + identifier.*/ +U_CAPI UBool U_EXPORT2 +u_isIDPart(UChar32 c) { + uint32_t props; + GET_PROPS(c, props); + return (UBool)( + (CAT_MASK(props)& + (U_GC_ND_MASK|U_GC_NL_MASK| + U_GC_L_MASK| + U_GC_PC_MASK|U_GC_MC_MASK|U_GC_MN_MASK) + )!=0 || + u_isIDIgnorable(c)); +} + +/*Checks if the Unicode character can be ignorable in a Java or Unicode identifier.*/ +U_CAPI UBool U_EXPORT2 +u_isIDIgnorable(UChar32 c) { + if(c<=0x9f) { + return u_isISOControl(c) && !IS_THAT_ASCII_CONTROL_SPACE(c); + } else { + uint32_t props; + GET_PROPS(c, props); + return (UBool)(GET_CATEGORY(props)==U_FORMAT_CHAR); + } +} + +/*Checks if the Unicode character can start a Java identifier.*/ +U_CAPI UBool U_EXPORT2 +u_isJavaIDStart(UChar32 c) { + uint32_t props; + GET_PROPS(c, props); + return (UBool)((CAT_MASK(props)&(U_GC_L_MASK|U_GC_SC_MASK|U_GC_PC_MASK))!=0); +} + +/*Checks if the Unicode character can be a Java identifier part other than starting the + * identifier. + */ +U_CAPI UBool U_EXPORT2 +u_isJavaIDPart(UChar32 c) { + uint32_t props; + GET_PROPS(c, props); + return (UBool)( + (CAT_MASK(props)& + (U_GC_ND_MASK|U_GC_NL_MASK| + U_GC_L_MASK| + U_GC_SC_MASK|U_GC_PC_MASK| + U_GC_MC_MASK|U_GC_MN_MASK) + )!=0 || + u_isIDIgnorable(c)); +} + +U_CAPI int32_t U_EXPORT2 +u_charDigitValue(UChar32 c) { + uint32_t props; + int32_t value; + GET_PROPS(c, props); + value=(int32_t)GET_NUMERIC_TYPE_VALUE(props)-UPROPS_NTV_DECIMAL_START; + if(value<=9) { + return value; + } else { + return -1; + } +} + +U_CAPI double U_EXPORT2 +u_getNumericValue(UChar32 c) { + uint32_t props; + int32_t ntv; + GET_PROPS(c, props); + ntv=(int32_t)GET_NUMERIC_TYPE_VALUE(props); + + if(ntv==UPROPS_NTV_NONE) { + return U_NO_NUMERIC_VALUE; + } else if(ntv>4)-12; + int32_t denominator=(ntv&0xf)+1; + return (double)numerator/denominator; + } else if(ntv>5)-14; + int32_t exp=(ntv&0x1f)+2; + numValue=mant; + + /* multiply by 10^exp without math.h */ + while(exp>=4) { + numValue*=10000.; + exp-=4; + } + switch(exp) { + case 3: + numValue*=1000.; + break; + case 2: + numValue*=100.; + break; + case 1: + numValue*=10.; + break; + case 0: + default: + break; + } + + return numValue; + } else if(ntv>2)-0xbf; + int32_t exp=(ntv&3)+1; + + switch(exp) { + case 4: + numValue*=60*60*60*60; + break; + case 3: + numValue*=60*60*60; + break; + case 2: + numValue*=60*60; + break; + case 1: + numValue*=60; + break; + case 0: + default: + break; + } + + return numValue; + } else if(ntv>2); + return (double)numerator/denominator; + } else { + /* reserved */ + return U_NO_NUMERIC_VALUE; + } +} + +U_CAPI int32_t U_EXPORT2 +u_digit(UChar32 ch, int8_t radix) { + int8_t value; + if((uint8_t)(radix-2)<=(36-2)) { + value=(int8_t)u_charDigitValue(ch); + if(value<0) { + /* ch is not a decimal digit, try latin letters */ + if(ch>=0x61 && ch<=0x7A) { + value=(int8_t)(ch-0x57); /* ch - 'a' + 10 */ + } else if(ch>=0x41 && ch<=0x5A) { + value=(int8_t)(ch-0x37); /* ch - 'A' + 10 */ + } else if(ch>=0xFF41 && ch<=0xFF5A) { + value=(int8_t)(ch-0xFF37); /* fullwidth ASCII a-z */ + } else if(ch>=0xFF21 && ch<=0xFF3A) { + value=(int8_t)(ch-0xFF17); /* fullwidth ASCII A-Z */ + } + } + } else { + value=-1; /* invalid radix */ + } + return (int8_t)((value(36-2) || (uint32_t)digit>=(uint32_t)radix) { + return 0; + } else if(digit<10) { + return (UChar32)(0x30+digit); + } else { + return (UChar32)((0x61-10)+digit); + } +} + +/* miscellaneous, and support for uprops.cpp -------------------------------- */ + +U_CAPI void U_EXPORT2 +u_getUnicodeVersion(UVersionInfo versionArray) { + if(versionArray!=NULL) { + uprv_memcpy(versionArray, dataVersion, U_MAX_VERSION_LENGTH); + } +} + +U_CFUNC uint32_t +u_getMainProperties(UChar32 c) { + uint32_t props; + GET_PROPS(c, props); + return props; +} + +U_CFUNC uint32_t +u_getUnicodeProperties(UChar32 c, int32_t column) { + U_ASSERT(column>=0); + if(column>=propsVectorsColumns) { + return 0; + } else { + uint16_t vecIndex=UTRIE2_GET16(&propsVectorsTrie, c); + return propsVectors[vecIndex+column]; + } +} + +U_CFUNC int32_t +uprv_getMaxValues(int32_t column) { + switch(column) { + case 0: + return indexes[UPROPS_MAX_VALUES_INDEX]; + case 2: + return indexes[UPROPS_MAX_VALUES_2_INDEX]; + default: + return 0; + } +} + +U_CAPI void U_EXPORT2 +u_charAge(UChar32 c, UVersionInfo versionArray) { + if(versionArray!=NULL) { + uint32_t version=u_getUnicodeProperties(c, 0)>>UPROPS_AGE_SHIFT; + versionArray[0]=(uint8_t)(version>>4); + versionArray[1]=(uint8_t)(version&0xf); + versionArray[2]=versionArray[3]=0; + } +} + +U_CAPI UScriptCode U_EXPORT2 +uscript_getScript(UChar32 c, UErrorCode *pErrorCode) { + uint32_t scriptX; + if(pErrorCode==NULL || U_FAILURE(*pErrorCode)) { + return USCRIPT_INVALID_CODE; + } + if((uint32_t)c>0x10ffff) { + *pErrorCode=U_ILLEGAL_ARGUMENT_ERROR; + return USCRIPT_INVALID_CODE; + } + scriptX=u_getUnicodeProperties(c, 0)&UPROPS_SCRIPT_X_MASK; + if(scriptX=UPROPS_SCRIPT_X_WITH_OTHER) { + scx=scriptExtensions+scx[1]; + } + if(sc>=USCRIPT_CODE_LIMIT) { + /* Guard against bogus input that would make us go past the Script_Extensions terminator. */ + return FALSE; + } + while(sc>*scx) { + ++scx; + } + return sc==(*scx&0x7fff); +} + +U_CAPI int32_t U_EXPORT2 +uscript_getScriptExtensions(UChar32 c, + UScriptCode *scripts, int32_t capacity, + UErrorCode *pErrorCode) { + uint32_t scriptX; + int32_t length; + const uint16_t *scx; + uint16_t sx; + if(pErrorCode==NULL || U_FAILURE(*pErrorCode)) { + return 0; + } + if(capacity<0 || (capacity>0 && scripts==NULL)) { + *pErrorCode=U_ILLEGAL_ARGUMENT_ERROR; + return 0; + } + scriptX=u_getUnicodeProperties(c, 0)&UPROPS_SCRIPT_X_MASK; + if(scriptX=UPROPS_SCRIPT_X_WITH_OTHER) { + scx=scriptExtensions+scx[1]; + } + length=0; + do { + sx=*scx++; + if(lengthcapacity) { + *pErrorCode=U_BUFFER_OVERFLOW_ERROR; + } + return length; +} + +U_CAPI UBlockCode U_EXPORT2 +ublock_getCode(UChar32 c) { + return (UBlockCode)((u_getUnicodeProperties(c, 0)&UPROPS_BLOCK_MASK)>>UPROPS_BLOCK_SHIFT); +} + +/* property starts for UnicodeSet ------------------------------------------- */ + +static UBool U_CALLCONV +_enumPropertyStartsRange(const void *context, UChar32 start, UChar32 end, uint32_t value) { + /* add the start code point to the USet */ + const USetAdder *sa=(const USetAdder *)context; + sa->add(sa->set, start); + (void)end; + (void)value; + return TRUE; +} + +#define USET_ADD_CP_AND_NEXT(sa, cp) sa->add(sa->set, cp); sa->add(sa->set, cp+1) + +U_CFUNC void U_EXPORT2 +uchar_addPropertyStarts(const USetAdder *sa, UErrorCode *pErrorCode) { + if(U_FAILURE(*pErrorCode)) { + return; + } + + /* add the start code point of each same-value range of the main trie */ + utrie2_enum(&propsTrie, NULL, _enumPropertyStartsRange, sa); + + /* add code points with hardcoded properties, plus the ones following them */ + + /* add for u_isblank() */ + USET_ADD_CP_AND_NEXT(sa, TAB); + + /* add for IS_THAT_CONTROL_SPACE() */ + sa->add(sa->set, CR+1); /* range TAB..CR */ + sa->add(sa->set, 0x1c); + sa->add(sa->set, 0x1f+1); + USET_ADD_CP_AND_NEXT(sa, NL); + + /* add for u_isIDIgnorable() what was not added above */ + sa->add(sa->set, DEL); /* range DEL..NBSP-1, NBSP added below */ + sa->add(sa->set, HAIRSP); + sa->add(sa->set, RLM+1); + sa->add(sa->set, INHSWAP); + sa->add(sa->set, NOMDIG+1); + USET_ADD_CP_AND_NEXT(sa, ZWNBSP); + + /* add no-break spaces for u_isWhitespace() what was not added above */ + USET_ADD_CP_AND_NEXT(sa, NBSP); + USET_ADD_CP_AND_NEXT(sa, FIGURESP); + USET_ADD_CP_AND_NEXT(sa, NNBSP); + + /* add for u_digit() */ + sa->add(sa->set, U_a); + sa->add(sa->set, U_z+1); + sa->add(sa->set, U_A); + sa->add(sa->set, U_Z+1); + sa->add(sa->set, U_FW_a); + sa->add(sa->set, U_FW_z+1); + sa->add(sa->set, U_FW_A); + sa->add(sa->set, U_FW_Z+1); + + /* add for u_isxdigit() */ + sa->add(sa->set, U_f+1); + sa->add(sa->set, U_F+1); + sa->add(sa->set, U_FW_f+1); + sa->add(sa->set, U_FW_F+1); + + /* add for UCHAR_DEFAULT_IGNORABLE_CODE_POINT what was not added above */ + sa->add(sa->set, WJ); /* range WJ..NOMDIG */ + sa->add(sa->set, 0xfff0); + sa->add(sa->set, 0xfffb+1); + sa->add(sa->set, 0xe0000); + sa->add(sa->set, 0xe0fff+1); + + /* add for UCHAR_GRAPHEME_BASE and others */ + USET_ADD_CP_AND_NEXT(sa, CGJ); +} + +U_CFUNC void U_EXPORT2 +upropsvec_addPropertyStarts(const USetAdder *sa, UErrorCode *pErrorCode) { + if(U_FAILURE(*pErrorCode)) { + return; + } + + /* add the start code point of each same-value range of the properties vectors trie */ + utrie2_enum(&propsVectorsTrie, NULL, _enumPropertyStartsRange, sa); +} diff --git a/Build/source/libs/icu/icu-src/source/common/uchar_props_data.h b/Build/source/libs/icu/icu-src/source/common/uchar_props_data.h index 79ba55eb75d..868631131c8 100644 --- a/Build/source/libs/icu/icu-src/source/common/uchar_props_data.h +++ b/Build/source/libs/icu/icu-src/source/common/uchar_props_data.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html // // Copyright (C) 1999-2016, International Business Machines @@ -11,145 +11,145 @@ #ifdef INCLUDED_FROM_UCHAR_C -static const UVersionInfo dataVersion={9,0,0,0}; +static const UVersionInfo dataVersion={0xa,0,0,0}; -static const uint16_t propsTrie_index[20780]={ -0x44e,0x456,0x45e,0x466,0x47e,0x486,0x48e,0x496,0x49e,0x4a6,0x4ac,0x4b4,0x4bc,0x4c4,0x4cc,0x4d4, -0x4da,0x4e2,0x4ea,0x4f2,0x4f5,0x4fd,0x505,0x50d,0x515,0x51d,0x519,0x521,0x529,0x531,0x536,0x53e, -0x546,0x54e,0x552,0x55a,0x562,0x56a,0x572,0x57a,0x576,0x57e,0x583,0x58b,0x591,0x599,0x5a1,0x5a9, -0x5b1,0x5b9,0x5c1,0x5c9,0x5ce,0x5d6,0x5d9,0x5e1,0x5e9,0x5f1,0x5f7,0x5ff,0x5fe,0x606,0x60e,0x616, -0x626,0x61e,0x62e,0x46e,0x46e,0x63e,0x646,0x636,0x656,0x658,0x660,0x64e,0x670,0x676,0x67e,0x668, -0x68e,0x694,0x69c,0x686,0x6ac,0x6b2,0x6ba,0x6a4,0x6ca,0x6d0,0x6d8,0x6c2,0x6e8,0x6f0,0x6f8,0x6e0, -0x708,0x70e,0x716,0x700,0x726,0x72c,0x734,0x71e,0x744,0x749,0x751,0x73c,0x761,0x768,0x770,0x759, -0x5fa,0x778,0x780,0x46e,0x788,0x790,0x798,0x46e,0x7a0,0x7a8,0x7b0,0x7b5,0x7bd,0x7c4,0x7cc,0x46e, -0x5b9,0x7d4,0x7dc,0x7e4,0x7ec,0x546,0x7fc,0x7f4,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9, -0x5b9,0x5b9,0x802,0x5b9,0x80a,0x800,0x812,0x5b9,0x80e,0x5b9,0x818,0x820,0x828,0x546,0x546,0x830, -0x838,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9, -0x5b9,0x5b9,0x5b9,0x83d,0x845,0x5b9,0x5b9,0x84d,0x855,0x85d,0x865,0x86d,0x5b9,0x875,0x87d,0x885, -0x895,0x5b9,0x89d,0x89f,0x8a7,0x88d,0x5b9,0x8aa,0x8be,0x8b2,0x8ba,0x8c6,0x5b9,0x8ce,0x8d4,0x8dc, -0x8e4,0x5b9,0x8f4,0x8fc,0x904,0x8ec,0x46e,0x46e,0x914,0x917,0x91f,0x90c,0x92f,0x927,0x5b9,0x936, -0x5b9,0x945,0x93e,0x94d,0x955,0x46e,0x95d,0x965,0x4ee,0x96d,0x970,0x976,0x97d,0x970,0x515,0x985, -0x49e,0x49e,0x49e,0x49e,0x98d,0x49e,0x49e,0x49e,0x99d,0x9a5,0x9ad,0x9b5,0x9bd,0x9c1,0x9c9,0x995, -0x9e1,0x9e9,0x9d1,0x9d9,0x9f1,0x9f9,0xa01,0xa09,0xa21,0xa11,0xa19,0xa29,0xa31,0xa40,0xa45,0xa38, -0xa4d,0xa4d,0xa4d,0xa4d,0xa4d,0xa4d,0xa4d,0xa4d,0xa55,0xa5d,0x8dc,0xa60,0xa68,0xa6f,0xa74,0xa7c, -0x8dc,0xa82,0xa81,0xa92,0xa95,0x8dc,0x8dc,0xa8a,0x8dc,0x8dc,0x8dc,0x8dc,0x8dc,0xaa4,0xaac,0xa9c, -0x8dc,0x8dc,0x8dc,0xab1,0x8dc,0x8dc,0x8dc,0x8dc,0x8dc,0x8dc,0x8dc,0xab7,0xabf,0x8dc,0xac7,0xace, -0x8dc,0x8dc,0x8dc,0x8dc,0x8dc,0x8dc,0x8dc,0x8dc,0xa4d,0xa4d,0xa4d,0xa4d,0xad6,0xa4d,0xadd,0xae4, -0xa4d,0xa4d,0xa4d,0xa4d,0xa4d,0xa4d,0xa4d,0xa4d,0x8dc,0xaec,0xaf3,0xaf7,0xafd,0xb03,0xb0b,0xb10, -0x546,0xb20,0xb18,0xb28,0x49e,0x49e,0x49e,0xb30,0x4ee,0xb38,0x5b9,0xb3e,0xb4e,0xb46,0xb46,0x515, -0xb56,0xb5e,0xb66,0x46e,0xb6e,0x8dc,0x8dc,0xb75,0x8dc,0x8dc,0x8dc,0x8dc,0x8dc,0x8dc,0xb7d,0xb83, -0xb93,0xb8b,0x5fa,0x5b9,0xb9b,0x838,0x5b9,0xba3,0xbab,0xbb0,0x5b9,0x5b9,0xbb5,0x5a5,0x8dc,0xbbc, -0xbc4,0xbcc,0xbd2,0x8dc,0xbcc,0xbda,0x8dc,0xbc4,0x8dc,0x8dc,0x8dc,0x8dc,0x8dc,0x8dc,0x8dc,0x8dc, -0xbe2,0x5b9,0x5b9,0x5b9,0xbea,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9, -0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9, -0x5b9,0xbf0,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9, -0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0xbf5,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9, -0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9, -0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9, -0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9, -0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9, -0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9, -0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9, -0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9, -0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9, -0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x8aa,0x8dc,0x8dc, -0xbfd,0x5b9,0xc00,0x5b9,0xc08,0xc0e,0xc16,0xc1e,0xc23,0x5b9,0x5b9,0xc27,0x5b9,0x5b9,0x5b9,0x5b9, -0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0xc2e,0x5b9,0xc35,0xc3b,0x5b9,0x5b9,0x5b9,0x5b9, -0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0xc43,0x5b9,0x5b9,0x5b9,0xc4b,0x5b9, -0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9, -0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0xc4d,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9, -0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0xc54,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9, -0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9, -0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9, -0x5b9,0x5b9,0x5b9,0xc5b,0x5b9,0x5b9,0x5b9,0xc62,0xc6a,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9, -0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9, -0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0xc6f,0x5b9,0x5b9,0xc77,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9, -0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9, -0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0xc7b,0x5b9, -0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9, -0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9, -0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9, -0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0xc7e,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9, -0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9, -0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0xc81,0x5b9,0x5b9,0x5b9, -0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9, -0x5b9,0x5b9,0x5b9,0xc87,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9, -0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9, -0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9, -0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9, -0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9, -0x5b9,0x5b9,0x5b9,0x5b9,0xc8f,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9, -0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9, -0x5b9,0xc94,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9, -0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9, -0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9, -0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9, -0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0xc99,0x5b9,0x5b9,0x5b9,0xc9e,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9, -0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9, -0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9, -0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9, -0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9, -0x5b9,0xca6,0xcad,0xcb1,0x5b9,0x5b9,0x5b9,0xcb8,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9, -0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9, -0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9, -0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9, -0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x8aa,0x46e, -0xcc6,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9, -0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9, -0x5b9,0x5b9,0x5b9,0x5b9,0xcbe,0x8dc,0xcce,0x94d,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9, -0xcd3,0xcdb,0x49e,0xceb,0xce3,0x5b9,0x5b9,0xcf3,0xcfb,0xd0b,0x49e,0xd10,0xd18,0xd1e,0x46e,0xd03, -0xd26,0xd2e,0x5b9,0xd36,0xd46,0xd49,0xd3e,0xd51,0x60e,0xd59,0xd60,0xd68,0x656,0xd78,0xd70,0xd80, -0x5b9,0xd88,0xd90,0xd98,0x5b9,0xda0,0xda8,0xdb0,0xdb8,0xdc0,0xdc4,0xdcc,0x4ee,0x4ee,0x5b9,0xdd4, -0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9, -0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9, -0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9, -0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9, -0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9, -0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9, -0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9, -0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9, -0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9, -0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9, -0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9, -0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9, -0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9, -0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9, -0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9, -0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9, -0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9, -0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9, -0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9, -0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9, -0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9, -0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0xddc,0xde3,0x89e, -0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e, -0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e, -0xdeb,0xdeb,0xdeb,0xdeb,0xdeb,0xdeb,0xdeb,0xdeb,0xdeb,0xdeb,0xdeb,0xdeb,0xdeb,0xdeb,0xdeb,0xdeb, -0xdeb,0xdeb,0xdeb,0xdeb,0xdeb,0xdeb,0xdeb,0xdeb,0xdeb,0xdeb,0xdeb,0xdeb,0xdeb,0xdeb,0xdeb,0xdeb, -0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3, -0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3, -0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3, -0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3, -0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3, -0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3, -0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3, -0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3, -0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3, -0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3, -0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3, -0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3, -0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0x5b9,0x5b9,0x5b9,0xdfb,0x5b9,0xcb9,0xe02,0xe07, -0x5b9,0x5b9,0x5b9,0xe0f,0x5b9,0x5b9,0x8a9,0x46e,0xe25,0xe15,0xe1d,0x5b9,0x5b9,0xe2d,0xe35,0x5b9, -0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0xe3a,0xe42,0x5b9,0xe46,0x5b9,0xe4c,0xe50, -0xe58,0xe60,0xe67,0xe6f,0x5b9,0x5b9,0x5b9,0xe75,0xe8d,0x45e,0xe95,0xe9d,0xea2,0x8be,0xe7d,0xe85, -0xdeb,0xdeb,0xdeb,0xdeb,0xdeb,0xdeb,0xdeb,0xdeb,0xdeb,0xdeb,0xdeb,0xdeb,0xdeb,0xdeb,0xdeb,0xdeb, -0xdeb,0xdeb,0xdeb,0xdeb,0xdeb,0xdeb,0xdeb,0xdeb,0xdeb,0xdeb,0xdeb,0xdeb,0xdeb,0xdeb,0xdeb,0xdeb, -0x11b8,0x11b8,0x11f8,0x1238,0x1278,0x12b0,0x12f0,0x1330,0x1368,0x13a8,0x13d4,0x1414,0x1454,0x1464,0x14a4,0x14d8, -0x1518,0x1548,0x1588,0x15c8,0x15d8,0x160c,0x1644,0x1684,0x16c4,0x1704,0x1738,0x1764,0x17a4,0x17dc,0x17f8,0x1838, +static const uint16_t propsTrie_index[21148]={ +0x45c,0x464,0x46c,0x474,0x48c,0x494,0x49c,0x4a4,0x4ac,0x4b4,0x4ba,0x4c2,0x4ca,0x4d2,0x4da,0x4e2, +0x4e8,0x4f0,0x4f8,0x500,0x503,0x50b,0x513,0x51b,0x523,0x52b,0x527,0x52f,0x537,0x53f,0x544,0x54c, +0x554,0x55c,0x560,0x568,0x570,0x578,0x580,0x588,0x584,0x58c,0x591,0x599,0x59f,0x5a7,0x5af,0x5b7, +0x5bf,0x5c7,0x5cf,0x5d7,0x5dc,0x5e4,0x5e7,0x5ef,0x5f7,0x5ff,0x605,0x60d,0x60c,0x614,0x61c,0x624, +0x634,0x62c,0x63c,0x644,0x47c,0x654,0x65c,0x64c,0x66c,0x66e,0x676,0x664,0x686,0x68c,0x694,0x67e, +0x6a4,0x6aa,0x6b2,0x69c,0x6c2,0x6c8,0x6d0,0x6ba,0x6e0,0x6e6,0x6ee,0x6d8,0x6fe,0x706,0x70e,0x6f6, +0x71e,0x724,0x72c,0x716,0x73c,0x742,0x74a,0x734,0x75a,0x75f,0x767,0x752,0x777,0x77e,0x786,0x76f, +0x608,0x78e,0x796,0x47c,0x79e,0x7a6,0x7ae,0x47c,0x7b6,0x7be,0x7c6,0x7cb,0x7d3,0x7da,0x7e2,0x47c, +0x5c7,0x7ea,0x7f2,0x7fa,0x802,0x554,0x812,0x80a,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7, +0x5c7,0x5c7,0x818,0x5c7,0x820,0x816,0x828,0x5c7,0x824,0x5c7,0x82e,0x836,0x83e,0x554,0x554,0x846, +0x84e,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7, +0x5c7,0x5c7,0x5c7,0x853,0x85b,0x5c7,0x5c7,0x863,0x86b,0x873,0x87b,0x883,0x5c7,0x88b,0x893,0x89b, +0x8ab,0x5c7,0x8b3,0x8b5,0x8bd,0x8a3,0x5c7,0x8c0,0x8d4,0x8c8,0x8d0,0x8dc,0x5c7,0x8e4,0x8ea,0x8f2, +0x8fa,0x5c7,0x90a,0x912,0x91a,0x902,0x47c,0x47c,0x92a,0x92d,0x935,0x922,0x945,0x93d,0x5c7,0x94c, +0x5c7,0x95b,0x954,0x963,0x96b,0x47c,0x973,0x97b,0x4fc,0x983,0x986,0x98c,0x993,0x986,0x523,0x99b, +0x4ac,0x4ac,0x4ac,0x4ac,0x9a3,0x4ac,0x4ac,0x4ac,0x9b3,0x9bb,0x9c3,0x9cb,0x9d3,0x9d7,0x9df,0x9ab, +0x9f7,0x9ff,0x9e7,0x9ef,0xa07,0xa0f,0xa17,0xa1f,0xa37,0xa27,0xa2f,0xa3f,0xa47,0xa56,0xa5b,0xa4e, +0xa63,0xa63,0xa63,0xa63,0xa63,0xa63,0xa63,0xa63,0xa6b,0xa73,0x8f2,0xa76,0xa7e,0xa85,0xa8a,0xa92, +0x8f2,0xa99,0xa98,0xaa9,0xaac,0x8f2,0x8f2,0xaa1,0x8f2,0x8f2,0x8f2,0x8f2,0x8f2,0xabb,0xac3,0xab3, +0x8f2,0x8f2,0x8f2,0xac8,0x8f2,0x8f2,0x8f2,0x8f2,0x8f2,0x8f2,0x8f2,0xace,0xad6,0x8f2,0xade,0xae5, +0x8f2,0x8f2,0x8f2,0x8f2,0x8f2,0x8f2,0x8f2,0x8f2,0xa63,0xa63,0xa63,0xa63,0xaed,0xa63,0xaf4,0xafb, +0xa63,0xa63,0xa63,0xa63,0xa63,0xa63,0xa63,0xa63,0x8f2,0xb03,0xb0a,0xb0e,0xb14,0xb1a,0xb22,0xb27, +0x554,0xb37,0xb2f,0xb3f,0x4ac,0x4ac,0x4ac,0xb47,0x4fc,0xb4f,0x5c7,0xb55,0xb65,0xb5d,0xb5d,0x523, +0xb6d,0xb75,0xb7d,0x47c,0xb85,0x8f2,0x8f2,0xb8c,0x8f2,0x8f2,0x8f2,0x8f2,0x8f2,0x8f2,0xb94,0xb9a, +0xbaa,0xba2,0x608,0x5c7,0xbb2,0x84e,0x5c7,0xbba,0xbc2,0xbc7,0x5c7,0x5c7,0xbcc,0x5b3,0x8f2,0xbd3, +0xa93,0xbdb,0xbe1,0x8f2,0xbdb,0xbe9,0x8f2,0xa93,0x8f2,0x8f2,0x8f2,0x8f2,0x8f2,0x8f2,0x8f2,0x8f2, +0xbf1,0x5c7,0x5c7,0x5c7,0xbf9,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7, +0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7, +0x5c7,0xbff,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7, +0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0xc04,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7, +0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7, +0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7, +0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7, +0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7, +0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7, +0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7, +0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7, +0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7, +0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x8c0,0x8f2,0x8f2, +0xc0c,0x5c7,0xc0f,0x5c7,0xc17,0xc1d,0xc25,0xc2d,0xc32,0x5c7,0x5c7,0xc36,0x5c7,0x5c7,0x5c7,0x5c7, +0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0xc3d,0x5c7,0xc44,0xc4a,0x5c7,0x5c7,0x5c7,0x5c7, +0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0xc52,0x5c7,0x5c7,0x5c7,0xc5a,0x5c7, +0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7, +0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0xc5c,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7, +0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0xc63,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7, +0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7, +0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7, +0x5c7,0x5c7,0x5c7,0xc6a,0x5c7,0x5c7,0x5c7,0xc71,0xc79,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7, +0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7, +0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0xc7e,0x5c7,0x5c7,0xc86,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7, +0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7, +0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0xc8a,0x5c7, +0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7, +0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7, +0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7, +0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0xc8d,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7, +0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7, +0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0xc90,0x5c7,0x5c7,0x5c7, +0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7, +0x5c7,0x5c7,0x5c7,0xc96,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7, +0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7, +0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7, +0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7, +0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7, +0x5c7,0x5c7,0x5c7,0x5c7,0xc9e,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7, +0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7, +0x5c7,0xca3,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7, +0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7, +0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7, +0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7, +0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0xca8,0x5c7,0x5c7,0x5c7,0xcad,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7, +0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7, +0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7, +0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7, +0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7, +0x5c7,0xcb5,0xcbc,0xcc0,0x5c7,0x5c7,0x5c7,0xcc7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7, +0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7, +0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7, +0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7, +0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x644, +0xcd5,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7, +0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7, +0x5c7,0x5c7,0x5c7,0x5c7,0xccd,0x8f2,0xcdd,0x963,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7, +0xce2,0xcea,0x4ac,0xcfa,0xcf2,0x5c7,0x5c7,0xd02,0xd0a,0xd1a,0x4ac,0xd1f,0xd27,0xd2d,0x47c,0xd12, +0xd35,0xd3d,0x5c7,0xd45,0xd55,0xd58,0xd4d,0xd60,0x61c,0xd68,0xd6f,0xd77,0x66c,0xd87,0xd7f,0xd8f, +0x5c7,0xd97,0xd9f,0xda7,0x5c7,0xdaf,0xdb7,0xdbf,0xdc7,0xdcf,0xdd3,0xddb,0x4fc,0x4fc,0x5c7,0xde3, +0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7, +0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7, +0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7, +0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7, +0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7, +0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7, +0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7, +0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7, +0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7, +0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7, +0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7, +0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7, +0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7, +0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7, +0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7, +0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7, +0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7, +0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7, +0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7, +0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7, +0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7, +0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0xdeb,0xdf2,0x8b4, +0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c, +0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c, +0xdfa,0xdfa,0xdfa,0xdfa,0xdfa,0xdfa,0xdfa,0xdfa,0xdfa,0xdfa,0xdfa,0xdfa,0xdfa,0xdfa,0xdfa,0xdfa, +0xdfa,0xdfa,0xdfa,0xdfa,0xdfa,0xdfa,0xdfa,0xdfa,0xdfa,0xdfa,0xdfa,0xdfa,0xdfa,0xdfa,0xdfa,0xdfa, +0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02, +0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02, +0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02, +0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02, +0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02, +0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02, +0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02, +0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02, +0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02, +0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02, +0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02, +0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02, +0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0x5c7,0x5c7,0x5c7,0xe0a,0x5c7,0xcc8,0xe11,0xe16, +0x5c7,0x5c7,0x5c7,0xe1e,0x5c7,0x5c7,0x8bf,0x47c,0xe34,0xe24,0xe2c,0x5c7,0x5c7,0xe3c,0xe44,0x5c7, +0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0xe49,0xe51,0x5c7,0xe55,0x5c7,0xe5b,0xe5f, +0xe67,0xe6f,0xe76,0xe7e,0x5c7,0x5c7,0x5c7,0xe84,0xe9c,0x46c,0xea4,0xeac,0xeb1,0x8d4,0xe8c,0xe94, +0xdfa,0xdfa,0xdfa,0xdfa,0xdfa,0xdfa,0xdfa,0xdfa,0xdfa,0xdfa,0xdfa,0xdfa,0xdfa,0xdfa,0xdfa,0xdfa, +0xdfa,0xdfa,0xdfa,0xdfa,0xdfa,0xdfa,0xdfa,0xdfa,0xdfa,0xdfa,0xdfa,0xdfa,0xdfa,0xdfa,0xdfa,0xdfa, +0x11f0,0x11f0,0x1230,0x1270,0x12b0,0x12e8,0x1328,0x1368,0x13a0,0x13e0,0x140c,0x144c,0x148c,0x149c,0x14dc,0x1510, +0x1550,0x1580,0x15c0,0x1600,0x1610,0x1644,0x167c,0x16bc,0x16fc,0x173c,0x1770,0x179c,0x17dc,0x1814,0x1830,0x1870, 0xa80,0xac0,0xb00,0xb3b,0xb7b,0xa40,0xbbb,0xa40,0xbdd,0xa40,0xa40,0xa40,0xa40,0xc1d,0x1db,0x1db, 0xc5d,0xc9d,0xa40,0xa40,0xa40,0xa40,0xcdd,0xcfd,0xa40,0xa40,0xd3d,0xd7d,0xdbd,0xdfd,0xe3d,0xe7d, 0xebd,0xef4,0x1db,0x1db,0xf18,0xf4c,0x1db,0xf74,0x1db,0x1db,0x1db,0x1db,0xfa1,0x1db,0x1db,0x1db, -0x1db,0x1db,0x1db,0x1db,0xfb5,0x1db,0xfed,0x102d,0x1db,0x1038,0xa40,0xa40,0xa40,0xa40,0xa40,0x1078, +0x1db,0x1db,0x1db,0x1db,0xfb5,0x1db,0xfed,0x102d,0x1db,0x1038,0x1db,0x1db,0x1db,0x106e,0xa40,0x10ae, 0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40, 0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40, 0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40, @@ -172,1117 +172,1136 @@ static const uint16_t propsTrie_index[20780]={ 0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40, 0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40, 0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40, -0x10b8,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40, +0x10ee,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40, 0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40, 0x700,0x700,0x700,0x700,0x700,0x700,0x700,0x700,0x700,0x700,0x700,0x700,0x700,0x700,0x700,0x700, -0x700,0x700,0x700,0x700,0x700,0x700,0x700,0x700,0x700,0x700,0x700,0x700,0x700,0x700,0x700,0x10f8, +0x700,0x700,0x700,0x700,0x700,0x700,0x700,0x700,0x700,0x700,0x700,0x700,0x700,0x700,0x700,0x112e, 0x700,0x700,0x700,0x700,0x700,0x700,0x700,0x700,0x700,0x700,0x700,0x700,0x700,0x700,0x700,0x700, -0x700,0x700,0x700,0x700,0x700,0x700,0x700,0x700,0x700,0x700,0x700,0x700,0x700,0x700,0x700,0x10f8, -0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e, -0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e, -0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e, -0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e, -0xeaa,0xeb1,0xeb9,0x46e,0x5b9,0x5b9,0x5b9,0x5a5,0xec9,0xec1,0xee0,0xed1,0xed8,0xee8,0xb6a,0xef0, -0x46e,0x46e,0x46e,0x46e,0xd68,0x5b9,0xef8,0xf00,0x5b9,0xf08,0xf10,0xf14,0xf1c,0x5b9,0xf24,0x46e, -0x546,0x550,0xf2c,0x5b9,0xf30,0xf38,0xf48,0xf40,0x5b9,0xf50,0x5b9,0xf57,0x46e,0x46e,0x46e,0x46e, -0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0xb4e,0x8aa,0xe4c,0x46e,0x46e,0x46e,0x46e, -0xf67,0xf5f,0xf6a,0xf72,0x8be,0xf7a,0x46e,0xf82,0xf8a,0xf92,0x46e,0x46e,0x5b9,0xfa2,0xfaa,0xf9a, -0xfba,0xfc1,0xfb2,0xfc9,0xfd1,0x46e,0xfe1,0xfd9,0x5b9,0xfe4,0xfec,0xff4,0xffc,0x1004,0x46e,0x46e, -0x5b9,0x5b9,0x100c,0x46e,0x546,0x1014,0x4ee,0x101c,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e, -0x46e,0x46e,0x46e,0x1024,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e, -0x1034,0x5ef,0x103c,0x102c,0x92f,0x1044,0x104c,0x1052,0x106a,0x105a,0x1062,0x106e,0x92f,0x107e,0x1076,0x1086, -0x1096,0x108e,0x46e,0x46e,0x109d,0x10a5,0x611,0x10ad,0x10bd,0x6b2,0x10c5,0x10b5,0x46e,0x46e,0x46e,0x46e, -0x5b9,0x10cd,0x10d5,0x46e,0x5b9,0x10dd,0x10e5,0x46e,0x46e,0x46e,0x46e,0x46e,0x5b9,0x10ed,0x10f5,0x46e, -0x5b9,0x10fd,0x1105,0x110d,0x5b9,0x111d,0x1115,0x46e,0x112d,0x1125,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e, -0x546,0x4ee,0x1135,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e, -0x46e,0x5b9,0x113d,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x1153,0x1158,0x1145,0x114d,0x1168, -0x1160,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e, -0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9, -0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9, -0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x8a9,0x46e,0x46e,0x46e,0x1178,0x1180,0x1188,0x1170,0x5b9, -0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x1190,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e, -0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9, -0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9, -0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x1198,0x46e,0x46e,0x46e, -0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e, -0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x5b9,0x5b9,0x5b9, -0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x119a, -0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x5b9,0x5b9,0x5b9, -0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x113d,0x8be, -0x11a2,0x46e,0x46e,0xe42,0x11aa,0x5b9,0x11ba,0x11c2,0x11ca,0x11b2,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e, -0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e, -0x46e,0x46e,0x46e,0x46e,0x46e,0x5b9,0x5b9,0x11d2,0x11d7,0x11df,0x46e,0x46e,0x11e7,0x5b9,0x5b9,0x5b9, -0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9, -0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9, -0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9, -0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x11ef,0x5b9,0x5b9,0x5b9, -0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9, -0x5b9,0x5b9,0x5b9,0x5b9,0x11f7,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e, -0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e, -0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x11ff,0x46e,0x46e, -0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e, -0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e, -0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e, -0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x5b9,0x5b9,0x5b9, -0x1207,0x120c,0x1214,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e, -0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x8dc,0x8dc,0x8dc, -0x8dc,0x8dc,0x8dc,0x8dc,0xb7d,0x8dc,0x121c,0x8dc,0x1223,0x122b,0x1231,0x8dc,0x1237,0x8dc,0x8dc,0x123f, -0x46e,0x46e,0x46e,0x46e,0x46e,0x8dc,0x8dc,0xa7e,0x1247,0x46e,0x46e,0x46e,0x46e,0x1257,0x125e,0x1263, -0x1269,0x1271,0x1279,0x1281,0x125b,0x1289,0x1291,0x1299,0x129e,0x1270,0x1257,0x125e,0x125a,0x1269,0x12a6,0x1258, -0x12a9,0x125b,0x12b1,0x12b9,0x12c1,0x12c8,0x12b4,0x12bc,0x12c4,0x12cb,0x12b7,0x12d3,0x124f,0x8dc,0x8dc,0x8dc, -0x8dc,0x8dc,0x8dc,0x8dc,0x8dc,0x8dc,0x8dc,0x8dc,0x8dc,0x8dc,0x8dc,0x8dc,0x8dc,0x515,0x12e3,0x515, -0x12ea,0x12f1,0x12db,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e, -0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e, -0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x12f8,0x1300,0x46e, -0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e, -0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e, -0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e, -0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x5b9,0x5b9,0x5b9, -0x5b9,0x5b9,0x5b9,0x1308,0x46e,0x546,0x1318,0x1310,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e, -0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e, -0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x1328,0x1330,0x1338, -0x1340,0x1348,0x1350,0x46e,0x1320,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x8dc,0x1358,0x8dc, -0x8dc,0xb75,0x135d,0x1361,0xb7d,0x1369,0x136e,0x8dc,0x1358,0x8dc,0x1236,0x46e,0x1376,0x137e,0x1382,0x138a, -0x46e,0x46e,0x46e,0x46e,0x46e,0x8dc,0x8dc,0x8dc,0x8dc,0x8dc,0x8dc,0x8dc,0x1392,0x8dc,0x8dc,0x8dc, -0x8dc,0x8dc,0x8dc,0x8dc,0x8dc,0x8dc,0x8dc,0x8dc,0x8dc,0x8dc,0x8dc,0x8dc,0x8dc,0x8dc,0x8dc,0x8dc, -0x8dc,0x8dc,0x8dc,0xa7f,0x139a,0x8dc,0x8dc,0x8dc,0xb75,0x8dc,0x8dc,0x13a2,0x46e,0x1358,0x8dc,0x13aa, -0x8dc,0x13b2,0xb7f,0x46e,0x46e,0x13ba,0x13c2,0x13ca,0x46e,0xb7e,0x46e,0xee8,0x46e,0x46e,0x46e,0x46e, -0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e, -0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e, -0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x13d2,0x5b9,0x5b9, -0x13d9,0x5b9,0x5b9,0x5b9,0x13e1,0x5b9,0x13e9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9, -0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9, -0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9, -0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0xc5f,0x5b9,0x5b9, -0x13f1,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x13f9,0x1401,0x5b9,0x5b9,0x5b9, -0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9, -0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9, -0x5b9,0x5b9,0x5b9,0x5b9,0xc9e,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9, -0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9, -0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x1408,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9, -0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9, -0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9, -0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x140f,0x5b9,0x5b9,0x5b9, -0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9, -0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9, -0x5b9,0x5b9,0x5b9,0x5b9,0x1416,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9, -0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9, -0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9, -0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0xb4e,0x46e,0x5b9,0x5b9,0x5b9, -0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9, -0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9, -0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9, -0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x141a,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0xf30,0x5b9,0x5b9, -0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9, -0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9, -0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9, -0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x11ff,0x46e,0x46e, -0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x5b9,0x5b9,0x5b9,0x5b9,0x1422,0x5b9,0x5b9,0x5b9, -0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0xf30,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e, -0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e, -0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e, -0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x1432,0x142a,0x142a,0x142a,0x46e,0x46e,0x46e,0x46e, -0x515,0x515,0x515,0x515,0x515,0x515,0x515,0x143a,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e, -0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e, -0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e, -0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3, -0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3, -0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3, -0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3, -0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0x1442,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf, +0x700,0x700,0x700,0x700,0x700,0x700,0x700,0x700,0x700,0x700,0x700,0x700,0x700,0x700,0x700,0x112e, +0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c, +0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c, +0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c, +0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c, +0xeb9,0xec0,0xec8,0x47c,0x5c7,0x5c7,0x5c7,0x5b3,0xed8,0xed0,0xeef,0xee0,0xee7,0xef7,0xb81,0xeff, +0x47c,0x47c,0x47c,0x47c,0xd77,0x5c7,0xf07,0xf0f,0x5c7,0xf17,0xf1f,0xf23,0xf2b,0x5c7,0xf33,0x47c, +0x554,0x55e,0xf3b,0x5c7,0xf3f,0xf47,0xf57,0xf4f,0x5c7,0xf5f,0x5c7,0xf66,0x47c,0x47c,0x47c,0x47c, +0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0xb65,0x8c0,0xe5b,0x47c,0x47c,0x47c,0x47c, +0xf76,0xf6e,0xf79,0xf81,0x8d4,0xf89,0x47c,0xf91,0xf99,0xfa1,0x47c,0x47c,0x5c7,0xfb1,0xfb9,0xfa9, +0xfc9,0xfd0,0xfc1,0xfd8,0xfe0,0x47c,0xff0,0xfe8,0x5c7,0xff3,0xffb,0x1003,0x100b,0x1013,0x47c,0x47c, +0x5c7,0x5c7,0x101b,0x47c,0x554,0x1023,0x4fc,0x102b,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c, +0x47c,0x47c,0x47c,0x1033,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c, +0x1043,0x5fd,0x104b,0x103b,0x945,0x1053,0x105b,0x1061,0x1079,0x1069,0x1071,0x107d,0x945,0x108d,0x1085,0x1095, +0x10a5,0x109d,0x47c,0x47c,0x10ac,0x10b4,0x61f,0x10bc,0x10cc,0x6c8,0x10d4,0x10c4,0x47c,0x47c,0x47c,0x47c, +0x5c7,0x10dc,0x10e4,0x47c,0x5c7,0x10ec,0x10f4,0x47c,0x47c,0x47c,0x47c,0x47c,0x5c7,0x10fc,0x1104,0x47c, +0x5c7,0x110c,0x1114,0x111c,0x5c7,0x112c,0x1124,0x47c,0x113c,0x1134,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c, +0x554,0x4fc,0x1144,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x115c,0x114c,0x1154,0x5c7,0x116c, +0x1164,0x5c7,0x1174,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x118a,0x118f,0x117c,0x1184,0x119f, +0x1197,0x47c,0x47c,0x11ae,0x11b2,0x11a6,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c, +0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7, +0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7, +0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x8bf,0x47c,0x47c,0x47c,0x11c2,0x11ca,0x11d2,0x11ba,0x5c7, +0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x11da,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c, +0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7, +0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7, +0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x11e2,0x47c,0x47c,0x47c, +0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c, +0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x5c7,0x5c7,0x5c7, +0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x11e4, +0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x5c7,0x5c7,0x5c7, +0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x1174,0x8d4, +0x11ec,0x47c,0x47c,0xe51,0x11f4,0x5c7,0x1204,0x120c,0x1214,0x11fc,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c, +0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c, +0x47c,0x47c,0x47c,0x47c,0x47c,0x5c7,0x5c7,0x121c,0x1221,0x1229,0x47c,0x47c,0x1231,0x5c7,0x5c7,0x5c7, +0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7, +0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7, +0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7, +0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x1239,0x5c7,0x5c7,0x5c7, +0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7, +0x5c7,0x5c7,0x5c7,0x5c7,0x1241,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c, +0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c, +0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x5c7,0x5c7,0x5c7, +0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x8d4,0x47c,0x47c,0xe51,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7, +0x5c7,0x5c7,0x5c7,0x5c7,0x8b4,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c, +0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c, +0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x5c7,0x5c7,0x5c7, +0x1249,0x124e,0x1256,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c, +0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x8f2,0x8f2,0x8f2, +0x8f2,0x8f2,0x8f2,0x8f2,0xb94,0x8f2,0x125e,0x8f2,0x1265,0x126d,0x1273,0x8f2,0x1279,0x8f2,0x8f2,0x1281, +0x47c,0x47c,0x47c,0x47c,0x47c,0x8f2,0x8f2,0xa95,0x1289,0x47c,0x47c,0x47c,0x47c,0x1299,0x12a0,0x12a5, +0x12ab,0x12b3,0x12bb,0x12c3,0x129d,0x12cb,0x12d3,0x12db,0x12e0,0x12b2,0x1299,0x12a0,0x129c,0x12ab,0x12e8,0x129a, +0x12eb,0x129d,0x12f3,0x12fb,0x1303,0x130a,0x12f6,0x12fe,0x1306,0x130d,0x12f9,0x1315,0x1291,0x8f2,0x8f2,0x8f2, +0x8f2,0x8f2,0x8f2,0x8f2,0x8f2,0x8f2,0x8f2,0x8f2,0x8f2,0x8f2,0x8f2,0x8f2,0x8f2,0x523,0x1325,0x523, +0x132c,0x1333,0x131d,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c, +0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c, +0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x133a,0x1342,0x47c, +0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c, +0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c, +0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c, +0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x5c7,0x5c7,0x5c7, +0x5c7,0x5c7,0x5c7,0x134a,0x47c,0x554,0x135a,0x1352,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c, +0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c, +0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x136a,0x1372,0x137a, +0x1382,0x138a,0x1392,0x47c,0x1362,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x8f2,0x139a,0x8f2, +0x8f2,0xb8c,0x139f,0x13a3,0xb94,0x13ab,0x13b0,0x8f2,0x139a,0x8f2,0x1278,0x47c,0x13b8,0x13c0,0x13c4,0x13cc, +0x13d4,0x47c,0x47c,0x47c,0x47c,0x8f2,0x8f2,0x8f2,0x8f2,0x8f2,0x8f2,0x8f2,0x13dc,0x8f2,0x8f2,0x8f2, +0x8f2,0x8f2,0x8f2,0x8f2,0x8f2,0x8f2,0x8f2,0x8f2,0x8f2,0x8f2,0x8f2,0x8f2,0x8f2,0x8f2,0x8f2,0x8f2, +0x8f2,0x8f2,0x8f2,0x13e4,0x13ec,0x8f2,0x8f2,0x8f2,0xb8c,0x8f2,0x8f2,0x13e4,0x47c,0x139a,0x8f2,0x13f4, +0x8f2,0x13fc,0xb96,0x47c,0x47c,0x139a,0xa93,0x1401,0x1406,0x140e,0x47c,0x1416,0xa99,0x47c,0x47c,0x47c, +0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c, +0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c, +0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x141e,0x5c7,0x5c7, +0x1425,0x5c7,0x5c7,0x5c7,0x142d,0x5c7,0x1435,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7, +0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7, +0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7, +0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0xc6e,0x5c7,0x5c7, +0x143d,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x1445,0x144d,0x5c7,0x5c7,0x5c7, +0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7, +0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7, +0x5c7,0x5c7,0x5c7,0x5c7,0xcad,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7, +0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7, +0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x1454,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7, +0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7, +0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7, +0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x145b,0x5c7,0x5c7,0x5c7, +0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7, +0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7, +0x5c7,0x5c7,0x5c7,0x5c7,0x1462,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7, +0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7, +0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7, +0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0xb65,0x47c,0x5c7,0x5c7,0x5c7, +0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7, +0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7, +0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7, +0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x1466,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0xf3f,0x5c7,0x5c7, +0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7, +0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7, +0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7, +0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x146e,0x5c7,0x5c7, +0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7, +0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x1476,0x47c,0x47c, +0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c, +0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x5c7,0x5c7, +0x5c7,0x5c7,0x147e,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0xf3f,0x47c, +0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c, +0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c, +0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x148e,0x1486, +0x1486,0x1486,0x47c,0x47c,0x47c,0x47c,0x523,0x523,0x523,0x523,0x523,0x523,0x523,0x1496,0x47c,0x47c, +0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c, +0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c, +0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0xe02,0xe02, +0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02, +0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02, +0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02, +0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0x149e,0x45b,0x45b, 0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf, -0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xc,0x17,0x17,0x17,0x19,0x17,0x17,0x17, -0x14,0x15,0x17,0x18,0x17,0x13,0x17,0x17,0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209, -0x249,0x289,0x17,0x17,0x18,0x18,0x18,0x17,0x17,1,1,1,1,1,1,1, -1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, -1,1,1,0x14,0x17,0x15,0x1a,0x16,0x1a,2,2,2,2,2,2,2, -2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, -2,2,2,0x14,0x18,0x15,0x18,0xf,0,0,0,0,0,0,0,0, +0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf, +0xc,0x17,0x17,0x17,0x19,0x17,0x17,0x17,0x14,0x15,0x17,0x18,0x17,0x13,0x17,0x17, +0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209,0x249,0x289,0x17,0x17,0x18,0x18,0x18,0x17, +0x17,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,0x14,0x17,0x15,0x1a,0x16, +0x1a,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, +2,2,2,2,2,2,2,2,2,2,2,0x14,0x18,0x15,0x18,0xf, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf, 0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf, -0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xc,0x17,0x19,0x19,0x19,0x19,0x1b,0x17, -0x1a,0x1b,5,0x1c,0x18,0x10,0x1b,0x1a,0x1b,0x18,0x34b,0x38b,0x1a,2,0x17,0x17, -0x1a,0x30b,5,0x1d,0x34cb,0x344b,0x3ccb,0x17,1,1,1,1,1,1,1,1, -1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0x18, -1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2, -2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,0x18, -2,2,2,2,2,2,2,2,1,2,1,2,1,2,1,2, +0xc,0x17,0x19,0x19,0x19,0x19,0x1b,0x17,0x1a,0x1b,5,0x1c,0x18,0x10,0x1b,0x1a, +0x1b,0x18,0x34b,0x38b,0x1a,2,0x17,0x17,0x1a,0x30b,5,0x1d,0x34cb,0x344b,0x3ccb,0x17, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,0x18,1,1,1,1,1,1,1,2, +2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, +2,2,2,2,2,2,2,0x18,2,2,2,2,2,2,2,2, 1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2, 1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2, 1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2, -2,1,2,1,2,1,2,1,2,2,1,2,1,2,1,2, +1,2,1,2,1,2,1,2,2,1,2,1,2,1,2,1, +2,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2, 1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2, 1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2, -1,2,1,2,1,2,1,2,1,1,2,1,2,1,2,2, -2,1,1,2,1,2,1,1,2,1,1,1,2,2,1,1, -1,1,2,1,1,2,1,1,1,2,2,2,1,1,2,1, -1,2,1,2,1,2,1,1,2,1,2,2,1,2,1,1, -2,1,1,1,2,1,2,1,1,2,2,5,1,2,2,2, -5,5,5,5,1,3,2,1,3,2,1,3,2,1,2,1, -2,1,2,1,2,1,2,1,2,1,2,1,2,2,1,2, +1,1,2,1,2,1,2,2,2,1,1,2,1,2,1,1, +2,1,1,1,2,2,1,1,1,1,2,1,1,2,1,1, +1,2,2,2,1,1,2,1,1,2,1,2,1,2,1,1, +2,1,2,2,1,2,1,1,2,1,1,1,2,1,2,1, +1,2,2,5,1,2,2,2,5,5,5,5,1,3,2,1, +3,2,1,3,2,1,2,1,2,1,2,1,2,1,2,1, +2,1,2,1,2,2,1,2,1,2,1,2,1,2,1,2, +1,2,1,2,1,2,1,2,2,1,3,2,1,2,1,1, 1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2, -2,1,3,2,1,2,1,1,1,2,1,2,1,2,1,2, 1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2, 1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2, -1,2,1,2,1,2,1,2,1,2,1,2,2,2,2,2, -2,2,1,1,2,1,1,2,2,1,2,1,1,1,1,2, -1,2,1,2,1,2,1,2,2,2,2,2,2,2,2,2, +1,2,1,2,2,2,2,2,2,2,1,1,2,1,1,2, +2,1,2,1,1,1,1,2,1,2,1,2,1,2,1,2, 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, -2,2,2,2,2,2,2,2,5,2,2,2,2,2,2,2, 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, -2,2,2,2,4,4,4,4,4,4,4,4,4,4,4,4, -4,4,4,4,4,4,0x1a,0x1a,0x1a,0x1a,4,4,4,4,4,4, -4,4,4,4,4,4,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a, -0x1a,0x1a,0x1a,0x1a,4,4,4,4,4,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a, -4,0x1a,4,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a, -0x1a,0x1a,0x1a,0x1a,6,6,6,6,6,6,6,6,6,6,6,6, +5,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, +2,2,2,2,2,2,2,2,2,2,2,2,4,4,4,4, +4,4,4,4,4,4,4,4,4,4,4,4,4,4,0x1a,0x1a, +0x1a,0x1a,4,4,4,4,4,4,4,4,4,4,4,4,0x1a,0x1a, +0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,4,4,4,4, +4,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,4,0x1a,4,0x1a,0x1a,0x1a,0x1a,0x1a, +0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,6,6,6,6, 6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6, 6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6, 6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6, -6,6,6,6,1,2,1,2,4,0x1a,1,2,0,0,4,2, -2,2,0x17,1,0,0,0,0,0x1a,0x1a,1,0x17,1,1,1,0, -1,0,1,1,2,1,1,1,1,1,1,1,1,1,1,1, -1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1, -2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, -2,2,2,2,2,2,2,1,2,2,1,1,1,2,2,2, +6,6,6,6,6,6,6,6,6,6,6,6,1,2,1,2, +4,0x1a,1,2,0,0,4,2,2,2,0x17,1,0,0,0,0, +0x1a,0x1a,1,0x17,1,1,1,0,1,0,1,1,2,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1, +1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2, +2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1, +2,2,1,1,1,2,2,2,1,2,1,2,1,2,1,2, 1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2, -1,2,1,2,1,2,1,2,2,2,2,2,1,2,0x18,1, -2,1,1,2,2,1,1,1,1,1,1,1,1,1,1,1, +2,2,2,2,1,2,0x18,1,2,1,1,2,2,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, -1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2, 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, -2,2,2,2,2,2,2,2,1,2,1,2,1,2,1,2, +2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, 1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2, -1,2,1,2,1,2,1,2,1,2,0x1b,6,6,6,6,6, -7,7,1,2,1,2,1,2,1,2,1,2,1,2,1,2, 1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2, +1,2,0x1b,6,6,6,6,6,7,7,1,2,1,2,1,2, 1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2, -1,2,1,2,1,2,1,2,1,1,2,1,2,1,2,1, -2,1,2,1,2,1,2,2,1,2,1,2,1,2,1,2, 1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2, 1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2, -1,2,1,2,1,2,1,2,0,1,1,1,1,1,1,1, -1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, -1,1,1,0,0,4,0x17,0x17,0x17,0x17,0x17,0x17,0,2,2,2, +1,1,2,1,2,1,2,1,2,1,2,1,2,1,2,2, +1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2, +1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2, +1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2, +0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,0,0,4,0x17,0x17, +0x17,0x17,0x17,0x17,0,2,2,2,2,2,2,2,2,2,2,2, 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, -2,2,2,2,2,2,2,2,2,2,2,2,0,0x17,0x13,0, -0,0x1b,0x1b,0x19,0,6,6,6,6,6,6,6,6,6,6,6, +2,2,2,2,0,0x17,0x13,0,0,0x1b,0x1b,0x19,0,6,6,6, 6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6, 6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6, -6,6,0x13,6,0x17,6,6,0x17,6,6,0x17,6,0,0,0,0, -0,0,0,0,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,0, -0,0,0,0,5,5,5,0x17,0x17,0,0,0,0,0,0,0, -0,0,0,0,0x10,0x10,0x10,0x10,0x10,0x10,0x18,0x18,0x18,0x17,0x17,0x19, -0x17,0x17,0x1b,0x1b,6,6,6,6,6,6,6,6,6,6,6,0x17, -0x10,0,0x17,0x17,5,5,5,5,5,5,5,5,5,5,5,5, +6,6,6,6,6,6,6,6,6,6,0x13,6,0x17,6,6,0x17, +6,6,0x17,6,0,0,0,0,0,0,0,0,5,5,5,5, 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,5,5,4,5,5,5,5,5,5,5,5,5,5,6, -6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6, -6,6,6,6,0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209,0x249,0x289,0x17,0x17, -0x17,0x17,5,5,6,5,5,5,5,5,5,5,5,5,5,5, +5,5,5,5,5,5,5,0,0,0,0,0,5,5,5,0x17, +0x17,0,0,0,0,0,0,0,0,0,0,0,0x10,0x10,0x10,0x10, +0x10,0x10,0x18,0x18,0x18,0x17,0x17,0x19,0x17,0x17,0x1b,0x1b,6,6,6,6, +6,6,6,6,6,6,6,0x17,0x10,0,0x17,0x17,5,5,5,5, 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, +5,5,5,5,5,5,5,5,5,5,5,5,4,5,5,5, +5,5,5,5,5,5,5,6,6,6,6,6,6,6,6,6, +6,6,6,6,6,6,6,6,6,6,6,6,0x49,0x89,0xc9,0x109, +0x149,0x189,0x1c9,0x209,0x249,0x289,0x17,0x17,0x17,0x17,5,5,6,5,5,5, 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,5,5,5,5,5,5,0x17,5,6,6,6,6,6,6, -6,0x10,0x1b,6,6,6,6,6,6,4,4,6,6,0x1b,6,6, -6,6,5,5,0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209,0x249,0x289,5,5, -5,0x1b,0x1b,5,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17, -0x17,0x17,0,0x10,5,6,5,5,5,5,5,5,5,5,5,5, 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,5,5,6,6,6,6,6,6,6,6,6,6,6,6, -6,6,6,6,6,6,6,0,0,5,5,5,5,5,5,5, 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, +0x17,5,6,6,6,6,6,6,6,0x10,0x1b,6,6,6,6,6, +6,4,4,6,6,0x1b,6,6,6,6,5,5,0x49,0x89,0xc9,0x109, +0x149,0x189,0x1c9,0x209,0x249,0x289,5,5,5,0x1b,0x1b,5,0x17,0x17,0x17,0x17, +0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0,0x10,5,6,5,5, 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,5,5,5,5,5,5,5,5,5,5,5,5,6,6, -6,6,6,6,6,6,6,6,6,5,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209, -0x249,0x289,5,5,5,5,5,5,5,5,5,5,5,5,5,5, +5,5,5,5,5,5,5,5,5,5,5,5,6,6,6,6, +6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,0, +0,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,5,6,6,6,6,6,6,6,6,6,4,4,0x1b,0x17, -0x17,0x17,4,0,0,0,0,0,6,6,6,6,4,6,6,6, -4,6,6,6,6,6,0,0,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17, -0x17,0x17,0x17,0x17,0x17,0x17,0x17,0,5,5,5,5,5,5,5,5, -5,5,5,5,5,5,5,5,5,5,5,5,5,5,6,6, -6,6,4,6,6,6,6,6,5,5,5,5,5,5,5,5, 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -5,6,6,6,0,0,0x17,0,6,6,0x10,6,6,6,6,6, +5,5,5,5,5,5,6,6,6,6,6,6,6,6,6,6, +6,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209,0x249,0x289,5,5,5,5,5,5, +5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, +5,5,5,5,5,5,5,5,5,5,5,6,6,6,6,6, +6,6,6,6,4,4,0x1b,0x17,0x17,0x17,4,0,0,0,0,0, +6,6,6,6,4,6,6,6,4,6,6,6,6,6,0,0, +0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0, +5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, +5,5,5,5,5,5,6,6,6,6,4,6,6,6,6,6, +5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, +5,5,5,5,5,5,5,5,5,6,6,6,0,0,0x17,0, +5,5,5,5,5,5,5,5,5,5,5,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +6,6,0x10,6,6,6,6,6,6,6,6,6,6,6,6,6, 6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6, -6,6,6,6,6,6,6,6,5,5,5,5,5,5,5,5, -5,5,5,5,5,5,5,5,5,5,5,5,5,0,5,5, -5,5,5,5,5,5,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,6,6,6,6, -6,6,6,6,6,6,6,6,5,5,6,6,0x17,0x17,0x49,0x89, -0xc9,0x109,0x149,0x189,0x1c9,0x209,0x249,0x289,0x17,4,5,5,5,5,5,5, -5,5,5,5,5,5,5,5,6,6,6,8,5,5,5,5, 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,5,5,5,5,5,5,5,5,6,8,6,5,8,8, -8,6,6,6,6,6,6,6,6,8,8,8,8,6,8,8, -5,6,6,6,6,6,6,6,5,5,5,5,5,5,5,5, -5,5,6,6,0,0,0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209,0x249,0x289, -5,5,0x19,0x19,0x37cb,0x35cb,0x3fcb,0x34cb,0x3ccb,0x94b,0x1b,0x19,0,0,0,0, -5,6,8,8,0,5,5,5,5,5,5,5,5,0,0,5, +5,5,5,5,5,0,5,5,5,5,5,5,5,5,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,6,6,6,6,6,6,6,6,6,6,6,6, +5,5,6,6,0x17,0x17,0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209,0x249,0x289, +0x17,4,5,5,5,5,5,5,5,5,5,5,5,5,5,5, +6,6,6,8,5,5,5,5,5,5,5,5,5,5,5,5, +5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, +5,5,6,8,6,5,8,8,8,6,6,6,6,6,6,6, +6,8,8,8,8,6,8,8,5,6,6,6,6,6,6,6, +5,5,5,5,5,5,5,5,5,5,6,6,0,0,0x49,0x89, +0xc9,0x109,0x149,0x189,0x1c9,0x209,0x249,0x289,5,5,0x19,0x19,0x37cb,0x35cb,0x3fcb,0x34cb, +0x3ccb,0x94b,0x1b,0x19,5,0x17,0,0,5,6,8,8,0,5,5,5, +5,5,5,5,5,0,0,5,5,0,0,5,5,5,5,5, +5,5,5,5,5,5,5,5,5,0,5,5,5,5,5,5, +5,0,5,0,0,0,5,5,5,5,0,0,6,5,8,8, +8,6,6,6,6,0,0,8,8,0,0,8,8,6,5,0, +0,0,0,0,0,0,0,8,0,0,0,0,5,5,0,5, +0,0,0,0,0,0,0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209,0x249,0x289, +6,6,5,5,5,6,0,0,0,0,0,0,0,0,0,0, +0,6,6,8,0,5,5,5,5,5,5,0,0,0,0,5, 5,0,0,5,5,5,5,5,5,5,5,5,5,5,5,5, -5,0,5,5,5,5,5,5,5,0,5,0,0,0,5,5, -5,5,0,0,6,5,8,8,8,6,6,6,6,0,0,8, -8,0,0,8,8,6,5,0,0,0,0,0,0,0,0,8, -0,0,0,0,5,5,0,5,0,0,0,0,0,0,0x49,0x89, -0xc9,0x109,0x149,0x189,0x1c9,0x209,0x249,0x289,6,6,5,5,5,6,0,0, -0,0,0,0,0,0,0,0,0,6,6,8,0,5,5,5, -5,5,5,0,0,0,0,5,5,0,0,5,5,5,5,5, +5,0,5,5,5,5,5,5,5,0,5,5,0,5,5,0, +5,5,0,0,6,0,8,8,8,6,6,0,0,0,0,6, +6,0,0,6,6,6,0,0,0,6,0,0,0,0,0,0, +0,5,5,5,5,0,5,0,5,5,6,6,0,0,0x49,0x89, +0xc9,0x109,0x149,0x189,0x1c9,0x209,0x249,0x289,0x17,0x19,0,0,0,0,0,0, +0,5,6,6,6,6,6,6,0,6,6,8,0,5,5,5, +5,5,5,5,5,5,0,5,5,5,0,5,5,5,5,5, 5,5,5,5,5,5,5,5,5,0,5,5,5,5,5,5, -5,0,5,5,0,5,5,0,5,5,0,0,6,0,8,8, -8,6,6,0,0,0,0,6,6,0,0,6,6,6,0,0, -0,6,0,0,0,0,0,0,0,5,5,5,5,0,5,0, +5,0,5,5,0,5,5,5,5,5,0,0,6,5,8,8, +8,6,6,6,6,6,0,6,6,8,0,8,8,6,0,0, +5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 5,5,6,6,0,0,0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209,0x249,0x289, -0x17,0x19,0,0,0,0,0,0,0,5,0,0,0,0,0,0, -0,6,6,8,0,5,5,5,5,5,5,5,5,5,0,5, -5,5,0,5,5,5,5,5,5,5,5,5,5,5,5,5, +0x1b,5,0x34cb,0x344b,0x3ccb,0x37cb,0x35cb,0x3fcb,0,0,0,0,0,0,0,0, +0,6,8,8,0,5,5,5,5,5,5,5,5,0,0,5, +5,0,0,5,5,5,5,5,5,5,5,5,5,5,5,5, 5,0,5,5,5,5,5,5,5,0,5,5,0,5,5,5, -5,5,0,0,6,5,8,8,8,6,6,6,6,6,0,6, -6,8,0,8,8,6,0,0,5,0,0,0,0,0,0,0, +5,5,0,0,6,5,8,6,8,6,6,6,6,0,0,8, +8,0,0,8,8,6,0,0,0,0,0,0,0,0,6,8, +0,0,0,0,5,5,0,5,0,0,0,0,0,0,0x49,0x89, +0xc9,0x109,0x149,0x189,0x1c9,0x209,0x249,0x289,0x7cb,0x1e4b,0x784b,0x1b,0x1b,0x1b,0x1b,0x1b, +0x1b,0x19,0x1b,0,0,0,0,0,0,0,6,5,0,5,5,5, +5,5,5,0,0,0,5,5,5,0,5,5,5,5,0,0, +0,5,5,0,5,0,5,5,0,0,0,5,5,0,0,0, +5,5,5,0,0,0,5,5,5,5,5,5,5,5,5,5, +5,5,0,0,0,0,8,8,6,8,8,0,0,0,8,8, +8,0,8,8,8,6,0,0,5,0,0,0,0,0,0,8, 0,0,0,0,0,0,0,0,5,5,6,6,0,0,0x49,0x89, -0xc9,0x109,0x149,0x189,0x1c9,0x209,0x249,0x289,0x1b,5,0x34cb,0x344b,0x3ccb,0x37cb,0x35cb,0x3fcb, -0,0,0,0,0,0,0,0,0,6,8,8,0,5,5,5, -5,5,5,5,5,0,0,5,5,0,0,5,5,5,5,5, -5,5,5,5,5,5,5,5,5,0,5,5,5,5,5,5, -5,0,5,5,0,5,5,5,5,5,0,0,6,5,8,6, -8,6,6,6,6,0,0,8,8,0,0,8,8,6,0,0, -0,0,0,0,0,0,6,8,0,0,0,0,5,5,0,5, -0,0,0,0,0,0,0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209,0x249,0x289, -0x7cb,0x1e4b,0x784b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x19,0x1b,0,0,0,0,0, -0,0,6,5,0,5,5,5,5,5,5,0,0,0,5,5, -5,0,5,5,5,5,0,0,0,5,5,0,5,0,5,5, -0,0,0,5,5,0,0,0,5,5,5,0,0,0,5,5, -5,5,5,5,5,5,5,5,5,5,0,0,0,0,8,8, -6,8,8,0,0,0,8,8,8,0,8,8,8,6,0,0, -5,0,0,0,0,0,0,8,0,0,0,0,0,0,0,0, -5,5,6,6,0,0,0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209,0x249,0x289, -0,0,0,0,0,0,0,0,0x54b,0x58b,0x5cb,0x60b,0x58b,0x5cb,0x60b,0x1b, -6,8,8,8,0,5,5,5,5,5,5,5,5,0,5,5, -5,0,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -5,0,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,0,0,0,5,6,6,6,8,8,8,8,0,6,6, -6,0,6,6,6,6,0,0,0,0,0,0,0,6,6,0, -5,5,5,0,0,0,0,0,5,5,6,6,0,0,0x49,0x89, -0xc9,0x109,0x149,0x189,0x1c9,0x209,0x249,0x289,0,5,5,0,0,0,0,0, -0,0,0,0,0,0,0,0,5,6,8,8,0,5,5,5, +0xc9,0x109,0x149,0x189,0x1c9,0x209,0x249,0x289,0,0,0,0,0,0,0,0, +0x54b,0x58b,0x5cb,0x60b,0x58b,0x5cb,0x60b,0x1b,6,8,8,8,0,5,5,5, 5,5,5,5,5,0,5,5,5,0,5,5,5,5,5,5, 5,5,5,5,5,5,5,5,5,0,5,5,5,5,5,5, -5,5,5,5,0,5,5,5,5,5,0,0,6,5,8,6, -8,8,8,8,8,0,6,8,8,0,8,8,6,6,0,0, -0,0,0,0,0,8,8,0,0,0,0,0,0,0,5,0, +5,5,5,5,5,5,5,5,5,5,0,0,0,5,6,6, +6,8,8,8,8,0,6,6,6,0,6,6,6,6,0,0, +0,0,0,0,0,6,6,0,5,5,5,0,0,0,0,0, 5,5,6,6,0,0,0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209,0x249,0x289, -0x7cb,0x1e4b,0x784b,0x34cb,0x344b,0x3ccb,0x37cb,0x35cb,0x3fcb,0x1b,5,5,5,5,5,5, -0,6,8,8,0,5,5,5,5,5,5,5,5,0,5,5, +0,5,5,0,0,0,0,0,0,0,0,0,0,0,0,0, +5,6,8,8,0,5,5,5,5,5,5,5,5,0,5,5, 5,0,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,0, -0,5,8,8,8,6,6,6,6,0,8,8,8,0,8,8, -8,6,5,0x1b,0,0,0,0,5,5,5,8,0xcc0b,0xca0b,0xcb4b,0xc90b, -0x364b,0xc94b,0x350b,5,0,0,0,0,0,0,0x49,0x89,0xc9,0x109,0x149,0x189, -0x1c9,0x209,0x249,0x289,0,0,8,8,0x17,0,0,0,0,0,0,0, -0,0,0,0,0,0,8,8,0,5,5,5,5,5,5,5, -5,5,5,5,5,5,5,5,5,5,5,0,0,0,5,5, -5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,0,5,5,5,5,5,5,5,5,5,0,5,0,0, -5,5,5,5,5,5,5,0,0,0,6,0,0,0,0,8, -8,8,6,6,6,0,6,0,8,8,8,8,8,8,8,8, -5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -5,6,5,5,6,6,6,6,6,6,6,0,0,0,0,0x19, -5,5,5,5,5,5,4,6,6,6,6,6,6,6,6,0x17, -0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209,0x249,0x289,0x17,0x17,0,0,0,0, -0,5,5,0,5,0,0,5,5,0,5,0,0,5,0,0, -0,0,0,0,5,5,5,5,0,5,5,5,5,5,5,5, -0,5,5,5,0,5,0,5,0,0,5,5,0,5,5,5, -5,6,5,5,6,6,6,6,6,6,0,6,6,5,0,0, -5,5,5,5,5,0,4,0,6,6,6,6,6,6,0,0, -0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209,0x249,0x289,0,0,5,5,5,5, -5,0x1b,0x1b,0x1b,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17, -0x17,0x17,0x17,0x1b,0x17,0x1b,0x1b,0x1b,6,6,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, -0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209,0x249,0x289,0x344b,0x3c4b,0x444b,0x4c4b,0x544b,0x5c4b, -0x644b,0x6c4b,0x744b,0x2c4b,0x1b,6,0x1b,6,0x1b,6,0x14,0x15,0x14,0x15,8,8, -5,5,5,5,5,5,5,5,0,5,5,5,5,5,5,5, -5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -5,0,0,0,0,6,6,6,6,6,6,6,6,6,6,6, -6,6,6,8,6,6,6,6,6,0x17,6,6,5,5,5,5, -5,6,6,6,6,6,6,6,6,6,6,6,0,6,6,6, +5,0,5,5,5,5,5,5,5,5,5,5,0,5,5,5, +5,5,0,0,6,5,8,6,8,8,8,8,8,0,6,8, +8,0,8,8,6,6,0,0,0,0,0,0,0,8,8,0, +0,0,0,0,0,0,5,0,5,5,6,6,0,0,0x49,0x89, +0xc9,0x109,0x149,0x189,0x1c9,0x209,0x249,0x289,0x7cb,0x1e4b,0x784b,0x34cb,0x344b,0x3ccb,0x37cb,0x35cb, +0x3fcb,0x1b,5,5,5,5,5,5,6,6,8,8,0,5,5,5, +5,5,5,5,5,0,5,5,5,0,5,5,5,5,5,5, +5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, +5,5,5,5,5,5,5,6,6,5,8,8,8,6,6,6, +6,0,8,8,8,0,8,8,8,6,5,0x1b,0,0,0,0, +5,5,5,8,0xcc0b,0xca0b,0xcb4b,0xc90b,0x364b,0xc94b,0x350b,5,0,0,0,0, +0,0,0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209,0x249,0x289,0,0,8,8, +0x17,0,0,0,0,0,0,0,0,0,0,0,0,0,8,8, +0,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, +5,5,5,0,0,0,5,5,5,5,5,5,5,5,5,5, +5,5,5,5,5,5,5,5,5,5,0,5,5,5,5,5, +5,5,5,5,0,5,0,0,5,5,5,5,5,5,5,0, +0,0,6,0,0,0,0,8,8,8,6,6,6,0,6,0, +8,8,8,8,8,8,8,8,5,5,5,5,5,5,5,5, +5,5,5,5,5,5,5,5,5,6,5,5,6,6,6,6, +6,6,6,0,0,0,0,0x19,5,5,5,5,5,5,4,6, +6,6,6,6,6,6,6,0x17,0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209, +0x249,0x289,0x17,0x17,0,0,0,0,0,5,5,0,5,0,0,5, +5,0,5,0,0,5,0,0,0,0,0,0,5,5,5,5, +0,5,5,5,5,5,5,5,0,5,5,5,0,5,0,5, +0,0,5,5,0,5,5,5,5,6,5,5,6,6,6,6, +6,6,0,6,6,5,0,0,5,5,5,5,5,0,4,0, +6,6,6,6,6,6,0,0,0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209, +0x249,0x289,0,0,5,5,5,5,5,0x1b,0x1b,0x1b,0x17,0x17,0x17,0x17, +0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x1b,0x17,0x1b,0x1b,0x1b, +6,6,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209, +0x249,0x289,0x344b,0x3c4b,0x444b,0x4c4b,0x544b,0x5c4b,0x644b,0x6c4b,0x744b,0x2c4b,0x1b,6,0x1b,6, +0x1b,6,0x14,0x15,0x14,0x15,8,8,5,5,5,5,5,5,5,5, +0,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, +5,5,5,5,5,5,5,5,5,0,0,0,0,6,6,6, +6,6,6,6,6,6,6,6,6,6,6,8,6,6,6,6, +6,0x17,6,6,5,5,5,5,5,6,6,6,6,6,6,6, +6,6,6,6,0,6,6,6,6,6,6,6,6,6,6,6, 6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6, -6,6,6,6,6,6,6,6,6,6,6,6,6,0,0x1b,0x1b, -0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,6,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0,0x1b,0x1b, -0x17,0x17,0x17,0x17,0x17,0x1b,0x1b,0x1b,0x1b,0x17,0x17,0,0,0,0,0, -5,5,5,5,5,5,5,5,5,5,5,8,8,6,6,6, -6,8,6,6,6,6,6,6,8,6,6,8,8,6,6,5, -0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209,0x249,0x289,0x17,0x17,0x17,0x17,0x17,0x17, -5,5,5,5,5,5,8,8,6,6,5,5,5,5,6,6, -6,5,8,8,8,5,5,8,8,8,8,8,8,8,5,5, -5,6,6,6,6,5,5,5,5,5,5,5,5,5,5,5, -5,5,6,8,8,6,6,8,8,8,8,8,8,6,5,8, -0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209,0x249,0x289,8,8,8,6,0x1b,0x1b, -5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,5,5,5,5,5,5,5,5,5,0x17,4,5,5,5, -1,1,1,1,1,1,0,1,0,0,0,0,0,1,0,0, -5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -5,0,5,5,5,5,0,0,5,5,5,5,5,5,5,0, -5,0,5,5,5,5,0,0,5,5,5,5,5,5,5,5, -5,0,5,5,5,5,0,0,5,5,5,5,5,5,5,5, +6,6,6,6,6,0,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,6,0x1b, +0x1b,0x1b,0x1b,0x1b,0x1b,0,0x1b,0x1b,0x17,0x17,0x17,0x17,0x17,0x1b,0x1b,0x1b, +0x1b,0x17,0x17,0,0,0,0,0,5,5,5,5,5,5,5,5, +5,5,5,8,8,6,6,6,6,8,6,6,6,6,6,6, +8,6,6,8,8,6,6,5,0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209, +0x249,0x289,0x17,0x17,0x17,0x17,0x17,0x17,5,5,5,5,5,5,8,8, +6,6,5,5,5,5,6,6,6,5,8,8,8,5,5,8, +8,8,8,8,8,8,5,5,5,6,6,6,6,5,5,5, +5,5,5,5,5,5,5,5,5,5,6,8,8,6,6,8, +8,8,8,8,8,6,5,8,0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209, +0x249,0x289,8,8,8,6,0x1b,0x1b,5,5,5,5,5,5,5,5, +5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, +5,5,5,0x17,4,5,5,5,1,1,1,1,1,1,0,1, +0,0,0,0,0,1,0,0,5,5,5,5,5,5,5,5, +5,5,5,5,5,5,5,5,5,0,5,5,5,5,0,0, +5,5,5,5,5,5,5,0,5,0,5,5,5,5,0,0, 5,5,5,5,5,5,5,5,5,0,5,5,5,5,0,0, -5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,0, 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,5,5,5,5,5,5,5,5,5,0,0,6,6,6, -0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x30b,0x34b,0x38b,0x3cb,0x40b,0x44b,0x48b, -0x4cb,0x50b,0x7cb,0xa4b,0xccb,0xf4b,0x11cb,0x144b,0x16cb,0x194b,0x1bcb,0x1e4b,0x788b,0,0,0, +5,0,5,5,5,5,0,0,5,5,5,5,5,5,5,5, +5,5,5,5,5,5,5,0,5,5,5,5,5,5,5,5, 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0,0,0,0,0,0, -1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, -1,1,1,1,1,1,0,0,2,2,2,2,2,2,0,0, -0x13,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -5,0x17,0x17,5,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,5,5,0xc,5,5,5,5,5,5,5,5,5,5,5, -5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,0x14, -0x15,0,0,0,5,5,5,5,5,5,5,5,5,5,5,0x17, -0x17,0x17,0x98a,0x9ca,0xa0a,5,5,5,5,5,5,5,5,0,0,0, -0,0,0,0,5,5,5,5,5,5,5,5,5,5,5,5, -5,0,5,5,5,5,6,6,6,0,0,0,0,0,0,0, -0,0,0,0,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,5,5,5,5,6,6,6,0x17,0x17,0,0,0,0,0, -0,0,0,0,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,5,5,5,5,6,6,0,0,0,0,0,0,0,0, -0,0,0,0,5,5,5,5,5,5,5,5,5,5,5,5, -5,0,5,5,5,0,6,6,0,0,0,0,0,0,0,0, -0,0,0,0,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,5,5,5,5,5,5,6,6,8,6,6,6,6,6, -6,6,8,8,8,8,8,8,8,8,6,8,8,6,6,6, -6,6,6,6,6,6,6,6,0x17,0x17,0x17,4,0x17,0x17,0x17,0x19, -5,6,0,0,0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209,0x249,0x289,0,0, -0,0,0,0,0x54b,0x58b,0x5cb,0x60b,0x64b,0x68b,0x6cb,0x70b,0x74b,0x78b,0,0, -0,0,0,0,5,5,5,5,5,5,5,5,5,6,5,0, -0,0,0,0,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,5,5,0x17,0x17,0x17,0x17,0x17,0x17,0x13,0x17,0x17,0x17,0x17,6, -6,6,0x10,0,0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209,0x249,0x289,0,0, -0,0,0,0,5,5,5,4,5,5,5,5,5,5,5,5, +5,5,5,0,0,6,6,6,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17, +0x17,0x30b,0x34b,0x38b,0x3cb,0x40b,0x44b,0x48b,0x4cb,0x50b,0x7cb,0xa4b,0xccb,0xf4b,0x11cb,0x144b, +0x16cb,0x194b,0x1bcb,0x1e4b,0x788b,0,0,0,5,5,5,5,5,5,5,5, +5,5,5,5,5,5,5,5,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, +0x1b,0x1b,0,0,0,0,0,0,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0, +2,2,2,2,2,2,0,0,0x13,5,5,5,5,5,5,5, +5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, +5,5,5,5,5,5,5,5,5,0x17,0x17,5,5,5,5,5, +5,5,5,5,5,5,5,5,5,5,5,5,0xc,5,5,5, +5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, +5,5,5,5,5,5,5,0x14,0x15,0,0,0,5,5,5,5, +5,5,5,5,5,5,5,0x17,0x17,0x17,0x98a,0x9ca,0xa0a,5,5,5, +5,5,5,5,5,0,0,0,0,0,0,0,5,5,5,5, +5,5,5,5,5,5,5,5,5,0,5,5,5,5,6,6, +6,0,0,0,0,0,0,0,0,0,0,0,5,5,5,5, +5,5,5,5,5,5,5,5,5,5,5,5,5,5,6,6, +6,0x17,0x17,0,0,0,0,0,0,0,0,0,5,5,5,5, +5,5,5,5,5,5,5,5,5,5,5,5,5,5,6,6, +0,0,0,0,0,0,0,0,0,0,0,0,5,5,5,5, +5,5,5,5,5,5,5,5,5,0,5,5,5,0,6,6, +0,0,0,0,0,0,0,0,0,0,0,0,5,5,5,5, 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,5,5,0,0,0,0,0,0,0,0,5,5,5,5, -5,6,6,5,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,5,5,5,5,5,5,5,5,5,5,5,5,0,0, -0,0,0,0,0,0,0,0,6,6,6,8,8,8,8,6, -6,8,8,8,0,0,0,0,8,8,6,8,8,8,8,8, -8,6,6,6,0,0,0,0,0x1b,0,0,0,0x17,0x17,0x49,0x89, -0xc9,0x109,0x149,0x189,0x1c9,0x209,0x249,0x289,5,5,5,5,5,5,5,5, +6,6,8,6,6,6,6,6,6,6,8,8,8,8,8,8, +8,8,6,8,8,6,6,6,6,6,6,6,6,6,6,6, +0x17,0x17,0x17,4,0x17,0x17,0x17,0x19,5,6,0,0,0x49,0x89,0xc9,0x109, +0x149,0x189,0x1c9,0x209,0x249,0x289,0,0,0,0,0,0,0x54b,0x58b,0x5cb,0x60b, +0x64b,0x68b,0x6cb,0x70b,0x74b,0x78b,0,0,0,0,0,0,5,5,5,5, +5,5,5,5,5,6,5,0,0,0,0,0,5,5,5,5, +5,5,5,5,5,5,5,5,5,5,5,5,0x17,0x17,0x17,0x17, +0x17,0x17,0x13,0x17,0x17,0x17,0x17,6,6,6,0x10,0,0x49,0x89,0xc9,0x109, +0x149,0x189,0x1c9,0x209,0x249,0x289,0,0,0,0,0,0,5,5,5,4, 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,5,5,5,5,5,0,5,5,5,5,5,5,5,5, -5,5,5,5,5,5,0,0,5,5,5,5,5,0,0,0, -0,0,0,0,0,0,0,0,5,5,5,5,5,5,5,5, -5,5,5,5,0,0,0,0,5,5,5,5,5,5,5,5, -5,5,5,5,5,5,5,5,5,5,0,0,0,0,0,0, -0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209,0x249,0x289,0x30b,0,0,0,0x1b,0x1b, -0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, -0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, +5,5,5,5,5,5,5,5,5,5,5,5,0,0,0,0, +0,0,0,0,5,5,5,5,5,6,6,5,5,5,5,5, 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,5,5,5,5,5,6,6,8,8,6,0,0,0x17,0x17, -0x17,0x17,0x17,0x17,0x17,0x17,0x17,4,0x17,0x17,0x17,0x17,0x17,0x17,0,0, -6,6,6,6,6,6,6,6,6,6,6,6,6,6,7,0, +5,5,5,5,5,5,0,0,0,0,0,0,0,0,0,0, +6,6,6,8,8,8,8,6,6,8,8,8,0,0,0,0, +8,8,6,8,8,8,8,8,8,6,6,6,0,0,0,0, +0x1b,0,0,0,0x17,0x17,0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209,0x249,0x289, 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,5,5,5,8,6,8,6,6,6,6,6,6,6,0, -6,8,6,8,8,6,6,6,6,6,6,6,6,8,8,8, -8,8,8,6,6,6,6,6,6,6,6,6,6,0,0,6, -0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209,0x249,0x289,0,0,0,0,0,0, -0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209,0x249,0x289,0,0,0,0,0,0, -0x17,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,6,6,6,6,6, -6,6,6,6,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0,0,0, -6,6,6,6,8,5,5,5,5,5,5,5,5,5,5,5, -5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -6,8,6,6,6,6,6,8,6,8,8,8,8,8,6,8, -8,5,5,5,5,5,5,5,0,0,0,0,0x49,0x89,0xc9,0x109, -0x149,0x189,0x1c9,0x209,0x249,0x289,0x17,0x17,0x17,0x17,0x17,0x17,5,8,6,6, -6,6,8,8,6,6,8,6,6,6,5,5,0x49,0x89,0xc9,0x109, -0x149,0x189,0x1c9,0x209,0x249,0x289,5,5,5,5,5,5,6,6,8,5, -5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,5,5,5,5,5,5,5,5,5,5,5,5,6,8, -6,6,8,8,8,6,8,6,6,6,8,8,0,0,0,0, -0,0,0,0,0x17,0x17,0x17,0x17,0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209, -0x249,0x289,0,0,0,5,5,5,0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209, -0x249,0x289,5,5,5,5,5,5,8,8,8,8,8,8,8,8, -6,6,6,6,6,6,6,6,8,8,6,6,0,0,0,0x17, -0x17,0x17,0x17,0x17,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,5,5,5,5,5,5,5,5,5,5,4,4,4,4, -4,4,0x17,0x17,2,2,2,2,2,2,2,2,2,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0,0,0,0, -0,0,0,0,6,6,6,0x17,6,6,6,6,6,6,6,6, -6,6,6,6,6,8,6,6,6,6,6,6,6,5,5,5, -5,6,5,5,5,5,8,8,6,5,5,0,6,6,0,0, -0,0,0,0,2,2,2,2,2,2,2,2,2,2,2,2, -4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, +5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,0, +5,5,5,5,5,5,5,5,5,5,5,5,5,5,0,0, +5,5,5,5,5,0,0,0,0,0,0,0,0,0,0,0, +5,5,5,5,5,5,5,5,5,5,5,5,0,0,0,0, +5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, +5,5,0,0,0,0,0,0,0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209, +0x249,0x289,0x30b,0,0,0,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, +0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, +0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,5,5,5,5,5,5,5,5, +5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,6, +6,8,8,6,0,0,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,4, +0x17,0x17,0x17,0x17,0x17,0x17,0,0,6,6,6,6,6,6,6,6, +6,6,6,6,6,6,7,0,5,5,5,5,5,5,5,5, +5,5,5,5,5,5,5,5,5,5,5,5,5,8,6,8, +6,6,6,6,6,6,6,0,6,8,6,8,8,6,6,6, +6,6,6,6,6,8,8,8,8,8,8,6,6,6,6,6, +6,6,6,6,6,0,0,6,0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209, +0x249,0x289,0,0,0,0,0,0,0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209, +0x249,0x289,0,0,0,0,0,0,0x17,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, +0x1b,0x1b,0x1b,6,6,6,6,6,6,6,6,6,0x1b,0x1b,0x1b,0x1b, +0x1b,0x1b,0x1b,0x1b,0x1b,0,0,0,6,6,6,6,8,5,5,5, +5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, +5,5,5,5,5,5,5,5,6,8,6,6,6,6,6,8, +6,8,8,8,8,8,6,8,8,5,5,5,5,5,5,5, +0,0,0,0,0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209,0x249,0x289,0x17,0x17, +0x17,0x17,0x17,0x17,5,8,6,6,6,6,8,8,6,6,8,6, +6,6,5,5,0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209,0x249,0x289,5,5, +5,5,5,5,6,6,8,5,5,5,5,5,5,5,5,5, +5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, +5,5,5,5,5,5,6,8,6,6,8,8,8,6,8,6, +6,6,8,8,0,0,0,0,0,0,0,0,0x17,0x17,0x17,0x17, +0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209,0x249,0x289,0,0,0,5,5,5, +0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209,0x249,0x289,5,5,5,5,5,5, +8,8,8,8,8,8,8,8,6,6,6,6,6,6,6,6, +8,8,6,6,0,0,0,0x17,0x17,0x17,0x17,0x17,5,5,5,5, +5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, +5,5,5,5,4,4,4,4,4,4,0x17,0x17,2,2,2,2, +2,2,2,2,2,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0x17,0x17,0x17,0x17, +0x17,0x17,0x17,0x17,0,0,0,0,0,0,0,0,6,6,6,0x17, +6,6,6,6,6,6,6,6,6,6,6,6,6,8,6,6, +6,6,6,6,6,5,5,5,5,6,5,5,5,5,8,8, +6,5,5,8,6,6,0,0,0,0,0,0,2,2,2,2, +2,2,2,2,2,2,2,2,4,4,4,4,4,4,4,4, 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, -4,4,4,2,2,2,2,2,2,2,2,2,2,2,2,2, -4,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, -2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,4, -4,4,4,4,6,6,6,6,6,6,6,6,6,6,6,6, -6,6,6,6,6,6,6,6,6,6,0,0,0,0,0,6, -6,6,6,6,1,2,1,2,1,2,1,2,1,2,1,2, -1,2,1,2,1,2,1,2,1,2,2,2,2,2,2,2, -2,2,1,2,2,2,2,2,2,2,2,2,1,1,1,1, -1,0x1a,0x1a,0x1a,0,0,2,2,2,0,2,2,1,1,1,1, -3,0x1a,0x1a,0,2,2,2,2,2,2,2,2,1,1,1,1, -1,1,1,1,2,2,2,2,2,2,0,0,1,1,1,1, -1,1,0,0,2,2,2,2,2,2,2,2,1,1,1,1, -1,1,1,1,2,2,2,2,2,2,2,2,1,1,1,1, -1,1,1,1,2,2,2,2,2,2,0,0,1,1,1,1, -1,1,0,0,2,2,2,2,2,2,2,2,0,1,0,1, -0,1,0,1,2,2,2,2,2,2,2,2,1,1,1,1, -1,1,1,1,2,2,2,2,2,2,2,2,2,2,2,2, -2,2,0,0,2,2,2,2,2,2,2,2,3,3,3,3, -3,3,3,3,2,2,2,2,2,2,2,2,3,3,3,3, -3,3,3,3,2,2,2,2,2,0,2,2,1,1,1,1, -3,0x1a,2,0x1a,0x1a,0x1a,2,2,2,0,2,2,1,1,1,1, -3,0x1a,0x1a,0x1a,2,2,2,2,0,0,2,2,1,1,1,1, -0,0x1a,0x1a,0x1a,0x16,0x17,0x17,0x17,0x18,0x14,0x15,0x17,0x17,0x17,0x17,0x17, -0x17,0x17,0x17,0x17,0x17,0x17,0x18,0x17,0x16,0x17,0x17,0x17,0x17,0x17,0x17,0x17, -0x17,0x17,0x17,0xc,0x10,0x10,0x10,0x10,0x10,0,0x10,0x10,0x10,0x10,0x10,0x10, -0x10,0x10,0x10,0x10,0x2cb,4,0,0,0x3cb,0x40b,0x44b,0x48b,0x4cb,0x50b,0x18,0x18, -0x18,0x14,0x15,4,0xc,0xc,0xc,0xc,0xc,0xc,0xc,0xc,0xc,0xc,0xc,0x10, -0x10,0x10,0x10,0x10,0x13,0x13,0x13,0x13,0x13,0x13,0x17,0x17,0x1c,0x1d,0x14,0x1c, -0x1c,0x1d,0x14,0x1c,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0xd,0xe,0x10,0x10, -0x10,0x10,0x10,0xc,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x1c,0x1d,0x17, -0x17,0x17,0x17,0x16,0x2cb,0x30b,0x34b,0x38b,0x3cb,0x40b,0x44b,0x48b,0x4cb,0x50b,0x18,0x18, -0x18,0x14,0x15,0,4,4,4,4,4,4,4,4,4,4,4,4, -4,0,0,0,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19, +4,4,4,4,4,4,4,4,4,4,4,2,2,2,2,2, +2,2,2,2,2,2,2,2,4,2,2,2,2,2,2,2, +2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, +2,2,2,2,2,2,2,4,4,4,4,4,6,6,6,6, +6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6, +6,6,6,6,6,6,0,6,6,6,6,6,1,2,1,2, +1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2, +1,2,2,2,2,2,2,2,2,2,1,2,2,2,2,2, +2,2,2,2,1,1,1,1,1,0x1a,0x1a,0x1a,0,0,2,2, +2,0,2,2,1,1,1,1,3,0x1a,0x1a,0,2,2,2,2, +2,2,2,2,1,1,1,1,1,1,1,1,2,2,2,2, +2,2,0,0,1,1,1,1,1,1,0,0,2,2,2,2, +2,2,2,2,1,1,1,1,1,1,1,1,2,2,2,2, +2,2,2,2,1,1,1,1,1,1,1,1,2,2,2,2, +2,2,0,0,1,1,1,1,1,1,0,0,2,2,2,2, +2,2,2,2,0,1,0,1,0,1,0,1,2,2,2,2, +2,2,2,2,1,1,1,1,1,1,1,1,2,2,2,2, +2,2,2,2,2,2,2,2,2,2,0,0,2,2,2,2, +2,2,2,2,3,3,3,3,3,3,3,3,2,2,2,2, +2,2,2,2,3,3,3,3,3,3,3,3,2,2,2,2, +2,0,2,2,1,1,1,1,3,0x1a,2,0x1a,0x1a,0x1a,2,2, +2,0,2,2,1,1,1,1,3,0x1a,0x1a,0x1a,2,2,2,2, +0,0,2,2,1,1,1,1,0,0x1a,0x1a,0x1a,0x16,0x17,0x17,0x17, +0x18,0x14,0x15,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x18,0x17, +0x16,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0xc,0x10,0x10,0x10,0x10, +0x10,0,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x2cb,4,0,0, +0x3cb,0x40b,0x44b,0x48b,0x4cb,0x50b,0x18,0x18,0x18,0x14,0x15,4,0xc,0xc,0xc,0xc, +0xc,0xc,0xc,0xc,0xc,0xc,0xc,0x10,0x10,0x10,0x10,0x10,0x13,0x13,0x13,0x13, +0x13,0x13,0x17,0x17,0x1c,0x1d,0x14,0x1c,0x1c,0x1d,0x14,0x1c,0x17,0x17,0x17,0x17, +0x17,0x17,0x17,0x17,0xd,0xe,0x10,0x10,0x10,0x10,0x10,0xc,0x17,0x17,0x17,0x17, +0x17,0x17,0x17,0x17,0x17,0x1c,0x1d,0x17,0x17,0x17,0x17,0x16,0x2cb,0x30b,0x34b,0x38b, +0x3cb,0x40b,0x44b,0x48b,0x4cb,0x50b,0x18,0x18,0x18,0x14,0x15,0,4,4,4,4, +4,4,4,4,4,4,4,4,4,0,0,0,0x19,0x19,0x19,0x19, 0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19, -0x19,0x19,0x19,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,6,6,6,6,6,6,6,6,6,6,6,6, -6,7,7,7,7,6,7,7,7,6,6,6,6,6,6,6, -6,6,6,6,6,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0x1b,0x1b,0x1b,0x1b,1,0x1b,1,0x1b,1,0x1b,1,1, -1,1,0x1b,2,1,1,1,1,2,5,5,5,5,2,0x1b,0x1b, -2,2,1,1,0x18,0x18,0x18,0x18,0x18,1,2,2,2,2,0x1b,0x18, -0x1b,0x1b,2,0x1b,0x358b,0x360b,0x364b,0x348b,0x388b,0x350b,0x390b,0x3d0b,0x410b,0x354b,0x454b,0x35cb, -0x3dcb,0x45cb,0x4dcb,0x58b,0x1b,0x1b,1,0x1b,0x1b,0x1b,0x1b,1,0x1b,0x1b,2,1, -1,1,2,2,1,1,1,2,0x1b,1,0x1b,0x1b,0x18,1,1,1, -1,1,0x1b,0x1b,0x58a,0x5ca,0x60a,0x64a,0x68a,0x6ca,0x70a,0x74a,0x78a,0x7ca,0x80a,0x84a, -0x11ca,0x1e4a,0x980a,0x784a,0x58a,0x5ca,0x60a,0x64a,0x68a,0x6ca,0x70a,0x74a,0x78a,0x7ca,0x80a,0x84a, -0x11ca,0x1e4a,0x980a,0x784a,0x784a,0x984a,0x788a,1,2,0x6ca,0x11ca,0x988a,0x78ca,0x54b,0x1b,0x1b, -0,0,0,0,0x18,0x18,0x18,0x18,0x18,0x1b,0x1b,0x1b,0x1b,0x1b,0x18,0x18, -0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, -0x1b,0x1b,0x1b,0x1b,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18, -0x18,0x1b,0x1b,0x18,0x1b,0x1b,0x18,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x18,0x1b, -0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, -0x1b,0x1b,0x18,0x18,0x1b,0x1b,0x18,0x1b,0x18,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, -0x1b,0x1b,0x1b,0x1b,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18, +0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,6,6,6,6, +6,6,6,6,6,6,6,6,6,7,7,7,7,6,7,7, +7,6,6,6,6,6,6,6,6,6,6,6,6,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0x1b,0x1b,0x1b,0x1b, +1,0x1b,1,0x1b,1,0x1b,1,1,1,1,0x1b,2,1,1,1,1, +2,5,5,5,5,2,0x1b,0x1b,2,2,1,1,0x18,0x18,0x18,0x18, +0x18,1,2,2,2,2,0x1b,0x18,0x1b,0x1b,2,0x1b,0x358b,0x360b,0x364b,0x348b, +0x388b,0x350b,0x390b,0x3d0b,0x410b,0x354b,0x454b,0x35cb,0x3dcb,0x45cb,0x4dcb,0x58b,0x1b,0x1b,1,0x1b, +0x1b,0x1b,0x1b,1,0x1b,0x1b,2,1,1,1,2,2,1,1,1,2, +0x1b,1,0x1b,0x1b,0x18,1,1,1,1,1,0x1b,0x1b,0x58a,0x5ca,0x60a,0x64a, +0x68a,0x6ca,0x70a,0x74a,0x78a,0x7ca,0x80a,0x84a,0x11ca,0x1e4a,0x980a,0x784a,0x58a,0x5ca,0x60a,0x64a, +0x68a,0x6ca,0x70a,0x74a,0x78a,0x7ca,0x80a,0x84a,0x11ca,0x1e4a,0x980a,0x784a,0x784a,0x984a,0x788a,1, +2,0x6ca,0x11ca,0x988a,0x78ca,0x54b,0x1b,0x1b,0,0,0,0,0x18,0x18,0x18,0x18, +0x18,0x1b,0x1b,0x1b,0x1b,0x1b,0x18,0x18,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, +0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x18,0x18,0x18,0x18, +0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x1b,0x1b,0x18,0x1b,0x1b,0x18,0x1b, +0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x18,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, +0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x18,0x18,0x1b,0x1b,0x18,0x1b, +0x18,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x18,0x18,0x18,0x18, 0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18, -0x18,0x18,0x18,0x18,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x14,0x15,0x14,0x15, +0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x1b,0x1b,0x1b,0x1b, +0x1b,0x1b,0x1b,0x1b,0x14,0x15,0x14,0x15,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, +0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x18,0x18,0x1b,0x1b, +0x1b,0x1b,0x1b,0x1b,0x1b,0x14,0x15,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, 0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, -0x1b,0x1b,0x1b,0x1b,0x18,0x18,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x14,0x15,0x1b, +0x1b,0x1b,0x1b,0x1b,0x18,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, 0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, -0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x18,0x1b,0x1b,0x1b, +0x1b,0x1b,0x1b,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18, +0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, 0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, -0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x18,0x18,0x18,0x18,0x18, -0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18, +0x1b,0x1b,0x1b,0x1b,0x18,0x18,0x18,0x18,0x18,0x18,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, 0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, -0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x18,0x18,0x18,0x18, -0x18,0x18,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, -0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0, +0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, -0x1b,0x1b,0x2cb,0x80b,0x84b,0x88b,0x8cb,0x90b,0x94b,0x98b,0x9cb,0xa0b,0xa4b,0x30b,0x34b,0x38b, -0x3cb,0x40b,0x44b,0x48b,0x4cb,0x50b,0x7cb,0x2cb,0x30b,0x34b,0x38b,0x3cb,0x40b,0x44b,0x48b,0x4cb, -0x50b,0x7cb,0x80b,0x84b,0x88b,0x8cb,0x90b,0x94b,0x98b,0x9cb,0xa0b,0xa4b,0x30b,0x34b,0x38b,0x3cb, -0x40b,0x44b,0x48b,0x4cb,0x50b,0x7cb,0x80b,0x84b,0x88b,0x8cb,0x90b,0x94b,0x98b,0x9cb,0xa0b,0xa4b, +0,0,0,0,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x2cb,0x80b, +0x84b,0x88b,0x8cb,0x90b,0x94b,0x98b,0x9cb,0xa0b,0xa4b,0x30b,0x34b,0x38b,0x3cb,0x40b,0x44b,0x48b, +0x4cb,0x50b,0x7cb,0x2cb,0x30b,0x34b,0x38b,0x3cb,0x40b,0x44b,0x48b,0x4cb,0x50b,0x7cb,0x80b,0x84b, +0x88b,0x8cb,0x90b,0x94b,0x98b,0x9cb,0xa0b,0xa4b,0x30b,0x34b,0x38b,0x3cb,0x40b,0x44b,0x48b,0x4cb, +0x50b,0x7cb,0x80b,0x84b,0x88b,0x8cb,0x90b,0x94b,0x98b,0x9cb,0xa0b,0xa4b,0x1b,0x1b,0x1b,0x1b, 0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, -0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18, +0x1b,0x1b,0x1b,0x1b,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x1b,0x1b,0x1b,0x1b, 0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, -0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x18,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, -0x1b,0x18,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, +0x1b,0x1b,0x1b,0x18,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x18,0x1b,0x1b, 0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, -0x1b,0x1b,0x1b,0x18,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, -0x1b,0x1b,0x1b,0x1b,0x14,0x15,0x14,0x15,0x14,0x15,0x14,0x15,0x14,0x15,0x14,0x15, -0x14,0x15,0x30b,0x34b,0x38b,0x3cb,0x40b,0x44b,0x48b,0x4cb,0x50b,0x7cb,0x30b,0x34b,0x38b,0x3cb, -0x40b,0x44b,0x48b,0x4cb,0x50b,0x7cb,0x30b,0x34b,0x38b,0x3cb,0x40b,0x44b,0x48b,0x4cb,0x50b,0x7cb, -0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x18,0x18,0x18,0x18, -0x18,0x14,0x15,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18, -0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x14,0x15, -0x14,0x15,0x14,0x15,0x14,0x15,0x14,0x15,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18, -0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x14,0x15,0x14,0x15,0x14, -0x15,0x14,0x15,0x14,0x15,0x14,0x15,0x14,0x15,0x14,0x15,0x14,0x15,0x14,0x15,0x14, -0x15,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18, -0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x14,0x15,0x14,0x15, -0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18, -0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x14,0x15,0x18,0x18, +0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x18, 0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, +0x14,0x15,0x14,0x15,0x14,0x15,0x14,0x15,0x14,0x15,0x14,0x15,0x14,0x15,0x30b,0x34b, +0x38b,0x3cb,0x40b,0x44b,0x48b,0x4cb,0x50b,0x7cb,0x30b,0x34b,0x38b,0x3cb,0x40b,0x44b,0x48b,0x4cb, +0x50b,0x7cb,0x30b,0x34b,0x38b,0x3cb,0x40b,0x44b,0x48b,0x4cb,0x50b,0x7cb,0x1b,0x1b,0x1b,0x1b, +0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x18,0x18,0x18,0x18,0x18,0x14,0x15,0x18, +0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18, +0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x14,0x15,0x14,0x15,0x14,0x15, +0x14,0x15,0x14,0x15,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18, +0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x14,0x15,0x14,0x15,0x14,0x15,0x14,0x15,0x14, +0x15,0x14,0x15,0x14,0x15,0x14,0x15,0x14,0x15,0x14,0x15,0x14,0x15,0x18,0x18,0x18, 0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18, -0x18,0x1b,0x1b,0x18,0x18,0x18,0x18,0x18,0x18,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, +0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x14,0x15,0x14,0x15,0x18,0x18,0x18,0x18, +0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18, +0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x14,0x15,0x18,0x18,0x1b,0x1b,0x1b,0x1b, +0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x18,0x18,0x18,0x18, +0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x1b,0x1b,0x18, +0x18,0x18,0x18,0x18,0x18,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, +0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0,0,0x1b,0x1b, 0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, -0,0,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, -0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0,0,0x1b,0x1b,0x1b,0x1b, +0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0,0,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, 0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, -0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0,0,0,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, -0x1b,0x1b,0x1b,0x1b,0x1b,0,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0x1b,0x1b,0x1b,0x1b, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, -2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,0, -1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0, +0x1b,0x1b,0,0,0,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, +0x1b,0,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0,0,0,0,0, +0,0,0,0,0,0,0,0,0x1b,0x1b,0x1b,0x1b,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,2, 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, -1,2,1,1,1,2,2,1,2,1,2,1,2,1,1,1, -1,2,1,2,2,1,2,2,2,2,2,2,4,4,1,1, -1,2,1,2,2,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,1,2,1,2,6, -6,6,1,2,0,0,0,0,0,0x17,0x17,0x17,0x17,0x344b,0x17,0x17, -2,2,2,2,2,2,0,2,0,0,0,0,0,2,0,0, -5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -0,0,0,0,0,0,0,4,0x17,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,6,5,5,5,5,5,5,5,0, -5,5,5,5,5,5,5,0,5,5,5,5,5,5,5,0, -5,5,5,5,5,5,5,0,5,5,5,5,5,5,5,5, -5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,0, -0,0,0,0,0,0,0,0,0x17,0x17,0x1c,0x1d,0x1c,0x1d,0x17,0x17, -0x17,0x1c,0x1d,0x17,0x1c,0x1d,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x13, -0x17,0x17,0x13,0x17,0x1c,0x1d,0x17,0x17,0x1c,0x1d,0x14,0x15,0x14,0x15,0x14,0x15, -0x14,0x15,0x17,0x17,0x17,0x17,0x17,4,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17, -0x17,0x17,0x13,0x13,0x17,0x17,0x17,0x17,0x13,0x17,0x14,0x17,0x17,0,0,0, +2,2,2,2,2,2,2,2,2,2,2,0,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,0,2,2,2,2, +2,2,2,2,2,2,2,2,2,2,2,2,1,2,1,1, +1,2,2,1,2,1,2,1,2,1,1,1,1,2,1,2, +2,1,2,2,2,2,2,2,4,4,1,1,1,2,1,2, +2,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,1,2,1,2,6,6,6,1,2, +0,0,0,0,0,0x17,0x17,0x17,0x17,0x344b,0x17,0x17,2,2,2,2, +2,2,0,2,0,0,0,0,0,2,0,0,5,5,5,5, +5,5,5,5,5,5,5,5,5,5,5,5,0,0,0,0, +0,0,0,4,0x17,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,6,5,5,5,5,5,5,5,0,5,5,5,5, +5,5,5,0,5,5,5,5,5,5,5,0,5,5,5,5, +5,5,5,0,5,5,5,5,5,5,5,5,5,5,5,5, +5,5,5,5,5,5,5,5,5,5,5,0,0,0,0,0, +0,0,0,0,0x17,0x17,0x1c,0x1d,0x1c,0x1d,0x17,0x17,0x17,0x1c,0x1d,0x17, +0x1c,0x1d,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x13,0x17,0x17,0x13,0x17, +0x1c,0x1d,0x17,0x17,0x1c,0x1d,0x14,0x15,0x14,0x15,0x14,0x15,0x14,0x15,0x17,0x17, +0x17,0x17,0x17,4,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x13,0x13, +0x17,0x17,0x17,0x17,0x13,0x17,0x14,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, -0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, -0x1b,0x1b,0,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, -0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0,0,0,0,0,0,0,0, 0,0,0,0,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, -0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0x1b,0x1b,0x1b,0x1b, -0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0,0,0,0,0x1b,0x58a,0x5ca,0x60a, -0x64a,0x68a,0x6ca,0x70a,0x74a,0x78a,6,6,6,6,8,8,0x13,4,4,4, -4,4,0x1b,0x1b,0x7ca,0xa4a,0xcca,4,5,0x17,0x1b,0x1b,0xc,0x17,0x17,0x17, -0x1b,4,5,0x54a,0x14,0x15,0x14,0x15,0x14,0x15,0x14,0x15,0x14,0x15,0x1b,0x1b, -0x14,0x15,0x14,0x15,0x14,0x15,0x14,0x15,0x13,0x14,0x15,0x15,5,5,5,5, +0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0,0x1b, +0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, +0x1b,0x1b,0x1b,0x1b,0,0,0,0,0,0,0,0,0,0,0,0, +0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, +0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, +0x1b,0x1b,0x1b,0x1b,0,0,0,0,0x1b,0x58a,0x5ca,0x60a,0x64a,0x68a,0x6ca,0x70a, +0x74a,0x78a,6,6,6,6,8,8,0x13,4,4,4,4,4,0x1b,0x1b, +0x7ca,0xa4a,0xcca,4,5,0x17,0x1b,0x1b,0xc,0x17,0x17,0x17,0x1b,4,5,0x54a, +0x14,0x15,0x14,0x15,0x14,0x15,0x14,0x15,0x14,0x15,0x1b,0x1b,0x14,0x15,0x14,0x15, +0x14,0x15,0x14,0x15,0x13,0x14,0x15,0x15,5,5,5,5,5,5,5,5, +5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,0, +0,6,6,0x1a,0x1a,4,4,5,5,5,5,5,5,5,5,5, 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,5,0,0,6,6,0x1a,0x1a,4,4,5,5,5,5,5, +5,5,5,0x17,4,4,4,5,0,0,0,0,0,5,5,5, 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,5,5,5,5,5,0x17,4,4,4,5,0,0,0,0, -0,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,5,5,5,5,5,5,5,5,5,5,5,5,0,0, -0,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,5,0,0x1b,0x1b,0x58b,0x5cb,0x60b,0x64b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, -0x1b,0x1b,0x1b,0x1b,0,0,0,0,0,0,0,0,0,0,0,0, +5,5,5,5,5,5,5,5,5,5,5,0,0,5,5,5, +5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,0, +0x1b,0x1b,0x58b,0x5cb,0x60b,0x64b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, +0,0,0,0,0,0,0,0,0,0,0,0,5,5,5,5, +5,5,5,5,5,5,5,5,5,5,5,5,0x58b,0x5cb,0x60b,0x64b, +0x68b,0x6cb,0x70b,0x74b,0x78b,0x7cb,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, +0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x7cb,0xa4b,0xccb,0xf4b, +0x11cb,0x144b,0x16cb,0x194b,0x1b,0xa8b,0xacb,0xb0b,0xb4b,0xb8b,0xbcb,0xc0b,0xc4b,0xc8b,0xccb,0xd0b, +0xd4b,0xd8b,0xdcb,0xe0b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, +0x1b,0x1b,0x1b,0x1b,0x1b,0xe4b,0xe8b,0xecb,0xf0b,0xf4b,0xf8b,0xfcb,0x100b,0x104b,0x108b,0x10cb, +0x110b,0x114b,0x118b,0x11cb,5,5,5,5,5,0x685,5,5,5,5,5,5, 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, -0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0, -0x58b,0x5cb,0x60b,0x64b,0x68b,0x6cb,0x70b,0x74b,0x78b,0x7cb,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, -0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, -0x7cb,0xa4b,0xccb,0xf4b,0x11cb,0x144b,0x16cb,0x194b,0x1b,0xa8b,0xacb,0xb0b,0xb4b,0xb8b,0xbcb,0xc0b, -0xc4b,0xc8b,0xccb,0xd0b,0xd4b,0xd8b,0xdcb,0xe0b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, -0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0xe4b,0xe8b,0xecb,0xf0b,0xf4b,0xf8b,0xfcb, -0x100b,0x104b,0x108b,0x10cb,0x110b,0x114b,0x118b,0x11cb,5,5,5,5,5,0x685,5,5, +5,5,5,5,5,5,5,0x5c5,5,5,5,5,5,5,5,5, 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,5,5,5,5,5,5,5,5,5,0x5c5,5,5,5,5, +5,5,5,5,5,5,0x685,5,5,5,5,5,5,5,5,5, +5,5,5,5,5,5,5,5,5,5,5,5,5,0x705,5,5, 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,5,5,5,5,5,5,5,5,0x685,5,5,5,5,5, +0x585,5,5,0x705,5,5,5,0x7885,5,0x605,5,5,5,5,5,5, 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -5,0x705,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,5,5,0x585,5,5,0x705,5,5,5,0x7885,5,0x605,5,5, +5,5,5,5,5,5,5,5,5,0x785,5,5,5,5,5,5, +5,5,5,5,5,5,5,5,0x5c5,5,5,5,5,5,5,5, +0x685,5,0x645,5,5,5,5,5,5,5,5,5,5,5,5,5, 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,5,5,5,5,5,5,5,5,5,5,5,0x785,5,5, -5,5,5,5,5,5,5,5,5,5,5,5,0x5c5,5,5,5, -5,5,5,5,0x685,5,0x645,5,5,5,5,5,5,5,5,5, +5,5,5,0x7985,0x7c5,5,5,5,5,5,5,5,5,5,5,5, 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,5,5,5,5,5,0x7985,0x7c5,5,5,5,5,5,5,5, +5,5,5,0x7845,5,5,5,5,5,5,5,5,0x605,5,5,5, 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,5,5,5,5,5,0x7845,5,5,5,5,5,5,5,5, -0x605,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,5,5,5,5,5,5,5,0x685,5,5,5,5,5,5, -5,5,5,5,5,5,5,5,5,5,5,5,0x1e45,5,5,5, -5,5,5,5,5,5,5,5,5,5,5,5,0x7985,5,5,5, +5,5,5,5,5,0x685,5,5,5,5,5,5,5,5,5,5, +5,5,5,5,5,5,5,5,0x1e45,5,5,5,5,5,5,5, +5,5,5,5,5,5,5,5,0x7985,5,5,5,5,5,5,5, 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,5,5,5,5,5,5,5,5,0x7a85,5,5,5,5,5, +5,5,5,5,5,5,0x7a85,5,5,5,5,5,5,5,5,5, 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,5,5,5,0x5c5,5,0x745,5,0x6c5,5,5,5,5,5,5, -5,5,5,5,5,5,5,5,5,5,5,5,5,0x7c5,5,0x7845, -0xa45,0xcc5,5,5,5,5,5,5,0xf45,5,5,5,5,5,5,5, -5,5,5,5,5,5,5,5,5,5,5,5,5,0x605,0x605,0x605, -0x605,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,0x645, +5,0x5c5,5,0x745,5,0x6c5,5,5,5,5,5,5,5,5,5,5, +5,5,5,5,5,5,5,5,5,0x7c5,5,0x7845,0xa45,0xcc5,5,5, +5,5,5,5,0xf45,5,5,5,5,5,5,5,5,5,5,5, +5,5,5,5,5,5,5,5,5,0x605,0x605,0x605,0x605,5,5,5, 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -5,0x585,5,5,5,5,5,5,5,0x585,5,5,5,5,5,5, +5,5,5,5,5,5,5,5,5,5,5,0x645,5,5,5,5, +5,5,5,5,5,5,5,5,5,5,5,5,5,0x585,5,5, +5,5,5,5,5,0x585,5,5,5,5,5,5,5,5,5,5, 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,5,5,5,5,0x585,5,5,5,5,5,5,5,5,5, +5,5,0x585,5,5,5,5,5,5,5,5,5,5,5,5,5, 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,5,5,5,5,0x785,0xa45,5,5,5,5,5,5,5,5, -5,5,5,5,0x585,0x5c5,0x605,5,0x5c5,5,5,5,5,5,5,5, +5,5,0x785,0xa45,5,5,5,5,5,5,5,5,5,5,5,5, +0x585,0x5c5,0x605,5,0x5c5,5,5,5,5,5,5,5,5,5,5,5, 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,5,5,5,5,5,5,5,5,0x7c5,5,5,5,5,5, -5,5,5,5,5,5,5,5,0x745,5,5,5,5,5,5,5, -5,5,5,5,5,5,5,5,5,5,5,5,5,5,0x705,5, +5,5,5,5,5,5,0x7c5,5,5,5,5,5,5,5,5,5, +5,5,5,5,0x745,5,5,5,5,5,5,5,5,5,5,5, +5,5,5,5,5,5,5,5,5,5,0x705,5,5,5,5,5, 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,5,5,5,5,5,5,5,5,0x785,5,5,5,5,5, +5,5,5,5,5,5,0x785,5,5,5,5,5,5,5,5,5, 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,5,5,5,5,5,5,5,5,0x1e45,5,5,5,5,5, -5,5,0x645,5,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,5,5,5,5,5,5,5,5,5,5,0x7885,5,5,5, +5,5,5,5,5,5,0x1e45,5,5,5,5,5,5,5,0x645,5, 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,0x5c5,5,5,5,5,0x5c5,5,5,5,5,5,5,5,5, -5,5,5,5,5,5,5,5,0x5c5,5,5,5,5,5,5,5, -5,5,5,5,5,5,5,5,5,0x7845,5,5,5,5,5,5, +5,5,5,5,5,5,5,5,0x7885,5,5,5,5,5,5,5, +5,5,5,5,5,5,5,5,5,5,5,5,5,5,0x5c5,5, +5,5,5,0x5c5,5,5,5,5,5,5,5,5,5,5,5,5, +5,5,5,5,0x5c5,5,5,5,5,5,5,5,5,5,5,5, +5,5,5,5,5,0x7845,5,5,5,5,5,5,5,5,5,5, 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,5,5,5,5,5,5,5,5,0x6c5,5,5,5,5,5, -0x1e45,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,5,5,5,5,5,5,5,5,5,5,0x6c5,5,5,5, +5,5,5,5,5,5,0x6c5,5,5,5,5,5,0x1e45,5,5,5, 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,5,5,5,5,0x545,5,5,5,5,5,5,5,5,5, -5,5,5,5,5,0,0,0,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, -0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,5,5,5,5,5,5,5,5, -5,5,5,5,5,5,5,5,5,5,5,5,5,4,5,5, -5,5,5,5,5,5,5,5,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0, -0,0,0,0,0,0,0,0,5,5,5,5,5,5,5,5, -5,5,5,5,5,5,5,5,4,0x17,0x17,0x17,5,5,5,5, -5,5,5,5,5,5,5,5,5,5,5,5,0x49,0x89,0xc9,0x109, -0x149,0x189,0x1c9,0x209,0x249,0x289,5,5,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,1,2,1,2, -1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2, -1,2,1,2,1,2,1,2,4,4,6,6,1,2,1,2, -1,2,1,2,1,2,1,2,1,2,5,6,7,7,7,0x17, -6,6,6,6,6,6,6,6,6,6,0x17,4,5,5,5,5, -5,5,0x58a,0x5ca,0x60a,0x64a,0x68a,0x6ca,0x70a,0x74a,0x78a,0x54a,6,6,0x17,0x17, -0x17,0x17,0x17,0x17,0,0,0,0,0,0,0,0,0x1a,0x1a,0x1a,0x1a, -0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a, -0x1a,0x1a,0x1a,4,4,4,4,4,4,4,4,4,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,5,4,4,2,5,5,5,5,5,0x1a,0x1a,1,2, -1,2,1,2,1,2,1,2,1,2,1,2,2,2,1,2, -1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2, -4,2,2,2,2,2,2,2,2,1,2,1,2,1,1,2, -1,2,1,2,1,2,1,2,4,0x1a,0x1a,1,2,1,2,5, -1,2,1,2,2,2,1,2,1,2,1,2,1,2,1,2, -1,2,1,1,1,1,1,0,1,1,1,1,1,2,1,2, -0,0,0,0,0,0,0,0,5,5,6,5,5,5,6,5, -5,5,5,6,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,5,5,5,5,5,5,5,5,5,8,8,6,6,8, -0x1b,0x1b,0x1b,0x1b,0,0,0,0,0x34cb,0x344b,0x3ccb,0x37cb,0x35cb,0x3fcb,0x1b,0x1b, -0x19,0x1b,0,0,0,0,0,0,5,5,5,5,5,5,5,5, -5,5,5,5,5,5,5,5,5,5,5,5,0x17,0x17,0x17,0x17, -0,0,0,0,0,0,0,0,8,8,8,8,6,6,0,0, -0,0,0,0,0,0,0x17,0x17,0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209, -0x249,0x289,0,0,0,0,0,0,8,8,5,5,5,5,5,5, -5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,5,5,5,5,5,5,8,8,8,8,8,8,8,8, -8,8,8,8,6,6,6,6,6,6,6,6,6,6,6,6, -6,6,6,6,6,6,5,5,5,5,5,5,0x17,0x17,0x17,5, -0x17,5,0,0,5,5,5,5,5,5,6,6,6,6,6,6, -6,6,0x17,0x17,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,5,5,5,5,5,6,6,6,6,6,6,6,6,6, -6,6,8,8,0,0,0,0,0,0,0,0,0,0,0,0x17, +5,5,5,5,5,5,5,5,0x6c5,5,5,5,5,5,5,5, 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,5,5,5,5,5,5,5,5,5,5,5,0,0,0, -8,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0,4, -0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209,0x249,0x289,0,0,0,0,0x17,0x17, +5,5,0x545,5,5,5,5,5,5,5,5,5,5,5,5,5, +5,0,0,0,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, +0x1b,0x1b,0x1b,0x1b,5,5,5,5,5,5,5,5,5,5,5,5, +5,5,5,5,5,5,5,5,5,4,5,5,5,5,5,5, +5,5,5,5,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0,0,0,0,0, +0,0,0,0,5,5,5,5,5,5,5,5,5,5,5,5, +5,5,5,5,4,0x17,0x17,0x17,5,5,5,5,5,5,5,5, +5,5,5,5,5,5,5,5,0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209, +0x249,0x289,5,5,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,1,2,1,2,1,2,1,2, +1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2, +1,2,1,2,4,4,6,6,1,2,1,2,1,2,1,2, +1,2,1,2,1,2,5,6,7,7,7,0x17,6,6,6,6, +6,6,6,6,6,6,0x17,4,5,5,5,5,5,5,0x58a,0x5ca, +0x60a,0x64a,0x68a,0x6ca,0x70a,0x74a,0x78a,0x54a,6,6,0x17,0x17,0x17,0x17,0x17,0x17, +0,0,0,0,0,0,0,0,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a, +0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,4, +4,4,4,4,4,4,4,4,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5, +4,4,2,5,5,5,5,5,0x1a,0x1a,1,2,1,2,1,2, +1,2,1,2,1,2,1,2,2,2,1,2,1,2,1,2, +1,2,1,2,1,2,1,2,1,2,1,2,4,2,2,2, +2,2,2,2,2,1,2,1,2,1,1,2,1,2,1,2, +1,2,1,2,4,0x1a,0x1a,1,2,1,2,5,1,2,1,2, +2,2,1,2,1,2,1,2,1,2,1,2,1,2,1,1, +1,1,1,0,1,1,1,1,1,2,1,2,0,0,0,0, +0,0,0,0,5,5,6,5,5,5,6,5,5,5,5,6, +5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, +5,5,5,5,5,5,5,8,8,6,6,8,0x1b,0x1b,0x1b,0x1b, +0,0,0,0,0x34cb,0x344b,0x3ccb,0x37cb,0x35cb,0x3fcb,0x1b,0x1b,0x19,0x1b,0,0, +0,0,0,0,5,5,5,5,5,5,5,5,5,5,5,5, +5,5,5,5,5,5,5,5,0x17,0x17,0x17,0x17,0,0,0,0, +0,0,0,0,8,8,8,8,6,6,0,0,0,0,0,0, +0,0,0x17,0x17,0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209,0x249,0x289,0,0, +0,0,0,0,8,8,5,5,5,5,5,5,5,5,5,5, 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,5,6,8,8,6,6,6,6,8,8,6,8,8,8, -5,5,5,5,5,6,4,5,5,5,5,5,5,5,5,5, -0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209,0x249,0x289,5,5,5,5,5,0, -5,5,5,5,5,5,5,5,5,6,6,6,6,6,6,8, -8,6,6,8,8,6,6,0,0,0,0,0,0,0,0,0, -5,5,5,6,5,5,5,5,5,5,5,5,6,8,0,0, -0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209,0x249,0x289,0,0,0x17,0x17,0x17,0x17, -5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -4,5,5,5,5,5,5,0x1b,0x1b,0x1b,5,8,6,8,5,5, -5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -6,5,6,6,6,5,5,6,6,5,5,5,5,5,6,6, -5,6,5,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,5,5,4,0x17,0x17, -5,5,5,5,5,5,5,5,5,5,5,8,6,6,8,8, -0x17,0x17,5,4,4,8,6,0,0,0,0,0,0,0,0,0, -0,5,5,5,5,5,5,0,0,5,5,5,5,5,5,0, -0,5,5,5,5,5,5,0,0,0,0,0,0,0,0,0, -5,5,5,5,5,5,5,0,5,5,5,5,5,5,5,0, -2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, -2,2,2,2,2,2,2,2,2,2,2,0x1a,4,4,4,4, -2,2,2,2,2,2,0,0,0,0,0,0,0,0,0,0, +5,5,5,5,8,8,8,8,8,8,8,8,8,8,8,8, +6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6, +6,6,5,5,5,5,5,5,0x17,0x17,0x17,5,0x17,5,0,0, +5,5,5,5,5,5,6,6,6,6,6,6,6,6,0x17,0x17, +5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, +5,5,5,6,6,6,6,6,6,6,6,6,6,6,8,8, +0,0,0,0,0,0,0,0,0,0,0,0x17,5,5,5,5, +5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, +5,5,5,5,5,5,5,5,5,0,0,0,8,0x17,0x17,0x17, +0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0,4,0x49,0x89,0xc9,0x109, +0x149,0x189,0x1c9,0x209,0x249,0x289,0,0,0,0,0x17,0x17,5,5,5,5, +5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,6, +8,8,6,6,6,6,8,8,6,8,8,8,5,5,5,5, +5,6,4,5,5,5,5,5,5,5,5,5,0x49,0x89,0xc9,0x109, +0x149,0x189,0x1c9,0x209,0x249,0x289,5,5,5,5,5,0,5,5,5,5, +5,5,5,5,5,6,6,6,6,6,6,8,8,6,6,8, +8,6,6,0,0,0,0,0,0,0,0,0,5,5,5,6, +5,5,5,5,5,5,5,5,6,8,0,0,0x49,0x89,0xc9,0x109, +0x149,0x189,0x1c9,0x209,0x249,0x289,0,0,0x17,0x17,0x17,0x17,5,5,5,5, +5,5,5,5,5,5,5,5,5,5,5,5,4,5,5,5, +5,5,5,0x1b,0x1b,0x1b,5,8,6,8,5,5,5,5,5,5, +5,5,5,5,5,5,5,5,5,5,5,5,6,5,6,6, +6,5,5,6,6,5,5,5,5,5,6,6,5,6,5,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,5,5,4,0x17,0x17,5,5,5,5, +5,5,5,5,5,5,5,8,6,6,8,8,0x17,0x17,5,4, +4,8,6,0,0,0,0,0,0,0,0,0,0,5,5,5, +5,5,5,0,0,5,5,5,5,5,5,0,0,5,5,5, +5,5,5,0,0,0,0,0,0,0,0,0,5,5,5,5, +5,5,5,0,5,5,5,5,5,5,5,0,2,2,2,2, 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, -5,5,5,8,8,6,8,8,6,8,8,0x17,8,6,0,0, -0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209,0x249,0x289,0,0,0,0,0,0, -5,5,5,5,0,0,0,0,0,0,0,0,0,0,0,0, -5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,5,0,0,0,0,5,5,5,5,5,5,5,5,5, -5,5,5,5,5,5,5,5,5,5,5,5,0x12,0x12,0x12,0x12, +2,2,2,2,2,2,2,0x1a,4,4,4,4,2,2,2,2, +2,2,0,0,0,0,0,0,0,0,0,0,2,2,2,2, +2,2,2,2,2,2,2,2,2,2,2,2,5,5,5,8, +8,6,8,8,6,8,8,0x17,8,6,0,0,0x49,0x89,0xc9,0x109, +0x149,0x189,0x1c9,0x209,0x249,0x289,0,0,0,0,0,0,5,5,5,5, +0,0,0,0,0,0,0,0,0,0,0,0,5,5,5,5, +5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,0, +0,0,0,5,5,5,5,5,5,5,5,5,5,5,5,5, +5,5,5,5,5,5,5,5,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12, 0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12, -0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x11,0x11,0x11,0x11, +0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11, 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11, -0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,5,5,5,5, -5,5,5,5,5,5,5,0x605,5,5,5,5,5,5,5,0x7c5, -5,5,5,5,0x5c5,5,5,5,5,5,5,5,5,5,5,5, -5,5,5,5,5,5,5,5,5,0x6c5,5,0x6c5,5,5,5,5, -5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,5,5,5,5,5,5,5,0x7c5,5,5,5,5,5,5, -5,5,5,5,5,5,5,5,5,5,0,0,5,5,5,5, -5,5,5,5,5,5,5,5,5,5,5,5,5,0x18,5,5, -5,5,5,5,5,5,5,5,5,5,5,0,5,5,5,5, -5,0,5,0,5,5,0,5,5,0,5,5,5,5,5,5, -5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,5,5,2,2,2,2,2,2,2,0,0,0,0,0, -0,0,0,0,0,0,0,2,2,2,2,2,0,0,0,0, -0,5,6,5,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,5,5,5,5,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a, -0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,5,5,5,5,5,5,5,5,5, -5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,5,5,5,5,0x15,0x14,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,5,5,5,5,5,5,5,5, -5,5,5,5,5,5,5,5,0,0,5,5,5,5,5,5, -5,5,5,5,5,5,5,5,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -5,5,5,5,5,5,5,5,5,5,5,5,0x19,0x1b,0,0, -6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6, -0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x14,0x15,0x17,0,0,0,0,0,0, -6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6, -0x17,0x13,0x13,0x16,0x16,0x14,0x15,0x14,0x15,0x14,0x15,0x14,0x15,0x14,0x15,0x14, -0x15,0x17,0x17,0x14,0x15,0x17,0x17,0x17,0x17,0x16,0x16,0x16,0x17,0x17,0x17,0, -0x17,0x17,0x17,0x17,0x13,0x14,0x15,0x14,0x15,0x14,0x15,0x17,0x17,0x17,0x18,0x13, -0x18,0x18,0x18,0,0x17,0x19,0x17,0x17,0,0,0,0,5,5,5,5, -5,0,5,5,5,5,5,5,5,5,5,5,5,5,5,5, +0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,5,5,5,5,5,5,5,5, +5,5,5,0x605,5,5,5,5,5,5,5,0x7c5,5,5,5,5, +0x5c5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, +5,5,5,5,5,0x6c5,5,0x6c5,5,5,5,5,5,5,5,5, +5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, +5,5,5,5,5,0x7c5,5,5,5,5,5,5,5,5,5,5, +5,5,5,5,5,5,0,0,5,5,5,5,5,5,5,5, +5,5,5,5,5,5,5,5,5,0x18,5,5,5,5,5,5, +5,5,5,5,5,5,5,0,5,5,5,5,5,0,5,0, +5,5,0,5,5,0,5,5,5,5,5,5,5,5,5,5, +5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, +2,2,2,2,2,2,2,0,0,0,0,0,0,0,0,0, +0,0,0,2,2,2,2,2,0,0,0,0,0,5,6,5, +5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, +5,5,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a, +0x1a,0x1a,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,5,5,5,5,5,5,5,5,5,5,5,5,5, 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -5,0,0,0x10,0,0,5,5,5,5,5,5,0,0,5,5, -5,5,5,5,0,0,5,5,5,5,5,5,0,0,5,5, -5,0,0,0,0x19,0x19,0x18,0x1a,0x1b,0x19,0x19,0,0x1b,0x18,0x18,0x18, -0x18,0x1b,0x1b,0,0,0,0,0,0,0,0,0,0,0x10,0x10,0x10, -0x1b,0x1b,0,0,0,0x17,0x17,0x17,0x19,0x17,0x17,0x17,0x14,0x15,0x17,0x18, -0x17,0x13,0x17,0x17,0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209,0x249,0x289,0x17,0x17, -0x18,0x18,0x18,0x17,0x1a,2,2,2,2,2,2,2,2,2,2,2, -2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,0x14, -0x18,0x15,0x18,0x14,0x15,0x17,0x14,0x15,0x17,0x17,5,5,5,5,5,5, -5,5,5,5,4,5,5,5,5,5,5,5,5,5,5,5, -5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,5,5,5,5,4,4,5,5,5,5,5,5,5,5, -5,5,5,5,0,5,5,5,5,5,5,5,5,5,5,5, -5,5,5,5,5,5,5,5,5,5,5,0,5,5,5,5, -5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,0, -5,5,0,5,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,0,0,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,0,0,0xb00b,0xb80b,0x784b,0x804b,0x884b,0x904b,0x984b,0xa04b,0xa84b,0xb04b,0xb84b,0x788b, -0x808b,0x888b,0x908b,0x988b,0xa08b,0xa88b,0xb08b,0xb88b,0,0,0,0x1b,0x1b,0x1b,0x1b,0x1b, -0x1b,0x1b,0x1b,0x1b,0x17,0x17,0x17,0,0,0,0,0x58b,0x5cb,0x60b,0x64b,0x68b, -0x6cb,0x70b,0x74b,0x78b,0x7cb,0xa4b,0xccb,0xf4b,0x11cb,0x144b,0x16cb,0x194b,0x1bcb,0x1e4b,0x800b,0x880b, -0x900b,0x980b,0xa00b,0xa80b,0x7ca,0x7ca,0x7ca,0x7ca,0x7ca,0xcca,0x11ca,0x11ca,0x11ca,0x11ca,0x1e4a,0x880a, -0x980a,0x980a,0x980a,0x980a,0x980a,0x784a,0x984a,0x68a,0x11ca,0x344b,0x344b,0x388b,0x3ccb,0x1b,0x1b,0x1b, -0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x54b,0x34cb,0x1b,0x1b,0x1b,0, -0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0,0,0,0, -0x34ca,0x344a,0x58a,0x68a,0x11ca,0x980a,0x984a,0x988a,0x68a,0x7ca,0x11ca,0x1e4a,0x980a,0x784a,0x984a,0x68a, -0x7ca,0x11ca,0x1e4a,0x980a,0x784a,0x788a,0x988a,0x7ca,0x58a,0x58a,0x58a,0x5ca,0x5ca,0x5ca,0x5ca,0x68a, -0x1b,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +5,5,0x15,0x14,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,5,5,5,5,5,5,5,5,5,5,5,5, +5,5,5,5,0,0,5,5,5,5,5,5,5,5,5,5, +5,5,5,5,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,5,5,5,5, +5,5,5,5,5,5,5,5,0x19,0x1b,0,0,6,6,6,6, +6,6,6,6,6,6,6,6,6,6,6,6,0x17,0x17,0x17,0x17, +0x17,0x17,0x17,0x14,0x15,0x17,0,0,0,0,0,0,6,6,6,6, +6,6,6,6,6,6,6,6,6,6,6,6,0x17,0x13,0x13,0x16, +0x16,0x14,0x15,0x14,0x15,0x14,0x15,0x14,0x15,0x14,0x15,0x14,0x15,0x17,0x17,0x14, +0x15,0x17,0x17,0x17,0x17,0x16,0x16,0x16,0x17,0x17,0x17,0,0x17,0x17,0x17,0x17, +0x13,0x14,0x15,0x14,0x15,0x14,0x15,0x17,0x17,0x17,0x18,0x13,0x18,0x18,0x18,0, +0x17,0x19,0x17,0x17,0,0,0,0,5,5,5,5,5,0,5,5, +5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, +5,5,5,5,5,5,5,5,5,5,5,5,5,0,0,0x10, +0,0,5,5,5,5,5,5,0,0,5,5,5,5,5,5, +0,0,5,5,5,5,5,5,0,0,5,5,5,0,0,0, +0x19,0x19,0x18,0x1a,0x1b,0x19,0x19,0,0x1b,0x18,0x18,0x18,0x18,0x1b,0x1b,0, +0,0,0,0,0,0,0,0,0,0x10,0x10,0x10,0x1b,0x1b,0,0, +0,0x17,0x17,0x17,0x19,0x17,0x17,0x17,0x14,0x15,0x17,0x18,0x17,0x13,0x17,0x17, +0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209,0x249,0x289,0x17,0x17,0x18,0x18,0x18,0x17, +0x1a,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, +2,2,2,2,2,2,2,2,2,2,2,0x14,0x18,0x15,0x18,0x14, +0x15,0x17,0x14,0x15,0x17,0x17,5,5,5,5,5,5,5,5,5,5, +4,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, +5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, +5,5,4,4,5,5,5,5,5,5,5,5,5,5,5,5, +0,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, +5,5,5,5,5,5,5,0,5,5,5,5,5,5,5,5, +5,5,5,5,5,5,5,5,5,5,5,0,5,5,0,5, +5,5,5,5,5,5,5,5,5,5,5,5,5,5,0,0, +5,5,5,5,5,5,5,5,5,5,5,5,5,5,0,0, +0xb00b,0xb80b,0x784b,0x804b,0x884b,0x904b,0x984b,0xa04b,0xa84b,0xb04b,0xb84b,0x788b,0x808b,0x888b,0x908b,0x988b, +0xa08b,0xa88b,0xb08b,0xb88b,0,0,0,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, +0x17,0x17,0x17,0,0,0,0,0x58b,0x5cb,0x60b,0x64b,0x68b,0x6cb,0x70b,0x74b,0x78b, +0x7cb,0xa4b,0xccb,0xf4b,0x11cb,0x144b,0x16cb,0x194b,0x1bcb,0x1e4b,0x800b,0x880b,0x900b,0x980b,0xa00b,0xa80b, +0x7ca,0x7ca,0x7ca,0x7ca,0x7ca,0xcca,0x11ca,0x11ca,0x11ca,0x11ca,0x1e4a,0x880a,0x980a,0x980a,0x980a,0x980a, +0x980a,0x784a,0x984a,0x68a,0x11ca,0x344b,0x344b,0x388b,0x3ccb,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, +0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x54b,0x34cb,0x1b,0x1b,0x1b,0,0x1b,0x1b,0x1b,0x1b, +0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0,0,0,0,0x34ca,0x344a,0x58a,0x68a, +0x11ca,0x980a,0x984a,0x988a,0x68a,0x7ca,0x11ca,0x1e4a,0x980a,0x784a,0x984a,0x68a,0x7ca,0x11ca,0x1e4a,0x980a, +0x784a,0x788a,0x988a,0x7ca,0x58a,0x58a,0x58a,0x5ca,0x5ca,0x5ca,0x5ca,0x68a,0x1b,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0x1b,0x1b,0x1b,0x1b, 0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, -0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,6,0,0, +0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,6,0,0,5,5,5,5, +5,5,5,5,5,5,5,5,5,5,5,5,5,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,6,0x58b,0x5cb,0x60b, +0x64b,0x68b,0x6cb,0x70b,0x74b,0x78b,0x7cb,0xa4b,0xccb,0xf4b,0x11cb,0x144b,0x16cb,0x194b,0x1bcb,0x1e4b, +0x800b,0x880b,0x900b,0x980b,0xa00b,0xa80b,0xb00b,0xb80b,0,0,0,0,0x58b,0x68b,0x7cb,0x11cb, +0,0,0,0,0,0,0,0,0,5,5,5,5,5,5,5, +5,5,5,5,5,5,5,5,5,5,5,5,5,0x1bca,5,5, +5,5,5,5,5,5,0xb80a,0,0,0,0,0,5,5,5,5, +5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, +5,5,6,6,6,6,6,0,0,0,0,0,5,5,5,5, +5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, +5,5,5,5,5,5,5,5,5,5,0,0x17,5,5,5,5, +0,0,0,0,5,5,5,5,5,5,5,5,0x17,0x58a,0x5ca,0x7ca, +0xa4a,0x1e4a,0,0,0,0,0,0,0,0,0,0,2,2,2,2, +2,2,2,2,2,2,2,2,2,2,2,2,5,5,5,5, +5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, +5,5,5,5,5,5,5,5,5,5,0,0,0x49,0x89,0xc9,0x109, +0x149,0x189,0x1c9,0x209,0x249,0x289,0,0,0,0,0,0,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,2,2,2,2, +2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, +2,2,2,2,2,2,2,2,0,0,0,0,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +0,0,0,0,2,2,2,2,2,2,2,2,5,5,5,5, +5,5,5,5,0,0,0,0,0,0,0,0,5,5,5,5, +5,5,5,5,5,5,5,5,5,5,5,5,0,0,0,0, +0,0,0,0,0,0,0,0x17,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,5,5,5,5,5,5,5,5, +5,5,5,5,5,5,5,5,5,5,5,5,5,5,0,5, +5,0,0,0,5,0,0,5,5,5,5,5,5,5,0,0, +5,0,5,5,5,5,5,5,5,5,5,5,5,5,5,5, +5,5,5,5,5,5,5,5,5,5,0,0x17,0x58b,0x5cb,0x60b,0x7cb, +0xa4b,0x1e4b,0x784b,0x788b,5,5,5,5,5,5,5,5,5,5,5,5, +5,5,5,5,5,5,5,5,5,5,5,0x1b,0x1b,0x58b,0x5cb,0x60b, +0x64b,0x68b,0x7cb,0xa4b,0,0,0,0,0,0,0,0x58b,0x5cb,0x60b,0x64b,0x64b, +0x68b,0x7cb,0xa4b,0x1e4b,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,5,5,5,5,5,5,5,5,5,5,5,5, +5,5,5,5,5,5,5,0,5,5,0,0,0,0,0,0x58b, +0x68b,0x7cb,0xa4b,0x1e4b,5,5,5,5,5,5,5,5,5,5,5,5, +5,5,5,5,5,5,5,5,5,5,0x58b,0x7cb,0xa4b,0x1e4b,0x5cb,0x60b, +0,0,0,0x17,5,5,5,5,5,5,5,5,5,5,5,5, +5,5,5,5,5,5,5,5,5,5,5,5,5,5,0,0, +0,0,0,0x17,0xa04b,0xa84b,0xb04b,0xb84b,0x788b,0x808b,0x888b,0x908b,0x988b,0xa08b,0xa88b,0xb08b, +0xb88b,0x78cb,0x80cb,0x88cb,0x90cb,0x98cb,0xa0cb,0xa8cb,0xb0cb,0xb8cb,0x36cb,0x354b,0x34cb,0x348b,0x46cb,0x344b, +0x4ecb,0x388b,0x3ccb,0x454b,5,5,5,5,5,5,5,5,5,5,5,5, +5,5,5,5,5,5,5,5,5,5,5,5,0,0,0,0, +0x5ecb,0x344b,5,5,0x58b,0x5cb,0x60b,0x64b,0x68b,0x6cb,0x70b,0x74b,0x78b,0x7cb,0xa4b,0xccb, +0xf4b,0x11cb,0x144b,0x16cb,0,0,0x1e4b,0x800b,0x880b,0x900b,0x980b,0xa00b,0xa80b,0xb00b,0xb80b,0x784b, +0x804b,0x884b,0x904b,0x984b,0x30b,0x34b,0x38b,0x3cb,0x7cb,0xa4b,0x1e4b,0x784b,0,0,0,0, +0,0,0,0,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0,0,0, +0,0,0,0,5,6,6,6,0,6,6,0,0,0,0,0, +6,6,6,6,5,5,5,5,0,5,5,5,0,5,5,5, 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -6,0x58b,0x5cb,0x60b,0x64b,0x68b,0x6cb,0x70b,0x74b,0x78b,0x7cb,0xa4b,0xccb,0xf4b,0x11cb,0x144b, -0x16cb,0x194b,0x1bcb,0x1e4b,0x800b,0x880b,0x900b,0x980b,0xa00b,0xa80b,0xb00b,0xb80b,0,0,0,0, -0x58b,0x68b,0x7cb,0x11cb,0,0,0,0,0,0,0,0,0,0,0,0, +5,5,5,5,0,0,0,0,6,6,6,0,0,0,0,6, 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -5,0x1bca,5,5,5,5,5,5,5,5,0xb80a,0,0,0,0,0, +5,5,5,5,5,5,5,5,5,5,5,5,5,0x58b,0x11cb,0x17, 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,5,5,5,5,6,6,6,6,6,0,0,0,0,0, +5,5,5,5,5,5,5,5,5,5,5,5,5,0x58b,0x7cb,0xa4b, +5,5,5,5,5,6,6,0,0,0,0,0x58b,0x68b,0x7cb,0xa4b,0x1e4b, +0x17,0x17,0x17,0x17,0x17,0x17,0x17,0,0,0,0,0,0,0,0,0, +5,5,5,5,5,5,5,5,0x1b,5,5,5,5,5,5,5, 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,5,5,5,5,5,5,5,5,5,5,5,5,0,0x17, -5,5,5,5,0,0,0,0,5,5,5,5,5,5,5,5, -0x17,0x58a,0x5ca,0x7ca,0xa4a,0x1e4a,0,0,0,0,0,0,0,0,0,0, -2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, +5,5,0,0,0,0x17,0x17,0x17,0x17,0x17,0x17,0x17,5,5,5,5, 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, +5,5,0,0,0x58b,0x5cb,0x60b,0x64b,0x7cb,0xa4b,0x1e4b,0x784b,5,5,5,5, +5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,0, +0,0,0,0,0x58b,0x5cb,0x60b,0x64b,0x7cb,0xa4b,0x1e4b,0x784b,5,5,5,5, 5,5,5,5,5,5,5,5,5,5,5,5,5,5,0,0, -0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209,0x249,0x289,0,0,0,0,0,0, -1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, -2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, -2,2,2,2,2,2,2,2,2,2,2,2,0,0,0,0, -1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, -1,1,1,1,0,0,0,0,2,2,2,2,2,2,2,2, -5,5,5,5,5,5,5,5,0,0,0,0,0,0,0,0, -5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -0,0,0,0,0,0,0,0,0,0,0,0x17,0,0,0,0, +0,0,0,0,0,0x17,0x17,0x17,0x17,0,0,0,0,0,0,0, +0,0,0,0,0,0x58b,0x5cb,0x60b,0x64b,0x7cb,0xa4b,0x1e4b,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,5,5,5,5, +5,5,5,5,5,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0, +0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,2, +2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,0, +0,0,0,0,0,0,0x58b,0x68b,0x7cb,0x11cb,0x1e4b,0x784b,0x30b,0x34b,0x38b,0x3cb, +0x40b,0x44b,0x48b,0x4cb,0x50b,0x7cb,0xa4b,0xccb,0xf4b,0x11cb,0x144b,0x16cb,0x194b,0x1bcb,0x1e4b,0x800b, +0x880b,0x900b,0x980b,0xa00b,0xa80b,0xb00b,0xb80b,0x344b,0x34cb,0x348b,0x388b,0,0x144b,0x16cb,0x194b,0x1bcb, +0x1e4b,0x784b,0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209,0x249,0x289,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,6,8,6,8,5, +5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, +5,5,5,5,5,5,5,5,5,5,5,5,6,6,6,6, +6,6,6,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0,0,0,0,0x30b,0x34b, +0x38b,0x3cb,0x40b,0x44b,0x48b,0x4cb,0x50b,0x7cb,0xa4b,0xccb,0xf4b,0x11cb,5,5,5,5, +5,5,5,5,5,5,5,5,5,5,5,5,8,8,8,6, +6,6,6,8,8,6,6,0x17,0x17,0x10,0x17,0x17,0x17,0x17,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,5,5,5,5, +5,5,5,5,5,5,5,5,5,5,5,5,5,0,0,0, +0,0,0,0,0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209,0x249,0x289,0,0, +0,0,0,0,5,5,5,5,5,5,5,6,6,6,6,6, +8,6,6,6,6,6,6,6,6,0,0x49,0x89,0xc9,0x109,0x149,0x189, +0x1c9,0x209,0x249,0x289,0x17,0x17,0x17,0x17,0,0,0,0,0,0,0,0, +0,0,0,0,5,5,5,5,5,5,5,5,5,5,5,5, +5,5,5,5,6,6,6,5,5,5,5,5,5,5,5,5, +5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, +5,5,5,5,5,5,5,6,0x17,0x17,5,0,0,0,0,0, +0,0,0,0,8,5,5,5,5,0x17,0x17,0x17,0x17,0x17,6,6, +6,0x17,0,0,0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209,0x249,0x289,5,0x17, +5,0x17,0x17,0x17,5,5,5,5,5,5,5,5,5,5,5,5, +5,5,5,5,5,5,5,8,8,8,6,6,6,6,6,6, +6,6,6,8,0,0x58b,0x5cb,0x60b,0x64b,0x68b,0x6cb,0x70b,0x74b,0x78b,0x7cb,0xa4b, +0xccb,0xf4b,0x11cb,0x144b,0x16cb,0x194b,0x1bcb,0x1e4b,0x784b,0,0,0,0,0,0,0, +0,0,0,0,5,5,5,5,5,5,5,5,5,5,5,5, +8,8,8,6,6,6,8,8,6,8,6,6,0x17,0x17,0x17,0x17, +0x17,0x17,6,0,5,5,5,5,5,5,5,5,5,5,5,5, +5,5,5,5,5,5,0,5,5,5,5,5,5,5,5,5, +5,5,5,5,5,5,5,0,5,0,5,5,5,5,0,5, +5,5,5,5,5,5,5,5,5,5,5,5,5,5,0,5, +5,5,5,5,5,5,5,5,5,0x17,0,0,0,0,0,0, +5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, +8,8,8,6,6,6,6,6,6,6,6,0,0,0,0,0, +0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209,0x249,0x289,0,0,0,0,0,0, +5,5,8,8,0,0,6,6,6,6,6,6,6,0,0,0, +6,6,6,6,6,0,0,0,0,0,0,0,0,0,0,0, +6,6,8,8,0,5,5,5,5,5,5,5,5,0,0,5, +5,0,0,5,5,5,5,5,5,5,5,5,5,5,5,5, +6,8,8,8,8,0,0,8,8,0,0,8,8,8,0,0, +5,0,0,0,0,0,0,8,0,0,0,0,0,5,5,5, 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,0,5,5,0,0,0,5,0,0,5,5,5,5,5, -5,5,0,0,5,0,5,5,5,5,5,5,5,5,5,5, -5,5,5,5,5,5,5,5,5,5,5,5,5,5,0,0x17, -0x58b,0x5cb,0x60b,0x7cb,0xa4b,0x1e4b,0x784b,0x788b,5,5,5,5,5,5,5,5, -5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,0x1b, -0x1b,0x58b,0x5cb,0x60b,0x64b,0x68b,0x7cb,0xa4b,0,0,0,0,0,0,0,0x58b, -0x5cb,0x60b,0x64b,0x64b,0x68b,0x7cb,0xa4b,0x1e4b,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,5,5,5,5,5,5,5,5, -5,5,5,5,5,5,5,5,5,5,5,0,5,5,0,0, -0,0,0,0x58b,0x68b,0x7cb,0xa4b,0x1e4b,5,5,5,5,5,5,5,5, -5,5,5,5,5,5,5,5,5,5,5,5,5,5,0x58b,0x7cb, -0xa4b,0x1e4b,0x5cb,0x60b,0,0,0,0x17,5,5,5,5,5,5,5,5, -5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,0,0,0,0,0,0x17,0xa04b,0xa84b,0xb04b,0xb84b,0x788b,0x808b,0x888b,0x908b, -0x988b,0xa08b,0xa88b,0xb08b,0xb88b,0x78cb,0x80cb,0x88cb,0x90cb,0x98cb,0xa0cb,0xa8cb,0xb0cb,0xb8cb,0x36cb,0x354b, -0x34cb,0x348b,0x46cb,0x344b,0x4ecb,0x388b,0x3ccb,0x454b,5,5,5,5,5,5,5,5, -5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -0,0,0,0,0x5ecb,0x344b,5,5,0x58b,0x5cb,0x60b,0x64b,0x68b,0x6cb,0x70b,0x74b, -0x78b,0x7cb,0xa4b,0xccb,0xf4b,0x11cb,0x144b,0x16cb,0,0,0x1e4b,0x800b,0x880b,0x900b,0x980b,0xa00b, -0xa80b,0xb00b,0xb80b,0x784b,0x804b,0x884b,0x904b,0x984b,0x30b,0x34b,0x38b,0x3cb,0x7cb,0xa4b,0x1e4b,0x784b, -0,0,0,0,0,0,0,0,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17, -0x17,0,0,0,0,0,0,0,5,6,6,6,0,6,6,0, -0,0,0,0,6,6,6,6,5,5,5,5,0,5,5,5, -0,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,5,5,5,5,5,5,0,0,0,0,6,6,6,0, -0,0,0,6,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -5,0x58b,0x11cb,0x17,5,5,5,5,5,5,5,5,5,5,5,5, +5,5,5,5,5,8,8,8,6,6,6,6,6,6,6,6, +8,8,6,6,6,8,6,5,5,5,5,0x17,0x17,0x17,0x17,0x17, +0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209,0x249,0x289,0,0x17,0,0x17,0,0, 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -5,0x58b,0x7cb,0xa4b,5,5,5,5,5,6,6,0,0,0,0,0x58b, -0x68b,0x7cb,0xa4b,0x1e4b,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0,0,0,0,0, -0,0,0,0,5,5,5,5,5,5,5,5,0x1b,5,5,5, +8,8,8,6,6,6,6,6,6,8,6,8,8,8,8,6, +6,8,6,6,5,5,0x17,5,0,0,0,0,0,0,0,0, +0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209,0x249,0x289,0,0,0,0,0,0, +5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,8, +8,8,6,6,6,6,0,0,8,8,8,8,6,6,8,6, +6,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17, +0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,5,5,5,5,6,6,0,0, 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,5,5,5,5,0,0,0,0x17,0x17,0x17,0x17,0x17,0x17,0x17, +8,8,8,6,6,6,6,6,6,6,6,8,8,6,8,6, +6,0x17,0x17,0x17,5,0,0,0,0,0,0,0,0,0,0,0, +0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209,0x249,0x289,0,0,0,0,0,0, +0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209,0x249,0x289,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +5,5,5,5,5,5,5,5,5,5,5,6,8,6,8,8, +6,6,6,6,6,6,8,6,0,0,0,0,0,0,0,0, +8,8,6,6,6,6,8,6,6,6,6,6,0,0,0,0, +0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209,0x249,0x289,0x7cb,0xa4b,0x17,0x17,0x17,0x1b, 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,5,5,5,5,0,0,0x58b,0x5cb,0x60b,0x64b,0x7cb,0xa4b,0x1e4b,0x784b, +5,5,5,5,5,5,5,5,5,5,0,0,0,6,6,6, +0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209,0x249,0x289,0x7cb,0xa4b,0xccb,0xf4b,0x11cb,0x144b, +0x16cb,0x194b,0x1bcb,0,0,0,0,0,0,0,0,0,0,0,0,5, 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,5,0,0,0,0,0,0x58b,0x5cb,0x60b,0x64b,0x7cb,0xa4b,0x1e4b,0x784b, +5,5,5,6,6,6,6,6,6,8,5,6,6,6,6,0x17, +0x17,0x17,0x17,0x17,0x17,0x17,0x17,6,0,0,0,0,0,0,0,0, +5,6,6,6,6,6,6,8,8,6,6,6,5,5,5,5, +5,6,6,6,6,6,6,8,8,6,6,5,5,5,5,5, 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,0,0,0,0,0,0,0,0x17,0x17,0x17,0x17,0,0,0, -0,0,0,0,0,0,0,0,0,0x58b,0x5cb,0x60b,0x64b,0x7cb,0xa4b,0x1e4b, +0x17,0x17,0x17,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +5,5,5,5,0,0,5,5,5,5,6,6,6,6,6,6, +6,6,6,6,6,6,6,8,6,6,0x17,0x17,0x17,0,0x17,0x17, +5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, 5,5,5,5,5,5,5,5,5,0,0,0,0,0,0,0, +5,0x17,0x17,0x17,0x17,0x17,0,0,0,0,0,0,0,0,0,0, +0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209,0x249,0x289,0x58b,0x5cb,0x60b,0x64b,0x68b,0x6cb, +0x70b,0x74b,0x78b,0x7cb,0xa4b,0xccb,0xf4b,0x11cb,0x144b,0x16cb,0x194b,0x1bcb,0x1e4b,0,0,0, +0x17,0x17,5,5,5,5,5,5,5,5,5,5,5,5,5,5, +5,0,5,5,5,5,5,5,5,5,5,5,5,5,5,5, +5,5,5,5,5,5,5,5,5,5,5,8,6,6,6,6, +6,6,6,0,6,6,6,6,6,6,8,6,6,6,6,6, +6,6,6,6,0,8,6,6,6,6,6,6,6,8,6,6, +8,6,6,0,0,0,0,0,0,0,0,0,5,5,5,5, +5,5,5,5,5,5,5,5,5,5,5,5,0,0,6,6, +6,6,6,6,6,6,6,6,6,6,6,6,6,6,5,6, +0,0,0,0,0,0,0,0,0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209, +0x249,0x289,0,0,0,0,0,0,5,5,5,5,5,5,5,0, +5,5,0,5,5,5,5,5,5,5,5,5,5,5,5,5, +5,5,5,5,5,5,5,5,5,6,6,6,6,6,6,0, +0,0,6,0,6,6,0,6,0x34ca,0x354a,0x34ca,0x34ca,0x344a,0x348a,0x388a,0xf4a, +0x11ca,0x64a,0x68a,0x6ca,0x70a,0x74a,0x78a,0,0x17,0x17,0x17,0x17,0x17,0,0,0, +0,0,0,0,0,0,0,0,0x5ca,0x60a,0x64a,0x68a,0x6ca,0x70a,0x74a,0x78a, +0x60a,0x64a,0x68a,0x6ca,0x70a,0x74a,0x78a,0x64a,0x68a,0x6ca,0x70a,0x74a,0x78a,0x58a,0x5ca,0x60a, +0x64a,0x68a,0x6ca,0x70a,0x74a,0x78a,0x58a,0x5ca,0x60a,0x64a,0x68a,0x5ca,0x60a,0x60a,0x64a,0x68a, +0x6ca,0x70a,0x74a,0x78a,0x58a,0x5ca,0x60a,0x60a,0x64a,0x68a,0xc08a,0xc18a,0x58a,0x5ca,0x60a,0x60a, +0x64a,0x68a,0x60a,0x60a,0x64a,0x64a,0x64a,0x64a,0x6ca,0x70a,0x70a,0x70a,0x74a,0x74a,0x78a,0x78a, +0x78a,0x78a,0x5ca,0x60a,0x64a,0x68a,0x6ca,0x58a,0x5ca,0x60a,0x64a,0x64a,0x68a,0x68a,0x5ca,0x60a, +0x58a,0x5ca,0x348a,0x388a,0x454a,0x348a,0x388a,0x35ca,5,5,5,5,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, -1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0, -2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, -2,2,2,0,0,0,0,0,0,0,0x58b,0x68b,0x7cb,0x11cb,0x1e4b,0x784b, -0x30b,0x34b,0x38b,0x3cb,0x40b,0x44b,0x48b,0x4cb,0x50b,0x7cb,0xa4b,0xccb,0xf4b,0x11cb,0x144b,0x16cb, -0x194b,0x1bcb,0x1e4b,0x800b,0x880b,0x900b,0x980b,0xa00b,0xa80b,0xb00b,0xb80b,0x344b,0x34cb,0x348b,0x388b,0, -0x144b,0x16cb,0x194b,0x1bcb,0x1e4b,0x784b,0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209,0x249,0x289, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6, -8,6,8,5,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -6,6,6,6,6,6,6,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0,0, -0,0,0x30b,0x34b,0x38b,0x3cb,0x40b,0x44b,0x48b,0x4cb,0x50b,0x7cb,0xa4b,0xccb,0xf4b,0x11cb, -5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -8,8,8,6,6,6,6,8,8,6,6,0x17,0x17,0x10,0x17,0x17, -0x17,0x17,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -5,0,0,0,0,0,0,0,0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209, -0x249,0x289,0,0,0,0,0,0,5,5,5,5,5,5,5,6, -6,6,6,6,8,6,6,6,6,6,6,6,6,0,0x49,0x89, -0xc9,0x109,0x149,0x189,0x1c9,0x209,0x249,0x289,0x17,0x17,0x17,0x17,0,0,0,0, 0,0,0,0,0,0,0,0,5,5,5,5,5,5,5,5, -5,5,5,5,5,5,5,5,6,6,6,5,5,5,5,5, -5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,5,5,5,5,5,5,5,5,5,6,0x17,0x17,5,0, -0,0,0,0,0,0,0,0,8,5,5,5,5,0x17,0x17,0x17, -0x17,0x17,6,6,6,0x17,0,0,0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209, -0x249,0x289,5,0x17,5,0x17,0x17,0x17,5,5,5,5,5,5,5,5, -5,5,5,5,5,5,5,5,5,5,5,8,8,8,6,6, -6,6,6,6,6,6,6,8,0,0x58b,0x5cb,0x60b,0x64b,0x68b,0x6cb,0x70b, -0x74b,0x78b,0x7cb,0xa4b,0xccb,0xf4b,0x11cb,0x144b,0x16cb,0x194b,0x1bcb,0x1e4b,0x784b,0,0,0, -0,0,0,0,0,0,0,0,5,5,5,5,5,5,5,5, -5,5,5,5,8,8,8,6,6,6,8,8,6,8,6,6, -0x17,0x17,0x17,0x17,0x17,0x17,6,0,5,5,5,5,5,5,5,5, -5,5,5,5,5,5,5,5,5,5,0,5,5,5,5,5, -5,5,5,5,5,5,5,5,5,5,5,0,5,0,5,5, -5,5,0,5,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,0,5,5,5,5,5,5,5,5,5,5,0x17,0,0, -0,0,0,0,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,5,5,8,8,8,6,6,6,6,6,6,6,6,0, -0,0,0,0,0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209,0x249,0x289,0,0, -0,0,0,0,5,5,8,8,0,0,6,6,6,6,6,6, -6,0,0,0,6,6,6,6,6,0,0,0,0,0,0,0, -0,0,0,0,6,6,8,8,0,5,5,5,5,5,5,5, -5,0,0,5,5,0,0,5,5,5,5,5,5,5,5,5, -5,5,5,5,6,8,8,8,8,0,0,8,8,0,0,8, -8,8,0,0,5,0,0,0,0,0,0,8,0,0,0,0, -0,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,5,5,5,5,5,5,5,8,8,8,6,6,6,6, -6,6,6,6,8,8,6,6,6,8,6,5,5,5,5,0x17, -0x17,0x17,0x17,0x17,0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209,0x249,0x289,0,0x17, -0,0x17,0,0,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,5,5,8,8,8,6,6,6,6,6,6,8,6,8, -8,8,8,6,6,8,6,6,5,5,0x17,5,0,0,0,0, -0,0,0,0,0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209,0x249,0x289,0,0, -0,0,0,0,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,5,8,8,8,6,6,6,6,0,0,8,8,8,8, -6,6,8,6,6,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17, -0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,5,5,5,5, -6,6,0,0,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,5,5,8,8,8,6,6,6,6,6,6,6,6,8, -8,6,8,6,6,0x17,0x17,0x17,5,0,0,0,0,0,0,0, -0,0,0,0,0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209,0x249,0x289,0,0, -0,0,0,0,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17, -0x17,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209,0x249,0x289,0,0, +5,5,5,5,5,5,5,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,5,5,5,5,5,5,5,5,5,5,5,6, -8,6,8,8,6,6,6,6,6,6,8,6,0,0,0,0, -0,0,0,0,8,8,6,6,6,6,8,6,6,6,6,6, -0,0,0,0,0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209,0x249,0x289,0x7cb,0xa4b, -0x17,0x17,0x17,0x1b,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,5,5,5,5,5,5,5,5,5,5,5,5,0,0, -0,6,6,6,0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209,0x249,0x289,0x7cb,0xa4b, -0xccb,0xf4b,0x11cb,0x144b,0x16cb,0x194b,0x1bcb,0,0,0,0,0,0,0,0,0, -0,0,0,5,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,5,5,5,5,5,5,5,5,5,5,5,0,0,0, -0,0,0,0,5,0x17,0x17,0x17,0x17,0x17,0,0,0,0,0,0, -0,0,0,0,0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209,0x249,0x289,0x58b,0x5cb, -0x60b,0x64b,0x68b,0x6cb,0x70b,0x74b,0x78b,0x7cb,0xa4b,0xccb,0xf4b,0x11cb,0x144b,0x16cb,0x194b,0x1bcb, -0x1e4b,0,0,0,0x17,0x17,5,5,5,5,5,5,5,5,5,5, -5,5,5,5,5,0,5,5,5,5,5,5,5,5,5,5, -5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,8, -6,6,6,6,6,6,6,0,6,6,6,6,6,6,8,6, -6,6,6,6,6,6,6,6,0,8,6,6,6,6,6,6, -6,8,6,6,8,6,6,0,0,0,0,0,0,0,0,0, -5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -0,0,6,6,6,6,6,6,6,6,6,6,6,6,6,6, -0x34ca,0x354a,0x34ca,0x34ca,0x344a,0x348a,0x388a,0xf4a,0x11ca,0x64a,0x68a,0x6ca,0x70a,0x74a,0x78a,0, -0x17,0x17,0x17,0x17,0x17,0,0,0,0,0,0,0,0,0,0,0, -0x5ca,0x60a,0x64a,0x68a,0x6ca,0x70a,0x74a,0x78a,0x60a,0x64a,0x68a,0x6ca,0x70a,0x74a,0x78a,0x64a, -0x68a,0x6ca,0x70a,0x74a,0x78a,0x58a,0x5ca,0x60a,0x64a,0x68a,0x6ca,0x70a,0x74a,0x78a,0x58a,0x5ca, -0x60a,0x64a,0x68a,0x5ca,0x60a,0x60a,0x64a,0x68a,0x6ca,0x70a,0x74a,0x78a,0x58a,0x5ca,0x60a,0x60a, -0x64a,0x68a,0xc08a,0xc18a,0x58a,0x5ca,0x60a,0x60a,0x64a,0x68a,0x60a,0x60a,0x64a,0x64a,0x64a,0x64a, -0x6ca,0x70a,0x70a,0x70a,0x74a,0x74a,0x78a,0x78a,0x78a,0x78a,0x5ca,0x60a,0x64a,0x68a,0x6ca,0x58a, -0x5ca,0x60a,0x64a,0x64a,0x68a,0x68a,0x5ca,0x60a,0x58a,0x5ca,0x348a,0x388a,0x454a,0x348a,0x388a,0x35ca, -5,5,5,5,0,0,0,0,0,0,0,0,0,0,0,0, +0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209,0x249,0x289,0,0,0,0,0x17,0x17, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,0, +5,5,5,5,5,5,5,5,5,5,5,5,5,5,0,0, +6,6,6,6,6,0x17,0,0,0,0,0,0,0,0,0,0, +5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209, -0x249,0x289,0,0,0,0,0x17,0x17,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,5,5,5,5,5,5,5,5, -5,5,5,5,5,5,0,0,6,6,6,6,6,0x17,0,0, -0,0,0,0,0,0,0,0,5,5,5,5,5,5,5,5, -5,5,5,5,5,5,5,5,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,5,5,5,5,5,5,5,5, -5,5,5,5,5,5,5,5,6,6,6,6,6,6,6,0x17, -0x17,0x17,0x17,0x17,0x1b,0x1b,0x1b,0x1b,4,4,4,4,0x17,0x1b,0,0, -0,0,0,0,0,0,0,0,0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209, -0x249,0x289,0,0x7cb,0x1e4b,0x788b,0x790b,0x798b,0x7a0b,0x7a8b,0,5,5,5,5,5, 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -0,0,0,0,0,5,5,5,5,5,5,5,5,0,0,0, -0,0,0,0,0,0,0,0,5,8,8,8,8,8,8,8, +6,6,6,6,6,6,6,0x17,0x17,0x17,0x17,0x17,0x1b,0x1b,0x1b,0x1b, +4,4,4,4,0x17,0x1b,0,0,0,0,0,0,0,0,0,0, +0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209,0x249,0x289,0,0x7cb,0x1e4b,0x788b,0x790b,0x798b, +0x7a0b,0x7a8b,0,5,5,5,5,5,5,5,5,5,5,5,5,5, +5,5,5,5,5,5,5,5,0,0,0,0,0,5,5,5, +5,5,5,5,5,0,0,0,0,0,0,0,0,0,0,0, +5,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8, 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8, -8,8,8,8,8,8,8,8,8,8,8,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,6,6,6,6,4, -4,4,4,4,4,4,4,4,4,4,4,4,4,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,5,5,5,5, -5,5,5,5,5,5,5,5,5,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,5,5,5,5, -5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,0, -0,0,0,0,0,0,0,0,0,0,0,0,5,5,0,0, +8,8,8,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,6,6,6,6,4,4,4,4,4,4,4,4,4, +4,4,4,4,4,4,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,5,5,5,5, -5,5,5,5,5,5,5,0,0,0,0,0,5,5,5,5, -5,5,5,5,5,5,5,5,5,0,0,0,0,0,0,0, -5,5,5,5,5,5,5,5,5,5,0,0,0x1b,6,6,0x17, -0x10,0x10,0x10,0x10,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,5,5,5,5,5,5,5,5,5,5,5,5, +5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,5,5,5,5,5,5,5,5,5,5,5,5, +5,5,5,5,5,5,5,0,0,0,0,0,0,0,0,0, +0,0,0,0,5,5,5,5,5,5,5,5,5,5,5,0, +0,0,0,0,5,5,5,5,5,5,5,5,5,5,5,5, +5,0,0,0,0,0,0,0,5,5,5,5,5,5,5,5, +5,5,0,0,0x1b,6,6,0x17,0x10,0x10,0x10,0x10,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0,0,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, +0,0,0,0,0,0,0,0,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0, +0,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, +0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,8,8,6,6,6,0x1b,0x1b, +0x1b,8,8,8,8,8,8,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,6, +6,6,6,6,6,6,6,0x1b,0x1b,6,6,6,6,6,6,6, 0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, -0x1b,8,8,6,6,6,0x1b,0x1b,0x1b,8,8,8,8,8,8,0x10, -0x10,0x10,0x10,0x10,0x10,0x10,0x10,6,6,6,6,6,6,6,6,0x1b, -0x1b,6,6,6,6,6,6,6,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, -0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,6,6, -6,6,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, -0x1b,0x1b,0x1b,0x1b,0x1b,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0x1b,0x1b,6,6, -6,0x1b,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0x58b,0x5cb,0x60b,0x64b, -0x68b,0x6cb,0x70b,0x74b,0x78b,0x7cb,0xa4b,0xccb,0xf4b,0x11cb,0x144b,0x16cb,0x194b,0x1bcb,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0x249,0x289,0x49,0x89, -0xc9,0x109,0x149,0x189,0x1c9,0x209,0x249,0x289,0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209, -0x249,0x289,0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209,0x249,0x289,1,1,1,1, -1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, -1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,2, -2,2,2,2,2,2,2,2,2,2,2,2,1,1,1,1, -1,1,1,1,1,1,1,1,1,1,2,2,2,2,2,2, -2,0,2,2,2,2,2,2,2,2,2,2,1,1,1,1, -1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, -1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,2, +0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,6,6,6,6,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, +0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0x1b,0x1b,6,6,6,0x1b,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0x58b,0x5cb,0x60b,0x64b,0x68b,0x6cb,0x70b,0x74b,0x78b,0x7cb,0xa4b,0xccb, +0xf4b,0x11cb,0x144b,0x16cb,0x194b,0x1bcb,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0x249,0x289,0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209,0x249,0x289, +0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209,0x249,0x289,0x49,0x89,0xc9,0x109,0x149,0x189, +0x1c9,0x209,0x249,0x289,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,2, 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, -1,0,1,1,0,0,1,0,0,1,1,0,0,1,1,1, -1,0,1,1,1,1,1,1,1,1,2,2,2,2,0,2, -0,2,2,2,2,2,2,2,0,2,2,2,2,2,2,2, 2,2,2,2,1,1,1,1,1,1,1,1,1,1,1,1, -1,1,1,1,2,2,2,2,1,1,0,1,1,1,1,0, -0,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1, -1,0,2,2,2,2,2,2,2,2,2,2,2,2,2,2, -2,2,2,2,2,2,2,2,2,2,2,2,1,1,0,1, -1,1,1,0,1,1,1,1,1,0,1,0,0,0,1,1, -1,1,1,1,1,0,2,2,2,2,2,2,2,2,2,2, +1,1,2,2,2,2,2,2,2,0,2,2,2,2,2,2, 2,2,2,2,1,1,1,1,1,1,1,1,1,1,1,1, -1,1,1,1,1,1,1,1,1,1,2,2,2,2,2,2, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,2, 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, -2,2,2,2,1,1,1,1,1,1,1,1,1,1,1,1, -1,1,1,1,2,2,2,2,2,2,0,0,1,1,1,1, +2,2,2,2,2,2,2,2,1,0,1,1,0,0,1,0, +0,1,1,0,0,1,1,1,1,0,1,1,1,1,1,1, +1,1,2,2,2,2,0,2,0,2,2,2,2,2,2,2, +0,2,2,2,2,2,2,2,2,2,2,2,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,2,2,2,2, +1,1,0,1,1,1,1,0,0,1,1,1,1,1,1,1, +1,0,1,1,1,1,1,1,1,0,2,2,2,2,2,2, +2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, +2,2,2,2,1,1,0,1,1,1,1,0,1,1,1,1, +1,0,1,0,0,0,1,1,1,1,1,1,1,0,2,2, +2,2,2,2,2,2,2,2,2,2,2,2,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, -1,1,1,1,1,0x18,2,2,2,2,2,2,2,2,2,2, -2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,0x18, -2,2,2,2,2,2,1,1,1,1,1,1,1,1,1,1, -1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0x18, +1,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2, +2,2,2,2,2,2,2,2,2,2,2,2,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,2,2,2,2, +2,2,0,0,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,1,0x18,2,2, 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, -2,2,2,2,2,0x18,2,2,2,2,2,2,1,1,1,1, -1,1,1,1,1,1,1,1,1,1,1,1,2,2,2,0x18, -2,2,2,2,2,2,1,2,0,0,0x49,0x89,0xc9,0x109,0x149,0x189, -0x1c9,0x209,0x249,0x289,0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209,0,6,6,6, -6,6,6,6,6,6,6,6,6,6,6,6,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,6,6,6,6, +2,2,2,2,2,2,2,0x18,2,2,2,2,2,2,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,0x18,2,2,2,2,2,2,2,2, +2,2,2,2,2,2,2,2,2,2,2,2,2,0x18,2,2, +2,2,2,2,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,2,2,2,0x18,2,2,2,2,2,2,1,2, +0,0,0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209,0x249,0x289,0x49,0x89,0xc9,0x109, +0x149,0x189,0x1c9,0x209,0,6,6,6,6,6,6,6,6,6,6,6, +6,6,6,6,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,6,6,6,6,6,6,6,6,6,6,6,6, +6,6,6,6,6,6,6,6,6,6,6,0x1b,0x1b,0x1b,0x1b,6, +6,6,6,6,6,6,6,6,6,6,6,6,6,0x1b,0x1b,0x1b, +0x1b,0x1b,0x1b,0x1b,0x1b,6,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, +6,0x1b,0x1b,0x17,0x17,0x17,0x17,0x17,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,6,6,6,6,6,6,6,6,0, 6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6, -6,6,6,0x1b,0x1b,0x1b,0x1b,6,6,6,6,6,6,6,6,6, -6,6,6,6,6,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,6,0x1b,0x1b, -0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,6,0x1b,0x1b,0x17,0x17,0x17,0x17,0x17, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6, -6,6,6,6,6,6,6,0,6,6,6,6,6,6,6,6, -6,6,6,6,6,6,6,6,6,0,0,6,6,6,6,6, -6,6,0,6,6,0,6,6,6,6,6,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -5,5,5,5,5,0,0,0x58b,0x5cb,0x60b,0x64b,0x68b,0x6cb,0x70b,0x74b,0x78b, -6,6,6,6,6,6,6,0,0,0,0,0,0,0,0,0, -2,2,2,2,6,6,6,6,6,6,6,0,0,0,0,0, -0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209,0x249,0x289,0,0,0,0,0x17,0x17, -1,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2, +6,0,0,6,6,6,6,6,6,6,0,6,6,0,6,6, +6,6,6,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,5,5,5,5,5,0,0,0x58b, +0x5cb,0x60b,0x64b,0x68b,0x6cb,0x70b,0x74b,0x78b,6,6,6,6,6,6,6,0, +0,0,0,0,0,0,0,0,2,2,2,2,6,6,6,6, +6,6,6,0,0,0,0,0,0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209, +0x249,0x289,0,0,0,0,0x17,0x17,1,1,2,2,2,2,2,2, 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0x18,0x18,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -5,5,5,5,0,5,5,5,5,5,5,5,5,5,5,5, -5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -0,5,5,0,5,0,0,5,0,5,5,5,5,5,5,5, -5,5,5,0,5,5,5,5,0,5,0,5,0,0,0,0, -0,0,5,0,0,0,0,5,0,5,0,5,0,5,5,5, -0,5,5,0,5,0,0,5,0,5,0,5,0,5,0,5, -0,5,5,0,5,0,0,5,5,5,5,0,5,5,5,5, -5,5,5,0,5,5,5,5,0,5,5,5,5,0,5,0, -5,5,5,5,5,5,5,5,5,5,0,5,5,5,5,5, -5,5,5,5,5,5,5,5,5,5,5,5,0,0,0,0, -0,5,5,5,0,5,5,5,5,5,0,5,5,5,5,5, -5,5,5,5,5,5,5,5,5,5,5,5,0,0,0,0, -0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0,0,0,0, +2,2,2,2,2,2,2,2,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0x18,0x18,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,5,5,5,5,0,5,5,5, +5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, +5,5,5,5,5,5,5,5,0,5,5,0,5,0,0,5, +0,5,5,5,5,5,5,5,5,5,5,0,5,5,5,5, +0,5,0,5,0,0,0,0,0,0,5,0,0,0,0,5, +0,5,0,5,0,5,5,5,0,5,5,0,5,0,0,5, +0,5,0,5,0,5,0,5,0,5,5,0,5,0,0,5, +5,5,5,0,5,5,5,5,5,5,5,0,5,5,5,5, +0,5,5,5,5,0,5,0,5,5,5,5,5,5,5,5, +5,5,0,5,5,5,5,5,5,5,5,5,5,5,5,5, +5,5,5,5,0,0,0,0,0,5,5,5,0,5,5,5, +5,5,0,5,5,5,5,5,5,5,5,5,5,5,5,5, +5,5,5,5,0,0,0,0,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, +0x1b,0x1b,0x1b,0x1b,0,0,0,0,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, +0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0,0,0x1b,0x1b,0x1b, +0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0,0x1b,0x1b,0x1b, +0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x2cb,0x2cb,0x30b,0x34b, +0x38b,0x3cb,0x40b,0x44b,0x48b,0x4cb,0x50b,0x54b,0x54b,0,0,0,0x1b,0x1b,0x1b,0x1b, +0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0, 0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, -0x1b,0x1b,0x1b,0,0,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, -0x1b,0x1b,0x1b,0x1b,0,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, -0x1b,0x1b,0x1b,0x1b,0x2cb,0x2cb,0x30b,0x34b,0x38b,0x3cb,0x40b,0x44b,0x48b,0x4cb,0x50b,0x54b, -0x54b,0,0,0,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, -0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, -0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0,0,0,0,0,0,0x1b,0x1b, +0,0,0,0,0,0,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, 0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, -0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0,0,0,0,0, -0,0,0,0,0,0,0,0,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, +0x1b,0x1b,0x1b,0,0,0,0,0,0,0,0,0,0,0,0,0, 0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, -0x1b,0x1b,0x1b,0x1b,0,0,0,0,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, -0x1b,0,0,0,0,0,0,0,0x1b,0x1b,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, +0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0,0,0,0, +0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0,0,0,0,0,0,0, +0x1b,0x1b,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, -0x1b,0x1b,0x1b,0x1a,0x1a,0x1a,0x1a,0x1a,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, -0x1b,0x1b,0x1b,0x1b,0x1b,0,0,0,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0, -0,0,0,0,0,0,0,0,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, +0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1a,0x1a,0x1a,0x1a,0x1a, +0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, +0x1b,0x1b,0x1b,0x1b,0x1b,0,0,0,0,0,0,0,0,0,0,0, 0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0,0,0, -0,0,0,0,0,0,0,0,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, -0,0,0,0,0,0,0,0,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, -0x1b,0x1b,0,0,0,0,0,0,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, -0,0,0,0,0,0,0,0,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, +0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0,0,0,0,0,0,0, +0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0,0,0,0,0,0,0,0, +0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0,0,0,0,0,0, 0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0,0,0,0,0,0,0,0, +0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, +0x1b,0,0,0,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, +0x1b,0x1b,0x1b,0x1b,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, -0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, -0,0,0,0,0,0,0,0,0x1b,0,0,0x1b,0x1b,0x1b,0x1b,0x1b, -0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, -0x1b,0x1b,0x1b,0x1b,0,0,0,0,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, -0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0,5,0x705,5,5,5,5,5,5, +0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, +0,0,0,0,0,0,0,0,0x1b,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, +0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,5,0x705,5,5,5,5,5,5, 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, 5,5,5,5,5,5,5,5,0x645,5,5,5,5,5,5,5, 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, @@ -1302,6 +1321,10 @@ static const uint16_t propsTrie_index[20780]={ 5,5,5,5,5,5,5,0x605,5,5,5,5,5,5,5,5, 5,5,5,5,5,0x645,5,5,5,5,5,5,5,5,5,5, 5,5,5,5,5,5,5,5,5,5,5,5,5,0,0,0, +0,0,0,0,0,0,0,0,5,5,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,5,5,5,5,5,5,5,5, +5,5,5,5,5,5,5,5,5,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,5,5,5,5,5,5,5,5, 5,5,5,5,5,5,5,5,0x785,5,5,5,5,5,5,5, 5,5,5,5,5,5,5,5,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10, @@ -1317,2228 +1340,2283 @@ static const uint16_t propsTrie_index[20780]={ static const UTrie2 propsTrie={ propsTrie_index, - propsTrie_index+4408, + propsTrie_index+4464, NULL, - 4408, - 16372, + 4464, + 16684, 0xa40, - 0x11b8, + 0x11f0, 0x0, 0x0, 0x110000, - 0x5128, + 0x5298, NULL, 0, FALSE, FALSE, 0, NULL }; -static const uint16_t propsVectorsTrie_index[28540]={ -0x4bb,0x4c3,0x4cb,0x4d3,0x4eb,0x4f3,0x4fb,0x503,0x50b,0x513,0x51b,0x523,0x52b,0x533,0x53b,0x543, -0x54a,0x552,0x55a,0x562,0x565,0x56d,0x575,0x57d,0x585,0x58d,0x595,0x59d,0x5a5,0x5ad,0x5b5,0x5bd, -0x5c5,0x5cd,0x5d4,0x5dc,0x5e4,0x5ec,0x5f4,0x5fc,0x604,0x60c,0x611,0x619,0x620,0x628,0x630,0x638, -0x640,0x648,0x650,0x658,0x65f,0x667,0x66f,0x677,0x67f,0x687,0x68f,0x697,0x69f,0x6a7,0x6af,0x6b7, -0x18ce,0xd31,0xe19,0x4db,0x4db,0xe89,0xe91,0x1a56,0x11bd,0x11d5,0x11c5,0x11cd,0x75c,0x762,0x76a,0x772, -0x77a,0x780,0x788,0x790,0x798,0x79e,0x7a6,0x7ae,0x7b6,0x7bc,0x7c4,0x7cc,0x7d4,0x7dc,0x7e4,0x7eb, -0x7f3,0x7f9,0x801,0x809,0x811,0x817,0x81f,0x827,0x82f,0x835,0x83d,0x845,0x84d,0x854,0x85c,0x864, -0x86c,0x870,0x878,0x87f,0x887,0x88f,0x897,0x89f,0x14dd,0x14e5,0x8a7,0x8af,0x8b7,0x8bf,0x8c7,0x8ce, -0x1543,0x1533,0x153b,0x1811,0x1819,0x11e5,0x8d6,0x11dd,0x1427,0x1427,0x1429,0x11f9,0x11fa,0x11ed,0x11ef,0x11f1, -0x154b,0x154d,0x8de,0x154d,0x8e6,0x8eb,0x8f3,0x1552,0x8f9,0x154d,0x8ff,0x907,0xc09,0x155a,0x155a,0x90f, -0x156a,0x156b,0x156b,0x156b,0x156b,0x156b,0x156b,0x156b,0x156b,0x156b,0x156b,0x156b,0x156b,0x156b,0x156b,0x156b, -0x156b,0x156b,0x156b,0x1562,0x917,0x1573,0x1573,0x91f,0xb16,0xb1e,0xb26,0xb2e,0x1583,0x157b,0x927,0x92f, -0x937,0x158d,0x1595,0x93f,0x158b,0x947,0x18d6,0xd39,0xb36,0xb3e,0xb46,0xb4b,0x1787,0xc3c,0xc43,0x16ef, -0xbd9,0x18de,0xd41,0xd49,0xd51,0xd59,0xf41,0xf41,0x17d7,0x17dc,0xc75,0xc7d,0x184d,0x1855,0x197f,0xe21, -0x185d,0xcc5,0xccd,0x1865,0x6bf,0x4db,0xf21,0xd61,0x170f,0x16f7,0x1707,0x16ff,0x179f,0x1797,0x175f,0xbe9, -0x1202,0x1202,0x1202,0x1202,0x1205,0x1202,0x1202,0x120d,0x94f,0x1215,0x953,0x95b,0x1215,0x963,0x96b,0x973, -0x1225,0x121d,0x122d,0x97b,0x983,0x98b,0x993,0x99b,0x1235,0x123d,0x1245,0x124d,0x9a3,0x1255,0x125c,0x1264, -0x126c,0x1274,0x127c,0x1284,0x128c,0x1293,0x129b,0x12a3,0x12ab,0x12b3,0x12b6,0x12b8,0x159d,0x1682,0x1688,0x9ab, -0x12c0,0x9b3,0x9bb,0x13da,0x13df,0x13e2,0x13ea,0x12c8,0x13f2,0x13f2,0x12d8,0x12d0,0x12e0,0x12e8,0x12f0,0x12f8, -0x1300,0x1308,0x1310,0x1318,0x1690,0x16e7,0x1821,0x195f,0x1328,0x132f,0x1337,0x133f,0x1320,0x1347,0x1698,0x169f, -0x15a5,0x15a5,0x15a5,0x15a5,0x15a5,0x15a5,0x15a5,0x15a5,0x16a7,0x16aa,0x16a7,0x16a7,0x16b2,0x16b9,0x16bb,0x16c2, -0x16ca,0x16ce,0x16ce,0x16d1,0x16ce,0x16ce,0x16d7,0x16ce,0x1717,0x17cf,0x1829,0xb53,0xb59,0xb5f,0xb67,0xb6c, -0x1777,0xc19,0xc1d,0x17e4,0x1767,0x1767,0x1767,0xbf1,0x176f,0xc11,0x17b7,0xc65,0xbf9,0xc01,0xc01,0x186d, -0x17a7,0x1831,0xc53,0xc55,0x9c3,0x15ad,0x15ad,0x9cb,0x15b5,0x15b5,0x15b5,0x15b5,0x15b5,0x15b5,0x9d3,0x6c3, -0x140f,0x1431,0x9db,0x1439,0x9e3,0x1441,0x1449,0x1451,0x9eb,0x9f0,0x1459,0x1460,0x9f5,0x9fd,0x17c7,0xbe1, -0xa05,0x14b7,0x14be,0x1468,0x14c6,0x14cd,0x1470,0xa0d,0x1489,0x1489,0x148b,0x1478,0x1480,0x1480,0x1481,0x14d5, -0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd, -0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd, -0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd, -0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd, -0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd, -0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd, -0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd, -0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd, -0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd, -0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd, -0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd, -0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd, -0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x1174,0x171f,0x171f, -0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493, -0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493, -0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493, -0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493, -0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493, -0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493, -0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493, -0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493, -0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493, -0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493, -0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493, -0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493, -0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493, -0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493, -0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493, -0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493, -0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493, -0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493, -0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493, -0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493, -0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493, -0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493, -0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493, -0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493, -0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493, -0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493, -0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493, -0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493, -0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493, -0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493, -0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493, -0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493, -0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493, -0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493, -0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493, -0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493, -0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493, -0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493, -0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493, -0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493, -0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x149a,0x117c,0x1182, -0x15c5,0x15cb,0x15cb,0x15cb,0x15cb,0x15cb,0x15cb,0x15cb,0x15cb,0x15cb,0x15cb,0x15cb,0x15cb,0x15cb,0x15cb,0x15cb, -0x15cb,0x15cb,0x15cb,0x15cb,0x15cb,0x15cb,0x15cb,0x15cb,0x15cb,0x15cb,0x15cb,0x15cb,0x15cb,0x15cb,0x15cb,0x15cb, -0x15cb,0x15cb,0x15cb,0x15cb,0xa15,0x15d3,0xa1d,0x18e6,0x1879,0x1879,0x1879,0x1879,0x1879,0x1879,0x1879,0x1879, -0x1875,0xcd5,0x1889,0x1881,0x188b,0x18ee,0x18ee,0xd69,0x177f,0x17ec,0x1841,0x1845,0x1839,0xc85,0xc8b,0xc8e, -0x17af,0xc5d,0x17f4,0xc96,0x1893,0x1896,0xcdd,0xd71,0x18a6,0x189e,0xce5,0xd79,0x18f6,0x18fa,0xd81,0xfe7, -0x18ae,0xced,0xcf5,0x1902,0x1912,0x190a,0xd89,0xee4,0xe29,0xe31,0x1ac9,0xf9f,0x1b6e,0x1b6e,0x191a,0xd91, -0x1525,0x1526,0x1527,0x1528,0x1529,0x152a,0x152b,0x1525,0x1526,0x1527,0x1528,0x1529,0x152a,0x152b,0x1525,0x1526, -0x1527,0x1528,0x1529,0x152a,0x152b,0x1525,0x1526,0x1527,0x1528,0x1529,0x152a,0x152b,0x1525,0x1526,0x1527,0x1528, -0x1529,0x152a,0x152b,0x1525,0x1526,0x1527,0x1528,0x1529,0x152a,0x152b,0x1525,0x1526,0x1527,0x1528,0x1529,0x152a, -0x152b,0x1525,0x1526,0x1527,0x1528,0x1529,0x152a,0x152b,0x1525,0x1526,0x1527,0x1528,0x1529,0x152a,0x152b,0x1525, -0x1526,0x1527,0x1528,0x1529,0x152a,0x152b,0x1525,0x1526,0x1527,0x1528,0x1529,0x152a,0x152b,0x1525,0x1526,0x1527, -0x1528,0x1529,0x152a,0x152b,0x1525,0x1526,0x1527,0x1528,0x1529,0x152a,0x152b,0x1525,0x1526,0x1527,0x1528,0x1529, -0x152a,0x152b,0x1525,0x1526,0x1527,0x1528,0x1529,0x152a,0x152b,0x1525,0x1526,0x1527,0x1528,0x1529,0x152a,0x152b, -0x1525,0x1526,0x1527,0x1528,0x1529,0x152a,0x152b,0x1525,0x1526,0x1527,0x1528,0x1529,0x152a,0x152b,0x1525,0x1526, -0x1527,0x1528,0x1529,0x152a,0x152b,0x1525,0x1526,0x1527,0x1528,0x1529,0x152a,0x152b,0x1525,0x1526,0x1527,0x1528, -0x1529,0x152a,0x152b,0x1525,0x1526,0x1527,0x1528,0x1529,0x152a,0x152b,0x1525,0x1526,0x1527,0x1528,0x1529,0x152a, -0x152b,0x1525,0x1526,0x1527,0x1528,0x1529,0x152a,0x152b,0x1525,0x1526,0x1527,0x1528,0x1529,0x152a,0x152b,0x1525, -0x1526,0x1527,0x1528,0x1529,0x152a,0x152b,0x1525,0x1526,0x1527,0x1528,0x1529,0x152a,0x152b,0x1525,0x1526,0x1527, -0x1528,0x1529,0x152a,0x152b,0x1525,0x1526,0x1527,0x1528,0x1529,0x152a,0x152b,0x1525,0x1526,0x1527,0x1528,0x1529, -0x152a,0x152b,0x1525,0x1526,0x1527,0x1528,0x1529,0x152a,0x152b,0x1525,0x1526,0x1527,0x1528,0x1529,0x152a,0x152b, -0x1525,0x1526,0x1527,0x1528,0x1529,0x152a,0x152b,0x1525,0x1526,0x1527,0x1528,0x1529,0x152a,0x152b,0x1525,0x1526, -0x1527,0x1528,0x1529,0x152a,0x152b,0x1525,0x1526,0x1527,0x1528,0x1529,0x152a,0x152b,0x1525,0x1526,0x1527,0x1528, -0x1529,0x152a,0x152b,0x1525,0x1526,0x1527,0x1528,0x1529,0x152a,0x152b,0x1525,0x1526,0x1527,0x1528,0x1529,0x152a, -0x152b,0x1525,0x1526,0x1527,0x1528,0x1529,0x152a,0x152b,0x1525,0x1526,0x1527,0x1528,0x1529,0x152a,0x152b,0x1525, -0x1526,0x1527,0x1528,0x1529,0x152a,0x152b,0x1525,0x1526,0x1527,0x1528,0x1529,0x152a,0x152b,0x1525,0x1526,0x1527, -0x1528,0x1529,0x152a,0x152b,0x1525,0x1526,0x1527,0x1528,0x1529,0x152a,0x152b,0x1525,0x1526,0x1527,0x1528,0x1529, -0x152a,0x152b,0x1525,0x1526,0x1527,0x1528,0x1529,0x152a,0x152b,0x1525,0x1526,0x1527,0x1528,0x1529,0x152a,0x152b, -0x1525,0x1526,0x1527,0x1528,0x1529,0x152a,0x152b,0x1525,0x1526,0x1527,0x1528,0x1529,0x152a,0xa25,0xd99,0xd9c, -0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db, -0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db, -0x14fd,0x14fd,0x14fd,0x14fd,0x14fd,0x14fd,0x14fd,0x14fd,0x14fd,0x14fd,0x14fd,0x14fd,0x14fd,0x14fd,0x14fd,0x14fd, -0x14fd,0x14fd,0x14fd,0x14fd,0x14fd,0x14fd,0x14fd,0x14fd,0x14fd,0x14fd,0x14fd,0x14fd,0x14fd,0x14fd,0x14fd,0x14fd, -0x13fa,0x13fa,0x13fa,0x13fa,0x13fa,0x13fa,0x13fa,0x13fa,0x13fa,0x13fa,0x13fa,0x13fa,0x13fa,0x13fa,0x13fa,0x13fa, -0x13fa,0x13fa,0x13fa,0x13fa,0x13fa,0x13fa,0x13fa,0x13fa,0x13fa,0x13fa,0x13fa,0x13fa,0x13fa,0x13fa,0x13fa,0x13fa, -0x13fa,0x13fa,0x13fa,0x13fa,0x13fa,0x13fa,0x13fa,0x13fa,0x13fa,0x13fa,0x13fa,0x13fa,0x13fa,0x13fa,0x13fa,0x13fa, -0x13fa,0x13fa,0x13fa,0x13fa,0x13fa,0x13fa,0x13fa,0x13fa,0x13fa,0x13fa,0x13fa,0x13fa,0x13fa,0x13fa,0x13fa,0x13fa, -0x13fa,0x13fa,0x13fa,0x13fa,0x13fa,0x13fa,0x13fa,0x13fa,0x13fa,0x13fa,0x13fa,0x13fa,0x13fa,0x13fa,0x13fa,0x13fa, -0x13fa,0x13fa,0x13fa,0x13fa,0x13fa,0x13fa,0x13fa,0x13fa,0x13fa,0x13fa,0x13fa,0x13fa,0x13fa,0x13fa,0x13fa,0x13fa, -0x13fa,0x13fa,0x13fa,0x13fa,0x13fa,0x13fa,0x13fa,0x13fa,0x13fa,0x13fa,0x13fa,0x13fa,0x13fa,0x13fa,0x13fa,0x13fa, -0x13fa,0x13fa,0x13fa,0x13fa,0x13fa,0x13fa,0x13fa,0x13fa,0x13fa,0x13fa,0x13fa,0x13fa,0x13fa,0x13fa,0x13fa,0x13fa, -0x13fa,0x13fa,0x13fa,0x13fa,0x13fa,0x13fa,0x13fa,0x13fa,0x13fa,0x13fa,0x13fa,0x13fa,0x13fa,0x13fa,0x13fa,0x13fa, -0x13fa,0x13fa,0x13fa,0x13fa,0x13fa,0x13fa,0x13fa,0x13fa,0x13fa,0x13fa,0x13fa,0x13fa,0x13fa,0x13fa,0x13fa,0x13fa, -0x13fa,0x13fa,0x13fa,0x13fa,0x13fa,0x13fa,0x13fa,0x13fa,0x13fa,0x13fa,0x13fa,0x13fa,0x13fa,0x13fa,0x13fa,0x13fa, -0x13fa,0x13fa,0x13fa,0x13fa,0x13fa,0x13fa,0x13fa,0x13fa,0x13fa,0x13fa,0x13fa,0x13fa,0x13fa,0x13fa,0x13fa,0x13fa, -0x13fa,0x13fa,0x13fa,0x13fa,0x13fa,0x13fa,0x13fa,0x13fa,0x14a2,0x14a2,0x14a2,0x14a2,0x14a2,0x14a2,0x14a2,0x14a2, -0x14a7,0x14af,0x16df,0x118a,0x17bf,0x17bf,0x118e,0x1195,0xa2d,0xa35,0xa3d,0x1367,0x136e,0x1376,0xa45,0x137e, -0x13af,0x13af,0x1357,0x135f,0x1386,0x13a6,0x13a7,0x13b7,0x138e,0x134f,0xa4d,0x1396,0xa55,0x139e,0xa5d,0xa61, -0xc6d,0x13bf,0xa69,0xa71,0x13c7,0x13cd,0x13d2,0xa79,0xa89,0x1417,0x141f,0x1402,0x1407,0xa91,0xa99,0xa81, -0x14ed,0x14ed,0x14ed,0x14ed,0x14ed,0x14ed,0x14ed,0x14ed,0x14ed,0x14ed,0x14ed,0x14ed,0x14ed,0x14ed,0x14ed,0x14ed, -0x14ed,0x14ed,0x14ed,0x14ed,0x14ed,0x14ed,0x14ed,0x14ed,0x14ed,0x14ed,0x14ed,0x14ed,0x14f5,0x14f5,0x14f5,0x14f5, -0x136c,0x136c,0x13ac,0x13ec,0x142c,0x146c,0x14ac,0x14ec,0x1528,0x1568,0x1594,0x15d4,0x1614,0x1654,0x1694,0x16d4, -0x1714,0x1750,0x1790,0x17d0,0x1810,0x1844,0x1880,0x18c0,0x1900,0x1940,0x197c,0x19bc,0x19fc,0x1a3c,0x1a7c,0x1abc, -0xa80,0xac0,0xb00,0xe4d,0xb40,0xa40,0xb80,0xa40,0xe73,0xa40,0xa40,0xa40,0xa40,0xbc0,0x12a9,0x12a9, -0xeb3,0xef3,0xa40,0xa40,0xa40,0xa40,0xdd2,0xc00,0xa40,0xa40,0xc40,0xc80,0xcc0,0xe12,0xd92,0xd02, -0x11e9,0x11e9,0x11e9,0x11e9,0x11e9,0x11e9,0x11e9,0x11e9,0x11e9,0x11e9,0x11e9,0x11e9,0x11e9,0x11e9,0x11e9,0x11e9, -0x11e9,0x11e9,0x11e9,0x11e9,0xf33,0x1229,0x1069,0x10a9,0x1269,0xf73,0xfa9,0xfa9,0xfa9,0xfa9,0xfa9,0xfe9, -0xfa9,0xfa9,0xfa9,0xfa9,0xfa9,0xfa9,0xfa9,0xfa9,0xfa9,0xfa9,0xfa9,0xfa9,0xfa9,0xfa9,0xfa9,0xfa9, -0xfa9,0xfa9,0xfa9,0xfa9,0xfa9,0xfa9,0xfa9,0xfa9,0xfa9,0xfa9,0xfa9,0xfa9,0xfa9,0xfa9,0xfa9,0x1029, +static const uint16_t propsVectorsTrie_index[29236]={ +0x4c4,0x4cc,0x4d4,0x4dc,0x4f4,0x4fc,0x504,0x50c,0x514,0x51c,0x524,0x52c,0x534,0x53c,0x544,0x54c, +0x553,0x55b,0x563,0x56b,0x56e,0x576,0x57e,0x586,0x58e,0x596,0x59e,0x5a6,0x5ae,0x5b6,0x5be,0x5c6, +0x5ce,0x5d6,0x5dd,0x5e5,0x5ed,0x5f5,0x5fd,0x605,0x60d,0x615,0x61a,0x622,0x629,0x631,0x639,0x641, +0x649,0x651,0x659,0x661,0x668,0x670,0x678,0x680,0x688,0x690,0x698,0x6a0,0x6a8,0x6b0,0x6b8,0x6c0, +0x193e,0xd41,0xe2e,0x6c8,0x4e4,0xe95,0xe9d,0x1ad4,0x120d,0x1225,0x1215,0x121d,0x781,0x787,0x78f,0x797, +0x79f,0x7a5,0x7ad,0x7b5,0x7bd,0x7c3,0x7cb,0x7d3,0x7db,0x7e1,0x7e9,0x7f1,0x7f9,0x801,0x809,0x810, +0x818,0x81e,0x826,0x82e,0x836,0x83c,0x844,0x84c,0x854,0x122d,0x85c,0x864,0x86c,0x873,0x87b,0x883, +0x88b,0x88f,0x897,0x89e,0x8a6,0x8ae,0x8b6,0x8be,0x153d,0x1545,0x8c6,0x8ce,0x8d6,0x8de,0x8e6,0x8ed, +0x15a3,0x1593,0x159b,0x1879,0x1881,0x123d,0x8f5,0x1235,0x1487,0x1487,0x1489,0x1251,0x1252,0x1245,0x1247,0x1249, +0x15ab,0x15ad,0x8fd,0x15ad,0x905,0x90a,0x912,0x15b2,0x918,0x15ad,0x91e,0x926,0xc18,0x15ba,0x15ba,0x92e, +0x15ca,0x15cb,0x15cb,0x15cb,0x15cb,0x15cb,0x15cb,0x15cb,0x15cb,0x15cb,0x15cb,0x15cb,0x15cb,0x15cb,0x15cb,0x15cb, +0x15cb,0x15cb,0x15cb,0x15c2,0x936,0x15d3,0x15d3,0x93e,0xb25,0xb2d,0xb35,0xb3d,0x15e3,0x15db,0x946,0x94e, +0x956,0x15ed,0x15f5,0x95e,0x15eb,0x966,0x1946,0xd49,0xb45,0xb4d,0xb55,0xb5a,0x17e7,0xc4b,0xc52,0x174f, +0xbe8,0x194e,0xd51,0xd59,0xd61,0xd69,0xf4d,0xf4d,0x183f,0x1844,0xc85,0xc8d,0x18b5,0x18bd,0x19ef,0xe36, +0x18c5,0xcd5,0xcdd,0x18cd,0x6d0,0x4e4,0xf2d,0xd71,0x176f,0x1757,0x1767,0x175f,0x17ff,0x17f7,0x17bf,0xbf8, +0x125a,0x125a,0x125a,0x125a,0x125d,0x125a,0x125a,0x1265,0x96e,0x126d,0x972,0x97a,0x126d,0x982,0x98a,0x992, +0x127d,0x1275,0x1285,0x99a,0x9a2,0x128d,0x9aa,0x9b2,0x1295,0x129d,0x12a5,0x12ad,0x9ba,0x12b5,0x12bc,0x12c4, +0x12cc,0x12d4,0x12dc,0x12e4,0x12ec,0x12f3,0x12fb,0x1303,0x130b,0x1313,0x1316,0x1318,0x15fd,0x16e2,0x16e8,0x182f, +0x1320,0x9c2,0x9ca,0x143a,0x143f,0x1442,0x144a,0x1328,0x1452,0x1452,0x1338,0x1330,0x1340,0x1348,0x1350,0x1358, +0x1360,0x1368,0x1370,0x1378,0x16f0,0x1747,0x1889,0x19cf,0x1388,0x138f,0x1397,0x139f,0x1380,0x13a7,0x16f8,0x16ff, +0x1605,0x1605,0x1605,0x1605,0x1605,0x1605,0x1605,0x1605,0x1707,0x170a,0x1707,0x1707,0x1712,0x1719,0x171b,0x1722, +0x172a,0x172e,0x172e,0x1731,0x172e,0x172e,0x1737,0x172e,0x1777,0x1837,0x1891,0xb62,0xb68,0xb6e,0xb76,0xb7b, +0x17d7,0xc28,0xc2c,0x184c,0x17c7,0x17c7,0x17c7,0xc00,0x17cf,0xc20,0x1817,0xc75,0xc08,0xc10,0xc10,0x18d5, +0x1807,0x1899,0xc62,0xc65,0x9d2,0x160d,0x160d,0x9da,0x1615,0x1615,0x1615,0x1615,0x1615,0x1615,0x9e2,0x6d4, +0x146f,0x1491,0x9ea,0x1499,0x9f2,0x14a1,0x14a9,0x14b1,0x9fa,0x9ff,0x14b9,0x14c0,0xa04,0xa0c,0x1827,0xbf0, +0xa14,0x1517,0x151e,0x14c8,0x1526,0x152d,0x14d0,0xa1c,0x14e9,0x14e9,0x14eb,0x14d8,0x14e0,0x14e0,0x14e1,0x1535, +0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d, +0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d, +0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d, +0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d, +0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d, +0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d, +0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d, +0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d, +0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d, +0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d, +0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d, +0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d, +0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x11c2,0x177f,0x177f, +0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3, +0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3, +0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3, +0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3, +0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3, +0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3, +0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3, +0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3, +0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3, +0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3, +0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3, +0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3, +0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3, +0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3, +0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3, +0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3, +0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3, +0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3, +0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3, +0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3, +0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3, +0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3, +0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3, +0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3, +0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3, +0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3, +0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3, +0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3, +0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3, +0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3, +0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3, +0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3, +0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3, +0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3, +0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3, +0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3, +0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3, +0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3, +0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3, +0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3, +0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14fa,0x1936,0x11ca, +0x1625,0x162b,0x162b,0x162b,0x162b,0x162b,0x162b,0x162b,0x162b,0x162b,0x162b,0x162b,0x162b,0x162b,0x162b,0x162b, +0x162b,0x162b,0x162b,0x162b,0x162b,0x162b,0x162b,0x162b,0x162b,0x162b,0x162b,0x162b,0x162b,0x162b,0x162b,0x162b, +0x162b,0x162b,0x162b,0x162b,0xa24,0x1633,0xa2c,0x1956,0x18e1,0x18e1,0x18e1,0x18e1,0x18e1,0x18e1,0x18e1,0x18e1, +0x18dd,0xce5,0x18f1,0x18e9,0x18f3,0x195e,0x195e,0xd79,0x17df,0x1854,0x18a9,0x18ad,0x18a1,0xc95,0xc9b,0xc9e, +0x180f,0xc6d,0x185c,0xca6,0x18fb,0x18fe,0xced,0xd81,0x190e,0x1906,0xcf5,0xd89,0x1966,0x196a,0xd91,0xff3, +0x1916,0xcfd,0xd05,0x1972,0x1982,0x197a,0xd99,0xef0,0xe3e,0xe46,0x1b47,0xfab,0x1bec,0x1bec,0x198a,0xda1, +0x1585,0x1586,0x1587,0x1588,0x1589,0x158a,0x158b,0x1585,0x1586,0x1587,0x1588,0x1589,0x158a,0x158b,0x1585,0x1586, +0x1587,0x1588,0x1589,0x158a,0x158b,0x1585,0x1586,0x1587,0x1588,0x1589,0x158a,0x158b,0x1585,0x1586,0x1587,0x1588, +0x1589,0x158a,0x158b,0x1585,0x1586,0x1587,0x1588,0x1589,0x158a,0x158b,0x1585,0x1586,0x1587,0x1588,0x1589,0x158a, +0x158b,0x1585,0x1586,0x1587,0x1588,0x1589,0x158a,0x158b,0x1585,0x1586,0x1587,0x1588,0x1589,0x158a,0x158b,0x1585, +0x1586,0x1587,0x1588,0x1589,0x158a,0x158b,0x1585,0x1586,0x1587,0x1588,0x1589,0x158a,0x158b,0x1585,0x1586,0x1587, +0x1588,0x1589,0x158a,0x158b,0x1585,0x1586,0x1587,0x1588,0x1589,0x158a,0x158b,0x1585,0x1586,0x1587,0x1588,0x1589, +0x158a,0x158b,0x1585,0x1586,0x1587,0x1588,0x1589,0x158a,0x158b,0x1585,0x1586,0x1587,0x1588,0x1589,0x158a,0x158b, +0x1585,0x1586,0x1587,0x1588,0x1589,0x158a,0x158b,0x1585,0x1586,0x1587,0x1588,0x1589,0x158a,0x158b,0x1585,0x1586, +0x1587,0x1588,0x1589,0x158a,0x158b,0x1585,0x1586,0x1587,0x1588,0x1589,0x158a,0x158b,0x1585,0x1586,0x1587,0x1588, +0x1589,0x158a,0x158b,0x1585,0x1586,0x1587,0x1588,0x1589,0x158a,0x158b,0x1585,0x1586,0x1587,0x1588,0x1589,0x158a, +0x158b,0x1585,0x1586,0x1587,0x1588,0x1589,0x158a,0x158b,0x1585,0x1586,0x1587,0x1588,0x1589,0x158a,0x158b,0x1585, +0x1586,0x1587,0x1588,0x1589,0x158a,0x158b,0x1585,0x1586,0x1587,0x1588,0x1589,0x158a,0x158b,0x1585,0x1586,0x1587, +0x1588,0x1589,0x158a,0x158b,0x1585,0x1586,0x1587,0x1588,0x1589,0x158a,0x158b,0x1585,0x1586,0x1587,0x1588,0x1589, +0x158a,0x158b,0x1585,0x1586,0x1587,0x1588,0x1589,0x158a,0x158b,0x1585,0x1586,0x1587,0x1588,0x1589,0x158a,0x158b, +0x1585,0x1586,0x1587,0x1588,0x1589,0x158a,0x158b,0x1585,0x1586,0x1587,0x1588,0x1589,0x158a,0x158b,0x1585,0x1586, +0x1587,0x1588,0x1589,0x158a,0x158b,0x1585,0x1586,0x1587,0x1588,0x1589,0x158a,0x158b,0x1585,0x1586,0x1587,0x1588, +0x1589,0x158a,0x158b,0x1585,0x1586,0x1587,0x1588,0x1589,0x158a,0x158b,0x1585,0x1586,0x1587,0x1588,0x1589,0x158a, +0x158b,0x1585,0x1586,0x1587,0x1588,0x1589,0x158a,0x158b,0x1585,0x1586,0x1587,0x1588,0x1589,0x158a,0x158b,0x1585, +0x1586,0x1587,0x1588,0x1589,0x158a,0x158b,0x1585,0x1586,0x1587,0x1588,0x1589,0x158a,0x158b,0x1585,0x1586,0x1587, +0x1588,0x1589,0x158a,0x158b,0x1585,0x1586,0x1587,0x1588,0x1589,0x158a,0x158b,0x1585,0x1586,0x1587,0x1588,0x1589, +0x158a,0x158b,0x1585,0x1586,0x1587,0x1588,0x1589,0x158a,0x158b,0x1585,0x1586,0x1587,0x1588,0x1589,0x158a,0x158b, +0x1585,0x1586,0x1587,0x1588,0x1589,0x158a,0x158b,0x1585,0x1586,0x1587,0x1588,0x1589,0x158a,0xa34,0xda9,0xdac, +0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4, +0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4, +0x155d,0x155d,0x155d,0x155d,0x155d,0x155d,0x155d,0x155d,0x155d,0x155d,0x155d,0x155d,0x155d,0x155d,0x155d,0x155d, +0x155d,0x155d,0x155d,0x155d,0x155d,0x155d,0x155d,0x155d,0x155d,0x155d,0x155d,0x155d,0x155d,0x155d,0x155d,0x155d, +0x145a,0x145a,0x145a,0x145a,0x145a,0x145a,0x145a,0x145a,0x145a,0x145a,0x145a,0x145a,0x145a,0x145a,0x145a,0x145a, +0x145a,0x145a,0x145a,0x145a,0x145a,0x145a,0x145a,0x145a,0x145a,0x145a,0x145a,0x145a,0x145a,0x145a,0x145a,0x145a, +0x145a,0x145a,0x145a,0x145a,0x145a,0x145a,0x145a,0x145a,0x145a,0x145a,0x145a,0x145a,0x145a,0x145a,0x145a,0x145a, +0x145a,0x145a,0x145a,0x145a,0x145a,0x145a,0x145a,0x145a,0x145a,0x145a,0x145a,0x145a,0x145a,0x145a,0x145a,0x145a, +0x145a,0x145a,0x145a,0x145a,0x145a,0x145a,0x145a,0x145a,0x145a,0x145a,0x145a,0x145a,0x145a,0x145a,0x145a,0x145a, +0x145a,0x145a,0x145a,0x145a,0x145a,0x145a,0x145a,0x145a,0x145a,0x145a,0x145a,0x145a,0x145a,0x145a,0x145a,0x145a, +0x145a,0x145a,0x145a,0x145a,0x145a,0x145a,0x145a,0x145a,0x145a,0x145a,0x145a,0x145a,0x145a,0x145a,0x145a,0x145a, +0x145a,0x145a,0x145a,0x145a,0x145a,0x145a,0x145a,0x145a,0x145a,0x145a,0x145a,0x145a,0x145a,0x145a,0x145a,0x145a, +0x145a,0x145a,0x145a,0x145a,0x145a,0x145a,0x145a,0x145a,0x145a,0x145a,0x145a,0x145a,0x145a,0x145a,0x145a,0x145a, +0x145a,0x145a,0x145a,0x145a,0x145a,0x145a,0x145a,0x145a,0x145a,0x145a,0x145a,0x145a,0x145a,0x145a,0x145a,0x145a, +0x145a,0x145a,0x145a,0x145a,0x145a,0x145a,0x145a,0x145a,0x145a,0x145a,0x145a,0x145a,0x145a,0x145a,0x145a,0x145a, +0x145a,0x145a,0x145a,0x145a,0x145a,0x145a,0x145a,0x145a,0x145a,0x145a,0x145a,0x145a,0x145a,0x145a,0x145a,0x145a, +0x145a,0x145a,0x145a,0x145a,0x145a,0x145a,0x145a,0x145a,0x1502,0x1502,0x1502,0x1502,0x1502,0x1502,0x1502,0x1502, +0x1507,0x150f,0x173f,0x11d2,0x181f,0x181f,0x11d6,0x11dd,0xa3c,0xa44,0xa4c,0x13c7,0x13ce,0x13d6,0xa54,0x13de, +0x140f,0x140f,0x13b7,0x13bf,0x13e6,0x1406,0x1407,0x1417,0x13ee,0x13af,0xa5c,0x13f6,0xa64,0x13fe,0xa6c,0xa70, +0xc7d,0x141f,0xa78,0xa80,0x1427,0x142d,0x1432,0xa88,0xa98,0x1477,0x147f,0x1462,0x1467,0xaa0,0xaa8,0xa90, +0x154d,0x154d,0x154d,0x154d,0x154d,0x154d,0x154d,0x154d,0x154d,0x154d,0x154d,0x154d,0x154d,0x154d,0x154d,0x154d, +0x154d,0x154d,0x154d,0x154d,0x154d,0x154d,0x154d,0x154d,0x154d,0x154d,0x154d,0x154d,0x1555,0x1555,0x1555,0x1555, +0x1390,0x1390,0x13d0,0x1410,0x1450,0x1490,0x14d0,0x1510,0x154c,0x158c,0x15b8,0x15f8,0x1638,0x1678,0x16b8,0x16f8, +0x1738,0x1774,0x17b4,0x17f4,0x1834,0x1868,0x18a4,0x18e4,0x1924,0x1964,0x19a0,0x19e0,0x1a20,0x1a60,0x1aa0,0x1ae0, +0xa80,0xac0,0xb00,0xb3b,0xb7b,0xa40,0xbbb,0xa40,0xe65,0xa40,0xa40,0xa40,0xa40,0xbfb,0x1290,0x1290, +0xea5,0xee5,0xa40,0xa40,0xa40,0xa40,0xc3b,0xc5b,0xa40,0xa40,0xc9b,0xcdb,0xd1b,0xe2d,0xded,0xd5d, +0x11d0,0x11d0,0x11d0,0x11d0,0x11d0,0x11d0,0x11d0,0x11d0,0x11d0,0x11d0,0x11d0,0x11d0,0x11d0,0x11d0,0x11d0,0x11d0, +0x11d0,0x11d0,0x11d0,0x11d0,0xf25,0x1210,0x1045,0x1085,0x1250,0x1090,0x12d0,0x12d0,0x12d0,0xf65,0xf85,0xfc5, +0xf85,0xf85,0xf85,0xf85,0xf85,0xf85,0xf85,0xf85,0xf85,0xf85,0xf85,0xf85,0xf85,0xf85,0xf85,0xf85, +0xf85,0xf85,0xf85,0xf85,0xf85,0xf85,0xf85,0xf85,0xf85,0xf85,0xf85,0xf85,0xf85,0xf85,0xf85,0x1005, 0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40, -0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xcc2, +0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xd1d, 0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40, -0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xcc2, +0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xd1d, 0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40, -0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xcc2, +0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xd1d, 0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40, -0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xcc2, +0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xd1d, 0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40, -0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xcc2, +0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xd1d, 0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40, -0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xcc2, +0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xd1d, 0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40, -0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xcc2, +0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xd1d, 0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40, -0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xcc2, +0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xd1d, 0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40, -0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xcc2, +0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xd1d, 0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40, -0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xcc2, -0xd42,0xd52,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40, -0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xcc2, -0x1169,0x1169,0x1169,0x1169,0x1169,0x1169,0x1169,0x1169,0x1169,0x1169,0x1169,0x1169,0x1169,0x1169,0x1169,0x1169, -0x1169,0x1169,0x1169,0x1169,0x1169,0x1169,0x1169,0x1169,0x1169,0x1169,0x1169,0x1169,0x1169,0x1169,0x1169,0x10e9, -0x11a9,0x11a9,0x11a9,0x11a9,0x11a9,0x11a9,0x11a9,0x11a9,0x11a9,0x11a9,0x11a9,0x11a9,0x11a9,0x11a9,0x11a9,0x11a9, -0x11a9,0x11a9,0x11a9,0x11a9,0x11a9,0x11a9,0x11a9,0x11a9,0x11a9,0x11a9,0x11a9,0x11a9,0x11a9,0x11a9,0x11a9,0x1129, -0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db, -0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db, -0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db, -0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db, -0xb74,0xb7b,0xb83,0xb8b,0x1727,0x1727,0x1727,0xb93,0xb9b,0xb9e,0x1757,0x174f,0xbd1,0xcfd,0xd01,0xd05, -0x4db,0x4db,0x4db,0x4db,0xd0d,0x18b6,0xd15,0xf39,0x15db,0xaa1,0xaa7,0xff7,0xba6,0x178f,0xc4b,0x4db, -0x15f0,0x15e3,0x15e8,0x172f,0xbae,0xbb6,0x1142,0x1148,0x1ab1,0xf56,0x1aa1,0x6cb,0x4db,0x4db,0x4db,0x4db, -0x1ad1,0x1ad1,0x1ad1,0x1ad1,0x1ad1,0x1ad1,0x1ad1,0x1ad1,0x1ad1,0xfa7,0xfaf,0xfb7,0x4db,0x4db,0x4db,0x4db, -0xbbe,0xbc1,0xda4,0x1b19,0xfef,0x6d3,0x4db,0x1088,0xc9e,0xd1d,0x4db,0x4db,0x1a66,0xeec,0xef4,0x1b59, -0xc25,0xc2c,0xc34,0x1922,0x1af9,0x4db,0x1ad9,0xfc7,0x192a,0xdac,0xdb4,0xdbc,0x1017,0x6db,0x4db,0x4db, -0x1932,0x1932,0x6e3,0x4db,0x1b86,0x10a0,0x1b7e,0x10a8,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db, -0x4db,0x4db,0x4db,0xdc4,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db, -0x1987,0x1989,0xe39,0xe40,0x1942,0x193a,0xdcc,0xf19,0x1a5e,0xed4,0xedc,0xfbf,0x1a76,0x1a7a,0xf11,0x1037, -0xf8a,0xf8f,0x6eb,0x4db,0x1090,0x1098,0x1ac1,0xf97,0xf6c,0xf72,0xf7a,0xf82,0x4db,0x4db,0x4db,0x4db, -0x1bc6,0x1bbe,0x1132,0x113a,0x1b41,0x1b39,0x105e,0x4db,0x4db,0x4db,0x4db,0x4db,0x1b29,0x101f,0x1027,0x102f, -0x1af1,0x1ae9,0xfd7,0x112a,0x1a82,0xf29,0x6f3,0x4db,0x106e,0x1076,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db, -0x17fc,0x17fc,0x17fc,0x17fc,0x17fc,0x17fc,0x17fc,0x17fc,0x17fc,0x17fc,0x17fc,0x17fc,0x17fc,0x17fc,0x17fc,0x17fc, -0x17fc,0x17fc,0x17fc,0x17fc,0x17fc,0x17fc,0x17fc,0x17fc,0x17fc,0x17fc,0x17fc,0x1801,0xca6,0xcad,0xcad,0xcad, -0x1809,0x1809,0x1809,0xcb5,0x1b76,0x1b76,0x1b76,0x1b76,0x1b76,0x1b76,0x6fb,0x4db,0x4db,0x4db,0x4db,0x4db, -0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db, -0x194a,0x194a,0x194a,0x194a,0x194a,0x194a,0x194a,0x194a,0x194a,0x194a,0x194a,0x194a,0x194a,0x194a,0x194a,0x194a, -0x194a,0x194a,0x194c,0x194a,0x1954,0x194a,0x194a,0x194a,0x194a,0x194a,0x194a,0x1957,0x194a,0x194a,0x194a,0x194a, -0x194a,0x703,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db, -0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db, -0x1991,0x1991,0x1991,0x1991,0x1991,0x1991,0x1991,0x1991,0x1991,0x1991,0x1991,0x1991,0x1991,0x1991,0x1991,0x1991, -0x1991,0xe48,0xfdf,0x70b,0x4db,0x4db,0x70f,0xf31,0x1b11,0x1b09,0xfff,0x1007,0x717,0x4db,0x4db,0x4db, -0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db, -0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x1a6e,0x1a6e,0xefc,0xf01,0xf09,0x4db,0x4db,0x1114, -0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db, -0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db, -0x1aa9,0x1aa9,0x1aa9,0xf49,0xf4e,0x71f,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db, -0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db, -0x15f8,0x15f8,0x15f8,0x15f8,0x15f8,0x15f8,0x15f8,0xaaf,0x1608,0xab7,0x1609,0x1600,0x1611,0x1617,0x161f,0xabf, -0x1747,0x1747,0x727,0x4db,0x4db,0x4db,0x4db,0x4db,0x1737,0x1737,0xbc9,0xcbd,0x4db,0x4db,0x4db,0x4db, -0x1650,0x1657,0xac7,0x165a,0xacf,0xad7,0xadf,0x1654,0xae7,0xaef,0xaf7,0x1659,0x1661,0x1650,0x1657,0x1653, -0x165a,0x1662,0x1651,0x1658,0x1654,0xafe,0x1627,0x162f,0x1636,0x163d,0x162a,0x1632,0x1639,0x1640,0xb06,0x1648, -0x1b9e,0x1b9e,0x1b9e,0x1b9e,0x1b9e,0x1b9e,0x1b9e,0x1b9e,0x1b9e,0x1b9e,0x1b9e,0x1b9e,0x1b9e,0x1b9e,0x1b9e,0x1b9e, -0x1b8e,0x1b91,0x1b8e,0x1b98,0x10e0,0x72f,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db, -0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db, -0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db, -0x110c,0x737,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db, -0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db, -0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db, -0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db, -0x4db,0x73b,0x103f,0x1b31,0x1045,0x1b31,0x104d,0x1052,0x1056,0x1056,0x10b0,0x10b8,0x10c0,0x10c8,0x10d0,0x10c8, -0x10d8,0x10c8,0x743,0x743,0x743,0x743,0x743,0x743,0x743,0x743,0x743,0x743,0x743,0x743,0x743,0x743, -0x743,0x743,0x743,0x743,0x743,0x743,0x743,0x743,0x743,0x743,0x743,0x743,0x743,0x743,0x743,0x743, -0x743,0x743,0x743,0x743,0x743,0x743,0x743,0x743,0x743,0x743,0x743,0x743,0x743,0x743,0x743,0x743, -0x743,0x744,0xb0e,0x166a,0x166a,0x166a,0x74c,0x74c,0x74c,0x74c,0x173f,0x173f,0x173f,0x173f,0x173f,0x173f, -0x173f,0x754,0x74c,0x74c,0x74c,0x74c,0x74c,0x74c,0x74c,0x74c,0x74c,0x74c,0x74c,0x74c,0x74c,0x74c, -0x74c,0x74c,0x74c,0x74c,0x74c,0x74c,0x74c,0x74c,0x74c,0x74c,0x74c,0x74c,0x74c,0x74c,0x74c,0x74c, -0x74c,0x74c,0x74c,0x74c,0x74c,0x74c,0x74c,0x74c,0x74c,0x74c,0x74c,0x74c,0x74c,0x74c,0x74c,0x74c, -0x74c,0x74c,0x74c,0x74c,0x74c,0x74c,0x74c,0x74c,0x74c,0x74c,0x74c,0x74c,0x74c,0x74c,0x74c,0x74c, -0x74c,0x74c,0x18be,0xd25,0x18c6,0x18c6,0xd29,0xe59,0xe61,0xe69,0xdd4,0xdda,0x196f,0xde2,0x1967,0xdea, -0xdee,0xdf5,0xdfd,0xe04,0xe0c,0xe11,0xe11,0xe11,0xe11,0xe11,0x19c0,0x19c8,0x19c0,0x19ce,0x19d6,0x19a1, -0x19de,0x19e6,0x19c0,0x19ee,0x19f6,0x19fd,0x1a05,0x19a9,0x19c0,0x1a08,0x19b1,0x19b8,0x1a10,0x1a16,0x1a92,0x1a99, -0x1a8a,0x1a1e,0x1a26,0x1a2e,0x1a36,0x1b01,0x1a3e,0x1a46,0xe71,0xe79,0x1999,0x1999,0x1999,0xe81,0x1ab9,0x1ab9, -0xf5e,0xf64,0xe50,0xe51,0xe51,0xe51,0xe51,0xe51,0xe51,0xe51,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db, -0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db, -0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db, -0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db, -0x4db,0x4db,0x1ae1,0x1ae1,0x1ae1,0x1ae1,0x1ae1,0x1ae1,0xfcf,0x4db,0x1bb6,0x1bae,0x10e8,0x4db,0x4db,0x4db, -0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db, -0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db, -0x4db,0x4db,0xe99,0xea1,0xea9,0xeb1,0xeb9,0xec1,0xec8,0xecc,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db, -0x4db,0x4db,0x1b51,0x1b49,0x1066,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db, -0x4db,0x4db,0x4db,0x1b21,0x100f,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x10f0,0x10f5,0x10fd, -0x1104,0x111c,0x1122,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db, -0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db, -0x4db,0x4db,0x4db,0x1b61,0x1b61,0x1b61,0x1b61,0x1b61,0x1b61,0x1b61,0x1b61,0x1b61,0x1b61,0x1b61,0x1b61,0x1b61, -0x1b61,0x1b66,0x1b61,0x1b61,0x1b61,0x107e,0x1080,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db, -0x4db,0x4db,0x4db,0x1bce,0x1bce,0x1bce,0x1bce,0x1bce,0x1bce,0x1bce,0x1bce,0x1bce,0x1bce,0x1bce,0x1bce,0x1bce, -0x1bce,0x1bce,0x1bce,0x1bce,0x1bce,0x1bce,0x1bce,0x1bce,0x1bce,0x1bce,0x1bce,0x1bce,0x1bce,0x1bce,0x1bce,0x1bce, -0x1bce,0x1bce,0x1bce,0x1bce,0x1bce,0x1bce,0x1bce,0x1bce,0x1bce,0x1bce,0x1bce,0x1bce,0x1bce,0x1bce,0x1bce,0x1bce, -0x1bce,0x1bce,0x1bce,0x1bce,0x1bce,0x1bce,0x1bce,0x1bce,0x1bce,0x1bce,0x1bce,0x1bce,0x1bce,0x1bce,0x1bce,0x1bce, -0x1bce,0x1bce,0x1150,0x1bd6,0x1bd6,0x1bd6,0x1bd6,0x1bd6,0x1bd6,0x1bd6,0x1bd6,0x1bd6,0x1bd6,0x1bd6,0x1bd6,0x1bd6, -0x1bd6,0x1bd6,0x1bd6,0x1bd6,0x1bd6,0x1bd6,0x1bd6,0x1bd6,0x1bd6,0x1bd6,0x1158,0x4db,0x4db,0x4db,0x4db,0x4db, -0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db, -0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db, -0x4db,0x4db,0x4db,0x1672,0x1672,0x1672,0x1672,0x1672,0x1672,0x1672,0x1672,0x1672,0x1672,0x1672,0x1672,0x1672, -0x1672,0x1672,0x1672,0x1672,0x1672,0x1672,0x1672,0x1672,0x1672,0x1672,0x1672,0x1672,0x1672,0x1672,0x1672,0x1672, -0x1672,0x1672,0x1672,0x1672,0x1672,0x1672,0x1672,0x1672,0x1672,0x1672,0x1672,0x1672,0x1672,0x1672,0x1672,0x1672, -0x1672,0x1672,0x1672,0x1672,0x1672,0x1672,0x1672,0x1672,0x1672,0x119d,0x1160,0x1977,0x1977,0x1977,0x1977,0x1977, -0x1977,0x1977,0x1977,0x1ba6,0x1ba6,0x1ba6,0x1ba6,0x1ba6,0x1ba6,0x1ba6,0x1ba6,0x1ba6,0x1ba6,0x1ba6,0x1ba6,0x1ba6, -0x1ba6,0x1ba6,0x1ba6,0x1ba6,0x1ba6,0x1ba6,0x1ba6,0x1ba6,0x1ba6,0x1ba6,0x1ba6,0x1ba6,0x1ba6,0x1ba6,0x1ba6,0x1ba6, -0x1ba6,0x1ba6,0x1ba6,0x1ba6,0x1ba6,0x1ba6,0x1ba6,0x1ba6,0x1ba6,0x1ba6,0x1ba6,0x1ba6,0x1ba6,0x1ba6,0x1ba6,0x1ba6, -0x1ba6,0x1ba6,0x1ba6,0x1ba6,0x1ba6,0x1ba6,0x1ba6,0x1ba6,0x1168,0x1160,0x1160,0x1160,0x1160,0x1160,0x1160,0x1160, -0x1160,0x1160,0x1160,0x1160,0x1160,0x1160,0x1160,0x1160,0x1160,0x1160,0x1160,0x1160,0x1160,0x1160,0x1160,0x1160, -0x1160,0x1160,0x1160,0x1160,0x1160,0x1160,0x1160,0x1160,0x1160,0x1160,0x1160,0x1160,0x1160,0x1160,0x1160,0x1160, -0x1160,0x1160,0x1160,0x1160,0x1160,0x1160,0x1160,0x1160,0x1160,0x1160,0x1160,0x1160,0x1160,0x1160,0x1160,0x1160, -0x1160,0x1160,0x1160,0x1160,0x1160,0x1160,0x1160,0x1160,0x1160,0x167a,0x167a,0x167a,0x167a,0x167a,0x167a,0x167a, -0x167a,0x167a,0x167a,0x167a,0x167a,0x167a,0x167a,0x167a,0x167a,0x11a5,0x1160,0x1160,0x1160,0x1160,0x1160,0x1160, -0x1160,0x1160,0x1160,0x1160,0x1160,0x1160,0x1160,0x1160,0x1160,0x1160,0x1160,0x1160,0x1160,0x1160,0x1160,0x1160, -0x1160,0x1160,0x1160,0x1160,0x1160,0x1160,0x1160,0x1160,0x1160,0x1160,0x1160,0x1160,0x1160,0x1160,0x1160,0x1160, -0x1160,0x1160,0x1160,0x1160,0x1160,0x1160,0x1160,0x1160,0x116c,0x1160,0x1160,0x1160,0x1160,0x1160,0x1160,0x1160, -0x1160,0x1160,0x1160,0x1160,0x1160,0x1160,0x1160,0x1160,0x1160,0x1160,0x1160,0x1160,0x1160,0x1160,0x1160,0x1160, -0x1160,0x1160,0x1160,0x1160,0x1160,0x1160,0x1160,0x1160,0x1160,0x1160,0x1160,0x1160,0x1160,0x1160,0x1160,0x1160, -0x1160,0x1160,0x1160,0x1160,0x1160,0x1160,0x1160,0x1160,0x1160,0x1160,0x1160,0x1160,0x1160,0x1160,0x1160,0x1160, -0x1160,0x1160,0x1160,0x1160,0x1160,0x1160,0x1160,0x1160,0x116c,0x1977,0x1977,0x1977,0x1977,0x1977,0x1977,0x1977, -0x1977,0x1977,0x1977,0x1977,0x1977,0x1977,0x1977,0x1977,0x1977,0x1977,0x1977,0x1977,0x1977,0x1977,0x1977,0x1977, -0x1977,0x1977,0x1977,0x1977,0x1977,0x1977,0x1977,0x1977,0x1977,0x1977,0x1977,0x1977,0x1977,0x1977,0x1977,0x1977, -0x1977,0x1977,0x1977,0x1977,0x1977,0x1977,0x1977,0x1977,0x1977,0x1977,0x1977,0x1977,0x1977,0x1977,0x1977,0x1977, -0x1977,0x1977,0x11ad,0x1a4e,0x1a4e,0x1a4e,0x1a4e,0x1a4e,0x1a4e,0x11b5,0x1ba6,0x1ba6,0x1ba6,0x1ba6,0x1ba6,0x1ba6, -0x1ba6,0x1ba6,0x1ba6,0x1ba6,0x1ba6,0x1ba6,0x1ba6,0x1ba6,0x1ba6,0x1ba6,0x1ba6,0x1ba6,0x1ba6,0x1ba6,0x1ba6,0x1ba6, -0x1ba6,0x1ba6,0x1ba6,0x1ba6,0x1ba6,0x1ba6,0x1ba6,0x1ba6,0x1ba6,0x1ba6,0x1ba6,0x1ba6,0x1ba6,0x1ba6,0x1ba6,0x1ba6, -0x1ba6,0x1ba6,0x1ba6,0x1ba6,0x1ba6,0x1ba6,0x1ba6,0x1ba6,0x1ba6,0x1ba6,0x1ba6,0x1ba6,0x1ba6,0x1ba6,0x1ba6,0x1ba6, -0x1ba6,0x1ba6,0x1ba6,0x1ba6,0x1ba6,0x1ba6,0x1ba6,0x1ba6,0x1ba6,0x1515,0x1515,0x1515,0x1515,0x1515,0x1515,0x1515, -0x1515,0x1515,0x1515,0x1515,0x1515,0x1515,0x1515,0x1515,0x1515,0x1515,0x1515,0x1515,0x1515,0x1515,0x1515,0x1515, -0x1515,0x1515,0x1515,0x1515,0x1515,0x1515,0x1515,0x1515,0x1515,0x1515,0x1515,0x1515,0x1515,0x1515,0x1515,0x1515, -0x1515,0x1515,0x1515,0x1515,0x1515,0x1515,0x1515,0x1515,0x1515,0x1515,0x1515,0x1515,0x1515,0x1515,0x1515,0x1515, -0x1515,0x1515,0x1515,0x1515,0x1515,0x1515,0x1515,0x1515,0x1505,0x151d,0x151d,0x151d,0x151d,0x151d,0x151d,0x151d, -0x151d,0x151d,0x151d,0x151d,0x151d,0x151d,0x151d,0x151d,0x151d,0x151d,0x151d,0x151d,0x151d,0x151d,0x151d,0x151d, -0x151d,0x151d,0x151d,0x151d,0x151d,0x151d,0x151d,0x151d,0x151d,0x151d,0x151d,0x151d,0x151d,0x151d,0x151d,0x151d, -0x151d,0x151d,0x151d,0x151d,0x151d,0x151d,0x151d,0x151d,0x151d,0x151d,0x151d,0x151d,0x151d,0x151d,0x151d,0x151d, -0x151d,0x151d,0x151d,0x151d,0x151d,0x151d,0x151d,0x151d,0x150d,0x1515,0x1515,0x1515,0x1515,0x1515,0x1515,0x1515, -0x1515,0x1515,0x1515,0x1515,0x1515,0x1515,0x1515,0x1515,0x1515,0x1515,0x1515,0x1515,0x1515,0x1515,0x1515,0x1515, -0x1515,0x1515,0x1515,0x1515,0x1515,0x1515,0x1515,0x1515,0x1515,0x1515,0x1515,0x1515,0x1515,0x1515,0x1515,0x1515, -0x1515,0x1515,0x1515,0x1515,0x1515,0x1515,0x1515,0x1515,0x1515,0x1515,0x1515,0x1515,0x1515,0x1515,0x1515,0x1515, -0x1515,0x1515,0x1515,0x1515,0x1515,0x1515,0x1515,0x1515,0x1515,0x151d,0x151d,0x151d,0x151d,0x151d,0x151d,0x151d, -0x151d,0x151d,0x151d,0x151d,0x151d,0x151d,0x151d,0x151d,0x151d,0x151d,0x151d,0x151d,0x151d,0x151d,0x151d,0x151d, -0x151d,0x151d,0x151d,0x151d,0x151d,0x151d,0x151d,0x151d,0x151d,0x151d,0x151d,0x151d,0x151d,0x151d,0x151d,0x151d, -0x151d,0x151d,0x151d,0x151d,0x151d,0x151d,0x151d,0x151d,0x151d,0x151d,0x151d,0x151d,0x151d,0x151d,0x151d,0x151d, -0x151d,0x151d,0x151d,0x151d,0x151d,0x151d,0x151d,0x151d,0x151d,0x1672,0x1672,0x1672,0x1672,0x1672,0x1672,0x1672, -0x1672,0x1672,0x1672,0x1672,0x1672,0x1672,0x1672,0x1672,0x1672,0x1672,0x1672,0x1672,0x1672,0x1672,0x1672,0x1672, -0x1672,0x1672,0x1672,0x1672,0x1672,0x1672,0x1672,0x1672,0x1672,0x1672,0x1672,0x1672,0x1672,0x1672,0x1672,0x1672, -0x1672,0x1672,0x1672,0x1672,0x1672,0x1672,0x1672,0x1672,0x1672,0x1672,0x1672,0x1672,0x1672,0x1672,0x1672,0x1672, -0x1672,0x1672,0x1672,0x1672,0x1672,0x1672,0x1672,0x1672,0x1672,0x1977,0x1977,0x1977,0x1977,0x1977,0x1977,0x1977, -0x1977,0x1977,0x1977,0x1977,0x1977,0x1977,0x1977,0x1977,0x1977,0x1977,0x1977,0x1977,0x1977,0x1977,0x1977,0x1977, -0x1977,0x1977,0x1977,0x1977,0x1977,0x1977,0x1977,0x1977,0x1977,0x1977,0x1977,0x1977,0x1977,0x1977,0x1977,0x1977, -0x1977,0x1977,0x1977,0x1977,0x1977,0x1977,0x1977,0x1977,0x1977,0x1977,0x1977,0x1977,0x1977,0x1977,0x1977,0x1977, -0x1977,0x1977,0x1977,0x1977,0x1977,0x1977,0x1977,0x1977,0x1977,0x1ba6,0x1ba6,0x1ba6,0x1ba6,0x1ba6,0x1ba6,0x1ba6, -0x1ba6,0x1ba6,0x1ba6,0x1ba6,0x1ba6,0x1ba6,0x1ba6,0x1ba6,0x1ba6,0x1ba6,0x1ba6,0x1ba6,0x1ba6,0x1ba6,0x1ba6,0x1ba6, -0x1ba6,0x1ba6,0x1ba6,0x1ba6,0x1ba6,0x1ba6,0x1ba6,0x1ba6,0x1ba6,0x1ba6,0x1ba6,0x1ba6,0x1ba6,0x1ba6,0x1ba6,0x1ba6, -0x1ba6,0x1ba6,0x1ba6,0x1ba6,0x1ba6,0x1ba6,0x1ba6,0x1ba6,0x1ba6,0x1ba6,0x1ba6,0x1ba6,0x1ba6,0x1ba6,0x1ba6,0x1ba6, -0x1ba6,0x1ba6,0x1ba6,0x1ba6,0x1ba6,0x1ba6,0x1ba6,0x1ba6,0x1ba6,0x1bce,0x1bce,0x1bce,0x1bce,0x1bce,0x1bce,0x1bce, -0x1bce,0x1bce,0x1bce,0x1bce,0x1bce,0x1bce,0x1bce,0x1bce,0x1bce,0x1bce,0x1bce,0x1bce,0x1bce,0x1bce,0x1bce,0x1bce, -0x1bce,0x1bce,0x1bce,0x1bce,0x1bce,0x1bce,0x1bce,0x1bce,0x1bce,0x1bce,0x1bce,0x1bce,0x1bce,0x1bce,0x1bce,0x1bce, -0x1bce,0x1bce,0x1bce,0x1bce,0x1bce,0x1bce,0x1bce,0x1bce,0x1bce,0x1bce,0x1bce,0x1bce,0x1bce,0x1bce,0x1bce,0x1bce, -0x1bce,0x1bce,0x1bce,0x1bce,0x1bce,0x1bce,0x1bce,0x1bce,0x1bce,0x4ba,0x4ba,0x4ba,0x273,0x273,0x273,0x273, -0x273,0x273,0x273,0x273,0x273,0x276,0x27f,0x279,0x279,0x27c,0x273,0x273,0x273,0x273,0x273,0x273, -0x273,0x273,0x273,0x273,0x273,0x273,0x273,0x273,0x273,0x273,0x273,0x273,0x7a1,0x79b,0x780,0x777, -0x76e,0x76b,0x762,0x77d,0x768,0x774,0x777,0x792,0x789,0x77a,0x79e,0x771,0x75f,0x75f,0x75f,0x75f, -0x75f,0x75f,0x75f,0x75f,0x75f,0x75f,0x786,0x783,0x78c,0x78c,0x78c,0x79b,0x762,0x7ad,0x7ad,0x7ad, -0x7ad,0x7ad,0x7ad,0x7a7,0x7a7,0x7a7,0x7a7,0x7a7,0x7a7,0x7a7,0x7a7,0x7a7,0x7a7,0x7a7,0x7a7,0x7a7, -0x7a7,0x7a7,0x7a7,0x7a7,0x7a7,0x7a7,0x7a7,0x768,0x76e,0x774,0x798,0x75c,0x795,0x7aa,0x7aa,0x7aa, -0x7aa,0x7aa,0x7aa,0x7a4,0x7a4,0x7a4,0x7a4,0x7a4,0x7a4,0x7a4,0x7a4,0x7a4,0x7a4,0x7a4,0x7a4,0x7a4, -0x7a4,0x7a4,0x7a4,0x7a4,0x7a4,0x7a4,0x7a4,0x768,0x78f,0x765,0x78c,0x273,0,0,0,0, +0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xd1d, +0xd9d,0xdad,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40, +0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xd1d, +0x1150,0x1150,0x1150,0x1150,0x1150,0x1150,0x1150,0x1150,0x1150,0x1150,0x1150,0x1150,0x1150,0x1150,0x1150,0x1150, +0x1150,0x1150,0x1150,0x1150,0x1150,0x1150,0x1150,0x1150,0x1150,0x1150,0x1150,0x1150,0x1150,0x1150,0x1150,0x10d0, +0x1190,0x1190,0x1190,0x1190,0x1190,0x1190,0x1190,0x1190,0x1190,0x1190,0x1190,0x1190,0x1190,0x1190,0x1190,0x1190, +0x1190,0x1190,0x1190,0x1190,0x1190,0x1190,0x1190,0x1190,0x1190,0x1190,0x1190,0x1190,0x1190,0x1190,0x1190,0x1110, +0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4, +0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4, +0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4, +0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4, +0xb83,0xb8a,0xb92,0xb9a,0x1787,0x1787,0x1787,0xba2,0xbaa,0xbad,0x17b7,0x17af,0xbe0,0xd0d,0xd11,0xd15, +0x4e4,0x4e4,0x4e4,0x4e4,0xd1d,0x191e,0xd25,0xf45,0x163b,0xab0,0xab6,0x1003,0xbb5,0x17ef,0xc5a,0x4e4, +0x1650,0x1643,0x1648,0x178f,0xbbd,0xbc5,0x115c,0x1162,0x1b2f,0xf62,0x1b1f,0x6dc,0x4e4,0x4e4,0x4e4,0x4e4, +0x1b4f,0x1b4f,0x1b4f,0x1b4f,0x1b4f,0x1b4f,0x1b4f,0x1b4f,0x1b4f,0xfb3,0xfbb,0xfc3,0x4e4,0x4e4,0x4e4,0x4e4, +0xbcd,0xbd0,0xdb4,0x1b97,0xffb,0x6e4,0x4e4,0x1094,0xcae,0xd2d,0x4e4,0x4e4,0x1ae4,0xef8,0xf00,0x1bd7, +0xc34,0xc3b,0xc43,0x1992,0x1b77,0x4e4,0x1b57,0xfd3,0x199a,0xdbc,0xdc4,0xdcc,0x1023,0x6ec,0x4e4,0x4e4, +0x19a2,0x19a2,0x6f4,0x4e4,0x1c04,0x10ac,0x1bfc,0x10b4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4, +0x4e4,0x4e4,0x4e4,0xdd4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4, +0x19f7,0x19f9,0xe4e,0xe55,0x19aa,0x19b2,0xddc,0xf25,0x1adc,0xee0,0xee8,0xfcb,0x1af4,0x1af8,0xf1d,0x1043, +0xf96,0xf9b,0x6fc,0x4e4,0x109c,0x10a4,0x1b3f,0xfa3,0xf78,0xf7e,0xf86,0xf8e,0x4e4,0x4e4,0x4e4,0x4e4, +0x1c44,0x1c3c,0x114c,0x1154,0x1bbf,0x1bb7,0x106a,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x1ba7,0x102b,0x1033,0x103b, +0x1b6f,0x1b67,0xfe3,0x1144,0x1b00,0xf35,0x704,0x4e4,0x107a,0x1082,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4, +0x1bcf,0x1bc7,0x1072,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x1c6c,0x1c64,0x11a6,0x1c5c,0x119e, +0x70c,0x1b9f,0x101b,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x110a,0x110f,0x1117,0x111e,0x1136, +0x113c,0x4e4,0x4e4,0x1182,0x1186,0x118e,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4, +0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x1864,0x1864,0x1864,0x1864,0x1864, +0x1864,0x1864,0x1864,0x1864,0x1864,0x1864,0x1864,0x1864,0x1864,0x1864,0x1864,0x1864,0x1864,0x1864,0x1864,0x1864, +0x1864,0x1864,0x1864,0x1864,0x1864,0x1864,0x1869,0xcb6,0xcbd,0xcbd,0xcbd,0x1871,0x1871,0x1871,0xcc5,0x1bf4, +0x1bf4,0x1bf4,0x1bf4,0x1bf4,0x1bf4,0x714,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4, +0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x19ba,0x19ba,0x19ba,0x19ba,0x19ba, +0x19ba,0x19ba,0x19ba,0x19ba,0x19ba,0x19ba,0x19ba,0x19ba,0x19ba,0x19ba,0x19ba,0x19ba,0x19ba,0x19bc,0x19ba,0x19c4, +0x19ba,0x19ba,0x19ba,0x19ba,0x19ba,0x19ba,0x19c7,0x19ba,0x19ba,0x19ba,0x19ba,0x19ba,0x71c,0x4e4,0x4e4,0x4e4, +0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4, +0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x1a01,0x1a01,0x1a01,0x1a01,0x1a01, +0x1a01,0x1a01,0x1a01,0x1a01,0x1a01,0x1a01,0x1a01,0x1a01,0x1a01,0x1a01,0x1a01,0x1a01,0xe5d,0xfeb,0x724,0x4e4, +0x4e4,0x728,0xf3d,0x1b8f,0x1b87,0x100b,0x1013,0x730,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4, +0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4, +0x4e4,0x4e4,0x4e4,0x1aec,0x1aec,0xf08,0xf0d,0xf15,0x4e4,0x4e4,0x112e,0x1a11,0x1c74,0x1c74,0x1c74,0x1c74, +0x1c74,0x1c74,0x1c74,0x117a,0x738,0x4e4,0x73c,0x1c84,0x1c84,0x1c84,0x1c84,0x1c84,0x1c84,0x1c84,0x1c84,0x1c84, +0x1c84,0x1c84,0x1196,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4, +0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4, +0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x1b27,0x1b27,0x1b27,0xf55,0xf5a, +0x744,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4, +0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x1658,0x1658,0x1658,0x1658,0x1658, +0x1658,0x1658,0xabe,0x1668,0xac6,0x1669,0x1660,0x1671,0x1677,0x167f,0xace,0x17a7,0x17a7,0x74c,0x4e4,0x4e4, +0x4e4,0x4e4,0x4e4,0x1797,0x1797,0xbd8,0xccd,0x4e4,0x4e4,0x4e4,0x4e4,0x16b0,0x16b7,0xad6,0x16ba,0xade, +0xae6,0xaee,0x16b4,0xaf6,0xafe,0xb06,0x16b9,0x16c1,0x16b0,0x16b7,0x16b3,0x16ba,0x16c2,0x16b1,0x16b8,0x16b4, +0xb0d,0x1687,0x168f,0x1696,0x169d,0x168a,0x1692,0x1699,0x16a0,0xb15,0x16a8,0x1c1c,0x1c1c,0x1c1c,0x1c1c,0x1c1c, +0x1c1c,0x1c1c,0x1c1c,0x1c1c,0x1c1c,0x1c1c,0x1c1c,0x1c1c,0x1c1c,0x1c1c,0x1c1c,0x1c0c,0x1c0f,0x1c0c,0x1c16,0x10fa, +0x754,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4, +0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4, +0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x1126,0x75c,0x4e4,0x4e4,0x4e4, +0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4, +0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4, +0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4, +0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x760,0x104b,0x1baf,0x1051, +0x1baf,0x1059,0x105e,0x1062,0x1062,0x10bc,0x10c4,0x10cc,0x10d4,0x10dc,0x10e2,0x10ea,0x10f2,0x768,0x768,0x768, +0x768,0x768,0x768,0x768,0x768,0x768,0x768,0x768,0x768,0x768,0x768,0x768,0x768,0x768,0x768,0x768, +0x768,0x768,0x768,0x768,0x768,0x768,0x768,0x768,0x768,0x768,0x768,0x768,0x768,0x768,0x768,0x768, +0x768,0x768,0x768,0x768,0x768,0x768,0x768,0x768,0x768,0x768,0x768,0x768,0x769,0xb1d,0x16ca,0x16ca, +0x16ca,0x771,0x771,0x771,0x771,0x179f,0x179f,0x179f,0x179f,0x179f,0x179f,0x179f,0x779,0x771,0x771,0x771, +0x771,0x771,0x771,0x771,0x771,0x771,0x771,0x771,0x771,0x771,0x771,0x771,0x771,0x771,0x771,0x771, +0x771,0x771,0x771,0x771,0x771,0x771,0x771,0x771,0x771,0x771,0x771,0x771,0x771,0x771,0x771,0x771, +0x771,0x771,0x771,0x771,0x771,0x771,0x771,0x771,0x771,0x771,0x771,0x771,0x771,0x771,0x771,0x771, +0x771,0x771,0x771,0x771,0x771,0x771,0x771,0x771,0x771,0x771,0x771,0x771,0x771,0x1926,0xd35,0x192e, +0x192e,0xd39,0xe65,0xe6d,0xe75,0xde4,0xdea,0x19df,0xdf2,0x19d7,0xdfa,0xdfe,0xe05,0xe0d,0xe14,0xe1c, +0xe24,0xe26,0xe26,0xe26,0xe26,0x1a38,0x1a40,0x1a48,0x1a4c,0x1a54,0x1a19,0x1a5c,0x1a64,0x1a48,0x1a6c,0x1a74, +0x1a7b,0x1a83,0x1a21,0x1a48,0x1a86,0x1a29,0x1a30,0x1a8e,0x1a94,0x1b10,0x1b17,0x1b08,0x1a9c,0x1aa4,0x1aac,0x1ab4, +0x1b7f,0x1abc,0x1ac4,0xe7d,0xe85,0x1a09,0x1a09,0x1a09,0xe8d,0x1b37,0x1b37,0xf6a,0xf70,0x1b5f,0x1b5f,0x1b5f, +0x1b5f,0x1b5f,0x1b5f,0xfdb,0x4e4,0x1c34,0x1c2c,0x1102,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4, +0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4, +0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0xea5,0xead,0xeb5, +0xebd,0xec5,0xecd,0xed4,0xed8,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4, +0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4, +0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x1bdf,0x1bdf,0x1bdf,0x1bdf,0x1bdf,0x1bdf,0x1bdf,0x1bdf,0x1bdf,0x1bdf,0x1bdf, +0x1bdf,0x1bdf,0x1bdf,0x1be4,0x1bdf,0x1bdf,0x1bdf,0x108a,0x108c,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4, +0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x1c4c,0x1c4c,0x1c4c,0x1c4c,0x1c4c,0x1c4c,0x1c4c,0x1c4c,0x1c4c,0x1c4c,0x1c4c, +0x1c4c,0x1c4c,0x1c4c,0x1c4c,0x1c4c,0x1c4c,0x1c4c,0x1c4c,0x1c4c,0x1c4c,0x1c4c,0x1c4c,0x1c4c,0x1c4c,0x1c4c,0x1c4c, +0x1c4c,0x1c4c,0x1c4c,0x1c4c,0x1c4c,0x1c4c,0x1c4c,0x1c4c,0x1c4c,0x1c4c,0x1c4c,0x1c4c,0x1c4c,0x1c4c,0x1c4c,0x1c4c, +0x1c4c,0x1c4c,0x1c4c,0x1c4c,0x1c4c,0x1c4c,0x1c4c,0x1c4c,0x1c4c,0x1c4c,0x1c4c,0x1c4c,0x1c4c,0x1c4c,0x1c4c,0x1c4c, +0x1c4c,0x1c4c,0x1c4c,0x1c4c,0x116a,0x1c54,0x1c54,0x1c54,0x1c54,0x1c54,0x1c54,0x1c54,0x1c54,0x1c54,0x1c54,0x1c54, +0x1c54,0x1c54,0x1c54,0x1c54,0x1c54,0x1c54,0x1c54,0x1c54,0x1c54,0x1c54,0x1c54,0x1c54,0x1172,0x4e4,0x4e4,0x4e4, +0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4, +0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4, +0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x16d2,0x16d2,0x16d2,0x16d2,0x16d2,0x16d2,0x16d2,0x16d2,0x16d2,0x16d2,0x16d2, +0x16d2,0x16d2,0x16d2,0x16d2,0x16d2,0x16d2,0x16d2,0x16d2,0x16d2,0x16d2,0x16d2,0x16d2,0x16d2,0x16d2,0x16d2,0x16d2, +0x16d2,0x16d2,0x16d2,0x16d2,0x16d2,0x16d2,0x16d2,0x16d2,0x16d2,0x16d2,0x16d2,0x16d2,0x16d2,0x16d2,0x16d2,0x16d2, +0x16d2,0x16d2,0x16d2,0x16d2,0x16d2,0x16d2,0x16d2,0x16d2,0x16d2,0x16d2,0x16d2,0x11e5,0x11ae,0x19e7,0x19e7,0x19e7, +0x19e7,0x19e7,0x19e7,0x19e7,0x19e7,0x1c7c,0x1c7c,0x1c7c,0x1c7c,0x1c7c,0x1c7c,0x1c7c,0x1c7c,0x1c7c,0x1c7c,0x1c7c, +0x1c7c,0x1c7c,0x1c7c,0x1c7c,0x1c7c,0x1c7c,0x1c7c,0x1c7c,0x1c7c,0x1c7c,0x1c7c,0x1c7c,0x1c7c,0x1c7c,0x1c7c,0x1c7c, +0x1c7c,0x1c7c,0x1c7c,0x1c7c,0x11b6,0x11ae,0x11ae,0x11ae,0x11ae,0x11ae,0x11ae,0x11ae,0x11ae,0x11ae,0x11ae,0x11ae, +0x11ae,0x11ae,0x11ae,0x11ae,0x11ae,0x11ae,0x11ae,0x11ae,0x11ae,0x11ae,0x11ae,0x11ae,0x11ae,0x11ae,0x11ae,0x11ae, +0x11ae,0x11ae,0x11ae,0x11ae,0x11ae,0x11ae,0x11ae,0x11ae,0x11ae,0x11ae,0x11ae,0x11ae,0x11ae,0x11ae,0x11ae,0x11ae, +0x11ae,0x11ae,0x11ae,0x11ae,0x11ae,0x11ae,0x11ae,0x11ae,0x11ae,0x11ae,0x11ae,0x11ae,0x11ae,0x11ae,0x11ae,0x11ae, +0x11ae,0x11ae,0x11ae,0x11ae,0x11ae,0x16da,0x16da,0x16da,0x16da,0x16da,0x16da,0x16da,0x16da,0x16da,0x16da,0x16da, +0x16da,0x16da,0x16da,0x16da,0x16da,0x11ed,0x11ae,0x11ae,0x11ae,0x11ae,0x11ae,0x11ae,0x11ae,0x11ae,0x11ae,0x11ae, +0x11ae,0x11ae,0x11ae,0x11ae,0x11ae,0x11ae,0x11ae,0x11ae,0x11ae,0x11ae,0x11ae,0x11ae,0x11ae,0x11ae,0x11ae,0x11ae, +0x11ae,0x11ae,0x11ae,0x11ae,0x11ae,0x11ae,0x11ae,0x11ae,0x11ae,0x11ae,0x11ae,0x11ae,0x11ae,0x11ae,0x11ae,0x11ae, +0x11ae,0x11ae,0x11ae,0x11ae,0x11ba,0x11ae,0x11ae,0x11ae,0x11ae,0x11ae,0x11ae,0x11ae,0x11ae,0x11ae,0x11ae,0x11ae, +0x11ae,0x11ae,0x11ae,0x11ae,0x11ae,0x11ae,0x11ae,0x11ae,0x11ae,0x11ae,0x11ae,0x11ae,0x11ae,0x11ae,0x11ae,0x11ae, +0x11ae,0x11ae,0x11ae,0x11ae,0x11ae,0x11ae,0x11ae,0x11ae,0x11ae,0x11ae,0x11ae,0x11ae,0x11ae,0x11ae,0x11ae,0x11ae, +0x11ae,0x11ae,0x11ae,0x11ae,0x11ae,0x11ae,0x11ae,0x11ae,0x11ae,0x11ae,0x11ae,0x11ae,0x11ae,0x11ae,0x11ae,0x11ae, +0x11ae,0x11ae,0x11ae,0x11ae,0x11ba,0x19e7,0x19e7,0x19e7,0x19e7,0x19e7,0x19e7,0x19e7,0x19e7,0x19e7,0x19e7,0x19e7, +0x19e7,0x19e7,0x19e7,0x19e7,0x19e7,0x19e7,0x19e7,0x19e7,0x19e7,0x19e7,0x19e7,0x19e7,0x19e7,0x19e7,0x19e7,0x19e7, +0x19e7,0x19e7,0x19e7,0x19e7,0x19e7,0x19e7,0x19e7,0x19e7,0x19e7,0x19e7,0x19e7,0x19e7,0x19e7,0x19e7,0x19e7,0x19e7, +0x19e7,0x19e7,0x19e7,0x19e7,0x19e7,0x19e7,0x19e7,0x19e7,0x19e7,0x19e7,0x19e7,0x19e7,0x19e7,0x19e7,0x11f5,0x1acc, +0x1acc,0x1acc,0x1acc,0x1acc,0x1acc,0x11fd,0x1c24,0x1c24,0x1c24,0x1c24,0x1c24,0x1c24,0x1c24,0x1c24,0x1c24,0x1c24, +0x1c24,0x1c24,0x1c24,0x1c24,0x1c24,0x1c24,0x1c24,0x1c24,0x1c24,0x1c24,0x1c24,0x1c24,0x1c24,0x1c24,0x1c24,0x1c24, +0x1c24,0x1c24,0x1c24,0x1c24,0x1c24,0x1c24,0x1c24,0x1c24,0x1c24,0x1c24,0x1c24,0x1c24,0x1c24,0x1c24,0x1c24,0x1c24, +0x1c24,0x1c24,0x1c24,0x1c24,0x1c24,0x1c24,0x1c24,0x1c24,0x1c24,0x1c24,0x1c24,0x1c24,0x1c24,0x1c24,0x1c24,0x1c24, +0x1c24,0x1c24,0x1c24,0x1c24,0x1c24,0x1205,0x1c7c,0x1c7c,0x1c7c,0x1c7c,0x1c7c,0x1c7c,0x1c7c,0x1c7c,0x1c7c,0x1c7c, +0x1575,0x1575,0x1575,0x1575,0x1575,0x1575,0x1575,0x1575,0x1575,0x1575,0x1575,0x1575,0x1575,0x1575,0x1575,0x1575, +0x1575,0x1575,0x1575,0x1575,0x1575,0x1575,0x1575,0x1575,0x1575,0x1575,0x1575,0x1575,0x1575,0x1575,0x1575,0x1575, +0x1575,0x1575,0x1575,0x1575,0x1575,0x1575,0x1575,0x1575,0x1575,0x1575,0x1575,0x1575,0x1575,0x1575,0x1575,0x1575, +0x1575,0x1575,0x1575,0x1575,0x1575,0x1575,0x1575,0x1575,0x1575,0x1575,0x1575,0x1575,0x1575,0x1575,0x1575,0x1565, +0x157d,0x157d,0x157d,0x157d,0x157d,0x157d,0x157d,0x157d,0x157d,0x157d,0x157d,0x157d,0x157d,0x157d,0x157d,0x157d, +0x157d,0x157d,0x157d,0x157d,0x157d,0x157d,0x157d,0x157d,0x157d,0x157d,0x157d,0x157d,0x157d,0x157d,0x157d,0x157d, +0x157d,0x157d,0x157d,0x157d,0x157d,0x157d,0x157d,0x157d,0x157d,0x157d,0x157d,0x157d,0x157d,0x157d,0x157d,0x157d, +0x157d,0x157d,0x157d,0x157d,0x157d,0x157d,0x157d,0x157d,0x157d,0x157d,0x157d,0x157d,0x157d,0x157d,0x157d,0x156d, +0x1575,0x1575,0x1575,0x1575,0x1575,0x1575,0x1575,0x1575,0x1575,0x1575,0x1575,0x1575,0x1575,0x1575,0x1575,0x1575, +0x1575,0x1575,0x1575,0x1575,0x1575,0x1575,0x1575,0x1575,0x1575,0x1575,0x1575,0x1575,0x1575,0x1575,0x1575,0x1575, +0x1575,0x1575,0x1575,0x1575,0x1575,0x1575,0x1575,0x1575,0x1575,0x1575,0x1575,0x1575,0x1575,0x1575,0x1575,0x1575, +0x1575,0x1575,0x1575,0x1575,0x1575,0x1575,0x1575,0x1575,0x1575,0x1575,0x1575,0x1575,0x1575,0x1575,0x1575,0x1575, +0x157d,0x157d,0x157d,0x157d,0x157d,0x157d,0x157d,0x157d,0x157d,0x157d,0x157d,0x157d,0x157d,0x157d,0x157d,0x157d, +0x157d,0x157d,0x157d,0x157d,0x157d,0x157d,0x157d,0x157d,0x157d,0x157d,0x157d,0x157d,0x157d,0x157d,0x157d,0x157d, +0x157d,0x157d,0x157d,0x157d,0x157d,0x157d,0x157d,0x157d,0x157d,0x157d,0x157d,0x157d,0x157d,0x157d,0x157d,0x157d, +0x157d,0x157d,0x157d,0x157d,0x157d,0x157d,0x157d,0x157d,0x157d,0x157d,0x157d,0x157d,0x157d,0x157d,0x157d,0x157d, +0x16d2,0x16d2,0x16d2,0x16d2,0x16d2,0x16d2,0x16d2,0x16d2,0x16d2,0x16d2,0x16d2,0x16d2,0x16d2,0x16d2,0x16d2,0x16d2, +0x16d2,0x16d2,0x16d2,0x16d2,0x16d2,0x16d2,0x16d2,0x16d2,0x16d2,0x16d2,0x16d2,0x16d2,0x16d2,0x16d2,0x16d2,0x16d2, +0x16d2,0x16d2,0x16d2,0x16d2,0x16d2,0x16d2,0x16d2,0x16d2,0x16d2,0x16d2,0x16d2,0x16d2,0x16d2,0x16d2,0x16d2,0x16d2, +0x16d2,0x16d2,0x16d2,0x16d2,0x16d2,0x16d2,0x16d2,0x16d2,0x16d2,0x16d2,0x16d2,0x16d2,0x16d2,0x16d2,0x16d2,0x16d2, +0x19e7,0x19e7,0x19e7,0x19e7,0x19e7,0x19e7,0x19e7,0x19e7,0x19e7,0x19e7,0x19e7,0x19e7,0x19e7,0x19e7,0x19e7,0x19e7, +0x19e7,0x19e7,0x19e7,0x19e7,0x19e7,0x19e7,0x19e7,0x19e7,0x19e7,0x19e7,0x19e7,0x19e7,0x19e7,0x19e7,0x19e7,0x19e7, +0x19e7,0x19e7,0x19e7,0x19e7,0x19e7,0x19e7,0x19e7,0x19e7,0x19e7,0x19e7,0x19e7,0x19e7,0x19e7,0x19e7,0x19e7,0x19e7, +0x19e7,0x19e7,0x19e7,0x19e7,0x19e7,0x19e7,0x19e7,0x19e7,0x19e7,0x19e7,0x19e7,0x19e7,0x19e7,0x19e7,0x19e7,0x19e7, +0x1c24,0x1c24,0x1c24,0x1c24,0x1c24,0x1c24,0x1c24,0x1c24,0x1c24,0x1c24,0x1c24,0x1c24,0x1c24,0x1c24,0x1c24,0x1c24, +0x1c24,0x1c24,0x1c24,0x1c24,0x1c24,0x1c24,0x1c24,0x1c24,0x1c24,0x1c24,0x1c24,0x1c24,0x1c24,0x1c24,0x1c24,0x1c24, +0x1c24,0x1c24,0x1c24,0x1c24,0x1c24,0x1c24,0x1c24,0x1c24,0x1c24,0x1c24,0x1c24,0x1c24,0x1c24,0x1c24,0x1c24,0x1c24, +0x1c24,0x1c24,0x1c24,0x1c24,0x1c24,0x1c24,0x1c24,0x1c24,0x1c24,0x1c24,0x1c24,0x1c24,0x1c24,0x1c24,0x1c24,0x1c24, +0x1c4c,0x1c4c,0x1c4c,0x1c4c,0x1c4c,0x1c4c,0x1c4c,0x1c4c,0x1c4c,0x1c4c,0x1c4c,0x1c4c,0x1c4c,0x1c4c,0x1c4c,0x1c4c, +0x1c4c,0x1c4c,0x1c4c,0x1c4c,0x1c4c,0x1c4c,0x1c4c,0x1c4c,0x1c4c,0x1c4c,0x1c4c,0x1c4c,0x1c4c,0x1c4c,0x1c4c,0x1c4c, +0x1c4c,0x1c4c,0x1c4c,0x1c4c,0x1c4c,0x1c4c,0x1c4c,0x1c4c,0x1c4c,0x1c4c,0x1c4c,0x1c4c,0x1c4c,0x1c4c,0x1c4c,0x1c4c, +0x1c4c,0x1c4c,0x1c4c,0x1c4c,0x1c4c,0x1c4c,0x1c4c,0x1c4c,0x1c4c,0x1c4c,0x1c4c,0x1c4c,0x1c4c,0x1c4c,0x1c4c,0x1c4c, +0x1c7c,0x1c7c,0x1c7c,0x1c7c,0x1c7c,0x1c7c,0x1c7c,0x1c7c,0x1c7c,0x1c7c,0x1c7c,0x1c7c,0x1c7c,0x1c7c,0x1c7c,0x1c7c, +0x1c7c,0x1c7c,0x1c7c,0x1c7c,0x1c7c,0x1c7c,0x1c7c,0x1c7c,0x1c7c,0x1c7c,0x1c7c,0x1c7c,0x1c7c,0x1c7c,0x1c7c,0x1c7c, +0x1c7c,0x1c7c,0x1c7c,0x1c7c,0x1c7c,0x1c7c,0x1c7c,0x1c7c,0x1c7c,0x1c7c,0x1c7c,0x1c7c,0x1c7c,0x1c7c,0x1c7c,0x1c7c, +0x1c7c,0x1c7c,0x1c7c,0x1c7c,0x1c7c,0x1c7c,0x1c7c,0x1c7c,0x1c7c,0x1c7c,0x1c7c,0x1c7c,0x1c7c,0x1c7c,0x1c7c,0x1c7c, +0x282,0x282,0x282,0x282,0x282,0x282,0x282,0x282,0x282,0x285,0x28e,0x288,0x288,0x28b,0x282,0x282, +0x282,0x282,0x282,0x282,0x282,0x282,0x282,0x282,0x282,0x282,0x282,0x282,0x282,0x282,0x282,0x282, +0x7b3,0x7ad,0x792,0x789,0x780,0x77d,0x774,0x78f,0x77a,0x786,0x789,0x7a4,0x79b,0x78c,0x7b0,0x783, +0x771,0x771,0x771,0x771,0x771,0x771,0x771,0x771,0x771,0x771,0x798,0x795,0x79e,0x79e,0x79e,0x7ad, +0x774,0x7bf,0x7bf,0x7bf,0x7bf,0x7bf,0x7bf,0x7b9,0x7b9,0x7b9,0x7b9,0x7b9,0x7b9,0x7b9,0x7b9,0x7b9, +0x7b9,0x7b9,0x7b9,0x7b9,0x7b9,0x7b9,0x7b9,0x7b9,0x7b9,0x7b9,0x7b9,0x77a,0x780,0x786,0x7aa,0x76e, +0x7a7,0x7bc,0x7bc,0x7bc,0x7bc,0x7bc,0x7bc,0x7b6,0x7b6,0x7b6,0x7b6,0x7b6,0x7b6,0x7b6,0x7b6,0x7b6, +0x7b6,0x7b6,0x7b6,0x7b6,0x7b6,0x7b6,0x7b6,0x7b6,0x7b6,0x7b6,0x7b6,0x77a,0x7a1,0x777,0x79e,0x282, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0x282,0x282,0x282,0x282, -0x282,0x291,0x282,0x282,0x282,0x282,0x282,0x282,0x282,0x282,0x282,0x282,0x282,0x282,0x282,0x282, -0x282,0x282,0x282,0x282,0x282,0x282,0x282,0x282,0x282,0x282,0x282,0x282,0x285,0x5fa,0x7b6,0x7b9, -0x600,0x7b9,0x7b3,0x5f7,0x5ee,0x28b,0x60c,0x28e,0x7bc,0x5e5,0x603,0x7b0,0x5fd,0x609,0x5eb,0x5eb, -0x5f1,0x288,0x5f7,0x5f4,0x5ee,0x5eb,0x60c,0x28e,0x5e8,0x5e8,0x5e8,0x5fa,0x297,0x297,0x297,0x297, -0x297,0x297,0x615,0x297,0x297,0x297,0x297,0x297,0x297,0x297,0x297,0x297,0x615,0x297,0x297,0x297, -0x297,0x297,0x297,0x606,0x615,0x297,0x297,0x297,0x297,0x297,0x615,0x60f,0x612,0x612,0x294,0x294, -0x294,0x294,0x60f,0x294,0x612,0x612,0x612,0x294,0x612,0x612,0x294,0x294,0x60f,0x294,0x612,0x612, -0x294,0x294,0x294,0x606,0x60f,0x612,0x612,0x294,0x612,0x294,0x60f,0x294,0x2a3,0x61b,0x2a3,0x29a, -0x2a3,0x29a,0x2a3,0x29a,0x2a3,0x29a,0x2a3,0x29a,0x2a3,0x29a,0x2a3,0x29a,0x2a0,0x618,0x2a3,0x61b, -0x2a3,0x29a,0x2a3,0x29a,0x2a3,0x29a,0x2a3,0x61b,0x2a3,0x29a,0x2a3,0x29a,0x2a3,0x29a,0x2a3,0x29a, -0x2a3,0x29a,0x621,0x618,0x2a3,0x29a,0x2a3,0x61b,0x2a3,0x29a,0x2a3,0x29a,0x2a3,0x618,0x624,0x61e, -0x2a3,0x29a,0x2a3,0x29a,0x618,0x2a3,0x29a,0x2a3,0x29a,0x2a3,0x29a,0x624,0x61e,0x621,0x618,0x2a3, -0x61b,0x2a3,0x29a,0x2a3,0x61b,0x627,0x621,0x618,0x2a3,0x61b,0x2a3,0x29a,0x2a3,0x29a,0x621,0x618, -0x2a3,0x29a,0x2a3,0x29a,0x2a3,0x29a,0x2a3,0x29a,0x2a3,0x29a,0x2a3,0x29a,0x2a3,0x29a,0x2a3,0x29a, -0x2a3,0x29a,0x621,0x618,0x2a3,0x29a,0x2a3,0x61b,0x2a3,0x29a,0x2a3,0x29a,0x2a3,0x29a,0x2a3,0x29a, -0x2a3,0x29a,0x2a3,0x29a,0x2a3,0x2a3,0x29a,0x2a3,0x29a,0x2a3,0x29a,0x29d,0x2a6,0x2b2,0x2b2,0x2a6, -0x2b2,0x2a6,0x2b2,0x2b2,0x2a6,0x2b2,0x2b2,0x2b2,0x2a6,0x2a6,0x2b2,0x2b2,0x2b2,0x2b2,0x2a6,0x2b2, -0x2b2,0x2a6,0x2b2,0x2b2,0x2b2,0x2a6,0x2a6,0x2a6,0x2b2,0x2b2,0x2a6,0x2b2,0x2b5,0x2a9,0x2b2,0x2a6, -0x2b2,0x2a6,0x2b2,0x2b2,0x2a6,0x2b2,0x2a6,0x2a6,0x2b2,0x2a6,0x2b2,0x2b5,0x2a9,0x2b2,0x2b2,0x2b2, -0x2a6,0x2b2,0x2a6,0x2b2,0x2b2,0x2a6,0x2a6,0x2af,0x2b2,0x2a6,0x2a6,0x2a6,0x2af,0x2af,0x2af,0x2af, -0x2b8,0x2b8,0x2ac,0x2b8,0x2b8,0x2ac,0x2b8,0x2b8,0x2ac,0x2b5,0x62a,0x2b5,0x62a,0x2b5,0x62a,0x2b5, -0x62a,0x2b5,0x62a,0x2b5,0x62a,0x2b5,0x62a,0x2b5,0x62a,0x2a6,0x2b5,0x2a9,0x2b5,0x2a9,0x2b5,0x2a9, -0x2b2,0x2a6,0x2b5,0x2a9,0x2b5,0x2a9,0x2b5,0x2a9,0x2b5,0x2a9,0x2b5,0x2a9,0x2a9,0x2b8,0x2b8,0x2ac, -0x2b5,0x2a9,0x990,0x990,0x993,0x98d,0x2b5,0x2a9,0x2b5,0x2a9,0x2b5,0x2a9,0x2b5,0x2a9,0x2b5,0x2a9, -0x2b5,0x2a9,0x2b5,0x2a9,0x2b5,0x2a9,0x2b5,0x2a9,0x2b5,0x2a9,0x2b5,0x2a9,0x2b5,0x2a9,0x2b5,0x2a9, -0x993,0x98d,0x993,0x98d,0x990,0x98a,0x993,0x98d,0xb4f,0xc51,0x990,0x98a,0x990,0x98a,0x993,0x98d, -0x993,0x98d,0x993,0x98d,0x993,0x98d,0x993,0x98d,0x993,0x98d,0x993,0x98d,0xc51,0xc51,0xc51,0xd4a, -0xd4a,0xd4a,0xd4d,0xd4d,0xd4a,0xd4d,0xd4d,0xd4a,0xd4a,0xd4d,0xe8e,0xe91,0xe91,0xe91,0xe91,0xe8e, -0xe91,0xe8e,0xe91,0xe8e,0xe91,0xe8e,0xe91,0xe8e,0x2bb,0x62d,0x2bb,0x2bb,0x2bb,0x2bb,0x2bb,0x2bb, -0x2bb,0x2bb,0x2bb,0x2bb,0x2bb,0x2bb,0x2bb,0x2bb,0x2bb,0x62d,0x2bb,0x2bb,0x2bb,0x2bb,0x2bb,0x2bb, -0x2bb,0x2bb,0x2bb,0x2bb,0x2bb,0x2bb,0x2bb,0x2bb,0x2bb,0x2bb,0x2bb,0x2bb,0x2bb,0x2bb,0x2bb,0x2bb, -0x2bb,0x2bb,0x2bb,0x2bb,0x2bb,0x2bb,0x2bb,0x2bb,0x2be,0x2bb,0x2bb,0x2bb,0x2bb,0x2bb,0x2bb,0x2bb, -0x2bb,0x2bb,0x2bb,0x2bb,0x2bb,0x2bb,0x2bb,0x2bb,0x2bb,0x2bb,0x2bb,0x2bb,0x2bb,0x996,0x996,0x996, -0x996,0x996,0xc54,0xc54,0x2d6,0x2d6,0x2d6,0x2d6,0x2d6,0x2d6,0x2d6,0x2d6,0x2d6,0x2cd,0x2cd,0x2cd, -0x2cd,0x2cd,0x2cd,0x2cd,0x2ca,0x2ca,0x2c1,0x2c1,0x633,0x2c1,0x2cd,0x636,0x2d0,0x636,0x636,0x636, -0x2d0,0x636,0x2cd,0x2cd,0x639,0x2d3,0x2c1,0x2c1,0x2c1,0x2c1,0x2c1,0x2c7,0x630,0x630,0x630,0x630, -0x2c4,0x630,0x2c1,0xac8,0x2d6,0x2d6,0x2d6,0x2d6,0x2d6,0x2c1,0x2c1,0x2c1,0x2c1,0x2c1,0x99f,0x99f, -0x99c,0x999,0x99c,0xc57,0xc57,0xc57,0xc57,0xc57,0xc57,0xc57,0xc57,0xc57,0xc57,0xc57,0xc57,0xc57, -0xc57,0xc57,0xc57,0xc57,0x63c,0x63c,0x63c,0x63c,0x63c,0x63c,0x63c,0x63c,0x63c,0x63c,0x63c,0x63c, -0x63c,0x63c,0x63c,0x63c,0x63c,0x63c,0x63c,0x63c,0x63c,0x63c,0x63c,0x63c,0x63c,0x63c,0x63c,0x63c, -0x63c,0x63c,0x63c,0x63c,0x63c,0x63c,0x63c,0x63c,0x63c,0x63c,0x63c,0x63c,0x63c,0x63c,0x63c,0x63c, -0x63c,0x63c,0x63c,0x63c,0x63c,0x63c,0x63c,0x63c,0x63c,0x63c,0x63c,0x63c,0x63c,0x63c,0x63c,0x63c, -0x63c,0x63c,0x63c,0x63c,0x63f,0x63f,0x8f4,0x63f,0x63f,0x8f7,0xacb,0xacb,0xacb,0xacb,0xacb,0xacb, -0xacb,0xacb,0xacb,0xc09,0xd1a,0xd1a,0xd1a,0xd1a,0xd1a,0xd1a,0xd1a,0xd1a,0xe55,0xe55,0xe55,0xe55, -0xe58,0xd1d,0xd1d,0xd1d,0x642,0x642,0xace,0xc4e,0xc4e,0xc4e,0xc4e,0xc4e,0xc4e,0xc4e,0xc4e,0xc4e, -0xc4e,0xc4e,0xc4e,0xc4e,0xf3c,0xf39,0xf3c,0xf39,0x2e2,0x2eb,0xf3c,0xf39,9,9,0x2f1,0xe94, -0xe94,0xe94,0x2d9,0x1491,9,9,9,9,0x2ee,0x2dc,0x300,0x2df,0x300,0x300,0x300,9, -0x300,9,0x300,0x300,0x2f7,0x648,0x648,0x648,0x648,0x648,0x648,0x648,0x648,0x648,0x648,0x648, -0x648,0x648,0x648,0x648,0x648,0x648,9,0x648,0x648,0x648,0x648,0x648,0x648,0x648,0x300,0x300, -0x2f7,0x2f7,0x2f7,0x2f7,0x2f7,0x645,0x645,0x645,0x645,0x645,0x645,0x645,0x645,0x645,0x645,0x645, -0x645,0x645,0x645,0x645,0x645,0x645,0x2f4,0x645,0x645,0x645,0x645,0x645,0x645,0x645,0x2f7,0x2f7, -0x2f7,0x2f7,0x2f7,0xf3c,0x303,0x303,0x306,0x300,0x300,0x303,0x2fa,0x9a2,0xb58,0xb55,0x2fd,0x9a2, -0x2fd,0x9a2,0x2fd,0x9a2,0x2fd,0x9a2,0x2e8,0x2e5,0x2e8,0x2e5,0x2e8,0x2e5,0x2e8,0x2e5,0x2e8,0x2e5, -0x2e8,0x2e5,0x2e8,0x2e5,0x303,0x303,0x2fa,0x2f4,0xb07,0xb04,0xb52,0xc5d,0xc5a,0xc60,0xc5d,0xc5a, -0xd50,0xd53,0xd53,0xd53,0x9b1,0x654,0x312,0x315,0x312,0x312,0x312,0x315,0x312,0x312,0x312,0x312, -0x315,0x9b1,0x315,0x312,0x651,0x651,0x651,0x651,0x651,0x651,0x651,0x651,0x651,0x654,0x651,0x651, -0x651,0x651,0x651,0x651,0x651,0x651,0x651,0x651,0x651,0x651,0x651,0x651,0x651,0x651,0x651,0x651, -0x651,0x651,0x651,0x651,0x64b,0x64b,0x64b,0x64b,0x64b,0x64b,0x64b,0x64b,0x64b,0x64e,0x64b,0x64b, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0x291,0x291,0x291,0x291,0x291,0x2a0,0x291,0x291,0x291,0x291,0x291,0x291,0x291,0x291,0x291,0x291, +0x291,0x291,0x291,0x291,0x291,0x291,0x291,0x291,0x291,0x291,0x291,0x291,0x291,0x291,0x291,0x291, +0x294,0x609,0x7c8,0x7cb,0x60f,0x7cb,0x7c5,0x606,0x5fd,0x29a,0x61b,0x29d,0x7ce,0x5f4,0x612,0x7c2, +0x60c,0x618,0x5fa,0x5fa,0x600,0x297,0x606,0x603,0x5fd,0x5fa,0x61b,0x29d,0x5f7,0x5f7,0x5f7,0x609, +0x2a6,0x2a6,0x2a6,0x2a6,0x2a6,0x2a6,0x624,0x2a6,0x2a6,0x2a6,0x2a6,0x2a6,0x2a6,0x2a6,0x2a6,0x2a6, +0x624,0x2a6,0x2a6,0x2a6,0x2a6,0x2a6,0x2a6,0x615,0x624,0x2a6,0x2a6,0x2a6,0x2a6,0x2a6,0x624,0x61e, +0x621,0x621,0x2a3,0x2a3,0x2a3,0x2a3,0x61e,0x2a3,0x621,0x621,0x621,0x2a3,0x621,0x621,0x2a3,0x2a3, +0x61e,0x2a3,0x621,0x621,0x2a3,0x2a3,0x2a3,0x615,0x61e,0x621,0x621,0x2a3,0x621,0x2a3,0x61e,0x2a3, +0x2b2,0x62a,0x2b2,0x2a9,0x2b2,0x2a9,0x2b2,0x2a9,0x2b2,0x2a9,0x2b2,0x2a9,0x2b2,0x2a9,0x2b2,0x2a9, +0x2af,0x627,0x2b2,0x62a,0x2b2,0x2a9,0x2b2,0x2a9,0x2b2,0x2a9,0x2b2,0x62a,0x2b2,0x2a9,0x2b2,0x2a9, +0x2b2,0x2a9,0x2b2,0x2a9,0x2b2,0x2a9,0x630,0x627,0x2b2,0x2a9,0x2b2,0x62a,0x2b2,0x2a9,0x2b2,0x2a9, +0x2b2,0x627,0x633,0x62d,0x2b2,0x2a9,0x2b2,0x2a9,0x627,0x2b2,0x2a9,0x2b2,0x2a9,0x2b2,0x2a9,0x633, +0x62d,0x630,0x627,0x2b2,0x62a,0x2b2,0x2a9,0x2b2,0x62a,0x636,0x630,0x627,0x2b2,0x62a,0x2b2,0x2a9, +0x2b2,0x2a9,0x630,0x627,0x2b2,0x2a9,0x2b2,0x2a9,0x2b2,0x2a9,0x2b2,0x2a9,0x2b2,0x2a9,0x2b2,0x2a9, +0x2b2,0x2a9,0x2b2,0x2a9,0x2b2,0x2a9,0x630,0x627,0x2b2,0x2a9,0x2b2,0x62a,0x2b2,0x2a9,0x2b2,0x2a9, +0x2b2,0x2a9,0x2b2,0x2a9,0x2b2,0x2a9,0x2b2,0x2a9,0x2b2,0x2b2,0x2a9,0x2b2,0x2a9,0x2b2,0x2a9,0x2ac, +0x2b5,0x2c1,0x2c1,0x2b5,0x2c1,0x2b5,0x2c1,0x2c1,0x2b5,0x2c1,0x2c1,0x2c1,0x2b5,0x2b5,0x2c1,0x2c1, +0x2c1,0x2c1,0x2b5,0x2c1,0x2c1,0x2b5,0x2c1,0x2c1,0x2c1,0x2b5,0x2b5,0x2b5,0x2c1,0x2c1,0x2b5,0x2c1, +0x2c4,0x2b8,0x2c1,0x2b5,0x2c1,0x2b5,0x2c1,0x2c1,0x2b5,0x2c1,0x2b5,0x2b5,0x2c1,0x2b5,0x2c1,0x2c4, +0x2b8,0x2c1,0x2c1,0x2c1,0x2b5,0x2c1,0x2b5,0x2c1,0x2c1,0x2b5,0x2b5,0x2be,0x2c1,0x2b5,0x2b5,0x2b5, +0x2be,0x2be,0x2be,0x2be,0x2c7,0x2c7,0x2bb,0x2c7,0x2c7,0x2bb,0x2c7,0x2c7,0x2bb,0x2c4,0x639,0x2c4, +0x639,0x2c4,0x639,0x2c4,0x639,0x2c4,0x639,0x2c4,0x639,0x2c4,0x639,0x2c4,0x639,0x2b5,0x2c4,0x2b8, +0x2c4,0x2b8,0x2c4,0x2b8,0x2c1,0x2b5,0x2c4,0x2b8,0x2c4,0x2b8,0x2c4,0x2b8,0x2c4,0x2b8,0x2c4,0x2b8, +0x2b8,0x2c7,0x2c7,0x2bb,0x2c4,0x2b8,0x9a2,0x9a2,0x9a5,0x99f,0x2c4,0x2b8,0x2c4,0x2b8,0x2c4,0x2b8, +0x2c4,0x2b8,0x2c4,0x2b8,0x2c4,0x2b8,0x2c4,0x2b8,0x2c4,0x2b8,0x2c4,0x2b8,0x2c4,0x2b8,0x2c4,0x2b8, +0x2c4,0x2b8,0x2c4,0x2b8,0x9a5,0x99f,0x9a5,0x99f,0x9a2,0x99c,0x9a5,0x99f,0xb61,0xc63,0x9a2,0x99c, +0x9a2,0x99c,0x9a5,0x99f,0x9a5,0x99f,0x9a5,0x99f,0x9a5,0x99f,0x9a5,0x99f,0x9a5,0x99f,0x9a5,0x99f, +0xc63,0xc63,0xc63,0xd5c,0xd5c,0xd5c,0xd5f,0xd5f,0xd5c,0xd5f,0xd5f,0xd5c,0xd5c,0xd5f,0xea3,0xea6, +0xea6,0xea6,0xea6,0xea3,0xea6,0xea3,0xea6,0xea3,0xea6,0xea3,0xea6,0xea3,0x2ca,0x63c,0x2ca,0x2ca, +0x2ca,0x2ca,0x2ca,0x2ca,0x2ca,0x2ca,0x2ca,0x2ca,0x2ca,0x2ca,0x2ca,0x2ca,0x2ca,0x63c,0x2ca,0x2ca, +0x2ca,0x2ca,0x2ca,0x2ca,0x2ca,0x2ca,0x2ca,0x2ca,0x2ca,0x2ca,0x2ca,0x2ca,0x2ca,0x2ca,0x2ca,0x2ca, +0x2ca,0x2ca,0x2ca,0x2ca,0x2ca,0x2ca,0x2ca,0x2ca,0x2ca,0x2ca,0x2ca,0x2ca,0x2cd,0x2ca,0x2ca,0x2ca, +0x2ca,0x2ca,0x2ca,0x2ca,0x2ca,0x2ca,0x2ca,0x2ca,0x2ca,0x2ca,0x2ca,0x2ca,0x2ca,0x2ca,0x2ca,0x2ca, +0x2ca,0x9a8,0x9a8,0x9a8,0x9a8,0x9a8,0xc66,0xc66,0x2e5,0x2e5,0x2e5,0x2e5,0x2e5,0x2e5,0x2e5,0x2e5, +0x2e5,0x2dc,0x2dc,0x2dc,0x2dc,0x2dc,0x2dc,0x2dc,0x2d9,0x2d9,0x2d6,0x2d6,0x642,0x2d6,0x2dc,0x645, +0x2df,0x645,0x645,0x645,0x2df,0x645,0x2dc,0x2dc,0x648,0x2e2,0x2d6,0x2d6,0x2d6,0x2d6,0x2d6,0x2d6, +0x63f,0x63f,0x63f,0x63f,0x2d3,0x63f,0x2d6,0xada,0x2e5,0x2e5,0x2e5,0x2e5,0x2e5,0x2d0,0x2d0,0x2d0, +0x2d0,0x2d0,0x9b1,0x9b1,0x9ae,0x9ab,0x9ae,0xc69,0xc69,0xc69,0xc69,0xc69,0xc69,0xc69,0xc69,0xc69, +0xc69,0xc69,0xc69,0xc69,0xc69,0xc69,0xc69,0xc69,0x64b,0x64b,0x64b,0x64b,0x64b,0x64b,0x64b,0x64b, +0x64b,0x64b,0x64b,0x64b,0x64b,0x64b,0x64b,0x64b,0x64b,0x64b,0x64b,0x64b,0x64b,0x64b,0x64b,0x64b, 0x64b,0x64b,0x64b,0x64b,0x64b,0x64b,0x64b,0x64b,0x64b,0x64b,0x64b,0x64b,0x64b,0x64b,0x64b,0x64b, -0x9ab,0x64e,0x30c,0x30f,0x30c,0x30c,0x30c,0x30f,0x30c,0x30c,0x30c,0x30c,0x30f,0x9ab,0x30f,0x30c, -0x312,0x30c,0x312,0x30c,0x312,0x30c,0x312,0x30c,0x312,0x30c,0x312,0x30c,0x312,0x30c,0x312,0x30c, -0x312,0x30c,0x312,0x30c,0x312,0x30c,0x315,0x30f,0x312,0x30c,0x312,0x30c,0x312,0x30c,0x312,0x30c, -0x312,0x30c,0x309,0x900,0x903,0x8e5,0x8e5,0x10e6,0x9a5,0x9a5,0xb5e,0xb5b,0x9ae,0x9a8,0x9ae,0x9a8, -0x312,0x30c,0x312,0x30c,0x312,0x30c,0x312,0x30c,0x312,0x30c,0x312,0x30c,0x312,0x30c,0x312,0x30c, -0x312,0x30c,0x312,0x30c,0x312,0x30c,0x312,0x30c,0x312,0x30c,0x312,0x30c,0x312,0x30c,0x312,0x30c, -0x312,0x30c,0x312,0x30c,0x312,0x30c,0x312,0x30c,0x312,0x30c,0x312,0x30c,0x312,0x30c,0x312,0x30c, -0x312,0x315,0x30f,0x312,0x30c,0xb5e,0xb5b,0x312,0x30c,0xb5e,0xb5b,0x312,0x30c,0xb5e,0xb5b,0xe97, -0x315,0x30f,0x315,0x30f,0x312,0x30c,0x315,0x30f,0x312,0x30c,0x315,0x30f,0x315,0x30f,0x315,0x30f, -0x312,0x30c,0x315,0x30f,0x315,0x30f,0x315,0x30f,0x312,0x30c,0x315,0x30f,0x9b1,0x9ab,0x315,0x30f, -0x315,0x30f,0x315,0x30f,0x315,0x30f,0xd59,0xd56,0x315,0x30f,0xe9a,0xe97,0xe9a,0xe97,0xe9a,0xe97, -0xbca,0xbc7,0xbca,0xbc7,0xbca,0xbc7,0xbca,0xbc7,0xbca,0xbc7,0xbca,0xbc7,0xbca,0xbc7,0xbca,0xbc7, -0xec7,0xec4,0xec7,0xec4,0xfba,0xfb7,0xfba,0xfb7,0xfba,0xfb7,0xfba,0xfb7,0xfba,0xfb7,0xfba,0xfb7, -0xfba,0xfb7,0xfba,0xfb7,0x111f,0x111c,0x12f9,0x12f6,0x14ca,0x14c7,0x14ca,0x14c7,0x14ca,0x14c7,0x14ca,0x14c7, -0xc,0x324,0x324,0x324,0x324,0x324,0x324,0x324,0x324,0x324,0x324,0x324,0x324,0x324,0x324,0x324, -0x324,0x324,0x324,0x324,0x324,0x324,0x324,0x324,0x324,0x324,0x324,0xc,0xc,0x327,0x318,0x318, -0x318,0x31b,0x318,0x318,0xc,0x31e,0x31e,0x31e,0x31e,0x31e,0x31e,0x31e,0x31e,0x31e,0x31e,0x31e, -0x31e,0x31e,0x31e,0x31e,0x31e,0x31e,0x31e,0x31e,0x31e,0x31e,0x31e,0x31e,0x31e,0x31e,0x31e,0x31e, -0x31e,0x31e,0x31e,0x31e,0x31e,0x31e,0x31e,0x321,0xc,0x86a,0x9b4,0xc,0xc,0x1494,0x1494,0x13ad, -0xf,0x924,0x924,0x924,0x924,0x924,0x924,0x924,0x924,0x924,0x924,0x924,0x924,0x924,0x924,0x924, -0x924,0x924,0xd5c,0x924,0x924,0x924,0x924,0x924,0x924,0x924,0x924,0x924,0x924,0x924,0x924,0x924, -0x32a,0x32a,0x32a,0x32a,0x32a,0x32a,0x32a,0x32a,0x32a,0x32a,0xe9d,0x32a,0x32a,0x32a,0x336,0x32a, -0x32d,0x32a,0x32a,0x339,0x927,0xd5f,0xd62,0xd5f,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf, -0x33c,0x33c,0x33c,0x33c,0x33c,0x33c,0x33c,0x33c,0x33c,0x33c,0x33c,0x33c,0x33c,0x33c,0x33c,0x33c, -0x33c,0x33c,0x33c,0x33c,0x33c,0x33c,0x33c,0x33c,0x33c,0x33c,0x33c,0xf,0xf,0xf,0xf,0xf, -0x33c,0x33c,0x33c,0x333,0x330,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf, -0xc63,0xc63,0xc63,0xc63,0x13b0,0x1497,0xf45,0xf45,0xf45,0xf42,0xf42,0xd6b,0x870,0xc72,0xc6f,0xc6f, -0xc66,0xc66,0xc66,0xc66,0xc66,0xc66,0xf3f,0xf3f,0xf3f,0xf3f,0xf3f,0x86d,0x148b,0x12,0xd68,0x873, -0x12c0,0x357,0x35a,0x35a,0x35a,0x35a,0x35a,0x357,0x357,0x357,0x357,0x357,0x357,0x357,0x357,0x357, -0x357,0x357,0x357,0x357,0x357,0x357,0x357,0x357,0x357,0x357,0x357,0xf48,0xf48,0xf48,0xf48,0xf48, -0x876,0x357,0x357,0x357,0x357,0x357,0x357,0x357,0x357,0x357,0x357,0x8eb,0x8eb,0x8eb,0x8eb,0x8eb, -0x8eb,0x8eb,0x8eb,0xafe,0xafe,0xafe,0xc66,0xc6c,0xc69,0xd65,0xd65,0xd65,0xd65,0xd65,0xd65,0x12bd, -0x906,0x906,0x906,0x906,0x906,0x906,0x906,0x906,0x906,0x906,0x351,0x34e,0x34b,0x348,0xb61,0xb61, -0x8e8,0x357,0x357,0x363,0x357,0x35d,0x35d,0x35d,0x35d,0x357,0x357,0x357,0x357,0x357,0x357,0x357, -0x357,0x357,0x357,0x357,0x357,0x357,0x357,0x357,0x357,0x357,0x357,0x357,0x357,0x357,0x357,0x357, -0x357,0x357,0x357,0x357,0x357,0x357,0x357,0x357,0x357,0x357,0x357,0x357,0x357,0x357,0x357,0x357, -0x357,0x357,0x357,0x357,0x357,0x357,0x357,0x357,0x357,0x357,0x357,0x357,0x357,0x357,0x357,0x357, -0x357,0x357,0x357,0x357,0x9ba,0x9ba,0x357,0x357,0x357,0x357,0x357,0x9ba,0x35a,0x357,0x35a,0x357, -0x357,0x357,0x357,0x357,0x357,0x357,0x357,0x357,0x357,0x357,0x357,0x9ba,0x357,0x357,0x357,0x35a, -0x366,0x357,0x342,0x342,0x342,0x342,0x342,0x342,0x342,0x33f,0x348,0x345,0x345,0x342,0x342,0x342, -0x342,0x360,0x360,0x342,0x342,0x348,0x345,0x345,0x345,0x342,0xc75,0xc75,0x354,0x354,0x354,0x354, -0x354,0x354,0x354,0x354,0x354,0x354,0x9ba,0x9ba,0x9ba,0x9b7,0x9b7,0xc75,0x9d2,0x9d2,0x9d2,0x9cc, -0x9cc,0x9cc,0x9cc,0x9cc,0x9cc,0x9cc,0x9cc,0x9c9,0x9cc,0x9c9,0x15,0x9bd,0x9cf,0x9c0,0x9cf,0x9cf, -0x9cf,0x9cf,0x9cf,0x9cf,0x9cf,0x9cf,0x9cf,0x9cf,0x9cf,0x9cf,0x9cf,0x9cf,0x9cf,0x9cf,0x9cf,0x9cf, -0x9cf,0x9cf,0x9cf,0x9cf,0x9cf,0x9cf,0x9cf,0x9cf,0x9cf,0xc78,0xc78,0xc78,0x9c6,0x9c6,0x9c6,0x9c6, -0x9c6,0x9c6,0x9c6,0x9c6,0x9c6,0x9c6,0x9c6,0x9c6,0x9c6,0x9c6,0x9c6,0x9c6,0x9c3,0x9c3,0x9c3,0x9c3, -0x9c3,0x9c3,0x9c3,0x9c3,0x9c3,0x9c3,0x9c3,0x15,0x15,0xc78,0xc78,0xc78,0xdcb,0xdcb,0xdcb,0xdcb, -0xdcb,0xdcb,0xdcb,0xdcb,0xdcb,0xdcb,0xdcb,0xdcb,0xdcb,0xdcb,0xdcb,0xdcb,0xdcb,0xdcb,0xdcb,0xdcb, -0xdcb,0xdcb,0xdcb,0xdcb,0xdcb,0xdcb,0xdcb,0xdcb,0xdcb,0xdcb,0xfcc,0xfcc,0xfcc,0xfcc,0xfcc,0xfcc, -0xfcc,0xfcc,0xfcc,0xfcc,0xfcc,0xfcc,0xfcc,0xfcc,0xfcc,0xfcc,0xfcc,0xfcc,0x9d8,0x9d8,0x9d8,0x9d8, -0x9d8,0x9d8,0x9d8,0x9d8,0x9d8,0x9d8,0x9d8,0x9d8,0x9d8,0x9d8,0x9d8,0x9d8,0x9d8,0x9d8,0x9d8,0x9d8, -0x9d8,0x9d8,0x9d8,0x9d8,0x9d8,0x9d8,0x9d8,0x9d8,0x9d8,0x9d8,0x9d8,0x9d8,0x9d8,0x9d8,0x9d8,0x9d8, -0x9d8,0x9d8,0x9d5,0x9d5,0x9d5,0x9d5,0x9d5,0x9d5,0x9d5,0x9d5,0x9d5,0x9d5,0x9d5,0xb64,0x18,0x18, -0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0xedf,0xedf,0xedf,0xedf, -0xedf,0xedf,0xedf,0xedf,0xedf,0xedf,0xee2,0xee2,0xee2,0xee2,0xee2,0xee2,0xee2,0xee2,0xee2,0xee2, -0xee2,0xee2,0xee2,0xee2,0xee2,0xee2,0xee2,0xee2,0xee2,0xee2,0xee2,0xee2,0xee2,0xee2,0xee2,0xee2, -0xee2,0xee2,0xee2,0xee2,0xee2,0xee2,0xee2,0xed6,0xed6,0xed6,0xed6,0xed6,0xed6,0xed6,0xed6,0xed6, -0xee5,0xee5,0xed9,0xed9,0xedc,0xeeb,0xee8,0x111,0x111,0x111,0x111,0x111,0x17d3,0x17d3,0x17d3,0x17d3, -0x17d3,0x17d3,0x17d3,0x17d3,0x17d3,0x23d,0x23d,0x23d,0x23d,0x23d,0x23d,0x23d,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0xada,0xada,0xadd,0xadd, -0xada,0xada,0xada,0xada,0xada,0xada,0xada,0xada,0x75,0x75,0x75,0x75,0x1551,0x1551,0x1551,0x1551, -0x1cb,0x1cb,0x1cb,0x1cb,0x1cb,0x1cb,0x1cb,0x1cb,0x1cb,0x1cb,0x1cb,0x154e,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0x1fe,0x1fe,0x1fe,0x1fe, -0x1fe,0x1fe,0x1fe,0x160b,0x160b,0x160b,0x160b,0x160b,0x160b,0x160b,0x160b,0x160b,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0x20a,0x20a,0x20a,0x20a, -0x20a,0x20a,0x20a,0x20a,0x20a,0x1644,0x1644,0x1644,0x1644,0x1644,0x1644,0x1644,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0x120f,0x120f,0x120f,0x120f, -0x120f,0x120f,0x120f,0x120f,0x120f,0x17d,0x17d,0x17d,0x17d,0x17d,0x17d,0x17d,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0x1e0,0x1e0,0x1e0,0x1e0, -0x1e0,0x1e0,0x1e0,0x1e0,0x1e0,0x1e0,0x1e0,0x1e0,0x1e0,0x1e0,0x1e0,0x1e0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0x1467,0x1467,0x1467,0x1467, -0x1467,0x1467,0x1467,0x1467,0x1467,0x1467,0x1c5,0x1c5,0x1c5,0x1c5,0x1c5,0x1c5,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0x173d,0x173d,0x173d,0x173d, -0x225,0x225,0x225,0x225,0x225,0x225,0x225,0x225,0x225,0x225,0x225,0x225,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0x1233,0x1233,0x1233,0x1233, -0x1233,0x1233,0x1233,0x1233,0x1233,0x1233,0x1233,0x1233,0x1233,0x1233,0x1233,0x186,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0x15f6,0x15f6,0x15f6,0x15f6, -0x15f6,0x15f6,0x15f6,0x15f6,0x15f6,0x15f6,0x1f8,0x1f8,0x1f8,0x1f8,0x15fc,0x15fc,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0x1548,0x1548,0x1548,0x1548, -0x1548,0x1548,0x1548,0x1548,0x1548,0x1548,0x1548,0x1548,0x1548,0x1548,0x1548,0x1548,0x1632,0x1632,0x1632,0x1632, -0x1632,0x1632,0x1632,0x1632,0x1632,0x1632,0x1632,0x1632,0x1632,0x1632,0x1632,0x1632,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0x16aa,0x16aa,0x16aa,0x16aa, -0x20d,0x20d,0x20d,0x20d,0x20d,0x20d,0x20d,0x20d,0x20d,0x20d,0x20d,0x20d,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0xdc2,0xdc2,0xdbf,0xdbf, -0xdbf,0xdc2,0xde,0xde,0xde,0xde,0xde,0xde,0xde,0xde,0xde,0xde,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0x234,0x1755,0x1755,0x1755, -0x1755,0x1755,0x1755,0x1755,0x1755,0x1755,0x1755,0x1755,0x1755,0x1755,0x1755,0x1755,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0x17d6,0x17d6,0x240,0x17d6, -0x17d6,0x240,0x17d6,0x17d6,0x17d6,0x17d6,0x17d6,0x240,0x240,0x240,0x240,0x240,0,0,0,0, +0x64b,0x64b,0x64b,0x64b,0x64b,0x64b,0x64b,0x64b,0x64b,0x64b,0x64b,0x64b,0x64b,0x64b,0x64b,0x64b, +0x64b,0x64b,0x64b,0x64b,0x64b,0x64b,0x64b,0x64b,0x64e,0x64e,0x906,0x64e,0x64e,0x909,0xadd,0xadd, +0xadd,0xadd,0xadd,0xadd,0xadd,0xadd,0xadd,0xc1b,0xd2c,0xd2c,0xd2c,0xd2c,0xd2c,0xd2c,0xd2c,0xd2c, +0xe6a,0xe6a,0xe6a,0xe6a,0xe6d,0xd2f,0xd2f,0xd2f,0x651,0x651,0xae0,0xc60,0xc60,0xc60,0xc60,0xc60, +0xc60,0xc60,0xc60,0xc60,0xc60,0xc60,0xc60,0xc60,0xf51,0xf4e,0xf51,0xf4e,0x2f1,0x2fa,0xf51,0xf4e, +9,9,0x300,0xea9,0xea9,0xea9,0x2e8,0x14a6,9,9,9,9,0x2fd,0x2eb,0x30f,0x2ee, +0x30f,0x30f,0x30f,9,0x30f,9,0x30f,0x30f,0x306,0x657,0x657,0x657,0x657,0x657,0x657,0x657, +0x657,0x657,0x657,0x657,0x657,0x657,0x657,0x657,0x657,0x657,9,0x657,0x657,0x657,0x657,0x657, +0x657,0x657,0x30f,0x30f,0x306,0x306,0x306,0x306,0x306,0x654,0x654,0x654,0x654,0x654,0x654,0x654, +0x654,0x654,0x654,0x654,0x654,0x654,0x654,0x654,0x654,0x654,0x303,0x654,0x654,0x654,0x654,0x654, +0x654,0x654,0x306,0x306,0x306,0x306,0x306,0xf51,0x312,0x312,0x315,0x30f,0x30f,0x312,0x309,0x9b4, +0xb6a,0xb67,0x30c,0x9b4,0x30c,0x9b4,0x30c,0x9b4,0x30c,0x9b4,0x2f7,0x2f4,0x2f7,0x2f4,0x2f7,0x2f4, +0x2f7,0x2f4,0x2f7,0x2f4,0x2f7,0x2f4,0x2f7,0x2f4,0x312,0x312,0x309,0x303,0xb19,0xb16,0xb64,0xc6f, +0xc6c,0xc72,0xc6f,0xc6c,0xd62,0xd65,0xd65,0xd65,0x9c3,0x663,0x321,0x324,0x321,0x321,0x321,0x324, +0x321,0x321,0x321,0x321,0x324,0x9c3,0x324,0x321,0x660,0x660,0x660,0x660,0x660,0x660,0x660,0x660, +0x660,0x663,0x660,0x660,0x660,0x660,0x660,0x660,0x660,0x660,0x660,0x660,0x660,0x660,0x660,0x660, +0x660,0x660,0x660,0x660,0x660,0x660,0x660,0x660,0x65a,0x65a,0x65a,0x65a,0x65a,0x65a,0x65a,0x65a, +0x65a,0x65d,0x65a,0x65a,0x65a,0x65a,0x65a,0x65a,0x65a,0x65a,0x65a,0x65a,0x65a,0x65a,0x65a,0x65a, +0x65a,0x65a,0x65a,0x65a,0x9bd,0x65d,0x31b,0x31e,0x31b,0x31b,0x31b,0x31e,0x31b,0x31b,0x31b,0x31b, +0x31e,0x9bd,0x31e,0x31b,0x321,0x31b,0x321,0x31b,0x321,0x31b,0x321,0x31b,0x321,0x31b,0x321,0x31b, +0x321,0x31b,0x321,0x31b,0x321,0x31b,0x321,0x31b,0x321,0x31b,0x324,0x31e,0x321,0x31b,0x321,0x31b, +0x321,0x31b,0x321,0x31b,0x321,0x31b,0x318,0x912,0x915,0x8f7,0x8f7,0x10fb,0x9b7,0x9b7,0xb70,0xb6d, +0x9c0,0x9ba,0x9c0,0x9ba,0x321,0x31b,0x321,0x31b,0x321,0x31b,0x321,0x31b,0x321,0x31b,0x321,0x31b, +0x321,0x31b,0x321,0x31b,0x321,0x31b,0x321,0x31b,0x321,0x31b,0x321,0x31b,0x321,0x31b,0x321,0x31b, +0x321,0x31b,0x321,0x31b,0x321,0x31b,0x321,0x31b,0x321,0x31b,0x321,0x31b,0x321,0x31b,0x321,0x31b, +0x321,0x31b,0x321,0x31b,0x321,0x324,0x31e,0x321,0x31b,0xb70,0xb6d,0x321,0x31b,0xb70,0xb6d,0x321, +0x31b,0xb70,0xb6d,0xeac,0x324,0x31e,0x324,0x31e,0x321,0x31b,0x324,0x31e,0x321,0x31b,0x324,0x31e, +0x324,0x31e,0x324,0x31e,0x321,0x31b,0x324,0x31e,0x324,0x31e,0x324,0x31e,0x321,0x31b,0x324,0x31e, +0x9c3,0x9bd,0x324,0x31e,0x324,0x31e,0x324,0x31e,0x324,0x31e,0xd6b,0xd68,0x324,0x31e,0xeaf,0xeac, +0xeaf,0xeac,0xeaf,0xeac,0xbdc,0xbd9,0xbdc,0xbd9,0xbdc,0xbd9,0xbdc,0xbd9,0xbdc,0xbd9,0xbdc,0xbd9, +0xbdc,0xbd9,0xbdc,0xbd9,0xedc,0xed9,0xedc,0xed9,0xfcf,0xfcc,0xfcf,0xfcc,0xfcf,0xfcc,0xfcf,0xfcc, +0xfcf,0xfcc,0xfcf,0xfcc,0xfcf,0xfcc,0xfcf,0xfcc,0x1134,0x1131,0x130e,0x130b,0x14df,0x14dc,0x14df,0x14dc, +0x14df,0x14dc,0x14df,0x14dc,0xc,0x333,0x333,0x333,0x333,0x333,0x333,0x333,0x333,0x333,0x333,0x333, +0x333,0x333,0x333,0x333,0x333,0x333,0x333,0x333,0x333,0x333,0x333,0x333,0x333,0x333,0x333,0xc, +0xc,0x336,0x327,0x327,0x327,0x32a,0x327,0x327,0xc,0x32d,0x32d,0x32d,0x32d,0x32d,0x32d,0x32d, +0x32d,0x32d,0x32d,0x32d,0x32d,0x32d,0x32d,0x32d,0x32d,0x32d,0x32d,0x32d,0x32d,0x32d,0x32d,0x32d, +0x32d,0x32d,0x32d,0x32d,0x32d,0x32d,0x32d,0x32d,0x32d,0x32d,0x32d,0x330,0xc,0x87c,0x9c6,0xc, +0xc,0x14a9,0x14a9,0x13c2,0xf,0x936,0x936,0x936,0x936,0x936,0x936,0x936,0x936,0x936,0x936,0x936, +0x936,0x936,0x936,0x936,0x936,0x936,0xd6e,0x936,0x936,0x936,0x936,0x936,0x936,0x936,0x936,0x936, +0x936,0x936,0x936,0x936,0x339,0x339,0x339,0x339,0x339,0x339,0x339,0x339,0x339,0x339,0xeb2,0x339, +0x339,0x339,0x345,0x339,0x33c,0x339,0x339,0x348,0x939,0xd71,0xd74,0xd71,0xf,0xf,0xf,0xf, +0xf,0xf,0xf,0xf,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b, +0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0xf, +0xf,0xf,0xf,0xf,0x34b,0x34b,0x34b,0x342,0x33f,0xf,0xf,0xf,0xf,0xf,0xf,0xf, +0xf,0xf,0xf,0xf,0xc87,0xc87,0xc87,0xc87,0x13c5,0x14ac,0xf5a,0xf5a,0xf5a,0xf57,0xf57,0xd7d, +0x882,0xc81,0xc7e,0xc7e,0xc75,0xc75,0xc75,0xc75,0xc75,0xc75,0xf54,0xf54,0xf54,0xf54,0xf54,0x87f, +0x14a3,0x12,0xd7a,0x885,0x12d5,0x366,0x369,0x369,0x369,0x369,0x369,0x366,0x366,0x366,0x366,0x366, +0x366,0x366,0x366,0x366,0x366,0x366,0x366,0x366,0x366,0x366,0x366,0x366,0x366,0x366,0x366,0xf5d, +0xf5d,0xf5d,0xf5d,0xf5d,0x888,0x366,0x366,0x366,0x366,0x366,0x366,0x366,0x366,0x366,0x366,0x8fd, +0x8fd,0x8fd,0x8fd,0x8fd,0x8fd,0x8fd,0x8fd,0xb10,0xb10,0xb10,0xc75,0xc7b,0xc78,0xd77,0xd77,0xd77, +0xd77,0xd77,0xd77,0x12d2,0x918,0x918,0x918,0x918,0x918,0x918,0x918,0x918,0x918,0x918,0x360,0x35d, +0x35a,0x357,0xb73,0xb73,0x8fa,0x366,0x366,0x372,0x366,0x36c,0x36c,0x36c,0x36c,0x366,0x366,0x366, +0x366,0x366,0x366,0x366,0x366,0x366,0x366,0x366,0x366,0x366,0x366,0x366,0x366,0x366,0x366,0x366, +0x366,0x366,0x366,0x366,0x366,0x366,0x366,0x366,0x366,0x366,0x366,0x366,0x366,0x366,0x366,0x366, +0x366,0x366,0x366,0x366,0x366,0x366,0x366,0x366,0x366,0x366,0x366,0x366,0x366,0x366,0x366,0x366, +0x366,0x366,0x366,0x366,0x366,0x366,0x366,0x366,0x9cc,0x9cc,0x366,0x366,0x366,0x366,0x366,0x9cc, +0x369,0x366,0x369,0x366,0x366,0x366,0x366,0x366,0x366,0x366,0x366,0x366,0x366,0x366,0x366,0x9cc, +0x366,0x366,0x366,0x369,0x375,0x366,0x351,0x351,0x351,0x351,0x351,0x351,0x351,0x34e,0x357,0x354, +0x354,0x351,0x351,0x351,0x351,0x36f,0x36f,0x351,0x351,0x357,0x354,0x354,0x354,0x351,0xc84,0xc84, +0x363,0x363,0x363,0x363,0x363,0x363,0x363,0x363,0x363,0x363,0x9cc,0x9cc,0x9cc,0x9c9,0x9c9,0xc84, +0x9e1,0x9e1,0x9e1,0x9db,0x9db,0x9db,0x9db,0x9db,0x9db,0x9db,0x9db,0x9d8,0x9db,0x9d8,0x15,0x9e4, +0x9de,0x9cf,0x9de,0x9de,0x9de,0x9de,0x9de,0x9de,0x9de,0x9de,0x9de,0x9de,0x9de,0x9de,0x9de,0x9de, +0x9de,0x9de,0x9de,0x9de,0x9de,0x9de,0x9de,0x9de,0x9de,0x9de,0x9de,0x9de,0x9de,0xc8a,0xc8a,0xc8a, +0x9d5,0x9d5,0x9d5,0x9d5,0x9d5,0x9d5,0x9d5,0x9d5,0x9d5,0x9d5,0x9d5,0x9d5,0x9d5,0x9d5,0x9d5,0x9d5, +0x9d2,0x9d2,0x9d2,0x9d2,0x9d2,0x9d2,0x9d2,0x9d2,0x9d2,0x9d2,0x9d2,0x15,0x15,0xc8a,0xc8a,0xc8a, +0xde0,0xde0,0xde0,0xde0,0xde0,0xde0,0xde0,0xde0,0xde0,0xde0,0xde0,0xde0,0xde0,0xde0,0xde0,0xde0, +0xde0,0xde0,0xde0,0xde0,0xde0,0xde0,0xde0,0xde0,0xde0,0xde0,0xde0,0xde0,0xde0,0xde0,0xfe1,0xfe1, +0xfe1,0xfe1,0xfe1,0xfe1,0xfe1,0xfe1,0xfe1,0xfe1,0xfe1,0xfe1,0xfe1,0xfe1,0xfe1,0xfe1,0xfe1,0xfe1, +0x9ea,0x9ea,0x9ea,0x9ea,0x9ea,0x9ea,0x9ea,0x9ea,0x9ea,0x9ea,0x9ea,0x9ea,0x9ea,0x9ea,0x9ea,0x9ea, +0x9ea,0x9ea,0x9ea,0x9ea,0x9ea,0x9ea,0x9ea,0x9ea,0x9ea,0x9ea,0x9ea,0x9ea,0x9ea,0x9ea,0x9ea,0x9ea, +0x9ea,0x9ea,0x9ea,0x9ea,0x9ea,0x9ea,0x9e7,0x9e7,0x9e7,0x9e7,0x9e7,0x9e7,0x9e7,0x9e7,0x9e7,0x9e7, +0x9e7,0xb76,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18, +0xef4,0xef4,0xef4,0xef4,0xef4,0xef4,0xef4,0xef4,0xef4,0xef4,0xef7,0xef7,0xef7,0xef7,0xef7,0xef7, +0xef7,0xef7,0xef7,0xef7,0xef7,0xef7,0xef7,0xef7,0xef7,0xef7,0xef7,0xef7,0xef7,0xef7,0xef7,0xef7, +0xef7,0xef7,0xef7,0xef7,0xef7,0xef7,0xef7,0xef7,0xef7,0xef7,0xef7,0xeeb,0xeeb,0xeeb,0xeeb,0xeeb, +0xeeb,0xeeb,0xeeb,0xeeb,0xefa,0xefa,0xeee,0xeee,0xef1,0xf00,0xefd,0x10e,0x10e,0x10e,0x10e,0x10e, +0x18a2,0x18a2,0x18a2,0x18a2,0x18a2,0x18a2,0x18a2,0x18a2,0x18a2,0x18a2,0x18a2,0x25e,0x25e,0x25e,0x25e,0x25e, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0x17e8,0x17e8,0x17e8,0x17e8,0x17e8,0x17e8,0x17e8,0x17e8,0x17e8,0x237,0x237,0x237,0x237,0x237,0x237,0x237, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0xaec,0xaec,0xaef,0xaef,0xaec,0xaec,0xaec,0xaec,0xaec,0xaec,0xaec,0xaec,0x72,0x72,0x72,0x72, +0x1563,0x1563,0x1563,0x1563,0x1c5,0x1c5,0x1c5,0x1c5,0x1c5,0x1c5,0x1c5,0x1c5,0x1c5,0x1c5,0x1c5,0x1560, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0x1f8,0x1f8,0x1f8,0x1f8,0x1f8,0x1f8,0x1f8,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0x204,0x204,0x204,0x204,0x204,0x204,0x204,0x204,0x204,0x1656,0x1656,0x1656,0x1656,0x1656,0x1656,0x1656, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0x1224,0x1224,0x1224,0x1224,0x1224,0x1224,0x1224,0x1224,0x1224,0x17a,0x17a,0x17a,0x17a,0x17a,0x17a,0x17a, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0x1da,0x1da,0x1da,0x1da,0x1da,0x1da,0x1da,0x1da,0x1da,0x1da,0x1da,0x1da,0x1da,0x1da,0x1da,0x1da, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0x147c,0x147c,0x147c,0x147c,0x147c,0x147c,0x147c,0x147c,0x147c,0x147c,0x1bf,0x1bf,0x1bf,0x1bf,0x1bf,0x1bf, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0x1890,0x1893,0x1893,0x25b,0x25b,0x25b,0x25b,0x25b,0x25b,0x25b,0x25b,0x25b,0x25b,0x25b,0x25b,0x25b, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0x1752,0x1752,0x1752,0x1752,0x21f,0x21f,0x21f,0x21f,0x21f,0x21f,0x21f,0x21f,0x21f,0x21f,0x21f,0x21f, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0x1248,0x1248,0x1248,0x1248,0x1248,0x1248,0x1248,0x1248,0x1248,0x1248,0x1248,0x1248,0x1248,0x1248,0x1248,0x183, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0x1608,0x1608,0x1608,0x1608,0x1608,0x1608,0x1608,0x1608,0x1608,0x1608,0x1f2,0x1f2,0x1f2,0x1f2,0x160e,0x160e, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0x155a,0x155a,0x155a,0x155a,0x155a,0x155a,0x155a,0x155a,0x155a,0x155a,0x155a,0x155a,0x155a,0x155a,0x155a,0x155a, +0x1644,0x1644,0x1644,0x1644,0x1644,0x1644,0x1644,0x1644,0x1644,0x1644,0x1644,0x1644,0x1644,0x1644,0x1644,0x1644, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0x252,0x252,0x252,0x252,0x252,0x252,0x252,0x252,0x252,0x252,0x252,0x252,0x252,0x252,0x252,0x252, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0x18e1,0x18e1,0x18e1,0x18e1,0x18e1,0x18e1,0x18e1,0x18e1,0x18e1,0x18e1,0x18e1,0x18e1,0x18e1,0x18e1,0x18e1,0x18e1, +0x16bc,0x16bc,0x16bc,0x16bc,0x207,0x207,0x207,0x207,0x207,0x207,0x207,0x207,0x207,0x207,0x207,0x207, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0xdd7,0xdd7,0xdd4,0xdd4,0xdd4,0xdd7,0xdb,0xdb,0xdb,0xdb,0xdb,0xdb,0xdb,0xdb,0xdb,0xdb, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0x22e,0x176a,0x176a,0x176a,0x176a,0x176a,0x176a,0x176a,0x176a,0x176a,0x176a,0x176a,0x176a,0x176a,0x176a,0x176a, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0x921,0x921,3,3,3,3, +0x17eb,0x17eb,0x23a,0x17eb,0x17eb,0x23a,0x17eb,0x17eb,0x17eb,0x17eb,0x17eb,0x23a,0x23a,0x23a,0x23a,0x23a, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0x933,0x933, 3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3, -3,3,3,3,3,3,3,3,3,3,3,3,3,3,0x921,0x921, -6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6, -6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6, -0xd23,0xd23,0xd23,0xd23,0xd23,0xd23,0xd23,0xd23,0xd23,0xd23,0xd23,0xd23,0xd23,0xd23,0xd23,0xd23, +3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3, +3,3,0x933,0x933,6,6,6,6,6,6,6,6,6,6,6,6, 6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6, -0x149d,0x37e,0x38d,0x38d,0x1b,0x393,0x393,0x393,0x393,0x393,0x393,0x393,0x393,0x1b,0x1b,0x393, -0x393,0x1b,0x1b,0x393,0x393,0x393,0x393,0x393,0x393,0x393,0x393,0x393,0x393,0x393,0x393,0x393, -0x393,0x1b,0x393,0x393,0x393,0x393,0x393,0x393,0x393,0x1b,0x393,0x1b,0x1b,0x1b,0x393,0x393, -0x393,0x393,0x1b,0x1b,0x381,0xc7e,0x37e,0x38d,0x38d,0x37e,0x37e,0x37e,0x37e,0x1b,0x1b,0x38d, -0x38d,0x1b,0x1b,0x390,0x390,0x384,0xd71,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x37e, -0x1b,0x1b,0x1b,0x1b,0x396,0x396,0x1b,0x396,0x393,0x393,0x37e,0x37e,0x1b,0x1b,0x90c,0x90c, -0x90c,0x90c,0x90c,0x90c,0x90c,0x90c,0x90c,0x90c,0x393,0x393,0x38a,0x38a,0x387,0x387,0x387,0x387, -0x387,0x38a,0x387,0x10f5,0x1b,0x1b,0x1b,0x1b,0x1e,0xc81,0x399,0xc84,0x1e,0x3a5,0x3a5,0x3a5, -0x3a5,0x3a5,0x3a5,0x1e,0x1e,0x1e,0x1e,0x3a5,0x3a5,0x1e,0x1e,0x3a5,0x3a5,0x3a5,0x3a5,0x3a5, -0x3a5,0x3a5,0x3a5,0x3a5,0x3a5,0x3a5,0x3a5,0x3a5,0x3a5,0x1e,0x3a5,0x3a5,0x3a5,0x3a5,0x3a5,0x3a5, -0x3a5,0x1e,0x3a5,0x3a8,0x1e,0x3a5,0x3a8,0x1e,0x3a5,0x3a5,0x1e,0x1e,0x39c,0x1e,0x3a2,0x3a2, -0x3a2,0x399,0x399,0x1e,0x1e,0x1e,0x1e,0x399,0x399,0x1e,0x1e,0x399,0x399,0x39f,0x1e,0x1e, -0x1e,0xf51,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x3a8,0x3a8,0x3a8,0x3a5,0x1e,0x3a8,0x1e, -0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x90f,0x90f,0x90f,0x90f,0x90f,0x90f,0x90f,0x90f,0x90f,0x90f, -0x399,0x399,0x3a5,0x3a5,0x3a5,0xf51,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e, -0x21,0x3ab,0x3ab,0x3b4,0x21,0x3b7,0x3b7,0x3b7,0x3b7,0x3b7,0x3b7,0x3b7,0xc8d,0x3b7,0x21,0x3b7, -0x3b7,0x3b7,0x21,0x3b7,0x3b7,0x3b7,0x3b7,0x3b7,0x3b7,0x3b7,0x3b7,0x3b7,0x3b7,0x3b7,0x3b7,0x3b7, -0x3b7,0x21,0x3b7,0x3b7,0x3b7,0x3b7,0x3b7,0x3b7,0x3b7,0x21,0x3b7,0x3b7,0x21,0x3b7,0x3b7,0x3b7, -0x3b7,0x3b7,0x21,0x21,0x3ae,0x3b7,0x3b4,0x3b4,0x3b4,0x3ab,0x3ab,0x3ab,0x3ab,0x3ab,0x21,0x3ab, -0x3ab,0x3b4,0x21,0x3b4,0x3b4,0x3b1,0x21,0x21,0x3b7,0x21,0x21,0x21,0x21,0x21,0x21,0x21, -0x21,0x21,0x21,0x21,0x21,0x21,0x21,0x21,0x3b7,0xc8d,0xc87,0xc87,0x21,0x21,0x912,0x912, -0x912,0x912,0x912,0x912,0x912,0x912,0x912,0x912,0x13b3,0xc8a,0x21,0x21,0x21,0x21,0x21,0x21, -0x21,0x16b9,0x21,0x21,0x21,0x21,0x21,0x21,0x24,0x3ba,0x3c9,0x3c9,0x24,0x3cf,0x3cf,0x3cf, -0x3cf,0x3cf,0x3cf,0x3cf,0x3cf,0x24,0x24,0x3cf,0x3cf,0x24,0x24,0x3cf,0x3cf,0x3cf,0x3cf,0x3cf, -0x3cf,0x3cf,0x3cf,0x3cf,0x3cf,0x3cf,0x3cf,0x3cf,0x3cf,0x24,0x3cf,0x3cf,0x3cf,0x3cf,0x3cf,0x3cf, -0x3cf,0x24,0x3cf,0x3cf,0x24,0xc90,0x3cf,0x3cf,0x3cf,0x3cf,0x24,0x24,0x3bd,0x3cf,0x3ba,0x3ba, -0x3c9,0x3ba,0x3ba,0x3ba,0xf54,0x24,0x24,0x3c9,0x3cc,0x24,0x24,0x3cc,0x3cc,0x3c0,0x24,0x24, -0x24,0x24,0x24,0x24,0x24,0x24,0x3ba,0x3ba,0x24,0x24,0x24,0x24,0x3d2,0x3d2,0x24,0x3cf, -0x3cf,0x3cf,0xf54,0xf54,0x24,0x24,0x3c6,0x3c6,0x3c6,0x3c6,0x3c6,0x3c6,0x3c6,0x3c6,0x3c6,0x3c6, -0x3c3,0xc90,0x12cc,0x12cc,0x12cc,0x12cc,0x12cc,0x12cc,0x24,0x24,0x24,0x24,0x24,0x24,0x24,0x24, -0x27,0x27,0x3d5,0x3e1,0x27,0x3e1,0x3e1,0x3e1,0x3e1,0x3e1,0x3e1,0x27,0x27,0x27,0x3e1,0x3e1, -0x3e1,0x27,0x3e1,0x3e1,0x3e4,0x3e1,0x27,0x27,0x27,0x3e1,0x3e1,0x27,0x3e1,0x27,0x3e1,0x3e1, -0x27,0x27,0x27,0x3e1,0x3e1,0x27,0x27,0x27,0x3e1,0x3e1,0x91b,0x27,0x27,0x27,0x3e1,0x3e1, -0x3e1,0x3e1,0x3e1,0x3e1,0x3e1,0x91b,0xd74,0x3e1,0x3e1,0x3e1,0x27,0x27,0x27,0x27,0x3d5,0x3db, -0x3d5,0x3db,0x3db,0x27,0x27,0x27,0x3db,0x3db,0x3db,0x27,0x3de,0x3de,0x3de,0x3d8,0x27,0x27, -0xf57,0x27,0x27,0x27,0x27,0x27,0x27,0x3d5,0x27,0x27,0x27,0x27,0x27,0x27,0x27,0x27, -0x27,0x27,0xe8b,0x918,0x918,0x918,0x918,0x918,0x918,0x918,0x918,0x918,0x915,0x915,0x915,0xc93, -0xc93,0xc93,0xc93,0xc93,0xc93,0xc96,0xc93,0x27,0x27,0x27,0x27,0x27,0x14a0,0x3f3,0x3f3,0x3f3, -0x2a,0x3f6,0x3f6,0x3f6,0x3f6,0x3f6,0x3f6,0x3f6,0x3f6,0x2a,0x3f6,0x3f6,0x3f6,0x2a,0x3f6,0x3f6, -0x3f6,0x3f6,0x3f6,0x3f6,0x3f6,0x3f6,0x3f6,0x3f6,0x3f6,0x3f6,0x3f6,0x3f6,0x3f6,0x2a,0x3f6,0x3f6, -0x3f6,0x3f6,0x3f6,0x3f6,0x3f6,0x3f6,0x3f6,0x3f6,0x14a3,0x3f6,0x3f6,0x3f6,0x3f6,0x3f6,0x2a,0x2a, -0x2a,0xf60,0x3e7,0x3e7,0x3e7,0x3f3,0x3f3,0x3f3,0x3f3,0x2a,0x3e7,0x3e7,0x3ea,0x2a,0x3e7,0x3e7, -0x3e7,0x3ed,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x3e7,0x3e7,0x2a,0xf60,0xf60,0x16bc,0x2a, -0x2a,0x2a,0x2a,0x2a,0x3f6,0x3f6,0xf5a,0xf5a,0x2a,0x2a,0x3f0,0x3f0,0x3f0,0x3f0,0x3f0,0x3f0, -0x3f0,0x3f0,0x3f0,0x3f0,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0xf5d,0xf5d,0xf5d,0xf5d, -0xf5d,0xf5d,0xf5d,0xf5d,0x1779,0x14a6,0x402,0x402,0x2d,0x408,0x408,0x408,0x408,0x408,0x408,0x408, -0x408,0x2d,0x408,0x408,0x408,0x2d,0x408,0x408,0x408,0x408,0x408,0x408,0x408,0x408,0x408,0x408, -0x408,0x408,0x408,0x408,0x408,0x2d,0x408,0x408,0x408,0x408,0x408,0x408,0x408,0x408,0x408,0x408, -0x2d,0x408,0x408,0x408,0x408,0x408,0x2d,0x2d,0xc99,0xc9c,0x402,0x3f9,0x405,0x402,0x3f9,0x402, -0x402,0x2d,0x3f9,0x405,0x405,0x2d,0x405,0x405,0x3f9,0x3fc,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d, -0x2d,0x3f9,0x3f9,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x408,0x2d,0x408,0x408,0xea3,0xea3, -0x2d,0x2d,0x3ff,0x3ff,0x3ff,0x3ff,0x3ff,0x3ff,0x3ff,0x3ff,0x3ff,0x3ff,0x2d,0xea6,0xea6,0x2d, -0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x30,0x14a9,0x414,0x414, -0x30,0x41a,0x41a,0x41a,0x41a,0x41a,0x41a,0x41a,0x41a,0x30,0x41a,0x41a,0x41a,0x30,0x41a,0x41a, -0x41a,0x41a,0x41a,0x41a,0x41a,0x41a,0x41a,0x41a,0x41a,0x41a,0x41a,0x41a,0x41a,0x12cf,0x41a,0x41a, -0x41a,0x41a,0x41a,0x41a,0x41a,0x41a,0x41a,0x41a,0x41a,0x41a,0x41a,0x41a,0x41a,0x41a,0x12cf,0x30, -0x30,0xf6c,0x40b,0x414,0x414,0x40b,0x40b,0x40b,0xf63,0x30,0x414,0x414,0x414,0x30,0x417,0x417, -0x417,0x40e,0x12d2,0x177c,0x30,0x30,0x30,0x30,0x177f,0x177f,0x177f,0x40b,0x177c,0x177c,0x177c,0x177c, -0x177c,0x177c,0x177c,0x16bf,0x41a,0x41a,0xf63,0xf63,0x30,0x30,0x411,0x411,0x411,0x411,0x411,0x411, -0x411,0x411,0x411,0x411,0xf66,0xf66,0xf66,0xf66,0xf66,0xf66,0x177c,0x177c,0x177c,0xf69,0xf6c,0xf6c, -0xf6c,0xf6c,0xf6c,0xf6c,0x33,0x33,0x9e4,0x9e4,0x33,0x9ea,0x9ea,0x9ea,0x9ea,0x9ea,0x9ea,0x9ea, -0x9ea,0x9ea,0x9ea,0x9ea,0x9ea,0x9ea,0x9ea,0x9ea,0x9ea,0x9ea,0x9ea,0x33,0x33,0x33,0x9ea,0x9ea, -0x9ea,0x9ea,0x9ea,0x9ea,0x9ea,0x9ea,0x9ea,0x9ea,0x9ea,0x9ea,0x9ea,0x9ea,0x9ea,0x9ea,0x9ea,0x9ea, -0x9ea,0x9ea,0x33,0x9ea,0x9ea,0x9ea,0x9ea,0x9ea,0x9ea,0x9ea,0x9ea,0x9ea,0x33,0x9ea,0x33,0x33, -0x9ea,0x9ea,0x9ea,0x9ea,0x9ea,0x9ea,0x9ea,0x33,0x33,0x33,0x9de,0x33,0x33,0x33,0x33,0x9db, -0x9e4,0x9e4,0x9db,0x9db,0x9db,0x33,0x9db,0x33,0x9e4,0x9e4,0x9e7,0x9e4,0x9e7,0x9e7,0x9e7,0x9db, -0x33,0x33,0x33,0x33,0x33,0x33,0x14ac,0x14ac,0x14ac,0x14ac,0x14ac,0x14ac,0x14ac,0x14ac,0x14ac,0x14ac, -0x33,0x33,0x9e4,0x9e4,0x9e1,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, -0x36,0x435,0x435,0x435,0x435,0x435,0x435,0x435,0x435,0x435,0x435,0x435,0x435,0x435,0x435,0x435, -0x435,0x435,0x435,0x435,0x435,0x435,0x435,0x435,0x435,0x435,0x435,0x435,0x435,0x435,0x435,0x435, -0x435,0x420,0x435,0x432,0x420,0x420,0x420,0x420,0x420,0x420,0x426,0x36,0x36,0x36,0x36,0x41d, -0x43b,0x43b,0x43b,0x43b,0x43b,0x435,0x438,0x423,0x423,0x423,0x423,0x423,0x423,0x420,0x423,0x429, -0x42f,0x42f,0x42f,0x42f,0x42f,0x42f,0x42f,0x42f,0x42f,0x42f,0x42c,0x42c,0x36,0x36,0x36,0x36, +6,6,6,6,0xd35,0xd35,0xd35,0xd35,0xd35,0xd35,0xd35,0xd35,0xd35,0xd35,0xd35,0xd35, +0xd35,0xd35,0xd35,0xd35,6,6,6,6,6,6,6,6,6,6,6,6, +6,6,6,6,0x14b2,0x38d,0x39c,0x39c,0x1b,0x3a2,0x3a2,0x3a2,0x3a2,0x3a2,0x3a2,0x3a2, +0x3a2,0x1b,0x1b,0x3a2,0x3a2,0x1b,0x1b,0x3a2,0x3a2,0x3a2,0x3a2,0x3a2,0x3a2,0x3a2,0x3a2,0x3a2, +0x3a2,0x3a2,0x3a2,0x3a2,0x3a2,0x1b,0x3a2,0x3a2,0x3a2,0x3a2,0x3a2,0x3a2,0x3a2,0x1b,0x3a2,0x1b, +0x1b,0x1b,0x3a2,0x3a2,0x3a2,0x3a2,0x1b,0x1b,0x390,0xc90,0x38d,0x39c,0x39c,0x38d,0x38d,0x38d, +0x38d,0x1b,0x1b,0x39c,0x39c,0x1b,0x1b,0x39f,0x39f,0x393,0xd83,0x1b,0x1b,0x1b,0x1b,0x1b, +0x1b,0x1b,0x1b,0x38d,0x1b,0x1b,0x1b,0x1b,0x3a5,0x3a5,0x1b,0x3a5,0x3a2,0x3a2,0x38d,0x38d, +0x1b,0x1b,0x91e,0x91e,0x91e,0x91e,0x91e,0x91e,0x91e,0x91e,0x91e,0x91e,0x3a2,0x3a2,0x399,0x399, +0x396,0x396,0x396,0x396,0x396,0x399,0x396,0x110a,0x184b,0x1848,0x1b,0x1b,0x1e,0xc93,0x3a8,0xc96, +0x1e,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x1e,0x1e,0x1e,0x1e,0x3b4,0x3b4,0x1e,0x1e,0x3b4, +0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x1e,0x3b4,0x3b4, +0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x1e,0x3b4,0x3b7,0x1e,0x3b4,0x3b7,0x1e,0x3b4,0x3b4,0x1e,0x1e, +0x3ab,0x1e,0x3b1,0x3b1,0x3b1,0x3a8,0x3a8,0x1e,0x1e,0x1e,0x1e,0x3a8,0x3a8,0x1e,0x1e,0x3a8, +0x3a8,0x3ae,0x1e,0x1e,0x1e,0xf66,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x3b7,0x3b7,0x3b7, +0x3b4,0x1e,0x3b7,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x921,0x921,0x921,0x921,0x921,0x921, +0x921,0x921,0x921,0x921,0x3a8,0x3a8,0x3b4,0x3b4,0x3b4,0xf66,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e, +0x1e,0x1e,0x1e,0x1e,0x21,0x3ba,0x3ba,0x3c3,0x21,0x3c6,0x3c6,0x3c6,0x3c6,0x3c6,0x3c6,0x3c6, +0xc9f,0x3c6,0x21,0x3c6,0x3c6,0x3c6,0x21,0x3c6,0x3c6,0x3c6,0x3c6,0x3c6,0x3c6,0x3c6,0x3c6,0x3c6, +0x3c6,0x3c6,0x3c6,0x3c6,0x3c6,0x21,0x3c6,0x3c6,0x3c6,0x3c6,0x3c6,0x3c6,0x3c6,0x21,0x3c6,0x3c6, +0x21,0x3c6,0x3c6,0x3c6,0x3c6,0x3c6,0x21,0x21,0x3bd,0x3c6,0x3c3,0x3c3,0x3c3,0x3ba,0x3ba,0x3ba, +0x3ba,0x3ba,0x21,0x3ba,0x3ba,0x3c3,0x21,0x3c3,0x3c3,0x3c0,0x21,0x21,0x3c6,0x21,0x21,0x21, +0x21,0x21,0x21,0x21,0x21,0x21,0x21,0x21,0x21,0x21,0x21,0x21,0x3c6,0xc9f,0xc99,0xc99, +0x21,0x21,0x924,0x924,0x924,0x924,0x924,0x924,0x924,0x924,0x924,0x924,0x13c8,0xc9c,0x21,0x21, +0x21,0x21,0x21,0x21,0x21,0x16ce,0x184e,0x184e,0x184e,0x1851,0x1851,0x1851,0x24,0x3c9,0x3d8,0x3d8, +0x24,0x3de,0x3de,0x3de,0x3de,0x3de,0x3de,0x3de,0x3de,0x24,0x24,0x3de,0x3de,0x24,0x24,0x3de, +0x3de,0x3de,0x3de,0x3de,0x3de,0x3de,0x3de,0x3de,0x3de,0x3de,0x3de,0x3de,0x3de,0x24,0x3de,0x3de, +0x3de,0x3de,0x3de,0x3de,0x3de,0x24,0x3de,0x3de,0x24,0xca2,0x3de,0x3de,0x3de,0x3de,0x24,0x24, +0x3cc,0x3de,0x3c9,0x3c9,0x3d8,0x3c9,0x3c9,0x3c9,0xf69,0x24,0x24,0x3d8,0x3db,0x24,0x24,0x3db, +0x3db,0x3cf,0x24,0x24,0x24,0x24,0x24,0x24,0x24,0x24,0x3c9,0x3c9,0x24,0x24,0x24,0x24, +0x3e1,0x3e1,0x24,0x3de,0x3de,0x3de,0xf69,0xf69,0x24,0x24,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5, +0x3d5,0x3d5,0x3d5,0x3d5,0x3d2,0xca2,0x12e1,0x12e1,0x12e1,0x12e1,0x12e1,0x12e1,0x24,0x24,0x24,0x24, +0x24,0x24,0x24,0x24,0x27,0x27,0x3e4,0x3f0,0x27,0x3f0,0x3f0,0x3f0,0x3f0,0x3f0,0x3f0,0x27, +0x27,0x27,0x3f0,0x3f0,0x3f0,0x27,0x3f0,0x3f0,0x3f3,0x3f0,0x27,0x27,0x27,0x3f0,0x3f0,0x27, +0x3f0,0x27,0x3f0,0x3f0,0x27,0x27,0x27,0x3f0,0x3f0,0x27,0x27,0x27,0x3f0,0x3f0,0x92d,0x27, +0x27,0x27,0x3f0,0x3f0,0x3f0,0x3f0,0x3f0,0x3f0,0x3f0,0x92d,0xd86,0x3f0,0x3f0,0x3f0,0x27,0x27, +0x27,0x27,0x3e4,0x3ea,0x3e4,0x3ea,0x3ea,0x27,0x27,0x27,0x3ea,0x3ea,0x3ea,0x27,0x3ed,0x3ed, +0x3ed,0x3e7,0x27,0x27,0xf6c,0x27,0x27,0x27,0x27,0x27,0x27,0x3e4,0x27,0x27,0x27,0x27, +0x27,0x27,0x27,0x27,0x27,0x27,0xea0,0x92a,0x92a,0x92a,0x92a,0x92a,0x92a,0x92a,0x92a,0x92a, +0x927,0x927,0x927,0xca5,0xca5,0xca5,0xca5,0xca5,0xca5,0xca8,0xca5,0x27,0x27,0x27,0x27,0x27, +0x14b5,0x402,0x402,0x402,0x2a,0x405,0x405,0x405,0x405,0x405,0x405,0x405,0x405,0x2a,0x405,0x405, +0x405,0x2a,0x405,0x405,0x405,0x405,0x405,0x405,0x405,0x405,0x405,0x405,0x405,0x405,0x405,0x405, +0x405,0x2a,0x405,0x405,0x405,0x405,0x405,0x405,0x405,0x405,0x405,0x405,0x14b8,0x405,0x405,0x405, +0x405,0x405,0x2a,0x2a,0x2a,0xf75,0x3f6,0x3f6,0x3f6,0x402,0x402,0x402,0x402,0x2a,0x3f6,0x3f6, +0x3f9,0x2a,0x3f6,0x3f6,0x3f6,0x3fc,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x3f6,0x3f6,0x2a, +0xf75,0xf75,0x16d1,0x2a,0x2a,0x2a,0x2a,0x2a,0x405,0x405,0xf6f,0xf6f,0x2a,0x2a,0x3ff,0x3ff, +0x3ff,0x3ff,0x3ff,0x3ff,0x3ff,0x3ff,0x3ff,0x3ff,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a, +0xf72,0xf72,0xf72,0xf72,0xf72,0xf72,0xf72,0xf72,0x178e,0x14bb,0x411,0x411,0x2d,0x417,0x417,0x417, +0x417,0x417,0x417,0x417,0x417,0x2d,0x417,0x417,0x417,0x2d,0x417,0x417,0x417,0x417,0x417,0x417, +0x417,0x417,0x417,0x417,0x417,0x417,0x417,0x417,0x417,0x2d,0x417,0x417,0x417,0x417,0x417,0x417, +0x417,0x417,0x417,0x417,0x2d,0x417,0x417,0x417,0x417,0x417,0x2d,0x2d,0xcab,0xcae,0x411,0x408, +0x414,0x411,0x408,0x411,0x411,0x2d,0x408,0x414,0x414,0x2d,0x414,0x414,0x408,0x40b,0x2d,0x2d, +0x2d,0x2d,0x2d,0x2d,0x2d,0x408,0x408,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x417,0x2d, +0x417,0x417,0xeb8,0xeb8,0x2d,0x2d,0x40e,0x40e,0x40e,0x40e,0x40e,0x40e,0x40e,0x40e,0x40e,0x40e, +0x2d,0xebb,0xebb,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d, +0x1854,0x14be,0x423,0x423,0x30,0x429,0x429,0x429,0x429,0x429,0x429,0x429,0x429,0x30,0x429,0x429, +0x429,0x30,0x429,0x429,0x429,0x429,0x429,0x429,0x429,0x429,0x429,0x429,0x429,0x429,0x429,0x429, +0x423,0x41a,0x41a,0x41a,0xf78,0x30,0x423,0x423,0x423,0x30,0x426,0x426,0x426,0x41d,0x12e7,0x1791, +0x30,0x30,0x30,0x30,0x1794,0x1794,0x1794,0x41a,0x1791,0x1791,0x1791,0x1791,0x1791,0x1791,0x1791,0x16d4, +0x429,0x429,0xf78,0xf78,0x30,0x30,0x420,0x420,0x420,0x420,0x420,0x420,0x420,0x420,0x420,0x420, +0xf7b,0xf7b,0xf7b,0xf7b,0xf7b,0xf7b,0x1791,0x1791,0x1791,0xf7e,0xf81,0xf81,0xf81,0xf81,0xf81,0xf81, +0x33,0x33,0x9f6,0x9f6,0x33,0x9fc,0x9fc,0x9fc,0x9fc,0x9fc,0x9fc,0x9fc,0x9fc,0x9fc,0x9fc,0x9fc, +0x9fc,0x9fc,0x9fc,0x9fc,0x9fc,0x9fc,0x9fc,0x33,0x33,0x33,0x9fc,0x9fc,0x9fc,0x9fc,0x9fc,0x9fc, +0x9fc,0x9fc,0x9fc,0x9fc,0x9fc,0x9fc,0x9fc,0x9fc,0x9fc,0x9fc,0x9fc,0x9fc,0x9fc,0x9fc,0x33,0x9fc, +0x9fc,0x9fc,0x9fc,0x9fc,0x9fc,0x9fc,0x9fc,0x9fc,0x33,0x9fc,0x33,0x33,0x9fc,0x9fc,0x9fc,0x9fc, +0x9fc,0x9fc,0x9fc,0x33,0x33,0x33,0x9f0,0x33,0x33,0x33,0x33,0x9ed,0x9f6,0x9f6,0x9ed,0x9ed, +0x9ed,0x33,0x9ed,0x33,0x9f6,0x9f6,0x9f9,0x9f6,0x9f9,0x9f9,0x9f9,0x9ed,0x33,0x33,0x33,0x33, +0x33,0x33,0x14c1,0x14c1,0x14c1,0x14c1,0x14c1,0x14c1,0x14c1,0x14c1,0x14c1,0x14c1,0x33,0x33,0x9f6,0x9f6, +0x9f3,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x36,0x444,0x444,0x444, +0x444,0x444,0x444,0x444,0x444,0x444,0x444,0x444,0x444,0x444,0x444,0x444,0x444,0x444,0x444,0x444, +0x444,0x444,0x444,0x444,0x444,0x444,0x444,0x444,0x444,0x444,0x444,0x444,0x444,0x42f,0x444,0x441, +0x42f,0x42f,0x42f,0x42f,0x42f,0x42f,0x435,0x36,0x36,0x36,0x36,0x42c,0x44a,0x44a,0x44a,0x44a, +0x44a,0x444,0x447,0x432,0x432,0x432,0x432,0x432,0x432,0x42f,0x432,0x438,0x43e,0x43e,0x43e,0x43e, +0x43e,0x43e,0x43e,0x43e,0x43e,0x43e,0x43b,0x43b,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36, 0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36, -0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x39,0x44a,0x44a,0x39, -0x44a,0x39,0x39,0x44a,0x44a,0x39,0x44a,0x39,0x39,0x44a,0x39,0x39,0x39,0x39,0x39,0x39, -0x44a,0x44a,0x44a,0x44a,0x39,0x44a,0x44a,0x44a,0x44a,0x44a,0x44a,0x44a,0x39,0x44a,0x44a,0x44a, -0x39,0x44a,0x39,0x44a,0x39,0x39,0x44a,0x44a,0x39,0x44a,0x44a,0x44a,0x44a,0x43e,0x44a,0x447, -0x43e,0x43e,0x43e,0x43e,0x43e,0x43e,0x39,0x43e,0x43e,0x44a,0x39,0x39,0x453,0x453,0x453,0x453, -0x453,0x39,0x450,0x39,0x441,0x441,0x441,0x441,0x441,0x43e,0x39,0x39,0x444,0x444,0x444,0x444, -0x444,0x444,0x444,0x444,0x444,0x444,0x39,0x39,0x44d,0x44d,0x13b6,0x13b6,0x39,0x39,0x39,0x39, +0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x39,0x459,0x459,0x39,0x459,0x39,0x39,0x459, +0x459,0x39,0x459,0x39,0x39,0x459,0x39,0x39,0x39,0x39,0x39,0x39,0x459,0x459,0x459,0x459, +0x39,0x459,0x459,0x459,0x459,0x459,0x459,0x459,0x39,0x459,0x459,0x459,0x39,0x459,0x39,0x459, +0x39,0x39,0x459,0x459,0x39,0x459,0x459,0x459,0x459,0x44d,0x459,0x456,0x44d,0x44d,0x44d,0x44d, +0x44d,0x44d,0x39,0x44d,0x44d,0x459,0x39,0x39,0x462,0x462,0x462,0x462,0x462,0x39,0x45f,0x39, +0x450,0x450,0x450,0x450,0x450,0x44d,0x39,0x39,0x453,0x453,0x453,0x453,0x453,0x453,0x453,0x453, +0x453,0x453,0x39,0x39,0x45c,0x45c,0x13cb,0x13cb,0x39,0x39,0x39,0x39,0x39,0x39,0x39,0x39, 0x39,0x39,0x39,0x39,0x39,0x39,0x39,0x39,0x39,0x39,0x39,0x39,0x39,0x39,0x39,0x39, -0x39,0x39,0x39,0x39,0x39,0x39,0x39,0x39,0x39,0x39,0x39,0x39,0x95d,0x95d,0x95d,0x960, -0x95d,0x95d,0x95d,0x95d,0x3c,0x95d,0x95d,0x95d,0x95d,0x960,0x95d,0x95d,0x95d,0x95d,0x960,0x95d, -0x95d,0x95d,0x95d,0x960,0x95d,0x95d,0x95d,0x95d,0x960,0x95d,0x95d,0x95d,0x95d,0x95d,0x95d,0x95d, -0x95d,0x95d,0x95d,0x95d,0x95d,0x960,0x9f9,0xf78,0xf78,0x3c,0x3c,0x3c,0x3c,0x92a,0x92a,0x92d, -0x92a,0x92d,0x92d,0x936,0x92d,0x936,0x92a,0x92a,0x92a,0x92a,0x92a,0x957,0x92a,0x92d,0x930,0x930, -0x933,0x93c,0x930,0x930,0x95d,0x95d,0x95d,0x95d,0x12db,0x12d5,0x12d5,0x12d5,0x92a,0x92a,0x92a,0x92d, -0x92a,0x92a,0x9ed,0x92a,0x3c,0x92a,0x92a,0x92a,0x92a,0x92d,0x92a,0x92a,0x92a,0x92a,0x92d,0x92a, -0x92a,0x92a,0x92a,0x92d,0x92a,0x92a,0x92a,0x92a,0x92d,0x92a,0x9ed,0x9ed,0x9ed,0x92a,0x92a,0x92a, -0x92a,0x92a,0x92a,0x92a,0x9ed,0x92d,0x9ed,0x9ed,0x9ed,0x3c,0x9f6,0x9f6,0x9f3,0x9f3,0x9f3,0x9f3, -0x9f3,0x9f3,0x9f0,0x9f3,0x9f3,0x9f3,0x9f3,0x9f3,0x9f3,0x3c,0xf6f,0x9f3,0xd77,0xd77,0xf72,0xf75, -0xf6f,0x10f8,0x10f8,0x10f8,0x10f8,0x12d8,0x12d8,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c, +0x39,0x39,0x39,0x39,0x39,0x39,0x39,0x39,0x96f,0x96f,0x96f,0x972,0x96f,0x96f,0x96f,0x96f, +0x3c,0x96f,0x96f,0x96f,0x96f,0x972,0x96f,0x96f,0x96f,0x96f,0x972,0x96f,0x96f,0x96f,0x96f,0x972, +0x96f,0x96f,0x96f,0x96f,0x972,0x96f,0x96f,0x96f,0x96f,0x96f,0x96f,0x96f,0x96f,0x96f,0x96f,0x96f, +0x96f,0x972,0xa0b,0xf8d,0xf8d,0x3c,0x3c,0x3c,0x3c,0x93c,0x93c,0x93f,0x93c,0x93f,0x93f,0x948, +0x93f,0x948,0x93c,0x93c,0x93c,0x93c,0x93c,0x969,0x93c,0x93f,0x942,0x942,0x945,0x94e,0x942,0x942, +0x96f,0x96f,0x96f,0x96f,0x12f0,0x12ea,0x12ea,0x12ea,0x93c,0x93c,0x93c,0x93f,0x93c,0x93c,0x9ff,0x93c, +0x3c,0x93c,0x93c,0x93c,0x93c,0x93f,0x93c,0x93c,0x93c,0x93c,0x93f,0x93c,0x93c,0x93c,0x93c,0x93f, +0x93c,0x93c,0x93c,0x93c,0x93f,0x93c,0x9ff,0x9ff,0x9ff,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c, +0x9ff,0x93f,0x9ff,0x9ff,0x9ff,0x3c,0xa08,0xa08,0xa05,0xa05,0xa05,0xa05,0xa05,0xa05,0xa02,0xa05, +0xa05,0xa05,0xa05,0xa05,0xa05,0x3c,0xf84,0xa05,0xd89,0xd89,0xf87,0xf8a,0xf84,0x110d,0x110d,0x110d, +0x110d,0x12ed,0x12ed,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c, 0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c, -0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x459,0x459,0x459,0x459,0x459,0x459,0x3f,0x13bc, -0x3f,0x3f,0x3f,0x3f,0x3f,0x13bc,0x3f,0x3f,0x456,0x456,0x456,0x456,0x456,0x456,0x456,0x456, -0x456,0x456,0x456,0x456,0x456,0x456,0x456,0x456,0xa23,0xa23,0xa23,0xa23,0xa23,0xa23,0xa23,0xd86, -0xa23,0x42,0xa23,0xa23,0xa23,0xa23,0x42,0x42,0xa23,0xa23,0xa23,0xa23,0xa23,0xa23,0xa23,0x42, -0xa23,0x42,0xa23,0xa23,0xa23,0xa23,0x42,0x42,0xa23,0xa23,0xa23,0xa23,0xa23,0xa23,0xa23,0xd86, -0xa23,0x42,0xa23,0xa23,0xa23,0xa23,0x42,0x42,0xa23,0xa23,0xa23,0xa23,0xa23,0xa23,0xa23,0xa23, -0xa23,0xa23,0xa23,0xa23,0xa23,0xa23,0xa23,0xa23,0xa23,0xa23,0xa23,0xd86,0xa23,0x42,0xa23,0xa23, -0xa23,0xa23,0x42,0x42,0xa23,0xa23,0xa23,0xa23,0xa23,0xa23,0xa23,0x42,0xa23,0x42,0xa23,0xa23, -0xa23,0xa23,0x42,0x42,0xa23,0xa23,0xa23,0xa23,0xa23,0xa23,0xa23,0xd86,0xa23,0xa23,0xa23,0xa23, -0xa23,0xa23,0xa23,0x42,0xa23,0xa23,0xa23,0xa23,0xa23,0xa23,0xa23,0xa23,0xa23,0xa23,0xa23,0xa23, -0xa23,0xa23,0xa23,0xd86,0xa23,0x42,0xa23,0xa23,0xa23,0xa23,0x42,0x42,0xa23,0xa23,0xa23,0xa23, -0xa23,0xa23,0xa23,0xd86,0xa23,0xa23,0xa23,0xa23,0xa23,0xa23,0xa23,0xa23,0xa23,0xa23,0xa23,0xa23, -0xa23,0xa23,0xa23,0xa23,0xa23,0xa23,0xa23,0x42,0x42,0x12de,0x12de,0xd80,0xd83,0xa1d,0xa26,0xa1a, -0xa1a,0xa1a,0xa1a,0xa26,0xa26,0xa20,0xa20,0xa20,0xa20,0xa20,0xa20,0xa20,0xa20,0xa20,0xa17,0xa17, -0xa17,0xa17,0xa17,0xa17,0xa17,0xa17,0xa17,0xa17,0xa17,0x42,0x42,0x42,0xa29,0xa29,0xa29,0xa29, -0xa29,0xa29,0xa29,0xa29,0xa29,0xa29,0xa29,0xa29,0xa29,0xa29,0xa29,0xa29,0xa29,0xa29,0xa29,0xa29, -0xa29,0x16c5,0x45,0x45,0x16c2,0x16c2,0x16c2,0x16c2,0x16c2,0x16c2,0x45,0x45,0xa3b,0xa3e,0xa3e,0xa3e, -0xa3e,0xa3e,0xa3e,0xa3e,0xa3e,0xa3e,0xa3e,0xa3e,0xa3e,0xa3e,0xa3e,0xa3e,0xa3e,0xa3e,0xa3e,0xa3e, -0xa3e,0xa3e,0xa3e,0xa3e,0xa3e,0xa3e,0xa3e,0xa38,0xa35,0x48,0x48,0x48,0xa44,0xa44,0xa44,0xa44, -0xa44,0xa44,0xa44,0xa44,0xa44,0xa44,0xa44,0xa41,0xa41,0xa41,0xa44,0xa44,0xa44,0x14af,0x14af,0x14af, -0x14af,0x14af,0x14af,0x14af,0x14af,0x4b,0x4b,0x4b,0x4b,0x4b,0x4b,0x4b,0xa65,0xa65,0xa65,0xa65, -0xa65,0xa65,0xa47,0xa65,0xa65,0xa4a,0xa4a,0xa4a,0xa4a,0xa4a,0xa4a,0xa4a,0xa4a,0xa4a,0xa4d,0xa4a, -0xa5c,0xa5c,0xa5f,0xa68,0xa56,0xa53,0xa5c,0xa59,0xa68,0xc9f,0x4e,0x4e,0xa62,0xa62,0xa62,0xa62, -0xa62,0xa62,0xa62,0xa62,0xa62,0xa62,0x4e,0x4e,0x4e,0x4e,0x4e,0x4e,0xca2,0xca2,0xca2,0xca2, -0xca2,0xca2,0xca2,0xca2,0xca2,0xca2,0x4e,0x4e,0x4e,0x4e,0x4e,0x4e,0xa77,0xa77,0xaf5,0xaf8, -0xa7d,0xaf2,0xa7a,0xa77,0xa80,0xa8f,0xa83,0xa92,0xa92,0xa92,0xa6e,0x51,0xa86,0xa86,0xa86,0xa86, -0xa86,0xa86,0xa86,0xa86,0xa86,0xa86,0x51,0x51,0x51,0x51,0x51,0x51,0xa89,0xa89,0xa89,0xa89, -0xa89,0xa89,0xa89,0xa89,0xa89,0xa89,0xa89,0xa89,0xa89,0xa89,0xa89,0xa89,0xa89,0xa89,0xa89,0xa89, -0xa89,0xa89,0xa89,0xa89,0x51,0x51,0x51,0x51,0x51,0x51,0x51,0x51,0xa89,0xa89,0xa89,0xa89, -0xa89,0xa89,0xa89,0xa89,0xa89,0xa71,0xf99,0x51,0x51,0x51,0x51,0x51,0x114c,0x114c,0x114c,0x114c, -0x114c,0x114c,0x114c,0x114c,0x114c,0x114c,0x114c,0x114c,0x114c,0x114c,0x114c,0x114c,0x477,0x477,0x477,0x477, -0x477,0x477,0x477,0x477,0x47a,0x47a,0x47a,0x47a,0x47a,0x47a,0x47a,0x47a,0x477,0x477,0x477,0x477, -0x477,0x477,0x54,0x54,0x47a,0x47a,0x47a,0x47a,0x47a,0x47a,0x54,0x54,0x477,0x477,0x477,0x477, -0x477,0x477,0x477,0x477,0x54,0x47a,0x54,0x47a,0x54,0x47a,0x54,0x47a,0x477,0x477,0x477,0x477, -0x477,0x477,0x477,0x477,0x47a,0x47a,0x47a,0x47a,0x47a,0x47a,0x47a,0x47a,0x477,0x477,0x477,0x477, -0x477,0x477,0x477,0x477,0x477,0x477,0x477,0x477,0x477,0x477,0x54,0x54,0x477,0x477,0x477,0x477, -0x477,0x477,0x477,0x477,0x47a,0x47a,0x47a,0x47a,0x47a,0x47a,0x47a,0x47a,0x477,0x477,0x477,0x477, -0x477,0x54,0x477,0x477,0x47a,0x47a,0x47a,0x47a,0x47a,0x471,0x477,0x471,0x471,0x46e,0x477,0x477, -0x477,0x54,0x477,0x477,0x47a,0x47a,0x47a,0x47a,0x47a,0x46e,0x46e,0x46e,0x477,0x477,0x477,0x477, -0x54,0x54,0x477,0x477,0x47a,0x47a,0x47a,0x47a,0x54,0x46e,0x46e,0x46e,0x477,0x477,0x477,0x477, -0x477,0x477,0x477,0x477,0x47a,0x47a,0x47a,0x47a,0x47a,0x46e,0x46e,0x46e,0x54,0x54,0x477,0x477, -0x477,0x54,0x477,0x477,0x47a,0x47a,0x47a,0x47a,0x47a,0x474,0x471,0x54,0xb6a,0xb6d,0xb6d,0xb6d, -0xfa2,0x57,0x148e,0x148e,0x148e,0x148e,0x483,0x483,0x483,0x483,0x483,0x483,0x4ce,0xb7f,0x5a,0x5a, -0x68a,0x4ce,0x4ce,0x4ce,0x4ce,0x4ce,0x4d4,0x4e6,0x4d4,0x4e0,0x4da,0x68d,0x4cb,0x687,0x687,0x687, -0x687,0x4cb,0x4cb,0x4cb,0x4cb,0x4cb,0x4d1,0x4e3,0x4d1,0x4dd,0x4d7,0x5a,0xd8f,0xd8f,0xd8f,0xd8f, -0xd8f,0x12e1,0x12e1,0x12e1,0x12e1,0x12e1,0x12e1,0x12e1,0x12e1,0x5a,0x5a,0x5a,0x4ec,0x4ec,0x4ec,0x4ec, -0x4ec,0x4ec,0x4ec,0x4e9,0x4ef,0x702,0x4ec,0x966,0x987,0xaa1,0xaa1,0xaa1,0xb82,0xb82,0xd92,0xd92, -0xd92,0xd92,0x1110,0x1113,0x1113,0x12e4,0x1488,0x14b2,0x14b5,0x14b5,0x16c8,0x5d,0x5d,0x5d,0x5d,0x5d, -0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x4f5,0x4f5,0x4f5,0x4f5, -0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f2,0x4f2,0x4f2,0x4f2,0x4f5,0xaa4,0xaa4, -0xb85,0xb8b,0xb8b,0xb88,0xb88,0xb88,0xb88,0xd95,0xea9,0xea9,0xea9,0xea9,0x10e3,0x60,0x60,0x60, -0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x525,0x525,0x525,0xaad, -0xeb2,0xfa8,0xfa8,0xfa8,0xfa8,0x123f,0x16cb,0x16cb,0x63,0x63,0x63,0x63,0x6b4,0x6b4,0x6b4,0x6b4, -0x6b7,0x6b7,0x6b7,0x6b7,0x6b7,0x6b7,0x531,0x531,0x52e,0x52e,0x52e,0x52e,0xeb8,0xeb8,0xeb8,0xeb5, -0xeb5,0xeb5,0xeb5,0xeb5,0x1119,0x1365,0x1365,0x1365,0x1365,0x12e7,0x12e7,0x12e7,0x1368,0x12ea,0x12ea,0x1368, -0x14b8,0x14b8,0x14b8,0x14b8,0x14bb,0x14bb,0x14bb,0x1782,0x1782,0x1782,0x1782,0x66,0x558,0x558,0x558,0x558, -0x558,0xab6,0xab6,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69, -0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x55b,0x55b,0x55b,0x55b, -0x55b,0x55b,0x55b,0x55b,0x55b,0x55b,0x55b,0x6c,0x6c,0x6c,0x6c,0x6c,0x6c,0x6c,0x6c,0x6c, -0x6c,0x6c,0x6c,0x6c,0x6c,0x6c,0x6c,0x6c,0x6c,0x6c,0x6c,0x6c,0xad1,0xad1,0xad1,0xad1, -0xad1,0xad1,0xad1,0xad1,0xad1,0xad1,0xad1,0xad1,0xad1,0xad1,0xad1,0xad1,0xad1,0xad1,0xad1,0xad1, -0xad1,0xad1,0xad1,0xad1,0xad1,0xad1,0x6f,0xad1,0xad1,0xad1,0xad1,0xad4,0xad1,0xad1,0xad1,0xad1, -0xad1,0xad1,0xad1,0xad1,0xad1,0xad1,0xad1,0xad1,0xad1,0xad1,0xad1,0xad1,0xad1,0xad1,0xad1,0xad4, -0x6f,0x6f,0x6f,0x6f,0x6f,0x6f,0x6f,0x6f,0x6f,0x6f,0x6f,0x6f,0xad7,0xad7,0xad7,0xad7, -0xad7,0xad7,0xad7,0xad7,0xad7,0xad7,0xad7,0xad7,0xad7,0xad7,0xad7,0xad7,0xad7,0xad7,0xad7,0xad7, -0xad7,0xad7,0x72,0x72,0x72,0x72,0x72,0x72,0x72,0x72,0x72,0x72,0x78,0x7e9,0x7e3,0x7e9, -0x7e3,0x7e9,0x7e3,0x7e9,0x7e3,0x7e9,0x7e3,0x7e3,0x7e6,0x7e3,0x7e6,0x7e3,0x7e6,0x7e3,0x7e6,0x7e3, -0x7e6,0x7e3,0x7e6,0x7e3,0x7e6,0x7e3,0x7e6,0x7e3,0x7e6,0x7e3,0x7e6,0x7e3,0x7e3,0x7e3,0x7e3,0x7e9, -0x7e3,0x7e9,0x7e3,0x7e9,0x7e3,0x7e3,0x7e3,0x7e3,0x7e3,0x7e3,0x7e9,0x7e3,0x7e3,0x7e3,0x7e3,0x7e3, -0x7e6,0xc2d,0xc2d,0x78,0x78,0x8fd,0x8fd,0x8c7,0x8c7,0x7ec,0x7ef,0xc2a,0x7b,0x7b,0x7b,0x7b, -0x7b,0x801,0x801,0x801,0x801,0x801,0x801,0x801,0x801,0x801,0x801,0x801,0x801,0x801,0x801,0x801, -0x801,0x801,0x801,0x801,0x801,0x801,0x801,0x801,0x801,0x801,0x801,0x801,0x801,0x10d1,0x7b,0x7b, -0x7e,0x804,0x804,0x804,0x804,0x804,0x804,0x804,0x804,0x804,0x804,0x804,0x804,0x804,0x804,0x804, -0x804,0x804,0x804,0x7e,0x8d0,0x8d0,0x8d3,0x8d3,0x8d3,0x8d3,0x8d3,0x8d3,0x8d3,0x8d3,0x8d3,0x8d3, -0x8d3,0x8d3,0x8d3,0x8d3,0xae3,0xae3,0xae3,0xae3,0xae3,0xae3,0xae3,0xae3,0xae3,0xae3,0xae3,0xae3, -0xae3,0xae3,0xae3,0xae3,0xae3,0xae3,0xae3,0xae3,0xae3,0xae3,0xae3,0xae3,0x1374,0x1374,0x1374,0x81, -0x81,0x81,0x81,0x81,0x80d,0x80d,0x80d,0x80d,0x80d,0x80d,0x80d,0x80d,0x80d,0x80d,0x80d,0x80d, -0x80d,0x80d,0x80d,0x80d,0x80d,0x80d,0x80d,0x80d,0x80d,0x80d,0x80d,0x80d,0x80d,0x80d,0x80d,0x80d, -0x80d,0xd2f,0xd2f,0x84,0x813,0x813,0x813,0x813,0x813,0x813,0x813,0x813,0x813,0x813,0x813,0x813, +0x3c,0x3c,0x3c,0x3c,0x468,0x468,0x468,0x468,0x468,0x468,0x3f,0x13d1,0x3f,0x3f,0x3f,0x3f, +0x3f,0x13d1,0x3f,0x3f,0x465,0x465,0x465,0x465,0x465,0x465,0x465,0x465,0x465,0x465,0x465,0x465, +0x465,0x465,0x465,0x465,0xa35,0xa35,0xa35,0xa35,0xa35,0xa35,0xa35,0xd98,0xa35,0x42,0xa35,0xa35, +0xa35,0xa35,0x42,0x42,0xa35,0xa35,0xa35,0xa35,0xa35,0xa35,0xa35,0x42,0xa35,0x42,0xa35,0xa35, +0xa35,0xa35,0x42,0x42,0xa35,0xa35,0xa35,0xa35,0xa35,0xa35,0xa35,0xd98,0xa35,0x42,0xa35,0xa35, +0xa35,0xa35,0x42,0x42,0xa35,0xa35,0xa35,0xa35,0xa35,0xa35,0xa35,0xa35,0xa35,0xa35,0xa35,0xa35, +0xa35,0xa35,0xa35,0xa35,0xa35,0xa35,0xa35,0xd98,0xa35,0x42,0xa35,0xa35,0xa35,0xa35,0x42,0x42, +0xa35,0xa35,0xa35,0xa35,0xa35,0xa35,0xa35,0x42,0xa35,0x42,0xa35,0xa35,0xa35,0xa35,0x42,0x42, +0xa35,0xa35,0xa35,0xa35,0xa35,0xa35,0xa35,0xd98,0xa35,0xa35,0xa35,0xa35,0xa35,0xa35,0xa35,0x42, +0xa35,0xa35,0xa35,0xa35,0xa35,0xa35,0xa35,0xa35,0xa35,0xa35,0xa35,0xa35,0xa35,0xa35,0xa35,0xd98, +0xa35,0x42,0xa35,0xa35,0xa35,0xa35,0x42,0x42,0xa35,0xa35,0xa35,0xa35,0xa35,0xa35,0xa35,0xd98, +0xa35,0xa35,0xa35,0xa35,0xa35,0xa35,0xa35,0xa35,0xa35,0xa35,0xa35,0xa35,0xa35,0xa35,0xa35,0xa35, +0xa35,0xa35,0xa35,0x42,0x42,0x12f3,0x12f3,0xd92,0xd95,0xa2f,0xa38,0xa2c,0xa2c,0xa2c,0xa2c,0xa38, +0xa38,0xa32,0xa32,0xa32,0xa32,0xa32,0xa32,0xa32,0xa32,0xa32,0xa29,0xa29,0xa29,0xa29,0xa29,0xa29, +0xa29,0xa29,0xa29,0xa29,0xa29,0x42,0x42,0x42,0xa3b,0xa3b,0xa3b,0xa3b,0xa3b,0xa3b,0xa3b,0xa3b, +0xa3b,0xa3b,0xa3b,0xa3b,0xa3b,0xa3b,0xa3b,0xa3b,0xa3b,0xa3b,0xa3b,0xa3b,0xa3b,0x16da,0x45,0x45, +0x16d7,0x16d7,0x16d7,0x16d7,0x16d7,0x16d7,0x45,0x45,0xa4d,0xa50,0xa50,0xa50,0xa50,0xa50,0xa50,0xa50, +0xa50,0xa50,0xa50,0xa50,0xa50,0xa50,0xa50,0xa50,0xa50,0xa50,0xa50,0xa50,0xa50,0xa50,0xa50,0xa50, +0xa50,0xa50,0xa50,0xa4a,0xa47,0x48,0x48,0x48,0xa56,0xa56,0xa56,0xa56,0xa56,0xa56,0xa56,0xa56, +0xa56,0xa56,0xa56,0xa53,0xa53,0xa53,0xa56,0xa56,0xa56,0x14c4,0x14c4,0x14c4,0x14c4,0x14c4,0x14c4,0x14c4, +0x14c4,0x4b,0x4b,0x4b,0x4b,0x4b,0x4b,0x4b,0xa77,0xa77,0xa77,0xa77,0xa77,0xa77,0xa59,0xa77, +0xa77,0xa5c,0xa5c,0xa5c,0xa5c,0xa5c,0xa5c,0xa5c,0xa5c,0xa5c,0xa5f,0xa5c,0xa6e,0xa6e,0xa71,0xa7a, +0xa68,0xa65,0xa6e,0xa6b,0xa7a,0xcb1,0x4e,0x4e,0xa74,0xa74,0xa74,0xa74,0xa74,0xa74,0xa74,0xa74, +0xa74,0xa74,0x4e,0x4e,0x4e,0x4e,0x4e,0x4e,0xcb4,0xcb4,0xcb4,0xcb4,0xcb4,0xcb4,0xcb4,0xcb4, +0xcb4,0xcb4,0x4e,0x4e,0x4e,0x4e,0x4e,0x4e,0xa89,0xa89,0xb07,0xb0a,0xa8f,0xb04,0xa8c,0xa89, +0xa92,0xaa1,0xa95,0xaa4,0xaa4,0xaa4,0xa80,0x51,0xa98,0xa98,0xa98,0xa98,0xa98,0xa98,0xa98,0xa98, +0xa98,0xa98,0x51,0x51,0x51,0x51,0x51,0x51,0xa9b,0xa9b,0xa9b,0xa9b,0xa9b,0xa9b,0xa9b,0xa9b, +0xa9b,0xa9b,0xa9b,0xa9b,0xa9b,0xa9b,0xa9b,0xa9b,0xa9b,0xa9b,0xa9b,0xa9b,0xa9b,0xa9b,0xa9b,0xa9b, +0x51,0x51,0x51,0x51,0x51,0x51,0x51,0x51,0xa9b,0xa9b,0xa9b,0xa9b,0xa9b,0xa9b,0xa9b,0xa9b, +0xa9b,0xa83,0xfae,0x51,0x51,0x51,0x51,0x51,0x1161,0x1161,0x1161,0x1161,0x1161,0x1161,0x1161,0x1161, +0x1161,0x1161,0x1161,0x1161,0x1161,0x1161,0x1161,0x1161,0x486,0x486,0x486,0x486,0x486,0x486,0x486,0x486, +0x489,0x489,0x489,0x489,0x489,0x489,0x489,0x489,0x486,0x486,0x486,0x486,0x486,0x486,0x54,0x54, +0x489,0x489,0x489,0x489,0x489,0x489,0x54,0x54,0x486,0x486,0x486,0x486,0x486,0x486,0x486,0x486, +0x54,0x489,0x54,0x489,0x54,0x489,0x54,0x489,0x486,0x486,0x486,0x486,0x486,0x486,0x486,0x486, +0x489,0x489,0x489,0x489,0x489,0x489,0x489,0x489,0x486,0x486,0x486,0x486,0x486,0x486,0x486,0x486, +0x486,0x486,0x486,0x486,0x486,0x486,0x54,0x54,0x486,0x486,0x486,0x486,0x486,0x486,0x486,0x486, +0x489,0x489,0x489,0x489,0x489,0x489,0x489,0x489,0x486,0x486,0x486,0x486,0x486,0x54,0x486,0x486, +0x489,0x489,0x489,0x489,0x489,0x480,0x486,0x480,0x480,0x47d,0x486,0x486,0x486,0x54,0x486,0x486, +0x489,0x489,0x489,0x489,0x489,0x47d,0x47d,0x47d,0x486,0x486,0x486,0x486,0x54,0x54,0x486,0x486, +0x489,0x489,0x489,0x489,0x54,0x47d,0x47d,0x47d,0x486,0x486,0x486,0x486,0x486,0x486,0x486,0x486, +0x489,0x489,0x489,0x489,0x489,0x47d,0x47d,0x47d,0x54,0x54,0x486,0x486,0x486,0x54,0x486,0x486, +0x489,0x489,0x489,0x489,0x489,0x483,0x480,0x54,0xb7c,0xb7f,0xb7f,0xb7f,0xfb7,0x57,0x14a0,0x14a0, +0x14a0,0x14a0,0x492,0x492,0x492,0x492,0x492,0x492,0x4dd,0xb91,0x5a,0x5a,0x699,0x4dd,0x4dd,0x4dd, +0x4dd,0x4dd,0x4e3,0x4f5,0x4e3,0x4ef,0x4e9,0x69c,0x4da,0x696,0x696,0x696,0x696,0x4da,0x4da,0x4da, +0x4da,0x4da,0x4e0,0x4f2,0x4e0,0x4ec,0x4e6,0x5a,0xda1,0xda1,0xda1,0xda1,0xda1,0x12f6,0x12f6,0x12f6, +0x12f6,0x12f6,0x12f6,0x12f6,0x12f6,0x5a,0x5a,0x5a,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d, +0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x504,0x504,0x504,0x504,0x504,0x504,0x504,0x504, +0x504,0x504,0x504,0x504,0x504,0x501,0x501,0x501,0x501,0x504,0xab6,0xab6,0xb97,0xb9d,0xb9d,0xb9a, +0xb9a,0xb9a,0xb9a,0xda7,0xebe,0xebe,0xebe,0xebe,0x10f8,0x60,0x60,0x60,0x60,0x60,0x60,0x60, +0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x534,0x534,0x534,0xabf,0xec7,0xfbd,0xfbd,0xfbd, +0xfbd,0x1254,0x16e0,0x16e0,0x63,0x63,0x63,0x63,0x6c3,0x6c3,0x6c3,0x6c3,0x6c6,0x6c6,0x6c6,0x6c6, +0x6c6,0x6c6,0x540,0x540,0x53d,0x53d,0x53d,0x53d,0x567,0x567,0x567,0x567,0x567,0xac8,0xac8,0x66, +0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66, +0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x56a,0x56a,0x56a,0x56a,0x56a,0x56a,0x56a,0x56a, +0x56a,0x56a,0x56a,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69, +0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0xae3,0xae3,0xae3,0xae3,0xae3,0xae3,0xae3,0xae3, +0xae3,0xae3,0xae3,0xae3,0xae3,0xae3,0xae3,0xae3,0xae3,0xae3,0xae3,0xae3,0xae3,0xae3,0xae3,0xae3, +0xae3,0xae3,0x6c,0xae3,0xae3,0xae3,0xae3,0xae6,0xae3,0xae3,0xae3,0xae3,0xae3,0xae3,0xae3,0xae3, +0xae3,0xae3,0xae3,0xae3,0xae3,0xae3,0xae3,0xae3,0xae3,0xae3,0xae3,0xae6,0x6c,0x6c,0x6c,0x6c, +0x6c,0x6c,0x6c,0x6c,0x6c,0x6c,0x6c,0x6c,0xae9,0xae9,0xae9,0xae9,0xae9,0xae9,0xae9,0xae9, +0xae9,0xae9,0xae9,0xae9,0xae9,0xae9,0xae9,0xae9,0xae9,0xae9,0xae9,0xae9,0xae9,0xae9,0x6f,0x6f, +0x6f,0x6f,0x6f,0x6f,0x6f,0x6f,0x6f,0x6f,0x75,0x7fb,0x7f5,0x7fb,0x7f5,0x7fb,0x7f5,0x7fb, +0x7f5,0x7fb,0x7f5,0x7f5,0x7f8,0x7f5,0x7f8,0x7f5,0x7f8,0x7f5,0x7f8,0x7f5,0x7f8,0x7f5,0x7f8,0x7f5, +0x7f8,0x7f5,0x7f8,0x7f5,0x7f8,0x7f5,0x7f8,0x7f5,0x7f5,0x7f5,0x7f5,0x7fb,0x7f5,0x7fb,0x7f5,0x7fb, +0x7f5,0x7f5,0x7f5,0x7f5,0x7f5,0x7f5,0x7fb,0x7f5,0x7f5,0x7f5,0x7f5,0x7f5,0x7f8,0xc3f,0xc3f,0x75, +0x75,0x90f,0x90f,0x8d9,0x8d9,0x7fe,0x801,0xc3c,0x78,0x78,0x78,0x78,0x78,0x813,0x813,0x813, 0x813,0x813,0x813,0x813,0x813,0x813,0x813,0x813,0x813,0x813,0x813,0x813,0x813,0x813,0x813,0x813, -0x813,0x813,0x813,0x84,0xae9,0xae9,0xae9,0xae9,0xae9,0xae9,0xae9,0xae9,0xae9,0xae9,0xae9,0xae9, -0xae9,0x87,0x87,0x87,0xaef,0xaef,0xaef,0xaef,0xaef,0xaef,0xaef,0xaef,0xaef,0xaef,0xaef,0xaef, -0xaef,0xaef,0xaef,0xaef,0xaef,0xc36,0xaef,0xaef,0xaef,0xc36,0xaef,0x8a,0x8a,0x8a,0x8a,0x8a, -0x8a,0x8a,0x8a,0x8a,0x1173,0x1173,0x1173,0x1173,0x1173,0x1173,0x1173,0x1173,0x1173,0x1173,0x1173,0x1173, -0x1173,0x1173,0x1173,0x1173,0x981,0x981,0x981,0x981,0x8d,0x8d,0x8d,0x8d,0x8d,0x8d,0x8d,0x8d, -0x8d,0x8d,0x8d,0x8d,0x11e8,0x11e8,0x11e8,0x11e8,0x11e8,0x11e8,0x11e8,0x11e8,0x11e8,0x11e8,0x11e8,0x11e8, -0x11e8,0x11e8,0x11e8,0x11e8,0x5b5,0x5b5,0x5b5,0x5b5,0x5b5,0x5b5,0x5b5,0x90,0x90,0x90,0x90,0x90, -0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x5a3,0x5a3,0x5a3,0x5a3,0x5a3,0x90,0x90,0x90,0x90, -0x90,0xac2,0x5a6,0x5ac,0x5b2,0x5b2,0x5b2,0x5b2,0x5b2,0x5b2,0x5b2,0x5b2,0x5b2,0x5a9,0x5ac,0x5ac, -0x5ac,0x5ac,0x5ac,0x5ac,0x5ac,0x5ac,0x5ac,0x5ac,0x5ac,0x5ac,0x5ac,0x90,0x5ac,0x5ac,0x5ac,0x5ac, -0x5ac,0x90,0x5ac,0x90,0x5ac,0x5ac,0x90,0x5ac,0x5ac,0x90,0x5ac,0x5ac,0x5ac,0x5ac,0x5ac,0x5ac, -0x5ac,0x5ac,0x5ac,0x5af,0x5c7,0x5c1,0x5c7,0x5c1,0x5c4,0x5ca,0x5c7,0x5c1,0x5c4,0x5ca,0x5c7,0x5c1, -0x5c4,0x5ca,0x5c7,0x5c1,0x12f3,0x12f3,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93, -0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x5c7,0x5c1,0x5c4,0x5ca,0x5c7,0x5c1,0x5c7,0x5c1,0x5c7, -0x5c1,0x5c7,0x5c7,0x5c1,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93, -0x93,0x93,0x93,0x93,0x5c4,0x5c1,0x5c4,0x5c4,0x5c4,0x5c4,0x5c4,0x5c4,0x5c1,0x5c4,0x5c1,0x5c1, -0x5c4,0x5c4,0x5c1,0x5c1,0x5c1,0x5c1,0x5c1,0x5c4,0x5c1,0x5c1,0x5c4,0x5c1,0x5c4,0x5c4,0x5c4,0x5c1, -0x5c4,0x5c4,0x5c4,0x5c4,0x93,0x93,0x5c4,0x5c4,0x5c4,0x5c4,0x5c1,0x5c1,0x5c4,0x5c1,0x5c1,0x5c1, -0x5c1,0x5c4,0x5c1,0x5c1,0x5c1,0x5c1,0x5c1,0x5c4,0x5c4,0x5c4,0x5c1,0x5c1,0x93,0x93,0x93,0x93, -0x93,0x93,0x93,0x93,0xb0a,0xb0a,0xb0a,0xb0a,0xb0a,0xb0a,0xb0a,0xb0a,0xb0a,0xb0a,0xb0a,0xb0a, -0xb0a,0xb0a,0xb0a,0xb0a,0x5c7,0x5c7,0x91e,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5be,0x5be, -0xbc1,0xd47,0x93,0x93,0x825,0x837,0x834,0x837,0x834,0xc4b,0xc4b,0xd3b,0xd38,0x828,0x828,0x828, -0x828,0x83a,0x83a,0x83a,0x852,0x855,0x864,0x96,0x858,0x85b,0x867,0x867,0x84f,0x846,0x840,0x846, -0x840,0x846,0x840,0x843,0x843,0x85e,0x85e,0x861,0x85e,0x85e,0x85e,0x96,0x85e,0x84c,0x849,0x843, -0x96,0x96,0x96,0x96,0x5d3,0x5df,0x5d3,0xbc4,0x5d3,0x99,0x5d3,0x5df,0x5d3,0x5df,0x5d3,0x5df, -0x5d3,0x5df,0x5d3,0x5df,0x5df,0x5dc,0x5d6,0x5d9,0x5df,0x5dc,0x5d6,0x5d9,0x5df,0x5dc,0x5d6,0x5d9, -0x5df,0x5dc,0x5d6,0x5dc,0x5d6,0x5dc,0x5d6,0x5d9,0x5df,0x5dc,0x5d6,0x5dc,0x5d6,0x5dc,0x5d6,0x5dc, -0x5d6,0x99,0x99,0x5d0,0x723,0x726,0x73b,0x73e,0x71d,0x726,0x726,0x9f,0x705,0x708,0x708,0x708, -0x708,0x705,0x705,0x9f,0x9c,0x9c,0x9c,0x9c,0x9c,0x9c,0x9c,0x9c,0x9c,0xac5,0xac5,0xac5, -0x984,0x6ff,0x5e2,0x5e2,0x9f,0x74d,0x72c,0x71d,0x726,0x723,0x71d,0x72f,0x720,0x71a,0x71d,0x73b, -0x732,0x729,0x74a,0x71d,0x747,0x747,0x747,0x747,0x747,0x747,0x747,0x747,0x747,0x747,0x738,0x735, -0x73b,0x73b,0x73b,0x74d,0x70e,0x70b,0x70b,0x70b,0x70b,0x70b,0x70b,0x70b,0x70b,0x70b,0x70b,0x70b, -0x70b,0x70b,0x70b,0x70b,0x70b,0x70b,0x70b,0x70b,0x70b,0x70b,0x70b,0x70b,0x70b,0x70b,0x70b,0x70b, -0x70b,0x70b,0x70b,0x9f,0x9f,0x9f,0x70b,0x70b,0x70b,0x70b,0x70b,0x70b,0x9f,0x9f,0x70b,0x70b, -0x70b,0x70b,0x70b,0x70b,0x9f,0x9f,0x70b,0x70b,0x70b,0x70b,0x70b,0x70b,0x9f,0x9f,0x70b,0x70b, -0x70b,0x9f,0x9f,0x9f,0xb0d,0xb0d,0xb0d,0xb0d,0xa2,0xa2,0xa2,0xa2,0xa2,0xa2,0xa2,0xa2, -0xa2,0xa2,0xa2,0xa2,0xb13,0xb13,0xb13,0xb13,0xb13,0xb13,0xb13,0xb13,0xb13,0xb13,0xb13,0xb13, -0xb13,0xb13,0xb13,0xb13,0xb13,0xb13,0xb13,0xa5,0xa5,0xa5,0xa5,0xa5,0x161a,0x161a,0x161a,0x161a, -0x161a,0x161a,0x161a,0x161a,0x161a,0x161a,0x161a,0x161a,0x161a,0x161a,0x161a,0x161a,0xb1c,0xb1c,0xb1c,0xb1c, +0x813,0x813,0x813,0x813,0x813,0x813,0x813,0x813,0x813,0x10e6,0x18c3,0x78,0x7b,0x816,0x816,0x816, +0x816,0x816,0x816,0x816,0x816,0x816,0x816,0x816,0x816,0x816,0x816,0x816,0x816,0x816,0x816,0x7b, +0x8e2,0x8e2,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5, +0xaf5,0xaf5,0xaf5,0xaf5,0xaf5,0xaf5,0xaf5,0xaf5,0xaf5,0xaf5,0xaf5,0xaf5,0xaf5,0xaf5,0xaf5,0xaf5, +0xaf5,0xaf5,0xaf5,0xaf5,0xaf5,0xaf5,0xaf5,0xaf5,0x1389,0x1389,0x1389,0x7e,0x7e,0x7e,0x7e,0x7e, +0x81f,0x81f,0x81f,0x81f,0x81f,0x81f,0x81f,0x81f,0x81f,0x81f,0x81f,0x81f,0x81f,0x81f,0x81f,0x81f, +0x81f,0x81f,0x81f,0x81f,0x81f,0x81f,0x81f,0x81f,0x81f,0x81f,0x81f,0x81f,0x81f,0xd41,0xd41,0x81, +0x825,0x825,0x825,0x825,0x825,0x825,0x825,0x825,0x825,0x825,0x825,0x825,0x825,0x825,0x825,0x825, +0x825,0x825,0x825,0x825,0x825,0x825,0x825,0x825,0x825,0x825,0x825,0x825,0x825,0x825,0x825,0x81, +0xafb,0xafb,0xafb,0xafb,0xafb,0xafb,0xafb,0xafb,0xafb,0xafb,0xafb,0xafb,0xafb,0x84,0x84,0x84, +0xb01,0xb01,0xb01,0xb01,0xb01,0xb01,0xb01,0xb01,0xb01,0xb01,0xb01,0xb01,0xb01,0xb01,0xb01,0xb01, +0xb01,0xc48,0xb01,0xb01,0xb01,0xc48,0xb01,0x87,0x87,0x87,0x87,0x87,0x87,0x87,0x87,0x87, +0x1188,0x1188,0x1188,0x1188,0x1188,0x1188,0x1188,0x1188,0x1188,0x1188,0x1188,0x1188,0x1188,0x1188,0x1188,0x1188, +0x993,0x993,0x993,0x993,0x8a,0x8a,0x8a,0x8a,0x8a,0x8a,0x8a,0x8a,0x8a,0x8a,0x8a,0x8a, +0x11fd,0x11fd,0x11fd,0x11fd,0x11fd,0x11fd,0x11fd,0x11fd,0x11fd,0x11fd,0x11fd,0x11fd,0x11fd,0x11fd,0x11fd,0x11fd, +0x5c4,0x5c4,0x5c4,0x5c4,0x5c4,0x5c4,0x5c4,0x8d,0x8d,0x8d,0x8d,0x8d,0x8d,0x8d,0x8d,0x8d, +0x8d,0x8d,0x8d,0x5b2,0x5b2,0x5b2,0x5b2,0x5b2,0x8d,0x8d,0x8d,0x8d,0x8d,0xad4,0x5b5,0x5bb, +0x5c1,0x5c1,0x5c1,0x5c1,0x5c1,0x5c1,0x5c1,0x5c1,0x5c1,0x5b8,0x5bb,0x5bb,0x5bb,0x5bb,0x5bb,0x5bb, +0x5bb,0x5bb,0x5bb,0x5bb,0x5bb,0x5bb,0x5bb,0x8d,0x5bb,0x5bb,0x5bb,0x5bb,0x5bb,0x8d,0x5bb,0x8d, +0x5bb,0x5bb,0x8d,0x5bb,0x5bb,0x8d,0x5bb,0x5bb,0x5bb,0x5bb,0x5bb,0x5bb,0x5bb,0x5bb,0x5bb,0x5be, +0x5d6,0x5d0,0x5d6,0x5d0,0x5d3,0x5d9,0x5d6,0x5d0,0x5d3,0x5d9,0x5d6,0x5d0,0x5d3,0x5d9,0x5d6,0x5d0, +0x1308,0x1308,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90, +0x90,0x90,0x90,0x5d6,0x5d0,0x5d3,0x5d9,0x5d6,0x5d0,0x5d6,0x5d0,0x5d6,0x5d0,0x5d6,0x5d6,0x5d0, +0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90, +0x5d3,0x5d0,0x5d3,0x5d3,0x5d3,0x5d3,0x5d3,0x5d3,0x5d0,0x5d3,0x5d0,0x5d0,0x5d3,0x5d3,0x5d0,0x5d0, +0x5d0,0x5d0,0x5d0,0x5d3,0x5d0,0x5d0,0x5d3,0x5d0,0x5d3,0x5d3,0x5d3,0x5d0,0x5d3,0x5d3,0x5d3,0x5d3, +0x90,0x90,0x5d3,0x5d3,0x5d3,0x5d3,0x5d0,0x5d0,0x5d3,0x5d0,0x5d0,0x5d0,0x5d0,0x5d3,0x5d0,0x5d0, +0x5d0,0x5d0,0x5d0,0x5d3,0x5d3,0x5d3,0x5d0,0x5d0,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90, 0xb1c,0xb1c,0xb1c,0xb1c,0xb1c,0xb1c,0xb1c,0xb1c,0xb1c,0xb1c,0xb1c,0xb1c,0xb1c,0xb1c,0xb1c,0xb1c, -0xb1c,0xb1c,0xa8,0xa8,0xa8,0xa8,0xa8,0xa8,0xa8,0xa8,0xa8,0xa8,0xb28,0xb28,0xb28,0xb28, -0xb28,0xb28,0xb28,0xab,0xab,0xfb4,0xb28,0xb28,0xb28,0xb28,0xb28,0xb28,0xb28,0xb28,0xb28,0xb28, -0xb28,0xb28,0xb28,0xb28,0xb28,0xb28,0xb28,0xb28,0xb28,0xb28,0xb28,0xb28,0x16d1,0x16d1,0x16d1,0x16d1, -0x16d1,0x16d1,0x16d1,0x16d1,0x16d1,0xab,0xab,0xab,0xab,0xab,0xab,0xab,0xab,0xab,0xab,0xab, -0xab,0xab,0xab,0xab,0xab,0xab,0xab,0xab,0xab,0xab,0xab,0xab,0xb40,0xb40,0xb40,0xb40, -0xb40,0xb40,0xb40,0xb40,0xb40,0xb40,0xb40,0xb40,0xb40,0xb40,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d, -0xb3d,0xae,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb40,0xb40,0xb3d,0xb3d, -0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d, -0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb40,0xae,0xb40,0xb40,0xae,0xae,0xb40,0xae, -0xae,0xb40,0xb40,0xae,0xae,0xb40,0xb40,0xb40,0xb40,0xae,0xb40,0xb40,0xb40,0xb40,0xb40,0xb40, -0xb40,0xb40,0xb3d,0xb3d,0xb3d,0xb3d,0xae,0xb3d,0xae,0xb3d,0xb3d,0xb3d,0xb3d,0xcc0,0xb3d,0xb3d, -0xae,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb40,0xb40,0xb40,0xb40, -0xb40,0xb40,0xb40,0xb40,0xb40,0xb40,0xb40,0xb40,0xb40,0xb40,0xb40,0xb40,0xb3d,0xb3d,0xb3d,0xb3d, -0xb40,0xb40,0xae,0xb40,0xb40,0xb40,0xb40,0xae,0xae,0xb40,0xb40,0xb40,0xb40,0xb40,0xb40,0xb40, -0xb40,0xae,0xb40,0xb40,0xb40,0xb40,0xb40,0xb40,0xb40,0xae,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d, -0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d, -0xb3d,0xb3d,0xb3d,0xb3d,0xb40,0xb40,0xae,0xb40,0xb40,0xb40,0xb40,0xae,0xb40,0xb40,0xb40,0xb40, -0xb40,0xae,0xb40,0xae,0xae,0xae,0xb40,0xb40,0xb40,0xb40,0xb40,0xb40,0xb40,0xae,0xb3d,0xb3d, -0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xdaa,0xdaa,0xae,0xae, -0xb40,0xb40,0xb40,0xb40,0xb40,0xb40,0xb40,0xb40,0xb40,0xb40,0xb40,0xb40,0xb40,0xb40,0xb40,0xb40, -0xb40,0xb40,0xb40,0xb40,0xb40,0xb40,0xb40,0xb40,0xb3d,0xb3d,0xb3d,0xb37,0xb3d,0xb3d,0xb3d,0xb3d, -0xb3d,0xb3d,0xec1,0xebe,0xae,0xae,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a, -0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb1,0xb46,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1, -0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1, -0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xbd3,0xbd3,0xbd3,0xbd3,0xbd3,0xbd3,0xbd3,0xbd3, -0xbd3,0xbd3,0xbd3,0xbd3,0xbd3,0xb4,0xbd3,0xbd3,0xbd3,0xbd3,0xbcd,0xbcd,0xbd0,0xb4,0xb4,0xb4, -0xb4,0xb4,0xb4,0xb4,0xb4,0xb4,0xb4,0xb4,0xbdc,0xbdc,0xbdc,0xbdc,0xbdc,0xbdc,0xbdc,0xbdc, -0xbdc,0xbdc,0xbdc,0xbdc,0xbdc,0xbdc,0xbdc,0xbdc,0xbdc,0xbdc,0xbd6,0xbd6,0xbd9,0xc3f,0xc3f,0xb7, -0xb7,0xb7,0xb7,0xb7,0xb7,0xb7,0xb7,0xb7,0xbe2,0xbe2,0xbe2,0xbe2,0xbe2,0xbe2,0xbe2,0xbe2, -0xbe2,0xbe2,0xbe2,0xbe2,0xbe2,0xbe2,0xbe2,0xbe2,0xbe2,0xbe2,0xbdf,0xbdf,0xba,0xba,0xba,0xba, -0xba,0xba,0xba,0xba,0xba,0xba,0xba,0xba,0xbe8,0xbe8,0xbe8,0xbe8,0xbe8,0xbe8,0xbe8,0xbe8, -0xbe8,0xbe8,0xbe8,0xbe8,0xbe8,0xbd,0xbe8,0xbe8,0xbe8,0xbd,0xbe5,0xbe5,0xbd,0xbd,0xbd,0xbd, -0xbd,0xbd,0xbd,0xbd,0xbd,0xbd,0xbd,0xbd,0xcd2,0xcd2,0xcd2,0xcd2,0xcd2,0xcd2,0xcd2,0xcd2, -0xcd2,0xcd2,0xcd2,0xcd2,0xcd2,0xcd2,0xcd2,0xcd2,0xcd2,0xcd2,0xcd2,0xcd2,0xcd2,0xcd2,0xcd2,0xcd2, -0xcd2,0xcd2,0xcd2,0xcd2,0xcd2,0x14cd,0x14cd,0xc0,0xcc3,0xcc3,0xcc3,0xccf,0xccf,0xccf,0xccf,0xcc3, -0xcc3,0xccf,0xccf,0xccf,0xc0,0xc0,0xc0,0xc0,0xccf,0xccf,0xcc3,0xccf,0xccf,0xccf,0xccf,0xccf, -0xccf,0xcc6,0xcc6,0xcc6,0xc0,0xc0,0xc0,0xc0,0xcc9,0xc0,0xc0,0xc0,0xcd5,0xcd5,0xccc,0xccc, -0xccc,0xccc,0xccc,0xccc,0xccc,0xccc,0xccc,0xccc,0xcd8,0xcd8,0xcd8,0xcd8,0xcd8,0xcd8,0xcd8,0xcd8, -0xcd8,0xcd8,0xcd8,0xcd8,0xcd8,0xcd8,0xcd8,0xcd8,0xcd8,0xcd8,0xc3,0xc3,0xcd8,0xcd8,0xcd8,0xcd8, -0xcd8,0xc3,0xc3,0xc3,0xc3,0xc3,0xc3,0xc3,0xc3,0xc3,0xc3,0xc3,0x14d0,0x14d0,0x14d0,0x14d0, -0x14d0,0x14d0,0x14d0,0x14d0,0x14d0,0x14d0,0x14d0,0x14d0,0x14d0,0x14d0,0x14d0,0x14d0,0x14d0,0x14d0,0x14d0,0x14d0, -0xc6,0xc6,0x14d0,0x14d0,0x14d0,0x14d0,0x14d0,0x14d0,0x14d0,0x14d0,0x14d0,0x14d0,0x14d0,0x14d0,0x14d0,0x14d0, -0x14d0,0x14d0,0x14d0,0x14d0,0x14d0,0x14d0,0x14d0,0x14d0,0x14d0,0x14d0,0xc6,0xc6,0x14d0,0x14d0,0x14d0,0x14d0, -0x14d0,0x14d0,0x14d0,0x14d0,0x14d0,0x14d0,0x14d0,0x14d0,0x14d0,0x14d0,0x14d0,0x14d0,0x14d0,0x14d0,0x14d0,0x14d0, -0x14d0,0x14d0,0x14d0,0x14d0,0x14d0,0x14d0,0xc6,0xc6,0xc6,0x14d0,0x14d0,0x14d0,0x14d0,0x14d0,0x14d0,0x14d0, -0x14d0,0x14d0,0x14d0,0x14d0,0x14d0,0xc6,0x14d0,0x14d0,0x14d0,0x14d0,0x14d0,0x14d0,0x14d0,0x14d0,0xc6,0xc6, -0xc6,0xc6,0xc6,0xc6,0xc6,0xc6,0xc6,0xc6,0xc6,0xc6,0xc6,0xc6,0x16d4,0x16d4,0x16d4,0x16d4, -0xc6,0xc6,0xc6,0xc6,0xc6,0xc6,0xc6,0xc6,0xc6,0xc6,0xc6,0xc6,0xc6,0xc6,0xc6,0xc6, -0xcff,0xcff,0xcff,0xcff,0xcff,0xcff,0xcff,0xcff,0xcff,0xcff,0xcff,0xcff,0xc9,0xcff,0xcff,0xcff, -0xcff,0xcff,0xcff,0xcff,0xcff,0xcff,0xcff,0xcff,0xcff,0xcff,0xcff,0xcff,0xcff,0xcff,0xcff,0xcff, -0xcff,0xcff,0xcff,0xc9,0xcff,0xcff,0xcff,0xcff,0xcff,0xcff,0xcff,0xcff,0xcff,0xcff,0xcff,0xcff, -0xcff,0xcff,0xcff,0xcff,0xcff,0xcff,0xcff,0xc9,0xcff,0xcff,0xc9,0xcff,0xcff,0xcff,0xcff,0xcff, -0xcff,0xcff,0xcff,0xcff,0xcff,0xcff,0xcff,0xcff,0xcff,0xcff,0xc9,0xc9,0xcff,0xcff,0xcff,0xcff, -0xcff,0xcff,0xcff,0xcff,0xcff,0xcff,0xcff,0xcff,0xcff,0xcff,0xc9,0xc9,0xc9,0xc9,0xc9,0xc9, -0xc9,0xc9,0xc9,0xc9,0xc9,0xc9,0xc9,0xc9,0xc9,0xc9,0xc9,0xc9,0xc9,0xc9,0xc9,0xc9, -0xc9,0xc9,0xc9,0xc9,0xc9,0xc9,0xc9,0xc9,0xc9,0xc9,0xc9,0xc9,0xd02,0xd02,0xd02,0xd02, -0xd02,0xd02,0xd02,0xd02,0xd02,0xd02,0xd02,0xd02,0xd02,0xd02,0xd02,0xd02,0xd02,0xd02,0xd02,0xd02, -0xd02,0xd02,0xd02,0xd02,0xd02,0xd02,0xd02,0xcc,0xcc,0xcc,0xcc,0xcc,0xd44,0xd44,0xd44,0xcf, -0xcf,0xcf,0xcf,0xd3e,0xd3e,0xd3e,0xd3e,0xd3e,0xd3e,0xd3e,0xd3e,0xd3e,0xd3e,0xd3e,0xd3e,0xd3e, -0xd3e,0xd3e,0xd3e,0xd3e,0xd3e,0xd3e,0xd3e,0xd3e,0xd3e,0xd3e,0xd3e,0xd3e,0xcf,0xcf,0xcf,0xd41, -0xd41,0xd41,0xd41,0xd41,0xd41,0xd41,0xd41,0xd41,0xd08,0xd08,0xd08,0xd08,0xd08,0xd08,0xd08,0xd08, -0xd08,0xd08,0xd08,0xd08,0xd08,0xd08,0xd08,0xd08,0xd08,0xd08,0xd08,0xd08,0xd08,0xd08,0xd08,0xd08, -0xd08,0xd08,0xd08,0xd08,0xd08,0xd08,0xd2,0xd05,0xd11,0xd11,0xd11,0xd11,0xd11,0xd11,0xd11,0xd11, +0x5d6,0x5d6,0x930,0x5d6,0x5d6,0x5d6,0x5d6,0x5d6,0x5d6,0x5d6,0x5cd,0x5cd,0xbd3,0xd59,0x90,0x90, +0x837,0x849,0x846,0x849,0x846,0xc5d,0xc5d,0xd4d,0xd4a,0x83a,0x83a,0x83a,0x83a,0x84c,0x84c,0x84c, +0x864,0x867,0x876,0x93,0x86a,0x86d,0x879,0x879,0x861,0x858,0x852,0x858,0x852,0x858,0x852,0x855, +0x855,0x870,0x870,0x873,0x870,0x870,0x870,0x93,0x870,0x85e,0x85b,0x855,0x93,0x93,0x93,0x93, +0x5e2,0x5ee,0x5e2,0xbd6,0x5e2,0x96,0x5e2,0x5ee,0x5e2,0x5ee,0x5e2,0x5ee,0x5e2,0x5ee,0x5e2,0x5ee, +0x5ee,0x5eb,0x5e5,0x5e8,0x5ee,0x5eb,0x5e5,0x5e8,0x5ee,0x5eb,0x5e5,0x5e8,0x5ee,0x5eb,0x5e5,0x5eb, +0x5e5,0x5eb,0x5e5,0x5e8,0x5ee,0x5eb,0x5e5,0x5eb,0x5e5,0x5eb,0x5e5,0x5eb,0x5e5,0x96,0x96,0x5df, +0x735,0x738,0x74d,0x750,0x72f,0x738,0x738,0x9c,0x717,0x71a,0x71a,0x71a,0x71a,0x717,0x717,0x9c, +0x99,0x99,0x99,0x99,0x99,0x99,0x99,0x99,0x99,0xad7,0xad7,0xad7,0x996,0x711,0x5f1,0x5f1, +0x9c,0x75f,0x73e,0x72f,0x738,0x735,0x72f,0x741,0x732,0x72c,0x72f,0x74d,0x744,0x73b,0x75c,0x72f, +0x759,0x759,0x759,0x759,0x759,0x759,0x759,0x759,0x759,0x759,0x74a,0x747,0x74d,0x74d,0x74d,0x75f, +0x720,0x71d,0x71d,0x71d,0x71d,0x71d,0x71d,0x71d,0x71d,0x71d,0x71d,0x71d,0x71d,0x71d,0x71d,0x71d, +0x71d,0x71d,0x71d,0x71d,0x71d,0x71d,0x71d,0x71d,0x71d,0x71d,0x71d,0x71d,0x71d,0x71d,0x71d,0x9c, +0x9c,0x9c,0x71d,0x71d,0x71d,0x71d,0x71d,0x71d,0x9c,0x9c,0x71d,0x71d,0x71d,0x71d,0x71d,0x71d, +0x9c,0x9c,0x71d,0x71d,0x71d,0x71d,0x71d,0x71d,0x9c,0x9c,0x71d,0x71d,0x71d,0x9c,0x9c,0x9c, +0xb1f,0xb1f,0xb1f,0xb1f,0x9f,0x9f,0x9f,0x9f,0x9f,0x9f,0x9f,0x9f,0x9f,0x1860,0x1860,0x1860, +0xb25,0xb25,0xb25,0xb25,0xb25,0xb25,0xb25,0xb25,0xb25,0xb25,0xb25,0xb25,0xb25,0xb25,0xb25,0xb25, +0xb25,0xb25,0xb25,0xa2,0xa2,0xa2,0xa2,0xa2,0x162c,0x162c,0x162c,0x162c,0x162c,0x162c,0x162c,0x162c, +0x162c,0x162c,0x162c,0x162c,0x162c,0x162c,0x162c,0x162c,0xb2e,0xb2e,0xb2e,0xb2e,0xb2e,0xb2e,0xb2e,0xb2e, +0xb2e,0xb2e,0xb2e,0xb2e,0xb2e,0xb2e,0xb2e,0xb2e,0xb2e,0xb2e,0xb2e,0xb2e,0xb2e,0xb2e,0xa5,0xa5, +0xa5,0xa5,0xa5,0xa5,0xa5,0xa5,0xa5,0xa5,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xa8, +0xa8,0xfc9,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a, +0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0x16e6,0x16e6,0x16e6,0x16e6,0x16e6,0x16e6,0x16e6,0x16e6, +0x16e6,0xa8,0xa8,0xa8,0xa8,0xa8,0xa8,0xa8,0xa8,0xa8,0xa8,0xa8,0xa8,0xa8,0xa8,0xa8, +0xa8,0xa8,0xa8,0xa8,0xa8,0xa8,0xa8,0xa8,0xb52,0xb52,0xb52,0xb52,0xb52,0xb52,0xb52,0xb52, +0xb52,0xb52,0xb52,0xb52,0xb52,0xb52,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xab,0xb4f,0xb4f, +0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb52,0xb52,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f, +0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f, +0xb4f,0xb4f,0xb4f,0xb4f,0xb52,0xab,0xb52,0xb52,0xab,0xab,0xb52,0xab,0xab,0xb52,0xb52,0xab, +0xab,0xb52,0xb52,0xb52,0xb52,0xab,0xb52,0xb52,0xb52,0xb52,0xb52,0xb52,0xb52,0xb52,0xb4f,0xb4f, +0xb4f,0xb4f,0xab,0xb4f,0xab,0xb4f,0xb4f,0xb4f,0xb4f,0xcd2,0xb4f,0xb4f,0xab,0xb4f,0xb4f,0xb4f, +0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb52,0xb52,0xb52,0xb52,0xb52,0xb52,0xb52,0xb52, +0xb52,0xb52,0xb52,0xb52,0xb52,0xb52,0xb52,0xb52,0xb4f,0xb4f,0xb4f,0xb4f,0xb52,0xb52,0xab,0xb52, +0xb52,0xb52,0xb52,0xab,0xab,0xb52,0xb52,0xb52,0xb52,0xb52,0xb52,0xb52,0xb52,0xab,0xb52,0xb52, +0xb52,0xb52,0xb52,0xb52,0xb52,0xab,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f, +0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f, +0xb52,0xb52,0xab,0xb52,0xb52,0xb52,0xb52,0xab,0xb52,0xb52,0xb52,0xb52,0xb52,0xab,0xb52,0xab, +0xab,0xab,0xb52,0xb52,0xb52,0xb52,0xb52,0xb52,0xb52,0xab,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f, +0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xdbf,0xdbf,0xab,0xab,0xb52,0xb52,0xb52,0xb52, +0xb52,0xb52,0xb52,0xb52,0xb52,0xb52,0xb52,0xb52,0xb52,0xb52,0xb52,0xb52,0xb52,0xb52,0xb52,0xb52, +0xb52,0xb52,0xb52,0xb52,0xb4f,0xb4f,0xb4f,0xb49,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xed6,0xed3, +0xab,0xab,0xb4c,0xb4c,0xb4c,0xb4c,0xb4c,0xb4c,0xb4c,0xb4c,0xb4c,0xb4c,0xb4c,0xb4c,0xb4c,0xb4c, +0xb4c,0xb4c,0xb4c,0xb4c,0xae,0xb58,0xae,0xae,0xae,0xae,0xae,0xae,0xae,0xae,0xae,0xae, +0xae,0xae,0xae,0xae,0xae,0xae,0xae,0xae,0xae,0xae,0xae,0xae,0xae,0xae,0xae,0xae, +0xae,0xae,0xae,0xae,0xbe5,0xbe5,0xbe5,0xbe5,0xbe5,0xbe5,0xbe5,0xbe5,0xbe5,0xbe5,0xbe5,0xbe5, +0xbe5,0xb1,0xbe5,0xbe5,0xbe5,0xbe5,0xbdf,0xbdf,0xbe2,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1, +0xb1,0xb1,0xb1,0xb1,0xbee,0xbee,0xbee,0xbee,0xbee,0xbee,0xbee,0xbee,0xbee,0xbee,0xbee,0xbee, +0xbee,0xbee,0xbee,0xbee,0xbee,0xbee,0xbe8,0xbe8,0xbeb,0xc51,0xc51,0xb4,0xb4,0xb4,0xb4,0xb4, +0xb4,0xb4,0xb4,0xb4,0xbf4,0xbf4,0xbf4,0xbf4,0xbf4,0xbf4,0xbf4,0xbf4,0xbf4,0xbf4,0xbf4,0xbf4, +0xbf4,0xbf4,0xbf4,0xbf4,0xbf4,0xbf4,0xbf1,0xbf1,0xb7,0xb7,0xb7,0xb7,0xb7,0xb7,0xb7,0xb7, +0xb7,0xb7,0xb7,0xb7,0xbfa,0xbfa,0xbfa,0xbfa,0xbfa,0xbfa,0xbfa,0xbfa,0xbfa,0xbfa,0xbfa,0xbfa, +0xbfa,0xba,0xbfa,0xbfa,0xbfa,0xba,0xbf7,0xbf7,0xba,0xba,0xba,0xba,0xba,0xba,0xba,0xba, +0xba,0xba,0xba,0xba,0xce4,0xce4,0xce4,0xce4,0xce4,0xce4,0xce4,0xce4,0xce4,0xce4,0xce4,0xce4, +0xce4,0xce4,0xce4,0xce4,0xce4,0xce4,0xce4,0xce4,0xce4,0xce4,0xce4,0xce4,0xce4,0xce4,0xce4,0xce4, +0xce4,0x14e2,0x14e2,0xbd,0xcd5,0xcd5,0xcd5,0xce1,0xce1,0xce1,0xce1,0xcd5,0xcd5,0xce1,0xce1,0xce1, +0xbd,0xbd,0xbd,0xbd,0xce1,0xce1,0xcd5,0xce1,0xce1,0xce1,0xce1,0xce1,0xce1,0xcd8,0xcd8,0xcd8, +0xbd,0xbd,0xbd,0xbd,0xcdb,0xbd,0xbd,0xbd,0xce7,0xce7,0xcde,0xcde,0xcde,0xcde,0xcde,0xcde, +0xcde,0xcde,0xcde,0xcde,0xcea,0xcea,0xcea,0xcea,0xcea,0xcea,0xcea,0xcea,0xcea,0xcea,0xcea,0xcea, +0xcea,0xcea,0xcea,0xcea,0xcea,0xcea,0xc0,0xc0,0xcea,0xcea,0xcea,0xcea,0xcea,0xc0,0xc0,0xc0, +0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,0x14e5,0x14e5,0x14e5,0x14e5,0x14e5,0x14e5,0x14e5,0x14e5, +0x14e5,0x14e5,0x14e5,0x14e5,0x14e5,0x14e5,0x14e5,0x14e5,0x14e5,0x14e5,0x14e5,0x14e5,0xc3,0xc3,0x14e5,0x14e5, +0x14e5,0x14e5,0x14e5,0x14e5,0x14e5,0x14e5,0x14e5,0x14e5,0x14e5,0x14e5,0x14e5,0x14e5,0x14e5,0x14e5,0x14e5,0x14e5, +0x14e5,0x14e5,0x14e5,0x14e5,0x14e5,0x14e5,0xc3,0xc3,0x14e5,0x14e5,0x14e5,0x14e5,0x14e5,0x14e5,0x14e5,0x14e5, +0x14e5,0x14e5,0x14e5,0x14e5,0x14e5,0x14e5,0x14e5,0x14e5,0x14e5,0x14e5,0x14e5,0x14e5,0x14e5,0x14e5,0x14e5,0x14e5, +0x14e5,0x14e5,0xc3,0xc3,0xc3,0x14e5,0x14e5,0x14e5,0x14e5,0x14e5,0x14e5,0x14e5,0x14e5,0x14e5,0x14e5,0x14e5, +0x14e5,0xc3,0x14e5,0x14e5,0x14e5,0x14e5,0x14e5,0x14e5,0x14e5,0x14e5,0x1863,0xc3,0xc3,0xc3,0xc3,0xc3, +0xc3,0xc3,0xc3,0xc3,0xc3,0xc3,0xc3,0xc3,0x16e9,0x16e9,0x16e9,0x16e9,0xc3,0xc3,0xc3,0xc3, +0xc3,0xc3,0xc3,0xc3,0xc3,0xc3,0xc3,0xc3,0xc3,0xc3,0xc3,0xc3,0xd11,0xd11,0xd11,0xd11, +0xd11,0xd11,0xd11,0xd11,0xd11,0xd11,0xd11,0xd11,0xc6,0xd11,0xd11,0xd11,0xd11,0xd11,0xd11,0xd11, +0xd11,0xd11,0xd11,0xd11,0xd11,0xd11,0xd11,0xd11,0xd11,0xd11,0xd11,0xd11,0xd11,0xd11,0xd11,0xc6, 0xd11,0xd11,0xd11,0xd11,0xd11,0xd11,0xd11,0xd11,0xd11,0xd11,0xd11,0xd11,0xd11,0xd11,0xd11,0xd11, -0xd11,0xd11,0xd11,0xd11,0xd11,0xd11,0xd5,0xd5,0xd0e,0xd0e,0xd0e,0xd0e,0xd0e,0xd0e,0xd0e,0xd0e, -0xd0e,0xd0e,0xd5,0xd5,0xd5,0xd5,0xd5,0xd5,0x180c,0x180c,0x180c,0x180c,0x180c,0x180c,0x180c,0x180c, -0x180c,0x180c,0x180c,0x180c,0x180c,0x180c,0x180c,0x180c,0xd14,0xd14,0xd14,0xd14,0xd14,0xd14,0xd8,0xd8, -0xd14,0xd8,0xd14,0xd14,0xd14,0xd14,0xd14,0xd14,0xd14,0xd14,0xd14,0xd14,0xd14,0xd14,0xd14,0xd14, -0xd14,0xd14,0xd14,0xd14,0xd14,0xd14,0xd14,0xd14,0xd14,0xd14,0xd8,0xd14,0xd14,0xd8,0xd8,0xd8, -0xd14,0xd8,0xd8,0xd14,0xd17,0xd17,0xd17,0xd17,0xd17,0xd17,0xd17,0xd17,0xd17,0xd17,0xd17,0xd17, -0xd17,0xd17,0xd17,0xd17,0xd17,0xd17,0xd17,0xd17,0xd17,0xd17,0xd17,0xdb,0xdb,0xdb,0xdb,0xdb, -0xdb,0xdb,0xdb,0xdb,0xdc5,0xdc5,0xdc5,0xdc5,0xdc5,0xdc5,0xdc5,0xdc5,0xdc5,0xdc5,0xdc5,0x14d3, -0x14d3,0x1785,0x1785,0xe1,0x10b0,0x10b0,0x10b0,0x10b0,0x10b0,0x10b0,0x10b0,0x10b0,0x10b0,0x10b0,0x10b0,0x10b0, -0x138,0x138,0x138,0x138,0xdd7,0xdd7,0xdd7,0xdd7,0xdd7,0xdd7,0xdd7,0xdd7,0xdd7,0xdd7,0xdd7,0xdd7, -0xdd7,0xdd7,0xdd7,0xdd7,0xdd7,0xdd7,0xdd7,0xdd7,0xdd7,0xdd7,0xdd7,0xdce,0xdce,0xdd4,0xdd4,0xdce, -0xe4,0xe4,0xdd1,0xdd1,0x10e0,0x10e0,0x10e0,0x10e0,0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0xe7, -0xe7,0xe7,0xe7,0xe7,0xc3c,0xc3c,0xc3c,0xc3c,0xc3c,0xc3c,0xc3c,0xc3c,0xc3c,0xc3c,0xc3c,0xc3c, -0xc3c,0xc3c,0xc3c,0xc3c,0xfcf,0xfcf,0xfcf,0xfcf,0xfcf,0xfcf,0xfcf,0x14d6,0x14d6,0x14d6,0x14d6,0x14d6, -0x14d6,0x14d6,0x14d6,0x14d6,0x14d6,0x14d6,0x14d6,0x14d6,0x14d6,0x14d9,0xea,0xea,0xea,0xea,0xea,0x1788, -0x12ff,0x1122,0xed0,0xed0,0xde9,0xde6,0xde9,0xde6,0xde6,0xddd,0xddd,0xddd,0xddd,0xddd,0xddd,0x112b, -0x1128,0x112b,0x1128,0x1125,0x1125,0x1125,0x13c5,0x13c2,0xed,0xed,0xed,0xed,0xed,0xde3,0xde0,0xde0, -0xde0,0xddd,0xde3,0xde0,0xdec,0xdec,0xdec,0xdec,0xdec,0xdec,0xdec,0xdec,0xdec,0xdec,0xdec,0xdec, -0xdec,0xdec,0xdec,0xdec,0xdec,0xdec,0xdec,0xdec,0xdec,0xdec,0xdec,0xf0,0xf0,0xf0,0xf0,0xf0, -0xf0,0xf0,0xf0,0xf0,0xdec,0xdec,0xdec,0xdec,0xdec,0xdec,0xdec,0xf0,0xdec,0xdec,0xdec,0xdec, -0xdec,0xdec,0xdec,0xf0,0xdec,0xdec,0xdec,0xdec,0xdec,0xdec,0xdec,0xf0,0xdec,0xdec,0xdec,0xdec, -0xdec,0xdec,0xdec,0xf0,0xdf2,0xdf2,0xdf2,0xdf2,0xdf2,0xdf2,0xdf2,0xdf2,0xdf2,0xdf2,0xdf2,0xdf2, -0xdf2,0xdf2,0xdf2,0xdf2,0xdef,0xdef,0xdef,0xdef,0xdef,0xdef,0xdef,0xdef,0xdef,0xdef,0xf3,0xf3, -0xf3,0xf3,0xf3,0xf3,0xdf5,0xdf5,0xdf5,0xdf5,0xdf5,0xdf5,0xf6,0x13c8,0xf6,0xf6,0xf6,0xf6, -0xf6,0x13c8,0xf6,0xf6,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f, -0xe4f,0xe4f,0xe4f,0xe4f,0xdfb,0xdfb,0xdfb,0xdfb,0xdfb,0xdfb,0xdfb,0xdfb,0xdfb,0xdfb,0xdfb,0xdfb, -0xdfb,0xdfb,0xdfb,0xf9,0xdf8,0xdf8,0xdf8,0xdf8,0xdf8,0xdf8,0xdf8,0xdf8,0xdf8,0xdf8,0xdf8,0xdf8, -0xdf8,0xdf8,0xdf8,0xdf8,0xdf8,0xdf8,0xdf8,0xdf8,0xdf8,0xdf8,0xdf8,0xdf8,0xdf8,0xdf8,0xdf8,0xdf8, -0xdf8,0xdf8,0xdf8,0xf9,0xe0d,0xe01,0xe01,0xe01,0xfc,0xe01,0xe01,0xfc,0xfc,0xfc,0xfc,0xfc, -0xe01,0xe01,0xe01,0xe01,0xe0d,0xe0d,0xe0d,0xe0d,0xfc,0xe0d,0xe0d,0xe0d,0xfc,0xe0d,0xe0d,0xe0d, +0xd11,0xd11,0xd11,0xc6,0xd11,0xd11,0xc6,0xd11,0xd11,0xd11,0xd11,0xd11,0xd11,0xd11,0xd11,0xd11, +0xd11,0xd11,0xd11,0xd11,0xd11,0xd11,0xc6,0xc6,0xd11,0xd11,0xd11,0xd11,0xd11,0xd11,0xd11,0xd11, +0xd11,0xd11,0xd11,0xd11,0xd11,0xd11,0xc6,0xc6,0xc6,0xc6,0xc6,0xc6,0xc6,0xc6,0xc6,0xc6, +0xc6,0xc6,0xc6,0xc6,0xc6,0xc6,0xc6,0xc6,0xc6,0xc6,0xc6,0xc6,0xc6,0xc6,0xc6,0xc6, +0xc6,0xc6,0xc6,0xc6,0xc6,0xc6,0xc6,0xc6,0xd14,0xd14,0xd14,0xd14,0xd14,0xd14,0xd14,0xd14, +0xd14,0xd14,0xd14,0xd14,0xd14,0xd14,0xd14,0xd14,0xd14,0xd14,0xd14,0xd14,0xd14,0xd14,0xd14,0xd14, +0xd14,0xd14,0xd14,0xc9,0xc9,0xc9,0xc9,0xc9,0xd56,0xd56,0xd56,0xcc,0xcc,0xcc,0xcc,0xd50, +0xd50,0xd50,0xd50,0xd50,0xd50,0xd50,0xd50,0xd50,0xd50,0xd50,0xd50,0xd50,0xd50,0xd50,0xd50,0xd50, +0xd50,0xd50,0xd50,0xd50,0xd50,0xd50,0xd50,0xd50,0xcc,0xcc,0xcc,0xd53,0xd53,0xd53,0xd53,0xd53, +0xd53,0xd53,0xd53,0xd53,0xd1a,0xd1a,0xd1a,0xd1a,0xd1a,0xd1a,0xd1a,0xd1a,0xd1a,0xd1a,0xd1a,0xd1a, +0xd1a,0xd1a,0xd1a,0xd1a,0xd1a,0xd1a,0xd1a,0xd1a,0xd1a,0xd1a,0xd1a,0xd1a,0xd1a,0xd1a,0xd1a,0xd1a, +0xd1a,0xd1a,0xcf,0xd17,0xd23,0xd23,0xd23,0xd23,0xd23,0xd23,0xd23,0xd23,0xd23,0xd23,0xd23,0xd23, +0xd23,0xd23,0xd23,0xd23,0xd23,0xd23,0xd23,0xd23,0xd23,0xd23,0xd23,0xd23,0xd23,0xd23,0xd23,0xd23, +0xd23,0xd23,0xd2,0xd2,0xd20,0xd20,0xd20,0xd20,0xd20,0xd20,0xd20,0xd20,0xd20,0xd20,0xd2,0xd2, +0xd2,0xd2,0xd2,0xd2,0x1821,0x1821,0x1821,0x1821,0x1821,0x1821,0x1821,0x1821,0x1821,0x1821,0x1821,0x1821, +0x1821,0x1821,0x1821,0x1821,0xd26,0xd26,0xd26,0xd26,0xd26,0xd26,0xd5,0xd5,0xd26,0xd5,0xd26,0xd26, +0xd26,0xd26,0xd26,0xd26,0xd26,0xd26,0xd26,0xd26,0xd26,0xd26,0xd26,0xd26,0xd26,0xd26,0xd26,0xd26, +0xd26,0xd26,0xd26,0xd26,0xd26,0xd26,0xd5,0xd26,0xd26,0xd5,0xd5,0xd5,0xd26,0xd5,0xd5,0xd26, +0xd29,0xd29,0xd29,0xd29,0xd29,0xd29,0xd29,0xd29,0xd29,0xd29,0xd29,0xd29,0xd29,0xd29,0xd29,0xd29, +0xd29,0xd29,0xd29,0xd29,0xd29,0xd29,0xd29,0xd8,0xd8,0xd8,0xd8,0xd8,0xd8,0xd8,0xd8,0xd8, +0xdda,0xdda,0xdda,0xdda,0xdda,0xdda,0xdda,0xdda,0xdda,0xdda,0xdda,0x14e8,0x14e8,0x179a,0x179a,0xde, +0x10c5,0x10c5,0x10c5,0x10c5,0x10c5,0x10c5,0x10c5,0x10c5,0x10c5,0x10c5,0x10c5,0x10c5,0x135,0x135,0x135,0x135, +0xdec,0xdec,0xdec,0xdec,0xdec,0xdec,0xdec,0xdec,0xdec,0xdec,0xdec,0xdec,0xdec,0xdec,0xdec,0xdec, +0xdec,0xdec,0xdec,0xdec,0xdec,0xdec,0xdec,0xde3,0xde3,0xde9,0xde9,0xde3,0xe1,0xe1,0xde6,0xde6, +0x10f5,0x10f5,0x10f5,0x10f5,0xe4,0xe4,0xe4,0xe4,0xe4,0xe4,0xe4,0xe4,0xe4,0xe4,0xe4,0xe4, +0xc4e,0xc4e,0xc4e,0xc4e,0xc4e,0xc4e,0xc4e,0xc4e,0xc4e,0xc4e,0xc4e,0xc4e,0xc4e,0xc4e,0xc4e,0xc4e, +0xfe4,0xfe4,0xfe4,0xfe4,0xfe4,0xfe4,0xfe4,0x14eb,0x14eb,0x14eb,0x14eb,0x14eb,0x14eb,0x14eb,0x14eb,0x14eb, +0x14eb,0x14eb,0x14eb,0x14eb,0x14eb,0x14ee,0x1866,0x1866,0x1866,0x1866,0xe7,0x179d,0x1314,0x1137,0xee5,0xee5, +0xdfe,0xdfb,0xdfe,0xdfb,0xdfb,0xdf2,0xdf2,0xdf2,0xdf2,0xdf2,0xdf2,0x1140,0x113d,0x1140,0x113d,0x113a, +0x113a,0x113a,0x13da,0x13d7,0xea,0xea,0xea,0xea,0xea,0xdf8,0xdf5,0xdf5,0xdf5,0xdf2,0xdf8,0xdf5, +0xe01,0xe01,0xe01,0xe01,0xe01,0xe01,0xe01,0xe01,0xe01,0xe01,0xe01,0xe01,0xe01,0xe01,0xe01,0xe01, +0xe01,0xe01,0xe01,0xe01,0xe01,0xe01,0xe01,0xed,0xed,0xed,0xed,0xed,0xed,0xed,0xed,0xed, +0xe01,0xe01,0xe01,0xe01,0xe01,0xe01,0xe01,0xed,0xe01,0xe01,0xe01,0xe01,0xe01,0xe01,0xe01,0xed, +0xe01,0xe01,0xe01,0xe01,0xe01,0xe01,0xe01,0xed,0xe01,0xe01,0xe01,0xe01,0xe01,0xe01,0xe01,0xed, +0xe07,0xe07,0xe07,0xe07,0xe07,0xe07,0xe07,0xe07,0xe07,0xe07,0xe07,0xe07,0xe07,0xe07,0xe07,0xe07, +0xe04,0xe04,0xe04,0xe04,0xe04,0xe04,0xe04,0xe04,0xe04,0xe04,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0, +0xe0a,0xe0a,0xe0a,0xe0a,0xe0a,0xe0a,0xf3,0x13dd,0xf3,0xf3,0xf3,0xf3,0xf3,0x13dd,0xf3,0xf3, +0xe64,0xe64,0xe64,0xe64,0xe64,0xe64,0xe64,0xe64,0xe64,0xe64,0xe64,0xe64,0xe64,0xe64,0xe64,0xe64, +0xe10,0xe10,0xe10,0xe10,0xe10,0xe10,0xe10,0xe10,0xe10,0xe10,0xe10,0xe10,0xe10,0xe10,0xe10,0xf6, 0xe0d,0xe0d,0xe0d,0xe0d,0xe0d,0xe0d,0xe0d,0xe0d,0xe0d,0xe0d,0xe0d,0xe0d,0xe0d,0xe0d,0xe0d,0xe0d, -0xe0d,0xe0d,0xe0d,0xe0d,0xfc,0xfc,0xfc,0xfc,0xdfe,0xdfe,0xdfe,0xfc,0xfc,0xfc,0xfc,0xe04, -0xe07,0xe07,0xe07,0xe07,0xe07,0xe07,0xe07,0xe07,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc, -0xe0a,0xe0a,0xe0a,0xe0a,0xe0a,0xe0a,0xe10,0xe10,0xe07,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc, -0xe1c,0xe1c,0xe1c,0xe1c,0xe1c,0xe1c,0xe1c,0xe1c,0xe1c,0xe1c,0x1131,0x1131,0xff,0xff,0xff,0xff, -0xe1c,0xe1c,0xe1c,0xe1c,0xe1c,0xe1f,0xe1f,0xe1f,0xe1c,0xe1c,0xe1f,0xe1c,0xe1c,0xe1c,0xe1c,0xe1c, -0xe1c,0xe1c,0xe1c,0xe1c,0xe1c,0xe1c,0xff,0xff,0xff,0xff,0xff,0xff,0xe19,0xe19,0xe19,0xe19, -0xe19,0xe19,0xe19,0xe19,0xe19,0xe19,0x112e,0xff,0xff,0xff,0xe16,0xe16,0xe25,0xe25,0xe25,0xe25, -0x102,0x102,0x102,0x102,0xe25,0xe25,0xe25,0xe25,0xe25,0xe25,0xe25,0xe25,0xe22,0xe25,0xe25,0xe25, -0xe25,0xe25,0x102,0x102,0x102,0x102,0x102,0x102,0x102,0x102,0x102,0x102,0x14e2,0x14e8,0x14e5,0x1830, -0x178b,0x105,0x105,0x105,0x105,0x105,0x105,0x105,0x105,0x105,0x105,0x105,0x105,0x105,0x105,0x105, -0x105,0x105,0x105,0x105,0x105,0x105,0x105,0x105,0x105,0x105,0x105,0x105,0x105,0x105,0x105,0x105, -0x105,0x105,0x105,0x105,0xe4c,0xe4c,0xe4c,0xe49,0xe49,0xe40,0xe40,0xe49,0xe46,0xe46,0xe46,0xe46, -0x108,0x108,0x108,0x108,0x129c,0x129c,0x129c,0x129c,0x129c,0x129c,0x129f,0x129f,0x12a2,0x129f,0x15c,0x15c, -0x15c,0x15c,0x15c,0x15c,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0x13d4,0x13d4,0x10b,0x10b,0x10b,0x10b, -0x10b,0x10b,0x10b,0xe52,0x1305,0x10b,0x10b,0x10b,0x10b,0x10b,0x10b,0x10b,0x10b,0x10b,0x10b,0x10b, -0x10b,0x10b,0x10b,0x1302,0xc0f,0xc0f,0xc0f,0xc0f,0xc0f,0xc0f,0xc0f,0xc0f,0xc0f,0xc0f,0xc0f,0xc0f, -0xc0f,0xc0f,0xc0f,0xc0f,0xe7f,0xe70,0xe6a,0xe7c,0xe79,0xe73,0xe73,0xe82,0xe6d,0xe76,0x10e,0x10e, -0x10e,0x10e,0x10e,0x10e,0xf03,0xf03,0xeee,0xf03,0xf06,0xf09,0xf09,0xf09,0xf09,0xf09,0xf09,0xf09, -0x114,0x114,0x114,0x114,0xefd,0xefd,0xefd,0xefd,0xefd,0xefd,0xefd,0xefd,0xefd,0xefd,0xf0f,0xf0f, -0xef4,0xefa,0xf0f,0xf0f,0xef7,0xef4,0xef4,0xef4,0xef4,0xef4,0xef4,0xef4,0xef4,0xef4,0xef4,0xef1, -0xef1,0xef1,0xef1,0xef1,0xef1,0xef1,0xef1,0xef1,0xef4,0xef4,0xef4,0xef4,0xef4,0xef4,0xef4,0xef4, -0xef4,0x114,0x114,0x114,0x130b,0x1308,0x130b,0x1308,0x130b,0x1308,0x130b,0x1308,0x130b,0x1308,0x13da,0x14f4, -0x14f4,0x14f4,0x178e,0x117,0x14f4,0x14f4,0x16dd,0x16dd,0x16dd,0x16d7,0x16dd,0x16d7,0x117,0x117,0x117,0x117, -0x117,0x117,0x117,0x117,0x117,0x117,0x117,0x117,0x117,0x117,0x117,0x117,0x117,0x117,0x117,0x117, -0x117,0x117,0x117,0x117,0x117,0x117,0x117,0x117,0x117,0x117,0x117,0x117,0x117,0x117,0x117,0x14f1, -0x13dd,0x13dd,0x1308,0x100b,0x100b,0x100b,0x100b,0x100b,0xf1e,0xf1e,0xf1e,0xf1e,0xf1e,0xf1e,0xf1e,0xf1e, -0xf1e,0xf1e,0xf1e,0xf1e,0xf1e,0xf1e,0xf1e,0xf1e,0xf1e,0xf1e,0xf1e,0xf1e,0xf1b,0xf1b,0xf21,0xf21, -0x11a,0x11a,0x11a,0x11a,0x11a,0x11a,0x11a,0x11a,0xf2a,0xf2a,0xf2a,0xf2a,0xf2a,0xf2a,0xf2a,0xf2a, -0xf2a,0xf2a,0xf2a,0xf2a,0xf2a,0xf2a,0xf2a,0xf2a,0xf2a,0xf2a,0xf2a,0xf2a,0xf2a,0xf2a,0xf24,0xf24, -0xf24,0xf24,0x113a,0x113a,0x11d,0x11d,0x11d,0xf27,0x14f7,0x14f7,0x14f7,0x14f7,0x14f7,0x14f7,0x14f7,0x14f7, -0x14f7,0x14f7,0x14f7,0x14f7,0x14f7,0x14f7,0x14f7,0x14f7,0x14f7,0x14f7,0x14f7,0x14f7,0x14f7,0x14f7,0x14f7,0x14f7, -0x14f7,0x16e0,0x120,0x120,0x120,0x120,0x120,0x120,0x120,0x120,0x120,0x120,0x120,0x120,0x120,0x120, -0x120,0x120,0x120,0x120,0x120,0x120,0x120,0x120,0x120,0x120,0x120,0x120,0x120,0x120,0x120,0x120, -0x120,0x120,0x120,0x120,0xf33,0xf33,0xf33,0x14fd,0x14fd,0x14fd,0x14fd,0x14fd,0x14fd,0x14fd,0x14fd,0x14fd, -0x14fd,0x14fd,0x14fd,0x123,0xf30,0xf30,0xf30,0xf30,0x14fa,0x123,0x123,0x123,0x123,0x123,0x123,0x123, -0x123,0x123,0x123,0x123,0xf36,0xf36,0xf36,0xf36,0xf36,0xf36,0xf36,0xf36,0xf36,0xf36,0xf36,0xf36, -0xf36,0xf36,0xf36,0xf36,0xf36,0xf36,0x126,0x126,0x126,0x126,0x126,0x126,0x126,0x126,0x126,0x126, -0x126,0x126,0x126,0x126,0x1032,0x1032,0x1032,0x1032,0x102f,0x102f,0x102f,0x102f,0x102f,0x102f,0x102f,0x102f, -0x1020,0x1020,0x1020,0x1020,0x1020,0x1020,0x1020,0x1020,0x102f,0x102f,0x1026,0x1023,0x129,0x129,0x129,0x1035, -0x1035,0x1029,0x1029,0x1029,0x102c,0x102c,0x102c,0x102c,0x102c,0x102c,0x102c,0x102c,0x102c,0x102c,0x129,0x129, -0x129,0x1032,0x1032,0x1032,0x1038,0x1038,0x1038,0x1038,0x1038,0x1038,0x1038,0x1038,0x1038,0x1038,0x103b,0x103b, -0x103b,0x103b,0x103b,0x103b,0x104d,0x104d,0x104d,0x104d,0x104d,0x104d,0x104d,0x104d,0x104d,0x104d,0x1050,0x1050, -0x12c,0x12c,0x12c,0x12c,0x12c,0x12c,0x12c,0x12c,0x12c,0x12c,0x12c,0x12c,0x12c,0x12c,0x12c,0x12c, -0x12c,0x12c,0x12c,0x12c,0x1077,0x1077,0x1077,0x1077,0x1071,0x1791,0x12f,0x12f,0x12f,0x12f,0x12f,0x12f, -0x12f,0x12f,0x107d,0x107d,0x1074,0x1074,0x1074,0x1074,0x1074,0x1074,0x1074,0x1074,0x1074,0x1074,0x12f,0x12f, -0x12f,0x12f,0x12f,0x12f,0x109b,0x109b,0x109b,0x109b,0x109b,0x109b,0x109b,0x108f,0x108f,0x108f,0x108f,0x108f, -0x108f,0x108f,0x108f,0x108f,0x108f,0x108f,0x1095,0x1098,0x132,0x132,0x132,0x132,0x132,0x132,0x132,0x132, -0x132,0x132,0x132,0x1092,0x10aa,0x10aa,0x10aa,0x10aa,0x10aa,0x10aa,0x10aa,0x10aa,0x10aa,0x109e,0x109e,0x109e, -0x109e,0x109e,0x109e,0x10a7,0x10a7,0x109e,0x109e,0x10a7,0x10a7,0x109e,0x109e,0x135,0x135,0x135,0x135,0x135, -0x135,0x135,0x135,0x135,0x10aa,0x10aa,0x10aa,0x109e,0x10aa,0x10aa,0x10aa,0x10aa,0x10aa,0x10aa,0x10aa,0x10aa, -0x109e,0x10a7,0x135,0x135,0x10a4,0x10a4,0x10a4,0x10a4,0x10a4,0x10a4,0x10a4,0x10a4,0x10a4,0x10a4,0x135,0x135, -0x10a1,0x10ad,0x10ad,0x10ad,0x1509,0x138,0x138,0x138,0x138,0x138,0x138,0x138,0x138,0x138,0x138,0x138, -0x138,0x138,0x138,0x138,0x138,0x138,0x138,0x138,0x138,0x138,0x138,0x138,0x138,0x138,0x138,0x138, -0x138,0x138,0x138,0x138,0x10b3,0x10b3,0x10b3,0x10b3,0x10b3,0x10b3,0x10b3,0x10b3,0x10b3,0x10b3,0x10b3,0x10b3, -0x10b3,0x10b3,0x10b3,0x10b3,0x10b3,0x10b3,0x10b3,0x10b3,0x10b3,0x10b3,0x10b3,0x10b3,0x10b3,0x10b3,0x10b3,0x10b3, -0x10b3,0x10b6,0x13b,0x13b,0x10b9,0x10b9,0x10b9,0x10b9,0x10b9,0x10b9,0x10b9,0x10b9,0x10b9,0x10b9,0x10b9,0x10b9, -0x10b9,0x10b9,0x10b9,0x10b9,0x10b9,0x10b9,0x10b9,0x10b9,0x10b9,0x10b9,0x10b9,0x10b9,0x10b9,0x10b9,0x10b9,0x10b9, -0x10b9,0x13e,0x13e,0x13e,0x10bc,0x10bc,0x10bc,0x10bc,0x10bc,0x10bc,0x10bc,0x10bc,0x10bc,0x10bc,0x10bc,0x10bc, -0x10bc,0x10bc,0x10bc,0x10bc,0x10bc,0x141,0x141,0x141,0x141,0x141,0x141,0x141,0x141,0x141,0x141,0x141, -0x141,0x141,0x141,0x141,0x10c2,0x10c2,0x10c2,0x10c2,0x10c2,0x10c2,0x10c2,0x10c2,0x10c2,0x10c2,0x10c2,0x10c2, -0x10c2,0x10c2,0x10c2,0x10c2,0x10c2,0x10c2,0x10c2,0x10c2,0x10c2,0x10c2,0x10c2,0x10c2,0x10c2,0x10c2,0x144,0x144, -0x144,0x144,0x144,0x10bf,0x10c5,0x10c5,0x10c5,0x10c5,0x10c5,0x10c5,0x10c5,0x10c5,0x10c5,0x10c5,0x10c5,0x10c5, -0x147,0x147,0x147,0x147,0x10c8,0x10c8,0x10c8,0x10c8,0x10c8,0x10c8,0x10c8,0x10c8,0x10c8,0x10c8,0x10c8,0x10c8, -0x10c8,0x10c8,0x10c8,0x10c8,0x10c8,0x10c8,0x10c8,0x10c8,0x14a,0x14a,0x14a,0x14a,0x14a,0x14a,0x14a,0x14a, -0x14a,0x14a,0x14a,0x14a,0x1140,0x1140,0x1140,0x1140,0x1149,0x1140,0x1140,0x1140,0x1149,0x1140,0x1140,0x1140, -0x1140,0x113d,0x14d,0x14d,0x1146,0x1146,0x1146,0x1146,0x1146,0x1146,0x1146,0x1146,0x1146,0x1146,0x1146,0x1146, -0x1146,0x1146,0x1146,0x14d,0x114c,0x114c,0x114c,0x114c,0x114c,0x114c,0x114c,0x114c,0x114c,0x114c,0x114c,0x114c, -0x114c,0x114c,0x114c,0x114c,0x114c,0x114c,0x114c,0x114c,0x114c,0x114c,0x150,0x150,0x150,0x150,0x150,0x150, -0x150,0x150,0x150,0x150,0x1167,0x1167,0x1167,0x1167,0x1167,0x1167,0x1167,0x1167,0x1167,0x1167,0x1167,0x1167, -0x1167,0x1167,0x1167,0x1167,0x1167,0x1167,0x1167,0x1167,0x1167,0x1164,0x114f,0x1164,0x114f,0x114f,0x114f,0x114f, -0x114f,0x114f,0x114f,0x153,0x1158,0x1161,0x114f,0x1161,0x1161,0x114f,0x114f,0x114f,0x114f,0x114f,0x114f,0x114f, -0x114f,0x1164,0x1164,0x1164,0x1164,0x1164,0x1164,0x114f,0x114f,0x1155,0x1155,0x1155,0x1155,0x1155,0x1155,0x1155, -0x1155,0x153,0x153,0x1152,0x115e,0x115e,0x115e,0x115e,0x115e,0x115e,0x115e,0x115e,0x115e,0x115e,0x153,0x153, -0x153,0x153,0x153,0x153,0x115e,0x115e,0x115e,0x115e,0x115e,0x115e,0x115e,0x115e,0x115e,0x115e,0x153,0x153, -0x153,0x153,0x153,0x153,0x115b,0x115b,0x115b,0x115b,0x115b,0x115b,0x115b,0x116a,0x116d,0x116d,0x116d,0x116d, -0x115b,0x115b,0x153,0x153,0x1557,0x1557,0x1557,0x1557,0x1557,0x1557,0x1557,0x1557,0x1557,0x1557,0x1557,0x1557, -0x1557,0x1557,0x1554,0x1d1,0x12b1,0x1290,0x12ab,0x12ab,0x12ab,0x12ab,0x12ab,0x12ab,0x12ab,0x1293,0x1293,0x1293, -0x1293,0x12ab,0x1293,0x1293,0x1293,0x1293,0x1299,0x147f,0x1485,0x1482,0x147c,0x156,0x16ad,0x16ad,0x156,0x156, -0x156,0x156,0x156,0x156,0x1182,0x1182,0x1182,0x1182,0x1182,0x1182,0x1182,0x1182,0x1182,0x1182,0x1182,0x1182, -0x1182,0x1182,0x1182,0x1182,0x1179,0x1179,0x117c,0x1185,0x117f,0x117f,0x117f,0x1185,0x159,0x159,0x159,0x159, -0x159,0x159,0x159,0x159,0x1188,0x1188,0x1188,0x1188,0x1188,0x1188,0x1188,0x1188,0x1188,0x1188,0x1188,0x1188, -0x1188,0x1188,0x1188,0x1188,0x1188,0x12b7,0x118e,0x12ba,0x118e,0x118e,0x118e,0x118e,0x118b,0x118b,0x118b,0x118e, -0x16e6,0x16e9,0x15f,0x15f,0x127e,0x127e,0x127e,0x127e,0x127e,0x127e,0x127e,0x127e,0x127e,0x127e,0x127e,0x127e, -0x127e,0x127e,0x127e,0x127e,0x127e,0x127e,0x127e,0x127e,0x127e,0x127e,0x127e,0x127e,0x127e,0x127e,0x127e,0x127e, -0x127e,0x162,0x162,0x162,0x11a3,0x1197,0x1197,0x1197,0x1197,0x1197,0x1197,0x119a,0x11a9,0x11a9,0x1197,0x1197, -0x1197,0x1197,0x165,0x12a5,0x119d,0x119d,0x119d,0x119d,0x119d,0x119d,0x119d,0x119d,0x119d,0x119d,0x165,0x165, -0x165,0x165,0x1197,0x1197,0x11c7,0x11bb,0x11c7,0x168,0x168,0x168,0x168,0x168,0x168,0x168,0x168,0x168, -0x168,0x168,0x168,0x168,0x168,0x168,0x168,0x168,0x168,0x168,0x168,0x168,0x168,0x168,0x168,0x11c4, -0x11c4,0x11ca,0x11be,0x11c1,0x11df,0x11df,0x11df,0x11d9,0x11d9,0x11d0,0x11d9,0x11d9,0x11d0,0x11d9,0x11d9,0x11e2, -0x11dc,0x11d3,0x16b,0x16b,0x11d6,0x11d6,0x11d6,0x11d6,0x11d6,0x11d6,0x11d6,0x11d6,0x11d6,0x11d6,0x16b,0x16b, -0x16b,0x16b,0x16b,0x16b,0x11e8,0x11e8,0x11e8,0x11e8,0x11e8,0x11e8,0x11e8,0x16e,0x16e,0x16e,0x16e,0x11e5, -0x11e5,0x11e5,0x11e5,0x11e5,0x11e5,0x11e5,0x11e5,0x11e5,0x11e5,0x11e5,0x11e5,0x11e5,0x11e5,0x11e5,0x11e5,0x11e5, -0x11e5,0x11e5,0x11e5,0x11e5,0x11e5,0x11e5,0x11e5,0x11e5,0x11e5,0x11e5,0x11e5,0x11e5,0x16e,0x16e,0x16e,0x16e, -0x11f1,0x11f1,0x11f1,0x11f1,0x11f1,0x11f1,0x11f1,0x11f1,0x11f1,0x11f1,0x11f1,0x11f1,0x11f1,0x11f1,0x11f1,0x11f1, -0x11f1,0x11f1,0x11f1,0x11f1,0x11f1,0x11f1,0x171,0x11ee,0x11eb,0x11eb,0x11eb,0x11eb,0x11eb,0x11eb,0x11eb,0x11eb, -0x1200,0x1200,0x1200,0x1200,0x1200,0x1200,0x1200,0x1200,0x1200,0x1200,0x1200,0x1200,0x1200,0x1200,0x1200,0x1200, -0x1200,0x1200,0x1200,0x1200,0x1200,0x1200,0x174,0x174,0x174,0x11fa,0x11fd,0x11fd,0x11fd,0x11fd,0x11fd,0x11fd, +0xe0d,0xe0d,0xe0d,0xe0d,0xe0d,0xe0d,0xe0d,0xe0d,0xe0d,0xe0d,0xe0d,0xe0d,0xe0d,0xe0d,0xe0d,0xf6, +0xe22,0xe16,0xe16,0xe16,0xf9,0xe16,0xe16,0xf9,0xf9,0xf9,0xf9,0xf9,0xe16,0xe16,0xe16,0xe16, +0xe22,0xe22,0xe22,0xe22,0xf9,0xe22,0xe22,0xe22,0xf9,0xe22,0xe22,0xe22,0xe22,0xe22,0xe22,0xe22, +0xe22,0xe22,0xe22,0xe22,0xe22,0xe22,0xe22,0xe22,0xe22,0xe22,0xe22,0xe22,0xe22,0xe22,0xe22,0xe22, +0xf9,0xf9,0xf9,0xf9,0xe13,0xe13,0xe13,0xf9,0xf9,0xf9,0xf9,0xe19,0xe1c,0xe1c,0xe1c,0xe1c, +0xe1c,0xe1c,0xe1c,0xe1c,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xe1f,0xe1f,0xe1f,0xe1f, +0xe1f,0xe1f,0xe25,0xe25,0xe1c,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xe31,0xe31,0xe31,0xe31, +0xe31,0xe31,0xe31,0xe31,0xe31,0xe31,0x1146,0x1146,0xfc,0xfc,0xfc,0xfc,0xe31,0xe31,0xe31,0xe31, +0xe31,0xe34,0xe34,0xe34,0xe31,0xe31,0xe34,0xe31,0xe31,0xe31,0xe31,0xe31,0xe31,0xe31,0xe31,0xe31, +0xe31,0xe31,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xe2e,0xe2e,0xe2e,0xe2e,0xe2e,0xe2e,0xe2e,0xe2e, +0xe2e,0xe2e,0x1143,0xfc,0xfc,0xfc,0xe2b,0xe2b,0xe3a,0xe3a,0xe3a,0xe3a,0xff,0xff,0xff,0xff, +0xe3a,0xe3a,0xe3a,0xe3a,0xe3a,0xe3a,0xe3a,0xe3a,0xe37,0xe3a,0xe3a,0xe3a,0xe3a,0xe3a,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x14f7,0x14fd,0x14fa,0x1845,0x17a0,0x1869,0x1869,0x1869, +0x1869,0x1869,0x102,0x102,0x102,0x102,0x102,0x102,0x102,0x102,0x102,0x102,0x102,0x102,0x102,0x102, +0x102,0x102,0x102,0x102,0x102,0x102,0x102,0x102,0x102,0x102,0x102,0x102,0x102,0x102,0x102,0x102, +0x102,0x102,0x102,0x102,0xe61,0xe61,0xe61,0xe5e,0xe5e,0xe55,0xe55,0xe5e,0xe5b,0xe5b,0xe5b,0xe5b, +0x105,0x105,0x105,0x105,0x12b1,0x12b1,0x12b1,0x12b1,0x12b1,0x12b1,0x12b4,0x12b4,0x12b7,0x12b4,0x159,0x159, +0x159,0x159,0x159,0x159,0xe64,0xe64,0xe64,0xe64,0xe64,0xe64,0x13e9,0x13e9,0x108,0x108,0x108,0x108, +0x108,0x108,0x108,0xe67,0x131a,0x108,0x108,0x108,0x108,0x108,0x108,0x108,0x108,0x108,0x108,0x108, +0x108,0x108,0x108,0x1317,0xc21,0xc21,0xc21,0xc21,0xc21,0xc21,0xc21,0xc21,0xc21,0xc21,0xc21,0xc21, +0xc21,0xc21,0xc21,0xc21,0xe94,0xe85,0xe7f,0xe91,0xe8e,0xe88,0xe88,0xe97,0xe82,0xe8b,0x10b,0x10b, +0x10b,0x10b,0x10b,0x10b,0xf18,0xf18,0xf03,0xf18,0xf1b,0xf1e,0xf1e,0xf1e,0xf1e,0xf1e,0xf1e,0xf1e, +0x111,0x111,0x111,0x111,0xf12,0xf12,0xf12,0xf12,0xf12,0xf12,0xf12,0xf12,0xf12,0xf12,0xf24,0xf24, +0xf09,0xf0f,0xf24,0xf24,0xf0c,0xf09,0xf09,0xf09,0xf09,0xf09,0xf09,0xf09,0xf09,0xf09,0xf09,0xf06, +0xf06,0xf06,0xf06,0xf06,0xf06,0xf06,0xf06,0xf06,0xf09,0xf09,0xf09,0xf09,0xf09,0xf09,0xf09,0xf09, +0xf09,0x111,0x111,0x111,0x1320,0x131d,0x1320,0x131d,0x1320,0x131d,0x1320,0x131d,0x1320,0x131d,0x13ef,0x1509, +0x1509,0x1509,0x17a3,0x114,0x1509,0x1509,0x16f2,0x16f2,0x16f2,0x16ec,0x16f2,0x16ec,0x114,0x114,0x114,0x114, +0x114,0x114,0x114,0x114,0x114,0x114,0x114,0x114,0x114,0x114,0x114,0x114,0x114,0x114,0x114,0x114, +0x114,0x114,0x114,0x114,0x114,0x114,0x114,0x114,0x114,0x114,0x114,0x114,0x114,0x114,0x114,0x1506, +0x13f2,0x13f2,0x131d,0x1020,0x1020,0x1020,0x1020,0x1020,0xf33,0xf33,0xf33,0xf33,0xf33,0xf33,0xf33,0xf33, +0xf33,0xf33,0xf33,0xf33,0xf33,0xf33,0xf33,0xf33,0xf33,0xf33,0xf33,0xf33,0xf30,0xf30,0xf36,0xf36, +0x117,0x117,0x117,0x117,0x117,0x117,0x117,0x117,0xf3f,0xf3f,0xf3f,0xf3f,0xf3f,0xf3f,0xf3f,0xf3f, +0xf3f,0xf3f,0xf3f,0xf3f,0xf3f,0xf3f,0xf3f,0xf3f,0xf3f,0xf3f,0xf3f,0xf3f,0xf3f,0xf3f,0xf39,0xf39, +0xf39,0xf39,0x114f,0x114f,0x11a,0x11a,0x11a,0xf3c,0x150c,0x150c,0x150c,0x150c,0x150c,0x150c,0x150c,0x150c, +0x150c,0x150c,0x150c,0x150c,0x150c,0x150c,0x150c,0x150c,0x150c,0x150c,0x150c,0x150c,0x150c,0x150c,0x150c,0x150c, +0x150c,0x16f5,0x11d,0x11d,0x11d,0x11d,0x11d,0x11d,0x11d,0x11d,0x11d,0x11d,0x11d,0x11d,0x11d,0x11d, +0x11d,0x11d,0x11d,0x11d,0x11d,0x11d,0x11d,0x11d,0x11d,0x11d,0x11d,0x11d,0x11d,0x11d,0x11d,0x11d, +0x11d,0x11d,0x11d,0x11d,0xf48,0xf48,0xf48,0x1512,0x1512,0x1512,0x1512,0x1512,0x1512,0x1512,0x1512,0x1512, +0x1512,0x1512,0x1512,0x120,0xf45,0xf45,0xf45,0xf45,0x150f,0x120,0x120,0x120,0x120,0x120,0x120,0x120, +0x120,0x120,0x120,0x120,0xf4b,0xf4b,0xf4b,0xf4b,0xf4b,0xf4b,0xf4b,0xf4b,0xf4b,0xf4b,0xf4b,0xf4b, +0xf4b,0xf4b,0xf4b,0xf4b,0xf4b,0xf4b,0x123,0x123,0x123,0x123,0x123,0x123,0x123,0x123,0x123,0x123, +0x123,0x123,0x123,0x123,0x1047,0x1047,0x1047,0x1047,0x1044,0x1044,0x1044,0x1044,0x1044,0x1044,0x1044,0x1044, +0x1035,0x1035,0x1035,0x1035,0x1035,0x1035,0x1035,0x1035,0x1044,0x1044,0x103b,0x1038,0x126,0x126,0x126,0x104a, +0x104a,0x103e,0x103e,0x103e,0x1041,0x1041,0x1041,0x1041,0x1041,0x1041,0x1041,0x1041,0x1041,0x1041,0x126,0x126, +0x126,0x1047,0x1047,0x1047,0x104d,0x104d,0x104d,0x104d,0x104d,0x104d,0x104d,0x104d,0x104d,0x104d,0x1050,0x1050, +0x1050,0x1050,0x1050,0x1050,0x1062,0x1062,0x1062,0x1062,0x1062,0x1062,0x1062,0x1062,0x1062,0x1062,0x1065,0x1065, +0x129,0x129,0x129,0x129,0x129,0x129,0x129,0x129,0x129,0x129,0x129,0x129,0x129,0x129,0x129,0x129, +0x129,0x129,0x129,0x129,0x108c,0x108c,0x108c,0x108c,0x1086,0x17a6,0x12c,0x12c,0x12c,0x12c,0x12c,0x12c, +0x12c,0x12c,0x1092,0x1092,0x1089,0x1089,0x1089,0x1089,0x1089,0x1089,0x1089,0x1089,0x1089,0x1089,0x12c,0x12c, +0x12c,0x12c,0x12c,0x12c,0x10b0,0x10b0,0x10b0,0x10b0,0x10b0,0x10b0,0x10b0,0x10a4,0x10a4,0x10a4,0x10a4,0x10a4, +0x10a4,0x10a4,0x10a4,0x10a4,0x10a4,0x10a4,0x10aa,0x10ad,0x12f,0x12f,0x12f,0x12f,0x12f,0x12f,0x12f,0x12f, +0x12f,0x12f,0x12f,0x10a7,0x10bf,0x10bf,0x10bf,0x10bf,0x10bf,0x10bf,0x10bf,0x10bf,0x10bf,0x10b3,0x10b3,0x10b3, +0x10b3,0x10b3,0x10b3,0x10bc,0x10bc,0x10b3,0x10b3,0x10bc,0x10bc,0x10b3,0x10b3,0x132,0x132,0x132,0x132,0x132, +0x132,0x132,0x132,0x132,0x10bf,0x10bf,0x10bf,0x10b3,0x10bf,0x10bf,0x10bf,0x10bf,0x10bf,0x10bf,0x10bf,0x10bf, +0x10b3,0x10bc,0x132,0x132,0x10b9,0x10b9,0x10b9,0x10b9,0x10b9,0x10b9,0x10b9,0x10b9,0x10b9,0x10b9,0x132,0x132, +0x10b6,0x10c2,0x10c2,0x10c2,0x151e,0x135,0x135,0x135,0x135,0x135,0x135,0x135,0x135,0x135,0x135,0x135, +0x135,0x135,0x135,0x135,0x135,0x135,0x135,0x135,0x135,0x135,0x135,0x135,0x135,0x135,0x135,0x135, +0x135,0x135,0x135,0x135,0x10c8,0x10c8,0x10c8,0x10c8,0x10c8,0x10c8,0x10c8,0x10c8,0x10c8,0x10c8,0x10c8,0x10c8, +0x10c8,0x10c8,0x10c8,0x10c8,0x10c8,0x10c8,0x10c8,0x10c8,0x10c8,0x10c8,0x10c8,0x10c8,0x10c8,0x10c8,0x10c8,0x10c8, +0x10c8,0x10cb,0x138,0x138,0x10ce,0x10ce,0x10ce,0x10ce,0x10ce,0x10ce,0x10ce,0x10ce,0x10ce,0x10ce,0x10ce,0x10ce, +0x10ce,0x10ce,0x10ce,0x10ce,0x10ce,0x10ce,0x10ce,0x10ce,0x10ce,0x10ce,0x10ce,0x10ce,0x10ce,0x10ce,0x10ce,0x10ce, +0x10ce,0x13b,0x13b,0x13b,0x10d1,0x10d1,0x10d1,0x10d1,0x10d1,0x10d1,0x10d1,0x10d1,0x10d1,0x10d1,0x10d1,0x10d1, +0x10d1,0x10d1,0x10d1,0x10d1,0x10d1,0x13e,0x13e,0x13e,0x13e,0x13e,0x13e,0x13e,0x13e,0x13e,0x13e,0x13e, +0x13e,0x13e,0x13e,0x13e,0x10d7,0x10d7,0x10d7,0x10d7,0x10d7,0x10d7,0x10d7,0x10d7,0x10d7,0x10d7,0x10d7,0x10d7, +0x10d7,0x10d7,0x10d7,0x10d7,0x10d7,0x10d7,0x10d7,0x10d7,0x10d7,0x10d7,0x10d7,0x10d7,0x10d7,0x10d7,0x141,0x141, +0x141,0x141,0x141,0x10d4,0x10da,0x10da,0x10da,0x10da,0x10da,0x10da,0x10da,0x10da,0x10da,0x10da,0x10da,0x10da, +0x144,0x144,0x144,0x144,0x10dd,0x10dd,0x10dd,0x10dd,0x10dd,0x10dd,0x10dd,0x10dd,0x10dd,0x10dd,0x10dd,0x10dd, +0x10dd,0x10dd,0x10dd,0x10dd,0x10dd,0x10dd,0x10dd,0x10dd,0x147,0x147,0x147,0x147,0x147,0x147,0x147,0x147, +0x147,0x147,0x147,0x147,0x1155,0x1155,0x1155,0x1155,0x115e,0x1155,0x1155,0x1155,0x115e,0x1155,0x1155,0x1155, +0x1155,0x1152,0x14a,0x14a,0x115b,0x115b,0x115b,0x115b,0x115b,0x115b,0x115b,0x115b,0x115b,0x115b,0x115b,0x115b, +0x115b,0x115b,0x115b,0x14a,0x1161,0x1161,0x1161,0x1161,0x1161,0x1161,0x1161,0x1161,0x1161,0x1161,0x1161,0x1161, +0x1161,0x1161,0x1161,0x1161,0x1161,0x1161,0x1161,0x1161,0x1161,0x1161,0x14d,0x14d,0x14d,0x14d,0x14d,0x14d, +0x14d,0x14d,0x14d,0x14d,0x117c,0x117c,0x117c,0x117c,0x117c,0x117c,0x117c,0x117c,0x117c,0x117c,0x117c,0x117c, +0x117c,0x117c,0x117c,0x117c,0x117c,0x117c,0x117c,0x117c,0x117c,0x1179,0x1164,0x1179,0x1164,0x1164,0x1164,0x1164, +0x1164,0x1164,0x1164,0x150,0x116d,0x1176,0x1164,0x1176,0x1176,0x1164,0x1164,0x1164,0x1164,0x1164,0x1164,0x1164, +0x1164,0x1179,0x1179,0x1179,0x1179,0x1179,0x1179,0x1164,0x1164,0x116a,0x116a,0x116a,0x116a,0x116a,0x116a,0x116a, +0x116a,0x150,0x150,0x1167,0x1173,0x1173,0x1173,0x1173,0x1173,0x1173,0x1173,0x1173,0x1173,0x1173,0x150,0x150, +0x150,0x150,0x150,0x150,0x1173,0x1173,0x1173,0x1173,0x1173,0x1173,0x1173,0x1173,0x1173,0x1173,0x150,0x150, +0x150,0x150,0x150,0x150,0x1170,0x1170,0x1170,0x1170,0x1170,0x1170,0x1170,0x117f,0x1182,0x1182,0x1182,0x1182, +0x1170,0x1170,0x150,0x150,0x1569,0x1569,0x1569,0x1569,0x1569,0x1569,0x1569,0x1569,0x1569,0x1569,0x1569,0x1569, +0x1569,0x1569,0x1566,0x1cb,0x12c6,0x12a5,0x12c0,0x12c0,0x12c0,0x12c0,0x12c0,0x12c0,0x12c0,0x12a8,0x12a8,0x12a8, +0x12a8,0x12c0,0x12a8,0x12a8,0x12a8,0x12a8,0x12ae,0x1494,0x149a,0x1497,0x1491,0x18e4,0x16bf,0x16bf,0x153,0x153, +0x153,0x153,0x153,0x153,0x1197,0x1197,0x1197,0x1197,0x1197,0x1197,0x1197,0x1197,0x1197,0x1197,0x1197,0x1197, +0x1197,0x1197,0x1197,0x1197,0x118e,0x118e,0x1191,0x119a,0x1194,0x1194,0x1194,0x119a,0x156,0x156,0x156,0x156, +0x156,0x156,0x156,0x156,0x119d,0x119d,0x119d,0x119d,0x119d,0x119d,0x119d,0x119d,0x119d,0x119d,0x119d,0x119d, +0x119d,0x119d,0x119d,0x119d,0x119d,0x12cc,0x11a3,0x12cf,0x11a3,0x11a3,0x11a3,0x11a3,0x11a0,0x11a0,0x11a0,0x11a3, +0x16fb,0x16fe,0x15c,0x15c,0x1293,0x1293,0x1293,0x1293,0x1293,0x1293,0x1293,0x1293,0x1293,0x1293,0x1293,0x1293, +0x1293,0x1293,0x1293,0x1293,0x1293,0x1293,0x1293,0x1293,0x1293,0x1293,0x1293,0x1293,0x1293,0x1293,0x1293,0x1293, +0x1293,0x15f,0x15f,0x15f,0x11b8,0x11ac,0x11ac,0x11ac,0x11ac,0x11ac,0x11ac,0x11af,0x11be,0x11be,0x11ac,0x11ac, +0x11ac,0x11ac,0x162,0x12ba,0x11b2,0x11b2,0x11b2,0x11b2,0x11b2,0x11b2,0x11b2,0x11b2,0x11b2,0x11b2,0x162,0x162, +0x162,0x162,0x11ac,0x11ac,0x11dc,0x11d0,0x11dc,0x165,0x165,0x165,0x165,0x165,0x165,0x165,0x165,0x165, +0x165,0x165,0x165,0x165,0x165,0x165,0x165,0x165,0x165,0x165,0x165,0x165,0x165,0x165,0x165,0x11d9, +0x11d9,0x11df,0x11d3,0x11d6,0x11f4,0x11f4,0x11f4,0x11ee,0x11ee,0x11e5,0x11ee,0x11ee,0x11e5,0x11ee,0x11ee,0x11f7, +0x11f1,0x11e8,0x168,0x168,0x11eb,0x11eb,0x11eb,0x11eb,0x11eb,0x11eb,0x11eb,0x11eb,0x11eb,0x11eb,0x168,0x168, +0x168,0x168,0x168,0x168,0x11fd,0x11fd,0x11fd,0x11fd,0x11fd,0x11fd,0x11fd,0x16b,0x16b,0x16b,0x16b,0x11fa, +0x11fa,0x11fa,0x11fa,0x11fa,0x11fa,0x11fa,0x11fa,0x11fa,0x11fa,0x11fa,0x11fa,0x11fa,0x11fa,0x11fa,0x11fa,0x11fa, +0x11fa,0x11fa,0x11fa,0x11fa,0x11fa,0x11fa,0x11fa,0x11fa,0x11fa,0x11fa,0x11fa,0x11fa,0x16b,0x16b,0x16b,0x16b, 0x1206,0x1206,0x1206,0x1206,0x1206,0x1206,0x1206,0x1206,0x1206,0x1206,0x1206,0x1206,0x1206,0x1206,0x1206,0x1206, -0x1206,0x1206,0x1206,0x1206,0x1206,0x1206,0x177,0x177,0x1203,0x1203,0x1203,0x1203,0x1203,0x1203,0x1203,0x1203, -0x120c,0x120c,0x120c,0x120c,0x120c,0x120c,0x120c,0x120c,0x120c,0x120c,0x120c,0x120c,0x120c,0x120c,0x120c,0x120c, -0x120c,0x120c,0x120c,0x17a,0x17a,0x17a,0x17a,0x17a,0x1209,0x1209,0x1209,0x1209,0x1209,0x1209,0x1209,0x1209, -0x1212,0x1212,0x1212,0x1212,0x1212,0x1212,0x1212,0x1212,0x1212,0x1212,0x1212,0x1212,0x1212,0x1212,0x1212,0x1212, -0x1212,0x1212,0x1212,0x1212,0x1212,0x1212,0x1212,0x1212,0x1212,0x1212,0x1212,0x1212,0x1212,0x1212,0x1212,0x180, -0x1230,0x1230,0x183,0x183,0x183,0x183,0x183,0x183,0x183,0x183,0x183,0x183,0x183,0x183,0x183,0x183, -0x145b,0x145b,0x145b,0x145b,0x145b,0x145b,0x145b,0x145b,0x145b,0x145b,0x145b,0x145b,0x145b,0x145b,0x145b,0x145b, -0x125a,0x125a,0x125a,0x125a,0x125a,0x125a,0x125a,0x125a,0x125a,0x125a,0x125a,0x1515,0x1515,0x189,0x189,0x189, -0x125a,0x125a,0x125a,0x125a,0x125a,0x125a,0x125a,0x125a,0x125a,0x125a,0x125a,0x125a,0x125a,0x125a,0x125a,0x125a, -0x125a,0x125a,0x125a,0x125d,0x125d,0x125d,0x123c,0x189,0x135f,0x1266,0x135f,0x135f,0x135f,0x135f,0x135f,0x135f, -0x135f,0x135f,0x135f,0x135f,0x135f,0x1266,0x135f,0x1266,0x135c,0x135c,0x135c,0x135c,0x135c,0x135c,0x135c,0x135c, -0x135c,0x135c,0x13ec,0x13ec,0x189,0x189,0x189,0x189,0x1362,0x1362,0x135c,0x135c,0x135c,0x135c,0x135c,0x135c, -0x135c,0x1263,0x135c,0x1263,0x1263,0x135c,0x1362,0x1269,0x180f,0x180f,0x180f,0x180f,0x180f,0x180f,0x180f,0x180f, -0x180f,0x180f,0x180f,0x180f,0x180f,0x189,0x189,0x189,0x189,0x189,0x189,0x189,0x189,0x189,0x189,0x189, +0x1206,0x1206,0x1206,0x1206,0x1206,0x1206,0x16e,0x1203,0x1200,0x1200,0x1200,0x1200,0x1200,0x1200,0x1200,0x1200, +0x1215,0x1215,0x1215,0x1215,0x1215,0x1215,0x1215,0x1215,0x1215,0x1215,0x1215,0x1215,0x1215,0x1215,0x1215,0x1215, +0x1215,0x1215,0x1215,0x1215,0x1215,0x1215,0x171,0x171,0x171,0x120f,0x1212,0x1212,0x1212,0x1212,0x1212,0x1212, +0x121b,0x121b,0x121b,0x121b,0x121b,0x121b,0x121b,0x121b,0x121b,0x121b,0x121b,0x121b,0x121b,0x121b,0x121b,0x121b, +0x121b,0x121b,0x121b,0x121b,0x121b,0x121b,0x174,0x174,0x1218,0x1218,0x1218,0x1218,0x1218,0x1218,0x1218,0x1218, +0x1221,0x1221,0x1221,0x1221,0x1221,0x1221,0x1221,0x1221,0x1221,0x1221,0x1221,0x1221,0x1221,0x1221,0x1221,0x1221, +0x1221,0x1221,0x1221,0x177,0x177,0x177,0x177,0x177,0x121e,0x121e,0x121e,0x121e,0x121e,0x121e,0x121e,0x121e, +0x1227,0x1227,0x1227,0x1227,0x1227,0x1227,0x1227,0x1227,0x1227,0x1227,0x1227,0x1227,0x1227,0x1227,0x1227,0x1227, +0x1227,0x1227,0x1227,0x1227,0x1227,0x1227,0x1227,0x1227,0x1227,0x1227,0x1227,0x1227,0x1227,0x1227,0x1227,0x17d, +0x1242,0x1242,0x180,0x180,0x180,0x180,0x180,0x180,0x180,0x180,0x180,0x180,0x180,0x180,0x180,0x180, +0x1470,0x1470,0x1470,0x1470,0x1470,0x1470,0x1470,0x1470,0x1470,0x1470,0x1470,0x1470,0x1470,0x1470,0x1470,0x1470, +0x126f,0x126f,0x126f,0x126f,0x126f,0x126f,0x126f,0x126f,0x126f,0x126f,0x126f,0x152a,0x152a,0x186,0x186,0x186, +0x126f,0x126f,0x126f,0x126f,0x126f,0x126f,0x126f,0x126f,0x126f,0x126f,0x126f,0x126f,0x126f,0x126f,0x126f,0x126f, +0x126f,0x126f,0x126f,0x1272,0x1272,0x1272,0x1251,0x186,0x1374,0x127b,0x1374,0x1374,0x1374,0x1374,0x1374,0x1374, +0x1374,0x1374,0x1374,0x1374,0x1374,0x127b,0x1374,0x127b,0x1371,0x1371,0x1371,0x1371,0x1371,0x1371,0x1371,0x1371, +0x1371,0x1371,0x1401,0x1401,0x186,0x186,0x186,0x186,0x1377,0x1377,0x1371,0x1371,0x1371,0x1371,0x1371,0x1371, +0x1371,0x1278,0x1371,0x1278,0x1278,0x1371,0x1377,0x127e,0x1824,0x1824,0x1824,0x1824,0x1824,0x1824,0x1824,0x1824, +0x1824,0x1824,0x1824,0x1824,0x1824,0x186,0x186,0x186,0x186,0x186,0x186,0x186,0x186,0x186,0x186,0x186, +0x186,0x186,0x186,0x186,0x186,0x186,0x186,0x186,0x186,0x186,0x186,0x186,0x186,0x186,0x186,0x186, +0x186,0x186,0x186,0x186,0x186,0x186,0x186,0x186,0x186,0x186,0x1329,0x1329,0x1329,0x1329,0x1329,0x1329, +0x1329,0x1329,0x1329,0x1329,0x1329,0x1329,0x1329,0x1329,0x1329,0x1329,0x1329,0x1329,0x1329,0x1329,0x1329,0x1329, +0x1329,0x1329,0x1329,0x1329,0x129f,0x1392,0x138f,0x189,0x189,0x189,0x189,0x189,0x189,0x189,0x189,0x189, +0x189,0x189,0x189,0x189,0x1299,0x1299,0x1299,0x1299,0x1299,0x1299,0x1299,0x1299,0x1299,0x1299,0x129c,0x1299, +0x1299,0x1299,0x1299,0x1299,0x1299,0x1299,0x1299,0x1299,0x1299,0x1299,0x1299,0x1299,0x1299,0x1299,0x1299,0x129c, +0x1299,0x1299,0x1392,0x1392,0x1392,0x1392,0x1392,0x138f,0x1392,0x1392,0x1392,0x1827,0x189,0x189,0x189,0x189, +0x1296,0x1296,0x1296,0x1296,0x1296,0x1296,0x1296,0x1296,0x1296,0x189,0x189,0x189,0x189,0x189,0x189,0x189, +0x13bf,0x13bf,0x189,0x189,0x189,0x189,0x189,0x189,0x189,0x189,0x189,0x189,0x189,0x189,0x189,0x189, +0x18c9,0x18c9,0x18c9,0x18c9,0x18c9,0x18c9,0x189,0x189,0x189,0x189,0x189,0x189,0x189,0x189,0x189,0x189, 0x189,0x189,0x189,0x189,0x189,0x189,0x189,0x189,0x189,0x189,0x189,0x189,0x189,0x189,0x189,0x189, -0x189,0x189,0x189,0x189,0x189,0x189,0x189,0x189,0x189,0x189,0x1314,0x1314,0x1314,0x1314,0x1314,0x1314, -0x1314,0x1314,0x1314,0x1314,0x1314,0x1314,0x1314,0x1314,0x1314,0x1314,0x1314,0x1314,0x1314,0x1314,0x1314,0x1314, -0x1314,0x1314,0x1314,0x1314,0x128a,0x137d,0x137a,0x18c,0x18c,0x18c,0x18c,0x18c,0x18c,0x18c,0x18c,0x18c, -0x18c,0x18c,0x18c,0x18c,0x1284,0x1284,0x1284,0x1284,0x1284,0x1284,0x1284,0x1284,0x1284,0x1284,0x1287,0x1284, -0x1284,0x1284,0x1284,0x1284,0x1284,0x1284,0x1284,0x1284,0x1284,0x1284,0x1284,0x1284,0x1284,0x1284,0x1284,0x1287, -0x1284,0x1284,0x137d,0x137d,0x137d,0x137d,0x137d,0x137a,0x137d,0x137d,0x137d,0x1812,0x18c,0x18c,0x18c,0x18c, -0x1281,0x1281,0x1281,0x1281,0x1281,0x1281,0x1281,0x1281,0x1281,0x18c,0x18c,0x18c,0x18c,0x18c,0x18c,0x18c, -0x13aa,0x13aa,0x18c,0x18c,0x18c,0x18c,0x18c,0x18c,0x18c,0x18c,0x18c,0x18c,0x18c,0x18c,0x18c,0x18c, -0x18c,0x18c,0x18c,0x18c,0x18c,0x18c,0x18c,0x18c,0x18c,0x18c,0x18c,0x18c,0x18c,0x18c,0x18c,0x18c, -0x18c,0x18c,0x18c,0x18c,0x131d,0x131d,0x131d,0x131d,0x131d,0x131d,0x131d,0x131d,0x131d,0x131d,0x131d,0x131d, -0x131d,0x131d,0x131d,0x131d,0x131d,0x131d,0x131d,0x131d,0x131d,0x131d,0x131d,0x131d,0x131d,0x1317,0x1317,0x1317, -0x18f,0x18f,0x131a,0x18f,0x132f,0x132f,0x132f,0x132f,0x132f,0x132f,0x1320,0x1329,0x1323,0x1323,0x1329,0x1329, -0x1329,0x1323,0x1329,0x1323,0x1323,0x1323,0x132c,0x132c,0x192,0x192,0x192,0x192,0x192,0x192,0x192,0x192, -0x1326,0x1326,0x1326,0x1326,0x195,0x1332,0x1332,0x1332,0x1332,0x1332,0x1332,0x195,0x195,0x1332,0x1332,0x1332, -0x1332,0x1332,0x1332,0x195,0x195,0x1332,0x1332,0x1332,0x1332,0x1332,0x1332,0x195,0x195,0x195,0x195,0x195, -0x195,0x195,0x195,0x195,0x1332,0x1332,0x1332,0x1332,0x1332,0x1332,0x1332,0x195,0x1332,0x1332,0x1332,0x1332, -0x1332,0x1332,0x1332,0x195,0x15b4,0x15b4,0x15b4,0x15b4,0x15b4,0x15b4,0x15b4,0x15b4,0x15b4,0x15b4,0x15b4,0x15b4, -0x15b4,0x15b4,0x15b4,0x15b4,0x1335,0x1335,0x1335,0x1335,0x1335,0x1335,0x1338,0x134a,0x134a,0x133e,0x133e,0x133e, -0x133e,0x133e,0x198,0x198,0x198,0x198,0x133b,0x133b,0x133b,0x133b,0x133b,0x133b,0x133b,0x133b,0x133b,0x133b, -0x133b,0x133b,0x133b,0x133b,0x133b,0x133b,0x1341,0x1341,0x1341,0x1341,0x1341,0x1341,0x1341,0x1341,0x1341,0x1341, -0x198,0x198,0x198,0x198,0x198,0x198,0x198,0x198,0x198,0x198,0x198,0x198,0x198,0x198,0x198,0x1518, -0x134d,0x134d,0x134d,0x134d,0x134d,0x134d,0x134d,0x134d,0x134d,0x134d,0x134d,0x134d,0x134d,0x134d,0x134d,0x134d, -0x134d,0x134d,0x134d,0x134d,0x134d,0x134d,0x134d,0x134d,0x134d,0x19b,0x19b,0x19b,0x19b,0x19b,0x19b,0x19b, -0x1383,0x1380,0x19e,0x19e,0x19e,0x19e,0x19e,0x19e,0x19e,0x19e,0x19e,0x19e,0x19e,0x19e,0x19e,0x19e, -0x19e,0x19e,0x19e,0x19e,0x19e,0x19e,0x19e,0x19e,0x19e,0x19e,0x19e,0x19e,0x19e,0x19e,0x19e,0x19e, -0x19e,0x19e,0x19e,0x19e,0x1350,0x1350,0x1350,0x1350,0x1350,0x1350,0x1350,0x1350,0x1350,0x1350,0x1350,0x1350, -0x1350,0x1350,0x1350,0x1a1,0x1a1,0x1350,0x1350,0x1350,0x1350,0x1350,0x1350,0x1350,0x1350,0x1350,0x1350,0x1350, -0x1350,0x1350,0x1350,0x151b,0x1a1,0x1350,0x1350,0x1350,0x1350,0x1350,0x1350,0x1350,0x1350,0x1350,0x1350,0x1350, -0x1350,0x1350,0x1350,0x1386,0x1a1,0x1350,0x1350,0x1350,0x1350,0x1350,0x1350,0x1350,0x1350,0x1350,0x1350,0x1350, -0x1350,0x1350,0x1350,0x1350,0x151b,0x151b,0x151b,0x151b,0x151b,0x151b,0x151b,0x151b,0x151b,0x151b,0x151b,0x151b, -0x151b,0x151b,0x151b,0x151b,0x151b,0x151b,0x151b,0x151b,0x151b,0x151b,0x1a1,0x1a1,0x1a1,0x1a1,0x1a1,0x1a1, -0x1a1,0x1a1,0x1a1,0x1a1,0x13a4,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x1533,0x1533,0x1533,0x1533,0x1533,0x1536, -0x16a4,0x1536,0x1536,0x1536,0x176d,0x181b,0x181b,0x1a4,0x1a4,0x1a4,0x1a4,0x1a4,0x1a4,0x1a4,0x1a4,0x1a4, -0x1a4,0x1a4,0x1a4,0x1a4,0x1536,0x1536,0x1536,0x1536,0x1536,0x1536,0x1533,0x1533,0x1533,0x1536,0x1533,0x16a1, -0x16a1,0x1a4,0x1a4,0x1a4,0x1536,0x1533,0x1533,0x1536,0x181b,0x181b,0x181b,0x1a4,0x1a4,0x1a4,0x1a4,0x1a4, -0x1a4,0x1a4,0x1a4,0x1a4,0x1353,0x1353,0x1353,0x1353,0x1353,0x1353,0x1353,0x1353,0x1353,0x1353,0x1353,0x1353, -0x1353,0x1353,0x1353,0x1353,0x1353,0x1353,0x1353,0x1353,0x1a7,0x1a7,0x1a7,0x1a7,0x1a7,0x1a7,0x1a7,0x1a7, -0x1a7,0x1a7,0x1a7,0x1a7,0x13f8,0x153c,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8, -0x13f8,0x153c,0x153c,0x153c,0x153c,0x153c,0x153c,0x16f2,0x16f2,0x1aa,0x179d,0x179d,0x179d,0x179d,0x179d,0x179d, -0x179d,0x179d,0x1aa,0x1aa,0x1aa,0x1aa,0x1aa,0x1aa,0x1aa,0x1aa,0x1aa,0x1aa,0x1aa,0x1aa,0x1aa,0x1aa, -0x1aa,0x1aa,0x1aa,0x1aa,0x1aa,0x1aa,0x1aa,0x1aa,0x179a,0x179a,0x179a,0x179a,0x179a,0x179a,0x179a,0x179a, -0x179a,0x179a,0x179a,0x179a,0x13fe,0x13fe,0x13fe,0x13fe,0x1ad,0x13fe,0x13fe,0x13fe,0x13fe,0x13fe,0x13fe,0x13fe, -0x13fe,0x13fe,0x13fe,0x13fe,0x13fe,0x13fe,0x13fe,0x13fe,0x13fe,0x13fe,0x13fe,0x13fe,0x13fe,0x13fe,0x13fe,0x13fe, -0x13fe,0x13fe,0x13fe,0x13fe,0x1ad,0x13fe,0x13fe,0x1ad,0x13fe,0x1ad,0x1ad,0x13fe,0x1ad,0x13fe,0x13fe,0x13fe, -0x13fe,0x13fe,0x13fe,0x13fe,0x13fe,0x13fe,0x13fe,0x1ad,0x13fe,0x13fe,0x13fe,0x13fe,0x1ad,0x13fe,0x1ad,0x13fe, -0x1ad,0x1ad,0x1ad,0x1ad,0x1ad,0x1ad,0x13fe,0x1ad,0x1ad,0x1ad,0x1ad,0x13fe,0x1ad,0x13fe,0x1ad,0x13fe, -0x1ad,0x13fe,0x13fe,0x13fe,0x1ad,0x13fe,0x13fe,0x1ad,0x13fe,0x1ad,0x1ad,0x13fe,0x1ad,0x13fe,0x1ad,0x13fe, -0x1ad,0x13fe,0x1ad,0x13fe,0x1ad,0x13fe,0x13fe,0x1ad,0x13fe,0x1ad,0x1ad,0x13fe,0x13fe,0x13fe,0x13fe,0x1ad, -0x13fe,0x13fe,0x13fe,0x13fe,0x13fe,0x13fe,0x13fe,0x1ad,0x13fe,0x13fe,0x13fe,0x13fe,0x1ad,0x13fe,0x13fe,0x13fe, -0x13fe,0x1ad,0x13fe,0x1ad,0x13fe,0x13fe,0x13fe,0x13fe,0x13fe,0x13fe,0x13fe,0x13fe,0x13fe,0x13fe,0x1ad,0x13fe, -0x13fe,0x13fe,0x13fe,0x13fe,0x13fe,0x13fe,0x13fe,0x13fe,0x13fe,0x13fe,0x13fe,0x13fe,0x13fe,0x13fe,0x13fe,0x13fe, -0x1ad,0x1ad,0x1ad,0x1ad,0x1ad,0x13fe,0x13fe,0x13fe,0x1ad,0x13fe,0x13fe,0x13fe,0x13fe,0x13fe,0x1ad,0x13fe, -0x13fe,0x13fe,0x13fe,0x13fe,0x13fe,0x13fe,0x13fe,0x13fe,0x13fe,0x13fe,0x13fe,0x13fe,0x13fe,0x13fe,0x13fe,0x13fe, -0x1ad,0x1ad,0x1ad,0x1ad,0x1ad,0x1ad,0x1ad,0x1ad,0x1ad,0x1ad,0x1ad,0x1ad,0x1ad,0x1ad,0x1ad,0x1ad, -0x1ad,0x1ad,0x1ad,0x1ad,0x1ad,0x1ad,0x1ad,0x1ad,0x1ad,0x1ad,0x1ad,0x1ad,0x1ad,0x1ad,0x1ad,0x1ad, -0x13fb,0x13fb,0x1ad,0x1ad,0x1ad,0x1ad,0x1ad,0x1ad,0x1ad,0x1ad,0x1ad,0x1ad,0x1ad,0x1ad,0x1ad,0x1ad, -0x1413,0x1413,0x1413,0x1413,0x1413,0x1413,0x1413,0x1401,0x1401,0x1401,0x1401,0x1401,0x1410,0x1401,0x1404,0x1404, -0x1401,0x1401,0x1401,0x1407,0x1407,0x1b0,0x140d,0x140d,0x140d,0x140d,0x140d,0x140d,0x140d,0x140d,0x140d,0x140d, -0x140a,0x1416,0x1416,0x1416,0x1b0,0x1b0,0x1b0,0x1b0,0x1b0,0x1b0,0x1b0,0x1b0,0x1b0,0x1b0,0x1b0,0x1b0, -0x15c6,0x15c6,0x15c6,0x15c6,0x15c6,0x15c6,0x15c6,0x15c6,0x15c6,0x15c6,0x15c6,0x15c6,0x15c6,0x15c6,0x15c6,0x15c6, -0x1422,0x1422,0x1422,0x1422,0x1422,0x1422,0x1422,0x1422,0x1422,0x1422,0x1422,0x141f,0x1419,0x1419,0x141f,0x141f, -0x1428,0x1428,0x1422,0x1425,0x1425,0x141f,0x141c,0x1b3,0x1b3,0x1b3,0x1b3,0x1b3,0x1b3,0x1b3,0x1b3,0x1b3, -0x142b,0x142b,0x142b,0x142b,0x142b,0x142b,0x142b,0x142b,0x142b,0x142b,0x142b,0x142b,0x142b,0x142b,0x142b,0x142b, -0x142b,0x142b,0x142b,0x142b,0x142b,0x142b,0x142b,0x142b,0x1b6,0x1b6,0x1b6,0x1b6,0x16f5,0x16f5,0x142b,0x142b, -0x16f5,0x16f5,0x16f5,0x16f5,0x16f5,0x16f5,0x16f5,0x16f5,0x16f5,0x16f5,0x16f5,0x16f5,0x16f5,0x16f5,0x16f5,0x16f5, -0x1b6,0x1b6,0x16f5,0x16f5,0x16f5,0x16f5,0x16f5,0x16f5,0x16f5,0x16f5,0x16f5,0x16f5,0x16f5,0x16f5,0x16f5,0x16f5, -0x1437,0x1437,0x1437,0x1437,0x1437,0x1b9,0x1b9,0x1b9,0x1b9,0x1b9,0x1b9,0x1b9,0x1b9,0x1b9,0x1b9,0x1b9, -0x1437,0x1434,0x1434,0x1434,0x1434,0x1434,0x1434,0x1434,0x1434,0x1434,0x1434,0x1434,0x1434,0x1434,0x1434,0x1434, -0x1434,0x1434,0x1434,0x1434,0x1434,0x1434,0x1434,0x1434,0x1434,0x1434,0x1434,0x1434,0x1434,0x1434,0x1434,0x1434, -0x1434,0x1434,0x1434,0x1b9,0x1b9,0x1b9,0x1b9,0x1b9,0x1b9,0x1b9,0x1b9,0x1b9,0x1b9,0x1b9,0x1b9,0x1b9, -0x1b9,0x1b9,0x1b9,0x1431,0x1431,0x1431,0x1431,0x143a,0x143a,0x143a,0x143a,0x143a,0x143a,0x143a,0x143a,0x143a, -0x143a,0x143a,0x143a,0x143a,0x144c,0x144f,0x1452,0x1452,0x144f,0x1455,0x1455,0x1440,0x1443,0x16fb,0x16f8,0x16f8, -0x16f8,0x1542,0x1bc,0x1bc,0x1446,0x1446,0x1446,0x1446,0x1446,0x1446,0x1446,0x1446,0x1446,0x1446,0x153f,0x1701, -0x1704,0x16fe,0x1707,0x1707,0x145b,0x145b,0x145b,0x145b,0x145b,0x145b,0x145b,0x145b,0x145b,0x1bf,0x1bf,0x1bf, -0x1bf,0x1bf,0x1bf,0x1bf,0x1458,0x1458,0x1458,0x1458,0x1458,0x1458,0x1458,0x1458,0x1458,0x1458,0x1bf,0x1bf, -0x1bf,0x1bf,0x1bf,0x1bf,0x145e,0x145e,0x145e,0x145e,0x145e,0x145e,0x145e,0x145e,0x1c2,0x1c2,0x1c2,0x1c2, -0x1c2,0x1c2,0x1c2,0x1c2,0x12ae,0x12ab,0x12ae,0x1296,0x12ab,0x12ab,0x12ab,0x12b1,0x12ab,0x12b1,0x12b4,0x12ab, -0x12b1,0x12b1,0x12ab,0x12ab,0x1470,0x1470,0x1470,0x1470,0x1470,0x1470,0x1470,0x1470,0x1470,0x1470,0x1470,0x1461, -0x146a,0x1461,0x146a,0x146a,0x1461,0x1461,0x1461,0x1461,0x1461,0x1461,0x146d,0x1464,0x1c5,0x1c5,0x1c5,0x1c5, -0x1c5,0x1c5,0x1c5,0x1c5,0x1548,0x1548,0x1548,0x1548,0x1548,0x1548,0x1548,0x1548,0x1548,0x1548,0x1548,0x1548, -0x1548,0x1548,0x1c8,0x1c8,0x1545,0x1545,0x1545,0x1545,0x1545,0x154b,0x1c8,0x1c8,0x1c8,0x1c8,0x1c8,0x1c8, -0x1c8,0x1c8,0x1c8,0x1c8,0x16b0,0x16a7,0x16a7,0x16a7,0x16a7,0x16a7,0x16a7,0x16a7,0x16a7,0x16a7,0x16a7,0x16a7, -0x16a7,0x16a7,0x16a7,0x16a7,0x16a7,0x16a7,0x16a7,0x16a7,0x16a7,0x16a7,0x16a7,0x16a7,0x16a7,0x16a7,0x16a7,0x16a7, -0x1ce,0x1ce,0x1ce,0x1ce,0x1d1,0x1d1,0x1d1,0x1d1,0x1d1,0x1d1,0x1d1,0x1d1,0x1d1,0x1d1,0x1d1,0x1d1, -0x1d1,0x1d1,0x1d1,0x1d1,0x1d1,0x1d1,0x1d1,0x1d1,0x1d1,0x1d1,0x1d1,0x1d1,0x1d1,0x1d1,0x1d1,0x1d1, -0x1d1,0x1d1,0x1d1,0x1d1,0x1563,0x1563,0x1563,0x1563,0x1563,0x1563,0x1563,0x1563,0x1563,0x1563,0x1563,0x1d4, -0x1d4,0x1d4,0x1d4,0x1d4,0x1563,0x1563,0x1563,0x1563,0x1563,0x1563,0x1563,0x1563,0x1563,0x1563,0x1563,0x1563, -0x1563,0x1d4,0x1d4,0x1d4,0x1d4,0x1d4,0x1d4,0x1d4,0x1563,0x1563,0x1563,0x1563,0x1563,0x1563,0x1563,0x1563, -0x1563,0x1563,0x1d4,0x1d4,0x1560,0x155a,0x155d,0x1566,0x1569,0x1569,0x1569,0x1569,0x1569,0x1569,0x1569,0x1569, -0x1d7,0x1d7,0x1d7,0x1d7,0x1d7,0x1d7,0x1d7,0x1d7,0x1551,0x1551,0x1551,0x1551,0x1551,0x1551,0x1551,0x1551, -0x1551,0x1551,0x1551,0x1551,0x1551,0x1551,0x1551,0x1551,0x156c,0x156c,0x156c,0x156c,0x156c,0x156c,0x156c,0x156c, -0x156c,0x156c,0x156c,0x156c,0x156c,0x156c,0x156c,0x156c,0x156c,0x156c,0x156c,0x156c,0x156c,0x1da,0x1da,0x1da, -0x1da,0x1da,0x1da,0x1da,0x1da,0x1da,0x1da,0x1da,0x1da,0x1da,0x1da,0x1da,0x1da,0x1da,0x1da,0x1da, -0x1da,0x1da,0x1da,0x1da,0x1da,0x1da,0x1da,0x1da,0x1da,0x1da,0x1da,0x1da,0x1da,0x1da,0x1da,0x1da, -0x170a,0x156f,0x1575,0x16b6,0x1dd,0x157e,0x157e,0x157e,0x157e,0x157e,0x157e,0x157e,0x157e,0x1dd,0x1dd,0x157e, -0x157e,0x1dd,0x1dd,0x157e,0x157e,0x157e,0x157e,0x157e,0x157e,0x157e,0x157e,0x157e,0x157e,0x157e,0x157e,0x157e, -0x157e,0x1dd,0x157e,0x157e,0x157e,0x157e,0x157e,0x157e,0x157e,0x1dd,0x157e,0x157e,0x1dd,0x157e,0x157e,0x157e, -0x157e,0x157e,0x1dd,0x1dd,0x16b3,0x157e,0x156f,0x1575,0x156f,0x1575,0x1575,0x1575,0x1575,0x1dd,0x1dd,0x1575, -0x1575,0x1dd,0x1dd,0x1578,0x1578,0x157b,0x1dd,0x1dd,0x170d,0x1dd,0x1dd,0x1dd,0x1dd,0x1dd,0x1dd,0x156f, -0x1dd,0x1dd,0x1dd,0x1dd,0x1dd,0x1581,0x157e,0x157e,0x157e,0x157e,0x1575,0x1575,0x1dd,0x1dd,0x1572,0x1572, -0x1572,0x1572,0x1572,0x1572,0x1572,0x1dd,0x1dd,0x1dd,0x1572,0x1572,0x1572,0x1572,0x1572,0x1dd,0x1dd,0x1dd, -0x1dd,0x1dd,0x1dd,0x1dd,0x1dd,0x1dd,0x1dd,0x1dd,0x1596,0x1596,0x1596,0x1596,0x1596,0x1596,0x1596,0x1596, -0x1596,0x1596,0x1596,0x1596,0x1596,0x1596,0x1596,0x1596,0x1596,0x1596,0x1e0,0x1596,0x1596,0x1596,0x1596,0x1596, -0x1596,0x1596,0x1596,0x1596,0x1596,0x1596,0x1596,0x1596,0x1590,0x1590,0x1590,0x1584,0x1584,0x1584,0x1590,0x1590, -0x1584,0x1593,0x1587,0x1584,0x1599,0x1599,0x158d,0x1599,0x1599,0x158a,0x17a0,0x1e0,0x15a8,0x15a8,0x15a8,0x159c, -0x159c,0x159c,0x159c,0x159c,0x159c,0x159f,0x15a2,0x1e3,0x1e3,0x1e3,0x1e3,0x1e3,0x15a5,0x15a5,0x15a5,0x15a5, -0x15a5,0x15a5,0x15a5,0x15a5,0x15a5,0x15a5,0x1e3,0x1e3,0x1e3,0x1e3,0x1e3,0x1e3,0x1710,0x1710,0x1710,0x1710, -0x15b4,0x15b1,0x1e6,0x1e6,0x1e6,0x1e6,0x1e6,0x1e6,0x1e6,0x1e6,0x1e6,0x1e6,0x173a,0x173a,0x173a,0x173a, -0x173a,0x173a,0x173a,0x173a,0x173a,0x173a,0x173a,0x173a,0x173a,0x173a,0x173a,0x173a,0x15ba,0x15ba,0x15ba,0x15ba, -0x15ba,0x15ba,0x15ba,0x15ba,0x15ba,0x15ba,0x15ba,0x15ba,0x15ba,0x15ba,0x15ba,0x15ba,0x15ba,0x15ba,0x15ba,0x15ba, -0x15ba,0x15ba,0x15ba,0x1e9,0x1e9,0x1e9,0x1e9,0x1e9,0x1e9,0x1e9,0x1e9,0x1e9,0x15ba,0x15ba,0x15ba,0x15ba, -0x15ba,0x15ba,0x15ba,0x15ba,0x15ba,0x15ba,0x15ba,0x15ba,0x15ba,0x15ba,0x15ba,0x15ba,0x15ba,0x15ba,0x15ba,0x15ba, -0x15ba,0x15ba,0x1e9,0x1e9,0x1e9,0x1e9,0x1e9,0x1e9,0x1e9,0x1e9,0x1e9,0x1e9,0x15ba,0x15ba,0x15ba,0x15ba, -0x15ba,0x15ba,0x15ba,0x15ba,0x1e9,0x1e9,0x1e9,0x1e9,0x1e9,0x1e9,0x1e9,0x1e9,0x1e9,0x1e9,0x1e9,0x1e9, -0x1e9,0x1e9,0x1e9,0x1e9,0x1e9,0x1e9,0x1e9,0x1e9,0x1e9,0x1e9,0x1e9,0x1e9,0x15c6,0x15c6,0x15c6,0x15c6, -0x15c6,0x15c6,0x15c6,0x15c6,0x15c6,0x15c6,0x15c6,0x15c6,0x15c6,0x15c6,0x15c6,0x15c6,0x15c6,0x15c6,0x15c6,0x15bd, -0x15c0,0x15c3,0x15c6,0x1ec,0x1ec,0x1ec,0x1ec,0x1ec,0x1ec,0x1ec,0x1ec,0x1ec,0x15d5,0x15d5,0x15d5,0x15d5, -0x15d5,0x15c9,0x15c9,0x1ef,0x1ef,0x1ef,0x1ef,0x15cc,0x15cc,0x15cc,0x15cc,0x15cc,0x15d2,0x15d2,0x15d2,0x15d2, -0x15d2,0x15d2,0x15cf,0x1ef,0x1ef,0x1ef,0x1ef,0x1ef,0x1ef,0x1ef,0x1ef,0x1ef,0x15de,0x15de,0x15de,0x15de, -0x15de,0x1f2,0x1f2,0x15db,0x15db,0x15db,0x15db,0x15db,0x15db,0x15db,0x15db,0x15db,0x15d8,0x15d8,0x15d8,0x15d8, -0x15d8,0x15d8,0x15d8,0x1f2,0x1f2,0x1f2,0x1f2,0x1f2,0x1f2,0x1f2,0x1f2,0x1f2,0x15e1,0x15f3,0x15f3,0x15e7, -0x15f0,0x1f5,0x1f5,0x1f5,0x1f5,0x1f5,0x1f5,0x1f5,0x1f5,0x1f5,0x1f5,0x1f5,0x15ea,0x15ea,0x15ea,0x15ea, -0x15ea,0x15ea,0x15ea,0x15ea,0x15ea,0x15ea,0x1f5,0x1f5,0x1f5,0x1f5,0x1f5,0x1f5,0x15f9,0x15f9,0x15f9,0x15f9, -0x15f9,0x15f9,0x15f9,0x15f9,0x15f9,0x15f9,0x15f9,0x15f9,0x15f9,0x15f9,0x15f9,0x15f9,0x15f9,0x15f9,0x15f9,0x15f9, -0x15f9,0x15f9,0x15f9,0x15f9,0x15f9,0x15f9,0x15f9,0x15f9,0x15f9,0x15f9,0x15f9,0x1f8,0x1605,0x1605,0x1605,0x1605, -0x1605,0x15ff,0x1608,0x1605,0x1605,0x1605,0x1605,0x1605,0x1605,0x1605,0x1605,0x1605,0x1602,0x1602,0x1602,0x1602, -0x1602,0x1602,0x1602,0x1602,0x1602,0x1602,0x1605,0x1605,0x1605,0x1605,0x1605,0x1fb,0x160e,0x160e,0x160e,0x160e, -0x160e,0x160e,0x160e,0x160e,0x160e,0x160e,0x160e,0x160e,0x160e,0x160e,0x160e,0x160e,0x160e,0x160e,0x160e,0x160e, -0x160e,0x160e,0x160e,0x160e,0x160e,0x160e,0x160e,0x160e,0x160e,0x160e,0x160e,0x1fe,0x161a,0x161a,0x161a,0x161a, -0x161a,0x161a,0x161a,0x161a,0x161a,0x161a,0x161a,0x161a,0x161a,0x161a,0x161a,0x161a,0x161a,0x161a,0x161a,0x161a, -0x161a,0x161a,0x1617,0x1617,0x1617,0x1617,0x1617,0x201,0x201,0x201,0x201,0x201,0x1632,0x1632,0x1635,0x1635, -0x1638,0x1629,0x204,0x204,0x204,0x204,0x204,0x204,0x204,0x204,0x204,0x204,0x162f,0x162f,0x162f,0x162f, -0x162f,0x162f,0x162f,0x162f,0x162f,0x162f,0x204,0x1629,0x1629,0x1629,0x1629,0x1629,0x1629,0x1629,0x204,0x1632, -0x1632,0x1632,0x1632,0x1632,0x1632,0x1632,0x1632,0x1632,0x1632,0x1632,0x1632,0x1632,0x1632,0x1632,0x1632,0x1632, -0x1632,0x1632,0x1632,0x1632,0x204,0x204,0x204,0x204,0x204,0x1632,0x1632,0x1632,0x1641,0x1641,0x1641,0x1641, -0x1641,0x1641,0x1641,0x1641,0x1641,0x1641,0x1641,0x1641,0x1641,0x1641,0x1641,0x1641,0x1641,0x1641,0x1641,0x1641, -0x1641,0x1641,0x1641,0x1641,0x1641,0x207,0x207,0x207,0x207,0x207,0x207,0x207,0x164a,0x164a,0x164a,0x164a, -0x164a,0x164a,0x164a,0x164a,0x164a,0x164a,0x164a,0x164a,0x164a,0x164a,0x164a,0x164a,0x164a,0x164a,0x20a,0x20a, -0x20a,0x20a,0x20a,0x20a,0x20a,0x1647,0x1647,0x1647,0x1647,0x20a,0x20a,0x20a,0x1665,0x1665,0x1665,0x1665, -0x1665,0x1665,0x1665,0x1665,0x1665,0x1665,0x1665,0x1665,0x1665,0x1665,0x1665,0x164d,0x165f,0x165f,0x164d,0x164d, -0x164d,0x164d,0x210,0x210,0x165f,0x165f,0x1662,0x1662,0x164d,0x164d,0x165f,0x1653,0x1650,0x1656,0x1668,0x1668, -0x1659,0x1659,0x165c,0x165c,0x165c,0x1668,0x1719,0x1719,0x1719,0x1719,0x1719,0x1719,0x1719,0x1719,0x1719,0x1719, -0x1719,0x1719,0x1719,0x1719,0x1716,0x1716,0x1716,0x1716,0x1713,0x1713,0x210,0x210,0x210,0x210,0x210,0x210, +0x189,0x189,0x189,0x189,0x189,0x189,0x189,0x189,0x1332,0x1332,0x1332,0x1332,0x1332,0x1332,0x1332,0x1332, +0x1332,0x1332,0x1332,0x1332,0x1332,0x1332,0x1332,0x1332,0x1332,0x1332,0x1332,0x1332,0x1332,0x1332,0x1332,0x1332, +0x1332,0x132c,0x132c,0x132c,0x18c,0x18c,0x132f,0x18c,0x1344,0x1344,0x1344,0x1344,0x1344,0x1344,0x1335,0x133e, +0x1338,0x1338,0x133e,0x133e,0x133e,0x1338,0x133e,0x1338,0x1338,0x1338,0x1341,0x1341,0x18f,0x18f,0x18f,0x18f, +0x18f,0x18f,0x18f,0x18f,0x133b,0x133b,0x133b,0x133b,0x192,0x1347,0x1347,0x1347,0x1347,0x1347,0x1347,0x192, +0x192,0x1347,0x1347,0x1347,0x1347,0x1347,0x1347,0x192,0x192,0x1347,0x1347,0x1347,0x1347,0x1347,0x1347,0x192, +0x192,0x192,0x192,0x192,0x192,0x192,0x192,0x192,0x1347,0x1347,0x1347,0x1347,0x1347,0x1347,0x1347,0x192, +0x1347,0x1347,0x1347,0x1347,0x1347,0x1347,0x1347,0x192,0x15c6,0x15c6,0x15c6,0x15c6,0x15c6,0x15c6,0x15c6,0x15c6, +0x15c6,0x15c6,0x15c6,0x15c6,0x15c6,0x15c6,0x15c6,0x15c6,0x134a,0x134a,0x134a,0x134a,0x134a,0x134a,0x134d,0x135f, +0x135f,0x1353,0x1353,0x1353,0x1353,0x1353,0x195,0x195,0x195,0x195,0x1350,0x1350,0x1350,0x1350,0x1350,0x1350, +0x1350,0x1350,0x1350,0x1350,0x1350,0x1350,0x1350,0x1350,0x1350,0x1350,0x1356,0x1356,0x1356,0x1356,0x1356,0x1356, +0x1356,0x1356,0x1356,0x1356,0x195,0x195,0x195,0x195,0x195,0x195,0x195,0x195,0x195,0x195,0x195,0x195, +0x195,0x195,0x195,0x152d,0x1362,0x1362,0x1362,0x1362,0x1362,0x1362,0x1362,0x1362,0x1362,0x1362,0x1362,0x1362, +0x1362,0x1362,0x1362,0x1362,0x1362,0x1362,0x1362,0x1362,0x1362,0x1362,0x1362,0x1362,0x1362,0x198,0x198,0x198, +0x198,0x198,0x198,0x198,0x1365,0x1365,0x1365,0x1365,0x1365,0x1365,0x1365,0x1365,0x1365,0x1365,0x1365,0x1365, +0x1365,0x1365,0x1365,0x19b,0x19b,0x1365,0x1365,0x1365,0x1365,0x1365,0x1365,0x1365,0x1365,0x1365,0x1365,0x1365, +0x1365,0x1365,0x1365,0x1530,0x19b,0x1365,0x1365,0x1365,0x1365,0x1365,0x1365,0x1365,0x1365,0x1365,0x1365,0x1365, +0x1365,0x1365,0x1365,0x139b,0x19b,0x1365,0x1365,0x1365,0x1365,0x1365,0x1365,0x1365,0x1365,0x1365,0x1365,0x1365, +0x1365,0x1365,0x1365,0x1365,0x1530,0x1530,0x1530,0x1530,0x1530,0x1530,0x1530,0x1530,0x1530,0x1530,0x1530,0x1530, +0x1530,0x1530,0x1530,0x1530,0x1530,0x1530,0x1530,0x1530,0x1530,0x1530,0x19b,0x19b,0x19b,0x19b,0x19b,0x19b, +0x19b,0x19b,0x19b,0x19b,0x13b9,0x13b3,0x13b3,0x13b3,0x13b3,0x13b3,0x1545,0x1545,0x1545,0x1545,0x1545,0x1548, +0x16b6,0x1548,0x1548,0x1548,0x1782,0x1830,0x1830,0x186c,0x186c,0x19e,0x19e,0x19e,0x19e,0x19e,0x19e,0x19e, +0x19e,0x19e,0x19e,0x19e,0x1548,0x1548,0x1548,0x1548,0x1548,0x1548,0x1545,0x1545,0x1545,0x1548,0x1545,0x16b3, +0x16b3,0x19e,0x19e,0x19e,0x1548,0x1545,0x1545,0x1548,0x1830,0x1830,0x1830,0x18cf,0x18cf,0x19e,0x19e,0x19e, +0x19e,0x19e,0x19e,0x19e,0x1368,0x1368,0x1368,0x1368,0x1368,0x1368,0x1368,0x1368,0x1368,0x1368,0x1368,0x1368, +0x1368,0x1368,0x1368,0x1368,0x1368,0x1368,0x1368,0x1368,0x1a1,0x1a1,0x1a1,0x1a1,0x1a1,0x1a1,0x1a1,0x1a1, +0x1a1,0x1a1,0x1a1,0x1a1,0x140d,0x154e,0x140d,0x140d,0x140d,0x140d,0x140d,0x140d,0x140d,0x140d,0x140d,0x140d, +0x140d,0x154e,0x154e,0x154e,0x154e,0x154e,0x154e,0x1707,0x1707,0x1a4,0x17b2,0x17b2,0x17b2,0x17b2,0x17b2,0x17b2, +0x17b2,0x17b2,0x1a4,0x1a4,0x1a4,0x1a4,0x1a4,0x1a4,0x1a4,0x1a4,0x1a4,0x1a4,0x1a4,0x1a4,0x1a4,0x1a4, +0x1a4,0x1a4,0x1a4,0x1a4,0x1a4,0x1a4,0x1a4,0x1a4,0x17af,0x17af,0x17af,0x17af,0x17af,0x17af,0x17af,0x17af, +0x17af,0x17af,0x17af,0x17af,0x1413,0x1413,0x1413,0x1413,0x1a7,0x1413,0x1413,0x1413,0x1413,0x1413,0x1413,0x1413, +0x1413,0x1413,0x1413,0x1413,0x1413,0x1413,0x1413,0x1413,0x1413,0x1413,0x1413,0x1413,0x1413,0x1413,0x1413,0x1413, +0x1413,0x1413,0x1413,0x1413,0x1a7,0x1413,0x1413,0x1a7,0x1413,0x1a7,0x1a7,0x1413,0x1a7,0x1413,0x1413,0x1413, +0x1413,0x1413,0x1413,0x1413,0x1413,0x1413,0x1413,0x1a7,0x1413,0x1413,0x1413,0x1413,0x1a7,0x1413,0x1a7,0x1413, +0x1a7,0x1a7,0x1a7,0x1a7,0x1a7,0x1a7,0x1413,0x1a7,0x1a7,0x1a7,0x1a7,0x1413,0x1a7,0x1413,0x1a7,0x1413, +0x1a7,0x1413,0x1413,0x1413,0x1a7,0x1413,0x1413,0x1a7,0x1413,0x1a7,0x1a7,0x1413,0x1a7,0x1413,0x1a7,0x1413, +0x1a7,0x1413,0x1a7,0x1413,0x1a7,0x1413,0x1413,0x1a7,0x1413,0x1a7,0x1a7,0x1413,0x1413,0x1413,0x1413,0x1a7, +0x1413,0x1413,0x1413,0x1413,0x1413,0x1413,0x1413,0x1a7,0x1413,0x1413,0x1413,0x1413,0x1a7,0x1413,0x1413,0x1413, +0x1413,0x1a7,0x1413,0x1a7,0x1413,0x1413,0x1413,0x1413,0x1413,0x1413,0x1413,0x1413,0x1413,0x1413,0x1a7,0x1413, +0x1413,0x1413,0x1413,0x1413,0x1413,0x1413,0x1413,0x1413,0x1413,0x1413,0x1413,0x1413,0x1413,0x1413,0x1413,0x1413, +0x1a7,0x1a7,0x1a7,0x1a7,0x1a7,0x1413,0x1413,0x1413,0x1a7,0x1413,0x1413,0x1413,0x1413,0x1413,0x1a7,0x1413, +0x1413,0x1413,0x1413,0x1413,0x1413,0x1413,0x1413,0x1413,0x1413,0x1413,0x1413,0x1413,0x1413,0x1413,0x1413,0x1413, +0x1a7,0x1a7,0x1a7,0x1a7,0x1a7,0x1a7,0x1a7,0x1a7,0x1a7,0x1a7,0x1a7,0x1a7,0x1a7,0x1a7,0x1a7,0x1a7, +0x1a7,0x1a7,0x1a7,0x1a7,0x1a7,0x1a7,0x1a7,0x1a7,0x1a7,0x1a7,0x1a7,0x1a7,0x1a7,0x1a7,0x1a7,0x1a7, +0x1410,0x1410,0x1a7,0x1a7,0x1a7,0x1a7,0x1a7,0x1a7,0x1a7,0x1a7,0x1a7,0x1a7,0x1a7,0x1a7,0x1a7,0x1a7, +0x1428,0x1428,0x1428,0x1428,0x1428,0x1428,0x1428,0x1416,0x1416,0x1416,0x1416,0x1416,0x1425,0x1416,0x1419,0x1419, +0x1416,0x1416,0x1416,0x141c,0x141c,0x1aa,0x1422,0x1422,0x1422,0x1422,0x1422,0x1422,0x1422,0x1422,0x1422,0x1422, +0x141f,0x142b,0x142b,0x142b,0x1aa,0x1aa,0x1aa,0x1aa,0x1aa,0x1aa,0x1aa,0x1aa,0x1aa,0x1aa,0x1aa,0x1aa, +0x15d8,0x15d8,0x15d8,0x15d8,0x15d8,0x15d8,0x15d8,0x15d8,0x15d8,0x15d8,0x15d8,0x15d8,0x15d8,0x15d8,0x15d8,0x15d8, +0x1437,0x1437,0x1437,0x1437,0x1437,0x1437,0x1437,0x1437,0x1437,0x1437,0x1437,0x1434,0x142e,0x142e,0x1434,0x1434, +0x143d,0x143d,0x1437,0x143a,0x143a,0x1434,0x1431,0x1ad,0x1ad,0x1ad,0x1ad,0x1ad,0x1ad,0x1ad,0x1ad,0x1ad, +0x1440,0x1440,0x1440,0x1440,0x1440,0x1440,0x1440,0x1440,0x1440,0x1440,0x1440,0x1440,0x1440,0x1440,0x1440,0x1440, +0x1440,0x1440,0x1440,0x1440,0x1440,0x1440,0x1440,0x1440,0x1b0,0x1b0,0x1b0,0x1b0,0x170a,0x170a,0x1440,0x1440, +0x170a,0x170a,0x170a,0x170a,0x170a,0x170a,0x170a,0x170a,0x170a,0x170a,0x170a,0x170a,0x170a,0x170a,0x170a,0x170a, +0x1b0,0x1b0,0x170a,0x170a,0x170a,0x170a,0x170a,0x170a,0x170a,0x170a,0x170a,0x170a,0x170a,0x170a,0x170a,0x170a, +0x144c,0x144c,0x144c,0x144c,0x144c,0x1b3,0x1b3,0x1b3,0x1b3,0x1b3,0x1b3,0x1b3,0x1b3,0x1b3,0x1b3,0x1b3, +0x144c,0x1449,0x1449,0x1449,0x1449,0x1449,0x1449,0x1449,0x1449,0x1449,0x1449,0x1449,0x1449,0x1449,0x1449,0x1449, +0x1449,0x1449,0x1449,0x1449,0x1449,0x1449,0x1449,0x1449,0x1449,0x1449,0x1449,0x1449,0x1449,0x1449,0x1449,0x1449, +0x1449,0x1449,0x1449,0x1b3,0x1b3,0x1b3,0x1b3,0x1b3,0x1b3,0x1b3,0x1b3,0x1b3,0x1b3,0x1b3,0x1b3,0x1b3, +0x1b3,0x1b3,0x1b3,0x1446,0x1446,0x1446,0x1446,0x144f,0x144f,0x144f,0x144f,0x144f,0x144f,0x144f,0x144f,0x144f, +0x144f,0x144f,0x144f,0x144f,0x1461,0x1464,0x1467,0x1467,0x1464,0x146a,0x146a,0x1455,0x1458,0x1710,0x170d,0x170d, +0x170d,0x1554,0x1b6,0x1b6,0x145b,0x145b,0x145b,0x145b,0x145b,0x145b,0x145b,0x145b,0x145b,0x145b,0x1551,0x1716, +0x1719,0x1713,0x171c,0x171c,0x1470,0x1470,0x1470,0x1470,0x1470,0x1470,0x1470,0x1470,0x1470,0x1b9,0x1b9,0x1b9, +0x1b9,0x1b9,0x1b9,0x1b9,0x146d,0x146d,0x146d,0x146d,0x146d,0x146d,0x146d,0x146d,0x146d,0x146d,0x1b9,0x1b9, +0x1b9,0x1b9,0x1b9,0x1b9,0x1473,0x1473,0x1473,0x1473,0x1473,0x1473,0x1473,0x1473,0x1bc,0x1bc,0x1bc,0x1bc, +0x1bc,0x1bc,0x1bc,0x1bc,0x12c3,0x12c0,0x12c3,0x12ab,0x12c0,0x12c0,0x12c0,0x12c6,0x12c0,0x12c6,0x12c9,0x12c0, +0x12c6,0x12c6,0x12c0,0x12c0,0x1485,0x1485,0x1485,0x1485,0x1485,0x1485,0x1485,0x1485,0x1485,0x1485,0x1485,0x1476, +0x147f,0x1476,0x147f,0x147f,0x1476,0x1476,0x1476,0x1476,0x1476,0x1476,0x1482,0x1479,0x1bf,0x1bf,0x1bf,0x1bf, +0x1bf,0x1bf,0x1bf,0x1bf,0x155a,0x155a,0x155a,0x155a,0x155a,0x155a,0x155a,0x155a,0x155a,0x155a,0x155a,0x155a, +0x155a,0x155a,0x1c2,0x1c2,0x1557,0x1557,0x1557,0x1557,0x1557,0x155d,0x1c2,0x1c2,0x1c2,0x1c2,0x1c2,0x1c2, +0x1c2,0x1c2,0x1c2,0x1c2,0x16c2,0x16b9,0x16b9,0x16b9,0x16b9,0x16b9,0x16b9,0x16b9,0x16b9,0x16b9,0x16b9,0x16b9, +0x16b9,0x16b9,0x16b9,0x16b9,0x16b9,0x16b9,0x16b9,0x16b9,0x16b9,0x16b9,0x16b9,0x16b9,0x16b9,0x16b9,0x16b9,0x16b9, +0x1c8,0x1c8,0x1c8,0x1c8,0x1cb,0x1cb,0x1cb,0x1cb,0x1cb,0x1cb,0x1cb,0x1cb,0x1cb,0x1cb,0x1cb,0x1cb, +0x1cb,0x1cb,0x1cb,0x1cb,0x1cb,0x1cb,0x1cb,0x1cb,0x1cb,0x1cb,0x1cb,0x1cb,0x1cb,0x1cb,0x1cb,0x1cb, +0x1cb,0x1cb,0x1cb,0x1cb,0x1575,0x1575,0x1575,0x1575,0x1575,0x1575,0x1575,0x1575,0x1575,0x1575,0x1575,0x1ce, +0x1ce,0x1ce,0x1ce,0x1ce,0x1575,0x1575,0x1575,0x1575,0x1575,0x1575,0x1575,0x1575,0x1575,0x1575,0x1575,0x1575, +0x1575,0x1ce,0x1ce,0x1ce,0x1ce,0x1ce,0x1ce,0x1ce,0x1575,0x1575,0x1575,0x1575,0x1575,0x1575,0x1575,0x1575, +0x1575,0x1575,0x1ce,0x1ce,0x1572,0x156c,0x156f,0x1578,0x157b,0x157b,0x157b,0x157b,0x157b,0x157b,0x157b,0x157b, +0x1d1,0x1d1,0x1d1,0x1d1,0x1d1,0x1d1,0x1d1,0x1d1,0x1563,0x1563,0x1563,0x1563,0x1563,0x1563,0x1563,0x1563, +0x1563,0x1563,0x1563,0x1563,0x1563,0x1563,0x1563,0x1563,0x157e,0x157e,0x157e,0x157e,0x157e,0x157e,0x157e,0x157e, +0x157e,0x157e,0x157e,0x157e,0x157e,0x157e,0x157e,0x157e,0x157e,0x157e,0x157e,0x157e,0x157e,0x1d4,0x1d4,0x1d4, +0x1d4,0x1d4,0x1d4,0x1d4,0x1d4,0x1d4,0x1d4,0x1d4,0x1d4,0x1d4,0x1d4,0x1d4,0x1d4,0x1d4,0x1d4,0x1d4, +0x1d4,0x1d4,0x1d4,0x1d4,0x1d4,0x1d4,0x1d4,0x1d4,0x1d4,0x1d4,0x1d4,0x1d4,0x1d4,0x1d4,0x1d4,0x1d4, +0x171f,0x16c5,0x1587,0x16cb,0x1d7,0x1590,0x1590,0x1590,0x1590,0x1590,0x1590,0x1590,0x1590,0x1d7,0x1d7,0x1590, +0x1590,0x1d7,0x1d7,0x1590,0x1590,0x1590,0x1590,0x1590,0x1590,0x1590,0x1590,0x1590,0x1590,0x1590,0x1590,0x1590, +0x1590,0x1d7,0x1590,0x1590,0x1590,0x1590,0x1590,0x1590,0x1590,0x1d7,0x1590,0x1590,0x1d7,0x1590,0x1590,0x1590, +0x1590,0x1590,0x1d7,0x1d7,0x16c8,0x1590,0x1581,0x1587,0x1581,0x1587,0x1587,0x1587,0x1587,0x1d7,0x1d7,0x1587, +0x1587,0x1d7,0x1d7,0x158a,0x158a,0x158d,0x1d7,0x1d7,0x1722,0x1d7,0x1d7,0x1d7,0x1d7,0x1d7,0x1d7,0x1581, +0x1d7,0x1d7,0x1d7,0x1d7,0x1d7,0x1593,0x1590,0x1590,0x1590,0x1590,0x1587,0x1587,0x1d7,0x1d7,0x1584,0x1584, +0x1584,0x1584,0x1584,0x1584,0x1584,0x1d7,0x1d7,0x1d7,0x1584,0x1584,0x1584,0x1584,0x1584,0x1d7,0x1d7,0x1d7, +0x1d7,0x1d7,0x1d7,0x1d7,0x1d7,0x1d7,0x1d7,0x1d7,0x15a8,0x15a8,0x15a8,0x15a8,0x15a8,0x15a8,0x15a8,0x15a8, +0x15a8,0x15a8,0x15a8,0x15a8,0x15a8,0x15a8,0x15a8,0x15a8,0x15a8,0x15a8,0x1da,0x15a8,0x15a8,0x15a8,0x15a8,0x15a8, +0x15a8,0x15a8,0x15a8,0x15a8,0x15a8,0x15a8,0x15a8,0x15a8,0x15a2,0x15a2,0x15a2,0x1596,0x1596,0x1596,0x15a2,0x15a2, +0x1596,0x15a5,0x1599,0x1596,0x15ab,0x15ab,0x159f,0x15ab,0x15ab,0x159c,0x17b5,0x1da,0x15ba,0x15ba,0x15ba,0x15ae, +0x15ae,0x15ae,0x15ae,0x15ae,0x15ae,0x15b1,0x15b4,0x1dd,0x1dd,0x1dd,0x1dd,0x1dd,0x15b7,0x15b7,0x15b7,0x15b7, +0x15b7,0x15b7,0x15b7,0x15b7,0x15b7,0x15b7,0x1dd,0x1dd,0x1dd,0x1dd,0x1dd,0x1dd,0x1725,0x1725,0x1725,0x1725, +0x15c6,0x15c3,0x1e0,0x1e0,0x1e0,0x1e0,0x1e0,0x1e0,0x1e0,0x1e0,0x1e0,0x1e0,0x174f,0x174f,0x174f,0x174f, +0x174f,0x174f,0x174f,0x174f,0x174f,0x174f,0x174f,0x174f,0x174f,0x174f,0x174f,0x174f,0x15cc,0x15cc,0x15cc,0x15cc, +0x15cc,0x15cc,0x15cc,0x15cc,0x15cc,0x15cc,0x15cc,0x15cc,0x15cc,0x15cc,0x15cc,0x15cc,0x15cc,0x15cc,0x15cc,0x15cc, +0x15cc,0x15cc,0x15cc,0x1e3,0x1e3,0x1e3,0x1e3,0x1e3,0x1e3,0x1e3,0x1e3,0x1e3,0x15cc,0x15cc,0x15cc,0x15cc, +0x15cc,0x15cc,0x15cc,0x15cc,0x15cc,0x15cc,0x15cc,0x15cc,0x15cc,0x15cc,0x15cc,0x15cc,0x15cc,0x15cc,0x15cc,0x15cc, +0x15cc,0x15cc,0x1e3,0x1e3,0x1e3,0x1e3,0x1e3,0x1e3,0x1e3,0x1e3,0x1e3,0x1e3,0x15cc,0x15cc,0x15cc,0x15cc, +0x15cc,0x15cc,0x15cc,0x15cc,0x1e3,0x1e3,0x1e3,0x1e3,0x1e3,0x1e3,0x1e3,0x1e3,0x1e3,0x1e3,0x1e3,0x1e3, +0x1e3,0x1e3,0x1e3,0x1e3,0x1e3,0x1e3,0x1e3,0x1e3,0x1e3,0x1e3,0x1e3,0x1e3,0x15d8,0x15d8,0x15d8,0x15d8, +0x15d8,0x15d8,0x15d8,0x15d8,0x15d8,0x15d8,0x15d8,0x15d8,0x15d8,0x15d8,0x15d8,0x15d8,0x15d8,0x15d8,0x15d8,0x15cf, +0x15d2,0x15d5,0x15d8,0x1e6,0x1e6,0x1e6,0x1e6,0x1e6,0x1e6,0x1e6,0x1e6,0x1e6,0x15e7,0x15e7,0x15e7,0x15e7, +0x15e7,0x15db,0x15db,0x1e9,0x1e9,0x1e9,0x1e9,0x15de,0x15de,0x15de,0x15de,0x15de,0x15e4,0x15e4,0x15e4,0x15e4, +0x15e4,0x15e4,0x15e1,0x1e9,0x1e9,0x1e9,0x1e9,0x1e9,0x1e9,0x1e9,0x1e9,0x1e9,0x15f0,0x15f0,0x15f0,0x15f0, +0x15f0,0x1ec,0x1ec,0x15ed,0x15ed,0x15ed,0x15ed,0x15ed,0x15ed,0x15ed,0x15ed,0x15ed,0x15ea,0x15ea,0x15ea,0x15ea, +0x15ea,0x15ea,0x15ea,0x1ec,0x1ec,0x1ec,0x1ec,0x1ec,0x1ec,0x1ec,0x1ec,0x1ec,0x15f3,0x1605,0x1605,0x15f9, +0x1602,0x1ef,0x1ef,0x1ef,0x1ef,0x1ef,0x1ef,0x1ef,0x1ef,0x1ef,0x1ef,0x1ef,0x15fc,0x15fc,0x15fc,0x15fc, +0x15fc,0x15fc,0x15fc,0x15fc,0x15fc,0x15fc,0x1ef,0x1ef,0x1ef,0x1ef,0x1ef,0x1ef,0x160b,0x160b,0x160b,0x160b, +0x160b,0x160b,0x160b,0x160b,0x160b,0x160b,0x160b,0x160b,0x160b,0x160b,0x160b,0x160b,0x160b,0x160b,0x160b,0x160b, +0x160b,0x160b,0x160b,0x160b,0x160b,0x160b,0x160b,0x160b,0x160b,0x160b,0x160b,0x1f2,0x1617,0x1617,0x1617,0x1617, +0x1617,0x1611,0x161a,0x1617,0x1617,0x1617,0x1617,0x1617,0x1617,0x1617,0x1617,0x1617,0x1614,0x1614,0x1614,0x1614, +0x1614,0x1614,0x1614,0x1614,0x1614,0x1614,0x1617,0x1617,0x1617,0x1617,0x1617,0x1f5,0x1620,0x1620,0x1620,0x1620, +0x1620,0x1620,0x1620,0x1620,0x1620,0x1620,0x1620,0x1620,0x1620,0x1620,0x1620,0x1620,0x1620,0x1620,0x1620,0x1620, +0x1620,0x1620,0x1620,0x1620,0x1620,0x1620,0x1620,0x1620,0x1620,0x1620,0x1620,0x1f8,0x162c,0x162c,0x162c,0x162c, +0x162c,0x162c,0x162c,0x162c,0x162c,0x162c,0x162c,0x162c,0x162c,0x162c,0x162c,0x162c,0x162c,0x162c,0x162c,0x162c, +0x162c,0x162c,0x1629,0x1629,0x1629,0x1629,0x1629,0x1fb,0x1fb,0x1fb,0x1fb,0x1fb,0x1644,0x1644,0x1647,0x1647, +0x164a,0x163b,0x1fe,0x1fe,0x1fe,0x1fe,0x1fe,0x1fe,0x1fe,0x1fe,0x1fe,0x1fe,0x1641,0x1641,0x1641,0x1641, +0x1641,0x1641,0x1641,0x1641,0x1641,0x1641,0x1fe,0x163b,0x163b,0x163b,0x163b,0x163b,0x163b,0x163b,0x1fe,0x1644, +0x1644,0x1644,0x1644,0x1644,0x1644,0x1644,0x1644,0x1644,0x1644,0x1644,0x1644,0x1644,0x1644,0x1644,0x1644,0x1644, +0x1644,0x1644,0x1644,0x1644,0x1fe,0x1fe,0x1fe,0x1fe,0x1fe,0x1644,0x1644,0x1644,0x1653,0x1653,0x1653,0x1653, +0x1653,0x1653,0x1653,0x1653,0x1653,0x1653,0x1653,0x1653,0x1653,0x1653,0x1653,0x1653,0x1653,0x1653,0x1653,0x1653, +0x1653,0x1653,0x1653,0x1653,0x1653,0x201,0x201,0x201,0x201,0x201,0x201,0x201,0x165c,0x165c,0x165c,0x165c, +0x165c,0x165c,0x165c,0x165c,0x165c,0x165c,0x165c,0x165c,0x165c,0x165c,0x165c,0x165c,0x165c,0x165c,0x204,0x204, +0x204,0x204,0x204,0x204,0x204,0x1659,0x1659,0x1659,0x1659,0x204,0x204,0x204,0x1677,0x1677,0x1677,0x1677, +0x1677,0x1677,0x1677,0x1677,0x1677,0x1677,0x1677,0x1677,0x1677,0x1677,0x1677,0x165f,0x1671,0x1671,0x165f,0x165f, +0x165f,0x165f,0x20a,0x20a,0x1671,0x1671,0x1674,0x1674,0x165f,0x165f,0x1671,0x1665,0x1662,0x1668,0x167a,0x167a, +0x166b,0x166b,0x166e,0x166e,0x166e,0x167a,0x172e,0x172e,0x172e,0x172e,0x172e,0x172e,0x172e,0x172e,0x172e,0x172e, +0x172e,0x172e,0x172e,0x172e,0x172b,0x172b,0x172b,0x172b,0x1728,0x1728,0x20a,0x20a,0x20a,0x20a,0x20a,0x20a, +0x20a,0x20a,0x20a,0x20a,0x20a,0x20a,0x20a,0x20a,0x20a,0x20a,0x20a,0x20a,0x20a,0x20a,0x20a,0x20a, +0x20a,0x20a,0x20a,0x20a,0x20a,0x20a,0x20a,0x20a,0x20a,0x20a,0x20a,0x20a,0x20d,0x167d,0x167d,0x167d, +0x167d,0x167d,0x167d,0x167d,0x167d,0x167d,0x167d,0x167d,0x167d,0x167d,0x167d,0x167d,0x167d,0x167d,0x167d,0x167d, +0x167d,0x20d,0x20d,0x20d,0x20d,0x20d,0x20d,0x20d,0x20d,0x20d,0x20d,0x20d,0x1680,0x1680,0x1680,0x1680, +0x1680,0x1680,0x1680,0x1680,0x1680,0x1680,0x1680,0x1680,0x210,0x210,0x210,0x210,0x1680,0x1680,0x1680,0x1680, +0x1680,0x1680,0x1680,0x1680,0x1680,0x1680,0x1680,0x1680,0x1680,0x1680,0x1680,0x1680,0x210,0x210,0x210,0x210, +0x210,0x210,0x210,0x210,0x1680,0x1680,0x1680,0x1680,0x1680,0x1680,0x1680,0x1680,0x1680,0x1680,0x210,0x210, +0x210,0x210,0x210,0x210,0x1680,0x1680,0x1680,0x1680,0x1680,0x1680,0x1680,0x1680,0x210,0x210,0x210,0x210, +0x210,0x210,0x210,0x210,0x1680,0x1680,0x1680,0x1680,0x1680,0x1680,0x1680,0x1680,0x1680,0x1680,0x1680,0x1680, +0x1680,0x1680,0x1680,0x1680,0x1680,0x1680,0x210,0x210,0x210,0x210,0x210,0x210,0x210,0x210,0x210,0x210, 0x210,0x210,0x210,0x210,0x210,0x210,0x210,0x210,0x210,0x210,0x210,0x210,0x210,0x210,0x210,0x210, -0x210,0x210,0x210,0x210,0x210,0x210,0x210,0x210,0x210,0x210,0x210,0x210,0x213,0x166b,0x166b,0x166b, -0x166b,0x166b,0x166b,0x166b,0x166b,0x166b,0x166b,0x166b,0x166b,0x166b,0x166b,0x166b,0x166b,0x166b,0x166b,0x166b, -0x166b,0x213,0x213,0x213,0x213,0x213,0x213,0x213,0x213,0x213,0x213,0x213,0x166e,0x166e,0x166e,0x166e, -0x166e,0x166e,0x166e,0x166e,0x166e,0x166e,0x166e,0x166e,0x216,0x216,0x216,0x216,0x166e,0x166e,0x166e,0x166e, -0x166e,0x166e,0x166e,0x166e,0x166e,0x166e,0x166e,0x166e,0x166e,0x166e,0x166e,0x166e,0x216,0x216,0x216,0x216, -0x216,0x216,0x216,0x216,0x166e,0x166e,0x166e,0x166e,0x166e,0x166e,0x166e,0x166e,0x166e,0x166e,0x216,0x216, -0x216,0x216,0x216,0x216,0x166e,0x166e,0x166e,0x166e,0x166e,0x166e,0x166e,0x166e,0x216,0x216,0x216,0x216, -0x216,0x216,0x216,0x216,0x166e,0x166e,0x166e,0x166e,0x166e,0x166e,0x166e,0x166e,0x166e,0x166e,0x166e,0x166e, -0x166e,0x166e,0x166e,0x166e,0x166e,0x166e,0x216,0x216,0x216,0x216,0x216,0x216,0x216,0x216,0x216,0x216, -0x216,0x216,0x216,0x216,0x216,0x216,0x216,0x216,0x216,0x216,0x216,0x216,0x216,0x216,0x216,0x216, -0x216,0x216,0x216,0x216,0x216,0x216,0x216,0x216,0x1671,0x1680,0x1677,0x1674,0x1686,0x1686,0x167a,0x1686, -0x219,0x219,0x219,0x219,0x219,0x219,0x219,0x219,0x167d,0x167d,0x167d,0x167d,0x167d,0x167d,0x167d,0x167d, -0x167d,0x167d,0x219,0x219,0x219,0x219,0x219,0x219,0x168c,0x168c,0x168c,0x168c,0x168c,0x168c,0x168c,0x168c, -0x168c,0x168c,0x1689,0x1689,0x1689,0x1689,0x1689,0x1689,0x1689,0x1689,0x1689,0x21c,0x21c,0x21c,0x21c,0x21c, -0x21c,0x21c,0x21c,0x21c,0x21c,0x21c,0x21c,0x1692,0x172b,0x172b,0x172b,0x172b,0x172b,0x172b,0x172b,0x172b, -0x172b,0x172b,0x172b,0x172b,0x172b,0x172b,0x172b,0x172b,0x172b,0x172b,0x172b,0x172b,0x172b,0x172b,0x172b,0x172b, -0x172b,0x172b,0x21f,0x21f,0x21f,0x171c,0x171c,0x171c,0x1728,0x1728,0x171c,0x171c,0x171c,0x171c,0x1728,0x171c, -0x171c,0x171c,0x171c,0x171f,0x21f,0x21f,0x21f,0x21f,0x1725,0x1725,0x1725,0x1725,0x1725,0x1725,0x1725,0x1725, -0x1725,0x1725,0x1722,0x1722,0x172e,0x172e,0x172e,0x1722,0x1731,0x1731,0x1731,0x1731,0x1731,0x1731,0x1731,0x222, -0x222,0x222,0x222,0x222,0x222,0x222,0x222,0x222,0x222,0x222,0x222,0x222,0x222,0x222,0x222,0x222, -0x222,0x222,0x222,0x222,0x222,0x222,0x222,0x222,0x222,0x222,0x222,0x222,0x222,0x222,0x222,0x222, -0x1743,0x1743,0x1743,0x1743,0x1743,0x1743,0x1743,0x1743,0x1743,0x1743,0x1743,0x1743,0x1743,0x1743,0x1743,0x1743, -0x1743,0x1743,0x1743,0x228,0x1743,0x1743,0x228,0x228,0x228,0x228,0x228,0x1740,0x1740,0x1740,0x1740,0x1740, -0x1746,0x1746,0x1746,0x1746,0x1746,0x1746,0x1746,0x22b,0x1746,0x22b,0x1746,0x1746,0x1746,0x1746,0x22b,0x1746, -0x1746,0x1746,0x1746,0x1746,0x1746,0x1746,0x1746,0x1746,0x1746,0x1746,0x1746,0x1746,0x1746,0x1746,0x22b,0x1746, -0x1746,0x1746,0x1746,0x1746,0x1746,0x1746,0x1746,0x1746,0x1746,0x1749,0x22b,0x22b,0x22b,0x22b,0x22b,0x22b, -0x15ab,0x15ab,0x15ab,0x15ab,0x15ab,0x15ab,0x15ab,0x15ab,0x15ab,0x15ab,0x15ab,0x15ab,0x15ab,0x15ab,0x15ab,0x15ab, -0x1752,0x1752,0x1752,0x1752,0x1752,0x1752,0x1752,0x1752,0x1752,0x1752,0x1752,0x1752,0x1752,0x1752,0x1752,0x1752, -0x1752,0x1752,0x1752,0x22e,0x22e,0x22e,0x22e,0x22e,0x22e,0x22e,0x22e,0x22e,0x22e,0x22e,0x22e,0x22e, -0x174f,0x174f,0x174f,0x174f,0x174f,0x174f,0x174f,0x174f,0x174f,0x174f,0x174f,0x174f,0x174f,0x174f,0x174f,0x174f, -0x174f,0x174f,0x174f,0x22e,0x22e,0x22e,0x22e,0x22e,0x22e,0x22e,0x174c,0x174c,0x174c,0x174c,0x174c,0x174c, -0x231,0x231,0x231,0x231,0x231,0x231,0x231,0x231,0x231,0x231,0x231,0x231,0x231,0x231,0x231,0x231, -0x1773,0x1773,0x1773,0x1773,0x1773,0x1773,0x1773,0x1773,0x1776,0x1824,0x1824,0x1824,0x1824,0x1824,0x1824,0x231, -0x1821,0x1821,0x1821,0x1821,0x1821,0x1821,0x1824,0x1821,0x231,0x231,0x231,0x231,0x231,0x231,0x231,0x231, -0x1824,0x231,0x231,0x1824,0x1824,0x1824,0x1824,0x1824,0x1824,0x1824,0x1821,0x181e,0x1824,0x1824,0x1824,0x231, -0x1821,0x1821,0x1821,0x1821,0x1821,0x1821,0x181e,0x1821,0x1821,0x1821,0x1821,0x1821,0x231,0x231,0x231,0x231, -0x1821,0x1821,0x1821,0x1821,0x1821,0x1821,0x1821,0x1821,0x1821,0x1821,0x1821,0x1821,0x1821,0x1821,0x1821,0x231, -0x231,0x231,0x231,0x231,0x231,0x231,0x231,0x231,0x231,0x231,0x231,0x231,0x231,0x231,0x231,0x231, -0x231,0x231,0x231,0x231,0x231,0x231,0x231,0x231,0x231,0x231,0x231,0x231,0x231,0x231,0x231,0x231, -0x1773,0x1773,0x1773,0x1773,0x1773,0x1821,0x1821,0x1821,0x1821,0x1821,0x1821,0x1821,0x1821,0x1821,0x1821,0x1821, -0x1821,0x1821,0x231,0x231,0x231,0x231,0x231,0x231,0x231,0x231,0x231,0x231,0x231,0x231,0x231,0x231, -0x1773,0x231,0x231,0x231,0x231,0x231,0x231,0x231,0x231,0x231,0x231,0x231,0x231,0x231,0x231,0x231, -0x231,0x231,0x231,0x231,0x231,0x231,0x231,0x231,0x231,0x231,0x231,0x231,0x231,0x231,0x231,0x231, -0x1758,0x1758,0x1758,0x1758,0x1755,0x1758,0x1758,0x175b,0x175e,0x175b,0x175b,0x1758,0x234,0x234,0x234,0x234, -0x234,0x234,0x234,0x234,0x234,0x234,0x234,0x234,0x234,0x234,0x234,0x1755,0x1755,0x1755,0x1755,0x1755, -0x17b2,0x17b2,0x17b2,0x17b2,0x17a9,0x17a9,0x17a9,0x17a3,0x17a6,0x17a6,0x17a6,0x237,0x237,0x237,0x237,0x237, -0x17af,0x17af,0x17af,0x17af,0x17af,0x17af,0x17af,0x17af,0x17af,0x17af,0x237,0x237,0x237,0x237,0x17ac,0x17ac, -0x17cd,0x17cd,0x17cd,0x17cd,0x17cd,0x17cd,0x17cd,0x17cd,0x17cd,0x23a,0x17cd,0x17cd,0x17cd,0x17cd,0x17cd,0x17cd, -0x17cd,0x17cd,0x17cd,0x17cd,0x17cd,0x17cd,0x17cd,0x17cd,0x17cd,0x17cd,0x17cd,0x17cd,0x17cd,0x17cd,0x17cd,0x17cd, -0x17cd,0x17cd,0x17cd,0x17ca,0x17b8,0x17b8,0x17b8,0x17b8,0x17b8,0x17b8,0x17b8,0x23a,0x17b8,0x17b8,0x17b8,0x17b8, -0x17b8,0x17b8,0x17ca,0x17bb,0x17cd,0x17d0,0x17d0,0x17c4,0x17c1,0x17c1,0x23a,0x23a,0x23a,0x23a,0x23a,0x23a, -0x23a,0x23a,0x23a,0x23a,0x17c7,0x17c7,0x17c7,0x17c7,0x17c7,0x17c7,0x17c7,0x17c7,0x17c7,0x17c7,0x17be,0x17be, -0x17be,0x17be,0x17be,0x17be,0x17be,0x17be,0x17be,0x17be,0x17be,0x17be,0x17be,0x17be,0x17be,0x23a,0x23a,0x23a, -0x17dc,0x17df,0x17e5,0x17e5,0x17e5,0x17e5,0x17e5,0x17e5,0x17e5,0x17e5,0x17e5,0x17e5,0x17e5,0x17e5,0x17e5,0x17e5, -0x17d6,0x17d6,0x17d6,0x17d6,0x17d6,0x17d6,0x17d6,0x240,0x17d6,0x17d6,0x17d6,0x17d6,0x17d6,0x17d6,0x17d6,0x17d6, -0x17d6,0x17d6,0x17d6,0x17d6,0x17d6,0x17d6,0x17d6,0x17d6,0x17d6,0x240,0x240,0x17d6,0x17d6,0x17d6,0x17d6,0x17d6, -0x1827,0x243,0x243,0x243,0x243,0x243,0x243,0x243,0x243,0x243,0x243,0x243,0x243,0x243,0x243,0x243, +0x210,0x210,0x210,0x210,0x210,0x210,0x210,0x210,0x1683,0x1692,0x1689,0x1686,0x1698,0x1698,0x168c,0x1698, +0x213,0x213,0x213,0x213,0x213,0x213,0x213,0x213,0x168f,0x168f,0x168f,0x168f,0x168f,0x168f,0x168f,0x168f, +0x168f,0x168f,0x213,0x213,0x213,0x213,0x213,0x213,0x169e,0x169e,0x169e,0x169e,0x169e,0x169e,0x169e,0x169e, +0x169e,0x169e,0x169b,0x169b,0x169b,0x169b,0x169b,0x169b,0x169b,0x169b,0x169b,0x216,0x216,0x216,0x216,0x216, +0x216,0x216,0x216,0x216,0x216,0x216,0x216,0x16a4,0x1740,0x1740,0x1740,0x1740,0x1740,0x1740,0x1740,0x1740, +0x1740,0x1740,0x1740,0x1740,0x1740,0x1740,0x1740,0x1740,0x1740,0x1740,0x1740,0x1740,0x1740,0x1740,0x1740,0x1740, +0x1740,0x1740,0x219,0x219,0x219,0x1731,0x1731,0x1731,0x173d,0x173d,0x1731,0x1731,0x1731,0x1731,0x173d,0x1731, +0x1731,0x1731,0x1731,0x1734,0x219,0x219,0x219,0x219,0x173a,0x173a,0x173a,0x173a,0x173a,0x173a,0x173a,0x173a, +0x173a,0x173a,0x1737,0x1737,0x1743,0x1743,0x1743,0x1737,0x1746,0x1746,0x1746,0x1746,0x1746,0x1746,0x1746,0x21c, +0x21c,0x21c,0x21c,0x21c,0x21c,0x21c,0x21c,0x21c,0x21c,0x21c,0x21c,0x21c,0x21c,0x21c,0x21c,0x21c, +0x21c,0x21c,0x21c,0x21c,0x21c,0x21c,0x21c,0x21c,0x21c,0x21c,0x21c,0x21c,0x21c,0x21c,0x21c,0x21c, +0x1758,0x1758,0x1758,0x1758,0x1758,0x1758,0x1758,0x1758,0x1758,0x1758,0x1758,0x1758,0x1758,0x1758,0x1758,0x1758, +0x1758,0x1758,0x1758,0x222,0x1758,0x1758,0x222,0x222,0x222,0x222,0x222,0x1755,0x1755,0x1755,0x1755,0x1755, +0x175b,0x175b,0x175b,0x175b,0x175b,0x175b,0x175b,0x225,0x175b,0x225,0x175b,0x175b,0x175b,0x175b,0x225,0x175b, +0x175b,0x175b,0x175b,0x175b,0x175b,0x175b,0x175b,0x175b,0x175b,0x175b,0x175b,0x175b,0x175b,0x175b,0x225,0x175b, +0x175b,0x175b,0x175b,0x175b,0x175b,0x175b,0x175b,0x175b,0x175b,0x175e,0x225,0x225,0x225,0x225,0x225,0x225, +0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd, +0x1767,0x1767,0x1767,0x1767,0x1767,0x1767,0x1767,0x1767,0x1767,0x1767,0x1767,0x1767,0x1767,0x1767,0x1767,0x1767, +0x1767,0x1767,0x1767,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228, +0x1764,0x1764,0x1764,0x1764,0x1764,0x1764,0x1764,0x1764,0x1764,0x1764,0x1764,0x1764,0x1764,0x1764,0x1764,0x1764, +0x1764,0x1764,0x1764,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x1761,0x1761,0x1761,0x1761,0x1761,0x1761, +0x186f,0x186f,0x186f,0x186f,0x186f,0x186f,0x186f,0x186f,0x186f,0x186f,0x186f,0x186f,0x22b,0x22b,0x22b,0x22b, +0x1788,0x1788,0x1788,0x1788,0x1788,0x1788,0x1788,0x1788,0x178b,0x1839,0x1839,0x1839,0x1839,0x1836,0x1839,0x18d5, +0x1836,0x1836,0x1836,0x1836,0x1836,0x1836,0x1839,0x1836,0x18d2,0x18d2,0x18d2,0x18d2,0x18d2,0x18d2,0x18d2,0x18d2, +0x1839,0x18d5,0x18d5,0x1839,0x1839,0x1839,0x1839,0x1839,0x1839,0x1839,0x1836,0x1833,0x1836,0x1839,0x1839,0x22b, +0x1836,0x1836,0x1836,0x1836,0x1836,0x1836,0x1833,0x1836,0x1836,0x1836,0x1836,0x1836,0x18d2,0x22b,0x22b,0x22b, +0x1836,0x1836,0x1836,0x1836,0x1836,0x1836,0x1836,0x1836,0x1836,0x1836,0x1836,0x1836,0x1836,0x1836,0x1836,0x18d2, +0x18d2,0x18d2,0x18d2,0x18d2,0x18d2,0x18d2,0x18d2,0x18d2,0x18d2,0x18d2,0x18d2,0x18d2,0x22b,0x22b,0x22b,0x22b, +0x22b,0x22b,0x22b,0x22b,0x22b,0x22b,0x22b,0x22b,0x22b,0x22b,0x22b,0x22b,0x22b,0x22b,0x22b,0x22b, +0x1788,0x1788,0x1788,0x1788,0x1788,0x1836,0x1836,0x1836,0x1836,0x1836,0x1836,0x1836,0x1836,0x1836,0x1836,0x1836, +0x1836,0x1836,0x18d2,0x18d2,0x18d2,0x18d2,0x18d2,0x18d2,0x22b,0x22b,0x22b,0x22b,0x22b,0x22b,0x22b,0x22b, +0x22b,0x22b,0x22b,0x22b,0x22b,0x22b,0x22b,0x22b,0x22b,0x22b,0x22b,0x22b,0x22b,0x22b,0x22b,0x22b, +0x22b,0x22b,0x22b,0x22b,0x22b,0x22b,0x22b,0x22b,0x1788,0x22b,0x22b,0x22b,0x22b,0x22b,0x22b,0x22b, +0x22b,0x22b,0x22b,0x22b,0x22b,0x22b,0x22b,0x22b,0x18d2,0x18d5,0x18d5,0x18d5,0x18d5,0x18d5,0x18d5,0x18d5, +0x18d5,0x18d5,0x18d5,0x18d5,0x18d5,0x18d5,0x18d2,0x18d2,0x18d2,0x18d2,0x18d2,0x18d2,0x18d2,0x18d2,0x18d2,0x22b, +0x22b,0x22b,0x22b,0x22b,0x22b,0x22b,0x22b,0x22b,0x22b,0x22b,0x22b,0x22b,0x22b,0x22b,0x22b,0x22b, +0x22b,0x22b,0x22b,0x22b,0x22b,0x22b,0x22b,0x22b,0x176d,0x176d,0x176d,0x176d,0x176a,0x176d,0x176d,0x1770, +0x1773,0x1770,0x1770,0x176d,0x22e,0x22e,0x22e,0x22e,0x22e,0x22e,0x22e,0x22e,0x22e,0x22e,0x22e,0x22e, +0x22e,0x22e,0x22e,0x176a,0x176a,0x176a,0x176a,0x176a,0x17c7,0x17c7,0x17c7,0x17c7,0x17be,0x17be,0x17be,0x17b8, +0x17bb,0x17bb,0x17bb,0x231,0x231,0x231,0x231,0x231,0x17c4,0x17c4,0x17c4,0x17c4,0x17c4,0x17c4,0x17c4,0x17c4, +0x17c4,0x17c4,0x231,0x231,0x231,0x231,0x17c1,0x17c1,0x17e2,0x17e2,0x17e2,0x17e2,0x17e2,0x17e2,0x17e2,0x17e2, +0x17e2,0x234,0x17e2,0x17e2,0x17e2,0x17e2,0x17e2,0x17e2,0x17e2,0x17e2,0x17e2,0x17e2,0x17e2,0x17e2,0x17e2,0x17e2, +0x17e2,0x17e2,0x17e2,0x17e2,0x17e2,0x17e2,0x17e2,0x17e2,0x17e2,0x17e2,0x17e2,0x17df,0x17cd,0x17cd,0x17cd,0x17cd, +0x17cd,0x17cd,0x17cd,0x234,0x17cd,0x17cd,0x17cd,0x17cd,0x17cd,0x17cd,0x17df,0x17d0,0x17e2,0x17e5,0x17e5,0x17d9, +0x17d6,0x17d6,0x234,0x234,0x234,0x234,0x234,0x234,0x234,0x234,0x234,0x234,0x17dc,0x17dc,0x17dc,0x17dc, +0x17dc,0x17dc,0x17dc,0x17dc,0x17dc,0x17dc,0x17d3,0x17d3,0x17d3,0x17d3,0x17d3,0x17d3,0x17d3,0x17d3,0x17d3,0x17d3, +0x17d3,0x17d3,0x17d3,0x17d3,0x17d3,0x234,0x234,0x234,0x17f1,0x17f4,0x17fa,0x17fa,0x17fa,0x17fa,0x17fa,0x17fa, +0x17fa,0x17fa,0x17fa,0x17fa,0x17fa,0x17fa,0x17fa,0x17fa,0x17eb,0x17eb,0x17eb,0x17eb,0x17eb,0x17eb,0x17eb,0x23a, +0x17eb,0x17eb,0x17eb,0x17eb,0x17eb,0x17eb,0x17eb,0x17eb,0x17eb,0x17eb,0x17eb,0x17eb,0x17eb,0x17eb,0x17eb,0x17eb, +0x17eb,0x23a,0x23a,0x17eb,0x17eb,0x17eb,0x17eb,0x17eb,0x183c,0x18d8,0x23d,0x23d,0x23d,0x23d,0x23d,0x23d, +0x23d,0x23d,0x23d,0x23d,0x23d,0x23d,0x23d,0x23d,0x23d,0x23d,0x23d,0x23d,0x23d,0x23d,0x23d,0x23d, +0x23d,0x23d,0x23d,0x23d,0x23d,0x23d,0x23d,0x23d,0x17fa,0x17fa,0x17fa,0x17fa,0x17fa,0x17fa,0x17fa,0x17fa, +0x17fa,0x17fa,0x17fa,0x17fa,0x17fa,0x17fa,0x17fa,0x17fa,0x240,0x240,0x17ee,0x17ee,0x17ee,0x17ee,0x17ee,0x17ee, +0x17ee,0x17ee,0x17ee,0x17ee,0x17ee,0x17ee,0x17ee,0x17ee,0x240,0x17f7,0x17ee,0x17ee,0x17ee,0x17ee,0x17ee,0x17ee, +0x17ee,0x17f7,0x17ee,0x17ee,0x17f7,0x17ee,0x17ee,0x240,0x240,0x240,0x240,0x240,0x240,0x240,0x240,0x240, +0x17fd,0x17fd,0x17fd,0x17fd,0x17fd,0x17fd,0x17fd,0x17fd,0x17fd,0x17fd,0x17fd,0x17fd,0x17fd,0x243,0x243,0x243, 0x243,0x243,0x243,0x243,0x243,0x243,0x243,0x243,0x243,0x243,0x243,0x243,0x243,0x243,0x243,0x243, -0x17e5,0x17e5,0x17e5,0x17e5,0x17e5,0x17e5,0x17e5,0x17e5,0x17e5,0x17e5,0x17e5,0x17e5,0x17e5,0x17e5,0x17e5,0x17e5, -0x246,0x246,0x17d9,0x17d9,0x17d9,0x17d9,0x17d9,0x17d9,0x17d9,0x17d9,0x17d9,0x17d9,0x17d9,0x17d9,0x17d9,0x17d9, -0x246,0x17e2,0x17d9,0x17d9,0x17d9,0x17d9,0x17d9,0x17d9,0x17d9,0x17e2,0x17d9,0x17d9,0x17e2,0x17d9,0x17d9,0x246, -0x246,0x246,0x246,0x246,0x246,0x246,0x246,0x246,0x17e8,0x17e8,0x17e8,0x17e8,0x17e8,0x17e8,0x17e8,0x17e8, -0x17e8,0x17e8,0x17e8,0x17e8,0x17e8,0x249,0x249,0x249,0x249,0x249,0x249,0x249,0x249,0x249,0x249,0x249, -0x249,0x249,0x249,0x249,0x249,0x249,0x249,0x249,0x1800,0x1800,0x17f1,0x17eb,0x17eb,0x1800,0x17ee,0x1803, -0x1803,0x1803,0x1803,0x1806,0x1806,0x17fa,0x17f7,0x17f4,0x17fd,0x17fd,0x17fd,0x17fd,0x17fd,0x17fd,0x17fd,0x17fd, -0x17fd,0x17fd,0x24c,0x17fa,0x24c,0x17f4,0x24c,0x24c,0x24c,0x24c,0x24c,0x24c,0x24c,0x24c,0x24c,0x24c, -0x24c,0x24c,0x24c,0x24c,0x24c,0x24c,0x24c,0x24c,0x24c,0x24c,0x24c,0x24c,0x24c,0x24c,0x24c,0x24c, -0x24c,0x24c,0x24c,0x24c,0x24c,0x24c,0x24c,0x24c,0x180c,0x180c,0x180c,0x180c,0x180c,0x180c,0x180c,0x180c, -0x180c,0x180c,0x180c,0x180c,0x180c,0x180c,0x180c,0x180c,0x180c,0x180c,0x180c,0x180c,0x24f,0x24f,0x24f,0x24f, -0x1809,0x1809,0x1809,0x1809,0x1809,0x1809,0x1809,0x1809,0x1809,0x1809,0x1809,0x1809,0x1809,0x1809,0x1809,0x1809, -0x1809,0x1809,0x1809,0x1809,0x1809,0x1809,0x1809,0x1809,0x1809,0x1809,0x1809,0x1809,0x24f,0x24f,0x24f,0x24f, -0x182a,0x182a,0x182a,0x182a,0x182a,0x182a,0x182a,0x182a,0x182a,0x182a,0x182a,0x182a,0x182a,0x252,0x252,0x252, -0x252,0x252,0x252,0x252,0x252,0x252,0x252,0x252,0x252,0x252,0x252,0x252,0x252,0x252,0x252,0x252, -0x182d,0x182d,0x182d,0x182d,0x182d,0x182d,0x182d,0x182d,0x182d,0x182d,0x182d,0x182d,0x182d,0x182d,0x182d,0x182d, -0x182d,0x182d,0x182d,0x255,0x255,0x255,0x255,0x255,0x255,0x255,0x255,0x255,0x255,0x255,0x255,0x255, -0x258,0x258,0x258,0x258,0x258,0x258,0x258,0x258,0x258,0x258,0x258,0x258,0x258,0x258,0x258,0x258, -0x258,0x258,0x258,0x258,0x258,0x258,0x258,0x258,0x258,0x258,0x258,0x258,0x258,0x258,0x258,0x258, -0x1770,0x1770,0x270,0x270,0x270,0x270,0x270,0x270,0x270,0x270,0x270,0x270,0x270,0x270,0x270,0x270, -0x258,0x258,0x258,0x258,0x258,0x258,0x258,0x258,0x258,0x258,0x258,0x258,0x258,0x258,0x258,0x258, -0x258,0x258,0x258,0x258,0x258,0x258,0x258,0x258,0x258,0x258,0x258,0x258,0x258,0x258,0x921,0x921, -0xae6,0xae6,0xae6,0xae6,0xae6,0xae6,0xae6,0xae6,0xae6,0xae6,0xae6,0xae6,0xae6,0xae6,0xae6,0xae6, -0xae6,0xae6,0xae6,0xae6,0xae6,0xae6,0x25b,0x25b,0x25b,0x25b,0x25b,0x25b,0x25b,0x25b,0x25b,0x25b, -0x10d4,0x10d4,0x10d4,0x10d4,0x1275,0x1275,0x1275,0x1275,0x1275,0x1275,0x1275,0x1275,0x1473,0x1761,0x1761,0x1761, -0x1761,0x1761,0x1761,0x1761,0x1761,0x1761,0x25e,0x25e,0x25e,0x25e,0x25e,0x25e,0x25e,0x25e,0x25e,0x25e, -0x25e,0x25e,0x25e,0x25e,0x25e,0x25e,0x25e,0x25e,0x25e,0x25e,0x25e,0x25e,0x25e,0x25e,0x25e,0x25e, -0x25e,0x25e,0x25e,0x25e,0x25e,0x25e,0x25e,0x25e,0xc39,0xc39,0xc39,0xc39,0xc39,0xc39,0xc39,0xc39, -0xc39,0xc39,0xc39,0x1278,0x1278,0x1278,0x261,0x261,0xe67,0xe67,0xe67,0xe67,0xe67,0xe67,0xe67,0xe67, -0xe67,0xe67,0xe67,0xe67,0xe67,0xe67,0xe67,0xe67,0xe67,0xe67,0xe67,0xe67,0xe67,0xe67,0xe67,0xe67, -0xe67,0xe67,0x261,0x261,0x261,0x261,0x261,0x261,0x261,0x261,0x261,0x261,0x261,0x261,0x261,0x261, -0x261,0x261,0x261,0x261,0x261,0x261,0x261,0x261,0x261,0x261,0x261,0x261,0x261,0x261,0x261,0x261, -0x261,0x261,0x261,0x261,0xb49,0xb49,0xb49,0xb49,0xb49,0xb49,0xb49,0xb49,0xb49,0xb49,0xb49,0xb49, -0xb49,0xb49,0xb49,0xb49,0xb49,0xb49,0xb49,0xb49,0xb49,0xb49,0xb49,0x264,0x264,0x264,0x264,0x264, -0x264,0x264,0x264,0x264,0xb4c,0xb4c,0xb4c,0xb4c,0xb4c,0xb4c,0xb4c,0xb4c,0xb4c,0xb4c,0xb4c,0xb4c, -0xb4c,0xb4c,0xb4c,0xb4c,0xb4c,0xb4c,0xb4c,0xb4c,0xb4c,0xb4c,0xb4c,0xb4c,0xb4c,0xb4c,0xb4c,0xb4c, -0xb4c,0xb4c,0x267,0x267,0x128d,0x128d,0x128d,0x128d,0x128d,0x128d,0x128d,0x128d,0x128d,0x128d,0x128d,0x128d, -0x128d,0x128d,0x128d,0x128d,0x128d,0x128d,0x128d,0x128d,0x128d,0x26a,0x26a,0x26a,0x26a,0x26a,0x26a,0x26a, -0x26a,0x26a,0x26a,0x26a,0x13a7,0x13a7,0x13a7,0x13a7,0x13a7,0x13a7,0x13a7,0x13a7,0x13a7,0x13a7,0x13a7,0x13a7, -0x13a7,0x13a7,0x13a7,0x13a7,0x13a7,0x13a7,0x13a7,0x13a7,0x13a7,0x13a7,0x13a7,0x13a7,0x13a7,0x13a7,0x13a7,0x13a7, -0x13a7,0x13a7,0x26d,0x26d,0x10ec,0x369,0x369,0x375,0xc7b,0x378,0x378,0x378,0x378,0x378,0x378,0x378, -0x378,0x378,0x378,0x378,0x378,0x378,0x378,0x378,0x378,0x378,0x378,0x378,0x378,0x378,0x378,0x378, -0x378,0x378,0x378,0x378,0x375,0x369,0x369,0x369,0x369,0x369,0x369,0x369,0x369,0x375,0x375,0x375, -0x375,0x36f,0x10ef,0x12c6,0x378,0x8ee,0x8f1,0x36c,0x36c,0x10ec,0x12c3,0x12c3,0x37b,0x37b,0x37b,0x37b, -0x37b,0x37b,0x37b,0x37b,0x378,0x378,0x369,0x369,0x879,0x87c,0x909,0x909,0x909,0x909,0x909,0x909, -0x909,0x909,0x909,0x909,0x372,0xf4e,0xf4b,0x12c9,0x12c9,0x12c9,0x12c9,0x12c9,0x149a,0x10f2,0x10f2,0xea0, -0xea0,0xd6e,0xea0,0xea0,0x378,0x378,0x378,0x378,0x378,0x378,0x378,0x378,0x378,0x37b,0x378,0x378, -0x378,0x378,0x378,0x378,0x378,0x37b,0x378,0x378,0x37b,0x378,0x378,0x378,0x378,0x378,0x12c3,0x12c6, -0x36c,0x378,0x375,0x375,0x456,0x456,0x456,0x456,0x456,0x456,0x456,0x456,0x456,0x456,0x456,0x456, -0x456,0x456,0x456,0x456,0x456,0x456,0x456,0x456,0x456,0x456,0x456,0xb67,0xb67,0xd7a,0xd7a,0x87f, -0xd7d,0x13b9,0x13b9,0x13b9,0x459,0x459,0x459,0x459,0x459,0x459,0x459,0x459,0x459,0x459,0x459,0x459, -0x459,0x459,0x459,0x459,0x459,0x459,0x459,0x459,0x459,0x459,0x459,0x459,0x459,0x459,0x459,0x459, -0x459,0x459,0x459,0x459,0x45f,0x45f,0x45f,0x1107,0x1107,0x1107,0x1107,0x1107,0x45c,0x45c,0x45c,0x45c, -0x45c,0x45c,0x45c,0x45c,0x45c,0x45c,0x45c,0x45c,0x45c,0x45c,0x45c,0x45c,0x45c,0x45c,0x45c,0x45c, -0x45c,0x45c,0x45c,0x45c,0x45c,0x45c,0x45c,0x45c,0x45c,0x45c,0x45c,0x45c,0x45c,0x45c,0x1104,0x1104, -0x1104,0x1104,0x1104,0x1104,0x462,0x45f,0x45f,0x45f,0x45f,0x45f,0x45f,0x45f,0x45f,0x45f,0x45f,0x45f, -0x45f,0x45f,0x45f,0x45f,0x45f,0x45f,0x45f,0x45f,0x45f,0x45f,0x45f,0x45f,0x45f,0x45f,0x45f,0x45f, -0x45f,0x45f,0x45f,0x45f,0x45f,0x45f,0x45f,0x45f,0x46b,0x465,0x46b,0x465,0x46b,0x465,0x46b,0x465, -0x46b,0x465,0x46b,0x465,0x46b,0x465,0x46b,0x465,0x46b,0x465,0x46b,0x465,0x46b,0x465,0x46b,0x465, -0x46b,0x465,0x46b,0x465,0x46b,0x465,0x46b,0x465,0x46b,0x465,0x465,0x465,0x465,0x465,0x468,0x963, -0xf9c,0xf9c,0xf9f,0xf9c,0x46b,0x465,0x46b,0x465,0x46b,0x465,0x46b,0x465,0x46b,0x465,0x46b,0x465, -0x46b,0x465,0x46b,0x465,0x46b,0x465,0x46b,0x465,0x46b,0x465,0x46b,0x465,0x46b,0x465,0xf9f,0xf9c, -0xf9f,0xf9c,0xf9f,0xf9c,0x477,0x477,0x477,0x477,0x477,0x477,0x477,0x477,0x47a,0x47a,0x47a,0x47a, -0x47a,0x47a,0x47a,0x47a,0x477,0x477,0x477,0x477,0x477,0x477,0x477,0x477,0x47a,0x47a,0x47a,0x47a, -0x47a,0x47a,0x47a,0x47a,0x657,0x657,0x65a,0x495,0x666,0x663,0x663,0x660,0x4bf,0x4bf,0x47d,0x47d, -0x47d,0x47d,0x47d,0xa95,0x669,0x4a1,0x681,0x684,0x4b6,0x669,0x4a4,0x4a4,0x495,0x4b0,0x4b0,0x657, -0x4bc,0x4b9,0x65d,0x48f,0x486,0x486,0x489,0x489,0x489,0x489,0x489,0x48c,0x489,0x489,0x489,0x480, -0x4c8,0x4c5,0x4c2,0x4c2,0x675,0x4aa,0x4a7,0x672,0x66f,0x66c,0x67e,0x498,0x67b,0x67b,0x4ad,0x4b0, -0x678,0x678,0x4ad,0x4b0,0x492,0x495,0x495,0x495,0x4b3,0x49e,0x49b,0xb7c,0xa9b,0xa9e,0xa98,0xa98, -0xa98,0xa98,0xb73,0xb73,0xb73,0xb73,0xb79,0xca8,0xca5,0xd89,0xd8c,0xb76,0xd8c,0xd8c,0xd8c,0xd8c, -0xd89,0xd8c,0xd8c,0xb70,0x4fb,0x4fb,0x513,0x693,0x4f8,0x690,0x4fb,0x510,0x4f8,0x693,0x50a,0x513, -0x513,0x513,0x50a,0x50a,0x513,0x513,0x513,0x69c,0x4f8,0x513,0x696,0x4f8,0x507,0x513,0x513,0x513, -0x513,0x513,0x4f8,0x4f8,0x4fe,0x690,0x699,0x4f8,0x513,0x4f8,0x69f,0x4f8,0x513,0x501,0x519,0x6a2, -0x513,0x513,0x504,0x50a,0x513,0x513,0x516,0x513,0x50a,0x50d,0x50d,0x50d,0x50d,0xaaa,0xaa7,0xcab, -0xd9b,0xb97,0xb9a,0xb9a,0xb94,0xb91,0xb91,0xb91,0xb91,0xb9a,0xb97,0xb97,0xb97,0xb97,0xb8e,0xb91, -0xd98,0xeac,0xeaf,0xfa5,0x1116,0x1116,0x1116,0x6a8,0x6a5,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x6a5, -0x6a8,0x6a8,0x6a5,0x51f,0x6ae,0x6ae,0x6ae,0x6ae,0x6ae,0x6ae,0x6ae,0x6ae,0x6ae,0x6ae,0x6ae,0x6ae, -0x528,0x528,0x528,0x528,0x6ab,0x6ab,0x6ab,0x6ab,0x6ab,0x6ab,0x6ab,0x6ab,0x6ab,0x6ab,0x522,0x522, -0x522,0x522,0x522,0x522,0x52e,0x52e,0x52e,0x52e,0x52e,0x52e,0x52e,0x52e,0x52b,0x534,0x534,0x52e, -0x52e,0x52e,0x531,0x52b,0x52e,0x52e,0x52b,0x52b,0x52b,0x52b,0x52e,0x52e,0x6b1,0x6b1,0x52b,0x52b, -0x52e,0x52e,0x52e,0x52e,0x52e,0x52e,0x52e,0x52e,0x52e,0x52e,0x52e,0x52e,0x52e,0x531,0x531,0x531, -0x52e,0x52e,0x6b4,0x52e,0x6b4,0x52e,0x52e,0x52e,0x52e,0x52e,0x52e,0x52e,0x52b,0x52e,0x52b,0x52b, -0x52b,0x52b,0x52b,0x52b,0x52e,0x52e,0x52b,0x6b1,0x52b,0x52b,0x52b,0xab0,0xab0,0xab0,0xab0,0xab0, -0xab0,0xab0,0xab0,0xab0,0xb9d,0xb9d,0xb9d,0xb9d,0xb9d,0xb9d,0xb9d,0xb9d,0xb9d,0xb9d,0xb9d,0xb9d, -0x6ba,0x537,0x6ba,0x6ba,0x53a,0x537,0x537,0x6ba,0x6ba,0x53a,0x537,0x6ba,0x53a,0x537,0x537,0x6ba, -0x537,0x6ba,0x546,0x543,0x537,0x6ba,0x537,0x537,0x537,0x537,0x6ba,0x537,0x537,0x6ba,0x6ba,0x6ba, -0x6ba,0x537,0x537,0x6ba,0x53a,0x6ba,0x53a,0x6ba,0x6ba,0x6ba,0x6ba,0x6ba,0x6c0,0x53d,0x6ba,0x53d, -0x53d,0x537,0x537,0x537,0x6ba,0x6ba,0x6ba,0x6ba,0x537,0x537,0x537,0x537,0x6ba,0x6ba,0x537,0x537, -0x537,0x53a,0x537,0x537,0x53a,0x537,0x537,0x53a,0x6ba,0x53a,0x537,0x537,0x6ba,0x537,0x537,0x537, -0x537,0x537,0x6ba,0x537,0x537,0x537,0x537,0x537,0x537,0x537,0x537,0x537,0x537,0x537,0x537,0x537, -0x6bd,0x6ba,0x53a,0x537,0x6ba,0x6ba,0x6ba,0x6ba,0x537,0x537,0x6ba,0x6ba,0x537,0x53a,0x6bd,0x6bd, -0x53a,0x53a,0x537,0x537,0x53a,0x53a,0x537,0x537,0x53a,0x53a,0x537,0x537,0x537,0x537,0x537,0x537, -0x53a,0x53a,0x6ba,0x6ba,0x53a,0x53a,0x6ba,0x6ba,0x53a,0x53a,0x537,0x537,0x537,0x537,0x537,0x537, -0x537,0x537,0x537,0x537,0x537,0x6ba,0x537,0x537,0x537,0x6ba,0x537,0x537,0x537,0x537,0x537,0x537, -0x537,0x6ba,0x537,0x537,0x537,0x537,0x537,0x537,0x53a,0x53a,0x53a,0x53a,0x537,0x537,0x537,0x537, -0x537,0x537,0x537,0x537,0x537,0x537,0x537,0x537,0x537,0x537,0x537,0x6ba,0x537,0x537,0x537,0x537, -0x537,0x537,0x537,0x537,0x537,0x537,0x537,0x537,0x537,0x537,0x537,0x537,0x537,0x537,0x537,0x537, -0x537,0x537,0x537,0x537,0x537,0x537,0x537,0x537,0x537,0x537,0x537,0x537,0x53a,0x53a,0x53a,0x53a, -0x537,0x537,0x537,0x537,0x537,0x537,0x53a,0x53a,0x53a,0x53a,0x537,0x540,0x537,0x537,0xba0,0xba0, -0xba0,0xba0,0xba0,0xba0,0xba0,0xba0,0xba0,0xba0,0xba0,0xba0,0xba0,0xba0,0x549,0xab3,0x549,0x549, -0x549,0x549,0x549,0x549,0x555,0x552,0x555,0x552,0x549,0x549,0x549,0x549,0x549,0x549,0x6c3,0x549, -0x549,0x549,0x549,0x549,0x549,0x549,0x7c5,0x7c5,0x549,0x549,0x549,0x549,0x54f,0x54f,0x549,0x549, -0x549,0x549,0x549,0x549,0x54c,0x7cb,0x7c8,0x549,0x549,0x549,0x549,0x549,0x549,0x549,0x549,0x549, -0x549,0x549,0x549,0x549,0x549,0x549,0x549,0x549,0x549,0x549,0x549,0x549,0x549,0x549,0x549,0x549, -0x549,0x549,0x549,0x549,0x549,0x549,0x549,0x549,0x549,0x549,0x549,0xab3,0xba6,0xab3,0xab3,0xab3, -0x558,0x558,0x558,0x558,0x558,0x558,0x558,0x558,0x558,0x558,0x558,0x558,0x558,0x558,0x558,0x558, +0x1815,0x1815,0x1806,0x1800,0x1800,0x1815,0x1803,0x1818,0x1818,0x1818,0x1818,0x181b,0x181b,0x180f,0x180c,0x1809, +0x1812,0x1812,0x1812,0x1812,0x1812,0x1812,0x1812,0x1812,0x1812,0x1812,0x246,0x180f,0x246,0x1809,0x246,0x246, +0x246,0x246,0x246,0x246,0x246,0x246,0x246,0x246,0x246,0x246,0x246,0x246,0x246,0x246,0x246,0x246, +0x246,0x246,0x246,0x246,0x246,0x246,0x246,0x246,0x246,0x246,0x246,0x246,0x246,0x246,0x246,0x246, +0x1821,0x1821,0x1821,0x1821,0x1821,0x1821,0x1821,0x1821,0x1821,0x1821,0x1821,0x1821,0x1821,0x1821,0x1821,0x1821, +0x1821,0x1821,0x1821,0x1821,0x249,0x249,0x249,0x249,0x181e,0x181e,0x181e,0x181e,0x181e,0x181e,0x181e,0x181e, +0x181e,0x181e,0x181e,0x181e,0x181e,0x181e,0x181e,0x181e,0x181e,0x181e,0x181e,0x181e,0x181e,0x181e,0x181e,0x181e, +0x181e,0x181e,0x181e,0x181e,0x249,0x249,0x249,0x249,0x183f,0x183f,0x183f,0x183f,0x183f,0x183f,0x183f,0x183f, +0x183f,0x183f,0x183f,0x183f,0x183f,0x24c,0x24c,0x24c,0x24c,0x24c,0x24c,0x24c,0x24c,0x24c,0x24c,0x24c, +0x24c,0x24c,0x24c,0x24c,0x24c,0x24c,0x24c,0x24c,0x1842,0x1842,0x1842,0x1842,0x1842,0x1842,0x1842,0x1842, +0x1842,0x1842,0x1842,0x1842,0x1842,0x1842,0x1842,0x1842,0x1842,0x1842,0x1842,0x24f,0x24f,0x24f,0x24f,0x24f, +0x24f,0x24f,0x24f,0x24f,0x24f,0x24f,0x24f,0x24f,0x18de,0x18de,0x18de,0x18de,0x18de,0x18de,0x18de,0x18de, +0x18de,0x18de,0x18de,0x18de,0x18de,0x18de,0x18de,0x18de,0x18de,0x18de,0x18de,0x18de,0x18de,0x18de,0x18de,0x18de, +0x18de,0x18de,0x18de,0x18de,0x18de,0x18de,0x18de,0x252,0x187e,0x187e,0x187e,0x187e,0x187e,0x187e,0x187e,0x255, +0x187e,0x187e,0x255,0x187e,0x187e,0x187e,0x187e,0x187e,0x187e,0x187e,0x187e,0x187e,0x187e,0x187e,0x187e,0x187e, +0x187e,0x187e,0x187e,0x187e,0x187e,0x187e,0x187e,0x187e,0x187e,0x1872,0x1872,0x1872,0x1872,0x1872,0x1872,0x255, +0x255,0x255,0x1872,0x255,0x1872,0x1872,0x255,0x1872,0x1872,0x1872,0x1875,0x1872,0x1878,0x1878,0x1881,0x1872, +0x255,0x255,0x255,0x255,0x255,0x255,0x255,0x255,0x187b,0x187b,0x187b,0x187b,0x187b,0x187b,0x187b,0x187b, +0x187b,0x187b,0x255,0x255,0x255,0x255,0x255,0x255,0x18e1,0x18e1,0x18e1,0x18e1,0x18e1,0x18e1,0x18e1,0x18e1, +0x18e1,0x18e1,0x18e1,0x18e1,0x18e1,0x18e1,0x18e1,0x18e1,0x18e1,0x18e1,0x18e1,0x18e1,0x18e1,0x18e1,0x18e1,0x18e1, +0x18e1,0x18e1,0x18e1,0x18e1,0x258,0x258,0x258,0x258,0x1899,0x1899,0x1899,0x1899,0x25b,0x25b,0x189c,0x189c, +0x189c,0x189c,0x1884,0x1884,0x1884,0x1884,0x1884,0x1884,0x1884,0x1884,0x1884,0x1884,0x1884,0x1884,0x1884,0x1896, +0x1887,0x188a,0x188d,0x189f,0x189f,0x25b,0x1890,0x1890,0x18ae,0x18b1,0x18c0,0x18c0,0x18b1,0x18b4,0x18ae,0x18ab, +0x261,0x261,0x261,0x261,0x261,0x261,0x261,0x261,0x1899,0x1884,0x1884,0x1884,0x1884,0x1884,0x1884,0x1896, +0x1896,0x1884,0x1884,0x1884,0x1899,0x1899,0x1899,0x1899,0x264,0x264,0x264,0x264,0x264,0x264,0x264,0x264, +0x264,0x264,0x264,0x264,0x264,0x264,0x264,0x264,0x264,0x264,0x264,0x264,0x264,0x264,0x264,0x264, +0x264,0x264,0x264,0x264,0x264,0x264,0x264,0x264,0x18db,0x27f,0x27f,0x27f,0x27f,0x27f,0x27f,0x27f, +0x27f,0x27f,0x27f,0x27f,0x27f,0x27f,0x27f,0x27f,0x264,0x264,0x264,0x264,0x264,0x264,0x264,0x264, +0x264,0x264,0x264,0x264,0x264,0x264,0x264,0x264,0x264,0x264,0x264,0x264,0x264,0x264,0x264,0x264, +0x264,0x264,0x264,0x264,0x264,0x264,0x933,0x933,0xaf8,0xaf8,0xaf8,0xaf8,0xaf8,0xaf8,0xaf8,0xaf8, +0xaf8,0xaf8,0xaf8,0xaf8,0xaf8,0xaf8,0xaf8,0xaf8,0xaf8,0xaf8,0xaf8,0xaf8,0xaf8,0xaf8,0x267,0x267, +0x267,0x267,0x267,0x267,0x267,0x267,0x267,0x267,0x18c6,0x18c6,0x18c6,0x18c6,0x18c6,0x18c6,0x18c6,0x18c6, +0x18c6,0x18c6,0x18c6,0x26a,0x26a,0x26a,0x26a,0x26a,0x26a,0x26a,0x26a,0x26a,0x26a,0x26a,0x26a,0x26a, +0x26a,0x26a,0x26a,0x26a,0x26a,0x26a,0x26a,0x26a,0xc4b,0xc4b,0xc4b,0xc4b,0xc4b,0xc4b,0xc4b,0xc4b, +0xc4b,0xc4b,0xc4b,0x128d,0x128d,0x128d,0x26d,0x26d,0xe7c,0xe7c,0xe7c,0xe7c,0xe7c,0xe7c,0xe7c,0xe7c, +0xe7c,0xe7c,0xe7c,0xe7c,0xe7c,0xe7c,0xe7c,0xe7c,0xe7c,0xe7c,0xe7c,0xe7c,0xe7c,0xe7c,0xe7c,0xe7c, +0xe7c,0xe7c,0x26d,0x26d,0x26d,0x26d,0x26d,0x26d,0x26d,0x26d,0x26d,0x26d,0x26d,0x26d,0x26d,0x26d, +0x26d,0x26d,0x26d,0x26d,0x26d,0x26d,0x26d,0x26d,0x26d,0x26d,0x26d,0x26d,0x26d,0x26d,0x26d,0x26d, +0x26d,0x26d,0x26d,0x26d,0xb5b,0xb5b,0xb5b,0xb5b,0xb5b,0xb5b,0xb5b,0xb5b,0xb5b,0xb5b,0xb5b,0xb5b, +0xb5b,0xb5b,0xb5b,0xb5b,0xb5b,0xb5b,0xb5b,0xb5b,0xb5b,0xb5b,0xb5b,0x270,0x270,0x270,0x270,0x270, +0x270,0x270,0x270,0x270,0xb5e,0xb5e,0xb5e,0xb5e,0xb5e,0xb5e,0xb5e,0xb5e,0xb5e,0xb5e,0xb5e,0xb5e, +0xb5e,0xb5e,0xb5e,0xb5e,0xb5e,0xb5e,0xb5e,0xb5e,0xb5e,0xb5e,0xb5e,0xb5e,0xb5e,0xb5e,0xb5e,0xb5e, +0xb5e,0xb5e,0x273,0x273,0x12a2,0x12a2,0x12a2,0x12a2,0x12a2,0x12a2,0x12a2,0x12a2,0x12a2,0x12a2,0x12a2,0x12a2, +0x12a2,0x12a2,0x12a2,0x12a2,0x12a2,0x12a2,0x12a2,0x12a2,0x12a2,0x276,0x276,0x276,0x276,0x276,0x276,0x276, +0x276,0x276,0x276,0x276,0x13bc,0x13bc,0x13bc,0x13bc,0x13bc,0x13bc,0x13bc,0x13bc,0x13bc,0x13bc,0x13bc,0x13bc, +0x13bc,0x13bc,0x13bc,0x13bc,0x13bc,0x13bc,0x13bc,0x13bc,0x13bc,0x13bc,0x13bc,0x13bc,0x13bc,0x13bc,0x13bc,0x13bc, +0x13bc,0x13bc,0x279,0x279,0x1785,0x1785,0x27c,0x27c,0x27c,0x27c,0x27c,0x27c,0x27c,0x27c,0x27c,0x27c, +0x27c,0x27c,0x27c,0x27c,0x18db,0x18db,0x18db,0x18db,0x18db,0x18db,0x18db,0x18db,0x18db,0x18db,0x18db,0x18db, +0x18db,0x18db,0x18db,0x18db,0x1101,0x378,0x378,0x384,0xc8d,0x387,0x387,0x387,0x387,0x387,0x387,0x387, +0x387,0x387,0x387,0x387,0x387,0x387,0x387,0x387,0x387,0x387,0x387,0x387,0x387,0x387,0x387,0x387, +0x387,0x387,0x387,0x387,0x384,0x378,0x378,0x378,0x378,0x378,0x378,0x378,0x378,0x384,0x384,0x384, +0x384,0x37e,0x1104,0x12db,0x387,0x900,0x903,0x37b,0x37b,0x1101,0x12d8,0x12d8,0x38a,0x38a,0x38a,0x38a, +0x38a,0x38a,0x38a,0x38a,0x387,0x387,0x378,0x378,0x88b,0x88e,0x91b,0x91b,0x91b,0x91b,0x91b,0x91b, +0x91b,0x91b,0x91b,0x91b,0x381,0xf63,0xf60,0x12de,0x12de,0x12de,0x12de,0x12de,0x14af,0x1107,0x1107,0xeb5, +0xeb5,0xd80,0xeb5,0xeb5,0x387,0x387,0x387,0x387,0x387,0x387,0x387,0x387,0x387,0x38a,0x387,0x387, +0x387,0x387,0x387,0x387,0x387,0x38a,0x387,0x387,0x38a,0x387,0x387,0x387,0x387,0x387,0x12d8,0x12db, +0x37b,0x387,0x384,0x384,0x429,0x429,0x429,0x429,0x429,0x429,0x429,0x429,0x429,0x12e4,0x429,0x429, +0x429,0x429,0x429,0x429,0x429,0x429,0x429,0x429,0x429,0x429,0x429,0x429,0x429,0x429,0x12e4,0x1857, +0x1857,0xf81,0x41a,0x423,0x465,0x465,0x465,0x465,0x465,0x465,0x465,0x465,0x465,0x465,0x465,0x465, +0x465,0x465,0x465,0x465,0x465,0x465,0x465,0x465,0x465,0x465,0x465,0xb79,0xb79,0xd8c,0xd8c,0x891, +0xd8f,0x13ce,0x13ce,0x13ce,0x468,0x468,0x468,0x468,0x468,0x468,0x468,0x468,0x468,0x468,0x468,0x468, +0x468,0x468,0x468,0x468,0x468,0x468,0x468,0x468,0x468,0x468,0x468,0x468,0x468,0x468,0x468,0x468, +0x468,0x468,0x468,0x468,0x46e,0x46e,0x46e,0x111c,0x111c,0x111c,0x111c,0x111c,0x46b,0x46b,0x46b,0x46b, +0x46b,0x46b,0x46b,0x46b,0x46b,0x46b,0x46b,0x46b,0x46b,0x46b,0x46b,0x46b,0x46b,0x46b,0x46b,0x46b, +0x46b,0x46b,0x46b,0x46b,0x46b,0x46b,0x46b,0x46b,0x46b,0x46b,0x46b,0x46b,0x46b,0x46b,0x1119,0x1119, +0x1119,0x1119,0x1119,0x1119,0x471,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e, +0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e, +0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x47a,0x474,0x47a,0x474,0x47a,0x474,0x47a,0x474, +0x47a,0x474,0x47a,0x474,0x47a,0x474,0x47a,0x474,0x47a,0x474,0x47a,0x474,0x47a,0x474,0x47a,0x474, +0x47a,0x474,0x47a,0x474,0x47a,0x474,0x47a,0x474,0x47a,0x474,0x474,0x474,0x474,0x474,0x477,0x975, +0xfb1,0xfb1,0xfb4,0xfb1,0x47a,0x474,0x47a,0x474,0x47a,0x474,0x47a,0x474,0x47a,0x474,0x47a,0x474, +0x47a,0x474,0x47a,0x474,0x47a,0x474,0x47a,0x474,0x47a,0x474,0x47a,0x474,0x47a,0x474,0xfb4,0xfb1, +0xfb4,0xfb1,0xfb4,0xfb1,0x486,0x486,0x486,0x486,0x486,0x486,0x486,0x486,0x489,0x489,0x489,0x489, +0x489,0x489,0x489,0x489,0x486,0x486,0x486,0x486,0x486,0x486,0x486,0x486,0x489,0x489,0x489,0x489, +0x489,0x489,0x489,0x489,0x666,0x666,0x669,0x4a4,0x675,0x672,0x672,0x66f,0x4ce,0x4ce,0x48c,0x48c, +0x48c,0x48c,0x48c,0xaa7,0x678,0x4b0,0x690,0x693,0x4c5,0x678,0x4b3,0x4b3,0x4a4,0x4bf,0x4bf,0x666, +0x4cb,0x4c8,0x66c,0x49e,0x495,0x495,0x498,0x498,0x498,0x498,0x498,0x49b,0x498,0x498,0x498,0x48f, +0x4d7,0x4d4,0x4d1,0x4d1,0x684,0x4b9,0x4b6,0x681,0x67e,0x67b,0x68d,0x4a7,0x68a,0x68a,0x4bc,0x4bf, +0x687,0x687,0x4bc,0x4bf,0x4a1,0x4a4,0x4a4,0x4a4,0x4c2,0x4ad,0x4aa,0xb8e,0xaad,0xab0,0xaaa,0xaaa, +0xaaa,0xaaa,0xb85,0xb85,0xb85,0xb85,0xb8b,0xcba,0xcb7,0xd9b,0xd9e,0xb88,0xd9e,0xd9e,0xd9e,0xd9e, +0xd9b,0xd9e,0xd9e,0xb82,0x4fb,0x4fb,0x4fb,0x4fb,0x4fb,0x4fb,0x4fb,0x4f8,0x4fe,0x714,0x4fb,0x978, +0x999,0xab3,0xab3,0xab3,0xb94,0xb94,0xda4,0xda4,0xda4,0xda4,0x1125,0x1128,0x1128,0x12f9,0x149d,0x14c7, +0x14ca,0x14ca,0x16dd,0x185a,0x50a,0x50a,0x522,0x6a2,0x507,0x69f,0x50a,0x51f,0x507,0x6a2,0x519,0x522, +0x522,0x522,0x519,0x519,0x522,0x522,0x522,0x6ab,0x507,0x522,0x6a5,0x507,0x516,0x522,0x522,0x522, +0x522,0x522,0x507,0x507,0x50d,0x69f,0x6a8,0x507,0x522,0x507,0x6ae,0x507,0x522,0x510,0x528,0x6b1, +0x522,0x522,0x513,0x519,0x522,0x522,0x525,0x522,0x519,0x51c,0x51c,0x51c,0x51c,0xabc,0xab9,0xcbd, +0xdad,0xba9,0xbac,0xbac,0xba6,0xba3,0xba3,0xba3,0xba3,0xbac,0xba9,0xba9,0xba9,0xba9,0xba0,0xba3, +0xdaa,0xec1,0xec4,0xfba,0x112b,0x112b,0x112b,0x6b7,0x6b4,0x52b,0x52e,0x52e,0x52e,0x52e,0x52e,0x6b4, +0x6b7,0x6b7,0x6b4,0x52e,0x6bd,0x6bd,0x6bd,0x6bd,0x6bd,0x6bd,0x6bd,0x6bd,0x6bd,0x6bd,0x6bd,0x6bd, +0x537,0x537,0x537,0x537,0x6ba,0x6ba,0x6ba,0x6ba,0x6ba,0x6ba,0x6ba,0x6ba,0x6ba,0x6ba,0x531,0x531, +0x531,0x531,0x531,0x531,0x53d,0x53d,0x53d,0x53d,0x53d,0x53d,0x53d,0x53d,0x53a,0x543,0x543,0x53d, +0x53d,0x53d,0x540,0x53a,0x53d,0x53d,0x53a,0x53a,0x53a,0x53a,0x53d,0x53d,0x6c0,0x6c0,0x53a,0x53a, +0x53d,0x53d,0x53d,0x53d,0x53d,0x53d,0x53d,0x53d,0x53d,0x53d,0x53d,0x53d,0x53d,0x540,0x540,0x540, +0x53d,0x53d,0x6c3,0x53d,0x6c3,0x53d,0x53d,0x53d,0x53d,0x53d,0x53d,0x53d,0x53a,0x53d,0x53a,0x53a, +0x53a,0x53a,0x53a,0x53a,0x53d,0x53d,0x53a,0x6c0,0x53a,0x53a,0x53a,0xac2,0xac2,0xac2,0xac2,0xac2, +0xac2,0xac2,0xac2,0xac2,0xbaf,0xbaf,0xbaf,0xbaf,0xbaf,0xbaf,0xbaf,0xbaf,0xbaf,0xbaf,0xbaf,0xbaf, +0x6c9,0x546,0x6c9,0x6c9,0x549,0x546,0x546,0x6c9,0x6c9,0x549,0x546,0x6c9,0x549,0x546,0x546,0x6c9, +0x546,0x6c9,0x555,0x552,0x546,0x6c9,0x546,0x546,0x546,0x546,0x6c9,0x546,0x546,0x6c9,0x6c9,0x6c9, +0x6c9,0x546,0x546,0x6c9,0x549,0x6c9,0x549,0x6c9,0x6c9,0x6c9,0x6c9,0x6c9,0x6cf,0x54c,0x6c9,0x54c, +0x54c,0x546,0x546,0x546,0x6c9,0x6c9,0x6c9,0x6c9,0x546,0x546,0x546,0x546,0x6c9,0x6c9,0x546,0x546, +0x546,0x549,0x546,0x546,0x549,0x546,0x546,0x549,0x6c9,0x549,0x546,0x546,0x6c9,0x546,0x546,0x546, +0x546,0x546,0x6c9,0x546,0x546,0x546,0x546,0x546,0x546,0x546,0x546,0x546,0x546,0x546,0x546,0x546, +0x6cc,0x6c9,0x549,0x546,0x6c9,0x6c9,0x6c9,0x6c9,0x546,0x546,0x6c9,0x6c9,0x546,0x549,0x6cc,0x6cc, +0x549,0x549,0x546,0x546,0x549,0x549,0x546,0x546,0x549,0x549,0x546,0x546,0x546,0x546,0x546,0x546, +0x549,0x549,0x6c9,0x6c9,0x549,0x549,0x6c9,0x6c9,0x549,0x549,0x546,0x546,0x546,0x546,0x546,0x546, +0x546,0x546,0x546,0x546,0x546,0x6c9,0x546,0x546,0x546,0x6c9,0x546,0x546,0x546,0x546,0x546,0x546, +0x546,0x6c9,0x546,0x546,0x546,0x546,0x546,0x546,0x549,0x549,0x549,0x549,0x546,0x546,0x546,0x546, +0x546,0x546,0x546,0x546,0x546,0x546,0x546,0x546,0x546,0x546,0x546,0x6c9,0x546,0x546,0x546,0x546, +0x546,0x546,0x546,0x546,0x546,0x546,0x546,0x546,0x546,0x546,0x546,0x546,0x546,0x546,0x546,0x546, +0x546,0x546,0x546,0x546,0x546,0x546,0x546,0x546,0x546,0x546,0x546,0x546,0x549,0x549,0x549,0x549, +0x546,0x546,0x546,0x546,0x546,0x546,0x549,0x549,0x549,0x549,0x546,0x54f,0x546,0x546,0xbb2,0xbb2, +0xbb2,0xbb2,0xbb2,0xbb2,0xbb2,0xbb2,0xbb2,0xbb2,0xbb2,0xbb2,0xbb2,0xbb2,0x558,0xac5,0x558,0x558, +0x558,0x558,0x558,0x558,0x564,0x561,0x564,0x561,0x558,0x558,0x558,0x558,0x558,0x558,0x6d2,0x558, +0x558,0x558,0x558,0x558,0x558,0x558,0x7d7,0x7d7,0x558,0x558,0x558,0x558,0x55e,0x55e,0x558,0x558, +0x558,0x558,0x558,0x558,0x55b,0x7dd,0x7da,0x558,0x558,0x558,0x558,0x558,0x558,0x558,0x558,0x558, 0x558,0x558,0x558,0x558,0x558,0x558,0x558,0x558,0x558,0x558,0x558,0x558,0x558,0x558,0x558,0x558, -0x6cc,0x6cc,0x6cc,0x6cc,0x6cc,0x6cc,0x6cc,0x6cc,0x6cc,0x6cc,0x55e,0xc0c,0xc0c,0xc0c,0xc0c,0xc0c, -0xc0c,0xc0c,0xc0c,0xc0c,0xc0c,0xc0c,0xc0c,0xc0c,0xc0c,0xc0c,0xc0c,0xc0c,0xc0c,0xc0c,0xc0c,0xd20, -0x6d5,0x6d5,0x6d5,0x6d5,0x6d5,0x6d5,0x6d5,0x6d5,0x6d5,0x6d5,0x6d5,0x6d5,0x6d5,0x6d5,0x6d5,0x6d5, -0x6d5,0x6d5,0x6d5,0x6d5,0x561,0x564,0x564,0x564,0x564,0x564,0x564,0x564,0x564,0x564,0x564,0x564, -0x6d5,0x6d5,0x6d5,0x6d5,0x6d5,0x6d5,0x6d5,0x6d5,0x6d5,0x6d5,0x6d5,0x6d5,0x564,0x564,0x564,0x564, -0x6d5,0x6d5,0x6d5,0x6d5,0x6d5,0x6d5,0x6d5,0x6d5,0x6d5,0x6d5,0x6d5,0x6d5,0x6d5,0x6d5,0x6d5,0x6d5, -0x6d8,0x6d8,0x6d8,0x6d8,0x6d8,0x6d8,0x6d8,0x6d8,0x6d8,0x6d8,0x6d8,0x6d8,0x6d8,0x6d8,0x6d8,0x6d8, -0x567,0x567,0x6d8,0x6d8,0x6d8,0x6d8,0xba9,0xba9,0xba9,0xba9,0xba9,0xba9,0xba9,0xba9,0xba9,0xba9, -0x6de,0x6de,0x56a,0x6db,0x6db,0x6db,0x6db,0x6db,0x6db,0x6db,0x56d,0x56d,0x56a,0x56a,0x570,0x570, -0x570,0x570,0x6de,0x6de,0x570,0x570,0x6e1,0x6de,0x56a,0x56a,0x56a,0x56a,0x6de,0x6de,0x570,0x570, -0x6e1,0x6de,0x56a,0x56a,0x56a,0x56a,0x6de,0x6de,0x6db,0x56a,0x570,0x6de,0x56a,0x56a,0x6db,0x6de, -0x6de,0x6de,0x570,0x570,0x56a,0x56a,0x56a,0x56a,0x56a,0x56a,0x56a,0x56a,0x56a,0x56a,0x56a,0x56a, -0x56a,0x56a,0x6de,0x6db,0x6de,0x6db,0x56a,0x570,0x570,0x570,0x570,0x570,0x570,0x56a,0x56a,0x6db, -0xab9,0xab9,0xab9,0xab9,0xab9,0xab9,0xab9,0xab9,0xbac,0xbac,0xbac,0xbaf,0xbaf,0xc24,0xc24,0xbac, -0x57c,0x57c,0x57c,0x57c,0x579,0x6f0,0x6f0,0x573,0x573,0x6e4,0x573,0x573,0x573,0x573,0x6ea,0x6e4, -0x573,0x579,0x573,0x573,0xd29,0xd29,0xbb2,0xbb2,0xda7,0xabc,0x576,0x576,0x6e7,0x57f,0x6e7,0x576, -0x579,0x573,0x579,0x579,0x573,0x573,0x579,0x573,0x573,0x573,0x579,0x573,0x573,0x573,0x579,0x579, -0x573,0x573,0x573,0x573,0x573,0x573,0x573,0x573,0x579,0x57c,0x57c,0x576,0x573,0x573,0x573,0x573, -0x6f3,0x573,0x6f3,0x573,0x573,0x573,0x573,0x573,0x7ce,0x7ce,0x7ce,0x7ce,0x7ce,0x7ce,0x7ce,0x7ce, -0x7ce,0x7ce,0x7ce,0x7ce,0x573,0x573,0x573,0x573,0x573,0x573,0x573,0x573,0x573,0x573,0x573,0x573, -0x6f3,0x6f0,0x582,0x6f3,0x6e4,0x6ea,0x579,0x6e4,0x6ed,0x6e4,0x6e4,0x573,0x6e4,0x6f0,0x582,0x6f0, -0xabc,0xabc,0xbb5,0xbb5,0xbb5,0xbb5,0xbb5,0xbb5,0xbb5,0xbb5,0xbb5,0xbb8,0xbb5,0xbb5,0xda1,0xe5e, -0x585,0x585,0x585,0x585,0x585,0x585,0x585,0x585,0x585,0x585,0x585,0x585,0x585,0x585,0x585,0x585, -0x585,0x585,0x585,0x585,0x588,0x136e,0x136e,0x136e,0x588,0x588,0x588,0x588,0x588,0x588,0x588,0x588, -0x14be,0x58e,0x59a,0x58e,0x58e,0x136e,0x588,0x588,0x59a,0x59a,0x1371,0x1371,0x5a0,0x5a0,0x588,0x594, -0x588,0x588,0x594,0x588,0x594,0x588,0x594,0x588,0x588,0x588,0x588,0x588,0x588,0x594,0x588,0x588, -0x588,0x588,0x588,0x588,0x136e,0x588,0x588,0x588,0x588,0x588,0x588,0x588,0x588,0x588,0x588,0x594, -0x594,0x588,0x588,0x588,0x588,0x588,0x588,0x588,0x588,0x6f9,0x588,0x588,0x588,0x588,0x588,0x588, -0x594,0x588,0x588,0x594,0x588,0x588,0x588,0x588,0x136e,0x588,0x136e,0x588,0x588,0x588,0x588,0x136e, -0x136e,0x136e,0x588,0x1272,0x588,0x588,0x588,0x591,0x591,0x591,0x591,0x12f0,0x12f0,0x588,0x58b,0x597, -0x59d,0x588,0x588,0x588,0xbbe,0xbbb,0xbbe,0xbbb,0xbbe,0xbbb,0xbbe,0xbbb,0xbbe,0xbbb,0xbbe,0xbbb, -0xbbe,0xbbb,0x6f6,0x6f6,0x6f6,0x6f6,0x6f6,0x6f6,0x6f6,0x6f6,0x6f6,0x6f6,0x588,0x594,0x588,0x588, -0x588,0x588,0x588,0x588,0x588,0x588,0x588,0x588,0x588,0x588,0x588,0x588,0x136e,0x588,0x588,0x588, -0x588,0x588,0x588,0x588,0x588,0x588,0x588,0x588,0x588,0x588,0x588,0x136e,0x5c1,0x5c1,0x5c1,0x5c1, -0x5c1,0x5c1,0x5c1,0x5c1,0x5c1,0x5c1,0x5c1,0x5c1,0x5c1,0x5c4,0x5c4,0x5c4,0x5c4,0x5c4,0x5c4,0x5c4, -0x5ca,0x5ca,0x5ca,0x5ca,0x5ca,0x5ca,0x5ca,0x5ca,0x5c1,0x5c7,0x5b8,0x5bb,0x5c7,0x5c7,0x5c7,0x5c7, -0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7, -0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5be,0x5be,0x5be,0x5be,0x5be,0x5be, -0x5c1,0x5c1,0x5c1,0x5c1,0x5c1,0x5c1,0x5c1,0x5c1,0x5c1,0x5c1,0x5c1,0x5c1,0x5c1,0x5c1,0x5c1,0x5c1, -0x5c1,0x5c1,0x5c1,0x5c1,0x5c1,0x5c1,0x5c1,0x5c1,0x5c1,0x5c1,0x5c1,0x5c1,0x5c4,0x5ca,0x5c7,0x5c1, -0x5c4,0x5ca,0x5c7,0x5c1,0x5c4,0x5ca,0x5c7,0x5c1,0x5c4,0x5ca,0x5c7,0x5c1,0x5c4,0x5ca,0x5c7,0x5c1, -0x5c4,0x5ca,0x5c7,0x5c1,0x5c4,0x5ca,0x5c7,0x5c1,0x5c4,0x5ca,0x5c7,0x5c1,0x5c7,0x5c1,0x5c7,0x5c1, -0x5c7,0x5c1,0x5c7,0x5c1,0x5c7,0x5c1,0x5c7,0x5c1,0x5c4,0x5ca,0x5c7,0x5c1,0x5c4,0x5ca,0x5c7,0x5c1, -0x5c4,0x5ca,0x5c7,0x5c1,0x5c4,0x5ca,0x5c7,0x5c1,0x5c7,0x5c1,0x5c4,0x5ca,0x5c7,0x5c1,0x5c7,0x5c1, -0x5c4,0x5ca,0x5c7,0x5c1,0x5c4,0x5ca,0x5c7,0x5c1,0x5c7,0x5c1,0x12f3,0x12f3,0x12f3,0x12f3,0x12f3,0x12f3, -0x12f3,0x12f3,0x12f3,0x12f3,0x12f3,0x12f3,0x12f3,0x12f3,0x5c7,0x5c1,0x5c7,0x5c1,0x5c7,0x5c1,0x5c4,0x5ca, -0x5c4,0x5ca,0x5c7,0x5c1,0x5c7,0x5c1,0x5c7,0x5c1,0x5c7,0x5c1,0x5c7,0x5c1,0x5c7,0x5c1,0x5c7,0x5c1, -0x5c4,0x5c7,0x5c1,0x5c4,0x5c7,0x5c1,0x5c4,0x5ca,0x5c1,0x5c1,0x5c1,0x5c1,0x5c1,0x5c1,0x5c1,0x5c1, -0x5c1,0x5c1,0x5c1,0x5c1,0x5c1,0x5c1,0x5c1,0x5c1,0x5c1,0x5c1,0x5c1,0x5c1,0x5c1,0x5c1,0x5c1,0x5c4, -0x5c4,0x5c4,0x5c4,0x5c4,0x5c4,0x5c4,0x5c4,0x5c4,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7, -0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c1,0x5c1,0x5c1,0x5c1,0x5c1,0x5c1,0x5c1, -0x5c1,0x5c1,0x5c1,0x5c1,0x5c1,0x5c1,0x5c1,0x5c1,0x5c4,0x5c4,0x5c1,0x5c4,0x5c1,0x5c4,0x5c1,0x5c1, -0x5c4,0x5c1,0x5c1,0x5c4,0x5c1,0x5c4,0x5c1,0x5c1,0x5c4,0x5c1,0x5c4,0x5c4,0x5c1,0x5c1,0x5c1,0x5c4, -0x5c1,0x5c1,0x5c1,0x5c1,0x5c1,0x5c4,0x5c1,0x5c1,0x5c1,0x5c1,0x5c1,0x5c1,0x5c1,0x5c1,0x5c1,0x5c1, -0x5c1,0x5c1,0x5c1,0x5c1,0x5c1,0x5c1,0x5c1,0x5c1,0x5c1,0x5c1,0x5c1,0x5c1,0x5c4,0x5c4,0x5c1,0x5c1, -0x5c4,0x5c1,0x5c4,0x5c1,0x5c1,0x5c1,0x5c1,0x5c1,0x5c4,0x5c4,0x5c4,0x5c4,0x5c4,0x5c4,0x5c4,0x5c4, -0x5c4,0x5c4,0x5c4,0x5c4,0x5c4,0x5c4,0x5c4,0x5c4,0x5c4,0x5c4,0x5c4,0x5c4,0x5c4,0x5c4,0x5c4,0x5c4, -0x5c4,0x5c4,0x5c4,0x5c4,0x5c4,0x5c4,0x5c4,0x5c4,0x5c4,0x5c4,0x5c4,0x5ca,0x5c7,0x5c7,0x5c7,0x5c7, -0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7, -0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5ca,0x5ca,0x5ca,0x5ca, -0x5ca,0x5ca,0x5ca,0x5ca,0x5ca,0x5ca,0x5ca,0x5ca,0x5ca,0x5ca,0x5ca,0x5ca,0x5ca,0x5ca,0x5ca,0x5ca, -0x5ca,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5cd,0x5cd,0x5cd,0x5cd, -0xfb1,0xfb1,0xfb1,0x14c1,0x14c1,0x14c1,0x14c1,0x14c1,0x14c1,0x14c1,0x16ce,0x16ce,0x82b,0x831,0x831,0x83d, -0x83d,0x82e,0x825,0x82e,0x825,0x82e,0x825,0x82e,0x825,0x82e,0x825,0x82e,0x5dc,0x5dc,0x5d6,0x5dc, -0x5d6,0x5dc,0x5d6,0x5dc,0x5d6,0x5dc,0x5d6,0x5d9,0x5df,0x5dc,0x5d6,0x5dc,0x5d6,0x5d9,0x5df,0x5dc, -0x5d6,0x5dc,0x5d6,0x5d9,0x5df,0x5dc,0x5d6,0x5d9,0x5df,0x5dc,0x5d6,0x5d9,0x5df,0x5dc,0x5d6,0x5dc, -0x5d6,0x5dc,0x5d6,0x5dc,0x5d6,0x5dc,0x5d6,0x5d9,0x5df,0x5dc,0x5d6,0x5d9,0x5df,0x5dc,0x5d6,0x5d9, -0x5df,0x5dc,0x5d6,0x5d9,0x5df,0x5dc,0x5d6,0x5d9,0x5df,0x5dc,0x5d6,0x5d9,0x5df,0x5dc,0x5d6,0x5d9, -0x5df,0x5dc,0x5d6,0x5d9,0x5df,0x5dc,0x5d6,0x5d9,0x6c9,0x6c9,0x6c9,0x6c9,0x6c9,0x6c9,0x6c9,0x6c9, -0x6c9,0x6c9,0x6c9,0x6c9,0x6c9,0x6c9,0x6c9,0x6c9,0x6c9,0x6c9,0x6c9,0x6c9,0x6c6,0x6c6,0x6c6,0x6c6, -0x6c6,0x6c6,0x6c6,0x6c6,0x6c6,0x6c6,0x6c6,0x6c6,0x6c6,0x6c6,0x6c6,0x6c6,0x6c6,0x6c6,0x6c6,0x6c6, -0x6c6,0x6c6,0x6c6,0x6c6,0x6c6,0x6c6,0x6c6,0x6c6,0x6c6,0x6c6,0x6c6,0x6c6,0x6c6,0x6c6,0x6cf,0x6cf, -0x6cf,0x6cf,0x6cf,0x6cf,0x6cf,0x6cf,0x6cf,0x6cf,0x6cf,0x6cf,0x6d2,0x6cf,0x6cf,0x6cf,0x6cf,0x6cf, -0x6cf,0x6cf,0x6cf,0x6cf,0x6cf,0x6cf,0x6cf,0x6cf,0x6cc,0x6cc,0x6cc,0x6cc,0x6cc,0x6cc,0x6cc,0x6cc, -0x6cc,0x6cc,0x6cc,0x6cc,0x6cc,0x6cc,0x6cc,0x6cc,0x6d5,0x6d5,0x6d5,0x6d5,0x6d5,0x6d5,0x6d5,0x6d5, +0x558,0x558,0x558,0x558,0x558,0x558,0x558,0x558,0x558,0x558,0x558,0xac5,0xbb8,0xac5,0xac5,0xac5, +0x567,0x567,0x567,0x567,0x567,0x567,0x567,0x567,0x567,0x567,0x567,0x567,0x567,0x567,0x567,0x567, +0x567,0x567,0x567,0x567,0x567,0x567,0x567,0x567,0x567,0x567,0x567,0x567,0x567,0x567,0x567,0x567, +0x6db,0x6db,0x6db,0x6db,0x6db,0x6db,0x6db,0x6db,0x6db,0x6db,0x56d,0xc1e,0xc1e,0xc1e,0xc1e,0xc1e, +0xc1e,0xc1e,0xc1e,0xc1e,0xc1e,0xc1e,0xc1e,0xc1e,0xc1e,0xc1e,0xc1e,0xc1e,0xc1e,0xc1e,0xc1e,0xd32, +0x6e4,0x6e4,0x6e4,0x6e4,0x6e4,0x6e4,0x6e4,0x6e4,0x6e4,0x6e4,0x6e4,0x6e4,0x6e4,0x6e4,0x6e4,0x6e4, +0x6e4,0x6e4,0x6e4,0x6e4,0x570,0x573,0x573,0x573,0x573,0x573,0x573,0x573,0x573,0x573,0x573,0x573, +0x6e4,0x6e4,0x6e4,0x6e4,0x6e4,0x6e4,0x6e4,0x6e4,0x6e4,0x6e4,0x6e4,0x6e4,0x573,0x573,0x573,0x573, +0x6e4,0x6e4,0x6e4,0x6e4,0x6e4,0x6e4,0x6e4,0x6e4,0x6e4,0x6e4,0x6e4,0x6e4,0x6e4,0x6e4,0x6e4,0x6e4, +0x6e7,0x6e7,0x6e7,0x6e7,0x6e7,0x6e7,0x6e7,0x6e7,0x6e7,0x6e7,0x6e7,0x6e7,0x6e7,0x6e7,0x6e7,0x6e7, +0x576,0x576,0x6e7,0x6e7,0x6e7,0x6e7,0xbbb,0xbbb,0xbbb,0xbbb,0xbbb,0xbbb,0xbbb,0xbbb,0xbbb,0xbbb, +0x6ed,0x6ed,0x579,0x6ea,0x6ea,0x6ea,0x6ea,0x6ea,0x6ea,0x6ea,0x57c,0x57c,0x579,0x579,0x57f,0x57f, +0x57f,0x57f,0x6ed,0x6ed,0x57f,0x57f,0x6f0,0x6ed,0x579,0x579,0x579,0x579,0x6ed,0x6ed,0x57f,0x57f, +0x6f0,0x6ed,0x579,0x579,0x579,0x579,0x6ed,0x6ed,0x6ea,0x579,0x57f,0x6ed,0x579,0x579,0x6ea,0x6ed, +0x6ed,0x6ed,0x57f,0x57f,0x579,0x579,0x579,0x579,0x579,0x579,0x579,0x579,0x579,0x579,0x579,0x579, +0x579,0x579,0x6ed,0x6ea,0x6ed,0x6ea,0x579,0x57f,0x57f,0x57f,0x57f,0x57f,0x57f,0x579,0x579,0x6ea, +0xacb,0xacb,0xacb,0xacb,0xacb,0xacb,0xacb,0xacb,0xbbe,0xbbe,0xbbe,0xbc1,0xbc1,0xc36,0xc36,0xbbe, +0x58b,0x58b,0x58b,0x58b,0x588,0x6ff,0x6ff,0x582,0x582,0x6f3,0x582,0x582,0x582,0x582,0x6f9,0x6f3, +0x582,0x588,0x582,0x582,0xd3b,0xd3b,0xbc4,0xbc4,0xdbc,0xace,0x585,0x585,0x6f6,0x58e,0x6f6,0x585, +0x588,0x582,0x588,0x588,0x582,0x582,0x588,0x582,0x582,0x582,0x588,0x582,0x582,0x582,0x588,0x588, +0x582,0x582,0x582,0x582,0x582,0x582,0x582,0x582,0x588,0x58b,0x58b,0x585,0x582,0x582,0x582,0x582, +0x705,0x582,0x705,0x582,0x582,0x582,0x582,0x582,0x7e0,0x7e0,0x7e0,0x7e0,0x7e0,0x7e0,0x7e0,0x7e0, +0x7e0,0x7e0,0x7e0,0x7e0,0x582,0x582,0x582,0x582,0x582,0x582,0x582,0x582,0x582,0x582,0x582,0x582, +0x702,0x6ff,0x591,0x702,0x6f3,0x6f9,0x588,0x6f3,0x6fc,0x6f3,0x6f3,0x582,0x6f3,0x6ff,0x591,0x6ff, +0xace,0xace,0xbc7,0xbc7,0xbc7,0xbc7,0xbc7,0xbc7,0xbc7,0xbc7,0xbc7,0xbca,0xbc7,0xbc7,0xdb3,0xe73, +0x594,0x594,0x594,0x594,0x594,0x594,0x594,0x594,0x594,0x594,0x594,0x594,0x594,0x594,0x594,0x594, +0x594,0x594,0x594,0x594,0x597,0x1383,0x1383,0x1383,0x597,0x597,0x597,0x597,0x597,0x597,0x597,0x597, +0x14d3,0x59d,0x5a9,0x59d,0x59d,0x1383,0x597,0x597,0x5ac,0x5a9,0x1386,0x1386,0x5af,0x5af,0x597,0x5a3, +0x597,0x597,0x5a3,0x597,0x5a3,0x597,0x5a3,0x597,0x597,0x597,0x597,0x597,0x597,0x5a3,0x597,0x597, +0x597,0x597,0x597,0x597,0x1383,0x597,0x597,0x597,0x597,0x597,0x597,0x597,0x597,0x597,0x597,0x5a3, +0x5a3,0x597,0x597,0x597,0x597,0x597,0x597,0x597,0x597,0x70b,0x597,0x597,0x597,0x597,0x597,0x597, +0x5a3,0x597,0x597,0x5a3,0x597,0x597,0x597,0x597,0x1383,0x597,0x1383,0x597,0x597,0x597,0x597,0x1383, +0x1383,0x1383,0x597,0x1287,0x597,0x597,0x597,0x5a0,0x5a0,0x5a0,0x5a0,0x1305,0x1305,0x597,0x59a,0x5a6, +0x5ac,0x597,0x597,0x597,0xbd0,0xbcd,0xbd0,0xbcd,0xbd0,0xbcd,0xbd0,0xbcd,0xbd0,0xbcd,0xbd0,0xbcd, +0xbd0,0xbcd,0x708,0x708,0x708,0x708,0x708,0x708,0x708,0x708,0x708,0x708,0x597,0x5a3,0x597,0x597, +0x597,0x597,0x597,0x597,0x597,0x597,0x597,0x597,0x597,0x597,0x597,0x597,0x1383,0x597,0x597,0x597, +0x597,0x597,0x597,0x597,0x597,0x597,0x597,0x597,0x597,0x597,0x597,0x1383,0x5d0,0x5d0,0x5d0,0x5d0, +0x5d0,0x5d0,0x5d0,0x5d0,0x5d0,0x5d0,0x5d0,0x5d0,0x5d0,0x5d3,0x5d3,0x5d3,0x5d3,0x5d3,0x5d3,0x5d3, +0x5d9,0x5d9,0x5d9,0x5d9,0x5d9,0x5d9,0x5d9,0x5d9,0x5d0,0x5d6,0x5c7,0x5ca,0x5d6,0x5d6,0x5d6,0x5d6, +0x5d6,0x5d6,0x5d6,0x5d6,0x5d6,0x5d6,0x5d6,0x5d6,0x5d6,0x5d6,0x5d6,0x5d6,0x5d6,0x5d6,0x5d6,0x5d6, +0x5d6,0x5d6,0x5d6,0x5d6,0x5d6,0x5d6,0x5d6,0x5d6,0x5d6,0x5d6,0x5cd,0x5cd,0x5cd,0x5cd,0x5cd,0x5cd, +0x5d0,0x5d0,0x5d0,0x5d0,0x5d0,0x5d0,0x5d0,0x5d0,0x5d0,0x5d0,0x5d0,0x5d0,0x5d0,0x5d0,0x5d0,0x5d0, +0x5d0,0x5d0,0x5d0,0x5d0,0x5d0,0x5d0,0x5d0,0x5d0,0x5d0,0x5d0,0x5d0,0x5d0,0x5d3,0x5d9,0x5d6,0x5d0, +0x5d3,0x5d9,0x5d6,0x5d0,0x5d3,0x5d9,0x5d6,0x5d0,0x5d3,0x5d9,0x5d6,0x5d0,0x5d3,0x5d9,0x5d6,0x5d0, +0x5d3,0x5d9,0x5d6,0x5d0,0x5d3,0x5d9,0x5d6,0x5d0,0x5d3,0x5d9,0x5d6,0x5d0,0x5d6,0x5d0,0x5d6,0x5d0, +0x5d6,0x5d0,0x5d6,0x5d0,0x5d6,0x5d0,0x5d6,0x5d0,0x5d3,0x5d9,0x5d6,0x5d0,0x5d3,0x5d9,0x5d6,0x5d0, +0x5d3,0x5d9,0x5d6,0x5d0,0x5d3,0x5d9,0x5d6,0x5d0,0x5d6,0x5d0,0x5d3,0x5d9,0x5d6,0x5d0,0x5d6,0x5d0, +0x5d3,0x5d9,0x5d6,0x5d0,0x5d3,0x5d9,0x5d6,0x5d0,0x5d6,0x5d0,0x1308,0x1308,0x1308,0x1308,0x1308,0x1308, +0x1308,0x1308,0x1308,0x1308,0x1308,0x1308,0x1308,0x1308,0x5d6,0x5d0,0x5d6,0x5d0,0x5d6,0x5d0,0x5d3,0x5d9, +0x5d3,0x5d9,0x5d6,0x5d0,0x5d6,0x5d0,0x5d6,0x5d0,0x5d6,0x5d0,0x5d6,0x5d0,0x5d6,0x5d0,0x5d6,0x5d0, +0x5d3,0x5d6,0x5d0,0x5d3,0x5d6,0x5d0,0x5d3,0x5d9,0x5d0,0x5d0,0x5d0,0x5d0,0x5d0,0x5d0,0x5d0,0x5d0, +0x5d0,0x5d0,0x5d0,0x5d0,0x5d0,0x5d0,0x5d0,0x5d0,0x5d0,0x5d0,0x5d0,0x5d0,0x5d0,0x5d0,0x5d0,0x5d3, +0x5d3,0x5d3,0x5d3,0x5d3,0x5d3,0x5d3,0x5d3,0x5d3,0x5d6,0x5d6,0x5d6,0x5d6,0x5d6,0x5d6,0x5d6,0x5d6, +0x5d6,0x5d6,0x5d6,0x5d6,0x5d6,0x5d6,0x5d6,0x5d6,0x5d6,0x5d0,0x5d0,0x5d0,0x5d0,0x5d0,0x5d0,0x5d0, +0x5d0,0x5d0,0x5d0,0x5d0,0x5d0,0x5d0,0x5d0,0x5d0,0x5d3,0x5d3,0x5d0,0x5d3,0x5d0,0x5d3,0x5d0,0x5d0, +0x5d3,0x5d0,0x5d0,0x5d3,0x5d0,0x5d3,0x5d0,0x5d0,0x5d3,0x5d0,0x5d3,0x5d3,0x5d0,0x5d0,0x5d0,0x5d3, +0x5d0,0x5d0,0x5d0,0x5d0,0x5d0,0x5d3,0x5d0,0x5d0,0x5d0,0x5d0,0x5d0,0x5d0,0x5d0,0x5d0,0x5d0,0x5d0, +0x5d0,0x5d0,0x5d0,0x5d0,0x5d0,0x5d0,0x5d0,0x5d0,0x5d0,0x5d0,0x5d0,0x5d0,0x5d3,0x5d3,0x5d0,0x5d0, +0x5d3,0x5d0,0x5d3,0x5d0,0x5d0,0x5d0,0x5d0,0x5d0,0x5d3,0x5d3,0x5d3,0x5d3,0x5d3,0x5d3,0x5d3,0x5d3, +0x5d3,0x5d3,0x5d3,0x5d3,0x5d3,0x5d3,0x5d3,0x5d3,0x5d3,0x5d3,0x5d3,0x5d3,0x5d3,0x5d3,0x5d3,0x5d3, +0x5d3,0x5d3,0x5d3,0x5d3,0x5d3,0x5d3,0x5d3,0x5d3,0x5d3,0x5d3,0x5d3,0x5d9,0x5d6,0x5d6,0x5d6,0x5d6, +0x5d6,0x5d6,0x5d6,0x5d6,0x5d6,0x5d6,0x5d6,0x5d6,0x5d6,0x5d6,0x5d6,0x5d6,0x5d6,0x5d6,0x5d6,0x5d6, +0x5d6,0x5d6,0x5d6,0x5d6,0x5d6,0x5d6,0x5d6,0x5d6,0x5d6,0x5d6,0x5d6,0x5d6,0x5d9,0x5d9,0x5d9,0x5d9, +0x5d9,0x5d9,0x5d9,0x5d9,0x5d9,0x5d9,0x5d9,0x5d9,0x5d9,0x5d9,0x5d9,0x5d9,0x5d9,0x5d9,0x5d9,0x5d9, +0x5d9,0x5d6,0x5d6,0x5d6,0x5d6,0x5d6,0x5d6,0x5d6,0x5d6,0x5d6,0x5d6,0x5d6,0x5dc,0x5dc,0x5dc,0x5dc, +0xfc6,0xfc6,0xfc6,0x14d6,0x14d6,0x14d6,0x14d6,0x14d6,0x14d6,0x14d6,0x16e3,0x16e3,0x83d,0x843,0x843,0x84f, +0x84f,0x840,0x837,0x840,0x837,0x840,0x837,0x840,0x837,0x840,0x837,0x840,0x5eb,0x5eb,0x5e5,0x5eb, +0x5e5,0x5eb,0x5e5,0x5eb,0x5e5,0x5eb,0x5e5,0x5e8,0x5ee,0x5eb,0x5e5,0x5eb,0x5e5,0x5e8,0x5ee,0x5eb, +0x5e5,0x5eb,0x5e5,0x5e8,0x5ee,0x5eb,0x5e5,0x5e8,0x5ee,0x5eb,0x5e5,0x5e8,0x5ee,0x5eb,0x5e5,0x5eb, +0x5e5,0x5eb,0x5e5,0x5eb,0x5e5,0x5eb,0x5e5,0x5e8,0x5ee,0x5eb,0x5e5,0x5e8,0x5ee,0x5eb,0x5e5,0x5e8, +0x5ee,0x5eb,0x5e5,0x5e8,0x5ee,0x5eb,0x5e5,0x5e8,0x5ee,0x5eb,0x5e5,0x5e8,0x5ee,0x5eb,0x5e5,0x5e8, +0x5ee,0x5eb,0x5e5,0x5e8,0x5ee,0x5eb,0x5e5,0x5e8,0x6d8,0x6d8,0x6d8,0x6d8,0x6d8,0x6d8,0x6d8,0x6d8, +0x6d8,0x6d8,0x6d8,0x6d8,0x6d8,0x6d8,0x6d8,0x6d8,0x6d8,0x6d8,0x6d8,0x6d8,0x6d5,0x6d5,0x6d5,0x6d5, 0x6d5,0x6d5,0x6d5,0x6d5,0x6d5,0x6d5,0x6d5,0x6d5,0x6d5,0x6d5,0x6d5,0x6d5,0x6d5,0x6d5,0x6d5,0x6d5, -0x6d5,0x6d5,0x6d5,0x6d5,0x6d5,0x6d5,0x6d5,0x6d5,0x6fc,0x6fc,0x6fc,0x6fc,0x6fc,0x6fc,0x6fc,0x6fc, -0x6fc,0x6fc,0x6fc,0x6fc,0x6fc,0x6fc,0x6fc,0x6fc,0x6fc,0x6fc,0x6fc,0x6fc,0x6fc,0x6fc,0x6fc,0x6fc, -0x6fc,0x6fc,0x6fc,0x6fc,0x6fc,0x6fc,0x6fc,0x6fc,0xc12,0x891,0x88b,0x888,0x88e,0x885,0x711,0x714, -0x714,0x714,0x714,0x714,0x714,0x714,0x714,0x714,0x897,0x711,0x711,0x711,0x711,0x711,0x711,0x711, -0x711,0x711,0x711,0x711,0x711,0x711,0x711,0x711,0x711,0x711,0x711,0x711,0x711,0x711,0x711,0x711, -0x711,0x711,0x711,0x711,0x711,0x711,0x711,0x711,0x711,0x711,0x894,0x894,0x717,0x8a6,0x8a9,0x8af, -0x7d1,0x7dd,0x8c4,0x7da,0x89d,0x89a,0x89d,0x89a,0x8a3,0x8a0,0x8a3,0x8a0,0x89d,0x89a,0x7d7,0x8af, -0x89d,0x89a,0x89d,0x89a,0x89d,0x89a,0x89d,0x89a,0x8b2,0x8bb,0x8b8,0x8b8,0x71d,0x759,0x759,0x759, -0x759,0x759,0x759,0x753,0x753,0x753,0x753,0x753,0x753,0x753,0x753,0x753,0x753,0x753,0x753,0x753, -0x753,0x753,0x753,0x753,0x753,0x753,0x753,0x720,0x73b,0x71a,0x741,0x744,0x73e,0x756,0x756,0x756, -0x756,0x756,0x756,0x750,0x750,0x750,0x750,0x750,0x750,0x750,0x750,0x750,0x750,0x750,0x750,0x750, -0x750,0x750,0x750,0x750,0x750,0x750,0x750,0x720,0x73b,0x71a,0x73b,0xc15,0x7bf,0x7bf,0x7bf,0x7bf, -0x7bf,0x7bf,0x7bf,0x7bf,0x7bf,0x7bf,0x7bf,0x7bf,0x7bf,0x7bf,0x7bf,0x7bf,0x7bf,0x7bf,0x7bf,0x7bf, -0x7bf,0x7bf,0x7bf,0x7bf,0x7bf,0x7bf,0x7bf,0x7bf,0x7bf,0x7bf,0x7bf,0x7bf,0x7bf,0x7bf,0x126c,0x126c, -0x126c,0x126c,0x126c,0x7c2,0x7d7,0x7da,0x7da,0x7da,0x7da,0x7da,0x7da,0x7da,0x7da,0x7da,0x8fa,0x8fa, -0x8fa,0x8fa,0x7e0,0x7e0,0x8b5,0x8c1,0x8c1,0x8c1,0x8c1,0x8be,0x7d4,0x8ac,0xae0,0xae0,0xae0,0xc27, -0xc45,0xc42,0xafb,0x882,0x7e6,0x7e3,0x7e6,0x7e9,0x7e3,0x7e6,0x7e3,0x7e6,0x7e3,0x7e6,0x7e3,0x7e3, -0x7e3,0x7e3,0x7e3,0x7e3,0x7e6,0x7e6,0x7e3,0x7e6,0x7e6,0x7e3,0x7e6,0x7e6,0x7e3,0x7e6,0x7e6,0x7e3, -0x7e6,0x7e6,0x7e3,0x7e3,0xc48,0x7f8,0x7f2,0x7f8,0x7f2,0x7f8,0x7f2,0x7f8,0x7f2,0x7f8,0x7f2,0x7f2, -0x7f5,0x7f2,0x7f5,0x7f2,0x7f5,0x7f2,0x7f5,0x7f2,0x7f5,0x7f2,0x7f5,0x7f2,0x7f5,0x7f2,0x7f5,0x7f2, -0x7f5,0x7f2,0x7f5,0x7f2,0x7f5,0x7f2,0x7f5,0x7f8,0x7f2,0x7f5,0x7f2,0x7f5,0x7f2,0x7f5,0x7f2,0x7f2, -0x7f2,0x7f2,0x7f2,0x7f2,0x7f5,0x7f5,0x7f2,0x7f5,0x7f5,0x7f2,0x7f5,0x7f5,0x7f2,0x7f5,0x7f5,0x7f2, -0x7f5,0x7f5,0x7f2,0x7f2,0x7f2,0x7f2,0x7f2,0x7f8,0x7f2,0x7f8,0x7f2,0x7f8,0x7f2,0x7f2,0x7f2,0x7f2, -0x7f2,0x7f2,0x7f8,0x7f2,0x7f2,0x7f2,0x7f2,0x7f2,0x7f5,0x7f8,0x7f8,0x7f5,0x7f5,0x7f5,0x7f5,0x8ca, -0x8cd,0x7fb,0x7fe,0xc30,0x804,0x804,0x804,0x804,0x804,0x804,0x804,0x804,0x804,0x804,0x804,0x804, -0x804,0x804,0x804,0x804,0x804,0x804,0x804,0x804,0x804,0x804,0x804,0x804,0x804,0x804,0x804,0x804, -0x804,0x804,0x804,0x804,0x807,0x804,0x804,0x804,0x804,0x804,0x804,0x804,0x804,0x804,0x804,0x804, -0x804,0x804,0x804,0x804,0x804,0x804,0x804,0x804,0x804,0x804,0x804,0x804,0x804,0x804,0x804,0x804, -0x810,0x810,0x810,0x810,0x810,0x810,0x810,0x810,0x810,0x810,0x810,0x810,0x810,0x810,0x810,0x810, -0x810,0x810,0x810,0x810,0x810,0x810,0x810,0x810,0x810,0x810,0x810,0x810,0xd32,0xd32,0xe61,0x80a, -0x8d6,0x8d6,0x8d6,0x8d6,0x8d6,0x8d6,0x8d6,0x8d6,0x8d6,0x8d6,0x8d6,0x8d6,0xd2c,0xd2c,0xd2c,0xd2c, -0x813,0x813,0x813,0x813,0x813,0x813,0x813,0x813,0x813,0x813,0x813,0x813,0x813,0x813,0x813,0x813, -0x8df,0x8df,0x8df,0x8df,0x8df,0x8df,0x8df,0x8df,0x8df,0x8df,0x8df,0x8df,0x8df,0x8df,0x8df,0x8df, -0x8df,0x816,0x816,0x816,0x816,0x816,0x816,0xd35,0xd35,0xd35,0xd35,0x8e2,0x8e2,0x8e2,0x8e2,0x8e2, +0x6d5,0x6d5,0x6d5,0x6d5,0x6d5,0x6d5,0x6d5,0x6d5,0x6d5,0x6d5,0x6d5,0x6d5,0x6d5,0x6d5,0x6de,0x6de, +0x6de,0x6de,0x6de,0x6de,0x6de,0x6de,0x6de,0x6de,0x6de,0x6de,0x6e1,0x6de,0x6de,0x6de,0x6de,0x6de, +0x6de,0x6de,0x6de,0x6de,0x6de,0x6de,0x6de,0x6de,0x6db,0x6db,0x6db,0x6db,0x6db,0x6db,0x6db,0x6db, +0x6db,0x6db,0x6db,0x6db,0x6db,0x6db,0x6db,0x6db,0x6e4,0x6e4,0x6e4,0x6e4,0x6e4,0x6e4,0x6e4,0x6e4, +0x6e4,0x6e4,0x6e4,0x6e4,0x6e4,0x6e4,0x6e4,0x6e4,0x6e4,0x6e4,0x6e4,0x6e4,0x6e4,0x6e4,0x6e4,0x6e4, +0x6e4,0x6e4,0x6e4,0x6e4,0x6e4,0x6e4,0x6e4,0x6e4,0x70e,0x70e,0x70e,0x70e,0x70e,0x70e,0x70e,0x70e, +0x70e,0x70e,0x70e,0x70e,0x70e,0x70e,0x70e,0x70e,0x70e,0x70e,0x70e,0x70e,0x70e,0x70e,0x70e,0x70e, +0x70e,0x70e,0x70e,0x70e,0x70e,0x70e,0x70e,0x70e,0xc24,0x8a3,0x89d,0x89a,0x8a0,0x897,0x723,0x726, +0x726,0x726,0x726,0x726,0x726,0x726,0x726,0x726,0x8a9,0x723,0x723,0x723,0x723,0x723,0x723,0x723, +0x723,0x723,0x723,0x723,0x723,0x723,0x723,0x723,0x723,0x723,0x723,0x723,0x723,0x723,0x723,0x723, +0x723,0x723,0x723,0x723,0x723,0x723,0x723,0x723,0x723,0x723,0x8a6,0x8a6,0x729,0x8b8,0x8bb,0x8c1, +0x7e3,0x7ef,0x8d6,0x7ec,0x8af,0x8ac,0x8af,0x8ac,0x8b5,0x8b2,0x8b5,0x8b2,0x8af,0x8ac,0x7e9,0x8c1, +0x8af,0x8ac,0x8af,0x8ac,0x8af,0x8ac,0x8af,0x8ac,0x8c4,0x8cd,0x8ca,0x8ca,0x72f,0x76b,0x76b,0x76b, +0x76b,0x76b,0x76b,0x765,0x765,0x765,0x765,0x765,0x765,0x765,0x765,0x765,0x765,0x765,0x765,0x765, +0x765,0x765,0x765,0x765,0x765,0x765,0x765,0x732,0x74d,0x72c,0x753,0x756,0x750,0x768,0x768,0x768, +0x768,0x768,0x768,0x762,0x762,0x762,0x762,0x762,0x762,0x762,0x762,0x762,0x762,0x762,0x762,0x762, +0x762,0x762,0x762,0x762,0x762,0x762,0x762,0x732,0x74d,0x72c,0x74d,0xc27,0x7d1,0x7d1,0x7d1,0x7d1, +0x7d1,0x7d1,0x7d1,0x7d1,0x7d1,0x7d1,0x7d1,0x7d1,0x7d1,0x7d1,0x7d1,0x7d1,0x7d1,0x7d1,0x7d1,0x7d1, +0x7d1,0x7d1,0x7d1,0x7d1,0x7d1,0x7d1,0x7d1,0x7d1,0x7d1,0x7d1,0x7d1,0x7d1,0x7d1,0x7d1,0x1281,0x1281, +0x1281,0x1281,0x1281,0x7d4,0x7e9,0x7ec,0x7ec,0x7ec,0x7ec,0x7ec,0x7ec,0x7ec,0x7ec,0x7ec,0x90c,0x90c, +0x90c,0x90c,0x7f2,0x7f2,0x8c7,0x8d3,0x8d3,0x8d3,0x8d3,0x8d0,0x7e6,0x8be,0xaf2,0xaf2,0xaf2,0xc39, +0xc57,0xc54,0xb0d,0x894,0x7f8,0x7f5,0x7f8,0x7fb,0x7f5,0x7f8,0x7f5,0x7f8,0x7f5,0x7f8,0x7f5,0x7f5, +0x7f5,0x7f5,0x7f5,0x7f5,0x7f8,0x7f8,0x7f5,0x7f8,0x7f8,0x7f5,0x7f8,0x7f8,0x7f5,0x7f8,0x7f8,0x7f5, +0x7f8,0x7f8,0x7f5,0x7f5,0xc5a,0x80a,0x804,0x80a,0x804,0x80a,0x804,0x80a,0x804,0x80a,0x804,0x804, +0x807,0x804,0x807,0x804,0x807,0x804,0x807,0x804,0x807,0x804,0x807,0x804,0x807,0x804,0x807,0x804, +0x807,0x804,0x807,0x804,0x807,0x804,0x807,0x80a,0x804,0x807,0x804,0x807,0x804,0x807,0x804,0x804, +0x804,0x804,0x804,0x804,0x807,0x807,0x804,0x807,0x807,0x804,0x807,0x807,0x804,0x807,0x807,0x804, +0x807,0x807,0x804,0x804,0x804,0x804,0x804,0x80a,0x804,0x80a,0x804,0x80a,0x804,0x804,0x804,0x804, +0x804,0x804,0x80a,0x804,0x804,0x804,0x804,0x804,0x807,0x80a,0x80a,0x807,0x807,0x807,0x807,0x8dc, +0x8df,0x80d,0x810,0xc42,0x816,0x816,0x816,0x816,0x816,0x816,0x816,0x816,0x816,0x816,0x816,0x816, 0x816,0x816,0x816,0x816,0x816,0x816,0x816,0x816,0x816,0x816,0x816,0x816,0x816,0x816,0x816,0x816, +0x816,0x816,0x816,0x816,0x819,0x816,0x816,0x816,0x816,0x816,0x816,0x816,0x816,0x816,0x816,0x816, 0x816,0x816,0x816,0x816,0x816,0x816,0x816,0x816,0x816,0x816,0x816,0x816,0x816,0x816,0x816,0x816, -0x816,0x816,0xd35,0xd35,0x819,0x819,0x819,0x819,0x819,0x819,0x819,0x819,0x819,0x819,0x819,0x819, -0x819,0x819,0x819,0x819,0x819,0x819,0x819,0x819,0x819,0x819,0x819,0x819,0x819,0x819,0x819,0x819, -0x819,0x819,0x819,0x819,0x8df,0x8df,0x8df,0x8df,0x8df,0x8df,0x8df,0x8df,0x81c,0x81c,0x81c,0x81c, -0x81c,0x81c,0x81c,0x81c,0x81c,0x81c,0x81c,0x81c,0x81c,0x81c,0x81c,0x81c,0x81c,0x81c,0x81c,0x81c, -0x81c,0x81c,0x81c,0x81c,0x81c,0x81c,0x81c,0x81c,0x81c,0x81c,0x81c,0x81c,0x81c,0x81c,0xe64,0xe64, -0xe64,0xe64,0xe64,0xe64,0xe64,0xe64,0xe64,0xe64,0xe64,0xe64,0xe64,0xe64,0xe64,0xe64,0xe64,0xe64, -0xe64,0xe64,0xe64,0xe64,0x10d4,0x10d4,0x10d4,0x10d4,0x81f,0x81f,0x81f,0x81f,0x81f,0x81f,0x81f,0x81f, -0x81f,0x81f,0x81f,0x81f,0x81f,0x81f,0x81f,0x81f,0x81f,0x81f,0x81f,0x81f,0x81f,0x81f,0x81f,0x81f, -0x81f,0x81f,0x81f,0x81f,0x81f,0x81f,0x81f,0x81f,0x81f,0x81f,0x822,0x822,0x81f,0x822,0x81f,0x822, -0x822,0x81f,0x81f,0x81f,0x81f,0x81f,0x81f,0x81f,0x81f,0x81f,0x81f,0x822,0x81f,0x822,0x81f,0x822, -0x822,0x81f,0x81f,0x822,0x822,0x822,0x81f,0x81f,0x81f,0x81f,0x1476,0x1476,0xc39,0xc39,0xc39,0xc39, -0xc39,0xc39,0xc39,0xc39,0xc39,0xc39,0xc39,0xc39,0xc39,0xc39,0xc39,0xc39,0x8d6,0x8d6,0x8d6,0x8d6, -0x8d6,0x8d6,0x8d6,0x8d6,0x8d6,0x8d6,0x8d6,0x8d6,0x8d6,0x8d6,0x8d6,0x8d6,0x8d6,0x8d6,0x8d6,0x8d6, -0x8d6,0x8d6,0x8d6,0x8d6,0x8d6,0x8d6,0x8d6,0x8d6,0x8d6,0x8d6,0x8d6,0x8d6,0x12a8,0x12a8,0x12a8,0x12a8, -0x1251,0x1251,0x1251,0x1251,0x1251,0x1251,0x1251,0x1251,0xd2c,0xc33,0xc33,0xc33,0xc33,0xc33,0xc33,0xc33, -0xc33,0xc33,0xc33,0xc33,0xc33,0xc33,0xc33,0xc33,0x8d9,0x8d9,0x8d9,0x8d9,0x8d9,0x8d9,0x8d9,0x8d9, -0x8d9,0x8d9,0x8d9,0x8d9,0x8d9,0x8d9,0x8d9,0x8d9,0x8d9,0x8d9,0x8d9,0x8d9,0x8d9,0x8d9,0x8d9,0x8dc, -0x8d9,0x8dc,0x8d9,0x8d9,0x8d9,0x8d9,0x8d9,0x8d9,0x8d9,0x8d9,0x8d9,0x8d9,0x8d9,0x8d9,0x8d9,0x8d9, -0x8d9,0x8d9,0x8d9,0x8d9,0x8d9,0xc33,0xc33,0xc33,0xc33,0xc33,0xc33,0xc33,0xc33,0xc33,0xc33,0xc33, -0xc33,0xc33,0xc33,0xc33,0x8df,0x8df,0x8df,0x8df,0x8df,0x8df,0x8df,0x8df,0x8df,0x8df,0x8df,0x8df, -0x8df,0x8df,0x8df,0x8df,0x8df,0x8df,0x8df,0x8df,0x8df,0x8df,0x8df,0x8df,0x8df,0x8df,0x8df,0x8df, -0x8df,0x8df,0x8df,0xd35,0x95d,0x93f,0x93f,0x93f,0x93f,0x939,0x93f,0x93f,0x951,0x93f,0x93f,0x93c, -0x948,0x94e,0x94e,0x94e,0x94e,0x94e,0x951,0x939,0x945,0x939,0x939,0x939,0x930,0x930,0x939,0x939, -0x939,0x939,0x939,0x939,0x954,0x954,0x954,0x954,0x954,0x954,0x954,0x954,0x954,0x954,0x939,0x939, -0x939,0x939,0x939,0x939,0x939,0x939,0x939,0x939,0x93c,0x930,0x939,0x930,0x939,0x930,0x94b,0x942, -0x94b,0x942,0x95a,0x95a,0x969,0x969,0x969,0x969,0x969,0x969,0x969,0x969,0x969,0x969,0x969,0x969, -0x969,0x969,0x969,0x969,0x969,0x969,0x969,0x969,0x969,0x969,0x969,0x969,0x969,0x969,0x969,0x969, -0x969,0x969,0x969,0x969,0x96c,0x96c,0x96c,0x96c,0x96c,0x96c,0x96c,0x96c,0x96c,0x96c,0x96c,0x96c, -0x96c,0x96c,0x96c,0x96c,0x96c,0x96c,0x96c,0x96c,0x96c,0x96c,0x96c,0x96c,0x96c,0x96c,0x96c,0x96c, -0x96c,0x96c,0x96c,0x96c,0x96f,0x96f,0x96f,0x96f,0x96f,0x96f,0x96f,0x96f,0x96f,0x96f,0x96f,0x96f, -0x96f,0x96f,0x96f,0x96f,0x96f,0x96f,0x96f,0x96f,0x96f,0x96f,0x96f,0x96f,0x96f,0x96f,0x96f,0x96f, -0x96f,0x96f,0x96f,0x96f,0x978,0x978,0x978,0x978,0x978,0x978,0x978,0x978,0x978,0x978,0x978,0x978, -0x978,0x978,0x978,0x978,0x978,0x978,0x978,0x978,0x978,0x978,0x978,0x978,0x978,0x978,0x978,0x978, -0x978,0x978,0x972,0x972,0x97b,0x97b,0x97b,0x97b,0x97b,0x97b,0x97b,0x97b,0x97b,0x97b,0x97b,0x97b, -0x97b,0x97b,0x97b,0x97b,0x97b,0x97b,0x97b,0x97b,0x97b,0x97b,0x97b,0x97b,0x97b,0x97b,0x97b,0x97b, -0x97b,0x97b,0x975,0x975,0x978,0x978,0x978,0x978,0x978,0x978,0x978,0x978,0x978,0x978,0x978,0x978, -0x978,0x978,0x978,0x978,0x978,0x978,0x978,0x978,0x978,0x978,0x978,0x978,0x978,0x978,0x978,0x978, -0x978,0x978,0x978,0x978,0x97b,0x97b,0x97b,0x97b,0x97b,0x97b,0x97b,0x97b,0x97b,0x97b,0x97b,0x97b, +0x822,0x822,0x822,0x822,0x822,0x822,0x822,0x822,0x822,0x822,0x822,0x822,0x822,0x822,0x822,0x822, +0x822,0x822,0x822,0x822,0x822,0x822,0x822,0x822,0x822,0x822,0x822,0x822,0xd44,0xd44,0xe76,0x81c, +0x8e8,0x8e8,0x8e8,0x8e8,0x8e8,0x8e8,0x8e8,0x8e8,0x8e8,0x8e8,0x8e8,0x8e8,0xd3e,0xd3e,0xd3e,0xd3e, +0x825,0x825,0x825,0x825,0x825,0x825,0x825,0x825,0x825,0x825,0x825,0x825,0x825,0x825,0x825,0x825, +0x8f1,0x8f1,0x8f1,0x8f1,0x8f1,0x8f1,0x8f1,0x8f1,0x8f1,0x8f1,0x8f1,0x8f1,0x8f1,0x8f1,0x8f1,0x8f1, +0x8f1,0x828,0x828,0x828,0x828,0x828,0x828,0xd47,0xd47,0xd47,0xd47,0x8f4,0x8f4,0x8f4,0x8f4,0x8f4, +0x828,0x828,0x828,0x828,0x828,0x828,0x828,0x828,0x828,0x828,0x828,0x828,0x828,0x828,0x828,0x828, +0x828,0x828,0x828,0x828,0x828,0x828,0x828,0x828,0x828,0x828,0x828,0x828,0x828,0x828,0x828,0x828, +0x828,0x828,0xd47,0xd47,0x82b,0x82b,0x82b,0x82b,0x82b,0x82b,0x82b,0x82b,0x82b,0x82b,0x82b,0x82b, +0x82b,0x82b,0x82b,0x82b,0x82b,0x82b,0x82b,0x82b,0x82b,0x82b,0x82b,0x82b,0x82b,0x82b,0x82b,0x82b, +0x82b,0x82b,0x82b,0x82b,0x8f1,0x8f1,0x8f1,0x8f1,0x8f1,0x8f1,0x8f1,0x8f1,0x82e,0x82e,0x82e,0x82e, +0x82e,0x82e,0x82e,0x82e,0x82e,0x82e,0x82e,0x82e,0x82e,0x82e,0x82e,0x82e,0x82e,0x82e,0x82e,0x82e, +0x82e,0x82e,0x82e,0x82e,0x82e,0x82e,0x82e,0x82e,0x82e,0x82e,0x82e,0x82e,0x82e,0x82e,0xe79,0xe79, +0xe79,0xe79,0xe79,0xe79,0xe79,0xe79,0xe79,0xe79,0xe79,0xe79,0xe79,0xe79,0xe79,0xe79,0xe79,0xe79, +0xe79,0xe79,0xe79,0xe79,0x10e9,0x10e9,0x10e9,0x10e9,0x831,0x831,0x831,0x831,0x831,0x831,0x831,0x831, +0x831,0x831,0x831,0x831,0x831,0x831,0x831,0x831,0x831,0x831,0x831,0x831,0x831,0x831,0x831,0x831, +0x831,0x831,0x831,0x831,0x831,0x831,0x831,0x831,0x831,0x831,0x834,0x834,0x831,0x834,0x831,0x834, +0x834,0x831,0x831,0x831,0x831,0x831,0x831,0x831,0x831,0x831,0x831,0x834,0x831,0x834,0x831,0x834, +0x834,0x831,0x831,0x834,0x834,0x834,0x831,0x831,0x831,0x831,0x148b,0x148b,0xc4b,0xc4b,0xc4b,0xc4b, +0xc4b,0xc4b,0xc4b,0xc4b,0xc4b,0xc4b,0xc4b,0xc4b,0xc4b,0xc4b,0xc4b,0xc4b,0x8e8,0x8e8,0x8e8,0x8e8, +0x8e8,0x8e8,0x8e8,0x8e8,0x8e8,0x8e8,0x8e8,0x8e8,0x8e8,0x8e8,0x8e8,0x8e8,0x8e8,0x8e8,0x8e8,0x8e8, +0x8e8,0x8e8,0x8e8,0x8e8,0x8e8,0x8e8,0x8e8,0x8e8,0x8e8,0x8e8,0x8e8,0x8e8,0x12bd,0x12bd,0x12bd,0x12bd, +0x1266,0x1266,0x1266,0x1266,0x1266,0x1266,0x1266,0x1266,0xd3e,0xc45,0xc45,0xc45,0xc45,0xc45,0xc45,0xc45, +0xc45,0xc45,0xc45,0xc45,0xc45,0xc45,0xc45,0xc45,0x8eb,0x8eb,0x8eb,0x8eb,0x8eb,0x8eb,0x8eb,0x8eb, +0x8eb,0x8eb,0x8eb,0x8eb,0x8eb,0x8eb,0x8eb,0x8eb,0x8eb,0x8eb,0x8eb,0x8eb,0x8eb,0x8eb,0x8eb,0x8ee, +0x8eb,0x8ee,0x8eb,0x8eb,0x8eb,0x8eb,0x8eb,0x8eb,0x8eb,0x8eb,0x8eb,0x8eb,0x8eb,0x8eb,0x8eb,0x8eb, +0x8eb,0x8eb,0x8eb,0x8eb,0x8eb,0xc45,0xc45,0xc45,0xc45,0xc45,0xc45,0xc45,0xc45,0xc45,0xc45,0xc45, +0xc45,0xc45,0xc45,0xc45,0x8f1,0x8f1,0x8f1,0x8f1,0x8f1,0x8f1,0x8f1,0x8f1,0x8f1,0x8f1,0x8f1,0x8f1, +0x8f1,0x8f1,0x8f1,0x8f1,0x8f1,0x8f1,0x8f1,0x8f1,0x8f1,0x8f1,0x8f1,0x8f1,0x8f1,0x8f1,0x8f1,0x8f1, +0x8f1,0x8f1,0x8f1,0xd47,0x96f,0x951,0x951,0x951,0x951,0x94b,0x951,0x951,0x963,0x951,0x951,0x94e, +0x95a,0x960,0x960,0x960,0x960,0x960,0x963,0x94b,0x957,0x94b,0x94b,0x94b,0x942,0x942,0x94b,0x94b, +0x94b,0x94b,0x94b,0x94b,0x966,0x966,0x966,0x966,0x966,0x966,0x966,0x966,0x966,0x966,0x94b,0x94b, +0x94b,0x94b,0x94b,0x94b,0x94b,0x94b,0x94b,0x94b,0x94e,0x942,0x94b,0x942,0x94b,0x942,0x95d,0x954, +0x95d,0x954,0x96c,0x96c,0x97b,0x97b,0x97b,0x97b,0x97b,0x97b,0x97b,0x97b,0x97b,0x97b,0x97b,0x97b, 0x97b,0x97b,0x97b,0x97b,0x97b,0x97b,0x97b,0x97b,0x97b,0x97b,0x97b,0x97b,0x97b,0x97b,0x97b,0x97b, -0x97b,0x97b,0x97b,0x97b,0x97e,0x981,0x981,0x981,0x981,0x981,0x981,0x981,0x981,0x981,0x981,0x981, +0x97b,0x97b,0x97b,0x97b,0x97e,0x97e,0x97e,0x97e,0x97e,0x97e,0x97e,0x97e,0x97e,0x97e,0x97e,0x97e, +0x97e,0x97e,0x97e,0x97e,0x97e,0x97e,0x97e,0x97e,0x97e,0x97e,0x97e,0x97e,0x97e,0x97e,0x97e,0x97e, +0x97e,0x97e,0x97e,0x97e,0x981,0x981,0x981,0x981,0x981,0x981,0x981,0x981,0x981,0x981,0x981,0x981, 0x981,0x981,0x981,0x981,0x981,0x981,0x981,0x981,0x981,0x981,0x981,0x981,0x981,0x981,0x981,0x981, -0x97e,0x981,0x981,0x981,0x981,0x981,0x981,0x981,0x981,0x981,0x981,0x981,0x981,0x981,0x981,0x981, -0x981,0x981,0x981,0x981,0x981,0x981,0x981,0x981,0x981,0x981,0x981,0x981,0xa0e,0xa0e,0xf96,0xa0e, -0xa0e,0xa0e,0xa11,0xa0e,0xf96,0xa0e,0xa0e,0xf8d,0xa08,0x9fc,0x9fc,0x9fc,0x9fc,0xa0b,0x9fc,0xf7b, -0xf7b,0xf7b,0x9fc,0x9ff,0xa08,0xa02,0xf81,0xf90,0xf90,0xf7b,0xf7b,0xf96,0xb01,0xb01,0xb01,0xb01, -0xb01,0xb01,0xb01,0xb01,0xb01,0xb01,0xa14,0xa14,0xa05,0xa05,0xa05,0xa05,0xa0e,0xa0e,0xa0e,0xa0e, -0xa0e,0xa0e,0xa0b,0xa0b,0x9fc,0x9fc,0xf96,0xf96,0xf96,0xf96,0xf7b,0xf7b,0xa0e,0xa0e,0xa0e,0xa0e, -0xa0e,0xa0e,0xa0e,0xa0e,0xa0e,0xa0e,0xa0e,0xa0e,0xa0e,0xa0e,0xa0e,0xa0e,0xa0e,0xa0e,0xa0e,0xa0e, -0xa0e,0xa0e,0xa0e,0xa0e,0xa0e,0xa0e,0xa0e,0xa0e,0xa0e,0xa0e,0xa0e,0xa0e,0xa23,0xa23,0xa23,0xa23, -0xa23,0xa23,0xa23,0xd86,0xa23,0xa23,0xa23,0xa23,0xa23,0xa23,0xa23,0xa23,0xa23,0xa23,0xa23,0xa23, -0xa23,0xa23,0xa23,0xa23,0xa23,0xa23,0xa23,0xa23,0xa23,0xa23,0xa23,0xa23,0xa23,0xa23,0xa23,0xa23, -0xa23,0xa23,0xa23,0xa23,0xa23,0xa23,0xa23,0xd86,0xa23,0xa23,0xa23,0xa23,0xa23,0xa23,0xa23,0xa23, -0xa23,0xa23,0xa23,0xa23,0xa23,0xa23,0xa23,0xa23,0xa29,0xa29,0xa29,0xa29,0xa29,0xa29,0xa29,0xa29, -0xa29,0xa29,0xa29,0xa29,0xa29,0xa29,0xa29,0xa29,0xa29,0xa29,0xa29,0xa29,0xa29,0xa29,0xa29,0xa29, -0xa29,0xa29,0xa29,0xa29,0xa29,0xa29,0xa29,0xa29,0xa2f,0xa2f,0xa2f,0xa2f,0xa2f,0xa2f,0xa2f,0xa2f, -0xa2f,0xa2f,0xa2f,0xa2f,0xa2f,0xa2c,0xa32,0xa2f,0xa2f,0xa2f,0xa2f,0xa2f,0xa2f,0xa2f,0xa2f,0x110d, -0x110d,0x110d,0x110d,0x110d,0x110d,0x110d,0x110d,0x110d,0x110a,0xa2f,0xa2f,0xa2f,0xa2f,0xa2f,0xa2f,0xa2f, -0xa2f,0xa2f,0xa2f,0xa2f,0xa2f,0xa2f,0xa2f,0xa2f,0xa2f,0xa2f,0xa2f,0xa2f,0xa2f,0xa2f,0xa2f,0xa2f, -0xa2f,0xa2f,0xa2f,0xa2f,0xa2f,0xa2f,0xa2f,0xa2f,0xa2f,0xa2f,0xa2f,0xa2f,0xa44,0xa44,0xa44,0xa44, -0xa44,0xa44,0xa44,0xa44,0xa44,0xa44,0xa44,0xa44,0xa44,0xa44,0xa44,0xa44,0xa44,0xa44,0xa44,0xa44, -0xa44,0xa44,0xa44,0xa44,0xa44,0xa44,0xa44,0xa44,0xa44,0xa44,0xa44,0xa44,0xa68,0xa68,0xa68,0xa6b, -0xa6b,0xa68,0xa68,0xa68,0xa68,0xa68,0xa68,0xa68,0xa68,0xa68,0xa68,0xa68,0xa68,0xa68,0xa68,0xa68, -0xa50,0xa50,0xa65,0xa47,0xa47,0xa47,0xa47,0xa47,0xa47,0xa47,0xa65,0xa65,0xa68,0xa68,0xa68,0xa68, -0xa68,0xa68,0xa68,0xa68,0xa68,0xa68,0xa68,0xa68,0xa68,0xa68,0xa68,0xa68,0xa68,0xa68,0xa68,0xa68, -0xa68,0xa68,0xa68,0xa68,0xa68,0xa68,0xa68,0xa68,0xa68,0xa68,0xa68,0xa68,0xa89,0xa89,0xa89,0xa89, -0xa89,0xa74,0xa74,0xa89,0xa89,0xa89,0xa89,0xa89,0xa89,0xa89,0xa89,0xa89,0xa89,0xa89,0xa89,0xa89, -0xa89,0xa89,0xa89,0xa89,0xa89,0xa89,0xa89,0xa89,0xa89,0xa89,0xa89,0xa89,0xa89,0xa89,0xa89,0xa89, -0xa89,0xa89,0xa89,0xa89,0xa89,0xa89,0xa89,0xa8c,0xa89,0xa89,0xa89,0xa89,0xa89,0xa89,0xa89,0xa89, -0xa89,0xa89,0xa89,0xa89,0xa89,0xa89,0xa89,0xa89,0xa89,0xa89,0xa89,0xa89,0xa89,0xa89,0xa89,0xa89, -0xa89,0xa89,0xa89,0xa89,0xab3,0xab3,0xab3,0xab3,0xab3,0xab3,0xab3,0xab3,0xab3,0xab3,0xab3,0xab3, -0xab3,0xab3,0xab3,0xab3,0xab3,0xab3,0xab3,0xab3,0xab3,0xab3,0xab3,0xab3,0xab3,0xab3,0xab3,0xba6, -0xba6,0xba6,0xba6,0xba6,0xabf,0xabf,0xabf,0xabf,0xabf,0xabf,0xabf,0xabf,0xabf,0xabf,0xabf,0xabf, -0xabf,0xabf,0xabf,0xabf,0xabf,0xabf,0xabf,0xabf,0xabf,0xabf,0xabf,0xabf,0xabf,0xabf,0xabf,0xabf, -0xabf,0xabf,0xabf,0xabf,0xad1,0xad1,0xad1,0xad1,0xad1,0xad1,0xad1,0xad1,0xad1,0xad1,0xad1,0xad1, +0x981,0x981,0x981,0x981,0x98a,0x98a,0x98a,0x98a,0x98a,0x98a,0x98a,0x98a,0x98a,0x98a,0x98a,0x98a, +0x98a,0x98a,0x98a,0x98a,0x98a,0x98a,0x98a,0x98a,0x98a,0x98a,0x98a,0x98a,0x98a,0x98a,0x98a,0x98a, +0x98a,0x98a,0x984,0x984,0x98d,0x98d,0x98d,0x98d,0x98d,0x98d,0x98d,0x98d,0x98d,0x98d,0x98d,0x98d, +0x98d,0x98d,0x98d,0x98d,0x98d,0x98d,0x98d,0x98d,0x98d,0x98d,0x98d,0x98d,0x98d,0x98d,0x98d,0x98d, +0x98d,0x98d,0x987,0x987,0x98a,0x98a,0x98a,0x98a,0x98a,0x98a,0x98a,0x98a,0x98a,0x98a,0x98a,0x98a, +0x98a,0x98a,0x98a,0x98a,0x98a,0x98a,0x98a,0x98a,0x98a,0x98a,0x98a,0x98a,0x98a,0x98a,0x98a,0x98a, +0x98a,0x98a,0x98a,0x98a,0x98d,0x98d,0x98d,0x98d,0x98d,0x98d,0x98d,0x98d,0x98d,0x98d,0x98d,0x98d, +0x98d,0x98d,0x98d,0x98d,0x98d,0x98d,0x98d,0x98d,0x98d,0x98d,0x98d,0x98d,0x98d,0x98d,0x98d,0x98d, +0x98d,0x98d,0x98d,0x98d,0x990,0x993,0x993,0x993,0x993,0x993,0x993,0x993,0x993,0x993,0x993,0x993, +0x993,0x993,0x993,0x993,0x993,0x993,0x993,0x993,0x993,0x993,0x993,0x993,0x993,0x993,0x993,0x993, +0x990,0x993,0x993,0x993,0x993,0x993,0x993,0x993,0x993,0x993,0x993,0x993,0x993,0x993,0x993,0x993, +0x993,0x993,0x993,0x993,0x993,0x993,0x993,0x993,0x993,0x993,0x993,0x993,0xa20,0xa20,0xfab,0xa20, +0xa20,0xa20,0xa23,0xa20,0xfab,0xa20,0xa20,0xfa2,0xa1a,0xa0e,0xa0e,0xa0e,0xa0e,0xa1d,0xa0e,0xf90, +0xf90,0xf90,0xa0e,0xa11,0xa1a,0xa14,0xf96,0xfa5,0xfa5,0xf90,0xf90,0xfab,0xb13,0xb13,0xb13,0xb13, +0xb13,0xb13,0xb13,0xb13,0xb13,0xb13,0xa26,0xa26,0xa17,0xa17,0xa17,0xa17,0xa20,0xa20,0xa20,0xa20, +0xa20,0xa20,0xa1d,0xa1d,0xa0e,0xa0e,0xfab,0xfab,0xfab,0xfab,0xf90,0xf90,0xa20,0xa20,0xa20,0xa20, +0xa20,0xa20,0xa20,0xa20,0xa20,0xa20,0xa20,0xa20,0xa20,0xa20,0xa20,0xa20,0xa20,0xa20,0xa20,0xa20, +0xa20,0xa20,0xa20,0xa20,0xa20,0xa20,0xa20,0xa20,0xa20,0xa20,0xa20,0xa20,0xa35,0xa35,0xa35,0xa35, +0xa35,0xa35,0xa35,0xd98,0xa35,0xa35,0xa35,0xa35,0xa35,0xa35,0xa35,0xa35,0xa35,0xa35,0xa35,0xa35, +0xa35,0xa35,0xa35,0xa35,0xa35,0xa35,0xa35,0xa35,0xa35,0xa35,0xa35,0xa35,0xa35,0xa35,0xa35,0xa35, +0xa35,0xa35,0xa35,0xa35,0xa35,0xa35,0xa35,0xd98,0xa35,0xa35,0xa35,0xa35,0xa35,0xa35,0xa35,0xa35, +0xa35,0xa35,0xa35,0xa35,0xa35,0xa35,0xa35,0xa35,0xa3b,0xa3b,0xa3b,0xa3b,0xa3b,0xa3b,0xa3b,0xa3b, +0xa3b,0xa3b,0xa3b,0xa3b,0xa3b,0xa3b,0xa3b,0xa3b,0xa3b,0xa3b,0xa3b,0xa3b,0xa3b,0xa3b,0xa3b,0xa3b, +0xa3b,0xa3b,0xa3b,0xa3b,0xa3b,0xa3b,0xa3b,0xa3b,0xa41,0xa41,0xa41,0xa41,0xa41,0xa41,0xa41,0xa41, +0xa41,0xa41,0xa41,0xa41,0xa41,0xa3e,0xa44,0xa41,0xa41,0xa41,0xa41,0xa41,0xa41,0xa41,0xa41,0x1122, +0x1122,0x1122,0x1122,0x1122,0x1122,0x1122,0x1122,0x1122,0x111f,0xa41,0xa41,0xa41,0xa41,0xa41,0xa41,0xa41, +0xa41,0xa41,0xa41,0xa41,0xa41,0xa41,0xa41,0xa41,0xa41,0xa41,0xa41,0xa41,0xa41,0xa41,0xa41,0xa41, +0xa41,0xa41,0xa41,0xa41,0xa41,0xa41,0xa41,0xa41,0xa41,0xa41,0xa41,0xa41,0xa56,0xa56,0xa56,0xa56, +0xa56,0xa56,0xa56,0xa56,0xa56,0xa56,0xa56,0xa56,0xa56,0xa56,0xa56,0xa56,0xa56,0xa56,0xa56,0xa56, +0xa56,0xa56,0xa56,0xa56,0xa56,0xa56,0xa56,0xa56,0xa56,0xa56,0xa56,0xa56,0xa7a,0xa7a,0xa7a,0xa7d, +0xa7d,0xa7a,0xa7a,0xa7a,0xa7a,0xa7a,0xa7a,0xa7a,0xa7a,0xa7a,0xa7a,0xa7a,0xa7a,0xa7a,0xa7a,0xa7a, +0xa62,0xa62,0xa77,0xa59,0xa59,0xa59,0xa59,0xa59,0xa59,0xa59,0xa77,0xa77,0xa7a,0xa7a,0xa7a,0xa7a, +0xa7a,0xa7a,0xa7a,0xa7a,0xa7a,0xa7a,0xa7a,0xa7a,0xa7a,0xa7a,0xa7a,0xa7a,0xa7a,0xa7a,0xa7a,0xa7a, +0xa7a,0xa7a,0xa7a,0xa7a,0xa7a,0xa7a,0xa7a,0xa7a,0xa7a,0xa7a,0xa7a,0xa7a,0xa9b,0xa9b,0xa9b,0xa9b, +0xa9b,0xa86,0xa86,0xa9b,0xa9b,0xa9b,0xa9b,0xa9b,0xa9b,0xa9b,0xa9b,0xa9b,0xa9b,0xa9b,0xa9b,0xa9b, +0xa9b,0xa9b,0xa9b,0xa9b,0xa9b,0xa9b,0xa9b,0xa9b,0xa9b,0xa9b,0xa9b,0xa9b,0xa9b,0xa9b,0xa9b,0xa9b, +0xa9b,0xa9b,0xa9b,0xa9b,0xa9b,0xa9b,0xa9b,0xa9e,0xa9b,0xa9b,0xa9b,0xa9b,0xa9b,0xa9b,0xa9b,0xa9b, +0xa9b,0xa9b,0xa9b,0xa9b,0xa9b,0xa9b,0xa9b,0xa9b,0xa9b,0xa9b,0xa9b,0xa9b,0xa9b,0xa9b,0xa9b,0xa9b, +0xa9b,0xa9b,0xa9b,0xa9b,0xac5,0xac5,0xac5,0xac5,0xac5,0xac5,0xac5,0xac5,0xac5,0xac5,0xac5,0xac5, +0xac5,0xac5,0xac5,0xac5,0xac5,0xac5,0xac5,0xac5,0xac5,0xac5,0xac5,0xac5,0xac5,0xac5,0xac5,0xbb8, +0xbb8,0xbb8,0xbb8,0xbb8,0xad1,0xad1,0xad1,0xad1,0xad1,0xad1,0xad1,0xad1,0xad1,0xad1,0xad1,0xad1, 0xad1,0xad1,0xad1,0xad1,0xad1,0xad1,0xad1,0xad1,0xad1,0xad1,0xad1,0xad1,0xad1,0xad1,0xad1,0xad1, -0xad1,0xad1,0xad1,0xad1,0xad7,0xad7,0xad7,0xad7,0xad7,0xad7,0xad7,0xad7,0xad7,0xad7,0xad7,0xad7, -0xad7,0xad7,0xad7,0xad7,0xad7,0xad7,0xad7,0xad7,0xad7,0xad7,0xad7,0xad7,0xad7,0xad7,0xad7,0xad7, -0xad7,0xad7,0xad7,0xad7,0xae6,0xae6,0xae6,0xae6,0xae6,0xae6,0xae6,0xae6,0xae6,0xae6,0xae6,0xae6, -0xae6,0xae6,0xae6,0xae6,0xae6,0xae6,0xae6,0xae6,0xae6,0xae6,0xae6,0xae6,0xae6,0xae6,0xae6,0xae6, -0xae6,0xae6,0xae6,0xae6,0xae9,0xae9,0xae9,0xae9,0xae9,0xae9,0xae9,0xae9,0xae9,0xae9,0xae9,0xae9, -0xae9,0xae9,0xae9,0xae9,0xae9,0xae9,0xae9,0xae9,0xae9,0xaec,0xae9,0xae9,0xae9,0xae9,0xae9,0xae9, +0xad1,0xad1,0xad1,0xad1,0xae3,0xae3,0xae3,0xae3,0xae3,0xae3,0xae3,0xae3,0xae3,0xae3,0xae3,0xae3, +0xae3,0xae3,0xae3,0xae3,0xae3,0xae3,0xae3,0xae3,0xae3,0xae3,0xae3,0xae3,0xae3,0xae3,0xae3,0xae3, +0xae3,0xae3,0xae3,0xae3,0xae9,0xae9,0xae9,0xae9,0xae9,0xae9,0xae9,0xae9,0xae9,0xae9,0xae9,0xae9, 0xae9,0xae9,0xae9,0xae9,0xae9,0xae9,0xae9,0xae9,0xae9,0xae9,0xae9,0xae9,0xae9,0xae9,0xae9,0xae9, -0xae9,0xae9,0xae9,0xae9,0xae9,0xae9,0xae9,0xae9,0xae9,0xae9,0xae9,0xae9,0xaef,0xaef,0xc36,0xc36, -0xaef,0xaef,0xaef,0xaef,0xaef,0xaef,0xaef,0xaef,0xaef,0xaef,0xaef,0xaef,0xaef,0xaef,0xaef,0xaef, -0xc36,0xaef,0xaef,0xaef,0xaef,0xaef,0xaef,0xaef,0xaef,0xaef,0xaef,0xaef,0xb10,0xb10,0xb10,0xb10, -0xb10,0xb10,0xb10,0xb10,0xb10,0xb10,0xb10,0xb10,0xb10,0xb10,0xb10,0xb10,0xb10,0xb10,0xb10,0xb10, -0xb10,0xb10,0xb10,0xb10,0xb10,0xb10,0xb10,0xb10,0xb10,0xb10,0xb10,0x14c4,0xb19,0xb19,0xb19,0xb19, -0xb19,0xb19,0xcbd,0xcbd,0xb16,0xb16,0xb16,0xb16,0xb16,0xb16,0xb16,0xb16,0xb16,0xb16,0xb16,0xb16, -0xb16,0xb16,0xb16,0xb16,0xb16,0xb16,0xb16,0xb16,0xb16,0xb16,0xb16,0xb16,0xb16,0xb16,0xcba,0xcba, -0xd0b,0xd0b,0xd0b,0xd0b,0xd0b,0xd0b,0xd0b,0xd0b,0xd0b,0xd0b,0xd0b,0xd0b,0xd0b,0xd0b,0xd0b,0xd0b, -0xb19,0xb19,0xb19,0xb19,0xb19,0xb19,0xb19,0xb19,0xb19,0xb19,0xb19,0xb19,0xb19,0xb19,0xb19,0xb19, -0xb19,0xb19,0xb19,0xb19,0xb19,0xb19,0xb19,0xb19,0xb19,0xb19,0xb19,0xb19,0xb19,0xb19,0xb19,0xb19, -0xb1c,0xb1c,0xb1c,0xb1c,0xb1c,0xb1c,0xb1c,0xb1c,0xb1c,0xb1c,0xb1c,0xb1c,0xb1c,0xb1c,0xb1c,0xb1c, -0xb1c,0xb1c,0xb1c,0xb1c,0xb1c,0xb1c,0xb1c,0xb1c,0xb1c,0xb1c,0xb1c,0xb1c,0xb1c,0xb1c,0xb1c,0xb1c, -0xb2b,0xb2b,0xb2b,0xb2b,0xb2b,0xb22,0xb2e,0xb34,0xb34,0xb34,0xb28,0xb28,0xb28,0xb31,0xb25,0xb25, -0xb25,0xb25,0xb25,0xb1f,0xb1f,0xb1f,0xb1f,0xb1f,0xb1f,0xb1f,0xb1f,0xb34,0xb34,0xb34,0xb34,0xb34, -0xb28,0xb28,0xb28,0xb28,0xb28,0xb28,0xb28,0xb28,0xb28,0xb28,0xb28,0xb28,0xb28,0xb28,0xb28,0xb28, -0xb28,0xb28,0xb28,0xb28,0xb28,0xb28,0xb28,0xb28,0xb28,0xb28,0xb28,0xb28,0xb28,0xb28,0xb28,0xb28, -0xb28,0xb28,0xb2b,0xb2b,0xb34,0xb34,0xb34,0xb28,0xb28,0xb34,0xb34,0xb34,0xb34,0xb34,0xb34,0xb34, -0xb28,0xb28,0xb28,0xb28,0xb28,0xb28,0xb28,0xb28,0xb28,0xb28,0xb28,0xb28,0xb28,0xb28,0xb28,0xb28, -0xb28,0xb28,0xb28,0xb28,0xb28,0xb28,0xb34,0xb34,0xb34,0xb34,0xb28,0xb28,0xb28,0xb28,0xb28,0xb28, -0xb28,0xb28,0xb28,0xb28,0xb28,0xb28,0xb28,0xb2b,0xb2b,0xb2b,0xb2b,0xb2b,0xb2b,0xb28,0xb28,0xb28, -0xb28,0xb28,0xb28,0xb28,0xb28,0xb28,0xb28,0xb28,0xb28,0xb28,0xb28,0xb28,0xb28,0xb28,0xb28,0xb28, -0xb28,0xb28,0xb28,0xb28,0xb28,0xb28,0xb28,0xb28,0xb28,0xb28,0x16d1,0x16d1,0xb40,0xb37,0xb3d,0xb3d, -0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d, -0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb37,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb40,0xb40, -0xb40,0xb40,0xb40,0xb40,0xb40,0xb40,0xb40,0xb40,0xb40,0xb40,0xb40,0xb40,0xb40,0xb40,0xb40,0xb40, -0xb40,0xb40,0xb40,0xb40,0xb40,0xb40,0xb40,0xb37,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d, -0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb37,0xb3d,0xb3d, -0xb3d,0xb3d,0xb3d,0xb3d,0xb40,0xb40,0xb40,0xb40,0xb40,0xb40,0xb40,0xb40,0xb40,0xb40,0xb40,0xb40, -0xb40,0xb40,0xb40,0xb40,0xb40,0xb40,0xb40,0xb40,0xb40,0xb37,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d, -0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d, +0xae9,0xae9,0xae9,0xae9,0xaf8,0xaf8,0xaf8,0xaf8,0xaf8,0xaf8,0xaf8,0xaf8,0xaf8,0xaf8,0xaf8,0xaf8, +0xaf8,0xaf8,0xaf8,0xaf8,0xaf8,0xaf8,0xaf8,0xaf8,0xaf8,0xaf8,0xaf8,0xaf8,0xaf8,0xaf8,0xaf8,0xaf8, +0xaf8,0xaf8,0xaf8,0xaf8,0xafb,0xafb,0xafb,0xafb,0xafb,0xafb,0xafb,0xafb,0xafb,0xafb,0xafb,0xafb, +0xafb,0xafb,0xafb,0xafb,0xafb,0xafb,0xafb,0xafb,0xafb,0xafe,0xafb,0xafb,0xafb,0xafb,0xafb,0xafb, +0xafb,0xafb,0xafb,0xafb,0xafb,0xafb,0xafb,0xafb,0xafb,0xafb,0xafb,0xafb,0xafb,0xafb,0xafb,0xafb, +0xafb,0xafb,0xafb,0xafb,0xafb,0xafb,0xafb,0xafb,0xafb,0xafb,0xafb,0xafb,0xb01,0xb01,0xc48,0xc48, +0xb01,0xb01,0xb01,0xb01,0xb01,0xb01,0xb01,0xb01,0xb01,0xb01,0xb01,0xb01,0xb01,0xb01,0xb01,0xb01, +0xc48,0xb01,0xb01,0xb01,0xb01,0xb01,0xb01,0xb01,0xb01,0xb01,0xb01,0xb01,0xb22,0xb22,0xb22,0xb22, +0xb22,0xb22,0xb22,0xb22,0xb22,0xb22,0xb22,0xb22,0xb22,0xb22,0xb22,0xb22,0xb22,0xb22,0xb22,0xb22, +0xb22,0xb22,0xb22,0xb22,0xb22,0xb22,0xb22,0xb22,0xb22,0xb22,0xb22,0x14d9,0xb2b,0xb2b,0xb2b,0xb2b, +0xb2b,0xb2b,0xccf,0xccf,0xb28,0xb28,0xb28,0xb28,0xb28,0xb28,0xb28,0xb28,0xb28,0xb28,0xb28,0xb28, +0xb28,0xb28,0xb28,0xb28,0xb28,0xb28,0xb28,0xb28,0xb28,0xb28,0xb28,0xb28,0xb28,0xb28,0xccc,0xccc, +0xd1d,0xd1d,0xd1d,0xd1d,0xd1d,0xd1d,0xd1d,0xd1d,0xd1d,0xd1d,0xd1d,0xd1d,0xd1d,0xd1d,0xd1d,0xd1d, +0xb2b,0xb2b,0xb2b,0xb2b,0xb2b,0xb2b,0xb2b,0xb2b,0xb2b,0xb2b,0xb2b,0xb2b,0xb2b,0xb2b,0xb2b,0xb2b, +0xb2b,0xb2b,0xb2b,0xb2b,0xb2b,0xb2b,0xb2b,0xb2b,0xb2b,0xb2b,0xb2b,0xb2b,0xb2b,0xb2b,0xb2b,0xb2b, +0xb2e,0xb2e,0xb2e,0xb2e,0xb2e,0xb2e,0xb2e,0xb2e,0xb2e,0xb2e,0xb2e,0xb2e,0xb2e,0xb2e,0xb2e,0xb2e, +0xb2e,0xb2e,0xb2e,0xb2e,0xb2e,0xb2e,0xb2e,0xb2e,0xb2e,0xb2e,0xb2e,0xb2e,0xb2e,0xb2e,0xb2e,0xb2e, +0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb34,0xb40,0xb46,0xb46,0xb46,0xb3a,0xb3a,0xb3a,0xb43,0xb37,0xb37, +0xb37,0xb37,0xb37,0xb31,0xb31,0xb31,0xb31,0xb31,0xb31,0xb31,0xb31,0xb46,0xb46,0xb46,0xb46,0xb46, +0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a, +0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a, +0xb3a,0xb3a,0xb3d,0xb3d,0xb46,0xb46,0xb46,0xb3a,0xb3a,0xb46,0xb46,0xb46,0xb46,0xb46,0xb46,0xb46, 0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a, +0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb46,0xb46,0xb46,0xb46,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a, +0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3a,0xb3a,0xb3a, 0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a, -0xb40,0xb40,0xb40,0xb40,0xb40,0xb40,0xb40,0xb40,0xb40,0xb40,0xb40,0xb40,0xb40,0xb40,0xb40,0xb40, -0xb40,0xb40,0xb40,0xb40,0xb40,0xb40,0xb40,0xb40,0xb40,0xb40,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d, -0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d, -0xb40,0xb40,0xb40,0xb40,0xb40,0xb40,0xb40,0xb40,0xb40,0xb40,0xb40,0xb40,0xb40,0xb40,0xb40,0xb40, -0xb40,0xb40,0xb40,0xb40,0xb40,0xb40,0xb40,0xb40,0xb40,0xb40,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d, -0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d, -0xb3d,0xb3d,0xb3d,0xb3d,0xb40,0xb40,0xb40,0xb40,0xb43,0xb43,0xb43,0xb43,0xb43,0xb43,0xb43,0xb43, -0xb43,0xb43,0xb43,0xb43,0xb43,0xb43,0xb43,0xb43,0xb43,0xb43,0xb43,0xb43,0xb43,0xb43,0xb43,0xb43, -0xb43,0xb43,0xb43,0xb43,0xb43,0xb43,0xb43,0xb43,0xb49,0xb49,0xb49,0xb49,0xb49,0xb49,0xb49,0xb49, -0xb49,0xb49,0xb49,0xb49,0xb49,0xb49,0xb49,0xb49,0xb49,0xb49,0xb49,0xb49,0xb49,0xb49,0xb49,0xb49, -0xb49,0xb49,0xb49,0xb49,0xb49,0xb49,0xb49,0xb49,0xb4c,0xb4c,0xb4c,0xb4c,0xb4c,0xb4c,0xb4c,0xb4c, +0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0x16e6,0x16e6,0xb52,0xb49,0xb4f,0xb4f, +0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f, +0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb49,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb52,0xb52, +0xb52,0xb52,0xb52,0xb52,0xb52,0xb52,0xb52,0xb52,0xb52,0xb52,0xb52,0xb52,0xb52,0xb52,0xb52,0xb52, +0xb52,0xb52,0xb52,0xb52,0xb52,0xb52,0xb52,0xb49,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f, +0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb49,0xb4f,0xb4f, +0xb4f,0xb4f,0xb4f,0xb4f,0xb52,0xb52,0xb52,0xb52,0xb52,0xb52,0xb52,0xb52,0xb52,0xb52,0xb52,0xb52, +0xb52,0xb52,0xb52,0xb52,0xb52,0xb52,0xb52,0xb52,0xb52,0xb49,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f, +0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f, 0xb4c,0xb4c,0xb4c,0xb4c,0xb4c,0xb4c,0xb4c,0xb4c,0xb4c,0xb4c,0xb4c,0xb4c,0xb4c,0xb4c,0xb4c,0xb4c, -0xb4c,0xb4c,0xb4c,0xb4c,0xb4c,0xb4c,0xb4c,0xb4c,0xba6,0xba6,0xba6,0xba6,0xba6,0xba6,0xba6,0xba6, -0xba6,0xba6,0xba6,0xba6,0xba6,0xba6,0xba6,0xba6,0xba6,0xba6,0xba6,0xba6,0xba6,0xba6,0xba3,0xba6, -0xba3,0xba3,0xba3,0xba3,0xba3,0xba3,0xba3,0xba3,0xba3,0xba3,0xba3,0xba3,0xba3,0xba3,0xba3,0xcae, -0xcb1,0xd9e,0xd9e,0xd9e,0xd9e,0xd9e,0xd9e,0xd9e,0xd9e,0xd9e,0xd9e,0xd9e,0xeb8,0xeb8,0xeb8,0xeb8, -0xbb5,0xbb5,0xbb5,0xbb5,0xbb5,0xbb5,0xbb5,0xbb5,0xbb5,0xbb5,0xcb4,0xcb4,0xcb4,0xcb4,0xcb4,0xcb4, -0xcb4,0xcb4,0xda4,0xe5b,0xda4,0xda4,0xda4,0xda4,0xda1,0xda4,0xda1,0xda4,0xda4,0xfab,0x1242,0x1242, -0xdad,0xdad,0xdad,0xdad,0xdad,0xdb3,0xdb0,0xeca,0xeca,0xeca,0xeca,0x13bf,0xfbd,0x13bf,0x12fc,0x12fc, -0xbeb,0xbeb,0xbeb,0xbeb,0xbeb,0xbeb,0xbeb,0xbeb,0xbeb,0xbeb,0xbeb,0xbeb,0xbeb,0xbeb,0xbeb,0xbeb, -0xbeb,0xbeb,0xc1b,0xc18,0xc1b,0xc18,0xc1b,0xc18,0x10ce,0x10cb,0xfc3,0xfc0,0xbee,0xbee,0xbee,0xbee, -0xbee,0xbee,0xbee,0xbee,0xbee,0xbee,0xbee,0xbee,0xbee,0xbee,0xbee,0xbee,0xbf1,0xbf1,0xbf1,0xbf1, -0xbf1,0xbf1,0xbf1,0xbf1,0xbf1,0xbf1,0xbf1,0xbf1,0xbf1,0xbf1,0xbf1,0xbf1,0xbf1,0xbf1,0xbf1,0xbf1, -0xbf1,0xbf1,0xbf1,0xbf1,0xbf1,0xbf1,0xbf1,0xbf1,0xbf1,0xbf1,0xbf1,0xbf1,0xbf4,0xbf4,0xbf1,0xbf1, -0xbf1,0xbf1,0xbf1,0xbf1,0xbf1,0xbf1,0xbf1,0xbf1,0xbf7,0xbf7,0xbf7,0xbfd,0xbfa,0xc21,0xc1e,0xbfd, -0xbfa,0xbfd,0xbfa,0xbfd,0xbfa,0xbfd,0xbfa,0xbfd,0xbfa,0xbfd,0xbfa,0xbfd,0xbfa,0xbfd,0xbfa,0xbfd, -0xbfa,0xbf7,0xbf7,0xbf7,0xbf7,0xbf7,0xbf7,0xbf7,0xbf7,0xbf7,0xbf7,0xbf7,0xbf7,0xbf7,0xbf7,0xbf7, -0xbf7,0xbf7,0xbf7,0xbf7,0xbf7,0xbf7,0xbf7,0xbf7,0xbf7,0xbf7,0xbf7,0xbf7,0xbf7,0xbf7,0xbf7,0xbf7, -0xbf7,0xbf7,0xbf7,0xbf7,0xbfd,0xbfa,0xbfd,0xbfa,0xbf7,0xbf7,0xbf7,0xbf7,0xbf7,0xbf7,0xbf7,0xbf7, -0xbf7,0xbf7,0xbf7,0xbf7,0xbf7,0xbf7,0xbf7,0xbf7,0xbf7,0xbf7,0xbf7,0xbf7,0xbf7,0xbf7,0xbf7,0xbf7, -0xbf7,0xbf7,0xbf7,0xbf7,0xbfd,0xbfa,0xbf7,0xbf7,0xc00,0xc00,0xc00,0xc00,0xc00,0xc00,0xc00,0xc00, -0xc00,0xc00,0xc00,0xc00,0xc06,0xc00,0xc00,0xc00,0xc00,0xc00,0xc00,0xc00,0xc00,0xc00,0xc00,0xc00, -0xc00,0xc00,0xc00,0xc00,0xc00,0xc00,0xc00,0xc00,0xc00,0xc00,0xc00,0xc00,0xc00,0xc00,0xc00,0xc00, -0xc00,0xc00,0xc00,0xc00,0xc00,0xc00,0xc00,0xc00,0xc06,0xc06,0xc06,0xc00,0xc00,0xc00,0xc00,0xc00, -0xc00,0xc00,0xc00,0xc00,0xc00,0xc00,0xc00,0xc00,0xc00,0xc00,0xc00,0xc00,0xc00,0xc00,0xc00,0xc00, -0xc00,0xc00,0xc00,0xc00,0xc00,0xc00,0xc00,0xc00,0xc03,0xc00,0xc00,0xc00,0xc39,0xc39,0xc39,0xc39, -0xc39,0xc39,0xc39,0xc39,0xc39,0xc39,0xc39,0xc39,0xc39,0xc39,0xc39,0xc39,0xc39,0xc39,0xc39,0xc39, -0xc39,0xc39,0xc39,0xc39,0xc39,0xc39,0xc39,0xc39,0xc39,0xc39,0xc39,0xc39,0xcb7,0xd26,0xda1,0xda1, -0xda1,0xda1,0xda1,0xda1,0xda1,0xda1,0xe5b,0xe5b,0xda1,0xda1,0xda1,0xda1,0xda4,0xda4,0xebb,0xfab, -0xfab,0xfab,0xfab,0xfab,0xfab,0xfab,0xfab,0xfab,0xfab,0x126f,0x126f,0x1245,0xcdb,0xcdb,0xcdb,0xcdb, -0xcdb,0xcdb,0xcdb,0xcdb,0xcdb,0xcdb,0xcdb,0xcdb,0xcdb,0xcdb,0xcdb,0xcdb,0xcdb,0xcdb,0xcdb,0xcdb, -0xcdb,0xcdb,0xcdb,0xcdb,0xcdb,0xcdb,0xcdb,0xcdb,0xcdb,0xcdb,0xcdb,0xcdb,0xcea,0xcea,0xcea,0xcea, -0xcea,0xcea,0xce1,0xce1,0xce1,0xce1,0xce1,0xcde,0xcf3,0xcf3,0xcf3,0xced,0xcf3,0xcf3,0xcf3,0xcf3, -0xcf3,0xcf3,0xcf3,0xcf3,0xcf3,0xcf3,0xcf3,0xced,0xcf3,0xcf3,0xcf3,0xcf3,0xce7,0xce7,0xcf0,0xcf0, -0xcf0,0xcf0,0xce4,0xce4,0xce4,0xce4,0xce4,0xcea,0xdb9,0xdb9,0xdb9,0xdb9,0xdb9,0xdb9,0xdb9,0xdb9, -0xdb9,0xdb9,0xdb9,0xdb9,0xdb6,0xdb9,0xdb9,0xdb9,0xdb9,0xdb9,0xdb9,0xdb9,0xcf3,0xcf3,0xcf3,0xcf3, -0xcf3,0xcf3,0xcf3,0xcf3,0xcf3,0xcf3,0xcf3,0xcf3,0xcf3,0xcf3,0xced,0xcf3,0xcf3,0xcf3,0xcf3,0xcf3, -0xcf3,0xcf3,0xcf3,0xcf3,0xcf3,0xcf3,0xcf3,0xcf3,0xcf3,0xce7,0xce7,0xce7,0xcea,0xcea,0xcea,0xcea, -0xcea,0xcea,0xcea,0xcea,0xcea,0xcea,0xcea,0xcea,0xcea,0xcea,0xcea,0xcea,0xcea,0xcea,0xcea,0xcea, -0xcea,0xcea,0xcea,0xcea,0xcea,0xcea,0xcea,0xcea,0xcea,0xcea,0xcea,0xcea,0xcf6,0xcf6,0xcf6,0xcf6, -0xcf6,0xcf9,0xcf9,0xcf9,0xcf6,0xcf6,0xcf6,0xcf6,0xcf6,0xcf6,0xdbc,0xdbc,0xdbc,0xdbc,0xdbc,0xdbc, -0xecd,0xecd,0xecd,0xecd,0xecd,0xecd,0xecd,0x10d7,0x10d7,0xfc6,0xfc6,0xfc6,0xcfc,0xcfc,0xcfc,0xcfc, +0xb4c,0xb4c,0xb4c,0xb4c,0xb4c,0xb4c,0xb4c,0xb4c,0xb4c,0xb4c,0xb4c,0xb4c,0xb4c,0xb4c,0xb4c,0xb4c, +0xb52,0xb52,0xb52,0xb52,0xb52,0xb52,0xb52,0xb52,0xb52,0xb52,0xb52,0xb52,0xb52,0xb52,0xb52,0xb52, +0xb52,0xb52,0xb52,0xb52,0xb52,0xb52,0xb52,0xb52,0xb52,0xb52,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f, +0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f, +0xb52,0xb52,0xb52,0xb52,0xb52,0xb52,0xb52,0xb52,0xb52,0xb52,0xb52,0xb52,0xb52,0xb52,0xb52,0xb52, +0xb52,0xb52,0xb52,0xb52,0xb52,0xb52,0xb52,0xb52,0xb52,0xb52,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f, +0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f, +0xb4f,0xb4f,0xb4f,0xb4f,0xb52,0xb52,0xb52,0xb52,0xb55,0xb55,0xb55,0xb55,0xb55,0xb55,0xb55,0xb55, +0xb55,0xb55,0xb55,0xb55,0xb55,0xb55,0xb55,0xb55,0xb55,0xb55,0xb55,0xb55,0xb55,0xb55,0xb55,0xb55, +0xb55,0xb55,0xb55,0xb55,0xb55,0xb55,0xb55,0xb55,0xb5b,0xb5b,0xb5b,0xb5b,0xb5b,0xb5b,0xb5b,0xb5b, +0xb5b,0xb5b,0xb5b,0xb5b,0xb5b,0xb5b,0xb5b,0xb5b,0xb5b,0xb5b,0xb5b,0xb5b,0xb5b,0xb5b,0xb5b,0xb5b, +0xb5b,0xb5b,0xb5b,0xb5b,0xb5b,0xb5b,0xb5b,0xb5b,0xb5e,0xb5e,0xb5e,0xb5e,0xb5e,0xb5e,0xb5e,0xb5e, +0xb5e,0xb5e,0xb5e,0xb5e,0xb5e,0xb5e,0xb5e,0xb5e,0xb5e,0xb5e,0xb5e,0xb5e,0xb5e,0xb5e,0xb5e,0xb5e, +0xb5e,0xb5e,0xb5e,0xb5e,0xb5e,0xb5e,0xb5e,0xb5e,0xbb8,0xbb8,0xbb8,0xbb8,0xbb8,0xbb8,0xbb8,0xbb8, +0xbb8,0xbb8,0xbb8,0xbb8,0xbb8,0xbb8,0xbb8,0xbb8,0xbb8,0xbb8,0xbb8,0xbb8,0xbb8,0xbb8,0xbb5,0xbb8, +0xbb5,0xbb5,0xbb5,0xbb5,0xbb5,0xbb5,0xbb5,0xbb5,0xbb5,0xbb5,0xbb5,0xbb5,0xbb5,0xbb5,0xbb5,0xcc0, +0xcc3,0xdb0,0xdb0,0xdb0,0xdb0,0xdb0,0xdb0,0xdb0,0xdb0,0xdb0,0xdb0,0xdb0,0xecd,0xecd,0xecd,0xecd, +0xbc7,0xbc7,0xbc7,0xbc7,0xbc7,0xbc7,0xbc7,0xbc7,0xbc7,0xbc7,0xcc6,0xcc6,0xcc6,0xcc6,0xcc6,0xcc6, +0xcc6,0xcc6,0xdb6,0xe70,0xdb6,0xdb9,0xdb9,0xdb6,0xdb3,0xdb6,0xdb3,0xdb6,0xdb6,0xfc0,0x1257,0x1257, +0xdc2,0xdc2,0xdc2,0xdc2,0xdc2,0xdc8,0xdc5,0xedf,0xedf,0xedf,0xedf,0x13d4,0xfd2,0x13d4,0x1311,0x1311, +0xbfd,0xbfd,0xbfd,0xbfd,0xbfd,0xbfd,0xbfd,0xbfd,0xbfd,0xbfd,0xbfd,0xbfd,0xbfd,0xbfd,0xbfd,0xbfd, +0xbfd,0xbfd,0xc2d,0xc2a,0xc2d,0xc2a,0xc2d,0xc2a,0x10e3,0x10e0,0xfd8,0xfd5,0xc00,0xc00,0xc00,0xc00, +0xc00,0xc00,0xc00,0xc00,0xc00,0xc00,0xc00,0xc00,0xc00,0xc00,0xc00,0xc00,0xc03,0xc03,0xc03,0xc03, +0xc03,0xc03,0xc03,0xc03,0xc03,0xc03,0xc03,0xc03,0xc03,0xc03,0xc03,0xc03,0xc03,0xc03,0xc03,0xc03, +0xc03,0xc03,0xc03,0xc03,0xc03,0xc03,0xc03,0xc03,0xc03,0xc03,0xc03,0xc03,0xc06,0xc06,0xc03,0xc03, +0xc03,0xc03,0xc03,0xc03,0xc03,0xc03,0xc03,0xc03,0xc09,0xc09,0xc09,0xc0f,0xc0c,0xc33,0xc30,0xc0f, +0xc0c,0xc0f,0xc0c,0xc0f,0xc0c,0xc0f,0xc0c,0xc0f,0xc0c,0xc0f,0xc0c,0xc0f,0xc0c,0xc0f,0xc0c,0xc0f, +0xc0c,0xc09,0xc09,0xc09,0xc09,0xc09,0xc09,0xc09,0xc09,0xc09,0xc09,0xc09,0xc09,0xc09,0xc09,0xc09, +0xc09,0xc09,0xc09,0xc09,0xc09,0xc09,0xc09,0xc09,0xc09,0xc09,0xc09,0xc09,0xc09,0xc09,0xc09,0xc09, +0xc09,0xc09,0xc09,0xc09,0xc0f,0xc0c,0xc0f,0xc0c,0xc09,0xc09,0xc09,0xc09,0xc09,0xc09,0xc09,0xc09, +0xc09,0xc09,0xc09,0xc09,0xc09,0xc09,0xc09,0xc09,0xc09,0xc09,0xc09,0xc09,0xc09,0xc09,0xc09,0xc09, +0xc09,0xc09,0xc09,0xc09,0xc0f,0xc0c,0xc09,0xc09,0xc12,0xc12,0xc12,0xc12,0xc12,0xc12,0xc12,0xc12, +0xc12,0xc12,0xc12,0xc12,0xc18,0xc12,0xc12,0xc12,0xc12,0xc12,0xc12,0xc12,0xc12,0xc12,0xc12,0xc12, +0xc12,0xc12,0xc12,0xc12,0xc12,0xc12,0xc12,0xc12,0xc12,0xc12,0xc12,0xc12,0xc12,0xc12,0xc12,0xc12, +0xc12,0xc12,0xc12,0xc12,0xc12,0xc12,0xc12,0xc12,0xc18,0xc18,0xc18,0xc12,0xc12,0xc12,0xc12,0xc12, +0xc12,0xc12,0xc12,0xc12,0xc12,0xc12,0xc12,0xc12,0xc12,0xc12,0xc12,0xc12,0xc12,0xc12,0xc12,0xc12, +0xc12,0xc12,0xc12,0xc12,0xc12,0xc12,0xc12,0xc12,0xc15,0xc12,0xc12,0xc12,0xc4b,0xc4b,0xc4b,0xc4b, +0xc4b,0xc4b,0xc4b,0xc4b,0xc4b,0xc4b,0xc4b,0xc4b,0xc4b,0xc4b,0xc4b,0xc4b,0xc4b,0xc4b,0xc4b,0xc4b, +0xc4b,0xc4b,0xc4b,0xc4b,0xc4b,0xc4b,0xc4b,0xc4b,0xc4b,0xc4b,0xc4b,0xc4b,0xcc9,0xd38,0xdb3,0xdb3, +0xdb3,0xdb3,0xdb3,0xdb3,0xdb3,0xdb3,0xe70,0xe70,0xdb3,0xdb3,0xdb3,0xdb3,0xdb6,0xdb6,0xed0,0xfc0, +0xfc0,0xfc0,0xfc0,0xfc0,0xfc0,0xfc0,0xfc0,0xfc0,0xfc0,0x1284,0x1284,0x125a,0xced,0xced,0xced,0xced, +0xced,0xced,0xced,0xced,0xced,0xced,0xced,0xced,0xced,0xced,0xced,0xced,0xced,0xced,0xced,0xced, +0xced,0xced,0xced,0xced,0xced,0xced,0xced,0xced,0xced,0xced,0xced,0xced,0xcfc,0xcfc,0xcfc,0xcfc, +0xcfc,0xcfc,0xcf3,0xcf3,0xcf3,0xcf3,0xcf3,0xcf0,0xd05,0xd05,0xd05,0xcff,0xd05,0xd05,0xd05,0xd05, +0xd05,0xd05,0xd05,0xd05,0xd05,0xd05,0xd05,0xcff,0xd05,0xd05,0xd05,0xd05,0xcf9,0xcf9,0xd02,0xd02, +0xd02,0xd02,0xcf6,0xcf6,0xcf6,0xcf6,0xcf6,0xcfc,0xdce,0xdce,0xdce,0xdce,0xdce,0xdce,0xdce,0xdce, +0xdce,0xdce,0xdce,0xdce,0xdcb,0xdce,0xdce,0xdce,0xdce,0xdce,0xdce,0xdce,0xd05,0xd05,0xd05,0xd05, +0xd05,0xd05,0xd05,0xd05,0xd05,0xd05,0xd05,0xd05,0xd05,0xd05,0xcff,0xd05,0xd05,0xd05,0xd05,0xd05, +0xd05,0xd05,0xd05,0xd05,0xd05,0xd05,0xd05,0xd05,0xd05,0xcf9,0xcf9,0xcf9,0xcfc,0xcfc,0xcfc,0xcfc, 0xcfc,0xcfc,0xcfc,0xcfc,0xcfc,0xcfc,0xcfc,0xcfc,0xcfc,0xcfc,0xcfc,0xcfc,0xcfc,0xcfc,0xcfc,0xcfc, -0xcfc,0xcfc,0xcfc,0xcfc,0xcfc,0xcfc,0xcfc,0xcfc,0xcfc,0xcfc,0xcfc,0xcfc,0xd02,0xd02,0xd02,0xd02, -0xd02,0xd02,0xd02,0xd02,0xd02,0xd02,0xd02,0xd02,0xd02,0xd02,0xd02,0xd02,0xd02,0xd02,0xd02,0xd02, -0xd02,0xd02,0xd02,0xd02,0xd02,0xd02,0xd02,0xd02,0xd02,0xd02,0xd02,0xd02,0xd0b,0xd0b,0xd0b,0xd0b, -0xd0b,0xd0b,0xd0b,0xd0b,0xd0b,0xd0b,0xd0b,0xd0b,0xd0b,0xd0b,0xd0b,0xd0b,0xd0b,0xd0b,0xd0b,0xd0b, -0xd0b,0xd0b,0xd0b,0xd0b,0xd0b,0xd0b,0xd0b,0xd0b,0xd0b,0xd0b,0xd0b,0xd0b,0xd17,0xd17,0xd17,0xd17, -0xd17,0xd17,0xd17,0xd17,0xd17,0xd17,0xd17,0xd17,0xd17,0xd17,0xd17,0xd17,0xd17,0xd17,0xd17,0xd17, -0xd17,0xd17,0xd17,0xd17,0xd17,0xd17,0xd17,0xd17,0xd17,0xd17,0xd17,0xd17,0xd23,0xd23,0xd23,0xd23, -0xd23,0xd23,0xd23,0xd23,0xd23,0xd23,0xd23,0xd23,0xd23,0xd23,0xd23,0xd23,0xd23,0xd23,0xd23,0xd23, -0xd23,0xd23,0xd23,0xd23,0xd23,0xd23,0xd23,0xd23,0xd23,0xd23,0xd23,0xd23,0xdc2,0xdc2,0xdc2,0xdc2, -0xdc2,0xdc2,0xdc2,0xdc2,0xdc2,0xdc2,0xdc2,0xdc2,0xdc2,0xdc2,0xdc2,0xdc2,0xdc2,0xdc2,0xdc2,0xdc2, -0xdc2,0xdc2,0xdc2,0xdc2,0xdc2,0xdc2,0xdc2,0xdc2,0xdc2,0xdc2,0xdc2,0xdc2,0xdc8,0xdc8,0xdc8,0xdc8, -0xdc8,0xdc8,0xdc8,0xdc8,0xdc8,0xdc8,0xdc8,0xdc8,0xdc8,0xdc8,0xdc8,0xdc8,0xdc8,0xdc8,0xdc8,0xdc8, -0xdc8,0xdc5,0xdc5,0xdc5,0xdc5,0xdc5,0xdc5,0xdc5,0xdc5,0xdc5,0xdc5,0xdc5,0xdc8,0xdc8,0xdc8,0xdc8, -0xdc8,0xdc8,0xdc8,0xdc8,0xdc8,0xdc8,0xdc8,0xdc8,0xdc8,0xdc8,0xdc8,0xdc8,0xdc8,0xdc8,0xdc8,0xdc8, -0xdc8,0xdc8,0xdc8,0xdc8,0xdc8,0xdc8,0xdc8,0xdc8,0xdc8,0xdc8,0xdc8,0xdc8,0xe88,0xe88,0xdda,0xdda, -0xed0,0xed0,0xed0,0xed0,0xed0,0xed0,0xed0,0xfd2,0xfd2,0xfd2,0xfd2,0xfd2,0xfcf,0xfcf,0xfcf,0xfcf, -0xfcf,0xfcf,0xfcf,0xfcf,0xfcf,0xfcf,0xfcf,0xfcf,0xfcf,0xfcf,0xfcf,0xfcf,0xde9,0xde6,0xde9,0xde6, -0xde9,0xde6,0xde9,0xde6,0xde9,0xde6,0xde9,0xde6,0xde9,0xde6,0xde9,0xde6,0xde9,0xde6,0xde9,0xde6, -0xde9,0xde6,0xde9,0xde6,0xde9,0xde6,0xde9,0xde6,0xde9,0xde6,0xde9,0xde6,0xdf5,0xdf5,0xdf5,0xdf5, -0xdf5,0xdf5,0xdf5,0xdf5,0xdf5,0xdf5,0xdf5,0xdf5,0xdf5,0xdf5,0xdf5,0xdf5,0xdf5,0xdf5,0xdf5,0xdf5, -0xdf5,0xdf5,0xdf5,0xdf5,0xdf5,0xdf5,0xdf5,0xdf5,0xdf5,0xdf5,0xdf5,0xdf5,0xdfb,0xdfb,0xdfb,0xdfb, -0xdfb,0xdfb,0xdfb,0xdfb,0xdfb,0xdfb,0xdfb,0xdfb,0xdfb,0xdfb,0xdfb,0xdfb,0xdfb,0xdfb,0xdfb,0xdfb, -0xdfb,0xdfb,0xdfb,0xdfb,0xdfb,0xdfb,0xdfb,0xdfb,0xdfb,0xdfb,0xdfb,0xdfb,0xe13,0xe13,0xe13,0xe13, -0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13, -0xe13,0xe13,0xe13,0xed3,0xed3,0xed3,0xed3,0xfd5,0xfd5,0xfd5,0xfd5,0xfd5,0xe1c,0xe1c,0xe1c,0xe1c, -0xe1c,0xe1c,0xe1c,0xe1c,0xe1c,0xe1c,0xe1c,0xe1c,0xe1c,0xe1c,0xe1c,0xe1c,0xe1c,0xe1c,0xe1c,0xe1c, -0xe1c,0xe1c,0xe1c,0xe1c,0xe1c,0xe1c,0xe1c,0xe1c,0xe1c,0xe1c,0xe1c,0xe1c,0xe25,0xe25,0xe25,0xe25, -0xe25,0xe25,0xe25,0xe25,0xe25,0xe25,0xe25,0xe25,0xe25,0xe25,0xe25,0xe25,0xe25,0xe25,0xe25,0xe25, -0xe25,0xe25,0xe25,0xe25,0xe25,0xe25,0xe25,0xe25,0xe25,0xe25,0xe25,0xe25,0xe2e,0xe2e,0xe2e,0xe2e, -0xe2e,0xe2e,0xe2e,0xe2e,0xe2e,0xe2e,0xe2e,0xe2e,0xe2e,0xe2e,0xe2e,0xe2e,0xe2e,0xe2e,0xe2e,0xe2e, -0xe2e,0xe2e,0xe2e,0xe2e,0xe2e,0xe2e,0xe2e,0xe2e,0xe2e,0xe2e,0xe2e,0xe28,0xe2b,0xe2b,0xe2b,0xe2b, -0xe2b,0xe2b,0xe2b,0xe2b,0xe2b,0xe2b,0xe2b,0xe2b,0xe2b,0xe2b,0xe2b,0xe2b,0xe2b,0xe2b,0xe2b,0xe2b, -0xe2b,0xe2b,0xe2b,0xe2b,0xe2b,0xe2b,0xe2b,0xe2e,0xe2e,0xe2e,0xe2e,0xe2e,0xe37,0xe37,0xe37,0xe37, -0xe37,0xe37,0xe37,0xe37,0xe37,0xe37,0xe37,0xe37,0xe37,0xe37,0xe34,0xe34,0xe34,0xe34,0xe34,0xe34, -0xe34,0xe34,0xe31,0xe3a,0xfe1,0xfdb,0xfea,0xfd8,0xe37,0xe37,0xfd8,0xfd8,0xe4c,0xe4c,0xe3d,0xe4c, -0xe4c,0xe4c,0xe43,0xe4c,0xe4c,0xe4c,0xe4c,0xe3d,0xe4c,0xe4c,0xe4c,0xe4c,0xe4c,0xe4c,0xe4c,0xe4c, -0xe4c,0xe4c,0xe4c,0xe4c,0xe4c,0xe4c,0xe4c,0xe4c,0xe4c,0xe4c,0xe4c,0xe4c,0xe4f,0xe4f,0xe4f,0xe4f, -0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f, -0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe67,0xe67,0xe67,0xe67, -0xe67,0xe67,0xe67,0xe67,0xe67,0xe67,0xe67,0xe67,0xe67,0xe67,0xe67,0xe67,0xe67,0xe67,0xe67,0xe67, -0xe67,0xe67,0xe67,0xe67,0xe67,0xe67,0xe67,0xe67,0xe67,0xe67,0xe67,0xe67,0xe85,0xe85,0xe85,0xe85, -0xe85,0xe85,0xe85,0xe85,0xe85,0xe85,0xe85,0xe85,0xe85,0xe85,0xe85,0xe85,0x10e0,0x10e0,0x10e0,0x10e0, -0x10e0,0x10e0,0x10e0,0x10e0,0x10e0,0x10e0,0x10e0,0x10e0,0x10e0,0x10e0,0x10e0,0x10e0,0xecd,0xecd,0xecd,0xecd, -0xfc6,0xfc6,0xfc6,0xfc6,0xfc6,0xfc6,0xfc6,0xfc6,0xfc6,0xfc6,0xfc6,0xfc6,0xfc9,0xfc9,0xfc9,0xfc9, -0xfc9,0xfc9,0xfc9,0xfc9,0xfc9,0xfc9,0xfc9,0xfc9,0xfc9,0xfc9,0xfc9,0xfc9,0xeee,0xeee,0xeee,0xeee, -0xf00,0xf09,0xf0c,0xf09,0xf0c,0xf09,0xf0c,0xf09,0xf0c,0xf09,0xf0c,0xf09,0xf09,0xf09,0xf0c,0xf09, -0xf09,0xf09,0xf09,0xf09,0xf09,0xf09,0xf09,0xf09,0xf09,0xf09,0xf09,0xf09,0xf09,0xf09,0xf09,0xf09, -0xf09,0xf09,0xf09,0xf09,0xef1,0xf00,0xeee,0xeee,0xeee,0xeee,0xeee,0xf03,0xeee,0xf03,0xf00,0xf00, -0xf15,0xf12,0xf15,0xf15,0xf15,0xf12,0xf12,0xf15,0xf12,0xf15,0xf12,0xf15,0xf12,0xffc,0xffc,0xffc, -0x1137,0xff3,0xffc,0xff3,0xf12,0xf15,0xf12,0xf12,0xff3,0xff3,0xff3,0xff3,0xff6,0xff9,0x1137,0x1137, -0xf18,0xf18,0x100e,0x1005,0x100e,0x1005,0x100e,0x1005,0x100e,0x1005,0x100e,0x1005,0x100e,0x1005,0x100e,0x1005, -0x1005,0x1005,0x100e,0x1005,0x100e,0x1005,0x100e,0x1005,0x100e,0x1005,0x100e,0x1005,0x100e,0x1005,0x100e,0x1005, -0xf1e,0xf1e,0xf1e,0xf1e,0xf1e,0xf1e,0xf1e,0xf1e,0xf1e,0xf1e,0xf1e,0xf1e,0xf1e,0xf1e,0xf1e,0xf1e, +0xcfc,0xcfc,0xcfc,0xcfc,0xcfc,0xcfc,0xcfc,0xcfc,0xcfc,0xcfc,0xcfc,0xcfc,0xd08,0xd08,0xd08,0xd08, +0xd08,0xd0b,0xd0b,0xd0b,0xd08,0xd08,0xd08,0xd08,0xd08,0xd08,0xdd1,0xdd1,0xdd1,0xdd1,0xdd1,0xdd1, +0xee2,0xee2,0xee2,0xee2,0xee2,0xee2,0xee2,0x10ec,0x10ec,0xfdb,0xfdb,0xfdb,0xd0e,0xd0e,0xd0e,0xd0e, +0xd0e,0xd0e,0xd0e,0xd0e,0xd0e,0xd0e,0xd0e,0xd0e,0xd0e,0xd0e,0xd0e,0xd0e,0xd0e,0xd0e,0xd0e,0xd0e, +0xd0e,0xd0e,0xd0e,0xd0e,0xd0e,0xd0e,0xd0e,0xd0e,0xd0e,0xd0e,0xd0e,0xd0e,0xd14,0xd14,0xd14,0xd14, +0xd14,0xd14,0xd14,0xd14,0xd14,0xd14,0xd14,0xd14,0xd14,0xd14,0xd14,0xd14,0xd14,0xd14,0xd14,0xd14, +0xd14,0xd14,0xd14,0xd14,0xd14,0xd14,0xd14,0xd14,0xd14,0xd14,0xd14,0xd14,0xd1d,0xd1d,0xd1d,0xd1d, +0xd1d,0xd1d,0xd1d,0xd1d,0xd1d,0xd1d,0xd1d,0xd1d,0xd1d,0xd1d,0xd1d,0xd1d,0xd1d,0xd1d,0xd1d,0xd1d, +0xd1d,0xd1d,0xd1d,0xd1d,0xd1d,0xd1d,0xd1d,0xd1d,0xd1d,0xd1d,0xd1d,0xd1d,0xd29,0xd29,0xd29,0xd29, +0xd29,0xd29,0xd29,0xd29,0xd29,0xd29,0xd29,0xd29,0xd29,0xd29,0xd29,0xd29,0xd29,0xd29,0xd29,0xd29, +0xd29,0xd29,0xd29,0xd29,0xd29,0xd29,0xd29,0xd29,0xd29,0xd29,0xd29,0xd29,0xd35,0xd35,0xd35,0xd35, +0xd35,0xd35,0xd35,0xd35,0xd35,0xd35,0xd35,0xd35,0xd35,0xd35,0xd35,0xd35,0xd35,0xd35,0xd35,0xd35, +0xd35,0xd35,0xd35,0xd35,0xd35,0xd35,0xd35,0xd35,0xd35,0xd35,0xd35,0xd35,0xdd7,0xdd7,0xdd7,0xdd7, +0xdd7,0xdd7,0xdd7,0xdd7,0xdd7,0xdd7,0xdd7,0xdd7,0xdd7,0xdd7,0xdd7,0xdd7,0xdd7,0xdd7,0xdd7,0xdd7, +0xdd7,0xdd7,0xdd7,0xdd7,0xdd7,0xdd7,0xdd7,0xdd7,0xdd7,0xdd7,0xdd7,0xdd7,0xddd,0xddd,0xddd,0xddd, +0xddd,0xddd,0xddd,0xddd,0xddd,0xddd,0xddd,0xddd,0xddd,0xddd,0xddd,0xddd,0xddd,0xddd,0xddd,0xddd, +0xddd,0xdda,0xdda,0xdda,0xdda,0xdda,0xdda,0xdda,0xdda,0xdda,0xdda,0xdda,0xddd,0xddd,0xddd,0xddd, +0xddd,0xddd,0xddd,0xddd,0xddd,0xddd,0xddd,0xddd,0xddd,0xddd,0xddd,0xddd,0xddd,0xddd,0xddd,0xddd, +0xddd,0xddd,0xddd,0xddd,0xddd,0xddd,0xddd,0xddd,0xddd,0xddd,0xddd,0xddd,0xe9d,0xe9d,0xdef,0xdef, +0xee5,0xee5,0xee5,0xee5,0xee5,0xee5,0xee5,0xfe7,0xfe7,0xfe7,0xfe7,0xfe7,0xfe4,0xfe4,0xfe4,0xfe4, +0xfe4,0xfe4,0xfe4,0xfe4,0xfe4,0xfe4,0xfe4,0xfe4,0xfe4,0xfe4,0xfe4,0xfe4,0xdfe,0xdfb,0xdfe,0xdfb, +0xdfe,0xdfb,0xdfe,0xdfb,0xdfe,0xdfb,0xdfe,0xdfb,0xdfe,0xdfb,0xdfe,0xdfb,0xdfe,0xdfb,0xdfe,0xdfb, +0xdfe,0xdfb,0xdfe,0xdfb,0xdfe,0xdfb,0xdfe,0xdfb,0xdfe,0xdfb,0xdfe,0xdfb,0xe0a,0xe0a,0xe0a,0xe0a, +0xe0a,0xe0a,0xe0a,0xe0a,0xe0a,0xe0a,0xe0a,0xe0a,0xe0a,0xe0a,0xe0a,0xe0a,0xe0a,0xe0a,0xe0a,0xe0a, +0xe0a,0xe0a,0xe0a,0xe0a,0xe0a,0xe0a,0xe0a,0xe0a,0xe0a,0xe0a,0xe0a,0xe0a,0xe10,0xe10,0xe10,0xe10, +0xe10,0xe10,0xe10,0xe10,0xe10,0xe10,0xe10,0xe10,0xe10,0xe10,0xe10,0xe10,0xe10,0xe10,0xe10,0xe10, +0xe10,0xe10,0xe10,0xe10,0xe10,0xe10,0xe10,0xe10,0xe10,0xe10,0xe10,0xe10,0xe28,0xe28,0xe28,0xe28, +0xe28,0xe28,0xe28,0xe28,0xe28,0xe28,0xe28,0xe28,0xe28,0xe28,0xe28,0xe28,0xe28,0xe28,0xe28,0xe28, +0xe28,0xe28,0xe28,0xee8,0xee8,0xee8,0xee8,0xfea,0xfea,0xfea,0xfea,0xfea,0xe31,0xe31,0xe31,0xe31, +0xe31,0xe31,0xe31,0xe31,0xe31,0xe31,0xe31,0xe31,0xe31,0xe31,0xe31,0xe31,0xe31,0xe31,0xe31,0xe31, +0xe31,0xe31,0xe31,0xe31,0xe31,0xe31,0xe31,0xe31,0xe31,0xe31,0xe31,0xe31,0xe3a,0xe3a,0xe3a,0xe3a, +0xe3a,0xe3a,0xe3a,0xe3a,0xe3a,0xe3a,0xe3a,0xe3a,0xe3a,0xe3a,0xe3a,0xe3a,0xe3a,0xe3a,0xe3a,0xe3a, +0xe3a,0xe3a,0xe3a,0xe3a,0xe3a,0xe3a,0xe3a,0xe3a,0xe3a,0xe3a,0xe3a,0xe3a,0xe43,0xe43,0xe43,0xe43, +0xe43,0xe43,0xe43,0xe43,0xe43,0xe43,0xe43,0xe43,0xe43,0xe43,0xe43,0xe43,0xe43,0xe43,0xe43,0xe43, +0xe43,0xe43,0xe43,0xe43,0xe43,0xe43,0xe43,0xe43,0xe43,0xe43,0xe43,0xe3d,0xe40,0xe40,0xe40,0xe40, +0xe40,0xe40,0xe40,0xe40,0xe40,0xe40,0xe40,0xe40,0xe40,0xe40,0xe40,0xe40,0xe40,0xe40,0xe40,0xe40, +0xe40,0xe40,0xe40,0xe40,0xe40,0xe40,0xe40,0xe43,0xe43,0xe43,0xe43,0xe43,0xe4c,0xe4c,0xe4c,0xe4c, +0xe4c,0xe4c,0xe4c,0xe4c,0xe4c,0xe4c,0xe4c,0xe4c,0xe4c,0xe4c,0xe49,0xe49,0xe49,0xe49,0xe49,0xe49, +0xe49,0xe49,0xe46,0xe4f,0xff6,0xff0,0xfff,0xfed,0xe4c,0xe4c,0xfed,0xfed,0xe61,0xe61,0xe52,0xe61, +0xe61,0xe61,0xe58,0xe61,0xe61,0xe61,0xe61,0xe52,0xe61,0xe61,0xe61,0xe61,0xe61,0xe61,0xe61,0xe61, +0xe61,0xe61,0xe61,0xe61,0xe61,0xe61,0xe61,0xe61,0xe61,0xe61,0xe61,0xe61,0xe64,0xe64,0xe64,0xe64, +0xe64,0xe64,0xe64,0xe64,0xe64,0xe64,0xe64,0xe64,0xe64,0xe64,0xe64,0xe64,0xe64,0xe64,0xe64,0xe64, +0xe64,0xe64,0xe64,0xe64,0xe64,0xe64,0xe64,0xe64,0xe64,0xe64,0xe64,0xe64,0xe7c,0xe7c,0xe7c,0xe7c, +0xe7c,0xe7c,0xe7c,0xe7c,0xe7c,0xe7c,0xe7c,0xe7c,0xe7c,0xe7c,0xe7c,0xe7c,0xe7c,0xe7c,0xe7c,0xe7c, +0xe7c,0xe7c,0xe7c,0xe7c,0xe7c,0xe7c,0xe7c,0xe7c,0xe7c,0xe7c,0xe7c,0xe7c,0xe9a,0xe9a,0xe9a,0xe9a, +0xe9a,0xe9a,0xe9a,0xe9a,0xe9a,0xe9a,0xe9a,0xe9a,0xe9a,0xe9a,0xe9a,0xe9a,0x10f5,0x10f5,0x10f5,0x10f5, +0x10f5,0x10f5,0x10f5,0x10f5,0x10f5,0x10f5,0x10f5,0x10f5,0x10f5,0x10f5,0x10f5,0x10f5,0xecd,0xecd,0xecd,0xeca, +0xeca,0xeca,0xeca,0xeca,0x112e,0x137a,0x137a,0x137a,0x137a,0x12fc,0x12fc,0x12fc,0x137d,0x12ff,0x12ff,0x137d, +0x14cd,0x14cd,0x14cd,0x14cd,0x14d0,0x14d0,0x14d0,0x1797,0x1797,0x1797,0x1797,0x185d,0xee2,0xee2,0xee2,0xee2, +0xfdb,0xfdb,0xfdb,0xfdb,0xfdb,0xfdb,0xfdb,0xfdb,0xfdb,0xfdb,0xfdb,0xfdb,0xfde,0xfde,0xfde,0xfde, +0xfde,0xfde,0xfde,0xfde,0xfde,0xfde,0xfde,0xfde,0xfde,0xfde,0xfde,0xfde,0xf03,0xf03,0xf03,0xf03, +0xf15,0xf1e,0xf21,0xf1e,0xf21,0xf1e,0xf21,0xf1e,0xf21,0xf1e,0xf21,0xf1e,0xf1e,0xf1e,0xf21,0xf1e, 0xf1e,0xf1e,0xf1e,0xf1e,0xf1e,0xf1e,0xf1e,0xf1e,0xf1e,0xf1e,0xf1e,0xf1e,0xf1e,0xf1e,0xf1e,0xf1e, -0xf2d,0xf2d,0xf2d,0xf2d,0xf2d,0xf2d,0xf2d,0xf2d,0xf2d,0xf2d,0xf2d,0xf2d,0xf2d,0xf2d,0xf2d,0xf2d, -0xf2d,0xf2d,0xf2d,0xf2d,0xf2d,0xf2d,0xf2d,0xf2d,0xf2d,0xf2d,0xf2d,0xf2d,0xf2d,0xf2d,0xf2d,0xf2d, -0xf2d,0xf2d,0xf2d,0x14f7,0x14f7,0x14f7,0x14f7,0x14f7,0x14f7,0x14f7,0x14f7,0x14f7,0x14f7,0x14f7,0x14f7,0x14f7, -0x14f7,0x14f7,0x14f7,0x14f7,0xf33,0xf33,0xf33,0xf33,0xf33,0xf33,0xf33,0xf33,0xf33,0xf33,0xf33,0xf33, +0xf1e,0xf1e,0xf1e,0xf1e,0xf06,0xf15,0xf03,0xf03,0xf03,0xf03,0xf03,0xf18,0xf03,0xf18,0xf15,0xf15, +0xf2a,0xf27,0xf2a,0xf2a,0xf2a,0xf27,0xf27,0xf2a,0xf27,0xf2a,0xf27,0xf2a,0xf27,0x1011,0x1011,0x1011, +0x114c,0x1008,0x1011,0x1008,0xf27,0xf2a,0xf27,0xf27,0x1008,0x1008,0x1008,0x1008,0x100b,0x100e,0x114c,0x114c, +0xf2d,0xf2d,0x1023,0x101a,0x1023,0x101a,0x1023,0x101a,0x1023,0x101a,0x1023,0x101a,0x1023,0x101a,0x1023,0x101a, +0x101a,0x101a,0x1023,0x101a,0x1023,0x101a,0x1023,0x101a,0x1023,0x101a,0x1023,0x101a,0x1023,0x101a,0x1023,0x101a, 0xf33,0xf33,0xf33,0xf33,0xf33,0xf33,0xf33,0xf33,0xf33,0xf33,0xf33,0xf33,0xf33,0xf33,0xf33,0xf33, -0xf33,0xf33,0xf33,0xf33,0xf7b,0xf96,0xf8d,0xf8a,0xf8a,0xf96,0xf96,0xf8d,0xf8d,0xf8a,0xf8a,0xf8a, -0xf8a,0xf8a,0xf96,0xf96,0xf96,0xf7b,0xf7b,0xf7b,0xf7b,0xf96,0xf96,0xf96,0xf96,0xf96,0xf96,0xf96, -0xf96,0xf96,0xf96,0xf96,0xf96,0xf96,0xf7b,0xf8d,0xf90,0xf7b,0xf7b,0xf93,0xf93,0xf93,0xf93,0xf93, -0xf93,0xf7e,0xf96,0xf93,0xf87,0xf87,0xf87,0xf87,0xf87,0xf87,0xf87,0xf87,0xf87,0xf87,0x1101,0x1101, -0x10fe,0x10fb,0xf84,0xf84,0xfae,0xfae,0xfae,0xfae,0x126f,0x126f,0x1245,0x1245,0x124b,0x1242,0x1242,0x1242, -0x1242,0x1245,0x136b,0x124b,0x1245,0x124b,0x1242,0x124b,0x126f,0x1242,0x1242,0x1242,0x1245,0x1245,0x1242,0x1242, -0x1245,0x1242,0x1242,0x1245,0xfc9,0xfc9,0xfc9,0xfc9,0xfc9,0xfc6,0xfc6,0xfc9,0xfc9,0xfc9,0xfc9,0xfc9, -0xfc9,0x14d0,0x14d0,0x14d0,0x10d7,0xfc6,0xfc6,0xfc6,0xfc6,0x127b,0x1254,0x1254,0x1254,0x1254,0x14d0,0x14d0, -0x14d0,0x14d0,0x14d0,0x14d0,0xfe7,0xfe7,0xfe4,0xfde,0xfe4,0xfde,0xfe4,0xfde,0xfe4,0xfde,0xfdb,0xfdb, -0xfdb,0xfdb,0xff0,0xfed,0xfdb,0x1134,0x13cb,0x13ce,0x13ce,0x13cb,0x13cb,0x13cb,0x13cb,0x13cb,0x13d1,0x13d1, -0x14eb,0x14df,0x14df,0x14dc,0x100e,0x1005,0x100e,0x1005,0x100e,0x1005,0x100e,0x1005,0x1002,0xfff,0xfff,0x100e, -0x1005,0x130b,0x1308,0x16da,0x130b,0x1308,0x13da,0x13d7,0x14ee,0x14ee,0x14f4,0x14ee,0x14f4,0x14ee,0x14f4,0x14ee, -0x14f4,0x14ee,0x14f4,0x14ee,0x100e,0x1005,0x100e,0x1005,0x100e,0x1005,0x100e,0x1005,0x100e,0x1005,0x100e,0x1005, -0x100e,0x1005,0x100e,0x1005,0x100e,0x1005,0x100e,0x1005,0x100e,0x1005,0x100e,0x1005,0x100e,0x1005,0x100e,0x1005, -0x100e,0x1005,0x100e,0x1005,0x1008,0x1005,0x1005,0x1005,0x1005,0x1005,0x1005,0x1005,0x1005,0x100e,0x1005,0x100e, -0x1005,0x100e,0x100e,0x1005,0x1011,0x1011,0x1017,0x101d,0x101d,0x101d,0x101d,0x101d,0x101d,0x101d,0x101d,0x101d, -0x101d,0x101d,0x101d,0x101d,0x101d,0x101d,0x101d,0x101d,0x101d,0x101d,0x101d,0x101d,0x101d,0x101d,0x101d,0x101d, -0x101d,0x101d,0x101d,0x101d,0x101d,0x1017,0x1011,0x1011,0x1011,0x1011,0x1017,0x1017,0x1011,0x1011,0x101a,0x13e3, -0x13e0,0x13e0,0x101d,0x101d,0x1014,0x1014,0x1014,0x1014,0x1014,0x1014,0x1014,0x1014,0x1014,0x1014,0x13e6,0x13e6, -0x13e6,0x13e6,0x13e6,0x13e6,0x1032,0x1032,0x1032,0x1032,0x1032,0x1032,0x1032,0x1032,0x1032,0x1032,0x1032,0x1032, +0xf33,0xf33,0xf33,0xf33,0xf33,0xf33,0xf33,0xf33,0xf33,0xf33,0xf33,0xf33,0xf33,0xf33,0xf33,0xf33, +0xf42,0xf42,0xf42,0xf42,0xf42,0xf42,0xf42,0xf42,0xf42,0xf42,0xf42,0xf42,0xf42,0xf42,0xf42,0xf42, +0xf42,0xf42,0xf42,0xf42,0xf42,0xf42,0xf42,0xf42,0xf42,0xf42,0xf42,0xf42,0xf42,0xf42,0xf42,0xf42, +0xf42,0xf42,0xf42,0x150c,0x150c,0x150c,0x150c,0x150c,0x150c,0x150c,0x150c,0x150c,0x150c,0x150c,0x150c,0x150c, +0x150c,0x150c,0x150c,0x150c,0xf48,0xf48,0xf48,0xf48,0xf48,0xf48,0xf48,0xf48,0xf48,0xf48,0xf48,0xf48, +0xf48,0xf48,0xf48,0xf48,0xf48,0xf48,0xf48,0xf48,0xf48,0xf48,0xf48,0xf48,0xf48,0xf48,0xf48,0xf48, +0xf48,0xf48,0xf48,0xf48,0xf90,0xfab,0xfa2,0xf9f,0xf9f,0xfab,0xfab,0xfa2,0xfa2,0xf9f,0xf9f,0xf9f, +0xf9f,0xf9f,0xfab,0xfab,0xfab,0xf90,0xf90,0xf90,0xf90,0xfab,0xfab,0xfab,0xfab,0xfab,0xfab,0xfab, +0xfab,0xfab,0xfab,0xfab,0xfab,0xfab,0xf90,0xfa2,0xfa5,0xf90,0xf90,0xfa8,0xfa8,0xfa8,0xfa8,0xfa8, +0xfa8,0xf93,0xfab,0xfa8,0xf9c,0xf9c,0xf9c,0xf9c,0xf9c,0xf9c,0xf9c,0xf9c,0xf9c,0xf9c,0x1116,0x1116, +0x1113,0x1110,0xf99,0xf99,0xfc3,0xfc3,0xfc3,0xfc3,0x1284,0x1284,0x125a,0x125a,0x1260,0x1257,0x1257,0x1257, +0x1257,0x125a,0x1380,0x1260,0x125a,0x1260,0x1257,0x1260,0x1284,0x1257,0x1257,0x1257,0x125a,0x125a,0x1257,0x1257, +0x125a,0x1257,0x1257,0x125a,0xfde,0xfde,0xfde,0xfde,0xfde,0xfdb,0xfdb,0xfde,0xfde,0xfde,0xfde,0xfde, +0xfde,0x14e5,0x14e5,0x14e5,0x10ec,0xfdb,0xfdb,0xfdb,0xfdb,0x1290,0x1269,0x1269,0x1269,0x1269,0x14e5,0x14e5, +0x14e5,0x14e5,0x14e5,0x14e5,0xffc,0xffc,0xff9,0xff3,0xff9,0xff3,0xff9,0xff3,0xff9,0xff3,0xff0,0xff0, +0xff0,0xff0,0x1005,0x1002,0xff0,0x1149,0x13e0,0x13e3,0x13e3,0x13e0,0x13e0,0x13e0,0x13e0,0x13e0,0x13e6,0x13e6, +0x1500,0x14f4,0x14f4,0x14f1,0x1023,0x101a,0x1023,0x101a,0x1023,0x101a,0x1023,0x101a,0x1017,0x1014,0x1014,0x1023, +0x101a,0x1320,0x131d,0x16ef,0x1320,0x131d,0x13ef,0x13ec,0x1503,0x1503,0x1509,0x1503,0x1509,0x1503,0x1509,0x1503, +0x1509,0x1503,0x1509,0x1503,0x1023,0x101a,0x1023,0x101a,0x1023,0x101a,0x1023,0x101a,0x1023,0x101a,0x1023,0x101a, +0x1023,0x101a,0x1023,0x101a,0x1023,0x101a,0x1023,0x101a,0x1023,0x101a,0x1023,0x101a,0x1023,0x101a,0x1023,0x101a, +0x1023,0x101a,0x1023,0x101a,0x101d,0x101a,0x101a,0x101a,0x101a,0x101a,0x101a,0x101a,0x101a,0x1023,0x101a,0x1023, +0x101a,0x1023,0x1023,0x101a,0x1026,0x1026,0x102c,0x1032,0x1032,0x1032,0x1032,0x1032,0x1032,0x1032,0x1032,0x1032, 0x1032,0x1032,0x1032,0x1032,0x1032,0x1032,0x1032,0x1032,0x1032,0x1032,0x1032,0x1032,0x1032,0x1032,0x1032,0x1032, -0x1032,0x1032,0x1032,0x1032,0x103b,0x103b,0x103b,0x103b,0x103b,0x103b,0x103b,0x103b,0x103b,0x103b,0x103b,0x103b, -0x103b,0x103b,0x103b,0x103b,0x103b,0x103b,0x103b,0x103b,0x103b,0x103b,0x103b,0x103b,0x103e,0x103e,0x103e,0x1041, -0x103e,0x103e,0x1044,0x1044,0x1047,0x1047,0x1047,0x1047,0x1047,0x1047,0x1047,0x1047,0x1047,0x1047,0x1047,0x1047, +0x1032,0x1032,0x1032,0x1032,0x1032,0x102c,0x1026,0x1026,0x1026,0x1026,0x102c,0x102c,0x1026,0x1026,0x102f,0x13f8, +0x13f5,0x13f5,0x1032,0x1032,0x1029,0x1029,0x1029,0x1029,0x1029,0x1029,0x1029,0x1029,0x1029,0x1029,0x13fb,0x13fb, +0x13fb,0x13fb,0x13fb,0x13fb,0x1047,0x1047,0x1047,0x1047,0x1047,0x1047,0x1047,0x1047,0x1047,0x1047,0x1047,0x1047, 0x1047,0x1047,0x1047,0x1047,0x1047,0x1047,0x1047,0x1047,0x1047,0x1047,0x1047,0x1047,0x1047,0x1047,0x1047,0x1047, 0x1047,0x1047,0x1047,0x1047,0x1050,0x1050,0x1050,0x1050,0x1050,0x1050,0x1050,0x1050,0x1050,0x1050,0x1050,0x1050, -0x1053,0x104a,0x1059,0x1056,0x1050,0x1050,0x1050,0x1050,0x1050,0x1050,0x1050,0x1050,0x1050,0x1050,0x1050,0x1050, -0x1050,0x1050,0x1050,0x1050,0x1050,0x1050,0x1050,0x1050,0x1050,0x1050,0x1050,0x1050,0x1050,0x1050,0x1050,0x1050, -0x1050,0x1050,0x1050,0x1050,0x1311,0x130e,0x106b,0x1065,0x106b,0x1065,0x106b,0x1065,0x106b,0x1065,0x106b,0x1065, -0x106b,0x1065,0x1068,0x10e9,0x105c,0x105c,0x105c,0x1062,0x13e9,0x13e9,0x13e9,0x13e9,0x13e9,0x13e9,0x13e9,0x13e9, -0x105f,0x105f,0x1062,0x106e,0x106b,0x1065,0x106b,0x1065,0x106b,0x1065,0x106b,0x1065,0x106b,0x1065,0x106b,0x1065, -0x106b,0x1065,0x106b,0x1065,0x106b,0x1065,0x106b,0x1065,0x106b,0x1065,0x106b,0x1065,0x106b,0x1065,0x106b,0x1065, -0x106b,0x1065,0x106b,0x1065,0x1503,0x1500,0x1503,0x1500,0x1506,0x1506,0x16e3,0x13e9,0x1077,0x1077,0x107a,0x107a, -0x107a,0x107a,0x107a,0x107a,0x107a,0x107a,0x107a,0x107a,0x107a,0x107a,0x107a,0x107a,0x107a,0x107a,0x107a,0x107a, -0x107a,0x107a,0x107a,0x107a,0x107a,0x107a,0x107a,0x107a,0x107a,0x107a,0x107a,0x107a,0x1077,0x1077,0x1077,0x1077, -0x1077,0x1077,0x1077,0x1077,0x1077,0x1077,0x1077,0x1077,0x1089,0x1089,0x1089,0x1089,0x1089,0x1089,0x1080,0x1080, -0x1080,0x1080,0x1080,0x1083,0x1083,0x1083,0x10dd,0x108c,0x109b,0x109b,0x109b,0x109b,0x109b,0x109b,0x109b,0x109b, -0x109b,0x109b,0x109b,0x109b,0x109b,0x109b,0x109b,0x109b,0x1086,0x1086,0x1086,0x1086,0x1086,0x1086,0x1086,0x1086, -0x1086,0x1086,0x1089,0x1089,0x1089,0x1089,0x1089,0x1089,0x1089,0x1089,0x1089,0x1089,0x1089,0x1089,0x1089,0x1089, -0x1089,0x1089,0x1089,0x1089,0x1089,0x1089,0x1089,0x1089,0x10aa,0x10aa,0x10aa,0x10aa,0x10aa,0x10aa,0x10aa,0x10aa, -0x10aa,0x10aa,0x10aa,0x10aa,0x10aa,0x10aa,0x10aa,0x10aa,0x10aa,0x10aa,0x10aa,0x10aa,0x10aa,0x10aa,0x10aa,0x10aa, -0x10aa,0x10aa,0x10aa,0x10aa,0x10aa,0x10aa,0x10aa,0x10aa,0x10bc,0x10bc,0x10bc,0x10bc,0x10bc,0x10bc,0x10bc,0x10bc, -0x10bc,0x10bc,0x10bc,0x10bc,0x10bc,0x10bc,0x10bc,0x10bc,0x10bc,0x10bc,0x10bc,0x10bc,0x10bc,0x10bc,0x10bc,0x10bc, -0x10bc,0x10bc,0x10bc,0x10bc,0x10bc,0x10bc,0x10bc,0x10bc,0x10c5,0x10c5,0x10c5,0x10c5,0x10da,0x10c5,0x10c5,0x10c5, -0x10c5,0x10c5,0x10c5,0x10c5,0x10c5,0x10c5,0x10c5,0x10c5,0x10c5,0x10c5,0x10c5,0x10c5,0x10c5,0x10c5,0x10c5,0x10c5, -0x10c5,0x10c5,0x10c5,0x10c5,0x10c5,0x10c5,0x10c5,0x10c5,0x10c8,0x10c8,0x10c8,0x10c8,0x10c8,0x10c8,0x10c8,0x10c8, -0x10c8,0x10c8,0x10c8,0x10c8,0x10c8,0x10c8,0x10c8,0x10c8,0x10c8,0x10c8,0x10c8,0x10c8,0x10c8,0x10c8,0x10c8,0x10c8, -0x10c8,0x10c8,0x10c8,0x10c8,0x10c8,0x10c8,0x10c8,0x10c8,0x1149,0x1149,0x1149,0x1149,0x1149,0x1149,0x1149,0x1149, -0x1149,0x1149,0x1149,0x1149,0x1149,0x1149,0x1149,0x1149,0x1149,0x1149,0x1149,0x1149,0x1149,0x1149,0x1140,0x1140, -0x1143,0x1143,0x1149,0x1140,0x1140,0x1140,0x1140,0x1140,0x114c,0x114c,0x114c,0x114c,0x114c,0x114c,0x114c,0x114c, -0x114c,0x114c,0x114c,0x114c,0x114c,0x114c,0x114c,0x114c,0x114c,0x114c,0x114c,0x114c,0x114c,0x114c,0x114c,0x114c, -0x114c,0x114c,0x114c,0x114c,0x114c,0x114c,0x114c,0x114c,0x1167,0x1167,0x1167,0x1167,0x1167,0x1167,0x1167,0x1167, -0x1167,0x1167,0x1167,0x1167,0x1167,0x1167,0x1167,0x1167,0x1167,0x1167,0x1167,0x1167,0x1167,0x1167,0x1167,0x1167, -0x1167,0x1167,0x1167,0x1167,0x1167,0x1167,0x1167,0x1167,0x1173,0x1173,0x1173,0x1173,0x1173,0x1173,0x1173,0x1173, -0x1173,0x1173,0x1173,0x1173,0x1173,0x1173,0x1173,0x1173,0x1173,0x1173,0x1173,0x1173,0x1173,0x1173,0x1173,0x1173, -0x1173,0x1173,0x1173,0x1173,0x1173,0x1173,0x1170,0x1176,0x1182,0x1182,0x1182,0x1182,0x1182,0x1182,0x1182,0x1182, -0x1182,0x1182,0x1182,0x1182,0x1182,0x1182,0x1182,0x1182,0x1182,0x1182,0x1182,0x1182,0x1182,0x1182,0x1182,0x1182, -0x1182,0x1182,0x1182,0x1182,0x1182,0x1182,0x1182,0x1182,0x1191,0x1191,0x1191,0x11a0,0x11a6,0x11a6,0x11a6,0x11a6, -0x11a6,0x11a6,0x11a6,0x11a6,0x11a6,0x11a6,0x11a6,0x11a6,0x11a6,0x11a6,0x11a6,0x11a6,0x11a6,0x11a6,0x11a6,0x11a6, -0x11a6,0x11a6,0x11a6,0x11a6,0x11a6,0x11a6,0x11a6,0x11a6,0x11a6,0x11a6,0x11a6,0x1194,0x11a0,0x11a0,0x1191,0x1191, -0x1191,0x1191,0x11a0,0x11a0,0x1191,0x11a0,0x11a0,0x11a0,0x11b2,0x11b2,0x11b2,0x11b2,0x11b2,0x11b2,0x11b2,0x11b2, -0x11b2,0x11b2,0x11b2,0x11b2,0x11b2,0x11b2,0x11b2,0x11b2,0x11b5,0x11b2,0x11b2,0x11b2,0x11b2,0x11b2,0x11b2,0x11ac, -0x11ac,0x11ac,0x11b2,0x11af,0x150c,0x150f,0x1512,0x1512,0x11c4,0x11c4,0x11c4,0x11c4,0x11c4,0x11c4,0x11c4,0x11c4, -0x11c4,0x11c4,0x11c4,0x11c4,0x11c4,0x11c4,0x11c4,0x11c4,0x11b8,0x11c4,0x11b8,0x11b8,0x11b8,0x11cd,0x11cd,0x11b8, -0x11b8,0x11cd,0x11c4,0x11cd,0x11cd,0x11c4,0x11b8,0x11bb,0x11c4,0x11c4,0x11c4,0x11c4,0x11c4,0x11c4,0x11c4,0x11c4, -0x11c4,0x11c4,0x11c4,0x11c4,0x11c4,0x11c4,0x11c4,0x11c4,0x11c4,0x11c4,0x11c4,0x11c4,0x11c4,0x11c4,0x11c4,0x11c4, -0x11c4,0x11c4,0x11c4,0x11c4,0x11c4,0x11c4,0x11c4,0x11c4,0x11df,0x11df,0x11df,0x11df,0x11df,0x11df,0x11df,0x11df, -0x11df,0x11df,0x11df,0x11df,0x11df,0x11df,0x11df,0x11df,0x11df,0x11df,0x11df,0x11df,0x11df,0x11df,0x11df,0x11df, -0x11df,0x11df,0x11df,0x11df,0x11df,0x11df,0x11df,0x11df,0x11f7,0x11f7,0x11f7,0x11f7,0x11f7,0x11f7,0x11f7,0x11f7, -0x11f7,0x11f7,0x11f7,0x11f7,0x11f7,0x11f7,0x11f7,0x11f7,0x11f7,0x11f7,0x11f7,0x11f7,0x11f7,0x11f7,0x11f7,0x11f7, -0x11f7,0x11f7,0x11f7,0x11f7,0x11f7,0x11f4,0x11f4,0x11f4,0x1200,0x1200,0x1200,0x1200,0x1200,0x1200,0x1200,0x1200, -0x1200,0x1200,0x1200,0x1200,0x1200,0x1200,0x1200,0x1200,0x1200,0x1200,0x1200,0x1200,0x1200,0x1200,0x1200,0x1200, -0x1200,0x1200,0x1200,0x1200,0x1200,0x1200,0x1200,0x1200,0x120f,0x120f,0x120f,0x120f,0x120f,0x120f,0x120f,0x120f, -0x120f,0x120f,0x120f,0x120f,0x120f,0x120f,0x120f,0x120f,0x120f,0x120f,0x120f,0x120f,0x120f,0x120f,0x120f,0x120f, -0x120f,0x120f,0x120f,0x120f,0x120f,0x120f,0x120f,0x120f,0x122a,0x122a,0x122a,0x122a,0x122a,0x122a,0x122a,0x122a, -0x122a,0x122a,0x122a,0x122d,0x122a,0x122a,0x122a,0x122a,0x1227,0x1227,0x1227,0x121b,0x121b,0x121b,0x121b,0x1227, -0x1227,0x1221,0x121e,0x1224,0x1224,0x1215,0x1230,0x1230,0x1218,0x1218,0x1227,0x122a,0x122a,0x122a,0x122a,0x122a, -0x122a,0x122a,0x122a,0x122a,0x122a,0x122a,0x122a,0x122a,0x122a,0x122a,0x122a,0x122a,0x122a,0x122a,0x122a,0x122a, -0x122a,0x122a,0x122d,0x122a,0x122d,0x122a,0x122a,0x122a,0x1233,0x1233,0x1233,0x1233,0x1233,0x1233,0x1233,0x1233, -0x1233,0x1233,0x1233,0x1233,0x1233,0x1233,0x1233,0x1233,0x1233,0x1233,0x1233,0x1233,0x1233,0x1233,0x1233,0x1233, -0x1233,0x1233,0x1233,0x1233,0x1233,0x1233,0x1233,0x1233,0x1239,0x1239,0x1239,0x1236,0x1236,0x1236,0x1233,0x1233, -0x1233,0x1233,0x1236,0x1233,0x1233,0x1233,0x1239,0x1236,0x1239,0x1236,0x1233,0x1233,0x1233,0x1233,0x1233,0x1233, -0x1233,0x1233,0x1233,0x1233,0x1233,0x1233,0x1233,0x1233,0x1233,0x1233,0x1233,0x1233,0x1233,0x1233,0x1233,0x1233, -0x1233,0x1233,0x1233,0x1233,0x1233,0x1239,0x1236,0x1236,0x1233,0x1233,0x1233,0x1233,0x1245,0x1245,0x12ed,0x1242, -0x12ed,0x12ed,0x12ed,0x12ed,0x1242,0x1248,0x126f,0x1242,0x1242,0x1242,0x1242,0x1242,0x1248,0x124b,0x126f,0x126f, -0x124b,0x126f,0x1242,0x124b,0x124b,0x124e,0x126f,0x1242,0x1242,0x126f,0x1245,0x1245,0x135c,0x135c,0x135c,0x135c, -0x135c,0x135c,0x135c,0x135c,0x135c,0x135c,0x1257,0x1257,0x1257,0x1257,0x1377,0x1356,0x1260,0x1377,0x1377,0x1377, -0x1377,0x1377,0x1377,0x1377,0x1377,0x1377,0x1377,0x180f,0x180f,0x180f,0x180f,0x180f,0x135f,0x135f,0x1266,0x135f, -0x135f,0x135f,0x1266,0x135f,0x135f,0x135f,0x1260,0x1260,0x1260,0x1260,0x1260,0x1359,0x135c,0x135c,0x135c,0x135c, -0x135c,0x135c,0x135c,0x1263,0x135c,0x135c,0x135c,0x135c,0x135c,0x135c,0x135c,0x1263,0x128d,0x128d,0x128d,0x128d, -0x128d,0x128d,0x128d,0x128d,0x128d,0x128d,0x128d,0x128d,0x128d,0x128d,0x128d,0x128d,0x128d,0x128d,0x128d,0x128d, -0x128d,0x128d,0x128d,0x128d,0x128d,0x128d,0x128d,0x128d,0x128d,0x128d,0x128d,0x128d,0x132f,0x132f,0x132f,0x132f, -0x132f,0x132f,0x132f,0x132f,0x132f,0x132f,0x132f,0x132f,0x132f,0x132f,0x132f,0x132f,0x132f,0x132f,0x132f,0x132f, -0x132f,0x132f,0x132f,0x132f,0x132f,0x132f,0x132f,0x132f,0x132f,0x132f,0x132f,0x132f,0x1344,0x1335,0x1344,0x1347, -0x1347,0x1347,0x1347,0x1347,0x1347,0x1347,0x1347,0x1347,0x1347,0x1347,0x1347,0x1347,0x1347,0x1347,0x1347,0x1347, -0x1347,0x1347,0x1347,0x1347,0x1347,0x1347,0x1347,0x1347,0x1347,0x1347,0x1347,0x1347,0x1335,0x1335,0x1335,0x1335, -0x1335,0x1335,0x1335,0x1335,0x134d,0x134d,0x134d,0x134d,0x134d,0x134d,0x134d,0x134d,0x134d,0x134d,0x134d,0x134d, -0x134d,0x134d,0x134d,0x134d,0x134d,0x134d,0x134d,0x134d,0x134d,0x134d,0x134d,0x134d,0x134d,0x134d,0x134d,0x134d, -0x134d,0x134d,0x134d,0x134d,0x1353,0x1353,0x1353,0x1353,0x1353,0x1353,0x1353,0x1353,0x1353,0x1353,0x1353,0x1353, -0x1353,0x1353,0x1353,0x1353,0x1353,0x1353,0x1353,0x1353,0x1353,0x1353,0x1353,0x1353,0x1353,0x1353,0x1353,0x1353, -0x1353,0x1353,0x1353,0x1353,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c, -0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x1389,0x1389,0x138c,0x138c,0x138c,0x138c,0x138c, -0x1389,0x138c,0x138c,0x138c,0x1389,0x138c,0x1389,0x138c,0x1389,0x138c,0x138c,0x138c,0x138c,0x138c,0x1395,0x138c, -0x138c,0x138c,0x138c,0x1389,0x138c,0x1389,0x1389,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c, -0x138c,0x138c,0x138c,0x138c,0x1389,0x1389,0x1389,0x1389,0x1389,0x1389,0x1389,0x138c,0x138c,0x138c,0x138c,0x138c, -0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x1389,0x1389,0x1389,0x1389,0x1389, -0x1389,0x1389,0x1389,0x1389,0x1389,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c, -0x138c,0x138c,0x1389,0x1389,0x1389,0x1389,0x1389,0x1389,0x1389,0x1389,0x1389,0x1389,0x1389,0x1389,0x151e,0x151e, -0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c, -0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c, -0x138c,0x1527,0x1521,0x1521,0x1527,0x1527,0x1527,0x1527,0x1527,0x1527,0x1527,0x1527,0x1527,0x1764,0x1764,0x1764, -0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x1527,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c, -0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c, -0x138c,0x138c,0x138c,0x138c,0x138c,0x1527,0x1764,0x1764,0x138c,0x138c,0x138c,0x138c,0x138c,0x1395,0x138c,0x138c, -0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x1521,0x1521,0x1527,0x1527, -0x1521,0x1527,0x1527,0x1527,0x151e,0x151e,0x1527,0x1527,0x138c,0x138c,0x1392,0x1395,0x1395,0x1698,0x138c,0x1392, -0x138c,0x138c,0x1395,0x1530,0x152d,0x1527,0x1527,0x1764,0x1764,0x1764,0x1764,0x1764,0x1527,0x1527,0x1527,0x1527, -0x1527,0x1527,0x1527,0x1527,0x1527,0x1527,0x1527,0x1527,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c, -0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x1521,0x1521,0x1527,0x1698,0x1527,0x1521,0x1527, -0x1764,0x1764,0x1764,0x1767,0x1767,0x1767,0x1767,0x1767,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c, -0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c, -0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x1527,0x138c,0x1527,0x1395,0x1395,0x138c,0x138c,0x1395,0x1395, -0x1395,0x1395,0x1395,0x1395,0x1395,0x1395,0x1395,0x1395,0x1395,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c, -0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x1398,0x1398,0x1398,0x1398,0x1392,0x1392, -0x1392,0x1392,0x1395,0x1392,0x1395,0x1395,0x1395,0x1395,0x1395,0x1395,0x1395,0x1395,0x1395,0x138c,0x138c,0x138c, -0x1395,0x138c,0x138c,0x138c,0x138c,0x1395,0x1395,0x1395,0x138c,0x1395,0x1395,0x1395,0x138c,0x138c,0x138c,0x138f, -0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c, -0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x1698,0x138c,0x138c,0x138c,0x138c,0x1527,0x1521,0x1764, -0x13ef,0x13ef,0x13ef,0x13ef,0x151e,0x151e,0x151e,0x151e,0x151e,0x1524,0x1527,0x1764,0x1764,0x1764,0x1764,0x16ec, -0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c, -0x1521,0x1521,0x1521,0x1521,0x1521,0x1521,0x1521,0x1527,0x1527,0x1521,0x1521,0x1527,0x152d,0x1530,0x1527,0x1527, -0x1527,0x1527,0x1818,0x1521,0x1521,0x1521,0x1521,0x1521,0x1521,0x1527,0x1521,0x1527,0x1521,0x1521,0x1521,0x1521, -0x152a,0x1521,0x1521,0x1521,0x1521,0x1521,0x1521,0x1527,0x1521,0x1521,0x1521,0x1527,0x151e,0x151e,0x151e,0x151e, -0x151e,0x151e,0x1527,0x138c,0x138c,0x138c,0x138c,0x138c,0x1479,0x139b,0x139b,0x139b,0x139b,0x139b,0x139b,0x139b, -0x139b,0x139b,0x139b,0x139b,0x139b,0x139b,0x139b,0x139b,0x139b,0x1479,0x139b,0x139b,0x139b,0x1479,0x139b,0x1479, -0x139b,0x1479,0x139b,0x1479,0x139b,0x139b,0x139b,0x1479,0x139b,0x139b,0x139b,0x139b,0x139b,0x139b,0x1479,0x1479, -0x139b,0x139b,0x139b,0x139b,0x1479,0x139b,0x1479,0x1479,0x139b,0x139b,0x139b,0x139b,0x1479,0x139b,0x139b,0x139b, -0x139b,0x139b,0x139b,0x139b,0x139b,0x139b,0x139b,0x139b,0x139b,0x169e,0x169e,0x176a,0x176a,0x139e,0x139e,0x139e, -0x139b,0x139b,0x139b,0x139e,0x139e,0x139e,0x139e,0x139e,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d, -0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1, +0x1050,0x1050,0x1050,0x1050,0x1050,0x1050,0x1050,0x1050,0x1050,0x1050,0x1050,0x1050,0x1053,0x1053,0x1053,0x1056, +0x1053,0x1053,0x1059,0x1059,0x105c,0x105c,0x105c,0x105c,0x105c,0x105c,0x105c,0x105c,0x105c,0x105c,0x105c,0x105c, +0x105c,0x105c,0x105c,0x105c,0x105c,0x105c,0x105c,0x105c,0x105c,0x105c,0x105c,0x105c,0x105c,0x105c,0x105c,0x105c, +0x105c,0x105c,0x105c,0x105c,0x1065,0x1065,0x1065,0x1065,0x1065,0x1065,0x1065,0x1065,0x1065,0x1065,0x1065,0x1065, +0x1068,0x105f,0x106e,0x106b,0x1065,0x1065,0x1065,0x1065,0x1065,0x1065,0x1065,0x1065,0x1065,0x1065,0x1065,0x1065, +0x1065,0x1065,0x1065,0x1065,0x1065,0x1065,0x1065,0x1065,0x1065,0x1065,0x1065,0x1065,0x1065,0x1065,0x1065,0x1065, +0x1065,0x1065,0x1065,0x1065,0x1326,0x1323,0x1080,0x107a,0x1080,0x107a,0x1080,0x107a,0x1080,0x107a,0x1080,0x107a, +0x1080,0x107a,0x107d,0x10fe,0x1071,0x1071,0x1071,0x1077,0x13fe,0x13fe,0x13fe,0x13fe,0x13fe,0x13fe,0x13fe,0x13fe, +0x1074,0x1074,0x1077,0x1083,0x1080,0x107a,0x1080,0x107a,0x1080,0x107a,0x1080,0x107a,0x1080,0x107a,0x1080,0x107a, +0x1080,0x107a,0x1080,0x107a,0x1080,0x107a,0x1080,0x107a,0x1080,0x107a,0x1080,0x107a,0x1080,0x107a,0x1080,0x107a, +0x1080,0x107a,0x1080,0x107a,0x1518,0x1515,0x1518,0x1515,0x151b,0x151b,0x16f8,0x13fe,0x108c,0x108c,0x108f,0x108f, +0x108f,0x108f,0x108f,0x108f,0x108f,0x108f,0x108f,0x108f,0x108f,0x108f,0x108f,0x108f,0x108f,0x108f,0x108f,0x108f, +0x108f,0x108f,0x108f,0x108f,0x108f,0x108f,0x108f,0x108f,0x108f,0x108f,0x108f,0x108f,0x108c,0x108c,0x108c,0x108c, +0x108c,0x108c,0x108c,0x108c,0x108c,0x108c,0x108c,0x108c,0x109e,0x109e,0x109e,0x109e,0x109e,0x109e,0x1095,0x1095, +0x1095,0x1095,0x1095,0x1098,0x1098,0x1098,0x10f2,0x10a1,0x10b0,0x10b0,0x10b0,0x10b0,0x10b0,0x10b0,0x10b0,0x10b0, +0x10b0,0x10b0,0x10b0,0x10b0,0x10b0,0x10b0,0x10b0,0x10b0,0x109b,0x109b,0x109b,0x109b,0x109b,0x109b,0x109b,0x109b, +0x109b,0x109b,0x109e,0x109e,0x109e,0x109e,0x109e,0x109e,0x109e,0x109e,0x109e,0x109e,0x109e,0x109e,0x109e,0x109e, +0x109e,0x109e,0x109e,0x109e,0x109e,0x109e,0x109e,0x109e,0x10bf,0x10bf,0x10bf,0x10bf,0x10bf,0x10bf,0x10bf,0x10bf, +0x10bf,0x10bf,0x10bf,0x10bf,0x10bf,0x10bf,0x10bf,0x10bf,0x10bf,0x10bf,0x10bf,0x10bf,0x10bf,0x10bf,0x10bf,0x10bf, +0x10bf,0x10bf,0x10bf,0x10bf,0x10bf,0x10bf,0x10bf,0x10bf,0x10d1,0x10d1,0x10d1,0x10d1,0x10d1,0x10d1,0x10d1,0x10d1, +0x10d1,0x10d1,0x10d1,0x10d1,0x10d1,0x10d1,0x10d1,0x10d1,0x10d1,0x10d1,0x10d1,0x10d1,0x10d1,0x10d1,0x10d1,0x10d1, +0x10d1,0x10d1,0x10d1,0x10d1,0x10d1,0x10d1,0x10d1,0x10d1,0x10da,0x10da,0x10da,0x10da,0x10ef,0x10da,0x10da,0x10da, +0x10da,0x10da,0x10da,0x10da,0x10da,0x10da,0x10da,0x10da,0x10da,0x10da,0x10da,0x10da,0x10da,0x10da,0x10da,0x10da, +0x10da,0x10da,0x10da,0x10da,0x10da,0x10da,0x10da,0x10da,0x10dd,0x10dd,0x10dd,0x10dd,0x10dd,0x10dd,0x10dd,0x10dd, +0x10dd,0x10dd,0x10dd,0x10dd,0x10dd,0x10dd,0x10dd,0x10dd,0x10dd,0x10dd,0x10dd,0x10dd,0x10dd,0x10dd,0x10dd,0x10dd, +0x10dd,0x10dd,0x10dd,0x10dd,0x10dd,0x10dd,0x10dd,0x10dd,0x10e9,0x10e9,0x10e9,0x10e9,0x128a,0x128a,0x128a,0x128a, +0x128a,0x128a,0x128a,0x128a,0x1488,0x1776,0x1776,0x1776,0x1776,0x1776,0x1776,0x1776,0x1776,0x1776,0x18c6,0x18c6, +0x18c6,0x18c6,0x18c6,0x18c6,0x18c6,0x18c6,0x18c6,0x18c6,0x115e,0x115e,0x115e,0x115e,0x115e,0x115e,0x115e,0x115e, +0x115e,0x115e,0x115e,0x115e,0x115e,0x115e,0x115e,0x115e,0x115e,0x115e,0x115e,0x115e,0x115e,0x115e,0x1155,0x1155, +0x1158,0x1158,0x115e,0x1155,0x1155,0x1155,0x1155,0x1155,0x1161,0x1161,0x1161,0x1161,0x1161,0x1161,0x1161,0x1161, +0x1161,0x1161,0x1161,0x1161,0x1161,0x1161,0x1161,0x1161,0x1161,0x1161,0x1161,0x1161,0x1161,0x1161,0x1161,0x1161, +0x1161,0x1161,0x1161,0x1161,0x1161,0x1161,0x1161,0x1161,0x117c,0x117c,0x117c,0x117c,0x117c,0x117c,0x117c,0x117c, +0x117c,0x117c,0x117c,0x117c,0x117c,0x117c,0x117c,0x117c,0x117c,0x117c,0x117c,0x117c,0x117c,0x117c,0x117c,0x117c, +0x117c,0x117c,0x117c,0x117c,0x117c,0x117c,0x117c,0x117c,0x1188,0x1188,0x1188,0x1188,0x1188,0x1188,0x1188,0x1188, +0x1188,0x1188,0x1188,0x1188,0x1188,0x1188,0x1188,0x1188,0x1188,0x1188,0x1188,0x1188,0x1188,0x1188,0x1188,0x1188, +0x1188,0x1188,0x1188,0x1188,0x1188,0x1188,0x1185,0x118b,0x1197,0x1197,0x1197,0x1197,0x1197,0x1197,0x1197,0x1197, +0x1197,0x1197,0x1197,0x1197,0x1197,0x1197,0x1197,0x1197,0x1197,0x1197,0x1197,0x1197,0x1197,0x1197,0x1197,0x1197, +0x1197,0x1197,0x1197,0x1197,0x1197,0x1197,0x1197,0x1197,0x11a6,0x11a6,0x11a6,0x11b5,0x11bb,0x11bb,0x11bb,0x11bb, +0x11bb,0x11bb,0x11bb,0x11bb,0x11bb,0x11bb,0x11bb,0x11bb,0x11bb,0x11bb,0x11bb,0x11bb,0x11bb,0x11bb,0x11bb,0x11bb, +0x11bb,0x11bb,0x11bb,0x11bb,0x11bb,0x11bb,0x11bb,0x11bb,0x11bb,0x11bb,0x11bb,0x11a9,0x11b5,0x11b5,0x11a6,0x11a6, +0x11a6,0x11a6,0x11b5,0x11b5,0x11a6,0x11b5,0x11b5,0x11b5,0x11c7,0x11c7,0x11c7,0x11c7,0x11c7,0x11c7,0x11c7,0x11c7, +0x11c7,0x11c7,0x11c7,0x11c7,0x11c7,0x11c7,0x11c7,0x11c7,0x11ca,0x11c7,0x11c7,0x11c7,0x11c7,0x11c7,0x11c7,0x11c1, +0x11c1,0x11c1,0x11c7,0x11c4,0x1521,0x1524,0x1527,0x1527,0x11d9,0x11d9,0x11d9,0x11d9,0x11d9,0x11d9,0x11d9,0x11d9, +0x11d9,0x11d9,0x11d9,0x11d9,0x11d9,0x11d9,0x11d9,0x11d9,0x11cd,0x11d9,0x11cd,0x11cd,0x11cd,0x11e2,0x11e2,0x11cd, +0x11cd,0x11e2,0x11d9,0x11e2,0x11e2,0x11d9,0x11cd,0x11d0,0x11d9,0x11d9,0x11d9,0x11d9,0x11d9,0x11d9,0x11d9,0x11d9, +0x11d9,0x11d9,0x11d9,0x11d9,0x11d9,0x11d9,0x11d9,0x11d9,0x11d9,0x11d9,0x11d9,0x11d9,0x11d9,0x11d9,0x11d9,0x11d9, +0x11d9,0x11d9,0x11d9,0x11d9,0x11d9,0x11d9,0x11d9,0x11d9,0x11f4,0x11f4,0x11f4,0x11f4,0x11f4,0x11f4,0x11f4,0x11f4, +0x11f4,0x11f4,0x11f4,0x11f4,0x11f4,0x11f4,0x11f4,0x11f4,0x11f4,0x11f4,0x11f4,0x11f4,0x11f4,0x11f4,0x11f4,0x11f4, +0x11f4,0x11f4,0x11f4,0x11f4,0x11f4,0x11f4,0x11f4,0x11f4,0x120c,0x120c,0x120c,0x120c,0x120c,0x120c,0x120c,0x120c, +0x120c,0x120c,0x120c,0x120c,0x120c,0x120c,0x120c,0x120c,0x120c,0x120c,0x120c,0x120c,0x120c,0x120c,0x120c,0x120c, +0x120c,0x120c,0x120c,0x120c,0x120c,0x1209,0x1209,0x1209,0x1215,0x1215,0x1215,0x1215,0x1215,0x1215,0x1215,0x1215, +0x1215,0x1215,0x1215,0x1215,0x1215,0x1215,0x1215,0x1215,0x1215,0x1215,0x1215,0x1215,0x1215,0x1215,0x1215,0x1215, +0x1215,0x1215,0x1215,0x1215,0x1215,0x1215,0x1215,0x1215,0x1224,0x1224,0x1224,0x1224,0x1224,0x1224,0x1224,0x1224, +0x1224,0x1224,0x1224,0x1224,0x1224,0x1224,0x1224,0x1224,0x1224,0x1224,0x1224,0x1224,0x1224,0x1224,0x1224,0x1224, +0x1224,0x1224,0x1224,0x1224,0x1224,0x1224,0x1224,0x1224,0x122a,0x122a,0x1239,0x123c,0x123c,0x123c,0x123c,0x123c, +0x123c,0x123c,0x123c,0x123c,0x123c,0x123c,0x123c,0x123c,0x123c,0x123c,0x123c,0x123c,0x123c,0x123c,0x123c,0x123c, +0x123c,0x123c,0x123f,0x123c,0x123f,0x123c,0x123c,0x123c,0x123c,0x123c,0x123c,0x123c,0x123c,0x123c,0x123c,0x123c, +0x123c,0x123c,0x123c,0x123f,0x123c,0x123c,0x123c,0x123c,0x1239,0x1239,0x1239,0x122d,0x122d,0x122d,0x122d,0x1239, +0x1239,0x1233,0x1230,0x1236,0x1236,0x1245,0x1242,0x1242,0x1248,0x1248,0x1248,0x1248,0x1248,0x1248,0x1248,0x1248, +0x1248,0x1248,0x1248,0x1248,0x1248,0x1248,0x1248,0x1248,0x1248,0x1248,0x1248,0x1248,0x1248,0x1248,0x1248,0x1248, +0x1248,0x1248,0x1248,0x1248,0x1248,0x1248,0x1248,0x1248,0x124e,0x124e,0x124e,0x124b,0x124b,0x124b,0x1248,0x1248, +0x1248,0x1248,0x124b,0x1248,0x1248,0x1248,0x124e,0x124b,0x124e,0x124b,0x1248,0x1248,0x1248,0x1248,0x1248,0x1248, +0x1248,0x1248,0x1248,0x1248,0x1248,0x1248,0x1248,0x1248,0x1248,0x1248,0x1248,0x1248,0x1248,0x1248,0x1248,0x1248, +0x1248,0x1248,0x1248,0x1248,0x1248,0x124e,0x124b,0x124b,0x1248,0x1248,0x1248,0x1248,0x125a,0x125a,0x1302,0x1257, +0x1302,0x1302,0x1302,0x1302,0x1257,0x125d,0x1284,0x1257,0x1257,0x1257,0x1257,0x1257,0x125d,0x1260,0x1284,0x1284, +0x1260,0x1284,0x1257,0x1260,0x1260,0x1263,0x1284,0x1257,0x1257,0x1284,0x125a,0x125a,0x1371,0x1371,0x1371,0x1371, +0x1371,0x1371,0x1371,0x1371,0x1371,0x1371,0x126c,0x126c,0x126c,0x126c,0x138c,0x136b,0x1275,0x138c,0x138c,0x138c, +0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x1824,0x1824,0x1824,0x1824,0x1824,0x1374,0x1374,0x127b,0x1374, +0x1374,0x1374,0x127b,0x1374,0x1374,0x1374,0x1275,0x1275,0x1275,0x1275,0x1275,0x136e,0x1371,0x1371,0x1371,0x1371, +0x1371,0x1371,0x1371,0x1278,0x1371,0x1371,0x1371,0x1371,0x1371,0x1371,0x1371,0x1278,0x12a2,0x12a2,0x12a2,0x12a2, +0x12a2,0x12a2,0x12a2,0x12a2,0x12a2,0x12a2,0x12a2,0x12a2,0x12a2,0x12a2,0x12a2,0x12a2,0x12a2,0x12a2,0x12a2,0x12a2, +0x12a2,0x12a2,0x12a2,0x12a2,0x12a2,0x12a2,0x12a2,0x12a2,0x12a2,0x12a2,0x12a2,0x12a2,0x1344,0x1344,0x1344,0x1344, +0x1344,0x1344,0x1344,0x1344,0x1344,0x1344,0x1344,0x1344,0x1344,0x1344,0x1344,0x1344,0x1344,0x1344,0x1344,0x1344, +0x1344,0x1344,0x1344,0x1344,0x1344,0x1344,0x1344,0x1344,0x1344,0x1344,0x1344,0x1344,0x1359,0x134a,0x1359,0x135c, +0x135c,0x135c,0x135c,0x135c,0x135c,0x135c,0x135c,0x135c,0x135c,0x135c,0x135c,0x135c,0x135c,0x135c,0x135c,0x135c, +0x135c,0x135c,0x135c,0x135c,0x135c,0x135c,0x135c,0x135c,0x135c,0x135c,0x135c,0x135c,0x134a,0x134a,0x134a,0x134a, +0x134a,0x134a,0x134a,0x134a,0x1362,0x1362,0x1362,0x1362,0x1362,0x1362,0x1362,0x1362,0x1362,0x1362,0x1362,0x1362, +0x1362,0x1362,0x1362,0x1362,0x1362,0x1362,0x1362,0x1362,0x1362,0x1362,0x1362,0x1362,0x1362,0x1362,0x1362,0x1362, +0x1362,0x1362,0x1362,0x1362,0x1368,0x1368,0x1368,0x1368,0x1368,0x1368,0x1368,0x1368,0x1368,0x1368,0x1368,0x1368, +0x1368,0x1368,0x1368,0x1368,0x1368,0x1368,0x1368,0x1368,0x1368,0x1368,0x1368,0x1368,0x1368,0x1368,0x1368,0x1368, +0x1368,0x1368,0x1368,0x1368,0x1398,0x1395,0x18cc,0x18cc,0x18cc,0x18cc,0x18cc,0x18cc,0x18cc,0x18cc,0x18cc,0x18cc, +0x18cc,0x18cc,0x18cc,0x18cc,0x18cc,0x18cc,0x18cc,0x18cc,0x18cc,0x18cc,0x18cc,0x18cc,0x18cc,0x18cc,0x18cc,0x18cc, +0x18cc,0x18cc,0x18cc,0x18cc,0x13a1,0x13a1,0x13a1,0x13a1,0x13a4,0x13a1,0x13a1,0x13a1,0x13a4,0x13a1,0x13a1,0x13a1, +0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x139e,0x139e,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1, +0x139e,0x13a1,0x13a1,0x13a1,0x139e,0x13a1,0x139e,0x13a1,0x139e,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a7,0x13a1, +0x13a1,0x13a1,0x13a1,0x139e,0x13a1,0x139e,0x139e,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a4, +0x13a4,0x13a1,0x13a1,0x13a1,0x139e,0x139e,0x139e,0x139e,0x139e,0x139e,0x139e,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1, +0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x139e,0x139e,0x139e,0x139e,0x139e, +0x139e,0x139e,0x139e,0x139e,0x139e,0x13a1,0x13a1,0x13a4,0x13a1,0x13a1,0x13a1,0x13a1,0x13a4,0x13a1,0x13a1,0x13a1, +0x13a1,0x13a1,0x139e,0x139e,0x139e,0x139e,0x139e,0x139e,0x139e,0x139e,0x139e,0x139e,0x139e,0x139e,0x1533,0x1533, +0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a4,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1, 0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1, -0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a4,0x13a1,0x13a1,0x13a1,0x13a1, -0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a4,0x13a4,0x13a4,0x13a1, -0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a7,0x13a7,0x13a7,0x13a7,0x13a7,0x13a7,0x13a7,0x13a7, -0x13a7,0x13a7,0x13a7,0x13a7,0x13a7,0x13a7,0x13a7,0x13a7,0x13a7,0x13a7,0x13a7,0x13a7,0x13a7,0x13a7,0x13a7,0x13a7, -0x13a7,0x13a7,0x13a7,0x13a7,0x13a7,0x13a7,0x13a7,0x13a7,0x1797,0x1797,0x1794,0x16ef,0x13f5,0x13f5,0x13f5,0x13f5, -0x13f5,0x13f5,0x13f2,0x13f2,0x13f2,0x13f2,0x13f2,0x13f2,0x13f5,0x13f5,0x13f5,0x13f5,0x13f5,0x13f5,0x13f5,0x13f5, -0x13f5,0x13f5,0x13f5,0x13f5,0x13f5,0x13f5,0x13f5,0x1539,0x1401,0x1401,0x1401,0x1413,0x1413,0x1413,0x1413,0x1413, -0x1413,0x1413,0x1413,0x1413,0x1413,0x1413,0x1413,0x1413,0x1413,0x1413,0x1413,0x1413,0x1413,0x1413,0x1413,0x1413, -0x1413,0x1413,0x1413,0x1413,0x1413,0x1413,0x1413,0x1413,0x142e,0x142e,0x142e,0x142e,0x142e,0x142e,0x142e,0x142e, -0x142e,0x142e,0x142e,0x142e,0x142e,0x142e,0x142e,0x142e,0x142e,0x142e,0x142e,0x142e,0x142e,0x142e,0x142e,0x142e, -0x142e,0x142e,0x142e,0x142e,0x142e,0x142e,0x142e,0x142e,0x1437,0x1437,0x1437,0x1437,0x1437,0x1437,0x1437,0x1437, -0x1437,0x1437,0x1437,0x1437,0x1437,0x1437,0x1437,0x1437,0x1437,0x1437,0x1437,0x1437,0x1437,0x1437,0x1437,0x1437, -0x1437,0x1437,0x1437,0x1437,0x1437,0x1437,0x1437,0x1437,0x143d,0x143d,0x1449,0x144f,0x144f,0x144f,0x144f,0x144f, -0x144f,0x144f,0x144f,0x144f,0x144f,0x144f,0x144f,0x144f,0x144f,0x144f,0x144f,0x144f,0x144f,0x144f,0x144f,0x144f, -0x144f,0x144f,0x144f,0x144f,0x144f,0x144f,0x144f,0x144f,0x144f,0x144f,0x144f,0x1449,0x1449,0x1449,0x143d,0x143d, -0x143d,0x143d,0x143d,0x143d,0x143d,0x143d,0x143d,0x1449,0x1470,0x1470,0x1470,0x1470,0x1470,0x1470,0x1470,0x1470, -0x1470,0x1470,0x1470,0x1470,0x1470,0x1470,0x1470,0x1470,0x1470,0x1470,0x1470,0x1470,0x1470,0x1470,0x1470,0x1470, -0x1470,0x1470,0x1470,0x1470,0x1470,0x1470,0x1470,0x1470,0x1521,0x1521,0x1527,0x1527,0x1527,0x1521,0x1521,0x1521, -0x1521,0x1521,0x1521,0x1521,0x1521,0x1521,0x1521,0x1521,0x1521,0x1527,0x1527,0x1527,0x151e,0x151e,0x151e,0x151e, -0x151e,0x151e,0x151e,0x151e,0x1527,0x1527,0x1527,0x1521,0x1521,0x1521,0x1521,0x1521,0x1521,0x1521,0x1521,0x1527, -0x1521,0x1521,0x1527,0x1527,0x1527,0x1527,0x1521,0x1521,0x1530,0x1521,0x1521,0x1521,0x1521,0x169b,0x169b,0x1521, -0x1521,0x1521,0x1521,0x1521,0x1521,0x1521,0x1521,0x1521,0x1815,0x1527,0x1521,0x1521,0x1527,0x1521,0x1521,0x1521, -0x1521,0x1521,0x1521,0x1521,0x1521,0x1527,0x1527,0x1521,0x1521,0x1521,0x1521,0x1521,0x1521,0x1521,0x1521,0x1521, -0x1527,0x1521,0x1521,0x1521,0x1551,0x1551,0x1551,0x1551,0x1551,0x1551,0x1551,0x1551,0x1551,0x1551,0x1551,0x1551, -0x1551,0x1551,0x1551,0x1551,0x1551,0x1551,0x1551,0x1551,0x1551,0x1551,0x1551,0x1551,0x1551,0x1551,0x1551,0x1551, -0x1551,0x1551,0x1551,0x1551,0x1563,0x1563,0x1563,0x1563,0x1563,0x1563,0x1563,0x1563,0x1563,0x1563,0x1563,0x1563, +0x13a1,0x153c,0x1536,0x1536,0x153c,0x153c,0x153c,0x153c,0x153c,0x153c,0x153c,0x153c,0x153c,0x1779,0x1779,0x1779, +0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x153c,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a4,0x13a1, +0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1, +0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1, +0x13a1,0x13a1,0x13a1,0x13a4,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x153c,0x1779,0x1779, +0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a7,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1, +0x13a1,0x13a1,0x13a1,0x13a4,0x1536,0x1536,0x153c,0x153c,0x1536,0x153c,0x153c,0x153c,0x1533,0x1533,0x153c,0x153c, +0x13a1,0x13a1,0x13a7,0x13a7,0x13a7,0x16aa,0x13a1,0x13a7,0x13a1,0x13a1,0x13a7,0x1542,0x1542,0x153c,0x153c,0x1779, +0x1779,0x1779,0x1779,0x1779,0x153c,0x153c,0x153c,0x153c,0x153c,0x153c,0x153c,0x153c,0x153c,0x153c,0x153c,0x153c, +0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a4,0x13a1,0x13a4,0x13a1,0x13a1, +0x13a1,0x1536,0x1536,0x153c,0x16aa,0x153c,0x1536,0x153c,0x1779,0x1779,0x1779,0x177c,0x177c,0x177c,0x177c,0x177c, +0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1, +0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x153c, +0x13a1,0x153c,0x13a7,0x13a7,0x13a1,0x13a1,0x13a7,0x13a7,0x13a7,0x13a7,0x13a7,0x13a7,0x13a7,0x13a7,0x13a7,0x13a7, +0x13a7,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1, +0x13a1,0x13a1,0x13aa,0x13aa,0x13aa,0x13aa,0x13a1,0x13a1,0x13a1,0x13a1,0x13a7,0x13a1,0x13a7,0x13a7,0x13a7,0x13a7, +0x13a7,0x13a7,0x13a7,0x13a7,0x13a7,0x13a1,0x13a1,0x13a1,0x13a7,0x13a1,0x13a1,0x13a1,0x13a1,0x13a7,0x13a7,0x13a7, +0x13a1,0x13a7,0x13a7,0x13a7,0x13a1,0x13a1,0x13a1,0x13a4,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1, +0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1, +0x16aa,0x13a1,0x13a1,0x13a1,0x13a1,0x153c,0x1536,0x1779,0x1404,0x1404,0x1404,0x1404,0x1533,0x1533,0x1533,0x1533, +0x1533,0x1539,0x153c,0x1779,0x1779,0x1779,0x1779,0x1701,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1, +0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x1536,0x1536,0x1536,0x1536,0x1536,0x1536,0x1536,0x153c, +0x153c,0x1536,0x1536,0x153c,0x1542,0x1542,0x153c,0x153c,0x153c,0x153c,0x182d,0x1536,0x1536,0x1536,0x1536,0x1536, +0x1536,0x153c,0x1536,0x153c,0x1536,0x1536,0x1536,0x1536,0x153f,0x1536,0x1536,0x1536,0x1536,0x1536,0x1536,0x153c, +0x1536,0x1536,0x1536,0x153c,0x1533,0x1533,0x1533,0x1533,0x1533,0x1533,0x153c,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1, +0x148e,0x13ad,0x13ad,0x13ad,0x13ad,0x13ad,0x13ad,0x13ad,0x13ad,0x13ad,0x13ad,0x13ad,0x13ad,0x13ad,0x13ad,0x13ad, +0x13ad,0x148e,0x13ad,0x13ad,0x13ad,0x148e,0x13ad,0x148e,0x13ad,0x148e,0x13ad,0x148e,0x13ad,0x13ad,0x13ad,0x148e, +0x13ad,0x13ad,0x13ad,0x13ad,0x13ad,0x13ad,0x148e,0x148e,0x13ad,0x13ad,0x13ad,0x13ad,0x148e,0x13ad,0x148e,0x148e, +0x13ad,0x13ad,0x13ad,0x13ad,0x148e,0x13ad,0x13ad,0x13ad,0x13ad,0x13ad,0x13ad,0x13ad,0x13ad,0x13ad,0x13ad,0x13ad, +0x13ad,0x16b0,0x16b0,0x177f,0x177f,0x13b0,0x13b0,0x13b0,0x13ad,0x13ad,0x13ad,0x13b0,0x13b0,0x13b0,0x13b0,0x13b0, +0x162f,0x162f,0x162f,0x162f,0x162f,0x162f,0x162f,0x162f,0x162f,0x162f,0x162f,0x162f,0x162f,0x162f,0x162f,0x162f, +0x13b6,0x13b3,0x13b3,0x13b3,0x13b3,0x13b3,0x13b3,0x13b3,0x13b3,0x13b3,0x13b3,0x13b3,0x13b3,0x13b3,0x13b3,0x13b3, +0x13b3,0x13b3,0x13b6,0x13b3,0x13b3,0x13b3,0x13b3,0x13b3,0x13b3,0x13b3,0x13b3,0x13b3,0x13b3,0x13b3,0x13b3,0x13b3, +0x13b3,0x13b3,0x13b3,0x13b9,0x13b3,0x13b3,0x13b3,0x13b3,0x13b3,0x13b3,0x13b3,0x13b3,0x13b3,0x13b3,0x13b3,0x13b3, +0x13b3,0x13b3,0x13b3,0x13b3,0x13b9,0x13b9,0x13b9,0x13b3,0x13b3,0x13b3,0x13b3,0x13b3,0x13b3,0x13b3,0x13b3,0x13b3, +0x13bc,0x13bc,0x13bc,0x13bc,0x13bc,0x13bc,0x13bc,0x13bc,0x13bc,0x13bc,0x13bc,0x13bc,0x13bc,0x13bc,0x13bc,0x13bc, +0x13bc,0x13bc,0x13bc,0x13bc,0x13bc,0x13bc,0x13bc,0x13bc,0x13bc,0x13bc,0x13bc,0x13bc,0x13bc,0x13bc,0x13bc,0x13bc, +0x17ac,0x17ac,0x17a9,0x1704,0x140a,0x140a,0x140a,0x140a,0x140a,0x140a,0x1407,0x1407,0x1407,0x1407,0x1407,0x1407, +0x140a,0x140a,0x140a,0x140a,0x140a,0x140a,0x140a,0x140a,0x140a,0x140a,0x140a,0x140a,0x140a,0x140a,0x140a,0x154b, +0x1416,0x1416,0x1416,0x1428,0x1428,0x1428,0x1428,0x1428,0x1428,0x1428,0x1428,0x1428,0x1428,0x1428,0x1428,0x1428, +0x1428,0x1428,0x1428,0x1428,0x1428,0x1428,0x1428,0x1428,0x1428,0x1428,0x1428,0x1428,0x1428,0x1428,0x1428,0x1428, +0x1443,0x1443,0x1443,0x1443,0x1443,0x1443,0x1443,0x1443,0x1443,0x1443,0x1443,0x1443,0x1443,0x1443,0x1443,0x1443, +0x1443,0x1443,0x1443,0x1443,0x1443,0x1443,0x1443,0x1443,0x1443,0x1443,0x1443,0x1443,0x1443,0x1443,0x1443,0x1443, +0x144c,0x144c,0x144c,0x144c,0x144c,0x144c,0x144c,0x144c,0x144c,0x144c,0x144c,0x144c,0x144c,0x144c,0x144c,0x144c, +0x144c,0x144c,0x144c,0x144c,0x144c,0x144c,0x144c,0x144c,0x144c,0x144c,0x144c,0x144c,0x144c,0x144c,0x144c,0x144c, +0x1452,0x1452,0x145e,0x1464,0x1464,0x1464,0x1464,0x1464,0x1464,0x1464,0x1464,0x1464,0x1464,0x1464,0x1464,0x1464, +0x1464,0x1464,0x1464,0x1464,0x1464,0x1464,0x1464,0x1464,0x1464,0x1464,0x1464,0x1464,0x1464,0x1464,0x1464,0x1464, +0x1464,0x1464,0x1464,0x145e,0x145e,0x145e,0x1452,0x1452,0x1452,0x1452,0x1452,0x1452,0x1452,0x1452,0x1452,0x145e, +0x1485,0x1485,0x1485,0x1485,0x1485,0x1485,0x1485,0x1485,0x1485,0x1485,0x1485,0x1485,0x1485,0x1485,0x1485,0x1485, +0x1485,0x1485,0x1485,0x1485,0x1485,0x1485,0x1485,0x1485,0x1485,0x1485,0x1485,0x1485,0x1485,0x1485,0x1485,0x1485, +0x1536,0x1536,0x153c,0x153c,0x153c,0x1536,0x1536,0x1536,0x1536,0x1536,0x1536,0x1536,0x1536,0x1536,0x1536,0x1536, +0x1536,0x153c,0x153c,0x153c,0x1533,0x1533,0x1533,0x1533,0x1533,0x1533,0x1533,0x1533,0x153c,0x153c,0x153c,0x1536, +0x1536,0x1536,0x1536,0x1536,0x1536,0x1536,0x1536,0x153c,0x1536,0x1536,0x153c,0x153c,0x153c,0x153c,0x1536,0x1536, +0x1542,0x1536,0x1536,0x1536,0x1536,0x16ad,0x16ad,0x1536,0x1536,0x1536,0x1536,0x1536,0x1536,0x1536,0x1536,0x1536, +0x182a,0x153c,0x1536,0x1536,0x153c,0x1536,0x1536,0x1536,0x1536,0x1536,0x1536,0x1536,0x1536,0x153c,0x153c,0x1536, +0x1536,0x1536,0x1536,0x1536,0x1536,0x1536,0x1536,0x1536,0x153c,0x1536,0x1536,0x1536,0x1563,0x1563,0x1563,0x1563, 0x1563,0x1563,0x1563,0x1563,0x1563,0x1563,0x1563,0x1563,0x1563,0x1563,0x1563,0x1563,0x1563,0x1563,0x1563,0x1563, -0x1563,0x1563,0x1563,0x1563,0x1569,0x1569,0x1569,0x1569,0x1569,0x1569,0x1569,0x1569,0x1569,0x1569,0x1569,0x1569, -0x1569,0x1569,0x1569,0x1569,0x1569,0x1569,0x1569,0x1569,0x1569,0x1569,0x1569,0x1569,0x1569,0x1569,0x1569,0x1569, -0x1569,0x1569,0x1569,0x1569,0x156c,0x156c,0x156c,0x156c,0x156c,0x156c,0x156c,0x156c,0x156c,0x156c,0x156c,0x156c, -0x156c,0x156c,0x156c,0x156c,0x156c,0x156c,0x156c,0x156c,0x156c,0x156c,0x156c,0x156c,0x156c,0x156c,0x156c,0x156c, -0x156c,0x156c,0x156c,0x156c,0x15ab,0x15ab,0x15ab,0x15ab,0x15ab,0x15ab,0x15ab,0x15ab,0x15ab,0x15ab,0x15ab,0x15ab, -0x15ab,0x15ab,0x15ab,0x15ab,0x15ab,0x15ab,0x15ab,0x15ab,0x15ab,0x15ab,0x15ab,0x15ab,0x15ab,0x15ab,0x15ab,0x15ab, -0x15ab,0x15ab,0x15ab,0x159c,0x15b4,0x15b4,0x15b4,0x15b4,0x15b4,0x15b4,0x15b4,0x15b4,0x15b4,0x15b4,0x15b4,0x15b4, -0x15b4,0x15b4,0x15b4,0x15b4,0x15b4,0x15b4,0x15b4,0x15b4,0x15b4,0x15b4,0x15b4,0x15b4,0x15b4,0x15b4,0x15b4,0x15ae, -0x15b7,0x15b7,0x15b7,0x15b7,0x15ba,0x15ba,0x15ba,0x15ba,0x15ba,0x15ba,0x15ba,0x15ba,0x15ba,0x15ba,0x15ba,0x15ba, -0x15ba,0x15ba,0x15ba,0x15ba,0x15ba,0x15ba,0x15ba,0x15ba,0x15ba,0x15ba,0x15ba,0x15ba,0x15ba,0x15ba,0x15ba,0x15ba, -0x15ba,0x15ba,0x15ba,0x15ba,0x15d5,0x15d5,0x15d5,0x15d5,0x15d5,0x15d5,0x15d5,0x15d5,0x15cc,0x15d5,0x15d5,0x15d5, -0x15d5,0x15d5,0x15d5,0x15d5,0x15d5,0x15d5,0x15d5,0x15d5,0x15d5,0x15d5,0x15d5,0x15d5,0x15d5,0x15d5,0x15d5,0x15d5, -0x15d5,0x15d5,0x15d5,0x15d5,0x15de,0x15de,0x15de,0x15de,0x15de,0x15de,0x15de,0x15de,0x15de,0x15de,0x15de,0x15de, -0x15de,0x15de,0x15de,0x15de,0x15de,0x15de,0x15de,0x15de,0x15de,0x15de,0x15de,0x15de,0x15de,0x15de,0x15de,0x15de, -0x15de,0x15de,0x15de,0x15de,0x15f0,0x15f0,0x15f0,0x15f0,0x15f0,0x15f0,0x15f0,0x15f0,0x15f0,0x15f0,0x15f0,0x15f0, -0x15f0,0x15f0,0x15f0,0x15f0,0x15ed,0x15ed,0x15ed,0x15e1,0x15e1,0x15e1,0x15e1,0x15e1,0x15e1,0x15e1,0x15e1,0x15ed, -0x15ed,0x15e1,0x15ed,0x15e4,0x15f0,0x15f0,0x15f0,0x15f0,0x15f0,0x15f0,0x15f0,0x15f0,0x15f0,0x15f0,0x15f0,0x15f0, +0x1563,0x1563,0x1563,0x1563,0x1563,0x1563,0x1563,0x1563,0x1563,0x1563,0x1563,0x1563,0x1575,0x1575,0x1575,0x1575, +0x1575,0x1575,0x1575,0x1575,0x1575,0x1575,0x1575,0x1575,0x1575,0x1575,0x1575,0x1575,0x1575,0x1575,0x1575,0x1575, +0x1575,0x1575,0x1575,0x1575,0x1575,0x1575,0x1575,0x1575,0x1575,0x1575,0x1575,0x1575,0x157b,0x157b,0x157b,0x157b, +0x157b,0x157b,0x157b,0x157b,0x157b,0x157b,0x157b,0x157b,0x157b,0x157b,0x157b,0x157b,0x157b,0x157b,0x157b,0x157b, +0x157b,0x157b,0x157b,0x157b,0x157b,0x157b,0x157b,0x157b,0x157b,0x157b,0x157b,0x157b,0x157e,0x157e,0x157e,0x157e, +0x157e,0x157e,0x157e,0x157e,0x157e,0x157e,0x157e,0x157e,0x157e,0x157e,0x157e,0x157e,0x157e,0x157e,0x157e,0x157e, +0x157e,0x157e,0x157e,0x157e,0x157e,0x157e,0x157e,0x157e,0x157e,0x157e,0x157e,0x157e,0x15bd,0x15bd,0x15bd,0x15bd, +0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd, +0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15ae,0x15c6,0x15c6,0x15c6,0x15c6, +0x15c6,0x15c6,0x15c6,0x15c6,0x15c6,0x15c6,0x15c6,0x15c6,0x15c6,0x15c6,0x15c6,0x15c6,0x15c6,0x15c6,0x15c6,0x15c6, +0x15c6,0x15c6,0x15c6,0x15c6,0x15c6,0x15c6,0x15c6,0x15c0,0x15c9,0x15c9,0x15c9,0x15c9,0x15cc,0x15cc,0x15cc,0x15cc, +0x15cc,0x15cc,0x15cc,0x15cc,0x15cc,0x15cc,0x15cc,0x15cc,0x15cc,0x15cc,0x15cc,0x15cc,0x15cc,0x15cc,0x15cc,0x15cc, +0x15cc,0x15cc,0x15cc,0x15cc,0x15cc,0x15cc,0x15cc,0x15cc,0x15cc,0x15cc,0x15cc,0x15cc,0x15e7,0x15e7,0x15e7,0x15e7, +0x15e7,0x15e7,0x15e7,0x15e7,0x15de,0x15e7,0x15e7,0x15e7,0x15e7,0x15e7,0x15e7,0x15e7,0x15e7,0x15e7,0x15e7,0x15e7, +0x15e7,0x15e7,0x15e7,0x15e7,0x15e7,0x15e7,0x15e7,0x15e7,0x15e7,0x15e7,0x15e7,0x15e7,0x15f0,0x15f0,0x15f0,0x15f0, 0x15f0,0x15f0,0x15f0,0x15f0,0x15f0,0x15f0,0x15f0,0x15f0,0x15f0,0x15f0,0x15f0,0x15f0,0x15f0,0x15f0,0x15f0,0x15f0, -0x15f0,0x15f0,0x15f0,0x15f0,0x1614,0x1614,0x1614,0x1614,0x1614,0x1614,0x1614,0x1614,0x1614,0x1614,0x1614,0x1614, -0x1614,0x1614,0x1614,0x1614,0x1614,0x1614,0x1614,0x1614,0x1614,0x1614,0x1614,0x1614,0x1614,0x1614,0x1614,0x1614, -0x1614,0x1611,0x1611,0x1611,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d, -0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x1623,0x1623,0x1623,0x1620,0x1620,0x1620, -0x161d,0x161d,0x161d,0x161d,0x1632,0x1632,0x1632,0x1632,0x1632,0x1632,0x1632,0x1632,0x1632,0x1632,0x1632,0x1632, -0x1632,0x1632,0x1632,0x1632,0x1626,0x1626,0x1626,0x1626,0x1626,0x1626,0x1626,0x1638,0x1638,0x162c,0x1629,0x1629, -0x1629,0x1629,0x1629,0x1629,0x1632,0x1632,0x1632,0x1632,0x1632,0x1632,0x1632,0x1632,0x1632,0x1632,0x1632,0x1632, -0x1632,0x1632,0x1632,0x1632,0x1632,0x1632,0x1632,0x1632,0x1632,0x1632,0x1632,0x1632,0x1632,0x1632,0x1632,0x1632, -0x1632,0x1632,0x1632,0x1632,0x163e,0x163e,0x163e,0x163e,0x163e,0x163e,0x163e,0x163e,0x163e,0x163e,0x163e,0x163e, -0x163e,0x163e,0x163e,0x163e,0x163e,0x163e,0x163e,0x163e,0x163e,0x163e,0x163e,0x163b,0x163b,0x163b,0x163b,0x163b, -0x163b,0x163b,0x163b,0x163b,0x1641,0x1641,0x1641,0x1641,0x1641,0x1641,0x1641,0x1641,0x1641,0x1641,0x1641,0x1641, -0x1641,0x1641,0x1641,0x1641,0x1641,0x1641,0x1641,0x1641,0x1641,0x1641,0x1641,0x1641,0x1641,0x1641,0x1641,0x1641, -0x1641,0x1641,0x1641,0x1641,0x1665,0x1665,0x1665,0x1665,0x1665,0x1665,0x1665,0x1665,0x1665,0x1665,0x1665,0x1665, -0x1665,0x1665,0x1665,0x1665,0x1665,0x1665,0x1665,0x1665,0x1665,0x1665,0x1665,0x1665,0x1665,0x1665,0x1665,0x1665, -0x1665,0x1665,0x1665,0x1665,0x166e,0x166e,0x166e,0x166e,0x166e,0x166e,0x166e,0x166e,0x166e,0x166e,0x166e,0x166e, -0x166e,0x166e,0x166e,0x166e,0x166e,0x166e,0x166e,0x166e,0x166e,0x166e,0x166e,0x166e,0x166e,0x166e,0x166e,0x166e, -0x166e,0x166e,0x166e,0x166e,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686, -0x1686,0x1686,0x1686,0x1686,0x1671,0x1680,0x1680,0x1671,0x1671,0x1671,0x1671,0x1671,0x1671,0x1680,0x1671,0x1683, -0x1683,0x1671,0x1683,0x1671,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686, -0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686, -0x1686,0x1686,0x1686,0x1686,0x168f,0x168f,0x168f,0x168f,0x168f,0x168f,0x168f,0x168f,0x168f,0x168f,0x168f,0x168f, -0x168f,0x168f,0x168f,0x168f,0x168f,0x168f,0x168f,0x168f,0x168f,0x168f,0x168f,0x168f,0x168f,0x168f,0x168f,0x168f, -0x168f,0x168f,0x168f,0x168f,0x1695,0x1695,0x1695,0x1695,0x1695,0x1695,0x1695,0x1695,0x1695,0x1695,0x1695,0x1695, -0x1695,0x1695,0x1695,0x1695,0x1695,0x1695,0x1695,0x1695,0x1695,0x1695,0x1695,0x1695,0x1695,0x1695,0x1695,0x1695, -0x1695,0x1695,0x1695,0x1695,0x16f5,0x16f5,0x16f5,0x16f5,0x16f5,0x16f5,0x16f5,0x16f5,0x16f5,0x16f5,0x16f5,0x16f5, -0x16f5,0x16f5,0x16f5,0x16f5,0x16f5,0x16f5,0x16f5,0x16f5,0x16f5,0x16f5,0x16f5,0x16f5,0x16f5,0x16f5,0x16f5,0x16f5, -0x16f5,0x16f5,0x16f5,0x16f5,0x1731,0x1731,0x1731,0x1731,0x1731,0x1731,0x1731,0x1731,0x1731,0x1731,0x1731,0x1731, -0x1731,0x1731,0x1731,0x1731,0x1731,0x1731,0x1731,0x1731,0x1731,0x1731,0x1731,0x1731,0x1731,0x1731,0x1731,0x1731, -0x1731,0x1731,0x1731,0x1731,0x1731,0x1731,0x1737,0x1734,0x1731,0x1731,0x1731,0x1731,0x1731,0x1731,0x1731,0x1731, -0x1731,0x1731,0x1731,0x1731,0x1731,0x1731,0x1731,0x1731,0x173a,0x173a,0x173a,0x173a,0x173a,0x173a,0x173a,0x173a, -0x173a,0x173a,0x173a,0x173a,0x173a,0x173a,0x173a,0x173a,0x173a,0x173a,0x173a,0x173a,0x173a,0x173a,0x173a,0x173a, -0x173a,0x173a,0x173a,0x173a,0x173a,0x173a,0x173a,0x173a,0x173d,0x173d,0x173d,0x173d,0x173d,0x173d,0x173d,0x173d, -0x173d,0x173d,0x173d,0x173d,0x173d,0x173d,0x173d,0x173d,0x173d,0x173d,0x173d,0x173d,0x173d,0x173d,0x173d,0x173d, -0x173d,0x173d,0x173d,0x173d,0x173d,0x173d,0x173d,0x173d,0x174f,0x174f,0x174f,0x174f,0x174f,0x174f,0x174f,0x174f, +0x15f0,0x15f0,0x15f0,0x15f0,0x15f0,0x15f0,0x15f0,0x15f0,0x15f0,0x15f0,0x15f0,0x15f0,0x1602,0x1602,0x1602,0x1602, +0x1602,0x1602,0x1602,0x1602,0x1602,0x1602,0x1602,0x1602,0x1602,0x1602,0x1602,0x1602,0x15ff,0x15ff,0x15ff,0x15f3, +0x15f3,0x15f3,0x15f3,0x15f3,0x15f3,0x15f3,0x15f3,0x15ff,0x15ff,0x15f3,0x15ff,0x15f6,0x1602,0x1602,0x1602,0x1602, +0x1602,0x1602,0x1602,0x1602,0x1602,0x1602,0x1602,0x1602,0x1602,0x1602,0x1602,0x1602,0x1602,0x1602,0x1602,0x1602, +0x1602,0x1602,0x1602,0x1602,0x1602,0x1602,0x1602,0x1602,0x1602,0x1602,0x1602,0x1602,0x1626,0x1626,0x1626,0x1626, +0x1626,0x1626,0x1626,0x1626,0x1626,0x1626,0x1626,0x1626,0x1626,0x1626,0x1626,0x1626,0x1626,0x1626,0x1626,0x1626, +0x1626,0x1626,0x1626,0x1626,0x1626,0x1626,0x1626,0x1626,0x1626,0x1623,0x1623,0x1623,0x162f,0x162f,0x162f,0x162f, +0x162f,0x162f,0x162f,0x162f,0x162f,0x162f,0x162f,0x162f,0x162f,0x162f,0x162f,0x162f,0x162f,0x162f,0x162f,0x162f, +0x162f,0x162f,0x1635,0x1635,0x1635,0x1632,0x1632,0x1632,0x162f,0x162f,0x162f,0x162f,0x1644,0x1644,0x1644,0x1644, +0x1644,0x1644,0x1644,0x1644,0x1644,0x1644,0x1644,0x1644,0x1644,0x1644,0x1644,0x1644,0x1638,0x1638,0x1638,0x1638, +0x1638,0x1638,0x1638,0x164a,0x164a,0x163e,0x163b,0x163b,0x163b,0x163b,0x163b,0x163b,0x1644,0x1644,0x1644,0x1644, +0x1644,0x1644,0x1644,0x1644,0x1644,0x1644,0x1644,0x1644,0x1644,0x1644,0x1644,0x1644,0x1644,0x1644,0x1644,0x1644, +0x1644,0x1644,0x1644,0x1644,0x1644,0x1644,0x1644,0x1644,0x1644,0x1644,0x1644,0x1644,0x1650,0x1650,0x1650,0x1650, +0x1650,0x1650,0x1650,0x1650,0x1650,0x1650,0x1650,0x1650,0x1650,0x1650,0x1650,0x1650,0x1650,0x1650,0x1650,0x1650, +0x1650,0x1650,0x1650,0x164d,0x164d,0x164d,0x164d,0x164d,0x164d,0x164d,0x164d,0x164d,0x1653,0x1653,0x1653,0x1653, +0x1653,0x1653,0x1653,0x1653,0x1653,0x1653,0x1653,0x1653,0x1653,0x1653,0x1653,0x1653,0x1653,0x1653,0x1653,0x1653, +0x1653,0x1653,0x1653,0x1653,0x1653,0x1653,0x1653,0x1653,0x1653,0x1653,0x1653,0x1653,0x1677,0x1677,0x1677,0x1677, +0x1677,0x1677,0x1677,0x1677,0x1677,0x1677,0x1677,0x1677,0x1677,0x1677,0x1677,0x1677,0x1677,0x1677,0x1677,0x1677, +0x1677,0x1677,0x1677,0x1677,0x1677,0x1677,0x1677,0x1677,0x1677,0x1677,0x1677,0x1677,0x1680,0x1680,0x1680,0x1680, +0x1680,0x1680,0x1680,0x1680,0x1680,0x1680,0x1680,0x1680,0x1680,0x1680,0x1680,0x1680,0x1680,0x1680,0x1680,0x1680, +0x1680,0x1680,0x1680,0x1680,0x1680,0x1680,0x1680,0x1680,0x1680,0x1680,0x1680,0x1680,0x1698,0x1698,0x1698,0x1698, +0x1698,0x1698,0x1698,0x1698,0x1698,0x1698,0x1698,0x1698,0x1698,0x1698,0x1698,0x1698,0x1683,0x1692,0x1692,0x1683, +0x1683,0x1683,0x1683,0x1683,0x1683,0x1692,0x1683,0x1695,0x1695,0x1683,0x1695,0x1683,0x1698,0x1698,0x1698,0x1698, +0x1698,0x1698,0x1698,0x1698,0x1698,0x1698,0x1698,0x1698,0x1698,0x1698,0x1698,0x1698,0x1698,0x1698,0x1698,0x1698, +0x1698,0x1698,0x1698,0x1698,0x1698,0x1698,0x1698,0x1698,0x1698,0x1698,0x1698,0x1698,0x16a1,0x16a1,0x16a1,0x16a1, +0x16a1,0x16a1,0x16a1,0x16a1,0x16a1,0x16a1,0x16a1,0x16a1,0x16a1,0x16a1,0x16a1,0x16a1,0x16a1,0x16a1,0x16a1,0x16a1, +0x16a1,0x16a1,0x16a1,0x16a1,0x16a1,0x16a1,0x16a1,0x16a1,0x16a1,0x16a1,0x16a1,0x16a1,0x16a7,0x16a7,0x16a7,0x16a7, +0x16a7,0x16a7,0x16a7,0x16a7,0x16a7,0x16a7,0x16a7,0x16a7,0x16a7,0x16a7,0x16a7,0x16a7,0x16a7,0x16a7,0x16a7,0x16a7, +0x16a7,0x16a7,0x16a7,0x16a7,0x16a7,0x16a7,0x16a7,0x16a7,0x16a7,0x16a7,0x16a7,0x16a7,0x170a,0x170a,0x170a,0x170a, +0x170a,0x170a,0x170a,0x170a,0x170a,0x170a,0x170a,0x170a,0x170a,0x170a,0x170a,0x170a,0x170a,0x170a,0x170a,0x170a, +0x170a,0x170a,0x170a,0x170a,0x170a,0x170a,0x170a,0x170a,0x170a,0x170a,0x170a,0x170a,0x1746,0x1746,0x1746,0x1746, +0x1746,0x1746,0x1746,0x1746,0x1746,0x1746,0x1746,0x1746,0x1746,0x1746,0x1746,0x1746,0x1746,0x1746,0x1746,0x1746, +0x1746,0x1746,0x1746,0x1746,0x1746,0x1746,0x1746,0x1746,0x1746,0x1746,0x1746,0x1746,0x1746,0x1746,0x174c,0x1749, +0x1746,0x1746,0x1746,0x1746,0x1746,0x1746,0x1746,0x1746,0x1746,0x1746,0x1746,0x1746,0x1746,0x1746,0x1746,0x1746, +0x174f,0x174f,0x174f,0x174f,0x174f,0x174f,0x174f,0x174f,0x174f,0x174f,0x174f,0x174f,0x174f,0x174f,0x174f,0x174f, 0x174f,0x174f,0x174f,0x174f,0x174f,0x174f,0x174f,0x174f,0x174f,0x174f,0x174f,0x174f,0x174f,0x174f,0x174f,0x174f, -0x174f,0x174f,0x174f,0x174f,0x174f,0x174f,0x174f,0x174f,0x1752,0x1752,0x1752,0x1752,0x1752,0x1752,0x1752,0x1752, 0x1752,0x1752,0x1752,0x1752,0x1752,0x1752,0x1752,0x1752,0x1752,0x1752,0x1752,0x1752,0x1752,0x1752,0x1752,0x1752, -0x1752,0x1752,0x1752,0x1752,0x1752,0x1752,0x1752,0x1752,0x1755,0x1755,0x1755,0x1755,0x1755,0x1755,0x1755,0x1755, -0x1755,0x1755,0x1755,0x1755,0x1755,0x1755,0x1755,0x1755,0x1755,0x1755,0x1755,0x1755,0x1755,0x1755,0x1755,0x1755, -0x1755,0x1755,0x1755,0x1755,0x1755,0x1755,0x1755,0x1755,0x1755,0x1755,0x1755,0x1758,0x1758,0x1758,0x1758,0x1755, -0x1755,0x1755,0x1755,0x1755,0x1755,0x1755,0x1755,0x1755,0x1755,0x1755,0x1755,0x1755,0x1755,0x1758,0x1758,0x1758, -0x1758,0x1758,0x1758,0x1758,0x1758,0x1755,0x1758,0x1758,0x1758,0x1758,0x1758,0x1758,0x1758,0x1758,0x1758,0x1758, -0x1758,0x1758,0x1758,0x1758,0x1758,0x1758,0x1758,0x1758,0x1758,0x1758,0x1758,0x1758,0x1758,0x1758,0x1758,0x1758, -0x1758,0x1758,0x1758,0x1758,0x1758,0x1758,0x1758,0x1758,0x1770,0x1770,0x1770,0x1770,0x1770,0x1770,0x1770,0x1770, -0x1770,0x1770,0x1770,0x1770,0x1770,0x1770,0x1770,0x1770,0x1770,0x1770,0x1770,0x1770,0x1770,0x1770,0x1770,0x1770, -0x1770,0x1770,0x1770,0x1770,0x1770,0x1770,0x1770,0x1770,0x17b5,0x17b5,0x17b2,0x17b2,0x17b2,0x17b2,0x17b2,0x17b2, -0x17b2,0x17b2,0x17b2,0x17b2,0x17b2,0x17b2,0x17b2,0x17b2,0x17b2,0x17b2,0x17b2,0x17b2,0x17b2,0x17b2,0x17b2,0x17b2, -0x17b2,0x17b2,0x17b2,0x17b2,0x17b2,0x17b2,0x17b2,0x17b2,0x17b5,0x17b5,0x17b5,0x17b5,0x17b5,0x17b5,0x17b5,0x17b5, -0x17b5,0x17b5,0x17b5,0x17b5,0x17b5,0x17b5,0x17b5,0x17b5,0x17b5,0x17b5,0x17b5,0x17b5,0x17b5,0x17b5,0x17b5,0x17b5, -0x17b5,0x17b5,0x17b5,0x17b5,0x17b5,0x17b5,0x17b5,0x17b5,0x1803,0x1803,0x1803,0x1803,0x1803,0x1803,0x1803,0x1803, -0x1803,0x1803,0x1803,0x1803,0x1803,0x1803,0x1803,0x1803,0x1803,0x1803,0x1803,0x1803,0x1803,0x1800,0x1800,0x1800, -0x17eb,0x17eb,0x17eb,0x17eb,0x17eb,0x17eb,0x17eb,0x17eb,0x1803,0x1803,0x1803,0x1803,0x1803,0x1803,0x1803,0x1803, -0x1803,0x1803,0x1803,0x1803,0x1803,0x1803,0x1803,0x1803,0x1803,0x1803,0x1803,0x1803,0x1803,0x1803,0x1803,0x1803, -0x1803,0x1803,0x1803,0x1803,0x1803,0x1803,0x1803,0x1803,0x182a,0x182a,0x182a,0x182a,0x182a,0x182a,0x182a,0x182a, -0x182a,0x182a,0x182a,0x182a,0x182a,0x182a,0x182a,0x182a,0x182a,0x182a,0x182a,0x182a,0x182a,0x182a,0x182a,0x182a, -0x182a,0x182a,0x182a,0x182a,0x182a,0x182a,0x182a,0x182a,0x182d,0x182d,0x182d,0x182d,0x182d,0x182d,0x182d,0x182d, -0x182d,0x182d,0x182d,0x182d,0x182d,0x182d,0x182d,0x182d,0x182d,0x182d,0x182d,0x182d,0x182d,0x182d,0x182d,0x182d, -0x182d,0x182d,0x182d,0x182d,0x182d,0x182d,0x182d,0x182d,0,0,0,0 +0x1752,0x1752,0x1752,0x1752,0x1752,0x1752,0x1752,0x1752,0x1752,0x1752,0x1752,0x1752,0x1752,0x1752,0x1752,0x1752, +0x1764,0x1764,0x1764,0x1764,0x1764,0x1764,0x1764,0x1764,0x1764,0x1764,0x1764,0x1764,0x1764,0x1764,0x1764,0x1764, +0x1764,0x1764,0x1764,0x1764,0x1764,0x1764,0x1764,0x1764,0x1764,0x1764,0x1764,0x1764,0x1764,0x1764,0x1764,0x1764, +0x1767,0x1767,0x1767,0x1767,0x1767,0x1767,0x1767,0x1767,0x1767,0x1767,0x1767,0x1767,0x1767,0x1767,0x1767,0x1767, +0x1767,0x1767,0x1767,0x1767,0x1767,0x1767,0x1767,0x1767,0x1767,0x1767,0x1767,0x1767,0x1767,0x1767,0x1767,0x1767, +0x176a,0x176a,0x176a,0x176a,0x176a,0x176a,0x176a,0x176a,0x176a,0x176a,0x176a,0x176a,0x176a,0x176a,0x176a,0x176a, +0x176a,0x176a,0x176a,0x176a,0x176a,0x176a,0x176a,0x176a,0x176a,0x176a,0x176a,0x176a,0x176a,0x176a,0x176a,0x176a, +0x176a,0x176a,0x176a,0x176d,0x176d,0x176d,0x176d,0x176a,0x176a,0x176a,0x176a,0x176a,0x176a,0x176a,0x176a,0x176a, +0x176a,0x176a,0x176a,0x176a,0x176a,0x176d,0x176d,0x176d,0x176d,0x176d,0x176d,0x176d,0x176d,0x176a,0x176d,0x176d, +0x176d,0x176d,0x176d,0x176d,0x176d,0x176d,0x176d,0x176d,0x176d,0x176d,0x176d,0x176d,0x176d,0x176d,0x176d,0x176d, +0x176d,0x176d,0x176d,0x176d,0x176d,0x176d,0x176d,0x176d,0x176d,0x176d,0x176d,0x176d,0x176d,0x176d,0x176d,0x176d, +0x1785,0x1785,0x1785,0x1785,0x1785,0x1785,0x1785,0x1785,0x1785,0x1785,0x1785,0x1785,0x1785,0x1785,0x1785,0x1785, +0x1785,0x1785,0x1785,0x1785,0x1785,0x1785,0x1785,0x1785,0x1785,0x1785,0x1785,0x1785,0x1785,0x1785,0x1785,0x1785, +0x17ca,0x17ca,0x17c7,0x17c7,0x17c7,0x17c7,0x17c7,0x17c7,0x17c7,0x17c7,0x17c7,0x17c7,0x17c7,0x17c7,0x17c7,0x17c7, +0x17c7,0x17c7,0x17c7,0x17c7,0x17c7,0x17c7,0x17c7,0x17c7,0x17c7,0x17c7,0x17c7,0x17c7,0x17c7,0x17c7,0x17c7,0x17c7, +0x17ca,0x17ca,0x17ca,0x17ca,0x17ca,0x17ca,0x17ca,0x17ca,0x17ca,0x17ca,0x17ca,0x17ca,0x17ca,0x17ca,0x17ca,0x17ca, +0x17ca,0x17ca,0x17ca,0x17ca,0x17ca,0x17ca,0x17ca,0x17ca,0x17ca,0x17ca,0x17ca,0x17ca,0x17ca,0x17ca,0x17ca,0x17ca, +0x1818,0x1818,0x1818,0x1818,0x1818,0x1818,0x1818,0x1818,0x1818,0x1818,0x1818,0x1818,0x1818,0x1818,0x1818,0x1818, +0x1818,0x1818,0x1818,0x1818,0x1818,0x1815,0x1815,0x1815,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800, +0x1818,0x1818,0x1818,0x1818,0x1818,0x1818,0x1818,0x1818,0x1818,0x1818,0x1818,0x1818,0x1818,0x1818,0x1818,0x1818, +0x1818,0x1818,0x1818,0x1818,0x1818,0x1818,0x1818,0x1818,0x1818,0x1818,0x1818,0x1818,0x1818,0x1818,0x1818,0x1818, +0x183f,0x183f,0x183f,0x183f,0x183f,0x183f,0x183f,0x183f,0x183f,0x183f,0x183f,0x183f,0x183f,0x183f,0x183f,0x183f, +0x183f,0x183f,0x183f,0x183f,0x183f,0x183f,0x183f,0x183f,0x183f,0x183f,0x183f,0x183f,0x183f,0x183f,0x183f,0x183f, +0x1842,0x1842,0x1842,0x1842,0x1842,0x1842,0x1842,0x1842,0x1842,0x1842,0x1842,0x1842,0x1842,0x1842,0x1842,0x1842, +0x1842,0x1842,0x1842,0x1842,0x1842,0x1842,0x1842,0x1842,0x1842,0x1842,0x1842,0x1842,0x1842,0x1842,0x1842,0x1842, +0x1899,0x1899,0x1899,0x1899,0x1899,0x1899,0x1899,0x1899,0x1899,0x1899,0x1899,0x1899,0x1899,0x1899,0x1899,0x1899, +0x1899,0x1899,0x1899,0x1899,0x1899,0x1899,0x1899,0x1899,0x1899,0x1899,0x1899,0x1899,0x1899,0x1899,0x1899,0x1899, +0x18ba,0x18ba,0x18ba,0x18ba,0x18ba,0x18ba,0x18ba,0x18ba,0x18ba,0x18ba,0x18ba,0x18ba,0x18ba,0x18ba,0x18ba,0x18ba, +0x18ba,0x18ba,0x18ba,0x18a5,0x18ab,0x18a8,0x18a8,0x18a8,0x18a8,0x18b7,0x18bd,0x18a8,0x18a8,0x18a8,0x18a8,0x18b4, +0x18ba,0x18a8,0x18a8,0x18a8,0x18a8,0x18a8,0x18a8,0x18b7,0x18b7,0x18a8,0x18a8,0x18ba,0x18ba,0x18ba,0x18ba,0x18ba, +0x18ba,0x18ba,0x18ba,0x18ba,0x18ba,0x18ba,0x18ba,0x18ba,0x18ba,0x18ba,0x18ba,0x18ba,0x18ba,0x18ba,0x18ba,0x18ba, +0x18cc,0x18cc,0x18cc,0x18cc,0x18cc,0x18cc,0x18cc,0x18cc,0x18cc,0x18cc,0x18cc,0x18cc,0x18cc,0x18cc,0x18cc,0x18cc, +0x18cc,0x18cc,0x18cc,0x18cc,0x18cc,0x18cc,0x18cc,0x18cc,0x18cc,0x18cc,0x18cc,0x18cc,0x18cc,0x18cc,0x18cc,0x18cc, +0x18db,0x18db,0x18db,0x18db,0x18db,0x18db,0x18db,0x18db,0x18db,0x18db,0x18db,0x18db,0x18db,0x18db,0x18db,0x18db, +0x18db,0x18db,0x18db,0x18db,0x18db,0x18db,0x18db,0x18db,0x18db,0x18db,0x18db,0x18db,0x18db,0x18db,0x18db,0x18db, +0x18e1,0x18e1,0x18e1,0x18e1,0x18e1,0x18e1,0x18e1,0x18e1,0x18e1,0x18e1,0x18e1,0x18e1,0x18e1,0x18e1,0x18e1,0x18e1, +0x18e1,0x18e1,0x18e1,0x18e1,0x18e1,0x18e1,0x18e1,0x18e1,0x18e1,0x18e1,0x18e1,0x18e1,0x18e1,0x18e1,0x18e1,0x18e1, +0,0,0,0 }; static const UTrie2 propsVectorsTrie={ propsVectorsTrie_index, - propsVectorsTrie_index+4844, + propsVectorsTrie_index+4880, NULL, - 4844, - 23696, + 4880, + 24356, 0xa40, - 0x136c, + 0x1390, 0x0, 0x0, 0x110000, - 0x6f78, + 0x7230, NULL, 0, FALSE, FALSE, 0, NULL }; -static const uint32_t propsVectors[6195]={ +static const uint32_t propsVectors[6375]={ 0x67,0,0,0x67,0,0xe00000,0x67,0x80000,0x20,0x867,0,0,0xa67,0,0,0xb67, 0,0,0xc67,0,0,0xd67,0,0,0xe67,0,0,0x1067,0,0,0x1167,0, 0,0x1267,0,0,0x1367,0,0,0x1467,0,0,0x1567,0,0,0x1667,0,0, 0x1767,0,0,0x1867,0,0,0x1967,0,0,0x1a67,0,0,0x1b67,0,0,0x1d67, 0,0,0x1f67,0,0,0x2067,0,0,0x2267,0,0,0x2367,0,0,0x2467,0, 0,0x2567,0,0,0x2767,0,0,0x2867,0x80000,0x20,0x2967,0,0,0x2a67,0,0x1600000, -0x2b67,0,0,0x2d67,0,0,0x3067,0x20000000,0,0x3167,0x20000000,0,0x3267,0x20000000,0,0x3a67, -0,0,0x3b67,0,0,0x3c67,0,0,0x3e67,0,0,0x4067,0,0,0x4167,0, -0,0x4367,0,0,0x4467,0,0,0x4867,0,0,0x4967,0,0,0x4a67,0,0, -0x5067,0,0,0x5167,0,0,0x5467,0,0,0x5567,0,0,0x5667,0x80000,0x20,0x5767, -0,0,0x5867,0,0,0x5967,0,0,0x5b67,0,0,0x5c67,0,0,0x5d67,0, -0,0x6067,0x80000,0x20,0x6267,0,0,0x6367,0,0,0x6467,0,0,0x6567,0,0, -0x6f67,0,0,0x7067,0,0,0x7367,0x20000000,0,0x7567,0,0,0x7667,0,0,0x7767, -0,0,0x7867,0,0,0x7a67,0,0,0x7b67,0,0,0x7c67,0,0,0x7e67,0, -0,0x7f67,0,0,0x8167,0,0,0x8267,0,0,0x8367,0,0,0x8467,0,0, -0x8567,0,0,0x8667,0,0,0x8767,0,0,0x8867,0,0,0x8967,0,0,0x8b67, -0,0,0x8c67,0,0,0x8e67,0x20000000,0,0x8f67,0,0,0x9067,0,0,0x9167,0, -0,0x9267,0,0,0x9367,0,0,0x9567,0,0,0x9667,0,0,0x9767,0,0, -0x9867,0,0,0x9967,0,0,0x9a67,0,0,0x9c67,0,0,0x9f67,0,0,0xa167, -0,0,0xa367,0,0,0xa467,0,0,0xa567,0,0,0xa667,0,0,0xa767,0, -0,0xa867,0,0,0xa967,0,0,0xaa67,0,0xe00000,0xab67,0,0xe00000,0xac67,0,0, -0xad67,0,0,0xae67,0,0,0xaf67,0,0,0xb167,0,0,0xb267,0,0,0xb367, -0,0,0xb467,0,0,0xb567,0,0,0xb767,0,0,0xb867,0,0,0xb967,0, -0,0xba67,0,0,0xbc67,0,0,0xbd67,0,0,0xbe67,0,0,0xbf67,0,0, -0xc067,0,0,0xc167,0,0,0xc267,0,0,0xc367,0,0xe00000,0xc467,0,0xe00000,0xc667, -0,0,0xc767,0,0,0xc867,0,0,0xc967,0,0,0xca67,0,0,0xcb67,0, -0,0xcc67,0,0xe00000,0xcf67,0,0xe00000,0xd067,0,0xe00000,0xd267,0,0,0xd367,0,0, -0xd467,0,0,0xd567,0,0,0xd667,0,0,0xd867,0,0,0xd967,0,0,0xda67, -0,0,0xdb67,0,0,0xdc67,0,0,0xdd67,0,0,0xde67,0,0,0xdf67,0, -0,0xe067,0,0,0xe167,0,0,0xe267,0,0,0xe367,0,0xe00000,0xe467,0,0, -0xe567,0,0,0xe667,0,0,0xe767,0,0,0xe867,0,0,0xe967,0,0,0xea67, -0,0,0xeb67,0,0,0xec67,0,0,0xed67,0,0,0xee67,0,0,0xef67,0, -0,0xf167,0,0,0xf367,0,0,0xf567,0,0,0xf667,0,0,0xf767,0,0, -0xf867,0,0,0xf967,0,0,0xfa67,0,0xe00000,0xfb67,0,0,0xfc67,0,0,0xfd67, -0,0,0xfe67,0,0,0x10167,0,0,0x10267,0,0,0x10367,0,0,0x10467,0, -0,0x10567,0,0xe00000,0x10667,0,0,0x10767,0,0,0x10867,0,0,0x10967,0,0, -0x10a67,0,0,0x10b67,0,0,0x10c67,0,0,0x10d67,0,0,0x10e67,0,0,0x10f67, -0,0,0x11067,0,0,0x11167,0,0,0xa0067,0,0xe00000,0xa4667,0,0xe00000,0xa4767,0, -0xe00000,0xa4f67,0,0xe00000,0xa5e67,0,0xe00000,0xa5f67,0,0xe00000,0xac567,0,0xe00000,0xad167,0,0xe00000, -0xb0067,0,0xe00000,0x11000100,0,0x900020,0x11000100,0x40000001,0x440020,0x11000100,0x40000001,0x643020,0x11000100,0x40000001,0xa5a040,0x11000100, -0x40000001,0x116a8a0,0x11000200,0,0x900020,0x11000200,0x4000001,0xc4000b,0x11000200,0x7c00100,0x220402,0x11000200,0x24000000,0x10200000,0x11000200,0x24000008, -0x1710000,0x11000200,0x40000001,0x1d3b020,0x11000219,0x7c00100,0x220401,0x11000219,0x7c00100,0x250401,0x11000319,0x7c00100,0x220401,0x11000319,0x7c00100,0x220402, -0x11000319,0x7c00100,0x250400,0x11000319,0x7c00100,0x250401,0x11000419,0x7c00100,0x220400,0x11000419,0x7c00100,0x220401,0x11000419,0x7c00100,0x220402,0x11000419, -0x7c00100,0x230400,0x11000419,0x7c00100,0x250400,0x11000419,0x7c00100,0x250401,0x11000419,0x7c00100,0x250402,0x11000519,0x7c00100,0x220400,0x11000519,0x7c00100, -0x230400,0x11000600,0x4000400,0x200000,0x11000600,0x4000400,0x200002,0x11000600,0x4000400,0x201000,0x11000600,0x7c00500,0x220400,0x11000600,0x7c00500,0x230400, -0x11000600,0x7c00500,0x530400,0x11000600,0x7c00d00,0x230400,0x11000619,0x7c00500,0x22040f,0x11000800,0x4000010,0x1001401,0x11000800,0x4000400,0x200001,0x11000800, -0x6800010,0x201001,0x11000800,0x7c00500,0x230401,0x11000807,0x7c00100,0x220400,0x11000807,0x7c00100,0x250400,0x1100080e,0x4000400,0x200000,0x1100080e,0x4000400, -0x200002,0x1100080e,0x7000500,0x220402,0x1100080e,0x7c00100,0x220400,0x1100080e,0x7c00100,0x220401,0x1100080e,0x7c00100,0x220402,0x1100080e,0x7c00100,0x250400, -0x1100080e,0x7c00100,0x250401,0x1100080e,0x7c00120,0x220402,0x1100080e,0x7c00120,0x250402,0x11000908,0x4000000,0x200000,0x11000908,0x7c00100,0x220400,0x11000908, -0x7c00100,0x220401,0x11000908,0x7c00100,0x250400,0x11000908,0x7c00100,0x250401,0x11000a03,0x4000000,0x200000,0x11000a03,0x4000000,0x270000,0x11000a03,0x7c00100, -0x220400,0x11000a03,0x7c00100,0x220402,0x11000a03,0x7c00100,0x250400,0x11000a03,0x7c00500,0x230400,0x11000b13,0x2802500,0x962460,0x11000b13,0x4000000,0x200000, -0x11000b13,0x4000000,0x201000,0x11000b13,0x4000000,0x230400,0x11000b13,0x4000002,0x400000,0x11000b13,0x4000010,0x200000,0x11000b13,0x7c00100,0x2633800,0x11000c00, -0,0x218960,0x11000c02,0x2802100,0x962460,0x11000c02,0x2802400,0x962460,0x11000c02,0x4000000,0x200000,0x11000c02,0x4000000,0x1329400,0x11000c02,0x4000000, -0x1329800,0x11000c02,0x4000000,0x1500000,0x11000c02,0x6800000,0x1329800,0x11000c02,0x7c00100,0x230400,0x11000c02,0x7c00100,0x230401,0x11000c02,0x7c00100,0x230402, -0x11000c02,0x7c00500,0x230400,0x11000c02,0x7d00100,0x230400,0x11000c02,0xc000010,0xb48000,0x11000f0a,0x2802100,0x962460,0x11000f0a,0x2802400,0x962460,0x11000f0a, -0x2806400,0x962460,0x11000f0a,0x4000000,0x200000,0x11000f0a,0x6800100,0x962540,0x11000f0a,0x7c00100,0x230400,0x11000f0a,0x7c00100,0x230401,0x11001004,0x2802100, -0x962460,0x11001004,0x2802400,0x962460,0x11001004,0x2806400,0x962460,0x11001004,0x4000000,0x200000,0x11001004,0x4000000,0x1500000,0x11001004,0x6800100,0x962540, -0x11001004,0x6800100,0x962541,0x11001004,0x7c00100,0x230400,0x11001004,0x7c00100,0x230401,0x11001110,0x2802100,0x962460,0x11001110,0x2802400,0x962460,0x11001110, -0x2806400,0x962460,0x11001110,0x6800100,0x962540,0x11001110,0x7c00100,0x230400,0x11001110,0x7c00100,0x230401,0x1100120f,0x2802100,0x962460,0x1100120f,0x2802400, -0x962460,0x1100120f,0x2806400,0x962460,0x1100120f,0x6800100,0x962540,0x1100120f,0x7c00100,0x230400,0x1100131f,0x2802100,0x962460,0x1100131f,0x2802400,0x962460, -0x1100131f,0x2806400,0x962460,0x1100131f,0x4000000,0x200000,0x1100131f,0x6800000,0x1329800,0x1100131f,0x6800100,0x962540,0x1100131f,0x6800100,0x962541,0x1100131f, -0x7c00100,0x230400,0x1100131f,0x7c00100,0x230401,0x11001423,0x2802100,0x962460,0x11001423,0x2806400,0x962460,0x11001423,0x6800100,0x962540,0x11001423,0x6800100, -0x962541,0x11001423,0x7c00100,0x230400,0x11001423,0x7c00100,0x230401,0x11001524,0x2802100,0x962460,0x11001524,0x2802100,0x962461,0x11001524,0x2806400,0x962460, -0x11001524,0x6800000,0x1329800,0x11001524,0x6800100,0x962540,0x11001524,0x7c00100,0x230400,0x11001615,0x2802100,0x962460,0x11001615,0x2806400,0x962460,0x11001615, -0x6800000,0x1329800,0x11001615,0x6800100,0x962540,0x11001615,0x6800100,0x962541,0x11001615,0x7c00100,0x230400,0x1100171a,0x2802100,0x962460,0x1100171a,0x2806400, -0x962460,0x1100171a,0x6800000,0x1329800,0x1100171a,0x6800100,0x962540,0x1100171a,0x6800100,0x962541,0x1100171a,0x7c00100,0x230400,0x11001900,0x4000000,0x1600000, -0x11001926,0x2802100,0x1862460,0x11001926,0x2802400,0x1862460,0x11001926,0x2806100,0x1862460,0x11001926,0x4000000,0x200000,0x11001926,0x4000010,0x400000,0x11001926, -0x6800000,0x1329800,0x11001926,0x7800100,0x1830142,0x11001926,0x7c00100,0x1830000,0x11001926,0x7c00900,0x1830000,0x11001926,0x7e00100,0x1830000,0x11001a18,0x2802100, -0x1862460,0x11001a18,0x2802400,0x1862460,0x11001a18,0x6800000,0x1329800,0x11001a18,0x7800100,0x1830142,0x11001a18,0x7c00100,0x1830000,0x11001a18,0x7c00100,0x1830002, -0x11001a18,0x7c00900,0x1830000,0x11001a18,0x7e00100,0x1830000,0x11001d0c,0x7c00100,0x230400,0x11001d0c,0x7c00100,0x250400,0x11001e12,0x7c00100,0x2230500,0x11001e12, -0x7c00100,0x2330520,0x11001e12,0x7c80100,0x2330520,0x11002619,0x7c00100,0x220401,0x11002619,0x7c00100,0x220402,0x11002619,0x7c00100,0x250401,0x1100270e,0x4000400, -0x200001,0x1100270e,0x4000400,0x200002,0x1100270e,0x4000400,0x500001,0x1100270e,0x7c00100,0x220401,0x1100270e,0x7c00100,0x250401,0x11002800,0x80000,0x918820, -0x11002800,0x80000,0x1c18020,0x11002800,0x180000,0x918820,0x11002800,0x4000001,0x440001,0x11002800,0x4000001,0x440002,0x11002800,0x4000001,0xc4000b,0x11002800, -0x6800000,0x201c00,0x11002800,0x6800020,0x201c00,0x11002800,0x24000000,0x200000,0x11002800,0x24000000,0x200002,0x11002800,0x24000000,0x810000,0x11002800,0x24000000, -0x1410000,0x11002800,0x24000000,0x1500000,0x11002800,0x24000000,0x1500002,0x11002800,0x24000002,0x400000,0x11002800,0x24000006,0xc0000b,0x11002800,0x24000008,0x1410000, -0x11002800,0x24000008,0x1710000,0x11002800,0x24000020,0x1001400,0x11002800,0x24000020,0x1500002,0x11002800,0x2c000010,0x1248000,0x11002800,0x2c000010,0x11248002,0x11002800, -0x40000001,0x63b020,0x11002800,0x40080000,0x918820,0x11002801,0x80000,0x2a65620,0x11002801,0x82000,0x962460,0x11002900,0x4000000,0x20000e,0x11002900,0x4000000, -0x20000f,0x11002900,0x4000020,0x20000e,0x11002900,0x4000020,0x20000f,0x11002900,0x4000020,0x81000e,0x11002900,0x4000020,0x81000f,0x11002900,0x4000020,0x141000e, -0x11002900,0x4000020,0x141000f,0x11002900,0x4000022,0x20000e,0x11002900,0x4000022,0x20000f,0x11002a00,0x4000000,0x1500000,0x11002a00,0x4000000,0x1600000,0x11002a00, -0x4000000,0x1600002,0x11002b01,0x2000,0x962460,0x11002b01,0x2802020,0x962460,0x11002c00,0x4000000,0x200000,0x11002c00,0x4000000,0x200002,0x11002c00,0x4000000, -0x20000f,0x11002c00,0x4000020,0x200000,0x11002c00,0x7c00000,0x200000,0x11002c00,0x7c00020,0x200000,0x11002c00,0x7c00120,0x220405,0x11002c00,0x7c00120,0x230402, -0x11002c00,0x7c00120,0x250402,0x11002c00,0x7c00120,0x250405,0x11002c19,0x7c00100,0x250400,0x11002c19,0x7c00100,0x250401,0x11002d00,0x4000000,0x100006,0x11002d00, -0x4000000,0x200006,0x11002d19,0x7c00100,0x220402,0x11002d19,0x7c00100,0x230400,0x11002d19,0x7c00100,0x250402,0x11002e00,0x24000000,0x200000,0x11002e00,0x24000020, -0x200000,0x11002e00,0x24000020,0x200001,0x11002e00,0x24000020,0x10200000,0x11002f00,0x24000020,0x200000,0x11002f00,0x24000020,0x200001,0x11002f00,0x24000020,0x200002, -0x11002f00,0x24000020,0xf00000,0x11002f00,0x24000020,0x1600000,0x11002f00,0x24000022,0x1600000,0x11003000,0x24000000,0x200000,0x11003000,0x24000000,0x10200000,0x11003000, -0x24000020,0x200000,0x11003000,0x24000020,0x810000,0x11003000,0x24000020,0x1410000,0x11003100,0x24000000,0x200000,0x11003200,0x24000000,0x200000,0x11003300,0x4000000, -0x100003,0x11003400,0x24000000,0x100000,0x11003400,0x24000000,0x200000,0x11003500,0x24000000,0x200000,0x11003600,0x24000000,0x200000,0x11003600,0x24000000,0x10200000, -0x11003600,0x24000020,0x200000,0x11003700,0x24000000,0x200000,0x11003700,0x24000000,0xe00000,0x11003700,0x24000000,0x10200000,0x11003700,0x24000000,0x10e00000,0x11003700, -0x24000000,0x928045a0,0x11003700,0x24000020,0x200000,0x11003800,0x4000000,0x100000,0x11003800,0x24000000,0x200000,0x11003800,0x24000000,0xb00000,0x11003800,0x24000000, -0xe00000,0x11003800,0x24000000,0x1710000,0x11003800,0x24000000,0x10200000,0x11003800,0x24000000,0x10b00000,0x11003800,0x24000000,0x10e00000,0x11003800,0x24000000,0x10e05200, -0x11003800,0x24000000,0x928045a0,0x11005003,0x7c00100,0x220402,0x11005013,0x2802500,0x962460,0x11005013,0x4000020,0x200005,0x11005013,0x7c00100,0x2633801,0x11005013, -0x7c00100,0x2633802,0x11005013,0x7c00100,0x2633805,0x11005019,0x7c00100,0x220402,0x11005100,0x24000000,0x810000,0x11005100,0x24000000,0x1410000,0x11005102,0x7000100, -0x230408,0x11005102,0x7c00100,0x230404,0x11005102,0x7c00100,0x230407,0x11005102,0x7c00100,0x230408,0x11005102,0x7c00100,0x230409,0x11005201,0x2802400,0x962460, -0x11005500,0x80000,0x1e18820,0x11005502,0x7000100,0x230408,0x11005502,0x7c00100,0x230404,0x11005502,0x7c00100,0x230407,0x11005502,0x7c00100,0x230408,0x11005502, -0x7c00100,0x230409,0x11005667,0x1000,0,0x11020200,0x80004,0x418820,0x11020200,0x4000000,0x100006,0x11020200,0x4000000,0x10000f,0x11020200,0x4000400, -0x100002,0x11020200,0x4000400,0x500002,0x11020200,0x6800c00,0x101000,0x11020200,0x24000000,0x100000,0x11020200,0x24000000,0x1400000,0x11020200,0x24000000,0x1500000, -0x11020200,0x24000000,0x1600000,0x11020200,0x24000000,0x10200000,0x11020200,0x24000020,0x100000,0x11020200,0x24000020,0x1600000,0x11020219,0x7c00100,0x12040f,0x11020219, -0x7c00100,0x220400,0x11020219,0x7c00100,0x220401,0x11020219,0x7c00100,0x250400,0x11020319,0x7c00100,0x220400,0x11020319,0x7c00100,0x220401,0x11020319,0x7c00100, -0x220402,0x11020319,0x7c00100,0x250400,0x11020319,0x7c00100,0x250402,0x11020319,0x7d00100,0x220402,0x11020419,0x7c00100,0x220401,0x11020519,0x7c00100,0x220400, -0x11020600,0x4000400,0x100002,0x11020600,0x4000400,0x200000,0x11020600,0x7c00500,0x130400,0x11020600,0x7c00d00,0x130400,0x11020701,0x2802400,0x962460,0x11020701, -0x2802400,0x962461,0x11020701,0x2802400,0xc62460,0x1102080e,0x7c00100,0x220400,0x1102080e,0x7c00100,0x250400,0x11020908,0x7c00100,0x220400,0x11020908,0x7c00100, -0x220401,0x11020908,0x7c00100,0x250400,0x11020908,0x7c00100,0x250401,0x11022800,0x24000000,0x100000,0x11022800,0x24000000,0x200000,0x11022800,0x24000000,0x200002, -0x11022800,0x24000000,0x401000,0x11022800,0x24000000,0xf00002,0x11022800,0x24000000,0xf0ac02,0x11022800,0x24000000,0x1500000,0x11022800,0x24000002,0x100000,0x11022800, -0x24000002,0x370000,0x11022800,0x24000002,0x470000,0x11022800,0x24000006,0x400000,0x11022800,0x24000008,0x1710000,0x11022800,0x24000008,0x1712c00,0x11022800,0x24000020, -0x100000,0x11022800,0x24000020,0x1500000,0x11022800,0x24000020,0x1500002,0x11022900,0x4000000,0x10000e,0x11022900,0x4000000,0x10000f,0x11022919,0x7c00100,0x12040f, -0x11022c00,0x4000000,0x100002,0x11022c00,0x4000000,0x1500002,0x11022c00,0x4000000,0x1600002,0x11022c00,0x4000000,0x1010000f,0x11022c00,0x7c00120,0x120405,0x11022c0e, -0x7c00100,0x250401,0x11022c19,0x7c00100,0x150401,0x11022d00,0x4000000,0x100006,0x11022d00,0x4000000,0x200006,0x11022d19,0x7c00100,0x120402,0x11022d19,0x7c00100, -0x150402,0x11022e00,0x24000000,0x200000,0x11022e00,0x24000020,0x100000,0x11022e00,0x24000020,0x10100000,0x11022f00,0x24000020,0x100000,0x11022f00,0x24000020,0x100001, -0x11022f00,0x24000020,0x100002,0x11023000,0x24000000,0x100000,0x11023300,0x4000000,0x100002,0x11023300,0x4000000,0x100003,0x11023300,0x4000100,0x120403,0x11023300, -0x4000100,0x150403,0x11023300,0x4000100,0x10150403,0x11023400,0x24000000,0x100000,0x11023500,0x24000000,0x100000,0x11023600,0x24000000,0x100000,0x11023600,0x24000020, -0x100000,0x11023600,0x24000020,0x10100000,0x11023700,0x24000000,0x100000,0x11023700,0x24000000,0xe00000,0x11023700,0x24000000,0x10100000,0x11023700,0x24000000,0x10e00000, -0x11023700,0x24000020,0x100000,0x11023700,0x24000020,0x10100000,0x11023800,0x4000000,0x100000,0x11023800,0x24000000,0x200000,0x11024e67,0,0,0x11025600, -0x4000000,0x100000,0x11042a00,0x4000000,0x1600000,0x11045700,0x4000000,0x20000a,0x11045700,0x4000020,0x20000a,0x11045712,0x7c00100,0xe3040a,0x11045712,0x7c80100, -0xe3040a,0x11045716,0x7c00100,0xe30c0a,0x11045716,0x7c00100,0x2530c0a,0x11063d00,0x4000001,0x440011,0x11065700,0x4000000,0x810011,0x11065700,0x4000000,0xe00011, -0x11065700,0x4000000,0x1410011,0x11065700,0x4000000,0x1500011,0x11065700,0x4000000,0x1600011,0x11065700,0x4000006,0xe70011,0x11065700,0x4000008,0xe00011,0x11065700, -0x4000008,0xe02c11,0x11065700,0x4000010,0x871411,0x11065700,0x4000010,0x1201411,0x11065700,0x4000010,0x1271011,0x11065700,0x4000020,0xe00011,0x11065700,0x4000400, -0xe00011,0x11065700,0x4000420,0xe00011,0x11065700,0x6800000,0xe01c11,0x11065700,0x6800040,0xe00011,0x11065700,0xc000010,0x80ac11,0x11065700,0xc000010,0xb48011, -0x11065719,0x7c00100,0xe20411,0x11065719,0x7c00100,0xe50411,0x11065719,0x7c00140,0xe20411,0x11065719,0x7c00140,0xe50411,0x11080100,0x6800000,0x201c00,0x11080100, -0x68000c0,0x11329800,0x11080100,0x24000000,0x200000,0x11080100,0x24000000,0x810000,0x11080100,0x24000000,0x1410000,0x11080100,0x24000000,0x1500000,0x11080100,0x24000000, -0x1600000,0x11080100,0x24000000,0x1b00000,0x11080100,0x24000000,0x2410000,0x11080100,0x24000000,0x10200000,0x11080100,0x24000006,0xd70000,0x11080100,0x24000008,0x1713c00, -0x11080100,0x24000008,0x1714000,0x11080100,0x24000010,0x1001400,0x11080100,0x24000010,0x1071000,0x11080100,0x24000010,0x1071400,0x11080100,0x24000020,0x200000,0x11080100, -0x24000020,0x400000,0x11080100,0x24000020,0x1600000,0x11080100,0x24000400,0x200000,0x11080100,0x24000420,0x200000,0x11080100,0x2c000010,0xb48000,0x11080100,0x2c000010, -0x100ac00,0x11080100,0x44000001,0x1a40000,0x11080119,0x7c00100,0x220400,0x11080119,0x7c00100,0x250400,0x11080119,0x7c001c0,0x220400,0x11080119,0x7c001c0,0x250400, -0x11080200,0x4000400,0x200002,0x11080200,0x24000000,0x200000,0x11080200,0x24000000,0x1500000,0x11080200,0x24000000,0x1600000,0x11080200,0x24000020,0x200000,0x110a1e12, -0x7c00100,0x2130480,0x110a1e12,0x7c80100,0x2130480,0x110a3000,0x24000000,0x30e00000,0x110a3000,0x24100000,0x810001,0x110a3000,0x24100000,0x1410001,0x110a3700,0x24000000, -0x30200000,0x110a3d00,0x4000000,0xe00000,0x110a3d00,0x4000000,0xe00002,0x110a3d00,0x24000000,0xe00000,0x110a3d11,0x7c00300,0xe30000,0x110a3d11,0x7c00900,0x1230400, -0x110a3d12,0x2802400,0x962460,0x110a3e14,0x7c00100,0xe30000,0x110a3e14,0x7c00100,0xe30001,0x110a3e14,0x7c00100,0x2530000,0x110a3e14,0x7c00900,0x1230000,0x110a3e14, -0x7c00900,0x1230001,0x110a3f16,0x7c00100,0xe30c00,0x110a3f16,0x7c00100,0xe30c01,0x110a3f16,0x7c00100,0x2530c00,0x110a3f16,0x7c00900,0x1230c00,0x110a3f16,0x7c00900, -0x1230c01,0x110a4005,0x7c00100,0xe30400,0x110a4112,0x7c00100,0xe30402,0x110a4112,0x7c80100,0xe30402,0x110a4400,0x4000000,0xe00000,0x110a4412,0x4000000,0xe00002, -0x110a4412,0x4000000,0xe00003,0x110a4416,0x4000000,0xe00c03,0x110a4500,0x4000000,0xe0000d,0x110a4516,0x4000000,0xe00c0d,0x110a4711,0x7c40300,0xe30000,0x110a4f11, -0x7c00300,0xe30001,0x110a4f11,0x7c40300,0xe30000,0x110a5300,0x4000000,0x810010,0x110a5300,0x4000000,0xe00002,0x110a5300,0x4000000,0xe00010,0x110a5300,0x4000000, -0x1410010,0x110a5300,0x4000002,0xe70010,0x110a5300,0x4000008,0x810010,0x110a5300,0x4000008,0x1410010,0x110a5300,0x6800000,0xe01c02,0x110a5300,0x6800000,0xe01c10, -0x110a5400,0x4000000,0x81000c,0x110a5400,0x4000000,0xe0000c,0x110a5400,0x4000000,0x141000c,0x110a5400,0x4000000,0x150000c,0x110a5400,0x4000000,0x160000c,0x110a5400, -0x4000002,0xe7000c,0x110a5400,0x4000010,0x87140c,0x110a5400,0x4000010,0xe7000c,0x110a5400,0x4000010,0x120140c,0x110a5400,0x4000010,0x127100c,0x110a5400,0x4000020, -0xe0000c,0x110a5400,0x4000026,0xe7000c,0x110a5400,0xc000010,0x80ac0c,0x110a5400,0xc000010,0xb4800c,0x11400a0c,0xc000010,0x1049400,0x11400c0e,0x4000010,0xb00000, -0x11400c0e,0x4000010,0x1071400,0x11400c0e,0xc000010,0xb48000,0x11400c11,0x7c00900,0x230400,0x11400f34,0xc000010,0x448000,0x11400f44,0xc000010,0x448000,0x11401d70, -0x4000000,0x200000,0x11403d92,0x4000000,0xe00000,0x11445787,0x4000004,0x120000a,0x11445787,0x4000008,0x81000a,0x11445787,0x4000008,0x141000a,0x11445787,0x4000010, -0x87000a,0x11445787,0xc000010,0x84800a,0x11445790,0x3802500,0x126246a,0x11445790,0x7c00d00,0x2530c0a,0x114a3d87,0x24000000,0x810000,0x114a3d87,0x24000000,0x1410000, -0x114a3d87,0x24000008,0x810000,0x114a3d87,0x24000008,0x1410000,0x114a3d87,0x24000010,0x870000,0x114a3d87,0x2c000010,0x848000,0x114a3d8d,0x4000000,0xe00000,0x114a3d8d, -0x24000000,0xe00000,0x114a3d8d,0x24000002,0x1200000,0x114a3d8d,0x24000002,0x10e00000,0x114a3d8d,0x24000008,0x810000,0x114a3d8d,0x24000008,0x1410000,0x114a3d90,0x7c00900, -0x930c00,0x114a3d90,0x7c00900,0xe30c00,0x114a3d92,0x7c00300,0xe30000,0x114a3e90,0x7000400,0x1200c02,0x114a3f87,0x4000004,0x1200000,0x114a3f90,0x7c00d00,0x2530c00, -0x114a4292,0x4000000,0xe00000,0x114a4292,0x4000000,0xe0000f,0x114a4492,0x4000000,0xe00002,0x114a4492,0x4000000,0xe00003,0x114a4492,0x4000000,0x10e00003,0x114a4592, -0x4000000,0xe00002,0x114a4592,0x4000000,0xe0000d,0x1180090a,0x2802400,0x962460,0x11800c17,0x2802100,0x962460,0x11800c17,0x2802500,0x962460,0x11800f1d,0x2802400, -0x962460,0x11800f29,0x2802400,0x962460,0x11820700,0x2802400,0x962460,0x11820700,0x2802500,0x962460,0x118a3d93,0x2802400,0x962460,0x118a3e90,0x2802400,0x962460, -0x11c00904,0x2802400,0x962460,0x11c00908,0x2802400,0x962460,0x11c00c1b,0x6800000,0x1329800,0x11c00f58,0x6800000,0x1329800,0x11c0105d,0x6800000,0x1329800,0x11c01161, -0x6800000,0x1329800,0x11c01265,0x6800000,0x1329800,0x11c01469,0x4000000,0x200000,0x11c01469,0x6800000,0x1329800,0x11c01469,0x7c00100,0x230400,0x11c0511b,0x7c00100, -0x230408,0x20000067,0x1000,0,0x20000b13,0x2802400,0x962460,0x20000b13,0x2802500,0x962460,0x20001b27,0x2802100,0x962460,0x20001b27,0x2802100,0x962461, -0x20001b27,0x2802400,0x962460,0x20001b27,0x2806400,0x962460,0x20001b27,0x2902100,0x962462,0x20001b27,0x4000000,0x200000,0x20001b27,0x4000000,0x400000,0x20001b27, -0x4000000,0x500000,0x20001b27,0x4000000,0x810000,0x20001b27,0x4000000,0xb00000,0x20001b27,0x4000000,0xc0000b,0x20001b27,0x4000000,0x1410000,0x20001b27,0x4000010, -0xb00000,0x20001b27,0x4000010,0xc00000,0x20001b27,0x6800000,0x1329800,0x20001b27,0x6800100,0x462540,0x20001b27,0x6800400,0x962540,0x20001b27,0x7c00100,0x230400, -0x20001b27,0x7c00100,0x230401,0x20002619,0x7c00100,0x220401,0x20002a00,0x4000000,0x1600000,0x20004b67,0,0x1900020,0x20004c67,0,0x1900020,0x20004d67, -0,0x1900020,0x20006d67,0x1000,0,0x20006e67,0x1000,0,0x20026d67,0,0,0x20026e67,0,0,0x200a4a12,0x7c00100, -0x1f304c1,0x200a4a12,0x7c00100,0x20304e1,0x21005600,0x4000000,0x700000,0x21022a00,0x4000000,0x1600000,0x30000419,0x7c00100,0x220400,0x30000419,0x7c00100,0x220401, -0x30000419,0x7c00100,0x250400,0x30000419,0x7c00100,0x250401,0x30000519,0x7c00100,0x220400,0x30000600,0x4000400,0x200000,0x30000600,0x7c00500,0x230400,0x30000605, -0x4000400,0x200000,0x3000080e,0x7c00100,0x220400,0x30000908,0x2000,0x962460,0x30000908,0x7c00100,0x220400,0x30000908,0x7c00100,0x220401,0x30000908,0x7c00100, -0x250400,0x30000908,0x7c00100,0x250401,0x30000a03,0x4000006,0x400000,0x30000c02,0x4000000,0x200000,0x30000c02,0x7c00100,0x230400,0x30000d22,0,0x218960, -0x30000d22,0x2802100,0x962460,0x30000d22,0x2802400,0x962460,0x30000d22,0x2802500,0x962460,0x30000d22,0x4000000,0x200000,0x30000d22,0x4000010,0x200000,0x30000d22, -0x7c00100,0x230400,0x30000d22,0xc000010,0x248000,0x30000e25,0x2802500,0x962460,0x30000e25,0x7c00100,0x230400,0x30001821,0x2802100,0x962460,0x30001821,0x2806400, -0x962460,0x30001821,0x4000000,0x200000,0x30001821,0x6800100,0x962540,0x30001821,0x6800100,0x962541,0x30001821,0x7c00100,0x230400,0x30001b27,0x2802100,0x962460, -0x30001b27,0x2802400,0x962460,0x30001b27,0x4000000,0x200000,0x30001b27,0x4000000,0x400000,0x30001b27,0x7c00100,0x230400,0x30001c1c,0x2802100,0x1862460,0x30001c1c, -0x2802400,0x1862460,0x30001c1c,0x2806400,0x1862460,0x30001c1c,0x4000000,0x200000,0x30001c1c,0x6800100,0x1862400,0x30001c1c,0x6800100,0x1862540,0x30001c1c,0x7c00100, -0x1830000,0x30001c1c,0x7c00100,0x1830001,0x30001c1c,0xc000010,0x448000,0x30001f0b,0x4000000,0x200000,0x30001f0b,0x4000010,0x200000,0x30001f0b,0x4000010,0x400000, -0x30001f0b,0x6800000,0x200000,0x30001f0b,0x7c00100,0x230400,0x30001f0b,0xc000010,0x248000,0x30002006,0x7c00100,0x250400,0x30002128,0x4000010,0x200000,0x30002128, -0x7c00100,0x230400,0x30002128,0xc000010,0x248000,0x3000221d,0x4000000,0x810000,0x3000221d,0x4000000,0x1410000,0x3000221d,0x4000001,0x440000,0x3000221d,0x7c00100, -0x230400,0x30002300,0x4000010,0x400000,0x30002320,0x7c00100,0x230400,0x30002417,0x2802100,0x1862460,0x30002417,0x2802400,0x1862460,0x30002417,0x2806400,0x1862460, -0x30002417,0x2882000,0x1862460,0x30002417,0x4000000,0x200000,0x30002417,0x4000000,0x400000,0x30002417,0x4000000,0x1600000,0x30002417,0x4000010,0x400000,0x30002417, -0x4000010,0x1200000,0x30002417,0x6800000,0x1329800,0x30002417,0x6800100,0x1862540,0x30002417,0x7c00100,0x1830000,0x30002417,0x7d00100,0x1830000,0x3000251b,0x80000, -0xc18820,0x3000251b,0x2802100,0x962460,0x3000251b,0x3c02100,0x962460,0x3000251b,0x4000000,0x200000,0x3000251b,0x4000006,0x500000,0x3000251b,0x4000010,0x400000, -0x3000251b,0x4000010,0xb70000,0x3000251b,0x4000800,0x200000,0x3000251b,0x6800000,0x1329800,0x3000251b,0x7c00100,0x230400,0x3000251b,0x7c00900,0x230400,0x3000251b, -0xc000010,0xb48000,0x3000251b,0x12882000,0x962460,0x30002800,0x4000001,0xc41c0b,0x30002800,0x24000000,0x200000,0x30002800,0x2c000010,0x1248002,0x30002800,0x2c000010, -0x11248002,0x30002a00,0x4000000,0x1600000,0x30002b01,0x2000,0x962460,0x30002c00,0x4000000,0x200000,0x30002c00,0x7c00100,0x10220405,0x30002d19,0x7c00100,0x250400, -0x30002e00,0x24000000,0x200000,0x30003000,0x24000000,0x200000,0x30003100,0x24000000,0x200000,0x30003600,0x24000000,0x200000,0x30003700,0x24000000,0x200000,0x3000392e, -0x24000000,0x200000,0x30005013,0x7c00100,0x2633801,0x30005600,0,0x918820,0x30020600,0x4000400,0x500000,0x30020701,0x2802400,0x962460,0x30020701,0x2802400, -0xc62460,0x300a3a11,0x4020000,0xe00000,0x300a3a11,0x4020000,0xe00002,0x300a3b11,0x4020000,0xe00002,0x300a3c00,0x4008000,0xe00000,0x300a3c00,0x4010000,0xe00000, -0x300a3d11,0x7c00300,0xe30002,0x300a4305,0x7c00100,0xe30400,0x300a4611,0x7c40300,0xe30000,0x300a4829,0x7c00100,0xe30400,0x300a4829,0x7c00900,0x1230400,0x300a4929, -0x4000000,0xe00000,0x30402576,0x4000010,0x400000,0x30402576,0x4000010,0xb70000,0x30402576,0xc000010,0xb48000,0x304a3d92,0x4000000,0xe00000,0x30800c17,0x2802100, -0x962460,0x30c01c6e,0x6800000,0x1329800,0x3100080e,0x7c00120,0x220402,0x3100080e,0x7c00120,0x250402,0x31005167,0x1000,0,0x3100581e,0x4000000,0x200000, -0x3100581e,0x7c00100,0x230400,0x3100590d,0x7c00100,0x230400,0x31005a09,0x7c00100,0x220400,0x31005a09,0x7c00100,0x250400,0x31005b00,0x4000000,0x200000,0x31005c00, -0x80000,0x918820,0x31005c00,0x2802000,0x962460,0x31005c00,0x2802400,0x962460,0x31005c00,0x4000000,0x200000,0x31005c00,0x4000000,0x200001,0x31005c00,0x6800000, -0x962540,0x31005c00,0x6800400,0x962540,0x31005c01,0x2802400,0x962460,0x31005d00,0x4000020,0x200005,0x31005d00,0x6800020,0x1329805,0x31005d00,0x7c00120,0x220405, -0x31005d00,0x7c00120,0x250405,0x31006000,0x82000,0x962460,0x31006000,0x180000,0x918820,0x310a5e11,0x7c40300,0xe30000,0x310a5f11,0x7c00300,0xe30001,0x32000419, -0x7c00100,0x250400,0x3200080e,0x4000020,0x200000,0x3200080e,0x7c00100,0x220400,0x3200080e,0x7c00100,0x250400,0x32000908,0x7c00100,0x220400,0x32000908,0x7c00100, -0x250400,0x32000c02,0x7c00100,0x230400,0x32000e25,0x7c00100,0x230400,0x32001d0c,0x7c00100,0x230400,0x32002800,0x80000,0x1e18820,0x32002800,0x80020,0x218820, -0x32002800,0x4000001,0x440002,0x32002800,0x24000000,0x200000,0x32002800,0x24000000,0x200002,0x32002800,0x24000020,0x200000,0x32002800,0x2c000010,0x1248002,0x32002919, -0x7c00100,0x22040f,0x32002a00,0x4000000,0x1600000,0x32002b01,0x2000,0x962460,0x32002b01,0x2802000,0x962460,0x32002b01,0x2802020,0x962460,0x32002c00,0x4000000, -0x200000,0x32002c00,0x4000020,0x200000,0x32002c00,0x4000020,0x200005,0x32002c00,0x7c00120,0x220405,0x32002c00,0x7c00120,0x250405,0x32002e00,0x24000020,0x200000, -0x32002f00,0x24000020,0x200000,0x32003000,0x24000000,0x200000,0x32003000,0x24000020,0x200000,0x32003500,0x24000000,0x200000,0x32003600,0x24000020,0x200000,0x32003600, -0x24000020,0x10200000,0x32003700,0x24000000,0x100000,0x32003700,0x24000000,0x200000,0x32003700,0x24000000,0x10200000,0x32003800,0x24000000,0x810000,0x32003800,0x24000000, -0x1410000,0x32005102,0x4000000,0x1500008,0x32005502,0x7c00100,0x230400,0x32006108,0x7c00100,0x220400,0x32006108,0x7c00100,0x250400,0x3200622a,0x2802100,0x962460, -0x3200622a,0x2806000,0x962460,0x3200622a,0x7c00100,0x230400,0x3200632b,0x2802100,0x962460,0x3200632b,0x2806000,0x962460,0x3200632b,0x7c00100,0x230400,0x3200642c, -0x2802100,0x962460,0x3200642c,0x7c00100,0x230400,0x3200652d,0x2802100,0x962460,0x3200652d,0x7c00100,0x230400,0x32006600,0x24000020,0x200000,0x32006700,0x24000020, -0x200000,0x32006800,0x24000020,0x200000,0x32006800,0x24000020,0x10200000,0x32006900,0x24000020,0x200000,0x32006900,0x24000020,0x810000,0x32006900,0x24000020,0x1410000, -0x32006a00,0x24000020,0x200000,0x32006a00,0x24000020,0x200001,0x32006a00,0x24000020,0x200002,0x32020701,0x2882000,0xc62460,0x32023300,0x4000000,0x100000,0x32026c01, -0x12882000,0x962460,0x32065700,0x4000000,0x810011,0x32065700,0x4000000,0x1410011,0x32086600,0x24000020,0x810000,0x32086600,0x24000020,0x1410000,0x32086900,0x24000020, -0x810000,0x32086900,0x24000020,0x1410000,0x320a3600,0x24000020,0x30200000,0x320a3d11,0x7c00100,0x1230400,0x320a3e14,0x7c00100,0xe30010,0x320a3e14,0x7c00100,0x2530000, -0x320a3f16,0x7c00100,0xe30c10,0x320a4400,0x4000000,0xe00003,0x320a4929,0x4000000,0xe00000,0x320a4f11,0x7c00300,0xe30001,0x320a6b16,0x7c00100,0x2530c00,0x32406372, -0xc000010,0x448000,0x324a3d95,0x4000000,0x10e00000,0x324a3d95,0x7c00100,0x1230400,0x324a3f90,0x4000002,0x1200c00,0x324a538d,0x24000000,0xe00000,0x32820701,0x2802000, -0x962460,0x40000419,0x7c00100,0x220400,0x40000519,0x7c00100,0x220400,0x40000600,0x4000400,0x200000,0x4000080e,0x7c00100,0x220400,0x4000080e,0x7c00100,0x250400, -0x4000080e,0x7c00100,0x250402,0x40000c02,0,0x218960,0x40000c02,0x2802100,0x962460,0x40000c02,0x2802400,0x962460,0x40000c02,0x2802500,0x962460,0x40000c02, -0x4000000,0x200000,0x40000c02,0x4000000,0x1071400,0x40000c02,0x7c00100,0x230400,0x40000d22,0x7c00100,0x230400,0x40000f0a,0x7c00100,0x230400,0x40001004,0x7c00100, -0x230400,0x40001110,0x2802100,0x962460,0x40001110,0x6800100,0x962540,0x4000120f,0x2802100,0x962460,0x4000120f,0x4000000,0x1600000,0x4000120f,0x7c00100,0x230400, -0x4000131f,0x7c00100,0x230400,0x40001423,0x4000000,0x200000,0x40001423,0x4000000,0x1600000,0x40001615,0x2802400,0x962460,0x40001615,0x7c00100,0x230400,0x40002417, -0x2802400,0x1862460,0x40002417,0x4000000,0x200000,0x40002800,0x6800000,0x201c00,0x40002800,0x24000002,0x200000,0x40002c00,0x4000000,0x200002,0x40003000,0x24000000, -0x10200000,0x40003000,0x24000020,0x200000,0x40003700,0x24000000,0x200000,0x40003700,0x24000000,0x10200000,0x40005a09,0x7c00100,0x220400,0x40005a09,0x7c00100,0x250400, -0x40005d00,0x7c00120,0x220405,0x40006f30,0x2802100,0x962460,0x40006f30,0x2802400,0x962460,0x40006f30,0x4000000,0x200000,0x40006f30,0x6800000,0x1329800,0x40006f30, -0x6800100,0x962540,0x40006f30,0x7c00100,0x230400,0x40006f30,0xc000010,0xb48000,0x40007034,0x7c00100,0x1830000,0x40007117,0x4000000,0x200000,0x40007208,0x7c00100, -0x220400,0x4000720e,0x7c00100,0x220400,0x4000720e,0x7c00500,0x22040e,0x4000720e,0x7c00500,0x22040f,0x40007219,0x7c00100,0x220400,0x40007219,0x7c00500,0x220400, -0x40007219,0x7c00500,0x22040e,0x40007219,0x7c00500,0x22040f,0x40007300,0x24000000,0x200000,0x40007300,0x24000000,0x10200000,0x40007400,0x4000000,0x200000,0x40007531, -0x7c00100,0x230400,0x40007631,0x7c00100,0x230400,0x40007835,0x4000010,0x400000,0x40007835,0x7c00100,0x230400,0x40007933,0x7c00100,0x230400,0x40007a32,0x6800000, -0x1329800,0x40007a32,0x7c00100,0x230400,0x40007b2f,0x7c00100,0x230400,0x40007c00,0x4000000,0x200000,0x40020701,0x2802400,0x962460,0x40020701,0x2802400,0xc62460, -0x40023300,0x4000000,0x200000,0x40027d01,0x12882000,0x962460,0x400a3700,0x24000000,0x30200000,0x400a3700,0x24000000,0x30e00000,0x400a4400,0x4000000,0xe0000d,0x400a4412, -0x4000000,0xe00002,0x400a4412,0x4000000,0xe00003,0x400a4500,0x4000000,0xe0000d,0x400a5300,0x4000000,0x810010,0x400a5300,0x4000000,0x1410010,0x404077b8,0x4000000, -0x200000,0x404077bb,0x4000000,0x200000,0x404077bb,0x4000000,0x400000,0x40c0511b,0x4000000,0x200000,0x41000419,0x7c00100,0x220400,0x41000419,0x7c00100,0x250400, -0x4100080e,0x7c00100,0x220400,0x4100080e,0x7c00100,0x250400,0x41000908,0x7c00100,0x220400,0x41000908,0x7c00100,0x250400,0x41000b13,0x2802000,0x962460,0x41000b13, -0x2802100,0x962460,0x41000b13,0x4000000,0xb00000,0x41000c02,0x2802100,0x962460,0x41000c02,0x4000000,0xb00000,0x41000c02,0x4000000,0x1500000,0x41000f0a,0x7c00100, -0x230400,0x41001004,0x7c00100,0x230400,0x41001423,0x7c00100,0x230400,0x41001b27,0x4000000,0x500000,0x41001d0c,0x7c00100,0x230400,0x41001d0c,0x7c00100,0x23040f, -0x41001f0b,0x2802100,0x962460,0x41001f0b,0x4000000,0x200000,0x41001f0b,0x7c00100,0x230400,0x41002800,0x24000000,0x200000,0x41002800,0x24000000,0x400000,0x41002919, -0x7c00100,0x22040e,0x41002a00,0x4000000,0x1600000,0x41002b01,0x2802020,0x962460,0x41002c00,0x4000000,0x200000,0x41002c00,0x7c00120,0x220405,0x41003000,0x24000000, -0x200000,0x41003700,0x24000000,0x200000,0x41003700,0x24000000,0x10200000,0x41003700,0x24000000,0x10e00000,0x41005d00,0x7c00120,0x220405,0x41006600,0x24000020,0x200000, -0x41006600,0x24000020,0x810000,0x41006600,0x24000020,0x1410000,0x41007208,0x7c00100,0x22040f,0x41007219,0x7c00100,0x220400,0x41007300,0x24000000,0x200000,0x41007e0e, -0x2802000,0x962460,0x41007e0e,0x4000000,0x200000,0x41007f0e,0x4000000,0x200000,0x41007f0e,0x7c00100,0x230400,0x41008002,0x7c00100,0x230400,0x41008137,0x2802100, -0x962460,0x41008137,0x4000000,0x200000,0x41008137,0x6800100,0x962540,0x41008137,0x7c00100,0x230400,0x41008301,0x2802000,0x962460,0x41008407,0x4000000,0x200000, -0x41008407,0x4000000,0x400000,0x41008407,0x4000000,0xb00000,0x41008407,0x7c00100,0x220400,0x41008407,0x7c00100,0x250400,0x4100850b,0x7c00100,0x230400,0x4100860b, -0x4000000,0x200000,0x4100860b,0x7c00100,0x230400,0x4100870c,0x7c00100,0x220400,0x41008838,0x7c00100,0x220400,0x41008838,0x7c00100,0x250400,0x41008939,0x2802000, -0x962460,0x41008939,0x2802100,0x962460,0x41008939,0x2806000,0x962460,0x41008939,0x4000000,0x200000,0x41008939,0x4000000,0x400000,0x41008939,0x7c00100,0x230400, -0x41008939,0xc000010,0x448000,0x41008a00,0x4000000,0x200000,0x41008b3b,0x4000000,0x1800000,0x41008b3b,0x6800000,0x1329800,0x41008b3b,0x7c00100,0x1830000,0x41008b3b, -0x7e00100,0x1830000,0x41008c3d,0x4000010,0x400000,0x41008c3d,0x7c00100,0x230400,0x41008d0e,0x7c00100,0x22040f,0x41008d19,0x7c00100,0x220400,0x41008d19,0x7c00100, -0x22040f,0x41008e00,0x24000000,0x200000,0x41008e00,0x24000000,0x400000,0x41008e00,0x24000000,0x1710000,0x41008e00,0x24000006,0x400000,0x41008f3a,0x2802000,0x962460, -0x41008f3a,0x2802100,0x962460,0x41008f3a,0x2806000,0x962460,0x41008f3a,0x4000000,0x200000,0x41008f3a,0x6800100,0x962540,0x41008f3a,0x7c00100,0x230400,0x4100903c, -0x7c00100,0x230400,0x4100903c,0x7c00100,0x23040f,0x41020701,0x2802000,0x962460,0x41020701,0x2802000,0xc62460,0x410a3700,0x24000000,0x30200000,0x410a3700,0x24000000, -0x30e00000,0x410a4412,0x4000000,0xe00003,0x410a4711,0x7c40300,0xe30000,0x410a4f11,0x7c00300,0xe30001,0x410a9100,0x4000000,0x800010,0x410a9100,0x4000000,0x810010, -0x410a9100,0x4000000,0x870010,0x410a9100,0x4000000,0xb00010,0x410a9100,0x4000000,0xf00010,0x410a9100,0x4000000,0x1001410,0x410a9100,0x4000000,0x1071010,0x410a9100, -0x4000000,0x1071410,0x410a9100,0x4000000,0x1410010,0x414a8292,0x4000000,0xe00000,0x41808300,0x2802000,0x962460,0x41c01469,0x6800000,0x1329800,0x50000419,0x7c00100, -0x220400,0x50000419,0x7c00100,0x250400,0x5000080e,0x7c00100,0x220400,0x50000908,0x7c00100,0x220400,0x50000908,0x7c00100,0x250400,0x50000b13,0x2802500,0x962460, -0x50000f0a,0x7c00100,0x230400,0x50001615,0x2802100,0x962460,0x50001615,0x7c00100,0x230400,0x50002b01,0x2802020,0x962460,0x50002c00,0x4000000,0x200000,0x50002c19, -0x7c00100,0x220400,0x50002d19,0x7c00100,0x220400,0x50003000,0x24000000,0x200000,0x50003000,0x24000020,0x200000,0x50003700,0x24000000,0x200000,0x50005d00,0x7c00120, -0x220405,0x50005d00,0x7c00120,0x250405,0x50006108,0x7c00100,0x220400,0x50006108,0x7c00100,0x250400,0x50006600,0x24000020,0x200000,0x50007300,0x24000000,0x200000, -0x50008301,0x2802400,0x962460,0x50008a00,0x7c00500,0x230400,0x50009257,0x2802400,0x962460,0x50009257,0x4000000,0x200000,0x50009257,0x4000010,0x1071400,0x50009257, -0x6800000,0x1329800,0x50009257,0x7c00100,0x230400,0x50009257,0x7c00500,0x230400,0x50009257,0x7c00900,0x230400,0x50009257,0xc000010,0xb48000,0x5000933e,0x2802100, -0x962460,0x5000933e,0x2802400,0x962460,0x5000933e,0x4000000,0x200000,0x5000933e,0x4000000,0x400000,0x5000933e,0x4000010,0x400000,0x5000933e,0x6800000,0x1329800, -0x5000933e,0x6800100,0x962540,0x5000933e,0x6800100,0x962541,0x5000933e,0x6804400,0x962540,0x5000933e,0x7c00100,0x230400,0x5000933e,0x7c00100,0x230401,0x5000933e, -0xc000010,0x448000,0x50009419,0x7c00100,0x220400,0x50009419,0x7c00100,0x250400,0x50009500,0x4000400,0x200000,0x5000965a,0x4000000,0x500000,0x5000965a,0x7c00100, -0x230400,0x5000965a,0xc000010,0xb48000,0x5000975b,0x4000000,0x200000,0x5000975b,0x4000010,0x400000,0x5000975b,0x7c00100,0x230400,0x50009865,0x7c00100,0x230400, -0x50009965,0x4000010,0x400000,0x50009965,0x7c00100,0x230400,0x50409a92,0x4000000,0x200000,0x5100080e,0x7c00100,0x220400,0x5100080e,0x7c00100,0x250400,0x51000c02, -0x2802100,0x962460,0x51000c02,0x4000000,0x1500000,0x51000c02,0x4000020,0x200000,0x51000c02,0x7c00100,0x230400,0x51000f0a,0x7c00100,0x230400,0x51000f0a,0x7c00500, -0x230400,0x51001110,0x2802100,0x962460,0x5100131f,0x2802100,0x962460,0x51001423,0x7c00100,0x230400,0x51001524,0x2802100,0x962460,0x51001524,0x4000000,0x200000, -0x51001524,0x7c00100,0x230400,0x5100171a,0x2802100,0x962460,0x5100171a,0x4000000,0x200000,0x5100171a,0x4000000,0x1500000,0x5100171a,0x7c00100,0x230400,0x51001b27, -0x4000000,0x200000,0x51001b27,0x4000000,0x400000,0x51001b27,0x4000000,0x500000,0x51001b27,0x7c00100,0x230400,0x51001c1c,0x2802100,0x1862460,0x51001c1c,0x2802400, -0x1862460,0x51001c1c,0x2806400,0x1862460,0x51001c1c,0x4000000,0x1800000,0x51001c1c,0x6800000,0x1329800,0x51001c1c,0x6800000,0x1862400,0x51001c1c,0x6800100,0x1862400, -0x51001c1c,0x6800100,0x1862540,0x51001c1c,0x6800400,0x1862400,0x51001c1c,0x7c00100,0x1830000,0x5100251b,0x7c00100,0x230400,0x51002619,0x7c00100,0x220400,0x51002619, -0x7c00100,0x250400,0x51002800,0x80020,0x218820,0x51002c00,0x4000000,0x200000,0x51002d19,0x7c00100,0x230400,0x51003700,0x24000000,0x200000,0x51003700,0x24000000, -0xe00000,0x51005201,0x2802400,0x962460,0x51005c00,0x4000000,0x200000,0x51006108,0x7c00100,0x220400,0x51006108,0x7c00100,0x250400,0x51006600,0x24000020,0x200000, -0x51006600,0x24000020,0x810000,0x51006600,0x24000020,0x1410000,0x51007300,0x24000000,0x200000,0x51007300,0x24000020,0x200000,0x51008002,0x7c00100,0x230400,0x51008301, -0x2802000,0x962460,0x51008301,0x2802400,0x962460,0x51008a00,0x7c00500,0x230400,0x51008e00,0x24000000,0x200000,0x51008e00,0x24000000,0x400000,0x51008e00,0x24000000, -0x810000,0x51008e00,0x24000000,0x1400000,0x51008e00,0x24000000,0x1410000,0x51008e00,0x24000000,0x1710000,0x51008e00,0x24000002,0x200000,0x51008e00,0x24000500,0x230400, -0x51008e00,0x2c000010,0xb48000,0x51009419,0x7c00100,0x220400,0x51009419,0x7c00100,0x22040e,0x51009419,0x7c00100,0x22040f,0x51009419,0x7c00100,0x250400,0x51009500, -0x4000000,0x200000,0x51009500,0x7c00500,0x230400,0x51009519,0x7c00100,0x220400,0x51009519,0x7c00100,0x22040f,0x51009519,0x7c00100,0x230400,0x51009519,0x7c00100, -0x250400,0x51009b71,0x2802100,0x962460,0x51009b71,0x6800000,0x1329800,0x51009b71,0x6800100,0x962540,0x51009b71,0x6804400,0x962540,0x51009b71,0x7c00100,0x230400, -0x51009c52,0x2802100,0x962460,0x51009c52,0x2802400,0x962460,0x51009c52,0x2802c00,0x962460,0x51009c52,0x4000010,0x400000,0x51009c52,0x6800000,0x1329800,0x51009c52, -0x6800100,0x962540,0x51009c52,0x7c00100,0x230400,0x51009c52,0xc000010,0x448000,0x51009d6d,0x6800000,0x1329800,0x51009d6d,0x7c00100,0x230400,0x51009d6d,0x7c00500, -0x230400,0x51009d6d,0x7c00d00,0x230400,0x51009d6d,0xc000010,0x448000,0x51009e08,0x2802100,0x962460,0x51009f63,0x4000010,0x400000,0x51009f63,0x6800000,0x1329800, -0x51009f63,0x7c00100,0x230400,0x51009f63,0x7c00900,0x230400,0x51009f63,0xc000010,0x448000,0x51009f63,0xc000010,0xb48000,0x5100a008,0x2000,0x962460,0x5100a008, -0x2802400,0x962460,0x5100a008,0x4000000,0x200000,0x5100a008,0x7c00100,0x220400,0x5100a008,0x7c00100,0x230400,0x5100a008,0x7c00100,0x250400,0x5100a008,0x7c00500, -0x230400,0x5100a16f,0x2806400,0x962460,0x5100a16f,0x6800000,0x1329800,0x5100a16f,0x6800100,0x962540,0x5100a16f,0x7c00100,0x230400,0x5100a16f,0xc000010,0x448000, -0x5100a24f,0x2802100,0x962460,0x5100a24f,0x2802400,0x962460,0x5100a24f,0x6800000,0x1329800,0x5100a24f,0x7c00100,0x230400,0x5100a24f,0xc000010,0x448000,0x5100a36e, -0x2802100,0x962460,0x5100a36e,0x4000000,0x200000,0x5100a36e,0x6800100,0x962540,0x5100a36e,0x6804400,0x962540,0x5100a36e,0x7c00100,0x230400,0x5100a442,0x2802100, -0x962460,0x5100a442,0x4000000,0x200000,0x5100a442,0x6800000,0x1329800,0x5100a442,0x6800100,0x962540,0x5100a442,0x7c00100,0x230400,0x5100a442,0xc000010,0x448000, -0x5100a500,0x4000000,0x200000,0x5100a600,0x4000000,0x200000,0x5100a601,0x2802000,0x962460,0x5100a76b,0x7c00100,0x230400,0x5100a868,0x7c00100,0x230400,0x5100a96c, -0x4000000,0x200000,0x5100a96c,0x7c00100,0x230400,0x5100aa00,0x4000000,0xe00000,0x5100ab00,0x4000000,0xe00000,0x51086600,0x24000020,0x810000,0x51086600,0x24000020, -0x1410000,0x510a4005,0x7c00100,0xe30400,0x510a4711,0x7c40300,0xe30000,0x510a7300,0x24000000,0x30200000,0x510aaa00,0x4000000,0x30e00000,0x5140a2b3,0x4000400,0x400000, -0x514a8292,0x4000000,0xe00000,0x51802b84,0x2802000,0x962460,0x51c00908,0x2802400,0x962460,0x51c0a008,0x2802400,0x962460,0x52000f0a,0x2802100,0x962460,0x52000f0a, -0x6800100,0x962540,0x52000f0a,0x7c00100,0x230400,0x52001004,0x4000000,0x1600000,0x52001b00,0x4000000,0x200000,0x52001c1c,0x2802100,0x1862460,0x52001c1c,0x6800100, -0x1862400,0x52001c1c,0x6800400,0x1862400,0x52001e12,0x7c00100,0x2230500,0x52001e12,0x7c00100,0x2330520,0x52002128,0x4000002,0x400000,0x52002128,0x7c00100,0x230400, -0x52002a00,0x4000000,0x1500000,0x52002a00,0x4000000,0x1600000,0x52002d00,0x4000000,0x200006,0x52003000,0x24000000,0x200000,0x52006108,0x7c00100,0x220400,0x52006108, -0x7c00100,0x250400,0x52008301,0x2802400,0x962460,0x52008407,0x2802400,0x962460,0x52008407,0x7c00100,0x220400,0x52008407,0x7c00100,0x250400,0x52008b3b,0x6800000, -0x1800000,0x52008b3b,0x7c00100,0x1830000,0x52008e00,0x24000000,0x400000,0x52009419,0x7c00100,0x250400,0x5200975b,0x4000000,0x200000,0x5200ac7e,0x2802000,0x962460, -0x5200ac7e,0x2802100,0x962460,0x5200ac7e,0x2802400,0x962460,0x5200ac7e,0x4000010,0x200000,0x5200ac7e,0x7c00100,0x230400,0x5200ad28,0x7c00100,0x230400,0x5200ae6a, -0x2802100,0x1862460,0x5200ae6a,0x2802400,0x962460,0x5200ae6a,0x2802400,0x1862460,0x5200ae6a,0x2806000,0x1862460,0x5200ae6a,0x4000000,0x1800000,0x5200ae6a,0x6800000, -0x1329800,0x5200ae6a,0x6800100,0x1862400,0x5200ae6a,0x6800100,0x1862540,0x5200ae6a,0x7c00100,0x1830000,0x5200ae6a,0x7c00900,0x1830000,0x5200ae6a,0xc000010,0x1848000, -0x5200b083,0x4000010,0x400000,0x5200b083,0x7c00100,0x230400,0x5200b083,0xc000010,0x448000,0x5200b182,0x2802400,0x962460,0x5200b182,0x4000000,0x200000,0x5200b182, -0x4000010,0x400000,0x5200b182,0x7c00100,0x230400,0x5200b182,0xc000010,0x448000,0x5200b30a,0x2802400,0x962460,0x5200b30a,0x4000000,0x200000,0x5200b30a,0x7c00100, -0x230400,0x5200b54e,0x2802100,0x962460,0x5200b54e,0x2802400,0x962460,0x5200b54e,0x4000000,0x200000,0x5200b54e,0x4000010,0x400000,0x5200b54e,0x6800000,0x1329800, -0x5200b54e,0x6800100,0x962540,0x5200b54e,0x6804400,0x962540,0x5200b54e,0x7c00100,0x230400,0x5200b54e,0xc000010,0x448000,0x5200b61c,0x4000000,0x1800000,0x5200b61c, -0x6800400,0x1862400,0x5200b61c,0x7c00100,0x1830000,0x5200b61c,0x7c00900,0x1830000,0x5200b77f,0x2802100,0x1862460,0x5200b77f,0x2802400,0x1862460,0x5200b77f,0x4000000, -0x1800000,0x5200b77f,0x4000010,0x1800000,0x5200b77f,0x7c00100,0x1830000,0x5200b77f,0x7c00500,0x1830000,0x5200b77f,0x7c00900,0x1830000,0x5200b77f,0x7e00100,0x1830000, -0x5200b873,0x2802100,0x962460,0x5200b873,0x2806400,0x962460,0x5200b873,0x6800000,0x1329800,0x5200b873,0x6800100,0x962540,0x5200b873,0x6800400,0x962540,0x5200b873, -0x7c00100,0x230400,0x5200b873,0xc000010,0x448000,0x5200b912,0x7c00100,0x2230500,0x5200b912,0x7c00100,0x2330520,0x5200ba74,0x4000000,0x200000,0x5200ba74,0x4000010, -0x400000,0x5200ba74,0x7c00100,0x230400,0x5200bb85,0x4000000,0x200000,0x5200bb85,0x7c00100,0x230400,0x5200bc75,0x4000000,0x400000,0x5200bc75,0x4000010,0x400000, -0x5200bc75,0x7c00100,0x230400,0x5200bd7d,0x4000000,0x200000,0x5200bd7d,0x7c00100,0x230400,0x5200be7a,0x4000000,0x200000,0x5200be7a,0x7c00100,0x230400,0x5200bf58, -0x7c00100,0x230400,0x5200c002,0x4000000,0x200000,0x5200c178,0,0x218960,0x5200c178,0x2802000,0x962460,0x5200c178,0x2802100,0x962460,0x5200c178,0x2802400, -0x962460,0x5200c178,0x2806400,0x962460,0x5200c178,0x4000000,0x200000,0x5200c178,0x6800100,0x962540,0x5200c178,0x7c00100,0x230400,0x5200c178,0x7c00100,0x230401, -0x5200c178,0xc000010,0x448000,0x5200c247,0x7c00100,0x230400,0x5200c247,0x7c00100,0x830400,0x5200c247,0x7c00100,0x1430400,0x5200c300,0x4000000,0x200003,0x52022d00, -0x4000000,0x100006,0x52023700,0x24000000,0x100000,0x52023700,0x24000000,0xe00000,0x52023700,0x24000000,0x10100000,0x52023700,0x24000000,0x10e00000,0x52023700,0x24000000, -0x928045a0,0x52024400,0x4000000,0x100000,0x52027300,0x24000000,0x100000,0x5202c300,0x4000000,0x100000,0x5202c300,0x4000000,0x100002,0x5202c300,0x4000000,0x100003, -0x5202c300,0x4000000,0x10000d,0x5202c300,0x4000100,0x150400,0x5202c300,0x4000100,0x15040d,0x5202c300,0x4000100,0x10150400,0x520a1e12,0x7c00100,0x2130480,0x520a3700, -0x24000000,0x30e00000,0x520a3800,0x24000000,0x30100000,0x520a4711,0x7c40300,0xe30000,0x520a4f11,0x7c00300,0xe30001,0x520a7300,0x24000000,0x30100000,0x520ab412,0x7c00100, -0x2130480,0x520ac400,0x4000000,0xe00002,0x520ac400,0x4000000,0xe0000d,0x520ac400,0x4000000,0x30e0000d,0x520ac414,0x4000000,0xe0000d,0x520ac511,0x7c40300,0xe30000, -0x5240af78,0x6800400,0x962540,0x5240af78,0x7c00100,0x230400,0x5240af79,0x4000400,0x200000,0x5240af79,0x6800100,0x962540,0x5240b298,0x4000000,0x200000,0x5240b2a2, -0x4000000,0x200000,0x5240b2a2,0x4000000,0x1500000,0x5240b5b6,0x7c00900,0x230400,0x524a4492,0x4000000,0xe00003,0x5280af78,0x2802400,0x962460,0x5280af79,0x2802400, -0x962460,0x5280af7b,0x2802400,0x962460,0x5280af7d,0x2802400,0x962460,0x52c0b3ad,0x2802400,0x962460,0x52c0b3b1,0x7c00100,0x230400,0x60000c02,0x2802100,0x962460, -0x60000c02,0x7c00100,0x230400,0x60000f0a,0x2802100,0x962460,0x60000f0a,0x6800100,0x962540,0x60000f0a,0x7c00100,0x230400,0x6000131f,0x4000000,0x200000,0x6000171a, -0x7c00100,0x230400,0x6000171a,0x7c00100,0x230560,0x60001b27,0x2802100,0x962460,0x60001b27,0x4000000,0xc00000,0x60001b27,0x7c00100,0x230400,0x60001f0b,0x2802000, -0x962460,0x60002919,0x7c00100,0x22040e,0x60002a00,0x4000000,0x1600000,0x60003000,0x24000000,0x10200000,0x60003000,0x24000000,0x10e00000,0x60003700,0x24000000,0x200000, -0x60003800,0x24000000,0x1710000,0x60005102,0x4000000,0x200000,0x60006108,0x7c00100,0x220400,0x60006108,0x7c00100,0x250400,0x60006600,0x24000020,0x200000,0x60008301, -0x2802000,0x962460,0x6000903c,0x2806000,0x962460,0x6000903c,0x4000000,0x400000,0x60009519,0x7c00100,0x220400,0x60009519,0x7c00100,0x250400,0x6000a008,0x7c00100, -0x220400,0x6000a008,0x7c00100,0x250400,0x6000c300,0x4000000,0x32703580,0x6000c654,0x2802000,0x962460,0x6000c654,0x4000010,0x200000,0x6000c654,0x7c00100,0x230400, -0x6000c73f,0x2802000,0x962460,0x6000c73f,0x2802100,0x962460,0x6000c73f,0x4000000,0x200000,0x6000c73f,0x6800100,0x962540,0x6000c73f,0x6804000,0x962540,0x6000c73f, -0x7c00100,0x230400,0x6000c80b,0x7c00100,0x230400,0x6000c941,0x2802100,0x962460,0x6000c941,0x2806000,0x962460,0x6000c941,0x4000000,0x200000,0x6000c941,0x4000010, -0x200000,0x6000c941,0x6800000,0x1329800,0x6000c941,0x6800100,0x962540,0x6000c941,0x7c00100,0x230400,0x6000c941,0xc000010,0x448000,0x6000ca82,0x7c00100,0x230400, -0x6000cc00,0x4000000,0xe00000,0x6000d000,0x4000000,0x200000,0x6002c300,0x4000000,0x100000,0x6002c300,0x4000000,0x10000d,0x6002c300,0x4000100,0x150400,0x6002c300, -0x4000100,0x15040d,0x6002c300,0x4000100,0x10150400,0x600a3000,0x24000000,0x30200000,0x600a3000,0x24000000,0x30e00000,0x600a3700,0x24000000,0x30200000,0x600a3800,0x24000000, -0x30200000,0x600a3800,0x24000000,0xb28045a0,0x600a4305,0x7c00100,0xe30400,0x600ac300,0x4000000,0x30100000,0x600ac400,0x4000000,0x10e0000d,0x600ac400,0x4000000,0x30e0000d, -0x600acb14,0x7c00100,0xe30000,0x600acb16,0x7c00100,0xe30c00,0x600acc00,0x4000000,0x30e00000,0x600acd00,0x4000000,0x30200000,0x600acd00,0x4000000,0x30e00000,0x600acd00, -0x4000000,0x30e05200,0x600acd00,0x4000000,0xb0e00000,0x600acd00,0x4000000,0xb28045a0,0x600acd00,0x4000000,0xb28049c0,0x600ace00,0x4000000,0x30e00000,0x600ace00,0x4000000, -0xb28045a0,0x600acf00,0x4000000,0x30e00000,0x600acf00,0x4000000,0xb28045a0,0x600ad111,0x7c40300,0xe30000,0x604ac492,0x4000000,0x30e00003,0x61000a03,0x4000000,0x1600000, -0x61000c02,0,0x218960,0x6100120f,0x4000000,0x200000,0x61001a18,0x7c00100,0x1830000,0x61001d0c,0x7c00100,0x230400,0x61001d0c,0x7c00100,0x250400,0x61006600, -0x24000020,0x200000,0x61008407,0x7c00100,0x220400,0x61008407,0x7c00100,0x250400,0x6100870c,0x7c00100,0x220400,0x61008e00,0x24000000,0x200000,0x61008e00,0x24000000, -0x400000,0x61008e00,0x24000002,0x300000,0x6100903c,0x7c00100,0x230400,0x61009519,0x7c00100,0x220400,0x61009519,0x7c00100,0x250400,0x61009519,0x7c00500,0x22040f, -0x61009b71,0x2802100,0x962460,0x61009b71,0x2806400,0x962460,0x61009b71,0x7c00100,0x230400,0x6100a008,0x2802100,0x962460,0x6100c300,0x4000000,0x20000f,0x6100cd00, -0x4000000,0x200000,0x6100d202,0x2802400,0x962460,0x6100d202,0x2802500,0x962460,0x6100d202,0x7c00100,0x230400,0x6100d302,0x4000020,0x200000,0x6100d302,0x7c00120, -0x230405,0x6100d476,0x2802100,0x962460,0x6100d476,0x2802100,0x962461,0x6100d476,0x2806400,0x962460,0x6100d476,0x4000000,0x400000,0x6100d476,0x6800000,0x1329800, -0x6100d476,0x6800100,0x962540,0x6100d476,0x7c00100,0x230400,0x6100d476,0xc000010,0x448000,0x6100d573,0x2802100,0x962460,0x6100d573,0x2806400,0x962460,0x6100d573, -0x6800100,0x962540,0x6100d573,0x7c00100,0x230400,0x6100d573,0x7c00900,0x230400,0x6100d573,0xc000010,0x448000,0x6100d68d,0x7c00100,0x230400,0x6100d756,0x7c00100, -0x230400,0x6100d85c,0x2802400,0x962460,0x6100d85c,0x6800100,0x962540,0x6100d85c,0x7c00100,0x230400,0x6100d85c,0x7c00500,0x230400,0x6100d997,0x2802100,0x962460, -0x6100d997,0x4000000,0x200000,0x6100d997,0x4000000,0x400000,0x6100d997,0x6800000,0x1329800,0x6100d997,0x6800100,0x962540,0x6100d997,0x6804400,0x962540,0x6100d997, -0x7c00100,0x230400,0x6100d997,0x7c00100,0x230560,0x6100d997,0xc000010,0x448000,0x6100da98,0x6800000,0x1329800,0x6100da98,0x7c00100,0x230400,0x6100db71,0x4000000, -0x200000,0x6100dc99,0x2802100,0x962460,0x6100dc99,0x2802400,0x962460,0x6100dc99,0x6800000,0x1329800,0x6100dc99,0x6800100,0x962540,0x6100dc99,0x6804400,0x962540, -0x6100dc99,0x7c00100,0x230400,0x610a4711,0x7c40300,0xe30000,0x610a4f11,0x7c00300,0xe30001,0x610ace00,0x4000000,0x30e00000,0x6140af78,0x7c00100,0x230400,0x6140af79, -0x6800100,0x962540,0x6140af82,0x7c00100,0x230400,0x6180af79,0x2802400,0x962460,0x62002a00,0x4000000,0x1600000,0x63000c00,0x80000,0x918820,0x63002800,0x80000, -0x918820,0x7000080e,0x7c00100,0x250400,0x70000a03,0x4000000,0x200000,0x70000c00,0,0x218960,0x70000f0a,0x7c00100,0x230400,0x70001004,0x7c00100,0x230400, -0x70001524,0x2802100,0x962460,0x70001524,0x7c00100,0x230400,0x70001615,0x2802100,0x962460,0x7000171a,0x2802100,0x962460,0x70001821,0x6800000,0x1329800,0x70002320, -0x7c00100,0x230400,0x70002a00,0x4000000,0x1500000,0x70002a00,0x4000000,0x1600000,0x70003000,0x24000000,0x200000,0x70003000,0x24000000,0x10200000,0x70003800,0x24000000, -0xe00000,0x70005201,0x2802400,0x962460,0x7000581e,0x7c00100,0x230400,0x70006108,0x7c00100,0x220400,0x70006108,0x7c00100,0x250400,0x70006f30,0x7c00100,0x230400, -0x70007300,0x24000000,0x200000,0x70007f0e,0x4000000,0x200000,0x70008301,0x2802100,0x962460,0x70008301,0x2802400,0x962460,0x70008e00,0x24000000,0x200000,0x70008e00, -0x24000000,0x400000,0x70008e00,0x24000002,0x400000,0x70008e00,0x24000008,0x1410000,0x70008e00,0x24000010,0x400000,0x70008e00,0x2c000010,0x448000,0x70009519,0x7c00100, -0x220400,0x70009519,0x7c00100,0x230400,0x70009519,0x7c00100,0x250400,0x70009865,0x7c00100,0x230400,0x70009965,0x4000010,0x400000,0x70009965,0x7c00100,0x230400, -0x7000a008,0x7c00100,0x220400,0x7000a008,0x7c00100,0x250400,0x7000a008,0x7c00500,0x22040f,0x7000a50e,0x4000000,0x200000,0x7000b61c,0x2802400,0x1862460,0x7000b61c, -0x6800400,0x1862400,0x7000b61c,0x7c00100,0x1830000,0x7000c300,0x4000000,0x100000,0x7000c941,0x2806000,0x962460,0x7000cc00,0x4000000,0xe00000,0x7000cd00,0x4000000, -0x200000,0x7000cd00,0x4000000,0xe00000,0x7000cd00,0x4000000,0x10200000,0x7000cd00,0x4000000,0x10e00000,0x7000cd00,0x4000000,0x10e05200,0x7000cd00,0x4000000,0x90e00000, -0x7000cd00,0x4000000,0x928045a0,0x7000cf00,0x4000000,0xe00000,0x7000cf00,0x4000000,0x10e00000,0x7000d202,0x2802100,0x962460,0x7000d202,0x7c00100,0x230400,0x7000d997, -0x7c00100,0x230400,0x7000d997,0xc000010,0x248000,0x7000dd86,0x2802400,0x962460,0x7000dd86,0x7c00100,0x230400,0x7000dd86,0xc000010,0x448000,0x7000de9f,0x4000000, -0x200000,0x7000de9f,0x7c00100,0x230400,0x7000e001,0x2000,0x962460,0x7000e001,0x2802400,0x962460,0x7000e187,0x2802000,0x962460,0x7000e187,0x2802100,0x962460, -0x7000e187,0x4000000,0x200000,0x7000e187,0x7c00100,0x230400,0x7000e187,0xc000010,0x448000,0x7000e288,0x7c00100,0x230400,0x7000e300,0x4000000,0x200000,0x7000e489, -0x2802100,0x962460,0x7000e489,0x2802400,0x962460,0x7000e489,0x6800100,0x962540,0x7000e489,0x6800100,0x962541,0x7000e489,0x6804400,0x962540,0x7000e489,0x7c00100, -0x230400,0x7000e489,0x7c00900,0x230400,0x7000e59d,0x2802100,0x962460,0x7000e59d,0x2802400,0x962460,0x7000e59d,0x4000000,0x200000,0x7000e59d,0x4000010,0x200000, -0x7000e59d,0x6800100,0x962540,0x7000e59d,0x6804400,0x962540,0x7000e59d,0x7c00100,0x230400,0x7000e59d,0xc000010,0x448000,0x7000e691,0x2802100,0x962460,0x7000e691, -0x2802400,0x962460,0x7000e691,0x2806400,0x962460,0x7000e691,0x6800000,0x1329800,0x7000e691,0x6800100,0x962540,0x7000e691,0x7c00100,0x230400,0x7000e700,0x4000400, -0x200000,0x7000e70e,0x7c00100,0x220400,0x7000e719,0x7c00100,0x220400,0x7000e719,0x7c00500,0x22040f,0x7000e853,0x7c00100,0x230400,0x7000e9a0,0x2802400,0x962460, -0x7000e9a0,0x4000000,0x200000,0x7000e9a0,0x4000000,0x500000,0x7000e9a0,0x7c00100,0x230400,0x7000ea79,0x2802400,0x962460,0x7000ea79,0x4000000,0x200000,0x7000ea79, -0x4000000,0xf00000,0x7000ea79,0x4000010,0x400000,0x7000ea79,0x7c00100,0x230400,0x7000eb8c,0x2802400,0x962460,0x7000eb8c,0x4000000,0x200000,0x7000eb8c,0x7c00100, -0x230400,0x7000eca3,0x2802100,0x962460,0x7000eca3,0x2806400,0x962460,0x7000eca3,0x4000000,0x200000,0x7000eca3,0x6800000,0x1329800,0x7000eca3,0x6800100,0x962540, -0x7000eca3,0x7c00100,0x230400,0x7000eca3,0xc000010,0x448000,0x7000ed95,0x6800000,0x1329800,0x7000ed95,0x7c00100,0x230400,0x7000ed95,0xc000010,0x448000,0x7000ee1c, -0x2802400,0x1862460,0x7000ee1c,0x6800000,0x1329800,0x7000ee1c,0x7c00100,0x1830000,0x7000ee1c,0x7c00900,0x1830000,0x7000ef8f,0x4000000,0x200000,0x7000ef8f,0x7c00100, -0x230400,0x7000f08e,0x4000000,0x200000,0x7000f08e,0x7c00100,0x230400,0x7000f159,0x2802100,0x962460,0x7000f159,0x7c00100,0x230400,0x7000f200,0x4000000,0x200000, -0x7000f200,0x4000000,0x1200000,0x7000f200,0x4000000,0x1710000,0x7000f34b,0x2802100,0x962460,0x7000f34b,0x4000000,0x200000,0x7000f34b,0x4000010,0x400000,0x7000f34b, -0x6800000,0x1329800,0x7000f34b,0x7c00100,0x230400,0x7000f34b,0x7c00900,0x230400,0x7000f34b,0xc000010,0x448000,0x7000f490,0x4000000,0x200000,0x7000f490,0x7c00100, -0x230400,0x7000f5a5,0x7c00100,0x230400,0x7000f67b,0x4000000,0x200000,0x7000f67b,0x4000010,0x200000,0x7000f67b,0x7c00100,0x230400,0x7000f8a6,0x2802100,0x962460, -0x7000f8a6,0x2802400,0x962460,0x7000f8a6,0x2806400,0x962460,0x7000f8a6,0x4000000,0x500000,0x7000f8a6,0x4000010,0xb00000,0x7000f8a6,0x4000800,0x200000,0x7000f8a6, -0x6800100,0x962540,0x7000f8a6,0x6800100,0x962541,0x7000f8a6,0x7c00100,0x230400,0x7000f8a6,0xc000010,0x448000,0x7000f921,0x4000000,0x200000,0x7000fa00,0x4000000, -0x200000,0x7000fb9e,0x2802100,0x962460,0x7000fb9e,0x2802400,0x962460,0x7000fb9e,0x2806400,0x962460,0x7000fb9e,0x4000000,0x200000,0x7000fb9e,0x6800000,0x1329800, -0x7000fb9e,0x6800100,0x962540,0x7000fb9e,0x6800100,0x962541,0x7000fb9e,0x7c00100,0x230400,0x7000fc92,0x4000000,0x200000,0x7000fc92,0x6800000,0x1329800,0x7000fc92, -0x7c00100,0x220400,0x7000fc92,0x7c00100,0x230400,0x7000fc92,0x7c00100,0x250400,0x700acd00,0x4000000,0x30e00000,0x700acd00,0x4000000,0xb28045a0,0x700ace00,0x4000000, -0x30e00000,0x700acf00,0x4000000,0x30e00000,0x700acf00,0x4000000,0xb0e00000,0x7040dfbd,0x4000000,0x200000,0x7040f7c1,0x80000,0x918820,0x7080af79,0x2802400,0x962460, -0x7080dfbd,0x2802400,0x962460,0x70c0e4bf,0x2802400,0x962460,0x70c0e4bf,0x6800100,0x962540,0x8000120f,0x7c00100,0x230400,0x80001524,0x7c00100,0x230400,0x8000171a, -0x7c00100,0x230400,0x80002006,0x7c00100,0x220400,0x80002006,0x7c00100,0x250400,0x80002a00,0x4000000,0x1500000,0x80002d00,0x4000000,0x200000,0x80005208,0x2802400, -0x962460,0x80005c00,0x4000000,0x200000,0x80007300,0x24000000,0x200000,0x80009519,0x7c00100,0x220400,0x80009519,0x7c00100,0x230400,0x80009519,0x7c00100,0x250400, -0x80009865,0x7c00100,0x230400,0x8000a008,0x2802100,0x962460,0x8000b30a,0x4000000,0x500000,0x8000b30a,0x7c00100,0x230400,0x8000cd00,0x4000000,0xe00000,0x8000d202, -0x2802500,0x962460,0x8000d202,0x7c00100,0x230400,0x8000d68d,0x4000000,0x200000,0x8000d997,0x2802400,0x962460,0x8000d997,0x4000000,0x200000,0x8000d997,0x4000000, -0x400000,0x8000d997,0x4000000,0x500000,0x8000d997,0x7c00100,0x230400,0x8000d997,0xc000010,0x448000,0x8000e489,0x2802100,0x962460,0x8000e489,0x7c00100,0x230400, -0x8000e719,0x7c00100,0x220400,0x8000f8a6,0x2802100,0x962460,0x8000f8a6,0x7c00100,0x230400,0x8000f8a6,0xc000010,0x448000,0x8000fda1,0x2802100,0x1862460,0x8000fda1, -0x2806400,0x1862460,0x8000fda1,0x4000000,0x1800000,0x8000fda1,0x6800000,0x1329800,0x8000fda1,0x6800100,0x1862540,0x8000fda1,0x7c00100,0x1830000,0x8000fda1,0xc000010, -0x448000,0x8000fe9c,0x7c00100,0x230400,0x8000fe9c,0x7c00100,0x830400,0x8000fe9c,0x7c00100,0x1430400,0x8000ff06,0x7c00100,0x220400,0x80010165,0x7c00100,0x230400, -0x800102a2,0x4000000,0x200000,0x800102a2,0x7c00100,0x230400,0x800103a4,0x7c00100,0x230400,0x800103a4,0xc000010,0x448000,0x8001044c,0x4000000,0x200000,0x8001044c, -0x7c00100,0x220400,0x8001044c,0x7c00100,0x250400,0x80010670,0x2802000,0x962460,0x80010670,0x4000000,0x200000,0x80010670,0x4000010,0x400000,0x80010670,0xc000010, -0x448000,0x800a4711,0x7c40300,0xe30000,0x800acd00,0x4000000,0x30e00000,0x800acd00,0x4000000,0x72904de0,0x800ace00,0x4000000,0x30e00000,0x800acf00,0x4000000,0x30e00000, -0x800b0011,0x7c40300,0xe30000,0x800b0500,0x4000000,0x30e00000,0x800b0500,0x4000000,0xb28045a0,0x90001615,0x7c00100,0x230400,0x9000171a,0x4000000,0x200000,0x9000171a, -0x7c00100,0x230400,0x90003000,0x24000000,0x200000,0x90007f0e,0x4000000,0x200000,0x90008301,0x2802000,0x962460,0x90008e00,0x24000000,0x400000,0x90009519,0x7c00100, -0x250400,0x9000a16f,0x2802100,0x962460,0x9000d200,0,0x218960,0x9000d202,0x2802000,0x962460,0x9000d202,0x2802100,0x962460,0x9000d202,0x7c00100,0x230400, -0x9000e59d,0x2802100,0x962460,0x900107a7,0x2802100,0x962460,0x900107a7,0x2802400,0x962460,0x900107a7,0x2802c00,0x962460,0x900107a7,0x4000000,0x1400000,0x900107a7, -0x6800000,0x1329800,0x900107a7,0x7c00100,0x220400,0x900107a7,0x7c00100,0x250400,0x900108a8,0x2802100,0x962460,0x900108a8,0x2806400,0x962460,0x900108a8,0x4000000, -0x200000,0x900108a8,0x4000000,0x400000,0x900108a8,0x4000010,0x400000,0x900108a8,0x6800000,0x1329800,0x900108a8,0x6800100,0x962540,0x900108a8,0x7c00100,0x230400, -0x900108a8,0xc000010,0x448000,0x90010908,0x7c00100,0x220400,0x90010a38,0x2802100,0x962460,0x90010ca9,0x2802100,0x962460,0x90010ca9,0x4000000,0x500000,0x90010ca9, -0x4000010,0xb00000,0x90010ca9,0x6800100,0x962540,0x90010ca9,0x7c00100,0x230400,0x90010d1b,0x4000000,0x500000,0x90010eaa,0x2802100,0x962460,0x90010eaa,0x2802400, -0x962460,0x90010eaa,0x2806400,0x962460,0x90010eaa,0x4000000,0x200000,0x90010eaa,0x4000000,0x400000,0x90010eaa,0x4000010,0x400000,0x90010eaa,0x6800000,0x1329800, -0x90010eaa,0x6800100,0x962540,0x90010eaa,0x7c00100,0x230400,0x90010eaa,0xc000010,0x448000,0x90010fab,0x7c00100,0x220400,0x90010fab,0x7c00100,0x250400,0x9002c300, -0x4000000,0x100000,0x900ac400,0x4000000,0xe0000d,0x900acd00,0x4000000,0x30e00000,0x900acd00,0x4000000,0xb28045a0,0x900acf00,0x4000000,0x30e00000,0x900b0500,0x4000000, -0xe00000,0x900b0500,0x4000000,0x30e00000,0x900b0500,0x4000000,0xb28045a0,0x900b0b9a,0x7c00900,0x1230400,0x900b109a,0x7c00300,0xe30000,0x900b119a,0x7c00300,0xe30000, -0x90408e06,0x24000000,0x400000}; +0x2b67,0,0,0x2d67,0,0,0x3167,0x20000000,0,0x3267,0x20000000,0,0x3a67,0,0,0x3b67, +0,0,0x3c67,0,0,0x3e67,0,0,0x4067,0,0,0x4167,0,0,0x4367,0, +0,0x4467,0,0,0x4867,0,0,0x4967,0,0,0x4a67,0,0,0x5067,0,0, +0x5167,0,0,0x5467,0,0,0x5567,0,0,0x5667,0x80000,0x20,0x5767,0,0,0x5867, +0,0,0x5967,0,0,0x5b67,0,0,0x5c67,0,0,0x5d67,0,0,0x6067,0x80000, +0x20,0x6267,0,0,0x6367,0,0,0x6467,0,0,0x6567,0,0,0x6f67,0,0, +0x7067,0,0,0x7367,0x20000000,0,0x7567,0,0,0x7667,0,0,0x7767,0,0,0x7867, +0,0,0x7a67,0,0,0x7b67,0,0,0x7c67,0,0,0x7e67,0,0,0x7f67,0, +0,0x8167,0,0,0x8267,0,0,0x8367,0,0,0x8467,0,0,0x8567,0,0, +0x8667,0,0,0x8767,0,0,0x8867,0,0,0x8967,0,0,0x8b67,0,0,0x8c67, +0,0,0x8e67,0x20000000,0,0x8f67,0,0,0x9067,0,0,0x9167,0,0,0x9267,0, +0,0x9367,0,0,0x9567,0,0,0x9667,0,0,0x9767,0,0,0x9867,0,0, +0x9967,0,0,0x9a67,0,0,0x9c67,0,0,0x9f67,0,0,0xa167,0,0,0xa367, +0,0,0xa467,0,0,0xa567,0,0,0xa667,0,0,0xa767,0,0,0xa867,0, +0,0xa967,0,0,0xaa67,0,0xe00000,0xab67,0,0xe00000,0xac67,0,0,0xad67,0,0, +0xae67,0,0,0xaf67,0,0,0xb167,0,0,0xb267,0,0,0xb367,0,0,0xb467, +0,0,0xb567,0,0,0xb767,0,0,0xb867,0,0,0xb967,0,0,0xba67,0, +0,0xbc67,0,0,0xbd67,0,0,0xbe67,0,0,0xbf67,0,0,0xc067,0,0, +0xc167,0,0,0xc267,0,0,0xc367,0,0xe00000,0xc467,0,0xe00000,0xc667,0,0,0xc767, +0,0,0xc867,0,0,0xc967,0,0,0xca67,0,0,0xcc67,0,0xe00000,0xcf67,0, +0xe00000,0xd067,0,0xe00000,0xd267,0,0,0xd367,0,0,0xd467,0,0,0xd567,0,0, +0xd667,0,0,0xd867,0,0,0xd967,0,0,0xda67,0,0,0xdb67,0,0,0xdc67, +0,0,0xdd67,0,0,0xde67,0,0,0xdf67,0,0,0xe067,0,0,0xe167,0, +0,0xe267,0,0,0xe367,0,0xe00000,0xe467,0,0,0xe567,0,0,0xe667,0,0, +0xe767,0,0,0xe867,0,0,0xe967,0,0,0xea67,0,0,0xeb67,0,0,0xec67, +0,0,0xed67,0,0,0xee67,0,0,0xef67,0,0,0xf167,0,0,0xf367,0, +0,0xf567,0,0,0xf667,0,0,0xf767,0,0,0xf867,0,0,0xf967,0,0, +0xfa67,0,0xe00000,0xfb67,0,0,0xfc67,0,0,0xfd67,0,0,0xfe67,0,0,0x10167, +0,0,0x10267,0,0,0x10367,0,0,0x10467,0,0,0x10567,0,0xe00000,0x10667,0, +0,0x10767,0,0,0x10867,0,0,0x10967,0,0,0x10a67,0,0,0x10b67,0,0, +0x10c67,0,0,0x10d67,0,0,0x10e67,0,0,0x10f67,0,0,0x11067,0,0,0x11167, +0,0,0x11367,0,0,0x11467,0,0,0x11567,0,0,0x11667,0,0,0x11767,0, +0,0x11867,0,0,0xa0067,0,0xe00000,0xa4667,0,0xe00000,0xa4767,0,0xe00000,0xa4f67,0,0xe00000, +0xa5e67,0,0xe00000,0xa5f67,0,0xe00000,0xac567,0,0xe00000,0xad167,0,0xe00000,0xb0067,0,0xe00000,0xb1267, +0,0xe00000,0x11000100,0,0x900020,0x11000100,0x40000001,0x440020,0x11000100,0x40000001,0x643020,0x11000100,0x40000001,0xa5a040,0x11000100,0x40000001, +0x116a8a0,0x11000200,0,0x900020,0x11000200,0x4000001,0xc4000b,0x11000200,0x7c00100,0x220402,0x11000200,0x24000000,0x10200000,0x11000200,0x24000008,0x1710000, +0x11000200,0x40000001,0x1d3b020,0x11000219,0x7c00100,0x220401,0x11000219,0x7c00100,0x250401,0x11000319,0x7c00100,0x220401,0x11000319,0x7c00100,0x220402,0x11000319, +0x7c00100,0x250400,0x11000319,0x7c00100,0x250401,0x11000419,0x7c00100,0x220400,0x11000419,0x7c00100,0x220401,0x11000419,0x7c00100,0x220402,0x11000419,0x7c00100, +0x230400,0x11000419,0x7c00100,0x250400,0x11000419,0x7c00100,0x250401,0x11000419,0x7c00100,0x250402,0x11000519,0x7c00100,0x220400,0x11000519,0x7c00100,0x230400, +0x11000600,0x4000400,0x200000,0x11000600,0x4000400,0x200002,0x11000600,0x4000400,0x200400,0x11000600,0x7c00500,0x220400,0x11000600,0x7c00500,0x230400,0x11000600, +0x7c00500,0x530400,0x11000600,0x7c00d00,0x230400,0x11000619,0x7c00500,0x22040f,0x11000800,0x4000010,0x1001401,0x11000800,0x4000400,0x200001,0x11000800,0x6800010, +0x201001,0x11000800,0x7c00500,0x230401,0x11000807,0x7c00100,0x220400,0x11000807,0x7c00100,0x250400,0x1100080e,0x4000400,0x200000,0x1100080e,0x4000400,0x200002, +0x1100080e,0x7000500,0x220402,0x1100080e,0x7c00100,0x220400,0x1100080e,0x7c00100,0x220401,0x1100080e,0x7c00100,0x220402,0x1100080e,0x7c00100,0x250400,0x1100080e, +0x7c00100,0x250401,0x1100080e,0x7c00120,0x220402,0x1100080e,0x7c00120,0x250402,0x11000908,0x4000000,0x200000,0x11000908,0x7c00100,0x220400,0x11000908,0x7c00100, +0x220401,0x11000908,0x7c00100,0x250400,0x11000908,0x7c00100,0x250401,0x11000a03,0x4000000,0x200000,0x11000a03,0x4000000,0x270000,0x11000a03,0x7c00100,0x220400, +0x11000a03,0x7c00100,0x220402,0x11000a03,0x7c00100,0x250400,0x11000a03,0x7c00500,0x230400,0x11000b13,0x2802500,0x962460,0x11000b13,0x4000000,0x200000,0x11000b13, +0x4000000,0x201000,0x11000b13,0x4000000,0x230400,0x11000b13,0x4000002,0x400000,0x11000b13,0x4000010,0x200000,0x11000b13,0x7c00100,0x2633800,0x11000c00,0x80000000, +0x218960,0x11000c02,0x2802100,0x962460,0x11000c02,0x2802400,0x962460,0x11000c02,0x4000000,0x200000,0x11000c02,0x4000000,0x1329400,0x11000c02,0x4000000,0x1329800, +0x11000c02,0x4000000,0x1500000,0x11000c02,0x6800000,0x1329800,0x11000c02,0x7c00100,0x230400,0x11000c02,0x7c00100,0x230401,0x11000c02,0x7c00100,0x230402,0x11000c02, +0x7c00500,0x230400,0x11000c02,0x7d00100,0x230400,0x11000c02,0xc000010,0xb48000,0x11000f0a,0x2802100,0x962460,0x11000f0a,0x2802400,0x962460,0x11000f0a,0x2806400, +0x962460,0x11000f0a,0x4000000,0x200000,0x11000f0a,0x6800100,0x962540,0x11000f0a,0x7c00100,0x230400,0x11000f0a,0x7c00100,0x230401,0x11001004,0x2802100,0x962460, +0x11001004,0x2802400,0x962460,0x11001004,0x2806400,0x962460,0x11001004,0x4000000,0x200000,0x11001004,0x4000000,0x1500000,0x11001004,0x6800100,0x962540,0x11001004, +0x6800100,0x962541,0x11001004,0x7c00100,0x230400,0x11001004,0x7c00100,0x230401,0x11001110,0x2802100,0x962460,0x11001110,0x2802400,0x962460,0x11001110,0x2806400, +0x962460,0x11001110,0x6800100,0x962540,0x11001110,0x7c00100,0x230400,0x11001110,0x7c00100,0x230401,0x1100120f,0x2802100,0x962460,0x1100120f,0x2802400,0x962460, +0x1100120f,0x2806400,0x962460,0x1100120f,0x6800100,0x962540,0x1100120f,0x7c00100,0x230400,0x1100131f,0x2802100,0x962460,0x1100131f,0x2802400,0x962460,0x1100131f, +0x2806400,0x962460,0x1100131f,0x4000000,0x200000,0x1100131f,0x6800000,0x1329800,0x1100131f,0x6800100,0x962540,0x1100131f,0x6800100,0x962541,0x1100131f,0x7c00100, +0x230400,0x1100131f,0x7c00100,0x230401,0x11001423,0x2802100,0x962460,0x11001423,0x2806400,0x962460,0x11001423,0x6800100,0x962540,0x11001423,0x6800100,0x962541, +0x11001423,0x7c00100,0x230400,0x11001423,0x7c00100,0x230401,0x11001524,0x2802100,0x962460,0x11001524,0x2802100,0x962461,0x11001524,0x2806400,0x962460,0x11001524, +0x6800000,0x1329800,0x11001524,0x6800100,0x962540,0x11001524,0x7c00100,0x230400,0x11001615,0x2802100,0x962460,0x11001615,0x2806400,0x962460,0x11001615,0x6800000, +0x1329800,0x11001615,0x6800100,0x962540,0x11001615,0x6800100,0x962541,0x11001615,0x7c00100,0x230400,0x1100171a,0x2802100,0x962460,0x1100171a,0x2806400,0x962460, +0x1100171a,0x6800000,0x1329800,0x1100171a,0x6800100,0x962540,0x1100171a,0x6800100,0x962541,0x1100171a,0x7c00100,0x230400,0x11001900,0x4000000,0x1600000,0x11001926, +0x2802100,0x1862460,0x11001926,0x2802400,0x1862460,0x11001926,0x2806100,0x1862460,0x11001926,0x4000000,0x200000,0x11001926,0x4000010,0x400000,0x11001926,0x6800000, +0x1329800,0x11001926,0x7800100,0x1830142,0x11001926,0x7c00100,0x1830000,0x11001926,0x7c00900,0x1830000,0x11001926,0x7e00100,0x1830000,0x11001a18,0x2802100,0x1862460, +0x11001a18,0x2802400,0x1862460,0x11001a18,0x6800000,0x1329800,0x11001a18,0x7800100,0x1830142,0x11001a18,0x7c00100,0x1830000,0x11001a18,0x7c00100,0x1830002,0x11001a18, +0x7c00900,0x1830000,0x11001a18,0x7e00100,0x1830000,0x11001d0c,0x7c00100,0x230400,0x11001d0c,0x7c00100,0x250400,0x11001e12,0x7c00100,0x2230500,0x11001e12,0x7c00100, +0x2330520,0x11001e12,0x7c80100,0x2330520,0x11002619,0x7c00100,0x220401,0x11002619,0x7c00100,0x220402,0x11002619,0x7c00100,0x250401,0x1100270e,0x4000400,0x200001, +0x1100270e,0x4000400,0x200002,0x1100270e,0x4000400,0x500001,0x1100270e,0x7c00100,0x220401,0x1100270e,0x7c00100,0x250401,0x11002800,0x80000,0x918820,0x11002800, +0x80000,0x1c18020,0x11002800,0x180000,0x918820,0x11002800,0x4000001,0x440001,0x11002800,0x4000001,0x440002,0x11002800,0x4000001,0xc4000b,0x11002800,0x6800000, +0x201c00,0x11002800,0x6800020,0x201c00,0x11002800,0x24000000,0x200000,0x11002800,0x24000000,0x200002,0x11002800,0x24000000,0x810000,0x11002800,0x24000000,0x1410000, +0x11002800,0x24000000,0x1500000,0x11002800,0x24000000,0x1500002,0x11002800,0x24000002,0x400000,0x11002800,0x24000006,0xc0000b,0x11002800,0x24000008,0x1410000,0x11002800, +0x24000008,0x1710000,0x11002800,0x24000020,0x1001400,0x11002800,0x24000020,0x1500002,0x11002800,0x2c000010,0x1248000,0x11002800,0x2c000010,0x11248002,0x11002800,0x40000001, +0x63b020,0x11002800,0x40080000,0x918820,0x11002801,0x80000,0x2a65620,0x11002801,0x82000,0x962460,0x11002900,0x4000000,0x20000e,0x11002900,0x4000000,0x20000f, +0x11002900,0x4000020,0x20000e,0x11002900,0x4000020,0x20000f,0x11002900,0x4000020,0x81000e,0x11002900,0x4000020,0x81000f,0x11002900,0x4000020,0x141000e,0x11002900, +0x4000020,0x141000f,0x11002900,0x4000022,0x20000e,0x11002900,0x4000022,0x20000f,0x11002a00,0x4000000,0x1500000,0x11002a00,0x4000000,0x1600000,0x11002a00,0x4000000, +0x1600002,0x11002b01,0x2000,0x962460,0x11002b01,0x2802020,0x962460,0x11002c00,0x4000000,0x200000,0x11002c00,0x4000000,0x200002,0x11002c00,0x4000000,0x20000f, +0x11002c00,0x4000020,0x200000,0x11002c00,0x7c00000,0x200000,0x11002c00,0x7c00020,0x200000,0x11002c00,0x7c00120,0x220405,0x11002c00,0x7c00120,0x230402,0x11002c00, +0x7c00120,0x250402,0x11002c00,0x7c00120,0x250405,0x11002c19,0x7c00100,0x250400,0x11002c19,0x7c00100,0x250401,0x11002d00,0x4000000,0x100006,0x11002d00,0x4000000, +0x200006,0x11002d19,0x7c00100,0x220402,0x11002d19,0x7c00100,0x230400,0x11002d19,0x7c00100,0x250402,0x11002e00,0x24000000,0x200000,0x11002e00,0x24000020,0x200000, +0x11002e00,0x24000020,0x200001,0x11002e00,0x24000020,0x10200000,0x11002f00,0x24000020,0x200000,0x11002f00,0x24000020,0x200001,0x11002f00,0x24000020,0x200002,0x11002f00, +0x24000020,0xf00000,0x11002f00,0x24000020,0x1600000,0x11002f00,0x24000022,0x1600000,0x11003000,0x24000000,0x200000,0x11003000,0x24000000,0x10200000,0x11003000,0x24000020, +0x200000,0x11003000,0x24000020,0x810000,0x11003000,0x24000020,0x1410000,0x11003100,0x24000000,0x200000,0x11003200,0x24000000,0x200000,0x11003300,0x4000000,0x100003, +0x11003400,0x24000000,0x100000,0x11003400,0x24000000,0x200000,0x11003500,0x24000000,0x200000,0x11003600,0x24000000,0x200000,0x11003600,0x24000000,0x10200000,0x11003600, +0x24000020,0x200000,0x11003700,0x24000000,0x200000,0x11003700,0x24000000,0xe00000,0x11003700,0x24000000,0x10200000,0x11003700,0x24000000,0x10e00000,0x11003700,0x24000000, +0x928045a0,0x11003700,0x24000020,0x200000,0x11003800,0x4000000,0x100000,0x11003800,0x24000000,0x200000,0x11003800,0x24000000,0xb00000,0x11003800,0x24000000,0xe00000, +0x11003800,0x24000000,0x1710000,0x11003800,0x24000000,0x10200000,0x11003800,0x24000000,0x10b00000,0x11003800,0x24000000,0x10e00000,0x11003800,0x24000000,0x10e05200,0x11003800, +0x24000000,0x928045a0,0x11005003,0x7c00100,0x220402,0x11005013,0x2802500,0x962460,0x11005013,0x4000020,0x200005,0x11005013,0x7c00100,0x2633801,0x11005013,0x7c00100, +0x2633802,0x11005013,0x7c00100,0x2633805,0x11005019,0x7c00100,0x220402,0x11005100,0x24000000,0x810000,0x11005100,0x24000000,0x1410000,0x11005102,0x7000100,0x230408, +0x11005102,0x7c00100,0x230404,0x11005102,0x7c00100,0x230407,0x11005102,0x7c00100,0x230408,0x11005102,0x7c00100,0x230409,0x11005201,0x2802400,0x962460,0x11005500, +0x80000,0x1e18820,0x11005502,0x7000100,0x230408,0x11005502,0x7c00100,0x230404,0x11005502,0x7c00100,0x230407,0x11005502,0x7c00100,0x230408,0x11005502,0x7c00100, +0x230409,0x11005667,0x1000,0,0x11020200,0x80004,0x418820,0x11020200,0x4000000,0x100006,0x11020200,0x4000000,0x10000f,0x11020200,0x4000400,0x100002, +0x11020200,0x4000400,0x500002,0x11020200,0x6800c00,0x101000,0x11020200,0x24000000,0x100000,0x11020200,0x24000000,0x1400000,0x11020200,0x24000000,0x1500000,0x11020200, +0x24000000,0x1600000,0x11020200,0x24000000,0x10200000,0x11020200,0x24000020,0x100000,0x11020200,0x24000020,0x1600000,0x11020219,0x7c00100,0x12040f,0x11020219,0x7c00100, +0x220400,0x11020219,0x7c00100,0x220401,0x11020219,0x7c00100,0x250400,0x11020319,0x7c00100,0x220400,0x11020319,0x7c00100,0x220401,0x11020319,0x7c00100,0x220402, +0x11020319,0x7c00100,0x250400,0x11020319,0x7c00100,0x250402,0x11020319,0x7d00100,0x220402,0x11020419,0x7c00100,0x220401,0x11020519,0x7c00100,0x220400,0x11020600, +0x4000400,0x100002,0x11020600,0x4000400,0x200400,0x11020600,0x7c00500,0x130400,0x11020600,0x7c00d00,0x130400,0x11020701,0x2802400,0x962460,0x11020701,0x2802400, +0x962461,0x11020701,0x2802400,0xc62460,0x1102080e,0x7c00100,0x220400,0x1102080e,0x7c00100,0x250400,0x11020908,0x7c00100,0x220400,0x11020908,0x7c00100,0x220401, +0x11020908,0x7c00100,0x250400,0x11020908,0x7c00100,0x250401,0x11022800,0x24000000,0x100000,0x11022800,0x24000000,0x200000,0x11022800,0x24000000,0x200002,0x11022800, +0x24000000,0x401000,0x11022800,0x24000000,0xf00002,0x11022800,0x24000000,0xf0ac02,0x11022800,0x24000000,0x1500000,0x11022800,0x24000002,0x100000,0x11022800,0x24000002, +0x370000,0x11022800,0x24000002,0x470000,0x11022800,0x24000006,0x400000,0x11022800,0x24000008,0x1710000,0x11022800,0x24000008,0x1712c00,0x11022800,0x24000020,0x100000, +0x11022800,0x24000020,0x1500000,0x11022800,0x24000020,0x1500002,0x11022900,0x4000000,0x10000e,0x11022900,0x4000000,0x10000f,0x11022919,0x7c00100,0x12040f,0x11022c00, +0x4000000,0x100002,0x11022c00,0x4000000,0x1500002,0x11022c00,0x4000000,0x1600002,0x11022c00,0x4000000,0x1010000f,0x11022c00,0x7c00120,0x120405,0x11022c0e,0x7c00100, +0x250401,0x11022c19,0x7c00100,0x150401,0x11022d00,0x4000000,0x100006,0x11022d00,0x4000000,0x200006,0x11022d19,0x7c00100,0x120402,0x11022d19,0x7c00100,0x150402, +0x11022e00,0x24000000,0x200000,0x11022e00,0x24000020,0x100000,0x11022e00,0x24000020,0x10100000,0x11022f00,0x24000020,0x100000,0x11022f00,0x24000020,0x100001,0x11022f00, +0x24000020,0x100002,0x11023000,0x24000000,0x100000,0x11023300,0x4000000,0x100002,0x11023300,0x4000000,0x100003,0x11023300,0x4000100,0x120403,0x11023300,0x4000100, +0x150403,0x11023300,0x4000100,0x10150403,0x11023400,0x24000000,0x100000,0x11023500,0x24000000,0x100000,0x11023600,0x24000000,0x100000,0x11023600,0x24000020,0x100000, +0x11023600,0x24000020,0x10100000,0x11023700,0x24000000,0x100000,0x11023700,0x24000000,0xe00000,0x11023700,0x24000000,0x10100000,0x11023700,0x24000000,0x10e00000,0x11023700, +0x24000020,0x100000,0x11023700,0x24000020,0x10100000,0x11023700,0x24000020,0x10105200,0x11023800,0x4000000,0x100000,0x11023800,0x24000000,0x200000,0x11024e67,0, +0,0x11025600,0x4000000,0x100000,0x11042a00,0x4000000,0x1600000,0x11045700,0x4000000,0x20000a,0x11045700,0x4000020,0x20000a,0x11045712,0x7c00100,0xe3040a, +0x11045712,0x7c80100,0xe3040a,0x11045716,0x7c00100,0xe30c0a,0x11045716,0x7c00100,0x2530c0a,0x11063d00,0x4000001,0x440011,0x11065700,0x4000000,0x810011,0x11065700, +0x4000000,0xe00011,0x11065700,0x4000000,0x1410011,0x11065700,0x4000000,0x1500011,0x11065700,0x4000000,0x1600011,0x11065700,0x4000006,0xe70011,0x11065700,0x4000008, +0xe00011,0x11065700,0x4000008,0xe02c11,0x11065700,0x4000010,0x871411,0x11065700,0x4000010,0x1201411,0x11065700,0x4000010,0x1271011,0x11065700,0x4000020,0xe00011, +0x11065700,0x4000400,0xe00011,0x11065700,0x4000420,0xe00011,0x11065700,0x6800000,0xe01c11,0x11065700,0x6800040,0xe00011,0x11065700,0xc000010,0x80ac11,0x11065700, +0xc000010,0xb48011,0x11065719,0x7c00100,0xe20411,0x11065719,0x7c00100,0xe50411,0x11065719,0x7c00140,0xe20411,0x11065719,0x7c00140,0xe50411,0x11080100,0x6800000, +0x201c00,0x11080100,0x68000c0,0x19329800,0x11080100,0x24000000,0x200000,0x11080100,0x24000000,0x810000,0x11080100,0x24000000,0x1410000,0x11080100,0x24000000,0x1500000, +0x11080100,0x24000000,0x1600000,0x11080100,0x24000000,0x1b00000,0x11080100,0x24000000,0x2410000,0x11080100,0x24000000,0x18200000,0x11080100,0x24000006,0xd70000,0x11080100, +0x24000008,0x1713c00,0x11080100,0x24000008,0x1714000,0x11080100,0x24000010,0x1001400,0x11080100,0x24000010,0x1071000,0x11080100,0x24000010,0x1071400,0x11080100,0x24000020, +0x200000,0x11080100,0x24000020,0x400000,0x11080100,0x24000020,0x1600000,0x11080100,0x24000400,0x200000,0x11080100,0x24000420,0x200000,0x11080100,0x2c000010,0xb48000, +0x11080100,0x2c000010,0x100ac00,0x11080100,0x44000001,0x1a40000,0x11080119,0x7c00100,0x220400,0x11080119,0x7c00100,0x250400,0x11080119,0x7c001c0,0x220400,0x11080119, +0x7c001c0,0x250400,0x11080200,0x4000400,0x200002,0x11080200,0x24000000,0x200000,0x11080200,0x24000000,0x1500000,0x11080200,0x24000000,0x1600000,0x11080200,0x24000020, +0x200000,0x110a1e12,0x7c00100,0x2130480,0x110a1e12,0x7c80100,0x2130480,0x110a3000,0x24000000,0x30e00000,0x110a3000,0x24100000,0x810001,0x110a3000,0x24100000,0x1410001, +0x110a3700,0x24000000,0x30200000,0x110a3d00,0x4000000,0xe00000,0x110a3d00,0x4000000,0xe00002,0x110a3d00,0x24000000,0xe00000,0x110a3d11,0x7c00300,0xe30000,0x110a3d11, +0x7c00900,0x1230400,0x110a3d12,0x2802400,0x962460,0x110a3e14,0x7c00100,0xe30000,0x110a3e14,0x7c00100,0xe30001,0x110a3e14,0x7c00100,0x2530000,0x110a3e14,0x7c00900, +0x1230000,0x110a3e14,0x7c00900,0x1230001,0x110a3f16,0x7c00100,0xe30c00,0x110a3f16,0x7c00100,0xe30c01,0x110a3f16,0x7c00100,0x2530c00,0x110a3f16,0x7c00900,0x1230c00, +0x110a3f16,0x7c00900,0x1230c01,0x110a4005,0x7c00100,0xe30400,0x110a4112,0x7c00100,0xe30402,0x110a4112,0x7c80100,0xe30402,0x110a4400,0x4000000,0xe00000,0x110a4412, +0x4000000,0xe00002,0x110a4412,0x4000000,0xe00003,0x110a4416,0x4000000,0xe00c03,0x110a4500,0x4000000,0xe0000d,0x110a4516,0x4000000,0xe00c0d,0x110a4711,0x7c40300, +0xe30000,0x110a4f11,0x7c00300,0xe30001,0x110a4f11,0x7c40300,0xe30000,0x110a5300,0x4000000,0x810010,0x110a5300,0x4000000,0xe00002,0x110a5300,0x4000000,0xe00010, +0x110a5300,0x4000000,0x1410010,0x110a5300,0x4000002,0xe70010,0x110a5300,0x4000008,0x810010,0x110a5300,0x4000008,0x1410010,0x110a5300,0x6800000,0xe01c02,0x110a5300, +0x6800000,0xe01c10,0x110a5400,0x4000000,0x81000c,0x110a5400,0x4000000,0xe0000c,0x110a5400,0x4000000,0x141000c,0x110a5400,0x4000000,0x150000c,0x110a5400,0x4000000, +0x160000c,0x110a5400,0x4000002,0xe7000c,0x110a5400,0x4000010,0x87140c,0x110a5400,0x4000010,0xe7000c,0x110a5400,0x4000010,0x120140c,0x110a5400,0x4000010,0x127100c, +0x110a5400,0x4000020,0xe0000c,0x110a5400,0x4000026,0xe7000c,0x110a5400,0xc000010,0x80ac0c,0x110a5400,0xc000010,0xb4800c,0x11400a0c,0xc000010,0x1049400,0x11400c0e, +0x4000010,0xb00000,0x11400c0e,0x4000010,0x1071400,0x11400c0e,0xc000010,0xb48000,0x11400c13,0x7c00900,0x230400,0x11400f36,0xc000010,0x448000,0x11400f46,0xc000010, +0x448000,0x11401d72,0x4000000,0x200000,0x11403d95,0x4000000,0xe00000,0x1144578a,0x4000004,0x120000a,0x1144578a,0x4000008,0x81000a,0x1144578a,0x4000008,0x141000a, +0x1144578a,0x4000010,0x87000a,0x1144578a,0xc000010,0x84800a,0x11445793,0x3802500,0x126246a,0x11445793,0x7c00d00,0x2530c0a,0x114a3d8a,0x24000000,0x810000,0x114a3d8a, +0x24000000,0x1410000,0x114a3d8a,0x24000008,0x810000,0x114a3d8a,0x24000008,0x1410000,0x114a3d8a,0x24000010,0x870000,0x114a3d8a,0x2c000010,0x848000,0x114a3d90,0x4000000, +0xe00000,0x114a3d90,0x24000000,0xe00000,0x114a3d90,0x24000002,0x1200000,0x114a3d90,0x24000002,0x10e00000,0x114a3d90,0x24000008,0x810000,0x114a3d90,0x24000008,0x1410000, +0x114a3d93,0x7c00900,0x930c00,0x114a3d93,0x7c00900,0xe30c00,0x114a3d95,0x7c00300,0xe30000,0x114a3e93,0x7000400,0x1200c02,0x114a3f8a,0x4000004,0x1200000,0x114a3f93, +0x7c00d00,0x2530c00,0x114a4295,0x4000000,0xe00000,0x114a4295,0x4000000,0xe0000f,0x114a4495,0x4000000,0xe00002,0x114a4495,0x4000000,0xe00003,0x114a4495,0x4000000, +0x10e00003,0x114a4595,0x4000000,0xe00002,0x114a4595,0x4000000,0xe0000d,0x1180090a,0x2802400,0x962460,0x11800c19,0x2802100,0x962460,0x11800c19,0x2802500,0x962460, +0x11800f1f,0x2802400,0x962460,0x11800f2b,0x2802400,0x962460,0x11820700,0x2802400,0x962460,0x11820700,0x2802500,0x962460,0x118a3d96,0x2802400,0x962460,0x118a3e93, +0x2802400,0x962460,0x11c00904,0x2802400,0x962460,0x11c00908,0x2802400,0x962460,0x11c00c1d,0x6800000,0x1329800,0x11c00f5a,0x6800000,0x1329800,0x11c0105f,0x6800000, +0x1329800,0x11c01163,0x6800000,0x1329800,0x11c01267,0x6800000,0x1329800,0x11c0146b,0x4000000,0x200000,0x11c0146b,0x6800000,0x1329800,0x11c0146b,0x7c00100,0x230400, +0x11c0511d,0x7c00100,0x230408,0x20000067,0x1000,0,0x20000b13,0x2802400,0x962460,0x20000b13,0x2802500,0x962460,0x20001b27,0x2802100,0x962460,0x20001b27, +0x2802100,0x962461,0x20001b27,0x2802400,0x962460,0x20001b27,0x2806400,0x962460,0x20001b27,0x2902100,0x962462,0x20001b27,0x4000000,0x200000,0x20001b27,0x4000000, +0x400000,0x20001b27,0x4000000,0x500000,0x20001b27,0x4000000,0x810000,0x20001b27,0x4000000,0xb00000,0x20001b27,0x4000000,0xc0000b,0x20001b27,0x4000000,0x1410000, +0x20001b27,0x4000010,0xb00000,0x20001b27,0x4000010,0xc00000,0x20001b27,0x6800000,0x1329800,0x20001b27,0x6800100,0x462540,0x20001b27,0x6800400,0x962540,0x20001b27, +0x7c00100,0x230400,0x20001b27,0x7c00100,0x230401,0x20002619,0x7c00100,0x220401,0x20002a00,0x4000000,0x1600000,0x20004b67,0,0x1900020,0x20004c67,0, +0x1900020,0x20004d67,0,0x1900020,0x20006d67,0x1000,0,0x20006e67,0x1000,0,0x20026d67,0,0,0x20026e67,0,0, +0x200a4a12,0x7c00100,0x1f304c1,0x200a4a12,0x7c00100,0x20304e1,0x21005600,0x4000000,0x700000,0x21022a00,0x4000000,0x1600000,0x30000419,0x7c00100,0x220400,0x30000419, +0x7c00100,0x220401,0x30000419,0x7c00100,0x250400,0x30000419,0x7c00100,0x250401,0x30000519,0x7c00100,0x220400,0x30000600,0x4000400,0x200400,0x30000600,0x7c00500, +0x230400,0x30000605,0x4000400,0x200000,0x3000080e,0x7c00100,0x220400,0x30000908,0x2000,0x962460,0x30000908,0x7c00100,0x220400,0x30000908,0x7c00100,0x220401, +0x30000908,0x7c00100,0x250400,0x30000908,0x7c00100,0x250401,0x30000a03,0x4000006,0x400000,0x30000c02,0x4000000,0x200000,0x30000c02,0x7c00100,0x230400,0x30000d22, +0x2802100,0x962460,0x30000d22,0x2802400,0x962460,0x30000d22,0x2802500,0x962460,0x30000d22,0x4000000,0x200000,0x30000d22,0x4000010,0x200000,0x30000d22,0x7c00100, +0x230400,0x30000d22,0xc000010,0x248000,0x30000d22,0x80000000,0x218960,0x30000e25,0x2802500,0x962460,0x30000e25,0x7c00100,0x230400,0x30001821,0x2802100,0x962460, +0x30001821,0x2806400,0x962460,0x30001821,0x4000000,0x200000,0x30001821,0x6800100,0x962540,0x30001821,0x6800100,0x962541,0x30001821,0x7c00100,0x230400,0x30001b27, +0x2802100,0x962460,0x30001b27,0x2802400,0x962460,0x30001b27,0x4000000,0x200000,0x30001b27,0x4000000,0x400000,0x30001b27,0x7c00100,0x230400,0x30001c1c,0x2802100, +0x1862460,0x30001c1c,0x2802400,0x1862460,0x30001c1c,0x2806400,0x1862460,0x30001c1c,0x4000000,0x200000,0x30001c1c,0x6800100,0x1862400,0x30001c1c,0x6800100,0x1862540, +0x30001c1c,0x7c00100,0x1830000,0x30001c1c,0x7c00100,0x1830001,0x30001c1c,0xc000010,0x448000,0x30001f0b,0x4000000,0x200000,0x30001f0b,0x4000010,0x200000,0x30001f0b, +0x4000010,0x400000,0x30001f0b,0x6800000,0x200000,0x30001f0b,0x7c00100,0x230400,0x30001f0b,0xc000010,0x248000,0x30002006,0x7c00100,0x250400,0x30002128,0x4000010, +0x200000,0x30002128,0x7c00100,0x230400,0x30002128,0xc000010,0x248000,0x3000221d,0x4000000,0x810000,0x3000221d,0x4000000,0x1410000,0x3000221d,0x4000001,0x440000, +0x3000221d,0x7c00100,0x230400,0x30002300,0x4000010,0x400000,0x30002320,0x7c00100,0x230400,0x30002417,0x2802100,0x1862460,0x30002417,0x2802400,0x1862460,0x30002417, +0x2806400,0x1862460,0x30002417,0x2882000,0x1862460,0x30002417,0x4000000,0x200000,0x30002417,0x4000000,0x400000,0x30002417,0x4000000,0x1600000,0x30002417,0x4000010, +0x400000,0x30002417,0x4000010,0x1200000,0x30002417,0x6800000,0x1329800,0x30002417,0x6800100,0x1862540,0x30002417,0x7c00100,0x1830000,0x30002417,0x7d00100,0x1830000, +0x3000251b,0x80000,0xc18820,0x3000251b,0x2802100,0x962460,0x3000251b,0x3c02100,0x962460,0x3000251b,0x4000000,0x200000,0x3000251b,0x4000006,0x500000,0x3000251b, +0x4000010,0x400000,0x3000251b,0x4000010,0xb70000,0x3000251b,0x4000800,0x200000,0x3000251b,0x6800000,0x1329800,0x3000251b,0x7c00100,0x230400,0x3000251b,0x7c00900, +0x230400,0x3000251b,0xc000010,0xb48000,0x3000251b,0x12882000,0x962460,0x30002800,0x4000001,0xc41c0b,0x30002800,0x24000000,0x200000,0x30002800,0x2c000010,0x1248002, +0x30002800,0x2c000010,0x11248002,0x30002a00,0x4000000,0x1600000,0x30002b01,0x2000,0x962460,0x30002c00,0x4000000,0x200000,0x30002c00,0x7c00100,0x10220405,0x30002d19, +0x7c00100,0x250400,0x30002e00,0x24000000,0x200000,0x30003000,0x24000000,0x200000,0x30003100,0x24000000,0x200000,0x30003600,0x24000000,0x200000,0x30003700,0x24000000, +0x200000,0x3000392e,0x24000000,0x200000,0x30005013,0x7c00100,0x2633801,0x30005600,0,0x918820,0x30020600,0x4000400,0x500400,0x30020701,0x2802400,0x962460, +0x30020701,0x2802400,0xc62460,0x300a3a11,0x4020000,0xe00000,0x300a3a11,0x4020000,0xe00002,0x300a3b11,0x4020000,0xe00002,0x300a3c00,0x4008000,0xe00000,0x300a3c00, +0x4010000,0xe00000,0x300a3d11,0x7c00300,0xe30002,0x300a4305,0x7c00100,0xe30400,0x300a4611,0x7c40300,0xe30000,0x300a4829,0x7c00100,0xe30400,0x300a4829,0x7c00900, +0x1230400,0x300a4929,0x4000000,0xe00000,0x30402578,0x4000010,0x400000,0x30402578,0x4000010,0xb70000,0x30402578,0xc000010,0xb48000,0x304a3d95,0x4000000,0xe00000, +0x30800c19,0x2802100,0x962460,0x30c01c70,0x6800000,0x1329800,0x3100080e,0x7c00120,0x220402,0x3100080e,0x7c00120,0x250402,0x31005167,0x1000,0,0x3100581e, +0x4000000,0x200000,0x3100581e,0x7c00100,0x230400,0x3100590d,0x7c00100,0x230400,0x31005a09,0x7c00100,0x220400,0x31005a09,0x7c00100,0x250400,0x31005b00,0x4000000, +0x200000,0x31005c00,0x80000,0x918820,0x31005c00,0x2802000,0x962460,0x31005c00,0x2802400,0x962460,0x31005c00,0x4000000,0x200000,0x31005c00,0x4000000,0x200001, +0x31005c00,0x6800000,0x962540,0x31005c00,0x6800400,0x962540,0x31005c01,0x2802400,0x962460,0x31005d00,0x4000020,0x200005,0x31005d00,0x6800020,0x1329805,0x31005d00, +0x7c00120,0x220405,0x31005d00,0x7c00120,0x250405,0x31006000,0x82000,0x962460,0x31006000,0x180000,0x918820,0x310a5e11,0x7c40300,0xe30000,0x310a5f11,0x7c00300, +0xe30001,0x32000419,0x7c00100,0x250400,0x3200080e,0x4000020,0x200000,0x3200080e,0x7c00100,0x220400,0x3200080e,0x7c00100,0x250400,0x32000908,0x7c00100,0x220400, +0x32000908,0x7c00100,0x250400,0x32000c02,0x7c00100,0x230400,0x32000e25,0x7c00100,0x230400,0x32001d0c,0x7c00100,0x230400,0x32002800,0x80000,0x1e18820,0x32002800, +0x80020,0x218820,0x32002800,0x4000001,0x440002,0x32002800,0x24000000,0x200000,0x32002800,0x24000000,0x200002,0x32002800,0x24000020,0x200000,0x32002800,0x2c000010, +0x1248002,0x32002919,0x7c00100,0x22040f,0x32002a00,0x4000000,0x1600000,0x32002b01,0x2000,0x962460,0x32002b01,0x2802000,0x962460,0x32002b01,0x2802020,0x962460, +0x32002c00,0x4000000,0x200000,0x32002c00,0x4000020,0x200000,0x32002c00,0x4000020,0x200005,0x32002c00,0x7c00120,0x220405,0x32002c00,0x7c00120,0x250405,0x32002e00, +0x24000020,0x200000,0x32002f00,0x24000020,0x200000,0x32003000,0x24000000,0x200000,0x32003000,0x24000020,0x200000,0x32003500,0x24000000,0x200000,0x32003600,0x24000020, +0x200000,0x32003600,0x24000020,0x10200000,0x32003700,0x24000000,0x100000,0x32003700,0x24000000,0x200000,0x32003700,0x24000000,0x10200000,0x32003800,0x24000000,0x810000, +0x32003800,0x24000000,0x1410000,0x32005102,0x4000000,0x1500008,0x32005502,0x7c00100,0x230400,0x32006108,0x7c00100,0x220400,0x32006108,0x7c00100,0x250400,0x3200622a, +0x2802100,0x962460,0x3200622a,0x2806000,0x962460,0x3200622a,0x7c00100,0x230400,0x3200632b,0x2802100,0x962460,0x3200632b,0x2806000,0x962460,0x3200632b,0x7c00100, +0x230400,0x3200642c,0x2802100,0x962460,0x3200642c,0x7c00100,0x230400,0x3200652d,0x2802100,0x962460,0x3200652d,0x7c00100,0x230400,0x32006600,0x24000020,0x200000, +0x32006700,0x24000020,0x200000,0x32006800,0x24000020,0x200000,0x32006800,0x24000020,0x10200000,0x32006900,0x24000020,0x200000,0x32006900,0x24000020,0x810000,0x32006900, +0x24000020,0x1410000,0x32006a00,0x24000020,0x200000,0x32006a00,0x24000020,0x200001,0x32006a00,0x24000020,0x200002,0x32020701,0x2882000,0xc62460,0x32023300,0x4000000, +0x100000,0x32026c01,0x12882000,0x962460,0x32065700,0x4000000,0x810011,0x32065700,0x4000000,0x1410011,0x32086600,0x24000020,0x810000,0x32086600,0x24000020,0x1410000, +0x32086900,0x24000020,0x810000,0x32086900,0x24000020,0x1410000,0x320a3600,0x24000020,0x30200000,0x320a3d11,0x7c00100,0x1230400,0x320a3e14,0x7c00100,0xe30010,0x320a3e14, +0x7c00100,0x2530000,0x320a3f16,0x7c00100,0xe30c10,0x320a4400,0x4000000,0xe00003,0x320a4929,0x4000000,0xe00000,0x320a4f11,0x7c00300,0xe30001,0x320a6b16,0x7c00100, +0x2530c00,0x32406374,0xc000010,0x448000,0x324a3d98,0x4000000,0x10e00000,0x324a3d98,0x7c00100,0x1230400,0x324a3f93,0x4000002,0x1200c00,0x324a5390,0x24000000,0xe00000, +0x32820701,0x2802000,0x962460,0x40000419,0x7c00100,0x220400,0x40000519,0x7c00100,0x220400,0x40000600,0x4000400,0x200400,0x4000080e,0x7c00100,0x220400,0x4000080e, +0x7c00100,0x250400,0x4000080e,0x7c00100,0x250402,0x40000c02,0x2802100,0x962460,0x40000c02,0x2802400,0x962460,0x40000c02,0x2802500,0x962460,0x40000c02,0x4000000, +0x200000,0x40000c02,0x4000000,0x1071400,0x40000c02,0x7c00100,0x230400,0x40000c02,0x80000000,0x218960,0x40000d22,0x7c00100,0x230400,0x40000f0a,0x7c00100,0x230400, +0x40001004,0x7c00100,0x230400,0x40001110,0x2802100,0x962460,0x40001110,0x6800100,0x962540,0x4000120f,0x2802100,0x962460,0x4000120f,0x4000000,0x1600000,0x4000120f, +0x7c00100,0x230400,0x4000131f,0x7c00100,0x230400,0x40001423,0x4000000,0x200000,0x40001423,0x4000000,0x1600000,0x40001615,0x2802400,0x962460,0x40001615,0x7c00100, +0x230400,0x40002417,0x2802400,0x1862460,0x40002417,0x4000000,0x200000,0x40002800,0x6800000,0x201c00,0x40002800,0x24000002,0x200000,0x40002c00,0x4000000,0x200002, +0x40003000,0x24000000,0x10200000,0x40003000,0x24000020,0x200000,0x40003700,0x24000000,0x200000,0x40003700,0x24000000,0x10200000,0x40005a09,0x7c00100,0x220400,0x40005a09, +0x7c00100,0x250400,0x40005d00,0x7c00120,0x220405,0x40006f30,0x2802100,0x962460,0x40006f30,0x2802400,0x962460,0x40006f30,0x4000000,0x200000,0x40006f30,0x6800000, +0x1329800,0x40006f30,0x6800100,0x962540,0x40006f30,0x7c00100,0x230400,0x40006f30,0xc000010,0xb48000,0x40007034,0x7c00100,0x1830000,0x40007117,0x4000000,0x200000, +0x40007208,0x7c00100,0x220400,0x4000720e,0x7c00100,0x220400,0x4000720e,0x7c00500,0x22040e,0x4000720e,0x7c00500,0x22040f,0x40007219,0x7c00100,0x220400,0x40007219, +0x7c00500,0x220400,0x40007219,0x7c00500,0x22040e,0x40007219,0x7c00500,0x22040f,0x40007300,0x24000000,0x200000,0x40007300,0x24000000,0x10200000,0x40007400,0x4000000, +0x200000,0x40007531,0x7c00100,0x230400,0x40007631,0x7c00100,0x230400,0x40007835,0x4000010,0x400000,0x40007835,0x7c00100,0x230400,0x40007933,0x7c00100,0x230400, +0x40007a32,0x6800000,0x1329800,0x40007a32,0x7c00100,0x230400,0x40007b2f,0x7c00100,0x230400,0x40007c00,0x4000000,0x200000,0x40020701,0x2802400,0x962460,0x40020701, +0x2802400,0xc62460,0x40023300,0x4000000,0x200000,0x40027d01,0x12882000,0x962460,0x400a3700,0x24000000,0x30200000,0x400a3700,0x24000000,0x30e00000,0x400a4400,0x4000000, +0xe0000d,0x400a4412,0x4000000,0xe00002,0x400a4412,0x4000000,0xe00003,0x400a4500,0x4000000,0xe0000d,0x400a5300,0x4000000,0x810010,0x400a5300,0x4000000,0x1410010, +0x404077bb,0x4000000,0x200000,0x404077be,0x4000000,0x200000,0x404077be,0x4000000,0x400000,0x40c0511d,0x4000000,0x200000,0x41000419,0x7c00100,0x220400,0x41000419, +0x7c00100,0x250400,0x4100080e,0x7c00100,0x220400,0x4100080e,0x7c00100,0x250400,0x41000908,0x7c00100,0x220400,0x41000908,0x7c00100,0x250400,0x41000b13,0x2802000, +0x962460,0x41000b13,0x2802100,0x962460,0x41000b13,0x4000000,0xb00000,0x41000c02,0x2802100,0x962460,0x41000c02,0x4000000,0xb00000,0x41000c02,0x4000000,0x1500000, +0x41000f0a,0x7c00100,0x230400,0x41001004,0x7c00100,0x230400,0x41001423,0x7c00100,0x230400,0x41001b27,0x4000000,0x500000,0x41001d0c,0x7c00100,0x230400,0x41001d0c, +0x7c00100,0x23040f,0x41001f0b,0x2802100,0x962460,0x41001f0b,0x4000000,0x200000,0x41001f0b,0x7c00100,0x230400,0x41002800,0x24000000,0x200000,0x41002800,0x24000000, +0x400000,0x41002919,0x7c00100,0x22040e,0x41002a00,0x4000000,0x1600000,0x41002b01,0x2802020,0x962460,0x41002c00,0x4000000,0x200000,0x41002c00,0x7c00120,0x220405, +0x41003000,0x24000000,0x200000,0x41003700,0x24000000,0x200000,0x41003700,0x24000000,0x10200000,0x41003700,0x24000000,0x10205200,0x41003700,0x24000000,0x10e00000,0x41005d00, +0x7c00120,0x220405,0x41006600,0x24000020,0x200000,0x41006600,0x24000020,0x810000,0x41006600,0x24000020,0x1410000,0x41007208,0x7c00100,0x22040f,0x41007219,0x7c00100, +0x220400,0x41007300,0x24000000,0x200000,0x41007e0e,0x2802000,0x962460,0x41007e0e,0x4000000,0x200000,0x41007f0e,0x4000000,0x200000,0x41007f0e,0x7c00100,0x230400, +0x41008002,0x7c00100,0x230400,0x41008137,0x2802100,0x962460,0x41008137,0x4000000,0x200000,0x41008137,0x6800100,0x962540,0x41008137,0x7c00100,0x230400,0x41008301, +0x2802000,0x962460,0x41008407,0x4000000,0x200000,0x41008407,0x4000000,0x400000,0x41008407,0x4000000,0xb00000,0x41008407,0x7c00100,0x220400,0x41008407,0x7c00100, +0x250400,0x4100850b,0x7c00100,0x230400,0x4100860b,0x4000000,0x200000,0x4100860b,0x7c00100,0x230400,0x4100870c,0x7c00100,0x220400,0x41008838,0x7c00100,0x220400, +0x41008838,0x7c00100,0x250400,0x41008939,0x2802000,0x962460,0x41008939,0x2802100,0x962460,0x41008939,0x2806000,0x962460,0x41008939,0x4000000,0x200000,0x41008939, +0x4000000,0x400000,0x41008939,0x7c00100,0x230400,0x41008939,0xc000010,0x448000,0x41008a00,0x4000000,0x200000,0x41008b3b,0x4000000,0x1800000,0x41008b3b,0x6800000, +0x1329800,0x41008b3b,0x7c00100,0x1830000,0x41008b3b,0x7e00100,0x1830000,0x41008c3d,0x4000010,0x400000,0x41008c3d,0x7c00100,0x230400,0x41008d0e,0x7c00100,0x22040f, +0x41008d19,0x7c00100,0x220400,0x41008d19,0x7c00100,0x22040f,0x41008e00,0x24000000,0x200000,0x41008e00,0x24000000,0x400000,0x41008e00,0x24000000,0x1710000,0x41008e00, +0x24000006,0x400000,0x41008f3a,0x2802000,0x962460,0x41008f3a,0x2802100,0x962460,0x41008f3a,0x2806000,0x962460,0x41008f3a,0x4000000,0x200000,0x41008f3a,0x6800100, +0x962540,0x41008f3a,0x7c00100,0x230400,0x4100903c,0x7c00100,0x230400,0x4100903c,0x7c00100,0x23040f,0x41020701,0x2802000,0x962460,0x41020701,0x2802000,0xc62460, +0x410a3700,0x24000000,0x30200000,0x410a3700,0x24000000,0x30e00000,0x410a4412,0x4000000,0xe00003,0x410a4711,0x7c40300,0xe30000,0x410a4f11,0x7c00300,0xe30001,0x410a9100, +0x4000000,0x800010,0x410a9100,0x4000000,0x810010,0x410a9100,0x4000000,0x870010,0x410a9100,0x4000000,0xb00010,0x410a9100,0x4000000,0xf00010,0x410a9100,0x4000000, +0x1001410,0x410a9100,0x4000000,0x1071010,0x410a9100,0x4000000,0x1071410,0x410a9100,0x4000000,0x1410010,0x414a8295,0x4000000,0xe00000,0x41808300,0x2802000,0x962460, +0x41c0146b,0x6800000,0x1329800,0x50000419,0x7c00100,0x220400,0x50000419,0x7c00100,0x250400,0x5000080e,0x7c00100,0x220400,0x50000908,0x7c00100,0x220400,0x50000908, +0x7c00100,0x250400,0x50000b13,0x2802500,0x962460,0x50000f0a,0x7c00100,0x230400,0x50001615,0x2802100,0x962460,0x50001615,0x7c00100,0x230400,0x50002b01,0x2802020, +0x962460,0x50002c00,0x4000000,0x200000,0x50002c19,0x7c00100,0x220400,0x50002d19,0x7c00100,0x220400,0x50003000,0x24000000,0x200000,0x50003000,0x24000020,0x200000, +0x50003700,0x24000000,0x200000,0x50005d00,0x7c00120,0x220405,0x50005d00,0x7c00120,0x250405,0x50006108,0x7c00100,0x220400,0x50006108,0x7c00100,0x250400,0x50006600, +0x24000020,0x200000,0x50007300,0x24000000,0x200000,0x50008301,0x2802400,0x962460,0x50008a00,0x7c00500,0x230400,0x50009257,0x2802400,0x962460,0x50009257,0x4000000, +0x200000,0x50009257,0x4000010,0x1071400,0x50009257,0x6800000,0x1329800,0x50009257,0x7c00100,0x230400,0x50009257,0x7c00500,0x230400,0x50009257,0x7c00900,0x230400, +0x50009257,0xc000010,0xb48000,0x5000933e,0x2802100,0x962460,0x5000933e,0x2802400,0x962460,0x5000933e,0x4000000,0x200000,0x5000933e,0x4000000,0x400000,0x5000933e, +0x4000010,0x400000,0x5000933e,0x6800000,0x1329800,0x5000933e,0x6800100,0x962540,0x5000933e,0x6800100,0x962541,0x5000933e,0x6804400,0x962540,0x5000933e,0x7c00100, +0x230400,0x5000933e,0x7c00100,0x230401,0x5000933e,0xc000010,0x448000,0x50009419,0x7c00100,0x220400,0x50009419,0x7c00100,0x250400,0x50009500,0x4000400,0x200400, +0x5000965a,0x4000000,0x500000,0x5000965a,0x7c00100,0x230400,0x5000965a,0xc000010,0xb48000,0x5000975b,0x4000000,0x200000,0x5000975b,0x4000010,0x400000,0x5000975b, +0x7c00100,0x230400,0x50009865,0x7c00100,0x230400,0x50009965,0x4000010,0x400000,0x50009965,0x7c00100,0x230400,0x50409a95,0x4000000,0x200000,0x5100080e,0x7c00100, +0x220400,0x5100080e,0x7c00100,0x250400,0x51000c02,0x2802100,0x962460,0x51000c02,0x4000000,0x1500000,0x51000c02,0x4000020,0x200000,0x51000c02,0x7c00100,0x230400, +0x51000f0a,0x7c00100,0x230400,0x51000f0a,0x7c00500,0x230400,0x51001110,0x2802100,0x962460,0x5100131f,0x2802100,0x962460,0x51001423,0x7c00100,0x230400,0x51001524, +0x2802100,0x962460,0x51001524,0x4000000,0x200000,0x51001524,0x7c00100,0x230400,0x5100171a,0x2802100,0x962460,0x5100171a,0x4000000,0x200000,0x5100171a,0x4000000, +0x1500000,0x5100171a,0x7c00100,0x230400,0x51001b27,0x4000000,0x200000,0x51001b27,0x4000000,0x400000,0x51001b27,0x4000000,0x500000,0x51001b27,0x7c00100,0x230400, +0x51001c1c,0x2802100,0x1862460,0x51001c1c,0x2802400,0x1862460,0x51001c1c,0x2806400,0x1862460,0x51001c1c,0x4000000,0x1800000,0x51001c1c,0x6800000,0x1329800,0x51001c1c, +0x6800000,0x1862400,0x51001c1c,0x6800100,0x1862400,0x51001c1c,0x6800100,0x1862540,0x51001c1c,0x6800400,0x1862400,0x51001c1c,0x7c00100,0x1830000,0x5100251b,0x7c00100, +0x230400,0x51002619,0x7c00100,0x220400,0x51002619,0x7c00100,0x250400,0x51002800,0x80020,0x218820,0x51002c00,0x4000000,0x200000,0x51002d19,0x7c00100,0x230400, +0x51003700,0x24000000,0x200000,0x51003700,0x24000000,0xe00000,0x51005201,0x2802400,0x962460,0x51005c00,0x4000000,0x200000,0x51006108,0x7c00100,0x220400,0x51006108, +0x7c00100,0x250400,0x51006600,0x24000020,0x200000,0x51006600,0x24000020,0x810000,0x51006600,0x24000020,0x1410000,0x51007300,0x24000000,0x200000,0x51007300,0x24000020, +0x200000,0x51008002,0x7c00100,0x230400,0x51008301,0x2802000,0x962460,0x51008301,0x2802400,0x962460,0x51008a00,0x7c00500,0x230400,0x51008e00,0x24000000,0x200000, +0x51008e00,0x24000000,0x400000,0x51008e00,0x24000000,0x810000,0x51008e00,0x24000000,0x1400000,0x51008e00,0x24000000,0x1410000,0x51008e00,0x24000000,0x1710000,0x51008e00, +0x24000002,0x200000,0x51008e00,0x24000500,0x230400,0x51008e00,0x2c000010,0xb48000,0x51009419,0x7c00100,0x220400,0x51009419,0x7c00100,0x22040e,0x51009419,0x7c00100, +0x22040f,0x51009419,0x7c00100,0x250400,0x51009500,0x4000000,0x200400,0x51009500,0x7c00500,0x230400,0x51009519,0x7c00100,0x220400,0x51009519,0x7c00100,0x22040f, +0x51009519,0x7c00100,0x230400,0x51009519,0x7c00100,0x250400,0x51009b71,0x2802100,0x962460,0x51009b71,0x6800000,0x1329800,0x51009b71,0x6800100,0x962540,0x51009b71, +0x6804400,0x962540,0x51009b71,0x7c00100,0x230400,0x51009c52,0x2802100,0x962460,0x51009c52,0x2802400,0x962460,0x51009c52,0x2802c00,0x962460,0x51009c52,0x4000010, +0x400000,0x51009c52,0x6800000,0x1329800,0x51009c52,0x6800100,0x962540,0x51009c52,0x7c00100,0x230400,0x51009c52,0xc000010,0x448000,0x51009d6d,0x6800000,0x1329800, +0x51009d6d,0x7c00100,0x230400,0x51009d6d,0x7c00500,0x230400,0x51009d6d,0x7c00d00,0x230400,0x51009d6d,0xc000010,0x448000,0x51009e08,0x2802100,0x962460,0x51009f63, +0x4000010,0x400000,0x51009f63,0x6800000,0x1329800,0x51009f63,0x7c00100,0x230400,0x51009f63,0x7c00900,0x230400,0x51009f63,0xc000010,0x448000,0x51009f63,0xc000010, +0xb48000,0x5100a008,0x2000,0x962460,0x5100a008,0x2802400,0x962460,0x5100a008,0x4000000,0x200000,0x5100a008,0x7c00100,0x220400,0x5100a008,0x7c00100,0x230400, +0x5100a008,0x7c00100,0x250400,0x5100a008,0x7c00500,0x230400,0x5100a16f,0x2806400,0x962460,0x5100a16f,0x6800000,0x1329800,0x5100a16f,0x6800100,0x962540,0x5100a16f, +0x7c00100,0x230400,0x5100a16f,0xc000010,0x448000,0x5100a24f,0x2802100,0x962460,0x5100a24f,0x2802400,0x962460,0x5100a24f,0x6800000,0x1329800,0x5100a24f,0x7c00100, +0x230400,0x5100a24f,0xc000010,0x448000,0x5100a36e,0x2802100,0x962460,0x5100a36e,0x4000000,0x200000,0x5100a36e,0x6800100,0x962540,0x5100a36e,0x6804400,0x962540, +0x5100a36e,0x7c00100,0x230400,0x5100a442,0x2802100,0x962460,0x5100a442,0x4000000,0x200000,0x5100a442,0x6800000,0x1329800,0x5100a442,0x6800100,0x962540,0x5100a442, +0x7c00100,0x230400,0x5100a442,0xc000010,0x448000,0x5100a500,0x4000000,0x200000,0x5100a600,0x4000000,0x200000,0x5100a601,0x2802000,0x962460,0x5100a76b,0x7c00100, +0x230400,0x5100a868,0x7c00100,0x230400,0x5100a96c,0x4000000,0x200000,0x5100a96c,0x7c00100,0x230400,0x5100aa00,0x4000000,0xe00000,0x5100ab00,0x4000000,0xe00000, +0x51086600,0x24000020,0x810000,0x51086600,0x24000020,0x1410000,0x510a4005,0x7c00100,0xe30400,0x510a4711,0x7c40300,0xe30000,0x510a7300,0x24000000,0x30200000,0x510aaa00, +0x4000000,0x30e00000,0x5140a2b6,0x4000400,0x400000,0x514a8295,0x4000000,0xe00000,0x51802b87,0x2802000,0x962460,0x51c00908,0x2802400,0x962460,0x51c0a008,0x2802400, +0x962460,0x52000f0a,0x2802100,0x962460,0x52000f0a,0x6800100,0x962540,0x52000f0a,0x7c00100,0x230400,0x52001004,0x4000000,0x1600000,0x52001b00,0x4000000,0x200000, +0x52001c1c,0x2802100,0x1862460,0x52001c1c,0x6800100,0x1862400,0x52001c1c,0x6800400,0x1862400,0x52001e12,0x7c00100,0x2230500,0x52001e12,0x7c00100,0x2330520,0x52002128, +0x4000002,0x400000,0x52002128,0x7c00100,0x230400,0x52002a00,0x4000000,0x1500000,0x52002a00,0x4000000,0x1600000,0x52002d00,0x4000000,0x200006,0x52003000,0x24000000, +0x200000,0x52006108,0x7c00100,0x220400,0x52006108,0x7c00100,0x250400,0x52008301,0x2802400,0x962460,0x52008407,0x2802400,0x962460,0x52008407,0x7c00100,0x220400, +0x52008407,0x7c00100,0x250400,0x52008b3b,0x6800000,0x1800000,0x52008b3b,0x7c00100,0x1830000,0x52008e00,0x24000000,0x400000,0x52009419,0x7c00100,0x250400,0x5200975b, +0x4000000,0x200000,0x5200ac7e,0x2802000,0x962460,0x5200ac7e,0x2802100,0x962460,0x5200ac7e,0x2802400,0x962460,0x5200ac7e,0x4000010,0x200000,0x5200ac7e,0x7c00100, +0x230400,0x5200ad28,0x7c00100,0x230400,0x5200ae6a,0x2802100,0x1862460,0x5200ae6a,0x2802400,0x962460,0x5200ae6a,0x2802400,0x1862460,0x5200ae6a,0x2806000,0x1862460, +0x5200ae6a,0x4000000,0x1800000,0x5200ae6a,0x6800000,0x1329800,0x5200ae6a,0x6800100,0x1862400,0x5200ae6a,0x6800100,0x1862540,0x5200ae6a,0x7c00100,0x1830000,0x5200ae6a, +0x7c00900,0x1830000,0x5200ae6a,0xc000010,0x1848000,0x5200b083,0x4000010,0x400000,0x5200b083,0x7c00100,0x230400,0x5200b083,0xc000010,0x448000,0x5200b182,0x2802400, +0x962460,0x5200b182,0x4000000,0x200000,0x5200b182,0x4000010,0x400000,0x5200b182,0x7c00100,0x230400,0x5200b182,0xc000010,0x448000,0x5200b30a,0x2802400,0x962460, +0x5200b30a,0x4000000,0x200000,0x5200b30a,0x7c00100,0x230400,0x5200b54e,0x2802100,0x962460,0x5200b54e,0x2802400,0x962460,0x5200b54e,0x4000000,0x200000,0x5200b54e, +0x4000010,0x400000,0x5200b54e,0x6800000,0x1329800,0x5200b54e,0x6800100,0x962540,0x5200b54e,0x6804400,0x962540,0x5200b54e,0x7c00100,0x230400,0x5200b54e,0xc000010, +0x448000,0x5200b61c,0x4000000,0x1800000,0x5200b61c,0x6800400,0x1862400,0x5200b61c,0x7c00100,0x1830000,0x5200b61c,0x7c00900,0x1830000,0x5200b77f,0x2802100,0x1862460, +0x5200b77f,0x2802400,0x1862460,0x5200b77f,0x4000000,0x1800000,0x5200b77f,0x4000010,0x1800000,0x5200b77f,0x7c00100,0x1830000,0x5200b77f,0x7c00500,0x1830000,0x5200b77f, +0x7c00900,0x1830000,0x5200b77f,0x7e00100,0x1830000,0x5200b873,0x2802100,0x962460,0x5200b873,0x2806400,0x962460,0x5200b873,0x6800000,0x1329800,0x5200b873,0x6800100, +0x962540,0x5200b873,0x6800400,0x962540,0x5200b873,0x7c00100,0x230400,0x5200b873,0xc000010,0x448000,0x5200b912,0x7c00100,0x2230500,0x5200b912,0x7c00100,0x2330520, +0x5200ba74,0x4000000,0x200000,0x5200ba74,0x4000010,0x400000,0x5200ba74,0x7c00100,0x230400,0x5200bb85,0x4000000,0x200000,0x5200bb85,0x7c00100,0x230400,0x5200bc75, +0x4000000,0x400000,0x5200bc75,0x4000010,0x400000,0x5200bc75,0x7c00100,0x230400,0x5200bd7d,0x4000000,0x200000,0x5200bd7d,0x7c00100,0x230400,0x5200be7a,0x4000000, +0x200000,0x5200be7a,0x7c00100,0x230400,0x5200bf58,0x7c00100,0x230400,0x5200c002,0x4000000,0x200000,0x5200c178,0x2802000,0x962460,0x5200c178,0x2802100,0x962460, +0x5200c178,0x2802400,0x962460,0x5200c178,0x2806400,0x962460,0x5200c178,0x4000000,0x200000,0x5200c178,0x6800100,0x962540,0x5200c178,0x7c00100,0x230400,0x5200c178, +0x7c00100,0x230401,0x5200c178,0xc000010,0x448000,0x5200c178,0x80000000,0x218960,0x5200c247,0x7c00100,0x230400,0x5200c247,0x7c00100,0x830400,0x5200c247,0x7c00100, +0x1430400,0x5200c300,0x4000000,0x200003,0x52022d00,0x4000000,0x100006,0x52023700,0x24000000,0x100000,0x52023700,0x24000000,0xe00000,0x52023700,0x24000000,0x10100000, +0x52023700,0x24000000,0x10e00000,0x52023700,0x24000000,0x928045a0,0x52024400,0x4000000,0x100000,0x52027300,0x24000000,0x100000,0x5202c300,0x4000000,0x100000,0x5202c300, +0x4000000,0x100002,0x5202c300,0x4000000,0x100003,0x5202c300,0x4000000,0x10000d,0x5202c300,0x4000100,0x150400,0x5202c300,0x4000100,0x15040d,0x5202c300,0x4000100, +0x10150400,0x520a1e12,0x7c00100,0x2130480,0x520a3700,0x24000000,0x30e00000,0x520a3800,0x24000000,0x30100000,0x520a4711,0x7c40300,0xe30000,0x520a4f11,0x7c00300,0xe30001, +0x520a7300,0x24000000,0x30100000,0x520ab412,0x7c00100,0x2130480,0x520ac400,0x4000000,0xe00002,0x520ac400,0x4000000,0xe0000d,0x520ac400,0x4000000,0x30e0000d,0x520ac414, +0x4000000,0xe0000d,0x520ac511,0x7c40300,0xe30000,0x5240af7a,0x6800400,0x962540,0x5240af7a,0x7c00100,0x230400,0x5240af7b,0x4000400,0x200000,0x5240af7b,0x6800100, +0x962540,0x5240b29b,0x4000000,0x200000,0x5240b2a5,0x4000000,0x200000,0x5240b2a5,0x4000000,0x1500000,0x5240b5b9,0x7c00900,0x230400,0x524a4495,0x4000000,0xe00003, +0x5280af7a,0x2802400,0x962460,0x5280af7b,0x2802400,0x962460,0x5280af7d,0x2802400,0x962460,0x5280af7f,0x2802400,0x962460,0x52c0b3b0,0x2802400,0x962460,0x52c0b3b4, +0x7c00100,0x230400,0x60000c02,0x2802100,0x962460,0x60000c02,0x7c00100,0x230400,0x60000f0a,0x2802100,0x962460,0x60000f0a,0x6800100,0x962540,0x60000f0a,0x7c00100, +0x230400,0x6000131f,0x4000000,0x200000,0x6000171a,0x7c00100,0x230400,0x6000171a,0x7c00100,0x230560,0x60001b27,0x2802100,0x962460,0x60001b27,0x4000000,0xc00000, +0x60001b27,0x7c00100,0x230400,0x60001f0b,0x2802000,0x962460,0x60002919,0x7c00100,0x22040e,0x60002a00,0x4000000,0x1600000,0x60003000,0x24000000,0x10200000,0x60003000, +0x24000000,0x10e00000,0x60003700,0x24000000,0x200000,0x60003800,0x24000000,0x1710000,0x60005102,0x4000000,0x200000,0x60006108,0x7c00100,0x220400,0x60006108,0x7c00100, +0x250400,0x60006600,0x24000020,0x200000,0x60008301,0x2802000,0x962460,0x6000903c,0x2806000,0x962460,0x6000903c,0x4000000,0x400000,0x60009519,0x7c00100,0x220400, +0x60009519,0x7c00100,0x250400,0x6000a008,0x7c00100,0x220400,0x6000a008,0x7c00100,0x250400,0x6000c300,0x4000000,0x3a703580,0x6000c654,0x2802000,0x962460,0x6000c654, +0x4000010,0x200000,0x6000c654,0x7c00100,0x230400,0x6000c73f,0x2802000,0x962460,0x6000c73f,0x2802100,0x962460,0x6000c73f,0x4000000,0x200000,0x6000c73f,0x6800100, +0x962540,0x6000c73f,0x6804000,0x962540,0x6000c73f,0x7c00100,0x230400,0x6000c80b,0x7c00100,0x230400,0x6000c941,0x2802100,0x962460,0x6000c941,0x2806000,0x962460, +0x6000c941,0x4000000,0x200000,0x6000c941,0x4000010,0x200000,0x6000c941,0x6800000,0x1329800,0x6000c941,0x6800100,0x962540,0x6000c941,0x7c00100,0x230400,0x6000c941, +0xc000010,0x448000,0x6000ca82,0x7c00100,0x230400,0x6000cc00,0x4000000,0xe00000,0x6000d000,0x4000000,0x200000,0x6002c300,0x4000000,0x100000,0x6002c300,0x4000000, +0x10000d,0x6002c300,0x4000100,0x150400,0x6002c300,0x4000100,0x15040d,0x6002c300,0x4000100,0x10150400,0x600a3000,0x24000000,0x30200000,0x600a3000,0x24000000,0x30e00000, +0x600a3700,0x24000000,0x30200000,0x600a3800,0x24000000,0x30200000,0x600a3800,0x24000000,0xb28045a0,0x600a4305,0x7c00100,0xe30400,0x600ac300,0x4000000,0x30100000,0x600ac400, +0x4000000,0x10e0000d,0x600ac400,0x4000000,0x30e0000d,0x600acb14,0x7c00100,0xe30000,0x600acb16,0x7c00100,0xe30c00,0x600acc00,0x4000000,0x30e00000,0x600acd00,0x4000000, +0x30200000,0x600acd00,0x4000000,0x30e00000,0x600acd00,0x4000000,0x30e05200,0x600acd00,0x4000000,0xb28045a0,0x600acd00,0x4000000,0xb28049c0,0x600ace00,0x4000000,0x30e00000, +0x600ace00,0x4000000,0xb28045a0,0x600acf00,0x4000000,0x30e00000,0x600acf00,0x4000000,0x30e05200,0x600acf00,0x4000000,0xb28045a0,0x600ad111,0x7c40300,0xe30000,0x604ac495, +0x4000000,0x30e00003,0x61000a03,0x4000000,0x1600000,0x61000c02,0x80000000,0x218960,0x6100120f,0x4000000,0x200000,0x61001a18,0x7c00100,0x1830000,0x61001d0c,0x7c00100, +0x230400,0x61001d0c,0x7c00100,0x250400,0x61006600,0x24000020,0x200000,0x61008407,0x7c00100,0x220400,0x61008407,0x7c00100,0x250400,0x6100870c,0x7c00100,0x220400, +0x61008e00,0x24000000,0x200000,0x61008e00,0x24000000,0x400000,0x61008e00,0x24000002,0x300000,0x6100903c,0x7c00100,0x230400,0x61009519,0x7c00100,0x220400,0x61009519, +0x7c00100,0x250400,0x61009519,0x7c00500,0x22040f,0x61009b71,0x2802100,0x962460,0x61009b71,0x2806400,0x962460,0x61009b71,0x7c00100,0x230400,0x6100a008,0x2802100, +0x962460,0x6100c300,0x4000000,0x20000f,0x6100cd00,0x4000000,0x200000,0x6100d202,0x2802400,0x962460,0x6100d202,0x2802500,0x962460,0x6100d202,0x7c00100,0x230400, +0x6100d302,0x4000020,0x200000,0x6100d302,0x7c00120,0x230405,0x6100d476,0x2802100,0x962460,0x6100d476,0x2802100,0x962461,0x6100d476,0x2806400,0x962460,0x6100d476, +0x4000000,0x400000,0x6100d476,0x6800000,0x1329800,0x6100d476,0x6800100,0x962540,0x6100d476,0x7c00100,0x230400,0x6100d476,0xc000010,0x448000,0x6100d573,0x2802100, +0x962460,0x6100d573,0x2806400,0x962460,0x6100d573,0x6800100,0x962540,0x6100d573,0x7c00100,0x230400,0x6100d573,0x7c00900,0x230400,0x6100d573,0xc000010,0x448000, +0x6100d68d,0x7c00100,0x230400,0x6100d756,0x7c00100,0x230400,0x6100d85c,0x2802400,0x962460,0x6100d85c,0x6800100,0x962540,0x6100d85c,0x7c00100,0x230400,0x6100d85c, +0x7c00500,0x230400,0x6100d997,0x2802100,0x962460,0x6100d997,0x4000000,0x200000,0x6100d997,0x4000000,0x400000,0x6100d997,0x6800000,0x1329800,0x6100d997,0x6800100, +0x962540,0x6100d997,0x6804400,0x962540,0x6100d997,0x7c00100,0x230400,0x6100d997,0x7c00100,0x230560,0x6100d997,0xc000010,0x448000,0x6100da98,0x6800000,0x1329800, +0x6100da98,0x7c00100,0x230400,0x6100db71,0x4000000,0x200000,0x6100dc99,0x2802100,0x962460,0x6100dc99,0x2802400,0x962460,0x6100dc99,0x6800000,0x1329800,0x6100dc99, +0x6800100,0x962540,0x6100dc99,0x6804400,0x962540,0x6100dc99,0x7c00100,0x230400,0x610a4711,0x7c40300,0xe30000,0x610a4f11,0x7c00300,0xe30001,0x610ace00,0x4000000, +0x30e00000,0x6140af7a,0x7c00100,0x230400,0x6140af7b,0x6800100,0x962540,0x6140af84,0x7c00100,0x230400,0x6180af7b,0x2802400,0x962460,0x62002a00,0x4000000,0x1600000, +0x63002800,0x80000,0x918820,0x63c00c11,0x80000,0x918820,0x7000080e,0x7c00100,0x250400,0x70000a03,0x4000000,0x200000,0x70000c00,0x80000000,0x218960,0x70000f0a, +0x7c00100,0x230400,0x70001004,0x7c00100,0x230400,0x70001524,0x2802100,0x962460,0x70001524,0x7c00100,0x230400,0x70001615,0x2802100,0x962460,0x7000171a,0x2802100, +0x962460,0x70001821,0x6800000,0x1329800,0x70002320,0x7c00100,0x230400,0x70002a00,0x4000000,0x1500000,0x70002a00,0x4000000,0x1600000,0x70003000,0x24000000,0x200000, +0x70003000,0x24000000,0x10200000,0x70003800,0x24000000,0xe00000,0x70005201,0x2802400,0x962460,0x7000581e,0x7c00100,0x230400,0x70006108,0x7c00100,0x220400,0x70006108, +0x7c00100,0x250400,0x70006f30,0x7c00100,0x230400,0x70007300,0x24000000,0x200000,0x70007f0e,0x4000000,0x200000,0x70008301,0x2802100,0x962460,0x70008301,0x2802400, +0x962460,0x70008e00,0x24000000,0x200000,0x70008e00,0x24000000,0x400000,0x70008e00,0x24000002,0x400000,0x70008e00,0x24000008,0x1410000,0x70008e00,0x24000010,0x400000, +0x70008e00,0x2c000010,0x448000,0x70009519,0x7c00100,0x220400,0x70009519,0x7c00100,0x230400,0x70009519,0x7c00100,0x250400,0x70009865,0x7c00100,0x230400,0x70009965, +0x4000010,0x400000,0x70009965,0x7c00100,0x230400,0x7000a008,0x7c00100,0x220400,0x7000a008,0x7c00100,0x250400,0x7000a008,0x7c00500,0x22040f,0x7000a50e,0x4000000, +0x200000,0x7000b61c,0x2802400,0x1862460,0x7000b61c,0x6800400,0x1862400,0x7000b61c,0x7c00100,0x1830000,0x7000c300,0x4000000,0x100000,0x7000c941,0x2806000,0x962460, +0x7000cc00,0x4000000,0xe00000,0x7000cd00,0x4000000,0x200000,0x7000cd00,0x4000000,0xe00000,0x7000cd00,0x4000000,0x10200000,0x7000cd00,0x4000000,0x10e00000,0x7000cd00, +0x4000000,0x10e05200,0x7000cd00,0x4000000,0x928045a0,0x7000cf00,0x4000000,0xe00000,0x7000cf00,0x4000000,0x10e00000,0x7000d202,0x2802100,0x962460,0x7000d202,0x7c00100, +0x230400,0x7000d997,0x7c00100,0x230400,0x7000d997,0xc000010,0x248000,0x7000dd86,0x2802400,0x962460,0x7000dd86,0x7c00100,0x230400,0x7000dd86,0xc000010,0x448000, +0x7000de9f,0x4000000,0x200000,0x7000de9f,0x7c00100,0x230400,0x7000e001,0x2000,0x962460,0x7000e001,0x2802400,0x962460,0x7000e187,0x2802000,0x962460,0x7000e187, +0x2802100,0x962460,0x7000e187,0x4000000,0x200000,0x7000e187,0x7c00100,0x230400,0x7000e187,0xc000010,0x448000,0x7000e288,0x7c00100,0x230400,0x7000e300,0x4000000, +0x200000,0x7000e489,0x2802100,0x962460,0x7000e489,0x2802400,0x962460,0x7000e489,0x6800100,0x962540,0x7000e489,0x6800100,0x962541,0x7000e489,0x6804400,0x962540, +0x7000e489,0x7c00100,0x230400,0x7000e489,0x7c00900,0x230400,0x7000e59d,0x2802100,0x962460,0x7000e59d,0x2802400,0x962460,0x7000e59d,0x4000000,0x200000,0x7000e59d, +0x4000010,0x200000,0x7000e59d,0x6800100,0x962540,0x7000e59d,0x6804400,0x962540,0x7000e59d,0x7c00100,0x230400,0x7000e59d,0xc000010,0x448000,0x7000e691,0x2802100, +0x962460,0x7000e691,0x2802400,0x962460,0x7000e691,0x2806400,0x962460,0x7000e691,0x6800000,0x1329800,0x7000e691,0x6800100,0x962540,0x7000e691,0x7c00100,0x230400, +0x7000e700,0x4000400,0x200400,0x7000e70e,0x7c00100,0x220400,0x7000e719,0x7c00100,0x220400,0x7000e719,0x7c00500,0x22040f,0x7000e853,0x7c00100,0x230400,0x7000e9a0, +0x2802400,0x962460,0x7000e9a0,0x4000000,0x200000,0x7000e9a0,0x4000000,0x500000,0x7000e9a0,0x7c00100,0x230400,0x7000ea79,0x2802400,0x962460,0x7000ea79,0x4000000, +0x200000,0x7000ea79,0x4000000,0xf00000,0x7000ea79,0x4000010,0x400000,0x7000ea79,0x7c00100,0x230400,0x7000eb8c,0x2802400,0x962460,0x7000eb8c,0x4000000,0x200000, +0x7000eb8c,0x7c00100,0x230400,0x7000eca3,0x2802100,0x962460,0x7000eca3,0x2806400,0x962460,0x7000eca3,0x4000000,0x200000,0x7000eca3,0x6800000,0x1329800,0x7000eca3, +0x6800100,0x962540,0x7000eca3,0x7c00100,0x230400,0x7000eca3,0xc000010,0x448000,0x7000ed95,0x6800000,0x1329800,0x7000ed95,0x7c00100,0x230400,0x7000ed95,0xc000010, +0x448000,0x7000ee1c,0x2802400,0x1862460,0x7000ee1c,0x6800000,0x1329800,0x7000ee1c,0x7c00100,0x1830000,0x7000ee1c,0x7c00900,0x1830000,0x7000ef8f,0x4000000,0x200000, +0x7000ef8f,0x7c00100,0x230400,0x7000f08e,0x4000000,0x200000,0x7000f08e,0x7c00100,0x230400,0x7000f159,0x2802100,0x962460,0x7000f159,0x7c00100,0x230400,0x7000f200, +0x4000000,0x200000,0x7000f200,0x4000000,0x1200000,0x7000f200,0x4000000,0x1710000,0x7000f34b,0x2802100,0x962460,0x7000f34b,0x4000000,0x200000,0x7000f34b,0x4000010, +0x400000,0x7000f34b,0x6800000,0x1329800,0x7000f34b,0x7c00100,0x230400,0x7000f34b,0x7c00900,0x230400,0x7000f34b,0xc000010,0x448000,0x7000f490,0x4000000,0x200000, +0x7000f490,0x7c00100,0x230400,0x7000f5a5,0x7c00100,0x230400,0x7000f67b,0x4000000,0x200000,0x7000f67b,0x4000010,0x200000,0x7000f67b,0x7c00100,0x230400,0x7000f8a6, +0x2802100,0x962460,0x7000f8a6,0x2802400,0x962460,0x7000f8a6,0x2806400,0x962460,0x7000f8a6,0x4000000,0x500000,0x7000f8a6,0x4000010,0xb00000,0x7000f8a6,0x4000800, +0x200000,0x7000f8a6,0x6800100,0x962540,0x7000f8a6,0x6800100,0x962541,0x7000f8a6,0x7c00100,0x230400,0x7000f8a6,0xc000010,0x448000,0x7000f921,0x4000000,0x200000, +0x7000fa00,0x4000000,0x200000,0x7000fb9e,0x2802100,0x962460,0x7000fb9e,0x2802400,0x962460,0x7000fb9e,0x2806400,0x962460,0x7000fb9e,0x4000000,0x200000,0x7000fb9e, +0x6800000,0x1329800,0x7000fb9e,0x6800100,0x962540,0x7000fb9e,0x6800100,0x962541,0x7000fb9e,0x7c00100,0x230400,0x7000fc92,0x4000000,0x200000,0x7000fc92,0x6800000, +0x1329800,0x7000fc92,0x7c00100,0x220400,0x7000fc92,0x7c00100,0x230400,0x7000fc92,0x7c00100,0x250400,0x700acd00,0x4000000,0x30e00000,0x700acd00,0x4000000,0xb28045a0, +0x700ace00,0x4000000,0x30e00000,0x700acf00,0x4000000,0x30e00000,0x700acf00,0x4000000,0xb28045a0,0x7040dfc0,0x4000000,0x200000,0x7040f7c4,0x80000,0x918820,0x7080af7b, +0x2802400,0x962460,0x7080dfc0,0x2802400,0x962460,0x70c0e4c2,0x2802100,0x962460,0x70c0e4c2,0x2802400,0x962460,0x70c0e4c2,0x6800100,0x962540,0x8000120f,0x7c00100, +0x230400,0x80001524,0x7c00100,0x230400,0x8000171a,0x7c00100,0x230400,0x80002006,0x7c00100,0x220400,0x80002006,0x7c00100,0x250400,0x80002a00,0x4000000,0x1500000, +0x80002d00,0x4000000,0x200000,0x80005208,0x2802400,0x962460,0x80005c00,0x4000000,0x200000,0x80007300,0x24000000,0x200000,0x80009519,0x7c00100,0x220400,0x80009519, +0x7c00100,0x230400,0x80009519,0x7c00100,0x250400,0x80009865,0x7c00100,0x230400,0x8000a008,0x2802100,0x962460,0x8000b30a,0x4000000,0x500000,0x8000b30a,0x7c00100, +0x230400,0x8000cd00,0x4000000,0xe00000,0x8000d202,0x2802500,0x962460,0x8000d202,0x7c00100,0x230400,0x8000d68d,0x4000000,0x200000,0x8000d997,0x2802400,0x962460, +0x8000d997,0x4000000,0x200000,0x8000d997,0x4000000,0x400000,0x8000d997,0x4000000,0x500000,0x8000d997,0x7c00100,0x230400,0x8000d997,0xc000010,0x448000,0x8000e489, +0x2802100,0x962460,0x8000e489,0x7c00100,0x230400,0x8000e719,0x7c00100,0x220400,0x8000f8a6,0x2802100,0x962460,0x8000f8a6,0x7c00100,0x230400,0x8000f8a6,0xc000010, +0x448000,0x8000fda1,0x2802100,0x1862460,0x8000fda1,0x2806400,0x1862460,0x8000fda1,0x4000000,0x1800000,0x8000fda1,0x6800000,0x1329800,0x8000fda1,0x6800100,0x1862540, +0x8000fda1,0x7c00100,0x1830000,0x8000fda1,0xc000010,0x448000,0x8000fe9c,0x7c00100,0x230400,0x8000fe9c,0x7c00100,0x830400,0x8000fe9c,0x7c00100,0x1430400,0x8000ff06, +0x7c00100,0x220400,0x80010165,0x7c00100,0x230400,0x800102a2,0x4000000,0x200000,0x800102a2,0x7c00100,0x230400,0x800103a4,0x7c00100,0x230400,0x800103a4,0xc000010, +0x448000,0x8001044c,0x4000000,0x200000,0x8001044c,0x7c00100,0x220400,0x8001044c,0x7c00100,0x250400,0x80010670,0x2802000,0x962460,0x80010670,0x4000000,0x200000, +0x80010670,0x4000010,0x400000,0x80010670,0xc000010,0x448000,0x800a4711,0x7c40300,0xe30000,0x800acd00,0x4000000,0x30e00000,0x800acd00,0x4000000,0x7a904de0,0x800ace00, +0x4000000,0x30e00000,0x800acf00,0x4000000,0x30e00000,0x800b0011,0x7c40300,0xe30000,0x800b0500,0x4000000,0x30e00000,0x800b0500,0x4000000,0xb28045a0,0x90001615,0x7c00100, +0x230400,0x9000171a,0x4000000,0x200000,0x9000171a,0x7c00100,0x230400,0x90003000,0x24000000,0x200000,0x90007f0e,0x4000000,0x200000,0x90008301,0x2802000,0x962460, +0x90008e00,0x24000000,0x400000,0x90009519,0x7c00100,0x250400,0x9000a16f,0x2802100,0x962460,0x9000d200,0x80000000,0x218960,0x9000d202,0x2802000,0x962460,0x9000d202, +0x2802100,0x962460,0x9000d202,0x7c00100,0x230400,0x9000e59d,0x2802100,0x962460,0x900107a7,0x2802100,0x962460,0x900107a7,0x2802400,0x962460,0x900107a7,0x2802c00, +0x962460,0x900107a7,0x4000000,0x1400000,0x900107a7,0x6800000,0x1329800,0x900107a7,0x7c00100,0x220400,0x900107a7,0x7c00100,0x250400,0x900108a8,0x2802100,0x962460, +0x900108a8,0x2806400,0x962460,0x900108a8,0x4000000,0x200000,0x900108a8,0x4000000,0x400000,0x900108a8,0x4000010,0x400000,0x900108a8,0x6800000,0x1329800,0x900108a8, +0x6800100,0x962540,0x900108a8,0x7c00100,0x230400,0x900108a8,0xc000010,0x448000,0x90010908,0x7c00100,0x220400,0x90010a38,0x2802100,0x962460,0x90010ca9,0x2802100, +0x962460,0x90010ca9,0x4000000,0x500000,0x90010ca9,0x4000010,0xb00000,0x90010ca9,0x6800100,0x962540,0x90010ca9,0x7c00100,0x230400,0x90010d1b,0x4000000,0x500000, +0x90010eaa,0x2802100,0x962460,0x90010eaa,0x2802400,0x962460,0x90010eaa,0x2806400,0x962460,0x90010eaa,0x4000000,0x200000,0x90010eaa,0x4000000,0x400000,0x90010eaa, +0x4000010,0x400000,0x90010eaa,0x6800000,0x1329800,0x90010eaa,0x6800100,0x962540,0x90010eaa,0x7c00100,0x230400,0x90010eaa,0xc000010,0x448000,0x90010fab,0x7c00100, +0x220400,0x90010fab,0x7c00100,0x250400,0x9002c300,0x4000000,0x100000,0x900ac400,0x4000000,0xe0000d,0x900acd00,0x4000000,0x30e00000,0x900acd00,0x4000000,0xb28045a0, +0x900acf00,0x4000000,0x30e00000,0x900b0500,0x4000000,0xe00000,0x900b0500,0x4000000,0x30e00000,0x900b0500,0x4000000,0xb28045a0,0x900b0b9a,0x7c00900,0x1230400,0x900b109a, +0x7c00300,0xe30000,0x900b119a,0x7c00300,0xe30000,0x90408e06,0x24000000,0x400000,0xa0001004,0x4000000,0x200000,0xa0001004,0x7c00100,0x230400,0xa000120f,0x2802100, +0x962460,0xa000120f,0x2802400,0x962460,0xa000171a,0x2802100,0x962460,0xa000171a,0x2806400,0x962460,0xa0002a00,0x4000000,0x1600000,0xa0003000,0x24000000,0x200000, +0xa000581e,0x7c00100,0x230400,0xa0007300,0x24000000,0x200000,0xa0008301,0x2802400,0x962460,0xa0008e00,0x24000000,0x400000,0xa000cf00,0x4000000,0xe00000,0xa0010500, +0x4000000,0x200000,0xa00114af,0x2802100,0x962460,0xa00114af,0x2802400,0x962460,0xa00114af,0x2806400,0x962460,0xa00114af,0x6800000,0x1329800,0xa00114af,0x7c00100, +0x230400,0xa00114af,0x7c00100,0x230560,0xa00116b0,0x2802100,0x962460,0xa00116b0,0x2802800,0x962460,0xa00116b0,0x2806400,0x962460,0xa00116b0,0x4000000,0x400000, +0xa00116b0,0x4000000,0x500000,0xa00116b0,0x4000010,0x400000,0xa00116b0,0x6800100,0x962540,0xa00116b0,0x7c00100,0x230400,0xa00116b0,0x7c00100,0x230560,0xa00116b0, +0xc000010,0x448000,0xa0011722,0x7c00100,0x230400,0xa00118b1,0x2802000,0x962460,0xa00118b1,0x2802100,0x962460,0xa00118b1,0x2806400,0x962460,0xa00118b1,0x4000000, +0x200000,0xa00118b1,0x4000000,0x400000,0xa00118b1,0x4000000,0x500000,0xa00118b1,0x6800100,0x962540,0xa00118b1,0x7c00100,0x230400,0xa00118b1,0x7c00100,0x230560, +0xa00118b1,0xc000010,0x448000,0xa00a4005,0x7c00100,0xe30400,0xa00a4711,0x7c40300,0xe30000,0xa00ac400,0x4000000,0xe00000,0xa00acb14,0x7c00100,0xe30000,0xa00acf00, +0x4000000,0x30e00000,0xa00b0500,0x4000000,0x30e00000,0xa00b0500,0x4000000,0xb28045a0,0xa00b0b96,0x7c00900,0x1230400,0xa00b1211,0x7c40300,0xe30000,0xa00b1314,0x7c00100, +0xe30000,0xa00b1596,0x7c00300,0xe30000,0xa040af86,0x6800400,0x962540}; -static const int32_t countPropsVectors=6195; +static const int32_t countPropsVectors=6375; static const int32_t propsVectorsColumns=3; -static const uint16_t scriptExtensions[194]={ +static const uint16_t scriptExtensions[198]={ 0x800e,0x8019,8,0x8059,8,2,8,0x8038,8,6,8,0x8019,3,0x800c,2,0x22, -0x8025,2,0x22,0x54,0x79,0x7b,0x80a7,2,0x8022,2,0x8025,2,0x19,4,0xa,0xf, -0x10,0x15,0x19,0x1a,0x1f,0x23,0x24,0x89,0x8097,4,0xa,0xf,0x10,0x15,0x19,0x1a, -0x1f,0x23,0x24,0x8089,4,0xa,0xf,0x10,0x15,0x1a,0x1f,0x21,0x23,0x24,0x3a,0x89, -0x91,0x99,0x9e,0x80a0,4,0xa,0xf,0x10,0x15,0x1a,0x1f,0x21,0x23,0x24,0x30,0x3a, -0x89,0x91,0x99,0x9e,0x80a0,0xa,0x78,0x80a0,0xa,0x55,4,0x3a,0x8076,4,0x5a,0x10, -0x80a4,0x10,0x5f,0xf,0x809d,0xf,0x63,0x23,0x8089,0x23,0x67,0x1c,0x34,0x8076,0x1c,0x6b, -0xc,0x8019,0x2a,0x2b,0x2c,0x802d,0x1b,0x805a,0x800a,0xa,0x8089,0xa,0x8097,0xa,0x15,0x1a, -0x23,0x8024,0xa,0x8015,0xa,0x19,0x8089,5,0x11,0x12,0x14,0x16,0x8029,5,0x11,0x12, -0x14,0x8016,0x8011,5,0x8011,0x11,0x14,0x8016,0xa,0xf,0x10,0x15,0x78,0x91,0x99,0x9e, -0xa0,0x80a3,0xa,0xf,0x10,0x78,0x91,0x99,0x9e,0xa0,0x80a3,4,0x800a,0xa,0xab,0xa, -0x8023,0xa,0xaf,0x19,0x1c,0x804f,0x37,0x804e,0x2f,0x31,0x8053,0x2f,0x8031,2,0x8007,0x89, -0x67,0x8087}; +0x8025,2,0xe,2,0x22,0x54,0x79,0x7b,0x80a7,2,0x8022,2,0x8025,2,0x1b,4, +0xa,0xf,0x10,0x15,0x19,0x1a,0x1f,0x23,0x24,0x89,0x8097,4,0xa,0xf,0x10,0x15, +0x19,0x1a,0x1f,0x23,0x24,0x8089,4,0xa,0xf,0x10,0x15,0x1a,0x1f,0x21,0x23,0x24, +0x3a,0x89,0x91,0x99,0x9e,0x80a0,4,0xa,0xf,0x10,0x15,0x1a,0x1f,0x21,0x23,0x24, +0x30,0x3a,0x89,0x91,0x99,0x9e,0x80a0,0xa,0x78,0x80a0,0xa,0x57,4,0x3a,0x8076,4, +0x5c,0x10,0x80a4,0x10,0x61,0xf,0x809d,0xf,0x65,0x23,0x8089,0x23,0x69,0x1c,0x34,0x8076, +0x1c,0x6d,0xc,0x8019,0x2a,0x2b,0x2c,0x802d,0x1b,0x805a,0x800a,0xa,0x8089,0xa,0x8097,0xa, +0x15,0x1a,0x23,0x8024,0xa,0x8015,0x8004,0xa,0x19,0x8089,5,0x11,0x12,0x14,0x16,0x8029, +5,0x11,0x12,0x14,0x8016,0x8011,5,0x8011,0x11,0x14,0x8016,0xa,0xf,0x10,0x15,0x78, +0x91,0x99,0x9e,0xa0,0x80a3,0xa,0xf,0x10,0x78,0x91,0x99,0x9e,0xa0,0x80a3,4,0x800a, +0xa,0xae,0xa,0x8023,0xa,0xb2,0x19,0x1c,0x804f,0x37,0x804e,0x2f,0x31,0x8053,0x2f,0x8031, +2,0x8007,0x89,0x69,0x8087,0}; -static const int32_t indexes[UPROPS_INDEX_COUNT]={0x28aa,0x28aa,0x28aa,0x28aa,0x606c,3,0x789f,0x7900,0x7900,0x7900,0xb11ae,0x2a75631,0,0,0,0}; +static const int32_t indexes[UPROPS_INDEX_COUNT]={0x2962,0x2962,0x2962,0x2962,0x6280,3,0x7b67,0x7bca,0x7bca,0x7bca,0xb18b1,0x2a75631,0,0,0,0}; #endif // INCLUDED_FROM_UCHAR_C diff --git a/Build/source/libs/icu/icu-src/source/common/ucharstrie.cpp b/Build/source/libs/icu/icu-src/source/common/ucharstrie.cpp index d04d315c791..e0b33af5194 100644 --- a/Build/source/libs/icu/icu-src/source/common/ucharstrie.cpp +++ b/Build/source/libs/icu/icu-src/source/common/ucharstrie.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* @@ -6,7 +6,7 @@ * Corporation and others. All Rights Reserved. ******************************************************************************* * file name: ucharstrie.h -* encoding: US-ASCII +* encoding: UTF-8 * tab size: 8 (not used) * indentation:4 * @@ -175,7 +175,8 @@ UCharsTrie::next(int32_t uchar) { } UStringTrieResult -UCharsTrie::next(const UChar *s, int32_t sLength) { +UCharsTrie::next(ConstChar16Ptr ptr, int32_t sLength) { + const UChar *s=ptr; if(sLength<0 ? *s==0 : sLength==0) { // Empty input. return current(); diff --git a/Build/source/libs/icu/icu-src/source/common/ucharstriebuilder.cpp b/Build/source/libs/icu/icu-src/source/common/ucharstriebuilder.cpp index 412a58a45d6..049997a2754 100644 --- a/Build/source/libs/icu/icu-src/source/common/ucharstriebuilder.cpp +++ b/Build/source/libs/icu/icu-src/source/common/ucharstriebuilder.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* @@ -6,7 +6,7 @@ * Corporation and others. All Rights Reserved. ******************************************************************************* * file name: ucharstriebuilder.h -* encoding: US-ASCII +* encoding: UTF-8 * tab size: 8 (not used) * indentation:4 * @@ -287,7 +287,7 @@ UCharsTrieBuilder::indexOfElementWithNextUnit(int32_t i, int32_t unitIndex, UCha UCharsTrieBuilder::UCTLinearMatchNode::UCTLinearMatchNode(const UChar *units, int32_t len, Node *nextNode) : LinearMatchNode(len, nextNode), s(units) { - hash=hash*37+ustr_hashUCharsN(units, len); + hash=hash*37u+ustr_hashUCharsN(units, len); } UBool diff --git a/Build/source/libs/icu/icu-src/source/common/ucharstrieiterator.cpp b/Build/source/libs/icu/icu-src/source/common/ucharstrieiterator.cpp index 68ba8c21778..b3132241fe2 100644 --- a/Build/source/libs/icu/icu-src/source/common/ucharstrieiterator.cpp +++ b/Build/source/libs/icu/icu-src/source/common/ucharstrieiterator.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* @@ -6,7 +6,7 @@ * Corporation and others. All Rights Reserved. ******************************************************************************* * file name: ucharstrieiterator.h -* encoding: US-ASCII +* encoding: UTF-8 * tab size: 8 (not used) * indentation:4 * @@ -21,7 +21,7 @@ U_NAMESPACE_BEGIN -UCharsTrie::Iterator::Iterator(const UChar *trieUChars, int32_t maxStringLength, +UCharsTrie::Iterator::Iterator(ConstChar16Ptr trieUChars, int32_t maxStringLength, UErrorCode &errorCode) : uchars_(trieUChars), pos_(uchars_), initialPos_(uchars_), diff --git a/Build/source/libs/icu/icu-src/source/common/uchriter.cpp b/Build/source/libs/icu/icu-src/source/common/uchriter.cpp index fd0a407c6b1..822168f5c8e 100644 --- a/Build/source/libs/icu/icu-src/source/common/uchriter.cpp +++ b/Build/source/libs/icu/icu-src/source/common/uchriter.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ****************************************************************************** @@ -25,14 +25,14 @@ UCharCharacterIterator::UCharCharacterIterator() // never default construct! } -UCharCharacterIterator::UCharCharacterIterator(const UChar* textPtr, +UCharCharacterIterator::UCharCharacterIterator(ConstChar16Ptr textPtr, int32_t length) : CharacterIterator(textPtr != 0 ? (length>=0 ? length : u_strlen(textPtr)) : 0), text(textPtr) { } -UCharCharacterIterator::UCharCharacterIterator(const UChar* textPtr, +UCharCharacterIterator::UCharCharacterIterator(ConstChar16Ptr textPtr, int32_t length, int32_t position) : CharacterIterator(textPtr != 0 ? (length>=0 ? length : u_strlen(textPtr)) : 0, position), @@ -40,7 +40,7 @@ UCharCharacterIterator::UCharCharacterIterator(const UChar* textPtr, { } -UCharCharacterIterator::UCharCharacterIterator(const UChar* textPtr, +UCharCharacterIterator::UCharCharacterIterator(ConstChar16Ptr textPtr, int32_t length, int32_t textBegin, int32_t textEnd, @@ -349,7 +349,7 @@ UCharCharacterIterator::move32(int32_t delta, CharacterIterator::EOrigin origin) return pos; } -void UCharCharacterIterator::setText(const UChar* newText, +void UCharCharacterIterator::setText(ConstChar16Ptr newText, int32_t newTextLength) { text = newText; if(newText == 0 || newTextLength < 0) { diff --git a/Build/source/libs/icu/icu-src/source/common/ucln.h b/Build/source/libs/icu/icu-src/source/common/ucln.h index 3c8c66ad2f3..fe6666efed3 100644 --- a/Build/source/libs/icu/icu-src/source/common/ucln.h +++ b/Build/source/libs/icu/icu-src/source/common/ucln.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ****************************************************************************** @@ -8,7 +8,7 @@ * ****************************************************************************** * file name: ucln.h -* encoding: US-ASCII +* encoding: UTF-8 * tab size: 8 (not used) * indentation:4 * diff --git a/Build/source/libs/icu/icu-src/source/common/ucln_cmn.cpp b/Build/source/libs/icu/icu-src/source/common/ucln_cmn.cpp index e089fb2cc18..8cabf137cf2 100644 --- a/Build/source/libs/icu/icu-src/source/common/ucln_cmn.cpp +++ b/Build/source/libs/icu/icu-src/source/common/ucln_cmn.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ****************************************************************************** @@ -6,7 +6,7 @@ * Corporation and others. All Rights Reserved. ****************************************************************************** * file name: ucln_cmn.cpp -* encoding: US-ASCII +* encoding: UTF-8 * tab size: 8 (not used) * indentation:4 * diff --git a/Build/source/libs/icu/icu-src/source/common/ucln_cmn.h b/Build/source/libs/icu/icu-src/source/common/ucln_cmn.h index 56fa73053f5..5db94945172 100644 --- a/Build/source/libs/icu/icu-src/source/common/ucln_cmn.h +++ b/Build/source/libs/icu/icu-src/source/common/ucln_cmn.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ****************************************************************************** @@ -6,7 +6,7 @@ * Corporation and others. All Rights Reserved. ****************************************************************************** * file name: ucln_cmn.h -* encoding: US-ASCII +* encoding: UTF-8 * tab size: 8 (not used) * indentation:4 * @@ -35,7 +35,7 @@ typedef enum ECleanupCommonType { UCLN_COMMON_START = -1, UCLN_COMMON_USPREP, UCLN_COMMON_BREAKITERATOR, - UCLN_COMMON_BREAKITERATOR_DICT, + UCLN_COMMON_RBBI, UCLN_COMMON_SERVICE, UCLN_COMMON_LOCALE_KEY_TYPE, UCLN_COMMON_LOCALE, diff --git a/Build/source/libs/icu/icu-src/source/common/ucln_imp.h b/Build/source/libs/icu/icu-src/source/common/ucln_imp.h index 352776a8cac..1bfcde0fb8e 100644 --- a/Build/source/libs/icu/icu-src/source/common/ucln_imp.h +++ b/Build/source/libs/icu/icu-src/source/common/ucln_imp.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ****************************************************************************** @@ -8,7 +8,7 @@ * ****************************************************************************** * file name: ucln_imp.h -* encoding: US-ASCII +* encoding: UTF-8 * tab size: 8 (not used) * indentation:4 * @@ -121,7 +121,9 @@ U_CAPI void U_EXPORT2 UCLN_FINI () /* READ READ READ READ! Are you getting compilation errors from windows.h? Any source file which includes this (ucln_imp.h) header MUST be defined with language extensions ON. */ +#ifndef WIN32_LEAN_AND_MEAN # define WIN32_LEAN_AND_MEAN +#endif # define VC_EXTRALEAN # define NOUSER # define NOSERVICE diff --git a/Build/source/libs/icu/icu-src/source/common/ucmndata.c b/Build/source/libs/icu/icu-src/source/common/ucmndata.c deleted file mode 100644 index 6b7d78d104d..00000000000 --- a/Build/source/libs/icu/icu-src/source/common/ucmndata.c +++ /dev/null @@ -1,384 +0,0 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. -// License & terms of use: http://www.unicode.org/copyright.html -/* -****************************************************************************** -* -* Copyright (C) 1999-2011, International Business Machines -* Corporation and others. All Rights Reserved. -* -******************************************************************************/ - - -/*------------------------------------------------------------------------------ - * - * UCommonData An abstract interface for dealing with ICU Common Data Files. - * ICU Common Data Files are a grouping of a number of individual - * data items (resources, converters, tables, anything) into a - * single file or dll. The combined format includes a table of - * contents for locating the individual items by name. - * - * Two formats for the table of contents are supported, which is - * why there is an abstract inteface involved. - * - */ - -#include "unicode/utypes.h" -#include "unicode/udata.h" -#include "cstring.h" -#include "ucmndata.h" -#include "udatamem.h" - -#if defined(UDATA_DEBUG) || defined(UDATA_DEBUG_DUMP) -# include -#endif - -U_CFUNC uint16_t -udata_getHeaderSize(const DataHeader *udh) { - if(udh==NULL) { - return 0; - } else if(udh->info.isBigEndian==U_IS_BIG_ENDIAN) { - /* same endianness */ - return udh->dataHeader.headerSize; - } else { - /* opposite endianness */ - uint16_t x=udh->dataHeader.headerSize; - return (uint16_t)((x<<8)|(x>>8)); - } -} - -U_CFUNC uint16_t -udata_getInfoSize(const UDataInfo *info) { - if(info==NULL) { - return 0; - } else if(info->isBigEndian==U_IS_BIG_ENDIAN) { - /* same endianness */ - return info->size; - } else { - /* opposite endianness */ - uint16_t x=info->size; - return (uint16_t)((x<<8)|(x>>8)); - } -} - -/*-----------------------------------------------------------------------------* - * * - * Pointer TOCs. TODO: This form of table-of-contents should be removed * - * because DLLs must be relocated on loading to correct the * - * pointer values and this operation makes shared memory * - * mapping of the data much less likely to work. * - * * - *-----------------------------------------------------------------------------*/ -typedef struct { - const char *entryName; - const DataHeader *pHeader; -} PointerTOCEntry; - - -typedef struct { - uint32_t count; - uint32_t reserved; - PointerTOCEntry entry[2]; /* Actual size is from count. */ -} PointerTOC; - - -/* definition of OffsetTOC struct types moved to ucmndata.h */ - -/*-----------------------------------------------------------------------------* - * * - * entry point lookup implementations * - * * - *-----------------------------------------------------------------------------*/ - -#ifndef MIN -#define MIN(a,b) (((a)<(b)) ? (a) : (b)) -#endif - -/** - * Compare strings where we know the shared prefix length, - * and advance the prefix length as we find that the strings share even more characters. - */ -static int32_t -strcmpAfterPrefix(const char *s1, const char *s2, int32_t *pPrefixLength) { - int32_t pl=*pPrefixLength; - int32_t cmp=0; - s1+=pl; - s2+=pl; - for(;;) { - int32_t c1=(uint8_t)*s1++; - int32_t c2=(uint8_t)*s2++; - cmp=c1-c2; - if(cmp!=0 || c1==0) { /* different or done */ - break; - } - ++pl; /* increment shared same-prefix length */ - } - *pPrefixLength=pl; - return cmp; -} - -static int32_t -offsetTOCPrefixBinarySearch(const char *s, const char *names, - const UDataOffsetTOCEntry *toc, int32_t count) { - int32_t start=0; - int32_t limit=count; - /* - * Remember the shared prefix between s, start and limit, - * and don't compare that shared prefix again. - * The shared prefix should get longer as we narrow the [start, limit[ range. - */ - int32_t startPrefixLength=0; - int32_t limitPrefixLength=0; - if(count==0) { - return -1; - } - /* - * Prime the prefix lengths so that we don't keep prefixLength at 0 until - * both the start and limit indexes have moved. - * At the same time, we find if s is one of the start and (limit-1) names, - * and if not, exclude them from the actual binary search. - */ - if(0==strcmpAfterPrefix(s, names+toc[0].nameOffset, &startPrefixLength)) { - return 0; - } - ++start; - --limit; - if(0==strcmpAfterPrefix(s, names+toc[limit].nameOffset, &limitPrefixLength)) { - return limit; - } - while(starttoc; - if (toc != NULL) { - retVal = toc->count; - } - return retVal; -} - -static const DataHeader * -offsetTOCLookupFn(const UDataMemory *pData, - const char *tocEntryName, - int32_t *pLength, - UErrorCode *pErrorCode) { - const UDataOffsetTOC *toc = (UDataOffsetTOC *)pData->toc; - if(toc!=NULL) { - const char *base=(const char *)toc; - int32_t number, count=(int32_t)toc->count; - - /* perform a binary search for the data in the common data's table of contents */ -#if defined (UDATA_DEBUG_DUMP) - /* list the contents of the TOC each time .. not recommended */ - for(number=0; numberentry[number].nameOffset]); - } -#endif - number=offsetTOCPrefixBinarySearch(tocEntryName, base, toc->entry, count); - if(number>=0) { - /* found it */ - const UDataOffsetTOCEntry *entry=toc->entry+number; -#ifdef UDATA_DEBUG - fprintf(stderr, "%s: Found.\n", tocEntryName); -#endif - if((number+1) < count) { - *pLength = (int32_t)(entry[1].dataOffset - entry->dataOffset); - } else { - *pLength = -1; - } - return (const DataHeader *)(base+entry->dataOffset); - } else { -#ifdef UDATA_DEBUG - fprintf(stderr, "%s: Not found.\n", tocEntryName); -#endif - return NULL; - } - } else { -#ifdef UDATA_DEBUG - fprintf(stderr, "returning header\n"); -#endif - - return pData->pHeader; - } -} - - -static uint32_t pointerTOCEntryCount(const UDataMemory *pData) { - const PointerTOC *toc = (PointerTOC *)pData->toc; - return (uint32_t)((toc != NULL) ? (toc->count) : 0); -} - - -static const DataHeader *pointerTOCLookupFn(const UDataMemory *pData, - const char *name, - int32_t *pLength, - UErrorCode *pErrorCode) { - if(pData->toc!=NULL) { - const PointerTOC *toc = (PointerTOC *)pData->toc; - int32_t number, count=(int32_t)toc->count; - -#if defined (UDATA_DEBUG_DUMP) - /* list the contents of the TOC each time .. not recommended */ - for(number=0; numberentry[number].entryName); - } -#endif - number=pointerTOCPrefixBinarySearch(name, toc->entry, count); - if(number>=0) { - /* found it */ -#ifdef UDATA_DEBUG - fprintf(stderr, "%s: Found.\n", toc->entry[number].entryName); -#endif - *pLength=-1; - return UDataMemory_normalizeDataPointer(toc->entry[number].pHeader); - } else { -#ifdef UDATA_DEBUG - fprintf(stderr, "%s: Not found.\n", name); -#endif - return NULL; - } - } else { - return pData->pHeader; - } -} - -static const commonDataFuncs CmnDFuncs = {offsetTOCLookupFn, offsetTOCEntryCount}; -static const commonDataFuncs ToCPFuncs = {pointerTOCLookupFn, pointerTOCEntryCount}; - - - -/*----------------------------------------------------------------------* - * * - * checkCommonData Validate the format of a common data file. * - * Fill in the virtual function ptr based on TOC type * - * If the data is invalid, close the UDataMemory * - * and set the appropriate error code. * - * * - *----------------------------------------------------------------------*/ -U_CFUNC void udata_checkCommonData(UDataMemory *udm, UErrorCode *err) { - if (U_FAILURE(*err)) { - return; - } - - if(udm==NULL || udm->pHeader==NULL) { - *err=U_INVALID_FORMAT_ERROR; - } else if(!(udm->pHeader->dataHeader.magic1==0xda && - udm->pHeader->dataHeader.magic2==0x27 && - udm->pHeader->info.isBigEndian==U_IS_BIG_ENDIAN && - udm->pHeader->info.charsetFamily==U_CHARSET_FAMILY) - ) { - /* header not valid */ - *err=U_INVALID_FORMAT_ERROR; - } - else if (udm->pHeader->info.dataFormat[0]==0x43 && - udm->pHeader->info.dataFormat[1]==0x6d && - udm->pHeader->info.dataFormat[2]==0x6e && - udm->pHeader->info.dataFormat[3]==0x44 && - udm->pHeader->info.formatVersion[0]==1 - ) { - /* dataFormat="CmnD" */ - udm->vFuncs = &CmnDFuncs; - udm->toc=(const char *)udm->pHeader+udata_getHeaderSize(udm->pHeader); - } - else if(udm->pHeader->info.dataFormat[0]==0x54 && - udm->pHeader->info.dataFormat[1]==0x6f && - udm->pHeader->info.dataFormat[2]==0x43 && - udm->pHeader->info.dataFormat[3]==0x50 && - udm->pHeader->info.formatVersion[0]==1 - ) { - /* dataFormat="ToCP" */ - udm->vFuncs = &ToCPFuncs; - udm->toc=(const char *)udm->pHeader+udata_getHeaderSize(udm->pHeader); - } - else { - /* dataFormat not recognized */ - *err=U_INVALID_FORMAT_ERROR; - } - - if (U_FAILURE(*err)) { - /* If the data is no good and we memory-mapped it ourselves, - * close the memory mapping so it doesn't leak. Note that this has - * no effect on non-memory mapped data, other than clearing fields in udm. - */ - udata_close(udm); - } -} - -/* - * TODO: Add a udata_swapPackageHeader() function that swaps an ICU .dat package - * header but not its sub-items. - * This function will be needed for automatic runtime swapping. - * Sub-items should not be swapped to limit the swapping to the parts of the - * package that are actually used. - * - * Since lengths of items are implicit in the order and offsets of their - * ToC entries, and since offsets are relative to the start of the ToC, - * a swapped version may need to generate a different data structure - * with pointers to the original data items and with their lengths - * (-1 for the last one if it is not known), and maybe even pointers to the - * swapped versions of the items. - * These pointers to swapped versions would establish a cache; - * instead, each open data item could simply own the storage for its swapped - * data. This fits better with the current design. - * - * markus 2003sep18 Jitterbug 2235 - */ diff --git a/Build/source/libs/icu/icu-src/source/common/ucmndata.cpp b/Build/source/libs/icu/icu-src/source/common/ucmndata.cpp new file mode 100644 index 00000000000..251c7ba1823 --- /dev/null +++ b/Build/source/libs/icu/icu-src/source/common/ucmndata.cpp @@ -0,0 +1,389 @@ +// © 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html +/* +****************************************************************************** +* +* Copyright (C) 1999-2011, International Business Machines +* Corporation and others. All Rights Reserved. +* +******************************************************************************/ + + +/*------------------------------------------------------------------------------ + * + * UCommonData An abstract interface for dealing with ICU Common Data Files. + * ICU Common Data Files are a grouping of a number of individual + * data items (resources, converters, tables, anything) into a + * single file or dll. The combined format includes a table of + * contents for locating the individual items by name. + * + * Two formats for the table of contents are supported, which is + * why there is an abstract inteface involved. + * + */ + +#include "unicode/utypes.h" +#include "unicode/udata.h" +#include "cstring.h" +#include "ucmndata.h" +#include "udatamem.h" + +#if defined(UDATA_DEBUG) || defined(UDATA_DEBUG_DUMP) +# include +#endif + +U_CFUNC uint16_t +udata_getHeaderSize(const DataHeader *udh) { + if(udh==NULL) { + return 0; + } else if(udh->info.isBigEndian==U_IS_BIG_ENDIAN) { + /* same endianness */ + return udh->dataHeader.headerSize; + } else { + /* opposite endianness */ + uint16_t x=udh->dataHeader.headerSize; + return (uint16_t)((x<<8)|(x>>8)); + } +} + +U_CFUNC uint16_t +udata_getInfoSize(const UDataInfo *info) { + if(info==NULL) { + return 0; + } else if(info->isBigEndian==U_IS_BIG_ENDIAN) { + /* same endianness */ + return info->size; + } else { + /* opposite endianness */ + uint16_t x=info->size; + return (uint16_t)((x<<8)|(x>>8)); + } +} + +/*-----------------------------------------------------------------------------* + * * + * Pointer TOCs. TODO: This form of table-of-contents should be removed * + * because DLLs must be relocated on loading to correct the * + * pointer values and this operation makes shared memory * + * mapping of the data much less likely to work. * + * * + *-----------------------------------------------------------------------------*/ +typedef struct { + const char *entryName; + const DataHeader *pHeader; +} PointerTOCEntry; + + +typedef struct { + uint32_t count; + uint32_t reserved; + PointerTOCEntry entry[2]; /* Actual size is from count. */ +} PointerTOC; + + +/* definition of OffsetTOC struct types moved to ucmndata.h */ + +/*-----------------------------------------------------------------------------* + * * + * entry point lookup implementations * + * * + *-----------------------------------------------------------------------------*/ + +#ifndef MIN +#define MIN(a,b) (((a)<(b)) ? (a) : (b)) +#endif + +/** + * Compare strings where we know the shared prefix length, + * and advance the prefix length as we find that the strings share even more characters. + */ +static int32_t +strcmpAfterPrefix(const char *s1, const char *s2, int32_t *pPrefixLength) { + int32_t pl=*pPrefixLength; + int32_t cmp=0; + s1+=pl; + s2+=pl; + for(;;) { + int32_t c1=(uint8_t)*s1++; + int32_t c2=(uint8_t)*s2++; + cmp=c1-c2; + if(cmp!=0 || c1==0) { /* different or done */ + break; + } + ++pl; /* increment shared same-prefix length */ + } + *pPrefixLength=pl; + return cmp; +} + +static int32_t +offsetTOCPrefixBinarySearch(const char *s, const char *names, + const UDataOffsetTOCEntry *toc, int32_t count) { + int32_t start=0; + int32_t limit=count; + /* + * Remember the shared prefix between s, start and limit, + * and don't compare that shared prefix again. + * The shared prefix should get longer as we narrow the [start, limit[ range. + */ + int32_t startPrefixLength=0; + int32_t limitPrefixLength=0; + if(count==0) { + return -1; + } + /* + * Prime the prefix lengths so that we don't keep prefixLength at 0 until + * both the start and limit indexes have moved. + * At the same time, we find if s is one of the start and (limit-1) names, + * and if not, exclude them from the actual binary search. + */ + if(0==strcmpAfterPrefix(s, names+toc[0].nameOffset, &startPrefixLength)) { + return 0; + } + ++start; + --limit; + if(0==strcmpAfterPrefix(s, names+toc[limit].nameOffset, &limitPrefixLength)) { + return limit; + } + while(starttoc; + if (toc != NULL) { + retVal = toc->count; + } + return retVal; +} + +static const DataHeader * U_CALLCONV +offsetTOCLookupFn(const UDataMemory *pData, + const char *tocEntryName, + int32_t *pLength, + UErrorCode *pErrorCode) { + (void)pErrorCode; + const UDataOffsetTOC *toc = (UDataOffsetTOC *)pData->toc; + if(toc!=NULL) { + const char *base=(const char *)toc; + int32_t number, count=(int32_t)toc->count; + + /* perform a binary search for the data in the common data's table of contents */ +#if defined (UDATA_DEBUG_DUMP) + /* list the contents of the TOC each time .. not recommended */ + for(number=0; numberentry[number].nameOffset]); + } +#endif + number=offsetTOCPrefixBinarySearch(tocEntryName, base, toc->entry, count); + if(number>=0) { + /* found it */ + const UDataOffsetTOCEntry *entry=toc->entry+number; +#ifdef UDATA_DEBUG + fprintf(stderr, "%s: Found.\n", tocEntryName); +#endif + if((number+1) < count) { + *pLength = (int32_t)(entry[1].dataOffset - entry->dataOffset); + } else { + *pLength = -1; + } + return (const DataHeader *)(base+entry->dataOffset); + } else { +#ifdef UDATA_DEBUG + fprintf(stderr, "%s: Not found.\n", tocEntryName); +#endif + return NULL; + } + } else { +#ifdef UDATA_DEBUG + fprintf(stderr, "returning header\n"); +#endif + + return pData->pHeader; + } +} + + +static uint32_t U_CALLCONV pointerTOCEntryCount(const UDataMemory *pData) { + const PointerTOC *toc = (PointerTOC *)pData->toc; + return (uint32_t)((toc != NULL) ? (toc->count) : 0); +} + +static const DataHeader * U_CALLCONV pointerTOCLookupFn(const UDataMemory *pData, + const char *name, + int32_t *pLength, + UErrorCode *pErrorCode) { + (void)pErrorCode; + if(pData->toc!=NULL) { + const PointerTOC *toc = (PointerTOC *)pData->toc; + int32_t number, count=(int32_t)toc->count; + +#if defined (UDATA_DEBUG_DUMP) + /* list the contents of the TOC each time .. not recommended */ + for(number=0; numberentry[number].entryName); + } +#endif + number=pointerTOCPrefixBinarySearch(name, toc->entry, count); + if(number>=0) { + /* found it */ +#ifdef UDATA_DEBUG + fprintf(stderr, "%s: Found.\n", toc->entry[number].entryName); +#endif + *pLength=-1; + return UDataMemory_normalizeDataPointer(toc->entry[number].pHeader); + } else { +#ifdef UDATA_DEBUG + fprintf(stderr, "%s: Not found.\n", name); +#endif + return NULL; + } + } else { + return pData->pHeader; + } +} +U_CDECL_END + + +static const commonDataFuncs CmnDFuncs = {offsetTOCLookupFn, offsetTOCEntryCount}; +static const commonDataFuncs ToCPFuncs = {pointerTOCLookupFn, pointerTOCEntryCount}; + + + +/*----------------------------------------------------------------------* + * * + * checkCommonData Validate the format of a common data file. * + * Fill in the virtual function ptr based on TOC type * + * If the data is invalid, close the UDataMemory * + * and set the appropriate error code. * + * * + *----------------------------------------------------------------------*/ +U_CFUNC void udata_checkCommonData(UDataMemory *udm, UErrorCode *err) { + if (U_FAILURE(*err)) { + return; + } + + if(udm==NULL || udm->pHeader==NULL) { + *err=U_INVALID_FORMAT_ERROR; + } else if(!(udm->pHeader->dataHeader.magic1==0xda && + udm->pHeader->dataHeader.magic2==0x27 && + udm->pHeader->info.isBigEndian==U_IS_BIG_ENDIAN && + udm->pHeader->info.charsetFamily==U_CHARSET_FAMILY) + ) { + /* header not valid */ + *err=U_INVALID_FORMAT_ERROR; + } + else if (udm->pHeader->info.dataFormat[0]==0x43 && + udm->pHeader->info.dataFormat[1]==0x6d && + udm->pHeader->info.dataFormat[2]==0x6e && + udm->pHeader->info.dataFormat[3]==0x44 && + udm->pHeader->info.formatVersion[0]==1 + ) { + /* dataFormat="CmnD" */ + udm->vFuncs = &CmnDFuncs; + udm->toc=(const char *)udm->pHeader+udata_getHeaderSize(udm->pHeader); + } + else if(udm->pHeader->info.dataFormat[0]==0x54 && + udm->pHeader->info.dataFormat[1]==0x6f && + udm->pHeader->info.dataFormat[2]==0x43 && + udm->pHeader->info.dataFormat[3]==0x50 && + udm->pHeader->info.formatVersion[0]==1 + ) { + /* dataFormat="ToCP" */ + udm->vFuncs = &ToCPFuncs; + udm->toc=(const char *)udm->pHeader+udata_getHeaderSize(udm->pHeader); + } + else { + /* dataFormat not recognized */ + *err=U_INVALID_FORMAT_ERROR; + } + + if (U_FAILURE(*err)) { + /* If the data is no good and we memory-mapped it ourselves, + * close the memory mapping so it doesn't leak. Note that this has + * no effect on non-memory mapped data, other than clearing fields in udm. + */ + udata_close(udm); + } +} + +/* + * TODO: Add a udata_swapPackageHeader() function that swaps an ICU .dat package + * header but not its sub-items. + * This function will be needed for automatic runtime swapping. + * Sub-items should not be swapped to limit the swapping to the parts of the + * package that are actually used. + * + * Since lengths of items are implicit in the order and offsets of their + * ToC entries, and since offsets are relative to the start of the ToC, + * a swapped version may need to generate a different data structure + * with pointers to the original data items and with their lengths + * (-1 for the last one if it is not known), and maybe even pointers to the + * swapped versions of the items. + * These pointers to swapped versions would establish a cache; + * instead, each open data item could simply own the storage for its swapped + * data. This fits better with the current design. + * + * markus 2003sep18 Jitterbug 2235 + */ diff --git a/Build/source/libs/icu/icu-src/source/common/ucmndata.h b/Build/source/libs/icu/icu-src/source/common/ucmndata.h index 9e87fad9bdc..cc126d53ac1 100644 --- a/Build/source/libs/icu/icu-src/source/common/ucmndata.h +++ b/Build/source/libs/icu/icu-src/source/common/ucmndata.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ****************************************************************************** diff --git a/Build/source/libs/icu/icu-src/source/common/ucnv.c b/Build/source/libs/icu/icu-src/source/common/ucnv.c deleted file mode 100644 index 527f86f140b..00000000000 --- a/Build/source/libs/icu/icu-src/source/common/ucnv.c +++ /dev/null @@ -1,2918 +0,0 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. -// License & terms of use: http://www.unicode.org/copyright.html -/* -****************************************************************************** -* -* Copyright (C) 1998-2016, International Business Machines -* Corporation and others. All Rights Reserved. -* -****************************************************************************** -* -* ucnv.c: -* Implements APIs for the ICU's codeset conversion library; -* mostly calls through internal functions; -* created by Bertrand A. Damiba -* -* Modification History: -* -* Date Name Description -* 04/04/99 helena Fixed internal header inclusion. -* 05/09/00 helena Added implementation to handle fallback mappings. -* 06/20/2000 helena OS/400 port changes; mostly typecast. -*/ - -#include "unicode/utypes.h" - -#if !UCONFIG_NO_CONVERSION - -#include "unicode/ustring.h" -#include "unicode/ucnv.h" -#include "unicode/ucnv_err.h" -#include "unicode/uset.h" -#include "unicode/utf.h" -#include "unicode/utf16.h" -#include "putilimp.h" -#include "cmemory.h" -#include "cstring.h" -#include "uassert.h" -#include "utracimp.h" -#include "ustr_imp.h" -#include "ucnv_imp.h" -#include "ucnv_cnv.h" -#include "ucnv_bld.h" - -/* size of intermediate and preflighting buffers in ucnv_convert() */ -#define CHUNK_SIZE 1024 - -typedef struct UAmbiguousConverter { - const char *name; - const UChar variant5c; -} UAmbiguousConverter; - -static const UAmbiguousConverter ambiguousConverters[]={ - { "ibm-897_P100-1995", 0xa5 }, - { "ibm-942_P120-1999", 0xa5 }, - { "ibm-943_P130-1999", 0xa5 }, - { "ibm-946_P100-1995", 0xa5 }, - { "ibm-33722_P120-1999", 0xa5 }, - { "ibm-1041_P100-1995", 0xa5 }, - /*{ "ibm-54191_P100-2006", 0xa5 },*/ - /*{ "ibm-62383_P100-2007", 0xa5 },*/ - /*{ "ibm-891_P100-1995", 0x20a9 },*/ - { "ibm-944_P100-1995", 0x20a9 }, - { "ibm-949_P110-1999", 0x20a9 }, - { "ibm-1363_P110-1997", 0x20a9 }, - { "ISO_2022,locale=ko,version=0", 0x20a9 }, - { "ibm-1088_P100-1995", 0x20a9 } -}; - -/*Calls through createConverter */ -U_CAPI UConverter* U_EXPORT2 -ucnv_open (const char *name, - UErrorCode * err) -{ - UConverter *r; - - if (err == NULL || U_FAILURE (*err)) { - return NULL; - } - - r = ucnv_createConverter(NULL, name, err); - return r; -} - -U_CAPI UConverter* U_EXPORT2 -ucnv_openPackage (const char *packageName, const char *converterName, UErrorCode * err) -{ - return ucnv_createConverterFromPackage(packageName, converterName, err); -} - -/*Extracts the UChar* to a char* and calls through createConverter */ -U_CAPI UConverter* U_EXPORT2 -ucnv_openU (const UChar * name, - UErrorCode * err) -{ - char asciiName[UCNV_MAX_CONVERTER_NAME_LENGTH]; - - if (err == NULL || U_FAILURE(*err)) - return NULL; - if (name == NULL) - return ucnv_open (NULL, err); - if (u_strlen(name) >= UCNV_MAX_CONVERTER_NAME_LENGTH) - { - *err = U_ILLEGAL_ARGUMENT_ERROR; - return NULL; - } - return ucnv_open(u_austrcpy(asciiName, name), err); -} - -/* Copy the string that is represented by the UConverterPlatform enum - * @param platformString An output buffer - * @param platform An enum representing a platform - * @return the length of the copied string. - */ -static int32_t -ucnv_copyPlatformString(char *platformString, UConverterPlatform pltfrm) -{ - switch (pltfrm) - { - case UCNV_IBM: - uprv_strcpy(platformString, "ibm-"); - return 4; - case UCNV_UNKNOWN: - break; - } - - /* default to empty string */ - *platformString = 0; - return 0; -} - -/*Assumes a $platform-#codepage.$CONVERTER_FILE_EXTENSION scheme and calls - *through createConverter*/ -U_CAPI UConverter* U_EXPORT2 -ucnv_openCCSID (int32_t codepage, - UConverterPlatform platform, - UErrorCode * err) -{ - char myName[UCNV_MAX_CONVERTER_NAME_LENGTH]; - int32_t myNameLen; - - if (err == NULL || U_FAILURE (*err)) - return NULL; - - /* ucnv_copyPlatformString could return "ibm-" or "cp" */ - myNameLen = ucnv_copyPlatformString(myName, platform); - T_CString_integerToString(myName + myNameLen, codepage, 10); - - return ucnv_createConverter(NULL, myName, err); -} - -/* Creating a temporary stack-based object that can be used in one thread, -and created from a converter that is shared across threads. -*/ - -U_CAPI UConverter* U_EXPORT2 -ucnv_safeClone(const UConverter* cnv, void *stackBuffer, int32_t *pBufferSize, UErrorCode *status) -{ - UConverter *localConverter, *allocatedConverter; - int32_t stackBufferSize; - int32_t bufferSizeNeeded; - char *stackBufferChars = (char *)stackBuffer; - UErrorCode cbErr; - UConverterToUnicodeArgs toUArgs = { - sizeof(UConverterToUnicodeArgs), - TRUE, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL - }; - UConverterFromUnicodeArgs fromUArgs = { - sizeof(UConverterFromUnicodeArgs), - TRUE, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL - }; - - UTRACE_ENTRY_OC(UTRACE_UCNV_CLONE); - - if (status == NULL || U_FAILURE(*status)){ - UTRACE_EXIT_STATUS(status? *status: U_ILLEGAL_ARGUMENT_ERROR); - return NULL; - } - - if (cnv == NULL) { - *status = U_ILLEGAL_ARGUMENT_ERROR; - UTRACE_EXIT_STATUS(*status); - return NULL; - } - - UTRACE_DATA3(UTRACE_OPEN_CLOSE, "clone converter %s at %p into stackBuffer %p", - ucnv_getName(cnv, status), cnv, stackBuffer); - - if (cnv->sharedData->impl->safeClone != NULL) { - /* call the custom safeClone function for sizing */ - bufferSizeNeeded = 0; - cnv->sharedData->impl->safeClone(cnv, NULL, &bufferSizeNeeded, status); - if (U_FAILURE(*status)) { - UTRACE_EXIT_STATUS(*status); - return NULL; - } - } - else - { - /* inherent sizing */ - bufferSizeNeeded = sizeof(UConverter); - } - - if (pBufferSize == NULL) { - stackBufferSize = 1; - pBufferSize = &stackBufferSize; - } else { - stackBufferSize = *pBufferSize; - if (stackBufferSize <= 0){ /* 'preflighting' request - set needed size into *pBufferSize */ - *pBufferSize = bufferSizeNeeded; - UTRACE_EXIT_VALUE(bufferSizeNeeded); - return NULL; - } - } - - - /* Pointers on 64-bit platforms need to be aligned - * on a 64-bit boundary in memory. - */ - if (U_ALIGNMENT_OFFSET(stackBuffer) != 0) { - int32_t offsetUp = (int32_t)U_ALIGNMENT_OFFSET_UP(stackBufferChars); - if(stackBufferSize > offsetUp) { - stackBufferSize -= offsetUp; - stackBufferChars += offsetUp; - } else { - /* prevent using the stack buffer but keep the size > 0 so that we do not just preflight */ - stackBufferSize = 1; - } - } - - stackBuffer = (void *)stackBufferChars; - - /* Now, see if we must allocate any memory */ - if (stackBufferSize < bufferSizeNeeded || stackBuffer == NULL) - { - /* allocate one here...*/ - localConverter = allocatedConverter = (UConverter *) uprv_malloc (bufferSizeNeeded); - - if(localConverter == NULL) { - *status = U_MEMORY_ALLOCATION_ERROR; - UTRACE_EXIT_STATUS(*status); - return NULL; - } - *status = U_SAFECLONE_ALLOCATED_WARNING; - - /* record the fact that memory was allocated */ - *pBufferSize = bufferSizeNeeded; - } else { - /* just use the stack buffer */ - localConverter = (UConverter*) stackBuffer; - allocatedConverter = NULL; - } - - uprv_memset(localConverter, 0, bufferSizeNeeded); - - /* Copy initial state */ - uprv_memcpy(localConverter, cnv, sizeof(UConverter)); - localConverter->isCopyLocal = localConverter->isExtraLocal = FALSE; - - /* copy the substitution string */ - if (cnv->subChars == (uint8_t *)cnv->subUChars) { - localConverter->subChars = (uint8_t *)localConverter->subUChars; - } else { - localConverter->subChars = (uint8_t *)uprv_malloc(UCNV_ERROR_BUFFER_LENGTH * U_SIZEOF_UCHAR); - if (localConverter->subChars == NULL) { - uprv_free(allocatedConverter); - UTRACE_EXIT_STATUS(*status); - return NULL; - } - uprv_memcpy(localConverter->subChars, cnv->subChars, UCNV_ERROR_BUFFER_LENGTH * U_SIZEOF_UCHAR); - } - - /* now either call the safeclone fcn or not */ - if (cnv->sharedData->impl->safeClone != NULL) { - /* call the custom safeClone function */ - localConverter = cnv->sharedData->impl->safeClone(cnv, localConverter, pBufferSize, status); - } - - if(localConverter==NULL || U_FAILURE(*status)) { - if (allocatedConverter != NULL && allocatedConverter->subChars != (uint8_t *)allocatedConverter->subUChars) { - uprv_free(allocatedConverter->subChars); - } - uprv_free(allocatedConverter); - UTRACE_EXIT_STATUS(*status); - return NULL; - } - - /* increment refcount of shared data if needed */ - if (cnv->sharedData->isReferenceCounted) { - ucnv_incrementRefCount(cnv->sharedData); - } - - if(localConverter == (UConverter*)stackBuffer) { - /* we're using user provided data - set to not destroy */ - localConverter->isCopyLocal = TRUE; - } - - /* allow callback functions to handle any memory allocation */ - toUArgs.converter = fromUArgs.converter = localConverter; - cbErr = U_ZERO_ERROR; - cnv->fromCharErrorBehaviour(cnv->toUContext, &toUArgs, NULL, 0, UCNV_CLONE, &cbErr); - cbErr = U_ZERO_ERROR; - cnv->fromUCharErrorBehaviour(cnv->fromUContext, &fromUArgs, NULL, 0, 0, UCNV_CLONE, &cbErr); - - UTRACE_EXIT_PTR_STATUS(localConverter, *status); - return localConverter; -} - - - -/*Decreases the reference counter in the shared immutable section of the object - *and frees the mutable part*/ - -U_CAPI void U_EXPORT2 -ucnv_close (UConverter * converter) -{ - UErrorCode errorCode = U_ZERO_ERROR; - - UTRACE_ENTRY_OC(UTRACE_UCNV_CLOSE); - - if (converter == NULL) - { - UTRACE_EXIT(); - return; - } - - UTRACE_DATA3(UTRACE_OPEN_CLOSE, "close converter %s at %p, isCopyLocal=%b", - ucnv_getName(converter, &errorCode), converter, converter->isCopyLocal); - - /* In order to speed up the close, only call the callbacks when they have been changed. - This performance check will only work when the callbacks are set within a shared library - or from user code that statically links this code. */ - /* first, notify the callback functions that the converter is closed */ - if (converter->fromCharErrorBehaviour != UCNV_TO_U_DEFAULT_CALLBACK) { - UConverterToUnicodeArgs toUArgs = { - sizeof(UConverterToUnicodeArgs), - TRUE, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL - }; - - toUArgs.converter = converter; - errorCode = U_ZERO_ERROR; - converter->fromCharErrorBehaviour(converter->toUContext, &toUArgs, NULL, 0, UCNV_CLOSE, &errorCode); - } - if (converter->fromUCharErrorBehaviour != UCNV_FROM_U_DEFAULT_CALLBACK) { - UConverterFromUnicodeArgs fromUArgs = { - sizeof(UConverterFromUnicodeArgs), - TRUE, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL - }; - fromUArgs.converter = converter; - errorCode = U_ZERO_ERROR; - converter->fromUCharErrorBehaviour(converter->fromUContext, &fromUArgs, NULL, 0, 0, UCNV_CLOSE, &errorCode); - } - - if (converter->sharedData->impl->close != NULL) { - converter->sharedData->impl->close(converter); - } - - if (converter->subChars != (uint8_t *)converter->subUChars) { - uprv_free(converter->subChars); - } - - if (converter->sharedData->isReferenceCounted) { - ucnv_unloadSharedDataIfReady(converter->sharedData); - } - - if(!converter->isCopyLocal){ - uprv_free(converter); - } - - UTRACE_EXIT(); -} - -/*returns a single Name from the list, will return NULL if out of bounds - */ -U_CAPI const char* U_EXPORT2 -ucnv_getAvailableName (int32_t n) -{ - if (0 <= n && n <= 0xffff) { - UErrorCode err = U_ZERO_ERROR; - const char *name = ucnv_bld_getAvailableConverter((uint16_t)n, &err); - if (U_SUCCESS(err)) { - return name; - } - } - return NULL; -} - -U_CAPI int32_t U_EXPORT2 -ucnv_countAvailable () -{ - UErrorCode err = U_ZERO_ERROR; - return ucnv_bld_countAvailableConverters(&err); -} - -U_CAPI void U_EXPORT2 -ucnv_getSubstChars (const UConverter * converter, - char *mySubChar, - int8_t * len, - UErrorCode * err) -{ - if (U_FAILURE (*err)) - return; - - if (converter->subCharLen <= 0) { - /* Unicode string or empty string from ucnv_setSubstString(). */ - *len = 0; - return; - } - - if (*len < converter->subCharLen) /*not enough space in subChars */ - { - *err = U_INDEX_OUTOFBOUNDS_ERROR; - return; - } - - uprv_memcpy (mySubChar, converter->subChars, converter->subCharLen); /*fills in the subchars */ - *len = converter->subCharLen; /*store # of bytes copied to buffer */ -} - -U_CAPI void U_EXPORT2 -ucnv_setSubstChars (UConverter * converter, - const char *mySubChar, - int8_t len, - UErrorCode * err) -{ - if (U_FAILURE (*err)) - return; - - /*Makes sure that the subChar is within the codepages char length boundaries */ - if ((len > converter->sharedData->staticData->maxBytesPerChar) - || (len < converter->sharedData->staticData->minBytesPerChar)) - { - *err = U_ILLEGAL_ARGUMENT_ERROR; - return; - } - - uprv_memcpy (converter->subChars, mySubChar, len); /*copies the subchars */ - converter->subCharLen = len; /*sets the new len */ - - /* - * There is currently (2001Feb) no separate API to set/get subChar1. - * In order to always have subChar written after it is explicitly set, - * we set subChar1 to 0. - */ - converter->subChar1 = 0; - - return; -} - -U_CAPI void U_EXPORT2 -ucnv_setSubstString(UConverter *cnv, - const UChar *s, - int32_t length, - UErrorCode *err) { - UAlignedMemory cloneBuffer[U_CNV_SAFECLONE_BUFFERSIZE / sizeof(UAlignedMemory) + 1]; - char chars[UCNV_ERROR_BUFFER_LENGTH]; - - UConverter *clone; - uint8_t *subChars; - int32_t cloneSize, length8; - - /* Let the following functions check all arguments. */ - cloneSize = sizeof(cloneBuffer); - clone = ucnv_safeClone(cnv, cloneBuffer, &cloneSize, err); - ucnv_setFromUCallBack(clone, UCNV_FROM_U_CALLBACK_STOP, NULL, NULL, NULL, err); - length8 = ucnv_fromUChars(clone, chars, (int32_t)sizeof(chars), s, length, err); - ucnv_close(clone); - if (U_FAILURE(*err)) { - return; - } - - if (cnv->sharedData->impl->writeSub == NULL -#if !UCONFIG_NO_LEGACY_CONVERSION - || (cnv->sharedData->staticData->conversionType == UCNV_MBCS && - ucnv_MBCSGetType(cnv) != UCNV_EBCDIC_STATEFUL) -#endif - ) { - /* The converter is not stateful. Store the charset bytes as a fixed string. */ - subChars = (uint8_t *)chars; - } else { - /* - * The converter has a non-default writeSub() function, indicating - * that it is stateful. - * Store the Unicode string for on-the-fly conversion for correct - * state handling. - */ - if (length > UCNV_ERROR_BUFFER_LENGTH) { - /* - * Should not occur. The converter should output at least one byte - * per UChar, which means that ucnv_fromUChars() should catch all - * overflows. - */ - *err = U_BUFFER_OVERFLOW_ERROR; - return; - } - subChars = (uint8_t *)s; - if (length < 0) { - length = u_strlen(s); - } - length8 = length * U_SIZEOF_UCHAR; - } - - /* - * For storing the substitution string, select either the small buffer inside - * UConverter or allocate a subChars buffer. - */ - if (length8 > UCNV_MAX_SUBCHAR_LEN) { - /* Use a separate buffer for the string. Outside UConverter to not make it too large. */ - if (cnv->subChars == (uint8_t *)cnv->subUChars) { - /* Allocate a new buffer for the string. */ - cnv->subChars = (uint8_t *)uprv_malloc(UCNV_ERROR_BUFFER_LENGTH * U_SIZEOF_UCHAR); - if (cnv->subChars == NULL) { - cnv->subChars = (uint8_t *)cnv->subUChars; - *err = U_MEMORY_ALLOCATION_ERROR; - return; - } - uprv_memset(cnv->subChars, 0, UCNV_ERROR_BUFFER_LENGTH * U_SIZEOF_UCHAR); - } - } - - /* Copy the substitution string into the UConverter or its subChars buffer. */ - if (length8 == 0) { - cnv->subCharLen = 0; - } else { - uprv_memcpy(cnv->subChars, subChars, length8); - if (subChars == (uint8_t *)chars) { - cnv->subCharLen = (int8_t)length8; - } else /* subChars == s */ { - cnv->subCharLen = (int8_t)-length; - } - } - - /* See comment in ucnv_setSubstChars(). */ - cnv->subChar1 = 0; -} - -/*resets the internal states of a converter - *goal : have the same behaviour than a freshly created converter - */ -static void _reset(UConverter *converter, UConverterResetChoice choice, - UBool callCallback) { - if(converter == NULL) { - return; - } - - if(callCallback) { - /* first, notify the callback functions that the converter is reset */ - UErrorCode errorCode; - - if(choice<=UCNV_RESET_TO_UNICODE && converter->fromCharErrorBehaviour != UCNV_TO_U_DEFAULT_CALLBACK) { - UConverterToUnicodeArgs toUArgs = { - sizeof(UConverterToUnicodeArgs), - TRUE, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL - }; - toUArgs.converter = converter; - errorCode = U_ZERO_ERROR; - converter->fromCharErrorBehaviour(converter->toUContext, &toUArgs, NULL, 0, UCNV_RESET, &errorCode); - } - if(choice!=UCNV_RESET_TO_UNICODE && converter->fromUCharErrorBehaviour != UCNV_FROM_U_DEFAULT_CALLBACK) { - UConverterFromUnicodeArgs fromUArgs = { - sizeof(UConverterFromUnicodeArgs), - TRUE, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL - }; - fromUArgs.converter = converter; - errorCode = U_ZERO_ERROR; - converter->fromUCharErrorBehaviour(converter->fromUContext, &fromUArgs, NULL, 0, 0, UCNV_RESET, &errorCode); - } - } - - /* now reset the converter itself */ - if(choice<=UCNV_RESET_TO_UNICODE) { - converter->toUnicodeStatus = converter->sharedData->toUnicodeStatus; - converter->mode = 0; - converter->toULength = 0; - converter->invalidCharLength = converter->UCharErrorBufferLength = 0; - converter->preToULength = 0; - } - if(choice!=UCNV_RESET_TO_UNICODE) { - converter->fromUnicodeStatus = 0; - converter->fromUChar32 = 0; - converter->invalidUCharLength = converter->charErrorBufferLength = 0; - converter->preFromUFirstCP = U_SENTINEL; - converter->preFromULength = 0; - } - - if (converter->sharedData->impl->reset != NULL) { - /* call the custom reset function */ - converter->sharedData->impl->reset(converter, choice); - } -} - -U_CAPI void U_EXPORT2 -ucnv_reset(UConverter *converter) -{ - _reset(converter, UCNV_RESET_BOTH, TRUE); -} - -U_CAPI void U_EXPORT2 -ucnv_resetToUnicode(UConverter *converter) -{ - _reset(converter, UCNV_RESET_TO_UNICODE, TRUE); -} - -U_CAPI void U_EXPORT2 -ucnv_resetFromUnicode(UConverter *converter) -{ - _reset(converter, UCNV_RESET_FROM_UNICODE, TRUE); -} - -U_CAPI int8_t U_EXPORT2 -ucnv_getMaxCharSize (const UConverter * converter) -{ - return converter->maxBytesPerUChar; -} - - -U_CAPI int8_t U_EXPORT2 -ucnv_getMinCharSize (const UConverter * converter) -{ - return converter->sharedData->staticData->minBytesPerChar; -} - -U_CAPI const char* U_EXPORT2 -ucnv_getName (const UConverter * converter, UErrorCode * err) - -{ - if (U_FAILURE (*err)) - return NULL; - if(converter->sharedData->impl->getName){ - const char* temp= converter->sharedData->impl->getName(converter); - if(temp) - return temp; - } - return converter->sharedData->staticData->name; -} - -U_CAPI int32_t U_EXPORT2 -ucnv_getCCSID(const UConverter * converter, - UErrorCode * err) -{ - int32_t ccsid; - if (U_FAILURE (*err)) - return -1; - - ccsid = converter->sharedData->staticData->codepage; - if (ccsid == 0) { - /* Rare case. This is for cases like gb18030, - which doesn't have an IBM canonical name, but does have an IBM alias. */ - const char *standardName = ucnv_getStandardName(ucnv_getName(converter, err), "IBM", err); - if (U_SUCCESS(*err) && standardName) { - const char *ccsidStr = uprv_strchr(standardName, '-'); - if (ccsidStr) { - ccsid = (int32_t)atol(ccsidStr+1); /* +1 to skip '-' */ - } - } - } - return ccsid; -} - - -U_CAPI UConverterPlatform U_EXPORT2 -ucnv_getPlatform (const UConverter * converter, - UErrorCode * err) -{ - if (U_FAILURE (*err)) - return UCNV_UNKNOWN; - - return (UConverterPlatform)converter->sharedData->staticData->platform; -} - -U_CAPI void U_EXPORT2 - ucnv_getToUCallBack (const UConverter * converter, - UConverterToUCallback *action, - const void **context) -{ - *action = converter->fromCharErrorBehaviour; - *context = converter->toUContext; -} - -U_CAPI void U_EXPORT2 - ucnv_getFromUCallBack (const UConverter * converter, - UConverterFromUCallback *action, - const void **context) -{ - *action = converter->fromUCharErrorBehaviour; - *context = converter->fromUContext; -} - -U_CAPI void U_EXPORT2 -ucnv_setToUCallBack (UConverter * converter, - UConverterToUCallback newAction, - const void* newContext, - UConverterToUCallback *oldAction, - const void** oldContext, - UErrorCode * err) -{ - if (U_FAILURE (*err)) - return; - if (oldAction) *oldAction = converter->fromCharErrorBehaviour; - converter->fromCharErrorBehaviour = newAction; - if (oldContext) *oldContext = converter->toUContext; - converter->toUContext = newContext; -} - -U_CAPI void U_EXPORT2 -ucnv_setFromUCallBack (UConverter * converter, - UConverterFromUCallback newAction, - const void* newContext, - UConverterFromUCallback *oldAction, - const void** oldContext, - UErrorCode * err) -{ - if (U_FAILURE (*err)) - return; - if (oldAction) *oldAction = converter->fromUCharErrorBehaviour; - converter->fromUCharErrorBehaviour = newAction; - if (oldContext) *oldContext = converter->fromUContext; - converter->fromUContext = newContext; -} - -static void -_updateOffsets(int32_t *offsets, int32_t length, - int32_t sourceIndex, int32_t errorInputLength) { - int32_t *limit; - int32_t delta, offset; - - if(sourceIndex>=0) { - /* - * adjust each offset by adding the previous sourceIndex - * minus the length of the input sequence that caused an - * error, if any - */ - delta=sourceIndex-errorInputLength; - } else { - /* - * set each offset to -1 because this conversion function - * does not handle offsets - */ - delta=-1; - } - - limit=offsets+length; - if(delta==0) { - /* most common case, nothing to do */ - } else if(delta>0) { - /* add the delta to each offset (but not if the offset is <0) */ - while(offsets=0) { - *offsets=offset+delta; - } - ++offsets; - } - } else /* delta<0 */ { - /* - * set each offset to -1 because this conversion function - * does not handle offsets - * or the error input sequence started in a previous buffer - */ - while(offsetsconverter; - s=pArgs->source; - t=pArgs->target; - offsets=pArgs->offsets; - - /* get the converter implementation function */ - sourceIndex=0; - if(offsets==NULL) { - fromUnicode=cnv->sharedData->impl->fromUnicode; - } else { - fromUnicode=cnv->sharedData->impl->fromUnicodeWithOffsets; - if(fromUnicode==NULL) { - /* there is no WithOffsets implementation */ - fromUnicode=cnv->sharedData->impl->fromUnicode; - /* we will write -1 for each offset */ - sourceIndex=-1; - } - } - - if(cnv->preFromULength>=0) { - /* normal mode */ - realSource=NULL; - - /* avoid compiler warnings - not otherwise necessary, and the values do not matter */ - realSourceLimit=NULL; - realFlush=FALSE; - realSourceIndex=0; - } else { - /* - * Previous m:n conversion stored source units from a partial match - * and failed to consume all of them. - * We need to "replay" them from a temporary buffer and convert them first. - */ - realSource=pArgs->source; - realSourceLimit=pArgs->sourceLimit; - realFlush=pArgs->flush; - realSourceIndex=sourceIndex; - - uprv_memcpy(replay, cnv->preFromU, -cnv->preFromULength*U_SIZEOF_UCHAR); - pArgs->source=replay; - pArgs->sourceLimit=replay-cnv->preFromULength; - pArgs->flush=FALSE; - sourceIndex=-1; - - cnv->preFromULength=0; - } - - /* - * loop for conversion and error handling - * - * loop { - * convert - * loop { - * update offsets - * handle end of input - * handle errors/call callback - * } - * } - */ - for(;;) { - if(U_SUCCESS(*err)) { - /* convert */ - fromUnicode(pArgs, err); - - /* - * set a flag for whether the converter - * successfully processed the end of the input - * - * need not check cnv->preFromULength==0 because a replay (<0) will cause - * sflush && pArgs->source==pArgs->sourceLimit && - cnv->fromUChar32==0); - } else { - /* handle error from ucnv_convertEx() */ - converterSawEndOfInput=FALSE; - } - - /* no callback called yet for this iteration */ - calledCallback=FALSE; - - /* no sourceIndex adjustment for conversion, only for callback output */ - errorInputLength=0; - - /* - * loop for offsets and error handling - * - * iterates at most 3 times: - * 1. to clean up after the conversion function - * 2. after the callback - * 3. after the callback again if there was truncated input - */ - for(;;) { - /* update offsets if we write any */ - if(offsets!=NULL) { - int32_t length=(int32_t)(pArgs->target-t); - if(length>0) { - _updateOffsets(offsets, length, sourceIndex, errorInputLength); - - /* - * if a converter handles offsets and updates the offsets - * pointer at the end, then pArgs->offset should not change - * here; - * however, some converters do not handle offsets at all - * (sourceIndex<0) or may not update the offsets pointer - */ - pArgs->offsets=offsets+=length; - } - - if(sourceIndex>=0) { - sourceIndex+=(int32_t)(pArgs->source-s); - } - } - - if(cnv->preFromULength<0) { - /* - * switch the source to new replay units (cannot occur while replaying) - * after offset handling and before end-of-input and callback handling - */ - if(realSource==NULL) { - realSource=pArgs->source; - realSourceLimit=pArgs->sourceLimit; - realFlush=pArgs->flush; - realSourceIndex=sourceIndex; - - uprv_memcpy(replay, cnv->preFromU, -cnv->preFromULength*U_SIZEOF_UCHAR); - pArgs->source=replay; - pArgs->sourceLimit=replay-cnv->preFromULength; - pArgs->flush=FALSE; - if((sourceIndex+=cnv->preFromULength)<0) { - sourceIndex=-1; - } - - cnv->preFromULength=0; - } else { - /* see implementation note before _fromUnicodeWithCallback() */ - U_ASSERT(realSource==NULL); - *err=U_INTERNAL_PROGRAM_ERROR; - } - } - - /* update pointers */ - s=pArgs->source; - t=pArgs->target; - - if(U_SUCCESS(*err)) { - if(ssourceLimit) { - /* - * continue with the conversion loop while there is still input left - * (continue converting by breaking out of only the inner loop) - */ - break; - } else if(realSource!=NULL) { - /* switch back from replaying to the real source and continue */ - pArgs->source=realSource; - pArgs->sourceLimit=realSourceLimit; - pArgs->flush=realFlush; - sourceIndex=realSourceIndex; - - realSource=NULL; - break; - } else if(pArgs->flush && cnv->fromUChar32!=0) { - /* - * the entire input stream is consumed - * and there is a partial, truncated input sequence left - */ - - /* inject an error and continue with callback handling */ - *err=U_TRUNCATED_CHAR_FOUND; - calledCallback=FALSE; /* new error condition */ - } else { - /* input consumed */ - if(pArgs->flush) { - /* - * return to the conversion loop once more if the flush - * flag is set and the conversion function has not - * successfully processed the end of the input yet - * - * (continue converting by breaking out of only the inner loop) - */ - if(!converterSawEndOfInput) { - break; - } - - /* reset the converter without calling the callback function */ - _reset(cnv, UCNV_RESET_FROM_UNICODE, FALSE); - } - - /* done successfully */ - return; - } - } - - /* U_FAILURE(*err) */ - { - UErrorCode e; - - if( calledCallback || - (e=*err)==U_BUFFER_OVERFLOW_ERROR || - (e!=U_INVALID_CHAR_FOUND && - e!=U_ILLEGAL_CHAR_FOUND && - e!=U_TRUNCATED_CHAR_FOUND) - ) { - /* - * the callback did not or cannot resolve the error: - * set output pointers and return - * - * the check for buffer overflow is redundant but it is - * a high-runner case and hopefully documents the intent - * well - * - * if we were replaying, then the replay buffer must be - * copied back into the UConverter - * and the real arguments must be restored - */ - if(realSource!=NULL) { - int32_t length; - - U_ASSERT(cnv->preFromULength==0); - - length=(int32_t)(pArgs->sourceLimit-pArgs->source); - if(length>0) { - u_memcpy(cnv->preFromU, pArgs->source, length); - cnv->preFromULength=(int8_t)-length; - } - - pArgs->source=realSource; - pArgs->sourceLimit=realSourceLimit; - pArgs->flush=realFlush; - } - - return; - } - } - - /* callback handling */ - { - UChar32 codePoint; - - /* get and write the code point */ - codePoint=cnv->fromUChar32; - errorInputLength=0; - U16_APPEND_UNSAFE(cnv->invalidUCharBuffer, errorInputLength, codePoint); - cnv->invalidUCharLength=(int8_t)errorInputLength; - - /* set the converter state to deal with the next character */ - cnv->fromUChar32=0; - - /* call the callback function */ - cnv->fromUCharErrorBehaviour(cnv->fromUContext, pArgs, - cnv->invalidUCharBuffer, errorInputLength, codePoint, - *err==U_INVALID_CHAR_FOUND ? UCNV_UNASSIGNED : UCNV_ILLEGAL, - err); - } - - /* - * loop back to the offset handling - * - * this flag will indicate after offset handling - * that a callback was called; - * if the callback did not resolve the error, then we return - */ - calledCallback=TRUE; - } - } -} - -/* - * Output the fromUnicode overflow buffer. - * Call this function if(cnv->charErrorBufferLength>0). - * @return TRUE if overflow - */ -static UBool -ucnv_outputOverflowFromUnicode(UConverter *cnv, - char **target, const char *targetLimit, - int32_t **pOffsets, - UErrorCode *err) { - int32_t *offsets; - char *overflow, *t; - int32_t i, length; - - t=*target; - if(pOffsets!=NULL) { - offsets=*pOffsets; - } else { - offsets=NULL; - } - - overflow=(char *)cnv->charErrorBuffer; - length=cnv->charErrorBufferLength; - i=0; - while(icharErrorBufferLength=(int8_t)j; - *target=t; - if(offsets!=NULL) { - *pOffsets=offsets; - } - *err=U_BUFFER_OVERFLOW_ERROR; - return TRUE; - } - - /* copy the overflow contents to the target */ - *t++=overflow[i++]; - if(offsets!=NULL) { - *offsets++=-1; /* no source index available for old output */ - } - } - - /* the overflow buffer is completely copied to the target */ - cnv->charErrorBufferLength=0; - *target=t; - if(offsets!=NULL) { - *pOffsets=offsets; - } - return FALSE; -} - -U_CAPI void U_EXPORT2 -ucnv_fromUnicode(UConverter *cnv, - char **target, const char *targetLimit, - const UChar **source, const UChar *sourceLimit, - int32_t *offsets, - UBool flush, - UErrorCode *err) { - UConverterFromUnicodeArgs args; - const UChar *s; - char *t; - - /* check parameters */ - if(err==NULL || U_FAILURE(*err)) { - return; - } - - if(cnv==NULL || target==NULL || source==NULL) { - *err=U_ILLEGAL_ARGUMENT_ERROR; - return; - } - - s=*source; - t=*target; - - if ((const void *)U_MAX_PTR(sourceLimit) == (const void *)sourceLimit) { - /* - Prevent code from going into an infinite loop in case we do hit this - limit. The limit pointer is expected to be on a UChar * boundary. - This also prevents the next argument check from failing. - */ - sourceLimit = (const UChar *)(((const char *)sourceLimit) - 1); - } - - /* - * All these conditions should never happen. - * - * 1) Make sure that the limits are >= to the address source or target - * - * 2) Make sure that the buffer sizes do not exceed the number range for - * int32_t because some functions use the size (in units or bytes) - * rather than comparing pointers, and because offsets are int32_t values. - * - * size_t is guaranteed to be unsigned and large enough for the job. - * - * Return with an error instead of adjusting the limits because we would - * not be able to maintain the semantics that either the source must be - * consumed or the target filled (unless an error occurs). - * An adjustment would be targetLimit=t+0x7fffffff; for example. - * - * 3) Make sure that the user didn't incorrectly cast a UChar * pointer - * to a char * pointer and provide an incomplete UChar code unit. - */ - if (sourceLimit(size_t)0x3fffffff && sourceLimit>s) || - ((size_t)(targetLimit-t)>(size_t)0x7fffffff && targetLimit>t) || - (((const char *)sourceLimit-(const char *)s) & 1) != 0) - { - *err=U_ILLEGAL_ARGUMENT_ERROR; - return; - } - - /* output the target overflow buffer */ - if( cnv->charErrorBufferLength>0 && - ucnv_outputOverflowFromUnicode(cnv, target, targetLimit, &offsets, err) - ) { - /* U_BUFFER_OVERFLOW_ERROR */ - return; - } - /* *target may have moved, therefore stop using t */ - - if(!flush && s==sourceLimit && cnv->preFromULength>=0) { - /* the overflow buffer is emptied and there is no new input: we are done */ - return; - } - - /* - * Do not simply return with a buffer overflow error if - * !flush && t==targetLimit - * because it is possible that the source will not generate any output. - * For example, the skip callback may be called; - * it does not output anything. - */ - - /* prepare the converter arguments */ - args.converter=cnv; - args.flush=flush; - args.offsets=offsets; - args.source=s; - args.sourceLimit=sourceLimit; - args.target=*target; - args.targetLimit=targetLimit; - args.size=sizeof(args); - - _fromUnicodeWithCallback(&args, err); - - *source=args.source; - *target=args.target; -} - -/* ucnv_toUnicode() --------------------------------------------------------- */ - -static void -_toUnicodeWithCallback(UConverterToUnicodeArgs *pArgs, UErrorCode *err) { - UConverterToUnicode toUnicode; - UConverter *cnv; - const char *s; - UChar *t; - int32_t *offsets; - int32_t sourceIndex; - int32_t errorInputLength; - UBool converterSawEndOfInput, calledCallback; - - /* variables for m:n conversion */ - char replay[UCNV_EXT_MAX_BYTES]; - const char *realSource, *realSourceLimit; - int32_t realSourceIndex; - UBool realFlush; - - cnv=pArgs->converter; - s=pArgs->source; - t=pArgs->target; - offsets=pArgs->offsets; - - /* get the converter implementation function */ - sourceIndex=0; - if(offsets==NULL) { - toUnicode=cnv->sharedData->impl->toUnicode; - } else { - toUnicode=cnv->sharedData->impl->toUnicodeWithOffsets; - if(toUnicode==NULL) { - /* there is no WithOffsets implementation */ - toUnicode=cnv->sharedData->impl->toUnicode; - /* we will write -1 for each offset */ - sourceIndex=-1; - } - } - - if(cnv->preToULength>=0) { - /* normal mode */ - realSource=NULL; - - /* avoid compiler warnings - not otherwise necessary, and the values do not matter */ - realSourceLimit=NULL; - realFlush=FALSE; - realSourceIndex=0; - } else { - /* - * Previous m:n conversion stored source units from a partial match - * and failed to consume all of them. - * We need to "replay" them from a temporary buffer and convert them first. - */ - realSource=pArgs->source; - realSourceLimit=pArgs->sourceLimit; - realFlush=pArgs->flush; - realSourceIndex=sourceIndex; - - uprv_memcpy(replay, cnv->preToU, -cnv->preToULength); - pArgs->source=replay; - pArgs->sourceLimit=replay-cnv->preToULength; - pArgs->flush=FALSE; - sourceIndex=-1; - - cnv->preToULength=0; - } - - /* - * loop for conversion and error handling - * - * loop { - * convert - * loop { - * update offsets - * handle end of input - * handle errors/call callback - * } - * } - */ - for(;;) { - if(U_SUCCESS(*err)) { - /* convert */ - toUnicode(pArgs, err); - - /* - * set a flag for whether the converter - * successfully processed the end of the input - * - * need not check cnv->preToULength==0 because a replay (<0) will cause - * sflush && pArgs->source==pArgs->sourceLimit && - cnv->toULength==0); - } else { - /* handle error from getNextUChar() or ucnv_convertEx() */ - converterSawEndOfInput=FALSE; - } - - /* no callback called yet for this iteration */ - calledCallback=FALSE; - - /* no sourceIndex adjustment for conversion, only for callback output */ - errorInputLength=0; - - /* - * loop for offsets and error handling - * - * iterates at most 3 times: - * 1. to clean up after the conversion function - * 2. after the callback - * 3. after the callback again if there was truncated input - */ - for(;;) { - /* update offsets if we write any */ - if(offsets!=NULL) { - int32_t length=(int32_t)(pArgs->target-t); - if(length>0) { - _updateOffsets(offsets, length, sourceIndex, errorInputLength); - - /* - * if a converter handles offsets and updates the offsets - * pointer at the end, then pArgs->offset should not change - * here; - * however, some converters do not handle offsets at all - * (sourceIndex<0) or may not update the offsets pointer - */ - pArgs->offsets=offsets+=length; - } - - if(sourceIndex>=0) { - sourceIndex+=(int32_t)(pArgs->source-s); - } - } - - if(cnv->preToULength<0) { - /* - * switch the source to new replay units (cannot occur while replaying) - * after offset handling and before end-of-input and callback handling - */ - if(realSource==NULL) { - realSource=pArgs->source; - realSourceLimit=pArgs->sourceLimit; - realFlush=pArgs->flush; - realSourceIndex=sourceIndex; - - uprv_memcpy(replay, cnv->preToU, -cnv->preToULength); - pArgs->source=replay; - pArgs->sourceLimit=replay-cnv->preToULength; - pArgs->flush=FALSE; - if((sourceIndex+=cnv->preToULength)<0) { - sourceIndex=-1; - } - - cnv->preToULength=0; - } else { - /* see implementation note before _fromUnicodeWithCallback() */ - U_ASSERT(realSource==NULL); - *err=U_INTERNAL_PROGRAM_ERROR; - } - } - - /* update pointers */ - s=pArgs->source; - t=pArgs->target; - - if(U_SUCCESS(*err)) { - if(ssourceLimit) { - /* - * continue with the conversion loop while there is still input left - * (continue converting by breaking out of only the inner loop) - */ - break; - } else if(realSource!=NULL) { - /* switch back from replaying to the real source and continue */ - pArgs->source=realSource; - pArgs->sourceLimit=realSourceLimit; - pArgs->flush=realFlush; - sourceIndex=realSourceIndex; - - realSource=NULL; - break; - } else if(pArgs->flush && cnv->toULength>0) { - /* - * the entire input stream is consumed - * and there is a partial, truncated input sequence left - */ - - /* inject an error and continue with callback handling */ - *err=U_TRUNCATED_CHAR_FOUND; - calledCallback=FALSE; /* new error condition */ - } else { - /* input consumed */ - if(pArgs->flush) { - /* - * return to the conversion loop once more if the flush - * flag is set and the conversion function has not - * successfully processed the end of the input yet - * - * (continue converting by breaking out of only the inner loop) - */ - if(!converterSawEndOfInput) { - break; - } - - /* reset the converter without calling the callback function */ - _reset(cnv, UCNV_RESET_TO_UNICODE, FALSE); - } - - /* done successfully */ - return; - } - } - - /* U_FAILURE(*err) */ - { - UErrorCode e; - - if( calledCallback || - (e=*err)==U_BUFFER_OVERFLOW_ERROR || - (e!=U_INVALID_CHAR_FOUND && - e!=U_ILLEGAL_CHAR_FOUND && - e!=U_TRUNCATED_CHAR_FOUND && - e!=U_ILLEGAL_ESCAPE_SEQUENCE && - e!=U_UNSUPPORTED_ESCAPE_SEQUENCE) - ) { - /* - * the callback did not or cannot resolve the error: - * set output pointers and return - * - * the check for buffer overflow is redundant but it is - * a high-runner case and hopefully documents the intent - * well - * - * if we were replaying, then the replay buffer must be - * copied back into the UConverter - * and the real arguments must be restored - */ - if(realSource!=NULL) { - int32_t length; - - U_ASSERT(cnv->preToULength==0); - - length=(int32_t)(pArgs->sourceLimit-pArgs->source); - if(length>0) { - uprv_memcpy(cnv->preToU, pArgs->source, length); - cnv->preToULength=(int8_t)-length; - } - - pArgs->source=realSource; - pArgs->sourceLimit=realSourceLimit; - pArgs->flush=realFlush; - } - - return; - } - } - - /* copy toUBytes[] to invalidCharBuffer[] */ - errorInputLength=cnv->invalidCharLength=cnv->toULength; - if(errorInputLength>0) { - uprv_memcpy(cnv->invalidCharBuffer, cnv->toUBytes, errorInputLength); - } - - /* set the converter state to deal with the next character */ - cnv->toULength=0; - - /* call the callback function */ - if(cnv->toUCallbackReason==UCNV_ILLEGAL && *err==U_INVALID_CHAR_FOUND) { - cnv->toUCallbackReason = UCNV_UNASSIGNED; - } - cnv->fromCharErrorBehaviour(cnv->toUContext, pArgs, - cnv->invalidCharBuffer, errorInputLength, - cnv->toUCallbackReason, - err); - cnv->toUCallbackReason = UCNV_ILLEGAL; /* reset to default value */ - - /* - * loop back to the offset handling - * - * this flag will indicate after offset handling - * that a callback was called; - * if the callback did not resolve the error, then we return - */ - calledCallback=TRUE; - } - } -} - -/* - * Output the toUnicode overflow buffer. - * Call this function if(cnv->UCharErrorBufferLength>0). - * @return TRUE if overflow - */ -static UBool -ucnv_outputOverflowToUnicode(UConverter *cnv, - UChar **target, const UChar *targetLimit, - int32_t **pOffsets, - UErrorCode *err) { - int32_t *offsets; - UChar *overflow, *t; - int32_t i, length; - - t=*target; - if(pOffsets!=NULL) { - offsets=*pOffsets; - } else { - offsets=NULL; - } - - overflow=cnv->UCharErrorBuffer; - length=cnv->UCharErrorBufferLength; - i=0; - while(iUCharErrorBufferLength=(int8_t)j; - *target=t; - if(offsets!=NULL) { - *pOffsets=offsets; - } - *err=U_BUFFER_OVERFLOW_ERROR; - return TRUE; - } - - /* copy the overflow contents to the target */ - *t++=overflow[i++]; - if(offsets!=NULL) { - *offsets++=-1; /* no source index available for old output */ - } - } - - /* the overflow buffer is completely copied to the target */ - cnv->UCharErrorBufferLength=0; - *target=t; - if(offsets!=NULL) { - *pOffsets=offsets; - } - return FALSE; -} - -U_CAPI void U_EXPORT2 -ucnv_toUnicode(UConverter *cnv, - UChar **target, const UChar *targetLimit, - const char **source, const char *sourceLimit, - int32_t *offsets, - UBool flush, - UErrorCode *err) { - UConverterToUnicodeArgs args; - const char *s; - UChar *t; - - /* check parameters */ - if(err==NULL || U_FAILURE(*err)) { - return; - } - - if(cnv==NULL || target==NULL || source==NULL) { - *err=U_ILLEGAL_ARGUMENT_ERROR; - return; - } - - s=*source; - t=*target; - - if ((const void *)U_MAX_PTR(targetLimit) == (const void *)targetLimit) { - /* - Prevent code from going into an infinite loop in case we do hit this - limit. The limit pointer is expected to be on a UChar * boundary. - This also prevents the next argument check from failing. - */ - targetLimit = (const UChar *)(((const char *)targetLimit) - 1); - } - - /* - * All these conditions should never happen. - * - * 1) Make sure that the limits are >= to the address source or target - * - * 2) Make sure that the buffer sizes do not exceed the number range for - * int32_t because some functions use the size (in units or bytes) - * rather than comparing pointers, and because offsets are int32_t values. - * - * size_t is guaranteed to be unsigned and large enough for the job. - * - * Return with an error instead of adjusting the limits because we would - * not be able to maintain the semantics that either the source must be - * consumed or the target filled (unless an error occurs). - * An adjustment would be sourceLimit=t+0x7fffffff; for example. - * - * 3) Make sure that the user didn't incorrectly cast a UChar * pointer - * to a char * pointer and provide an incomplete UChar code unit. - */ - if (sourceLimit(size_t)0x7fffffff && sourceLimit>s) || - ((size_t)(targetLimit-t)>(size_t)0x3fffffff && targetLimit>t) || - (((const char *)targetLimit-(const char *)t) & 1) != 0 - ) { - *err=U_ILLEGAL_ARGUMENT_ERROR; - return; - } - - /* output the target overflow buffer */ - if( cnv->UCharErrorBufferLength>0 && - ucnv_outputOverflowToUnicode(cnv, target, targetLimit, &offsets, err) - ) { - /* U_BUFFER_OVERFLOW_ERROR */ - return; - } - /* *target may have moved, therefore stop using t */ - - if(!flush && s==sourceLimit && cnv->preToULength>=0) { - /* the overflow buffer is emptied and there is no new input: we are done */ - return; - } - - /* - * Do not simply return with a buffer overflow error if - * !flush && t==targetLimit - * because it is possible that the source will not generate any output. - * For example, the skip callback may be called; - * it does not output anything. - */ - - /* prepare the converter arguments */ - args.converter=cnv; - args.flush=flush; - args.offsets=offsets; - args.source=s; - args.sourceLimit=sourceLimit; - args.target=*target; - args.targetLimit=targetLimit; - args.size=sizeof(args); - - _toUnicodeWithCallback(&args, err); - - *source=args.source; - *target=args.target; -} - -/* ucnv_to/fromUChars() ----------------------------------------------------- */ - -U_CAPI int32_t U_EXPORT2 -ucnv_fromUChars(UConverter *cnv, - char *dest, int32_t destCapacity, - const UChar *src, int32_t srcLength, - UErrorCode *pErrorCode) { - const UChar *srcLimit; - char *originalDest, *destLimit; - int32_t destLength; - - /* check arguments */ - if(pErrorCode==NULL || U_FAILURE(*pErrorCode)) { - return 0; - } - - if( cnv==NULL || - destCapacity<0 || (destCapacity>0 && dest==NULL) || - srcLength<-1 || (srcLength!=0 && src==NULL) - ) { - *pErrorCode=U_ILLEGAL_ARGUMENT_ERROR; - return 0; - } - - /* initialize */ - ucnv_resetFromUnicode(cnv); - originalDest=dest; - if(srcLength==-1) { - srcLength=u_strlen(src); - } - if(srcLength>0) { - srcLimit=src+srcLength; - destLimit=dest+destCapacity; - - /* pin the destination limit to U_MAX_PTR; NULL check is for OS/400 */ - if(destLimit0 && dest==NULL) || - srcLength<-1 || (srcLength!=0 && src==NULL)) - { - *pErrorCode=U_ILLEGAL_ARGUMENT_ERROR; - return 0; - } - - /* initialize */ - ucnv_resetToUnicode(cnv); - originalDest=dest; - if(srcLength==-1) { - srcLength=(int32_t)uprv_strlen(src); - } - if(srcLength>0) { - srcLimit=src+srcLength; - destLimit=dest+destCapacity; - - /* pin the destination limit to U_MAX_PTR; NULL check is for OS/400 */ - if(destLimit(size_t)0x7fffffff && sourceLimit>s)) { - *err=U_ILLEGAL_ARGUMENT_ERROR; - return 0xffff; - } - - c=U_SENTINEL; - - /* flush the target overflow buffer */ - if(cnv->UCharErrorBufferLength>0) { - UChar *overflow; - - overflow=cnv->UCharErrorBuffer; - i=0; - length=cnv->UCharErrorBufferLength; - U16_NEXT(overflow, i, length, c); - - /* move the remaining overflow contents up to the beginning */ - if((cnv->UCharErrorBufferLength=(int8_t)(length-i))>0) { - uprv_memmove(cnv->UCharErrorBuffer, cnv->UCharErrorBuffer+i, - cnv->UCharErrorBufferLength*U_SIZEOF_UCHAR); - } - - if(!U16_IS_LEAD(c) || itoULength==0 && cnv->sharedData->impl->getNextUChar!=NULL) { - c=cnv->sharedData->impl->getNextUChar(&args, err); - *source=s=args.source; - if(*err==U_INDEX_OUTOFBOUNDS_ERROR) { - /* reset the converter without calling the callback function */ - _reset(cnv, UCNV_RESET_TO_UNICODE, FALSE); - return 0xffff; /* no output */ - } else if(U_SUCCESS(*err) && c>=0) { - return c; - /* - * else fall through to use _toUnicode() because - * UCNV_GET_NEXT_UCHAR_USE_TO_U: the native function did not want to handle it after all - * U_FAILURE: call _toUnicode() for callback handling (do not output c) - */ - } - } - - /* convert to one UChar in buffer[0], or handle getNextUChar() errors */ - _toUnicodeWithCallback(&args, err); - - if(*err==U_BUFFER_OVERFLOW_ERROR) { - *err=U_ZERO_ERROR; - } - - i=0; - length=(int32_t)(args.target-buffer); - } else { - /* write the lead surrogate from the overflow buffer */ - buffer[0]=(UChar)c; - args.target=buffer+1; - i=0; - length=1; - } - - /* buffer contents starts at i and ends before length */ - - if(U_FAILURE(*err)) { - c=0xffff; /* no output */ - } else if(length==0) { - /* no input or only state changes */ - *err=U_INDEX_OUTOFBOUNDS_ERROR; - /* no need to reset explicitly because _toUnicodeWithCallback() did it */ - c=0xffff; /* no output */ - } else { - c=buffer[0]; - i=1; - if(!U16_IS_LEAD(c)) { - /* consume c=buffer[0], done */ - } else { - /* got a lead surrogate, see if a trail surrogate follows */ - UChar c2; - - if(cnv->UCharErrorBufferLength>0) { - /* got overflow output from the conversion */ - if(U16_IS_TRAIL(c2=cnv->UCharErrorBuffer[0])) { - /* got a trail surrogate, too */ - c=U16_GET_SUPPLEMENTARY(c, c2); - - /* move the remaining overflow contents up to the beginning */ - if((--cnv->UCharErrorBufferLength)>0) { - uprv_memmove(cnv->UCharErrorBuffer, cnv->UCharErrorBuffer+1, - cnv->UCharErrorBufferLength*U_SIZEOF_UCHAR); - } - } else { - /* c is an unpaired lead surrogate, just return it */ - } - } else if(args.sourceUCharErrorBufferLength)>0) { - uprv_memmove(cnv->UCharErrorBuffer+delta, cnv->UCharErrorBuffer, - length*U_SIZEOF_UCHAR); - } - cnv->UCharErrorBufferLength=(int8_t)(length+delta); - - cnv->UCharErrorBuffer[0]=buffer[i++]; - if(delta>1) { - cnv->UCharErrorBuffer[1]=buffer[i]; - } - } - - *source=args.source; - return c; -} - -/* ucnv_convert() and siblings ---------------------------------------------- */ - -U_CAPI void U_EXPORT2 -ucnv_convertEx(UConverter *targetCnv, UConverter *sourceCnv, - char **target, const char *targetLimit, - const char **source, const char *sourceLimit, - UChar *pivotStart, UChar **pivotSource, - UChar **pivotTarget, const UChar *pivotLimit, - UBool reset, UBool flush, - UErrorCode *pErrorCode) { - UChar pivotBuffer[CHUNK_SIZE]; - const UChar *myPivotSource; - UChar *myPivotTarget; - const char *s; - char *t; - - UConverterToUnicodeArgs toUArgs; - UConverterFromUnicodeArgs fromUArgs; - UConverterConvert convert; - - /* error checking */ - if(pErrorCode==NULL || U_FAILURE(*pErrorCode)) { - return; - } - - if( targetCnv==NULL || sourceCnv==NULL || - source==NULL || *source==NULL || - target==NULL || *target==NULL || targetLimit==NULL - ) { - *pErrorCode=U_ILLEGAL_ARGUMENT_ERROR; - return; - } - - s=*source; - t=*target; - if((sourceLimit!=NULL && sourceLimit(size_t)0x7fffffff && sourceLimit>s)) || - ((size_t)(targetLimit-t)>(size_t)0x7fffffff && targetLimit>t) - ) { - *pErrorCode=U_ILLEGAL_ARGUMENT_ERROR; - return; - } - - if(pivotStart==NULL) { - if(!flush) { - /* streaming conversion requires an explicit pivot buffer */ - *pErrorCode=U_ILLEGAL_ARGUMENT_ERROR; - return; - } - - /* use the stack pivot buffer */ - myPivotSource=myPivotTarget=pivotStart=pivotBuffer; - pivotSource=(UChar **)&myPivotSource; - pivotTarget=&myPivotTarget; - pivotLimit=pivotBuffer+CHUNK_SIZE; - } else if( pivotStart>=pivotLimit || - pivotSource==NULL || *pivotSource==NULL || - pivotTarget==NULL || *pivotTarget==NULL || - pivotLimit==NULL - ) { - *pErrorCode=U_ILLEGAL_ARGUMENT_ERROR; - return; - } - - if(sourceLimit==NULL) { - /* get limit of single-byte-NUL-terminated source string */ - sourceLimit=uprv_strchr(*source, 0); - } - - if(reset) { - ucnv_resetToUnicode(sourceCnv); - ucnv_resetFromUnicode(targetCnv); - *pivotSource=*pivotTarget=pivotStart; - } else if(targetCnv->charErrorBufferLength>0) { - /* output the targetCnv overflow buffer */ - if(ucnv_outputOverflowFromUnicode(targetCnv, target, targetLimit, NULL, pErrorCode)) { - /* U_BUFFER_OVERFLOW_ERROR */ - return; - } - /* *target has moved, therefore stop using t */ - - if( !flush && - targetCnv->preFromULength>=0 && *pivotSource==*pivotTarget && - sourceCnv->UCharErrorBufferLength==0 && sourceCnv->preToULength>=0 && s==sourceLimit - ) { - /* the fromUnicode overflow buffer is emptied and there is no new input: we are done */ - return; - } - } - - /* Is direct-UTF-8 conversion available? */ - if( sourceCnv->sharedData->staticData->conversionType==UCNV_UTF8 && - targetCnv->sharedData->impl->fromUTF8!=NULL - ) { - convert=targetCnv->sharedData->impl->fromUTF8; - } else if( targetCnv->sharedData->staticData->conversionType==UCNV_UTF8 && - sourceCnv->sharedData->impl->toUTF8!=NULL - ) { - convert=sourceCnv->sharedData->impl->toUTF8; - } else { - convert=NULL; - } - - /* - * If direct-UTF-8 conversion is available, then we use a smaller - * pivot buffer for error handling and partial matches - * so that we quickly return to direct conversion. - * - * 32 is large enough for UCNV_EXT_MAX_UCHARS and UCNV_ERROR_BUFFER_LENGTH. - * - * We could reduce the pivot buffer size further, at the cost of - * buffer overflows from callbacks. - * The pivot buffer should not be smaller than the maximum number of - * fromUnicode extension table input UChars - * (for m:n conversion, see - * targetCnv->sharedData->mbcs.extIndexes[UCNV_EXT_COUNT_UCHARS]) - * or 2 for surrogate pairs. - * - * Too small a buffer can cause thrashing between pivoting and direct - * conversion, with function call overhead outweighing the benefits - * of direct conversion. - */ - if(convert!=NULL && (pivotLimit-pivotStart)>32) { - pivotLimit=pivotStart+32; - } - - /* prepare the converter arguments */ - fromUArgs.converter=targetCnv; - fromUArgs.flush=FALSE; - fromUArgs.offsets=NULL; - fromUArgs.target=*target; - fromUArgs.targetLimit=targetLimit; - fromUArgs.size=sizeof(fromUArgs); - - toUArgs.converter=sourceCnv; - toUArgs.flush=flush; - toUArgs.offsets=NULL; - toUArgs.source=s; - toUArgs.sourceLimit=sourceLimit; - toUArgs.targetLimit=pivotLimit; - toUArgs.size=sizeof(toUArgs); - - /* - * TODO: Consider separating this function into two functions, - * extracting exactly the conversion loop, - * for readability and to reduce the set of visible variables. - * - * Otherwise stop using s and t from here on. - */ - s=t=NULL; - - /* - * conversion loop - * - * The sequence of steps in the loop may appear backward, - * but the principle is simple: - * In the chain of - * source - sourceCnv overflow - pivot - targetCnv overflow - target - * empty out later buffers before refilling them from earlier ones. - * - * The targetCnv overflow buffer is flushed out only once before the loop. - */ - for(;;) { - /* - * if(pivot not empty or error or replay or flush fromUnicode) { - * fromUnicode(pivot -> target); - * } - * - * For pivoting conversion; and for direct conversion for - * error callback handling and flushing the replay buffer. - */ - if( *pivotSource<*pivotTarget || - U_FAILURE(*pErrorCode) || - targetCnv->preFromULength<0 || - fromUArgs.flush - ) { - fromUArgs.source=*pivotSource; - fromUArgs.sourceLimit=*pivotTarget; - _fromUnicodeWithCallback(&fromUArgs, pErrorCode); - if(U_FAILURE(*pErrorCode)) { - /* target overflow, or conversion error */ - *pivotSource=(UChar *)fromUArgs.source; - break; - } - - /* - * _fromUnicodeWithCallback() must have consumed the pivot contents - * (*pivotSource==*pivotTarget) since it returned with U_SUCCESS() - */ - } - - /* The pivot buffer is empty; reset it so we start at pivotStart. */ - *pivotSource=*pivotTarget=pivotStart; - - /* - * if(sourceCnv overflow buffer not empty) { - * move(sourceCnv overflow buffer -> pivot); - * continue; - * } - */ - /* output the sourceCnv overflow buffer */ - if(sourceCnv->UCharErrorBufferLength>0) { - if(ucnv_outputOverflowToUnicode(sourceCnv, pivotTarget, pivotLimit, NULL, pErrorCode)) { - /* U_BUFFER_OVERFLOW_ERROR */ - *pErrorCode=U_ZERO_ERROR; - } - continue; - } - - /* - * check for end of input and break if done - * - * Checking both flush and fromUArgs.flush ensures that the converters - * have been called with the flush flag set if the ucnv_convertEx() - * caller set it. - */ - if( toUArgs.source==sourceLimit && - sourceCnv->preToULength>=0 && sourceCnv->toULength==0 && - (!flush || fromUArgs.flush) - ) { - /* done successfully */ - break; - } - - /* - * use direct conversion if available - * but not if continuing a partial match - * or flushing the toUnicode replay buffer - */ - if(convert!=NULL && targetCnv->preFromUFirstCP<0 && sourceCnv->preToULength==0) { - if(*pErrorCode==U_USING_DEFAULT_WARNING) { - /* remove a warning that may be set by this function */ - *pErrorCode=U_ZERO_ERROR; - } - convert(&fromUArgs, &toUArgs, pErrorCode); - if(*pErrorCode==U_BUFFER_OVERFLOW_ERROR) { - break; - } else if(U_FAILURE(*pErrorCode)) { - if(sourceCnv->toULength>0) { - /* - * Fall through to calling _toUnicodeWithCallback() - * for callback handling. - * - * The pivot buffer will be reset with - * *pivotSource=*pivotTarget=pivotStart; - * which indicates a toUnicode error to the caller - * (*pivotSource==pivotStart shows no pivot UChars consumed). - */ - } else { - /* - * Indicate a fromUnicode error to the caller - * (*pivotSource>pivotStart shows some pivot UChars consumed). - */ - *pivotSource=*pivotTarget=pivotStart+1; - /* - * Loop around to calling _fromUnicodeWithCallbacks() - * for callback handling. - */ - continue; - } - } else if(*pErrorCode==U_USING_DEFAULT_WARNING) { - /* - * No error, but the implementation requested to temporarily - * fall back to pivoting. - */ - *pErrorCode=U_ZERO_ERROR; - /* - * The following else branches are almost identical to the end-of-input - * handling in _toUnicodeWithCallback(). - * Avoid calling it just for the end of input. - */ - } else if(flush && sourceCnv->toULength>0) { /* flush==toUArgs.flush */ - /* - * the entire input stream is consumed - * and there is a partial, truncated input sequence left - */ - - /* inject an error and continue with callback handling */ - *pErrorCode=U_TRUNCATED_CHAR_FOUND; - } else { - /* input consumed */ - if(flush) { - /* reset the converters without calling the callback functions */ - _reset(sourceCnv, UCNV_RESET_TO_UNICODE, FALSE); - _reset(targetCnv, UCNV_RESET_FROM_UNICODE, FALSE); - } - - /* done successfully */ - break; - } - } - - /* - * toUnicode(source -> pivot); - * - * For pivoting conversion; and for direct conversion for - * error callback handling, continuing partial matches - * and flushing the replay buffer. - * - * The pivot buffer is empty and reset. - */ - toUArgs.target=pivotStart; /* ==*pivotTarget */ - /* toUArgs.targetLimit=pivotLimit; already set before the loop */ - _toUnicodeWithCallback(&toUArgs, pErrorCode); - *pivotTarget=toUArgs.target; - if(*pErrorCode==U_BUFFER_OVERFLOW_ERROR) { - /* pivot overflow: continue with the conversion loop */ - *pErrorCode=U_ZERO_ERROR; - } else if(U_FAILURE(*pErrorCode) || (!flush && *pivotTarget==pivotStart)) { - /* conversion error, or there was nothing left to convert */ - break; - } - /* - * else: - * _toUnicodeWithCallback() wrote into the pivot buffer, - * continue with fromUnicode conversion. - * - * Set the fromUnicode flush flag if we flush and if toUnicode has - * processed the end of the input. - */ - if( flush && toUArgs.source==sourceLimit && - sourceCnv->preToULength>=0 && - sourceCnv->UCharErrorBufferLength==0 - ) { - fromUArgs.flush=TRUE; - } - } - - /* - * The conversion loop is exited when one of the following is true: - * - the entire source text has been converted successfully to the target buffer - * - a target buffer overflow occurred - * - a conversion error occurred - */ - - *source=toUArgs.source; - *target=fromUArgs.target; - - /* terminate the target buffer if possible */ - if(flush && U_SUCCESS(*pErrorCode)) { - if(*target!=targetLimit) { - **target=0; - if(*pErrorCode==U_STRING_NOT_TERMINATED_WARNING) { - *pErrorCode=U_ZERO_ERROR; - } - } else { - *pErrorCode=U_STRING_NOT_TERMINATED_WARNING; - } - } -} - -/* internal implementation of ucnv_convert() etc. with preflighting */ -static int32_t -ucnv_internalConvert(UConverter *outConverter, UConverter *inConverter, - char *target, int32_t targetCapacity, - const char *source, int32_t sourceLength, - UErrorCode *pErrorCode) { - UChar pivotBuffer[CHUNK_SIZE]; - UChar *pivot, *pivot2; - - char *myTarget; - const char *sourceLimit; - const char *targetLimit; - int32_t targetLength=0; - - /* set up */ - if(sourceLength<0) { - sourceLimit=uprv_strchr(source, 0); - } else { - sourceLimit=source+sourceLength; - } - - /* if there is no input data, we're done */ - if(source==sourceLimit) { - return u_terminateChars(target, targetCapacity, 0, pErrorCode); - } - - pivot=pivot2=pivotBuffer; - myTarget=target; - targetLength=0; - - if(targetCapacity>0) { - /* perform real conversion */ - targetLimit=target+targetCapacity; - ucnv_convertEx(outConverter, inConverter, - &myTarget, targetLimit, - &source, sourceLimit, - pivotBuffer, &pivot, &pivot2, pivotBuffer+CHUNK_SIZE, - FALSE, - TRUE, - pErrorCode); - targetLength=(int32_t)(myTarget-target); - } - - /* - * If the output buffer is exhausted (or we are only "preflighting"), we need to stop writing - * to it but continue the conversion in order to store in targetCapacity - * the number of bytes that was required. - */ - if(*pErrorCode==U_BUFFER_OVERFLOW_ERROR || targetCapacity==0) - { - char targetBuffer[CHUNK_SIZE]; - - targetLimit=targetBuffer+CHUNK_SIZE; - do { - *pErrorCode=U_ZERO_ERROR; - myTarget=targetBuffer; - ucnv_convertEx(outConverter, inConverter, - &myTarget, targetLimit, - &source, sourceLimit, - pivotBuffer, &pivot, &pivot2, pivotBuffer+CHUNK_SIZE, - FALSE, - TRUE, - pErrorCode); - targetLength+=(int32_t)(myTarget-targetBuffer); - } while(*pErrorCode==U_BUFFER_OVERFLOW_ERROR); - - /* done with preflighting, set warnings and errors as appropriate */ - return u_terminateChars(target, targetCapacity, targetLength, pErrorCode); - } - - /* no need to call u_terminateChars() because ucnv_convertEx() took care of that */ - return targetLength; -} - -U_CAPI int32_t U_EXPORT2 -ucnv_convert(const char *toConverterName, const char *fromConverterName, - char *target, int32_t targetCapacity, - const char *source, int32_t sourceLength, - UErrorCode *pErrorCode) { - UConverter in, out; /* stack-allocated */ - UConverter *inConverter, *outConverter; - int32_t targetLength; - - if(pErrorCode==NULL || U_FAILURE(*pErrorCode)) { - return 0; - } - - if( source==NULL || sourceLength<-1 || - targetCapacity<0 || (targetCapacity>0 && target==NULL) - ) { - *pErrorCode=U_ILLEGAL_ARGUMENT_ERROR; - return 0; - } - - /* if there is no input data, we're done */ - if(sourceLength==0 || (sourceLength<0 && *source==0)) { - return u_terminateChars(target, targetCapacity, 0, pErrorCode); - } - - /* create the converters */ - inConverter=ucnv_createConverter(&in, fromConverterName, pErrorCode); - if(U_FAILURE(*pErrorCode)) { - return 0; - } - - outConverter=ucnv_createConverter(&out, toConverterName, pErrorCode); - if(U_FAILURE(*pErrorCode)) { - ucnv_close(inConverter); - return 0; - } - - targetLength=ucnv_internalConvert(outConverter, inConverter, - target, targetCapacity, - source, sourceLength, - pErrorCode); - - ucnv_close(inConverter); - ucnv_close(outConverter); - - return targetLength; -} - -/* @internal */ -static int32_t -ucnv_convertAlgorithmic(UBool convertToAlgorithmic, - UConverterType algorithmicType, - UConverter *cnv, - char *target, int32_t targetCapacity, - const char *source, int32_t sourceLength, - UErrorCode *pErrorCode) { - UConverter algoConverterStatic; /* stack-allocated */ - UConverter *algoConverter, *to, *from; - int32_t targetLength; - - if(pErrorCode==NULL || U_FAILURE(*pErrorCode)) { - return 0; - } - - if( cnv==NULL || source==NULL || sourceLength<-1 || - targetCapacity<0 || (targetCapacity>0 && target==NULL) - ) { - *pErrorCode=U_ILLEGAL_ARGUMENT_ERROR; - return 0; - } - - /* if there is no input data, we're done */ - if(sourceLength==0 || (sourceLength<0 && *source==0)) { - return u_terminateChars(target, targetCapacity, 0, pErrorCode); - } - - /* create the algorithmic converter */ - algoConverter=ucnv_createAlgorithmicConverter(&algoConverterStatic, algorithmicType, - "", 0, pErrorCode); - if(U_FAILURE(*pErrorCode)) { - return 0; - } - - /* reset the other converter */ - if(convertToAlgorithmic) { - /* cnv->Unicode->algo */ - ucnv_resetToUnicode(cnv); - to=algoConverter; - from=cnv; - } else { - /* algo->Unicode->cnv */ - ucnv_resetFromUnicode(cnv); - from=algoConverter; - to=cnv; - } - - targetLength=ucnv_internalConvert(to, from, - target, targetCapacity, - source, sourceLength, - pErrorCode); - - ucnv_close(algoConverter); - - return targetLength; -} - -U_CAPI int32_t U_EXPORT2 -ucnv_toAlgorithmic(UConverterType algorithmicType, - UConverter *cnv, - char *target, int32_t targetCapacity, - const char *source, int32_t sourceLength, - UErrorCode *pErrorCode) { - return ucnv_convertAlgorithmic(TRUE, algorithmicType, cnv, - target, targetCapacity, - source, sourceLength, - pErrorCode); -} - -U_CAPI int32_t U_EXPORT2 -ucnv_fromAlgorithmic(UConverter *cnv, - UConverterType algorithmicType, - char *target, int32_t targetCapacity, - const char *source, int32_t sourceLength, - UErrorCode *pErrorCode) { - return ucnv_convertAlgorithmic(FALSE, algorithmicType, cnv, - target, targetCapacity, - source, sourceLength, - pErrorCode); -} - -U_CAPI UConverterType U_EXPORT2 -ucnv_getType(const UConverter* converter) -{ - int8_t type = converter->sharedData->staticData->conversionType; -#if !UCONFIG_NO_LEGACY_CONVERSION - if(type == UCNV_MBCS) { - return ucnv_MBCSGetType(converter); - } -#endif - return (UConverterType)type; -} - -U_CAPI void U_EXPORT2 -ucnv_getStarters(const UConverter* converter, - UBool starters[256], - UErrorCode* err) -{ - if (err == NULL || U_FAILURE(*err)) { - return; - } - - if(converter->sharedData->impl->getStarters != NULL) { - converter->sharedData->impl->getStarters(converter, starters, err); - } else { - *err = U_ILLEGAL_ARGUMENT_ERROR; - } -} - -static const UAmbiguousConverter *ucnv_getAmbiguous(const UConverter *cnv) -{ - UErrorCode errorCode; - const char *name; - int32_t i; - - if(cnv==NULL) { - return NULL; - } - - errorCode=U_ZERO_ERROR; - name=ucnv_getName(cnv, &errorCode); - if(U_FAILURE(errorCode)) { - return NULL; - } - - for(i=0; ivariant5c; - for(i=0; iuseFallback = usesFallback; -} - -U_CAPI UBool U_EXPORT2 -ucnv_usesFallback(const UConverter *cnv) -{ - return cnv->useFallback; -} - -U_CAPI void U_EXPORT2 -ucnv_getInvalidChars (const UConverter * converter, - char *errBytes, - int8_t * len, - UErrorCode * err) -{ - if (err == NULL || U_FAILURE(*err)) - { - return; - } - if (len == NULL || errBytes == NULL || converter == NULL) - { - *err = U_ILLEGAL_ARGUMENT_ERROR; - return; - } - if (*len < converter->invalidCharLength) - { - *err = U_INDEX_OUTOFBOUNDS_ERROR; - return; - } - if ((*len = converter->invalidCharLength) > 0) - { - uprv_memcpy (errBytes, converter->invalidCharBuffer, *len); - } -} - -U_CAPI void U_EXPORT2 -ucnv_getInvalidUChars (const UConverter * converter, - UChar *errChars, - int8_t * len, - UErrorCode * err) -{ - if (err == NULL || U_FAILURE(*err)) - { - return; - } - if (len == NULL || errChars == NULL || converter == NULL) - { - *err = U_ILLEGAL_ARGUMENT_ERROR; - return; - } - if (*len < converter->invalidUCharLength) - { - *err = U_INDEX_OUTOFBOUNDS_ERROR; - return; - } - if ((*len = converter->invalidUCharLength) > 0) - { - u_memcpy (errChars, converter->invalidUCharBuffer, *len); - } -} - -#define SIG_MAX_LEN 5 - -U_CAPI const char* U_EXPORT2 -ucnv_detectUnicodeSignature( const char* source, - int32_t sourceLength, - int32_t* signatureLength, - UErrorCode* pErrorCode) { - int32_t dummy; - - /* initial 0xa5 bytes: make sure that if we read preFromUFirstCP >= 0){ - return U16_LENGTH(cnv->preFromUFirstCP)+cnv->preFromULength ; - }else if(cnv->preFromULength < 0){ - return -cnv->preFromULength ; - }else if(cnv->fromUChar32 > 0){ - return 1; - } - return 0; - -} - -U_CAPI int32_t U_EXPORT2 -ucnv_toUCountPending(const UConverter* cnv, UErrorCode* status){ - - if(status == NULL || U_FAILURE(*status)){ - return -1; - } - if(cnv == NULL){ - *status = U_ILLEGAL_ARGUMENT_ERROR; - return -1; - } - - if(cnv->preToULength > 0){ - return cnv->preToULength ; - }else if(cnv->preToULength < 0){ - return -cnv->preToULength; - }else if(cnv->toULength > 0){ - return cnv->toULength; - } - return 0; -} - -U_CAPI UBool U_EXPORT2 -ucnv_isFixedWidth(UConverter *cnv, UErrorCode *status){ - if (U_FAILURE(*status)) { - return FALSE; - } - - if (cnv == NULL) { - *status = U_ILLEGAL_ARGUMENT_ERROR; - return FALSE; - } - - switch (ucnv_getType(cnv)) { - case UCNV_SBCS: - case UCNV_DBCS: - case UCNV_UTF32_BigEndian: - case UCNV_UTF32_LittleEndian: - case UCNV_UTF32: - case UCNV_US_ASCII: - return TRUE; - default: - return FALSE; - } -} -#endif - -/* - * Hey, Emacs, please set the following: - * - * Local Variables: - * indent-tabs-mode: nil - * End: - * - */ diff --git a/Build/source/libs/icu/icu-src/source/common/ucnv.cpp b/Build/source/libs/icu/icu-src/source/common/ucnv.cpp new file mode 100644 index 00000000000..ae3c63d31a4 --- /dev/null +++ b/Build/source/libs/icu/icu-src/source/common/ucnv.cpp @@ -0,0 +1,2918 @@ +// © 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html +/* +****************************************************************************** +* +* Copyright (C) 1998-2016, International Business Machines +* Corporation and others. All Rights Reserved. +* +****************************************************************************** +* +* ucnv.c: +* Implements APIs for the ICU's codeset conversion library; +* mostly calls through internal functions; +* created by Bertrand A. Damiba +* +* Modification History: +* +* Date Name Description +* 04/04/99 helena Fixed internal header inclusion. +* 05/09/00 helena Added implementation to handle fallback mappings. +* 06/20/2000 helena OS/400 port changes; mostly typecast. +*/ + +#include "unicode/utypes.h" + +#if !UCONFIG_NO_CONVERSION + +#include "unicode/ustring.h" +#include "unicode/ucnv.h" +#include "unicode/ucnv_err.h" +#include "unicode/uset.h" +#include "unicode/utf.h" +#include "unicode/utf16.h" +#include "putilimp.h" +#include "cmemory.h" +#include "cstring.h" +#include "uassert.h" +#include "utracimp.h" +#include "ustr_imp.h" +#include "ucnv_imp.h" +#include "ucnv_cnv.h" +#include "ucnv_bld.h" + +/* size of intermediate and preflighting buffers in ucnv_convert() */ +#define CHUNK_SIZE 1024 + +typedef struct UAmbiguousConverter { + const char *name; + const UChar variant5c; +} UAmbiguousConverter; + +static const UAmbiguousConverter ambiguousConverters[]={ + { "ibm-897_P100-1995", 0xa5 }, + { "ibm-942_P120-1999", 0xa5 }, + { "ibm-943_P130-1999", 0xa5 }, + { "ibm-946_P100-1995", 0xa5 }, + { "ibm-33722_P120-1999", 0xa5 }, + { "ibm-1041_P100-1995", 0xa5 }, + /*{ "ibm-54191_P100-2006", 0xa5 },*/ + /*{ "ibm-62383_P100-2007", 0xa5 },*/ + /*{ "ibm-891_P100-1995", 0x20a9 },*/ + { "ibm-944_P100-1995", 0x20a9 }, + { "ibm-949_P110-1999", 0x20a9 }, + { "ibm-1363_P110-1997", 0x20a9 }, + { "ISO_2022,locale=ko,version=0", 0x20a9 }, + { "ibm-1088_P100-1995", 0x20a9 } +}; + +/*Calls through createConverter */ +U_CAPI UConverter* U_EXPORT2 +ucnv_open (const char *name, + UErrorCode * err) +{ + UConverter *r; + + if (err == NULL || U_FAILURE (*err)) { + return NULL; + } + + r = ucnv_createConverter(NULL, name, err); + return r; +} + +U_CAPI UConverter* U_EXPORT2 +ucnv_openPackage (const char *packageName, const char *converterName, UErrorCode * err) +{ + return ucnv_createConverterFromPackage(packageName, converterName, err); +} + +/*Extracts the UChar* to a char* and calls through createConverter */ +U_CAPI UConverter* U_EXPORT2 +ucnv_openU (const UChar * name, + UErrorCode * err) +{ + char asciiName[UCNV_MAX_CONVERTER_NAME_LENGTH]; + + if (err == NULL || U_FAILURE(*err)) + return NULL; + if (name == NULL) + return ucnv_open (NULL, err); + if (u_strlen(name) >= UCNV_MAX_CONVERTER_NAME_LENGTH) + { + *err = U_ILLEGAL_ARGUMENT_ERROR; + return NULL; + } + return ucnv_open(u_austrcpy(asciiName, name), err); +} + +/* Copy the string that is represented by the UConverterPlatform enum + * @param platformString An output buffer + * @param platform An enum representing a platform + * @return the length of the copied string. + */ +static int32_t +ucnv_copyPlatformString(char *platformString, UConverterPlatform pltfrm) +{ + switch (pltfrm) + { + case UCNV_IBM: + uprv_strcpy(platformString, "ibm-"); + return 4; + case UCNV_UNKNOWN: + break; + } + + /* default to empty string */ + *platformString = 0; + return 0; +} + +/*Assumes a $platform-#codepage.$CONVERTER_FILE_EXTENSION scheme and calls + *through createConverter*/ +U_CAPI UConverter* U_EXPORT2 +ucnv_openCCSID (int32_t codepage, + UConverterPlatform platform, + UErrorCode * err) +{ + char myName[UCNV_MAX_CONVERTER_NAME_LENGTH]; + int32_t myNameLen; + + if (err == NULL || U_FAILURE (*err)) + return NULL; + + /* ucnv_copyPlatformString could return "ibm-" or "cp" */ + myNameLen = ucnv_copyPlatformString(myName, platform); + T_CString_integerToString(myName + myNameLen, codepage, 10); + + return ucnv_createConverter(NULL, myName, err); +} + +/* Creating a temporary stack-based object that can be used in one thread, +and created from a converter that is shared across threads. +*/ + +U_CAPI UConverter* U_EXPORT2 +ucnv_safeClone(const UConverter* cnv, void *stackBuffer, int32_t *pBufferSize, UErrorCode *status) +{ + UConverter *localConverter, *allocatedConverter; + int32_t stackBufferSize; + int32_t bufferSizeNeeded; + char *stackBufferChars = (char *)stackBuffer; + UErrorCode cbErr; + UConverterToUnicodeArgs toUArgs = { + sizeof(UConverterToUnicodeArgs), + TRUE, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + }; + UConverterFromUnicodeArgs fromUArgs = { + sizeof(UConverterFromUnicodeArgs), + TRUE, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + }; + + UTRACE_ENTRY_OC(UTRACE_UCNV_CLONE); + + if (status == NULL || U_FAILURE(*status)){ + UTRACE_EXIT_STATUS(status? *status: U_ILLEGAL_ARGUMENT_ERROR); + return NULL; + } + + if (cnv == NULL) { + *status = U_ILLEGAL_ARGUMENT_ERROR; + UTRACE_EXIT_STATUS(*status); + return NULL; + } + + UTRACE_DATA3(UTRACE_OPEN_CLOSE, "clone converter %s at %p into stackBuffer %p", + ucnv_getName(cnv, status), cnv, stackBuffer); + + if (cnv->sharedData->impl->safeClone != NULL) { + /* call the custom safeClone function for sizing */ + bufferSizeNeeded = 0; + cnv->sharedData->impl->safeClone(cnv, NULL, &bufferSizeNeeded, status); + if (U_FAILURE(*status)) { + UTRACE_EXIT_STATUS(*status); + return NULL; + } + } + else + { + /* inherent sizing */ + bufferSizeNeeded = sizeof(UConverter); + } + + if (pBufferSize == NULL) { + stackBufferSize = 1; + pBufferSize = &stackBufferSize; + } else { + stackBufferSize = *pBufferSize; + if (stackBufferSize <= 0){ /* 'preflighting' request - set needed size into *pBufferSize */ + *pBufferSize = bufferSizeNeeded; + UTRACE_EXIT_VALUE(bufferSizeNeeded); + return NULL; + } + } + + + /* Pointers on 64-bit platforms need to be aligned + * on a 64-bit boundary in memory. + */ + if (U_ALIGNMENT_OFFSET(stackBuffer) != 0) { + int32_t offsetUp = (int32_t)U_ALIGNMENT_OFFSET_UP(stackBufferChars); + if(stackBufferSize > offsetUp) { + stackBufferSize -= offsetUp; + stackBufferChars += offsetUp; + } else { + /* prevent using the stack buffer but keep the size > 0 so that we do not just preflight */ + stackBufferSize = 1; + } + } + + stackBuffer = (void *)stackBufferChars; + + /* Now, see if we must allocate any memory */ + if (stackBufferSize < bufferSizeNeeded || stackBuffer == NULL) + { + /* allocate one here...*/ + localConverter = allocatedConverter = (UConverter *) uprv_malloc (bufferSizeNeeded); + + if(localConverter == NULL) { + *status = U_MEMORY_ALLOCATION_ERROR; + UTRACE_EXIT_STATUS(*status); + return NULL; + } + *status = U_SAFECLONE_ALLOCATED_WARNING; + + /* record the fact that memory was allocated */ + *pBufferSize = bufferSizeNeeded; + } else { + /* just use the stack buffer */ + localConverter = (UConverter*) stackBuffer; + allocatedConverter = NULL; + } + + uprv_memset(localConverter, 0, bufferSizeNeeded); + + /* Copy initial state */ + uprv_memcpy(localConverter, cnv, sizeof(UConverter)); + localConverter->isCopyLocal = localConverter->isExtraLocal = FALSE; + + /* copy the substitution string */ + if (cnv->subChars == (uint8_t *)cnv->subUChars) { + localConverter->subChars = (uint8_t *)localConverter->subUChars; + } else { + localConverter->subChars = (uint8_t *)uprv_malloc(UCNV_ERROR_BUFFER_LENGTH * U_SIZEOF_UCHAR); + if (localConverter->subChars == NULL) { + uprv_free(allocatedConverter); + UTRACE_EXIT_STATUS(*status); + return NULL; + } + uprv_memcpy(localConverter->subChars, cnv->subChars, UCNV_ERROR_BUFFER_LENGTH * U_SIZEOF_UCHAR); + } + + /* now either call the safeclone fcn or not */ + if (cnv->sharedData->impl->safeClone != NULL) { + /* call the custom safeClone function */ + localConverter = cnv->sharedData->impl->safeClone(cnv, localConverter, pBufferSize, status); + } + + if(localConverter==NULL || U_FAILURE(*status)) { + if (allocatedConverter != NULL && allocatedConverter->subChars != (uint8_t *)allocatedConverter->subUChars) { + uprv_free(allocatedConverter->subChars); + } + uprv_free(allocatedConverter); + UTRACE_EXIT_STATUS(*status); + return NULL; + } + + /* increment refcount of shared data if needed */ + if (cnv->sharedData->isReferenceCounted) { + ucnv_incrementRefCount(cnv->sharedData); + } + + if(localConverter == (UConverter*)stackBuffer) { + /* we're using user provided data - set to not destroy */ + localConverter->isCopyLocal = TRUE; + } + + /* allow callback functions to handle any memory allocation */ + toUArgs.converter = fromUArgs.converter = localConverter; + cbErr = U_ZERO_ERROR; + cnv->fromCharErrorBehaviour(cnv->toUContext, &toUArgs, NULL, 0, UCNV_CLONE, &cbErr); + cbErr = U_ZERO_ERROR; + cnv->fromUCharErrorBehaviour(cnv->fromUContext, &fromUArgs, NULL, 0, 0, UCNV_CLONE, &cbErr); + + UTRACE_EXIT_PTR_STATUS(localConverter, *status); + return localConverter; +} + + + +/*Decreases the reference counter in the shared immutable section of the object + *and frees the mutable part*/ + +U_CAPI void U_EXPORT2 +ucnv_close (UConverter * converter) +{ + UErrorCode errorCode = U_ZERO_ERROR; + + UTRACE_ENTRY_OC(UTRACE_UCNV_CLOSE); + + if (converter == NULL) + { + UTRACE_EXIT(); + return; + } + + UTRACE_DATA3(UTRACE_OPEN_CLOSE, "close converter %s at %p, isCopyLocal=%b", + ucnv_getName(converter, &errorCode), converter, converter->isCopyLocal); + + /* In order to speed up the close, only call the callbacks when they have been changed. + This performance check will only work when the callbacks are set within a shared library + or from user code that statically links this code. */ + /* first, notify the callback functions that the converter is closed */ + if (converter->fromCharErrorBehaviour != UCNV_TO_U_DEFAULT_CALLBACK) { + UConverterToUnicodeArgs toUArgs = { + sizeof(UConverterToUnicodeArgs), + TRUE, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + }; + + toUArgs.converter = converter; + errorCode = U_ZERO_ERROR; + converter->fromCharErrorBehaviour(converter->toUContext, &toUArgs, NULL, 0, UCNV_CLOSE, &errorCode); + } + if (converter->fromUCharErrorBehaviour != UCNV_FROM_U_DEFAULT_CALLBACK) { + UConverterFromUnicodeArgs fromUArgs = { + sizeof(UConverterFromUnicodeArgs), + TRUE, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + }; + fromUArgs.converter = converter; + errorCode = U_ZERO_ERROR; + converter->fromUCharErrorBehaviour(converter->fromUContext, &fromUArgs, NULL, 0, 0, UCNV_CLOSE, &errorCode); + } + + if (converter->sharedData->impl->close != NULL) { + converter->sharedData->impl->close(converter); + } + + if (converter->subChars != (uint8_t *)converter->subUChars) { + uprv_free(converter->subChars); + } + + if (converter->sharedData->isReferenceCounted) { + ucnv_unloadSharedDataIfReady(converter->sharedData); + } + + if(!converter->isCopyLocal){ + uprv_free(converter); + } + + UTRACE_EXIT(); +} + +/*returns a single Name from the list, will return NULL if out of bounds + */ +U_CAPI const char* U_EXPORT2 +ucnv_getAvailableName (int32_t n) +{ + if (0 <= n && n <= 0xffff) { + UErrorCode err = U_ZERO_ERROR; + const char *name = ucnv_bld_getAvailableConverter((uint16_t)n, &err); + if (U_SUCCESS(err)) { + return name; + } + } + return NULL; +} + +U_CAPI int32_t U_EXPORT2 +ucnv_countAvailable () +{ + UErrorCode err = U_ZERO_ERROR; + return ucnv_bld_countAvailableConverters(&err); +} + +U_CAPI void U_EXPORT2 +ucnv_getSubstChars (const UConverter * converter, + char *mySubChar, + int8_t * len, + UErrorCode * err) +{ + if (U_FAILURE (*err)) + return; + + if (converter->subCharLen <= 0) { + /* Unicode string or empty string from ucnv_setSubstString(). */ + *len = 0; + return; + } + + if (*len < converter->subCharLen) /*not enough space in subChars */ + { + *err = U_INDEX_OUTOFBOUNDS_ERROR; + return; + } + + uprv_memcpy (mySubChar, converter->subChars, converter->subCharLen); /*fills in the subchars */ + *len = converter->subCharLen; /*store # of bytes copied to buffer */ +} + +U_CAPI void U_EXPORT2 +ucnv_setSubstChars (UConverter * converter, + const char *mySubChar, + int8_t len, + UErrorCode * err) +{ + if (U_FAILURE (*err)) + return; + + /*Makes sure that the subChar is within the codepages char length boundaries */ + if ((len > converter->sharedData->staticData->maxBytesPerChar) + || (len < converter->sharedData->staticData->minBytesPerChar)) + { + *err = U_ILLEGAL_ARGUMENT_ERROR; + return; + } + + uprv_memcpy (converter->subChars, mySubChar, len); /*copies the subchars */ + converter->subCharLen = len; /*sets the new len */ + + /* + * There is currently (2001Feb) no separate API to set/get subChar1. + * In order to always have subChar written after it is explicitly set, + * we set subChar1 to 0. + */ + converter->subChar1 = 0; + + return; +} + +U_CAPI void U_EXPORT2 +ucnv_setSubstString(UConverter *cnv, + const UChar *s, + int32_t length, + UErrorCode *err) { + UAlignedMemory cloneBuffer[U_CNV_SAFECLONE_BUFFERSIZE / sizeof(UAlignedMemory) + 1]; + char chars[UCNV_ERROR_BUFFER_LENGTH]; + + UConverter *clone; + uint8_t *subChars; + int32_t cloneSize, length8; + + /* Let the following functions check all arguments. */ + cloneSize = sizeof(cloneBuffer); + clone = ucnv_safeClone(cnv, cloneBuffer, &cloneSize, err); + ucnv_setFromUCallBack(clone, UCNV_FROM_U_CALLBACK_STOP, NULL, NULL, NULL, err); + length8 = ucnv_fromUChars(clone, chars, (int32_t)sizeof(chars), s, length, err); + ucnv_close(clone); + if (U_FAILURE(*err)) { + return; + } + + if (cnv->sharedData->impl->writeSub == NULL +#if !UCONFIG_NO_LEGACY_CONVERSION + || (cnv->sharedData->staticData->conversionType == UCNV_MBCS && + ucnv_MBCSGetType(cnv) != UCNV_EBCDIC_STATEFUL) +#endif + ) { + /* The converter is not stateful. Store the charset bytes as a fixed string. */ + subChars = (uint8_t *)chars; + } else { + /* + * The converter has a non-default writeSub() function, indicating + * that it is stateful. + * Store the Unicode string for on-the-fly conversion for correct + * state handling. + */ + if (length > UCNV_ERROR_BUFFER_LENGTH) { + /* + * Should not occur. The converter should output at least one byte + * per UChar, which means that ucnv_fromUChars() should catch all + * overflows. + */ + *err = U_BUFFER_OVERFLOW_ERROR; + return; + } + subChars = (uint8_t *)s; + if (length < 0) { + length = u_strlen(s); + } + length8 = length * U_SIZEOF_UCHAR; + } + + /* + * For storing the substitution string, select either the small buffer inside + * UConverter or allocate a subChars buffer. + */ + if (length8 > UCNV_MAX_SUBCHAR_LEN) { + /* Use a separate buffer for the string. Outside UConverter to not make it too large. */ + if (cnv->subChars == (uint8_t *)cnv->subUChars) { + /* Allocate a new buffer for the string. */ + cnv->subChars = (uint8_t *)uprv_malloc(UCNV_ERROR_BUFFER_LENGTH * U_SIZEOF_UCHAR); + if (cnv->subChars == NULL) { + cnv->subChars = (uint8_t *)cnv->subUChars; + *err = U_MEMORY_ALLOCATION_ERROR; + return; + } + uprv_memset(cnv->subChars, 0, UCNV_ERROR_BUFFER_LENGTH * U_SIZEOF_UCHAR); + } + } + + /* Copy the substitution string into the UConverter or its subChars buffer. */ + if (length8 == 0) { + cnv->subCharLen = 0; + } else { + uprv_memcpy(cnv->subChars, subChars, length8); + if (subChars == (uint8_t *)chars) { + cnv->subCharLen = (int8_t)length8; + } else /* subChars == s */ { + cnv->subCharLen = (int8_t)-length; + } + } + + /* See comment in ucnv_setSubstChars(). */ + cnv->subChar1 = 0; +} + +/*resets the internal states of a converter + *goal : have the same behaviour than a freshly created converter + */ +static void _reset(UConverter *converter, UConverterResetChoice choice, + UBool callCallback) { + if(converter == NULL) { + return; + } + + if(callCallback) { + /* first, notify the callback functions that the converter is reset */ + UErrorCode errorCode; + + if(choice<=UCNV_RESET_TO_UNICODE && converter->fromCharErrorBehaviour != UCNV_TO_U_DEFAULT_CALLBACK) { + UConverterToUnicodeArgs toUArgs = { + sizeof(UConverterToUnicodeArgs), + TRUE, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + }; + toUArgs.converter = converter; + errorCode = U_ZERO_ERROR; + converter->fromCharErrorBehaviour(converter->toUContext, &toUArgs, NULL, 0, UCNV_RESET, &errorCode); + } + if(choice!=UCNV_RESET_TO_UNICODE && converter->fromUCharErrorBehaviour != UCNV_FROM_U_DEFAULT_CALLBACK) { + UConverterFromUnicodeArgs fromUArgs = { + sizeof(UConverterFromUnicodeArgs), + TRUE, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + }; + fromUArgs.converter = converter; + errorCode = U_ZERO_ERROR; + converter->fromUCharErrorBehaviour(converter->fromUContext, &fromUArgs, NULL, 0, 0, UCNV_RESET, &errorCode); + } + } + + /* now reset the converter itself */ + if(choice<=UCNV_RESET_TO_UNICODE) { + converter->toUnicodeStatus = converter->sharedData->toUnicodeStatus; + converter->mode = 0; + converter->toULength = 0; + converter->invalidCharLength = converter->UCharErrorBufferLength = 0; + converter->preToULength = 0; + } + if(choice!=UCNV_RESET_TO_UNICODE) { + converter->fromUnicodeStatus = 0; + converter->fromUChar32 = 0; + converter->invalidUCharLength = converter->charErrorBufferLength = 0; + converter->preFromUFirstCP = U_SENTINEL; + converter->preFromULength = 0; + } + + if (converter->sharedData->impl->reset != NULL) { + /* call the custom reset function */ + converter->sharedData->impl->reset(converter, choice); + } +} + +U_CAPI void U_EXPORT2 +ucnv_reset(UConverter *converter) +{ + _reset(converter, UCNV_RESET_BOTH, TRUE); +} + +U_CAPI void U_EXPORT2 +ucnv_resetToUnicode(UConverter *converter) +{ + _reset(converter, UCNV_RESET_TO_UNICODE, TRUE); +} + +U_CAPI void U_EXPORT2 +ucnv_resetFromUnicode(UConverter *converter) +{ + _reset(converter, UCNV_RESET_FROM_UNICODE, TRUE); +} + +U_CAPI int8_t U_EXPORT2 +ucnv_getMaxCharSize (const UConverter * converter) +{ + return converter->maxBytesPerUChar; +} + + +U_CAPI int8_t U_EXPORT2 +ucnv_getMinCharSize (const UConverter * converter) +{ + return converter->sharedData->staticData->minBytesPerChar; +} + +U_CAPI const char* U_EXPORT2 +ucnv_getName (const UConverter * converter, UErrorCode * err) + +{ + if (U_FAILURE (*err)) + return NULL; + if(converter->sharedData->impl->getName){ + const char* temp= converter->sharedData->impl->getName(converter); + if(temp) + return temp; + } + return converter->sharedData->staticData->name; +} + +U_CAPI int32_t U_EXPORT2 +ucnv_getCCSID(const UConverter * converter, + UErrorCode * err) +{ + int32_t ccsid; + if (U_FAILURE (*err)) + return -1; + + ccsid = converter->sharedData->staticData->codepage; + if (ccsid == 0) { + /* Rare case. This is for cases like gb18030, + which doesn't have an IBM canonical name, but does have an IBM alias. */ + const char *standardName = ucnv_getStandardName(ucnv_getName(converter, err), "IBM", err); + if (U_SUCCESS(*err) && standardName) { + const char *ccsidStr = uprv_strchr(standardName, '-'); + if (ccsidStr) { + ccsid = (int32_t)atol(ccsidStr+1); /* +1 to skip '-' */ + } + } + } + return ccsid; +} + + +U_CAPI UConverterPlatform U_EXPORT2 +ucnv_getPlatform (const UConverter * converter, + UErrorCode * err) +{ + if (U_FAILURE (*err)) + return UCNV_UNKNOWN; + + return (UConverterPlatform)converter->sharedData->staticData->platform; +} + +U_CAPI void U_EXPORT2 + ucnv_getToUCallBack (const UConverter * converter, + UConverterToUCallback *action, + const void **context) +{ + *action = converter->fromCharErrorBehaviour; + *context = converter->toUContext; +} + +U_CAPI void U_EXPORT2 + ucnv_getFromUCallBack (const UConverter * converter, + UConverterFromUCallback *action, + const void **context) +{ + *action = converter->fromUCharErrorBehaviour; + *context = converter->fromUContext; +} + +U_CAPI void U_EXPORT2 +ucnv_setToUCallBack (UConverter * converter, + UConverterToUCallback newAction, + const void* newContext, + UConverterToUCallback *oldAction, + const void** oldContext, + UErrorCode * err) +{ + if (U_FAILURE (*err)) + return; + if (oldAction) *oldAction = converter->fromCharErrorBehaviour; + converter->fromCharErrorBehaviour = newAction; + if (oldContext) *oldContext = converter->toUContext; + converter->toUContext = newContext; +} + +U_CAPI void U_EXPORT2 +ucnv_setFromUCallBack (UConverter * converter, + UConverterFromUCallback newAction, + const void* newContext, + UConverterFromUCallback *oldAction, + const void** oldContext, + UErrorCode * err) +{ + if (U_FAILURE (*err)) + return; + if (oldAction) *oldAction = converter->fromUCharErrorBehaviour; + converter->fromUCharErrorBehaviour = newAction; + if (oldContext) *oldContext = converter->fromUContext; + converter->fromUContext = newContext; +} + +static void +_updateOffsets(int32_t *offsets, int32_t length, + int32_t sourceIndex, int32_t errorInputLength) { + int32_t *limit; + int32_t delta, offset; + + if(sourceIndex>=0) { + /* + * adjust each offset by adding the previous sourceIndex + * minus the length of the input sequence that caused an + * error, if any + */ + delta=sourceIndex-errorInputLength; + } else { + /* + * set each offset to -1 because this conversion function + * does not handle offsets + */ + delta=-1; + } + + limit=offsets+length; + if(delta==0) { + /* most common case, nothing to do */ + } else if(delta>0) { + /* add the delta to each offset (but not if the offset is <0) */ + while(offsets=0) { + *offsets=offset+delta; + } + ++offsets; + } + } else /* delta<0 */ { + /* + * set each offset to -1 because this conversion function + * does not handle offsets + * or the error input sequence started in a previous buffer + */ + while(offsetsconverter; + s=pArgs->source; + t=pArgs->target; + offsets=pArgs->offsets; + + /* get the converter implementation function */ + sourceIndex=0; + if(offsets==NULL) { + fromUnicode=cnv->sharedData->impl->fromUnicode; + } else { + fromUnicode=cnv->sharedData->impl->fromUnicodeWithOffsets; + if(fromUnicode==NULL) { + /* there is no WithOffsets implementation */ + fromUnicode=cnv->sharedData->impl->fromUnicode; + /* we will write -1 for each offset */ + sourceIndex=-1; + } + } + + if(cnv->preFromULength>=0) { + /* normal mode */ + realSource=NULL; + + /* avoid compiler warnings - not otherwise necessary, and the values do not matter */ + realSourceLimit=NULL; + realFlush=FALSE; + realSourceIndex=0; + } else { + /* + * Previous m:n conversion stored source units from a partial match + * and failed to consume all of them. + * We need to "replay" them from a temporary buffer and convert them first. + */ + realSource=pArgs->source; + realSourceLimit=pArgs->sourceLimit; + realFlush=pArgs->flush; + realSourceIndex=sourceIndex; + + uprv_memcpy(replay, cnv->preFromU, -cnv->preFromULength*U_SIZEOF_UCHAR); + pArgs->source=replay; + pArgs->sourceLimit=replay-cnv->preFromULength; + pArgs->flush=FALSE; + sourceIndex=-1; + + cnv->preFromULength=0; + } + + /* + * loop for conversion and error handling + * + * loop { + * convert + * loop { + * update offsets + * handle end of input + * handle errors/call callback + * } + * } + */ + for(;;) { + if(U_SUCCESS(*err)) { + /* convert */ + fromUnicode(pArgs, err); + + /* + * set a flag for whether the converter + * successfully processed the end of the input + * + * need not check cnv->preFromULength==0 because a replay (<0) will cause + * sflush && pArgs->source==pArgs->sourceLimit && + cnv->fromUChar32==0); + } else { + /* handle error from ucnv_convertEx() */ + converterSawEndOfInput=FALSE; + } + + /* no callback called yet for this iteration */ + calledCallback=FALSE; + + /* no sourceIndex adjustment for conversion, only for callback output */ + errorInputLength=0; + + /* + * loop for offsets and error handling + * + * iterates at most 3 times: + * 1. to clean up after the conversion function + * 2. after the callback + * 3. after the callback again if there was truncated input + */ + for(;;) { + /* update offsets if we write any */ + if(offsets!=NULL) { + int32_t length=(int32_t)(pArgs->target-t); + if(length>0) { + _updateOffsets(offsets, length, sourceIndex, errorInputLength); + + /* + * if a converter handles offsets and updates the offsets + * pointer at the end, then pArgs->offset should not change + * here; + * however, some converters do not handle offsets at all + * (sourceIndex<0) or may not update the offsets pointer + */ + pArgs->offsets=offsets+=length; + } + + if(sourceIndex>=0) { + sourceIndex+=(int32_t)(pArgs->source-s); + } + } + + if(cnv->preFromULength<0) { + /* + * switch the source to new replay units (cannot occur while replaying) + * after offset handling and before end-of-input and callback handling + */ + if(realSource==NULL) { + realSource=pArgs->source; + realSourceLimit=pArgs->sourceLimit; + realFlush=pArgs->flush; + realSourceIndex=sourceIndex; + + uprv_memcpy(replay, cnv->preFromU, -cnv->preFromULength*U_SIZEOF_UCHAR); + pArgs->source=replay; + pArgs->sourceLimit=replay-cnv->preFromULength; + pArgs->flush=FALSE; + if((sourceIndex+=cnv->preFromULength)<0) { + sourceIndex=-1; + } + + cnv->preFromULength=0; + } else { + /* see implementation note before _fromUnicodeWithCallback() */ + U_ASSERT(realSource==NULL); + *err=U_INTERNAL_PROGRAM_ERROR; + } + } + + /* update pointers */ + s=pArgs->source; + t=pArgs->target; + + if(U_SUCCESS(*err)) { + if(ssourceLimit) { + /* + * continue with the conversion loop while there is still input left + * (continue converting by breaking out of only the inner loop) + */ + break; + } else if(realSource!=NULL) { + /* switch back from replaying to the real source and continue */ + pArgs->source=realSource; + pArgs->sourceLimit=realSourceLimit; + pArgs->flush=realFlush; + sourceIndex=realSourceIndex; + + realSource=NULL; + break; + } else if(pArgs->flush && cnv->fromUChar32!=0) { + /* + * the entire input stream is consumed + * and there is a partial, truncated input sequence left + */ + + /* inject an error and continue with callback handling */ + *err=U_TRUNCATED_CHAR_FOUND; + calledCallback=FALSE; /* new error condition */ + } else { + /* input consumed */ + if(pArgs->flush) { + /* + * return to the conversion loop once more if the flush + * flag is set and the conversion function has not + * successfully processed the end of the input yet + * + * (continue converting by breaking out of only the inner loop) + */ + if(!converterSawEndOfInput) { + break; + } + + /* reset the converter without calling the callback function */ + _reset(cnv, UCNV_RESET_FROM_UNICODE, FALSE); + } + + /* done successfully */ + return; + } + } + + /* U_FAILURE(*err) */ + { + UErrorCode e; + + if( calledCallback || + (e=*err)==U_BUFFER_OVERFLOW_ERROR || + (e!=U_INVALID_CHAR_FOUND && + e!=U_ILLEGAL_CHAR_FOUND && + e!=U_TRUNCATED_CHAR_FOUND) + ) { + /* + * the callback did not or cannot resolve the error: + * set output pointers and return + * + * the check for buffer overflow is redundant but it is + * a high-runner case and hopefully documents the intent + * well + * + * if we were replaying, then the replay buffer must be + * copied back into the UConverter + * and the real arguments must be restored + */ + if(realSource!=NULL) { + int32_t length; + + U_ASSERT(cnv->preFromULength==0); + + length=(int32_t)(pArgs->sourceLimit-pArgs->source); + if(length>0) { + u_memcpy(cnv->preFromU, pArgs->source, length); + cnv->preFromULength=(int8_t)-length; + } + + pArgs->source=realSource; + pArgs->sourceLimit=realSourceLimit; + pArgs->flush=realFlush; + } + + return; + } + } + + /* callback handling */ + { + UChar32 codePoint; + + /* get and write the code point */ + codePoint=cnv->fromUChar32; + errorInputLength=0; + U16_APPEND_UNSAFE(cnv->invalidUCharBuffer, errorInputLength, codePoint); + cnv->invalidUCharLength=(int8_t)errorInputLength; + + /* set the converter state to deal with the next character */ + cnv->fromUChar32=0; + + /* call the callback function */ + cnv->fromUCharErrorBehaviour(cnv->fromUContext, pArgs, + cnv->invalidUCharBuffer, errorInputLength, codePoint, + *err==U_INVALID_CHAR_FOUND ? UCNV_UNASSIGNED : UCNV_ILLEGAL, + err); + } + + /* + * loop back to the offset handling + * + * this flag will indicate after offset handling + * that a callback was called; + * if the callback did not resolve the error, then we return + */ + calledCallback=TRUE; + } + } +} + +/* + * Output the fromUnicode overflow buffer. + * Call this function if(cnv->charErrorBufferLength>0). + * @return TRUE if overflow + */ +static UBool +ucnv_outputOverflowFromUnicode(UConverter *cnv, + char **target, const char *targetLimit, + int32_t **pOffsets, + UErrorCode *err) { + int32_t *offsets; + char *overflow, *t; + int32_t i, length; + + t=*target; + if(pOffsets!=NULL) { + offsets=*pOffsets; + } else { + offsets=NULL; + } + + overflow=(char *)cnv->charErrorBuffer; + length=cnv->charErrorBufferLength; + i=0; + while(icharErrorBufferLength=(int8_t)j; + *target=t; + if(offsets!=NULL) { + *pOffsets=offsets; + } + *err=U_BUFFER_OVERFLOW_ERROR; + return TRUE; + } + + /* copy the overflow contents to the target */ + *t++=overflow[i++]; + if(offsets!=NULL) { + *offsets++=-1; /* no source index available for old output */ + } + } + + /* the overflow buffer is completely copied to the target */ + cnv->charErrorBufferLength=0; + *target=t; + if(offsets!=NULL) { + *pOffsets=offsets; + } + return FALSE; +} + +U_CAPI void U_EXPORT2 +ucnv_fromUnicode(UConverter *cnv, + char **target, const char *targetLimit, + const UChar **source, const UChar *sourceLimit, + int32_t *offsets, + UBool flush, + UErrorCode *err) { + UConverterFromUnicodeArgs args; + const UChar *s; + char *t; + + /* check parameters */ + if(err==NULL || U_FAILURE(*err)) { + return; + } + + if(cnv==NULL || target==NULL || source==NULL) { + *err=U_ILLEGAL_ARGUMENT_ERROR; + return; + } + + s=*source; + t=*target; + + if ((const void *)U_MAX_PTR(sourceLimit) == (const void *)sourceLimit) { + /* + Prevent code from going into an infinite loop in case we do hit this + limit. The limit pointer is expected to be on a UChar * boundary. + This also prevents the next argument check from failing. + */ + sourceLimit = (const UChar *)(((const char *)sourceLimit) - 1); + } + + /* + * All these conditions should never happen. + * + * 1) Make sure that the limits are >= to the address source or target + * + * 2) Make sure that the buffer sizes do not exceed the number range for + * int32_t because some functions use the size (in units or bytes) + * rather than comparing pointers, and because offsets are int32_t values. + * + * size_t is guaranteed to be unsigned and large enough for the job. + * + * Return with an error instead of adjusting the limits because we would + * not be able to maintain the semantics that either the source must be + * consumed or the target filled (unless an error occurs). + * An adjustment would be targetLimit=t+0x7fffffff; for example. + * + * 3) Make sure that the user didn't incorrectly cast a UChar * pointer + * to a char * pointer and provide an incomplete UChar code unit. + */ + if (sourceLimit(size_t)0x3fffffff && sourceLimit>s) || + ((size_t)(targetLimit-t)>(size_t)0x7fffffff && targetLimit>t) || + (((const char *)sourceLimit-(const char *)s) & 1) != 0) + { + *err=U_ILLEGAL_ARGUMENT_ERROR; + return; + } + + /* output the target overflow buffer */ + if( cnv->charErrorBufferLength>0 && + ucnv_outputOverflowFromUnicode(cnv, target, targetLimit, &offsets, err) + ) { + /* U_BUFFER_OVERFLOW_ERROR */ + return; + } + /* *target may have moved, therefore stop using t */ + + if(!flush && s==sourceLimit && cnv->preFromULength>=0) { + /* the overflow buffer is emptied and there is no new input: we are done */ + return; + } + + /* + * Do not simply return with a buffer overflow error if + * !flush && t==targetLimit + * because it is possible that the source will not generate any output. + * For example, the skip callback may be called; + * it does not output anything. + */ + + /* prepare the converter arguments */ + args.converter=cnv; + args.flush=flush; + args.offsets=offsets; + args.source=s; + args.sourceLimit=sourceLimit; + args.target=*target; + args.targetLimit=targetLimit; + args.size=sizeof(args); + + _fromUnicodeWithCallback(&args, err); + + *source=args.source; + *target=args.target; +} + +/* ucnv_toUnicode() --------------------------------------------------------- */ + +static void +_toUnicodeWithCallback(UConverterToUnicodeArgs *pArgs, UErrorCode *err) { + UConverterToUnicode toUnicode; + UConverter *cnv; + const char *s; + UChar *t; + int32_t *offsets; + int32_t sourceIndex; + int32_t errorInputLength; + UBool converterSawEndOfInput, calledCallback; + + /* variables for m:n conversion */ + char replay[UCNV_EXT_MAX_BYTES]; + const char *realSource, *realSourceLimit; + int32_t realSourceIndex; + UBool realFlush; + + cnv=pArgs->converter; + s=pArgs->source; + t=pArgs->target; + offsets=pArgs->offsets; + + /* get the converter implementation function */ + sourceIndex=0; + if(offsets==NULL) { + toUnicode=cnv->sharedData->impl->toUnicode; + } else { + toUnicode=cnv->sharedData->impl->toUnicodeWithOffsets; + if(toUnicode==NULL) { + /* there is no WithOffsets implementation */ + toUnicode=cnv->sharedData->impl->toUnicode; + /* we will write -1 for each offset */ + sourceIndex=-1; + } + } + + if(cnv->preToULength>=0) { + /* normal mode */ + realSource=NULL; + + /* avoid compiler warnings - not otherwise necessary, and the values do not matter */ + realSourceLimit=NULL; + realFlush=FALSE; + realSourceIndex=0; + } else { + /* + * Previous m:n conversion stored source units from a partial match + * and failed to consume all of them. + * We need to "replay" them from a temporary buffer and convert them first. + */ + realSource=pArgs->source; + realSourceLimit=pArgs->sourceLimit; + realFlush=pArgs->flush; + realSourceIndex=sourceIndex; + + uprv_memcpy(replay, cnv->preToU, -cnv->preToULength); + pArgs->source=replay; + pArgs->sourceLimit=replay-cnv->preToULength; + pArgs->flush=FALSE; + sourceIndex=-1; + + cnv->preToULength=0; + } + + /* + * loop for conversion and error handling + * + * loop { + * convert + * loop { + * update offsets + * handle end of input + * handle errors/call callback + * } + * } + */ + for(;;) { + if(U_SUCCESS(*err)) { + /* convert */ + toUnicode(pArgs, err); + + /* + * set a flag for whether the converter + * successfully processed the end of the input + * + * need not check cnv->preToULength==0 because a replay (<0) will cause + * sflush && pArgs->source==pArgs->sourceLimit && + cnv->toULength==0); + } else { + /* handle error from getNextUChar() or ucnv_convertEx() */ + converterSawEndOfInput=FALSE; + } + + /* no callback called yet for this iteration */ + calledCallback=FALSE; + + /* no sourceIndex adjustment for conversion, only for callback output */ + errorInputLength=0; + + /* + * loop for offsets and error handling + * + * iterates at most 3 times: + * 1. to clean up after the conversion function + * 2. after the callback + * 3. after the callback again if there was truncated input + */ + for(;;) { + /* update offsets if we write any */ + if(offsets!=NULL) { + int32_t length=(int32_t)(pArgs->target-t); + if(length>0) { + _updateOffsets(offsets, length, sourceIndex, errorInputLength); + + /* + * if a converter handles offsets and updates the offsets + * pointer at the end, then pArgs->offset should not change + * here; + * however, some converters do not handle offsets at all + * (sourceIndex<0) or may not update the offsets pointer + */ + pArgs->offsets=offsets+=length; + } + + if(sourceIndex>=0) { + sourceIndex+=(int32_t)(pArgs->source-s); + } + } + + if(cnv->preToULength<0) { + /* + * switch the source to new replay units (cannot occur while replaying) + * after offset handling and before end-of-input and callback handling + */ + if(realSource==NULL) { + realSource=pArgs->source; + realSourceLimit=pArgs->sourceLimit; + realFlush=pArgs->flush; + realSourceIndex=sourceIndex; + + uprv_memcpy(replay, cnv->preToU, -cnv->preToULength); + pArgs->source=replay; + pArgs->sourceLimit=replay-cnv->preToULength; + pArgs->flush=FALSE; + if((sourceIndex+=cnv->preToULength)<0) { + sourceIndex=-1; + } + + cnv->preToULength=0; + } else { + /* see implementation note before _fromUnicodeWithCallback() */ + U_ASSERT(realSource==NULL); + *err=U_INTERNAL_PROGRAM_ERROR; + } + } + + /* update pointers */ + s=pArgs->source; + t=pArgs->target; + + if(U_SUCCESS(*err)) { + if(ssourceLimit) { + /* + * continue with the conversion loop while there is still input left + * (continue converting by breaking out of only the inner loop) + */ + break; + } else if(realSource!=NULL) { + /* switch back from replaying to the real source and continue */ + pArgs->source=realSource; + pArgs->sourceLimit=realSourceLimit; + pArgs->flush=realFlush; + sourceIndex=realSourceIndex; + + realSource=NULL; + break; + } else if(pArgs->flush && cnv->toULength>0) { + /* + * the entire input stream is consumed + * and there is a partial, truncated input sequence left + */ + + /* inject an error and continue with callback handling */ + *err=U_TRUNCATED_CHAR_FOUND; + calledCallback=FALSE; /* new error condition */ + } else { + /* input consumed */ + if(pArgs->flush) { + /* + * return to the conversion loop once more if the flush + * flag is set and the conversion function has not + * successfully processed the end of the input yet + * + * (continue converting by breaking out of only the inner loop) + */ + if(!converterSawEndOfInput) { + break; + } + + /* reset the converter without calling the callback function */ + _reset(cnv, UCNV_RESET_TO_UNICODE, FALSE); + } + + /* done successfully */ + return; + } + } + + /* U_FAILURE(*err) */ + { + UErrorCode e; + + if( calledCallback || + (e=*err)==U_BUFFER_OVERFLOW_ERROR || + (e!=U_INVALID_CHAR_FOUND && + e!=U_ILLEGAL_CHAR_FOUND && + e!=U_TRUNCATED_CHAR_FOUND && + e!=U_ILLEGAL_ESCAPE_SEQUENCE && + e!=U_UNSUPPORTED_ESCAPE_SEQUENCE) + ) { + /* + * the callback did not or cannot resolve the error: + * set output pointers and return + * + * the check for buffer overflow is redundant but it is + * a high-runner case and hopefully documents the intent + * well + * + * if we were replaying, then the replay buffer must be + * copied back into the UConverter + * and the real arguments must be restored + */ + if(realSource!=NULL) { + int32_t length; + + U_ASSERT(cnv->preToULength==0); + + length=(int32_t)(pArgs->sourceLimit-pArgs->source); + if(length>0) { + uprv_memcpy(cnv->preToU, pArgs->source, length); + cnv->preToULength=(int8_t)-length; + } + + pArgs->source=realSource; + pArgs->sourceLimit=realSourceLimit; + pArgs->flush=realFlush; + } + + return; + } + } + + /* copy toUBytes[] to invalidCharBuffer[] */ + errorInputLength=cnv->invalidCharLength=cnv->toULength; + if(errorInputLength>0) { + uprv_memcpy(cnv->invalidCharBuffer, cnv->toUBytes, errorInputLength); + } + + /* set the converter state to deal with the next character */ + cnv->toULength=0; + + /* call the callback function */ + if(cnv->toUCallbackReason==UCNV_ILLEGAL && *err==U_INVALID_CHAR_FOUND) { + cnv->toUCallbackReason = UCNV_UNASSIGNED; + } + cnv->fromCharErrorBehaviour(cnv->toUContext, pArgs, + cnv->invalidCharBuffer, errorInputLength, + cnv->toUCallbackReason, + err); + cnv->toUCallbackReason = UCNV_ILLEGAL; /* reset to default value */ + + /* + * loop back to the offset handling + * + * this flag will indicate after offset handling + * that a callback was called; + * if the callback did not resolve the error, then we return + */ + calledCallback=TRUE; + } + } +} + +/* + * Output the toUnicode overflow buffer. + * Call this function if(cnv->UCharErrorBufferLength>0). + * @return TRUE if overflow + */ +static UBool +ucnv_outputOverflowToUnicode(UConverter *cnv, + UChar **target, const UChar *targetLimit, + int32_t **pOffsets, + UErrorCode *err) { + int32_t *offsets; + UChar *overflow, *t; + int32_t i, length; + + t=*target; + if(pOffsets!=NULL) { + offsets=*pOffsets; + } else { + offsets=NULL; + } + + overflow=cnv->UCharErrorBuffer; + length=cnv->UCharErrorBufferLength; + i=0; + while(iUCharErrorBufferLength=(int8_t)j; + *target=t; + if(offsets!=NULL) { + *pOffsets=offsets; + } + *err=U_BUFFER_OVERFLOW_ERROR; + return TRUE; + } + + /* copy the overflow contents to the target */ + *t++=overflow[i++]; + if(offsets!=NULL) { + *offsets++=-1; /* no source index available for old output */ + } + } + + /* the overflow buffer is completely copied to the target */ + cnv->UCharErrorBufferLength=0; + *target=t; + if(offsets!=NULL) { + *pOffsets=offsets; + } + return FALSE; +} + +U_CAPI void U_EXPORT2 +ucnv_toUnicode(UConverter *cnv, + UChar **target, const UChar *targetLimit, + const char **source, const char *sourceLimit, + int32_t *offsets, + UBool flush, + UErrorCode *err) { + UConverterToUnicodeArgs args; + const char *s; + UChar *t; + + /* check parameters */ + if(err==NULL || U_FAILURE(*err)) { + return; + } + + if(cnv==NULL || target==NULL || source==NULL) { + *err=U_ILLEGAL_ARGUMENT_ERROR; + return; + } + + s=*source; + t=*target; + + if ((const void *)U_MAX_PTR(targetLimit) == (const void *)targetLimit) { + /* + Prevent code from going into an infinite loop in case we do hit this + limit. The limit pointer is expected to be on a UChar * boundary. + This also prevents the next argument check from failing. + */ + targetLimit = (const UChar *)(((const char *)targetLimit) - 1); + } + + /* + * All these conditions should never happen. + * + * 1) Make sure that the limits are >= to the address source or target + * + * 2) Make sure that the buffer sizes do not exceed the number range for + * int32_t because some functions use the size (in units or bytes) + * rather than comparing pointers, and because offsets are int32_t values. + * + * size_t is guaranteed to be unsigned and large enough for the job. + * + * Return with an error instead of adjusting the limits because we would + * not be able to maintain the semantics that either the source must be + * consumed or the target filled (unless an error occurs). + * An adjustment would be sourceLimit=t+0x7fffffff; for example. + * + * 3) Make sure that the user didn't incorrectly cast a UChar * pointer + * to a char * pointer and provide an incomplete UChar code unit. + */ + if (sourceLimit(size_t)0x7fffffff && sourceLimit>s) || + ((size_t)(targetLimit-t)>(size_t)0x3fffffff && targetLimit>t) || + (((const char *)targetLimit-(const char *)t) & 1) != 0 + ) { + *err=U_ILLEGAL_ARGUMENT_ERROR; + return; + } + + /* output the target overflow buffer */ + if( cnv->UCharErrorBufferLength>0 && + ucnv_outputOverflowToUnicode(cnv, target, targetLimit, &offsets, err) + ) { + /* U_BUFFER_OVERFLOW_ERROR */ + return; + } + /* *target may have moved, therefore stop using t */ + + if(!flush && s==sourceLimit && cnv->preToULength>=0) { + /* the overflow buffer is emptied and there is no new input: we are done */ + return; + } + + /* + * Do not simply return with a buffer overflow error if + * !flush && t==targetLimit + * because it is possible that the source will not generate any output. + * For example, the skip callback may be called; + * it does not output anything. + */ + + /* prepare the converter arguments */ + args.converter=cnv; + args.flush=flush; + args.offsets=offsets; + args.source=s; + args.sourceLimit=sourceLimit; + args.target=*target; + args.targetLimit=targetLimit; + args.size=sizeof(args); + + _toUnicodeWithCallback(&args, err); + + *source=args.source; + *target=args.target; +} + +/* ucnv_to/fromUChars() ----------------------------------------------------- */ + +U_CAPI int32_t U_EXPORT2 +ucnv_fromUChars(UConverter *cnv, + char *dest, int32_t destCapacity, + const UChar *src, int32_t srcLength, + UErrorCode *pErrorCode) { + const UChar *srcLimit; + char *originalDest, *destLimit; + int32_t destLength; + + /* check arguments */ + if(pErrorCode==NULL || U_FAILURE(*pErrorCode)) { + return 0; + } + + if( cnv==NULL || + destCapacity<0 || (destCapacity>0 && dest==NULL) || + srcLength<-1 || (srcLength!=0 && src==NULL) + ) { + *pErrorCode=U_ILLEGAL_ARGUMENT_ERROR; + return 0; + } + + /* initialize */ + ucnv_resetFromUnicode(cnv); + originalDest=dest; + if(srcLength==-1) { + srcLength=u_strlen(src); + } + if(srcLength>0) { + srcLimit=src+srcLength; + destLimit=dest+destCapacity; + + /* pin the destination limit to U_MAX_PTR; NULL check is for OS/400 */ + if(destLimit0 && dest==NULL) || + srcLength<-1 || (srcLength!=0 && src==NULL)) + { + *pErrorCode=U_ILLEGAL_ARGUMENT_ERROR; + return 0; + } + + /* initialize */ + ucnv_resetToUnicode(cnv); + originalDest=dest; + if(srcLength==-1) { + srcLength=(int32_t)uprv_strlen(src); + } + if(srcLength>0) { + srcLimit=src+srcLength; + destLimit=dest+destCapacity; + + /* pin the destination limit to U_MAX_PTR; NULL check is for OS/400 */ + if(destLimit(size_t)0x7fffffff && sourceLimit>s)) { + *err=U_ILLEGAL_ARGUMENT_ERROR; + return 0xffff; + } + + c=U_SENTINEL; + + /* flush the target overflow buffer */ + if(cnv->UCharErrorBufferLength>0) { + UChar *overflow; + + overflow=cnv->UCharErrorBuffer; + i=0; + length=cnv->UCharErrorBufferLength; + U16_NEXT(overflow, i, length, c); + + /* move the remaining overflow contents up to the beginning */ + if((cnv->UCharErrorBufferLength=(int8_t)(length-i))>0) { + uprv_memmove(cnv->UCharErrorBuffer, cnv->UCharErrorBuffer+i, + cnv->UCharErrorBufferLength*U_SIZEOF_UCHAR); + } + + if(!U16_IS_LEAD(c) || itoULength==0 && cnv->sharedData->impl->getNextUChar!=NULL) { + c=cnv->sharedData->impl->getNextUChar(&args, err); + *source=s=args.source; + if(*err==U_INDEX_OUTOFBOUNDS_ERROR) { + /* reset the converter without calling the callback function */ + _reset(cnv, UCNV_RESET_TO_UNICODE, FALSE); + return 0xffff; /* no output */ + } else if(U_SUCCESS(*err) && c>=0) { + return c; + /* + * else fall through to use _toUnicode() because + * UCNV_GET_NEXT_UCHAR_USE_TO_U: the native function did not want to handle it after all + * U_FAILURE: call _toUnicode() for callback handling (do not output c) + */ + } + } + + /* convert to one UChar in buffer[0], or handle getNextUChar() errors */ + _toUnicodeWithCallback(&args, err); + + if(*err==U_BUFFER_OVERFLOW_ERROR) { + *err=U_ZERO_ERROR; + } + + i=0; + length=(int32_t)(args.target-buffer); + } else { + /* write the lead surrogate from the overflow buffer */ + buffer[0]=(UChar)c; + args.target=buffer+1; + i=0; + length=1; + } + + /* buffer contents starts at i and ends before length */ + + if(U_FAILURE(*err)) { + c=0xffff; /* no output */ + } else if(length==0) { + /* no input or only state changes */ + *err=U_INDEX_OUTOFBOUNDS_ERROR; + /* no need to reset explicitly because _toUnicodeWithCallback() did it */ + c=0xffff; /* no output */ + } else { + c=buffer[0]; + i=1; + if(!U16_IS_LEAD(c)) { + /* consume c=buffer[0], done */ + } else { + /* got a lead surrogate, see if a trail surrogate follows */ + UChar c2; + + if(cnv->UCharErrorBufferLength>0) { + /* got overflow output from the conversion */ + if(U16_IS_TRAIL(c2=cnv->UCharErrorBuffer[0])) { + /* got a trail surrogate, too */ + c=U16_GET_SUPPLEMENTARY(c, c2); + + /* move the remaining overflow contents up to the beginning */ + if((--cnv->UCharErrorBufferLength)>0) { + uprv_memmove(cnv->UCharErrorBuffer, cnv->UCharErrorBuffer+1, + cnv->UCharErrorBufferLength*U_SIZEOF_UCHAR); + } + } else { + /* c is an unpaired lead surrogate, just return it */ + } + } else if(args.sourceUCharErrorBufferLength)>0) { + uprv_memmove(cnv->UCharErrorBuffer+delta, cnv->UCharErrorBuffer, + length*U_SIZEOF_UCHAR); + } + cnv->UCharErrorBufferLength=(int8_t)(length+delta); + + cnv->UCharErrorBuffer[0]=buffer[i++]; + if(delta>1) { + cnv->UCharErrorBuffer[1]=buffer[i]; + } + } + + *source=args.source; + return c; +} + +/* ucnv_convert() and siblings ---------------------------------------------- */ + +U_CAPI void U_EXPORT2 +ucnv_convertEx(UConverter *targetCnv, UConverter *sourceCnv, + char **target, const char *targetLimit, + const char **source, const char *sourceLimit, + UChar *pivotStart, UChar **pivotSource, + UChar **pivotTarget, const UChar *pivotLimit, + UBool reset, UBool flush, + UErrorCode *pErrorCode) { + UChar pivotBuffer[CHUNK_SIZE]; + const UChar *myPivotSource; + UChar *myPivotTarget; + const char *s; + char *t; + + UConverterToUnicodeArgs toUArgs; + UConverterFromUnicodeArgs fromUArgs; + UConverterConvert convert; + + /* error checking */ + if(pErrorCode==NULL || U_FAILURE(*pErrorCode)) { + return; + } + + if( targetCnv==NULL || sourceCnv==NULL || + source==NULL || *source==NULL || + target==NULL || *target==NULL || targetLimit==NULL + ) { + *pErrorCode=U_ILLEGAL_ARGUMENT_ERROR; + return; + } + + s=*source; + t=*target; + if((sourceLimit!=NULL && sourceLimit(size_t)0x7fffffff && sourceLimit>s)) || + ((size_t)(targetLimit-t)>(size_t)0x7fffffff && targetLimit>t) + ) { + *pErrorCode=U_ILLEGAL_ARGUMENT_ERROR; + return; + } + + if(pivotStart==NULL) { + if(!flush) { + /* streaming conversion requires an explicit pivot buffer */ + *pErrorCode=U_ILLEGAL_ARGUMENT_ERROR; + return; + } + + /* use the stack pivot buffer */ + myPivotSource=myPivotTarget=pivotStart=pivotBuffer; + pivotSource=(UChar **)&myPivotSource; + pivotTarget=&myPivotTarget; + pivotLimit=pivotBuffer+CHUNK_SIZE; + } else if( pivotStart>=pivotLimit || + pivotSource==NULL || *pivotSource==NULL || + pivotTarget==NULL || *pivotTarget==NULL || + pivotLimit==NULL + ) { + *pErrorCode=U_ILLEGAL_ARGUMENT_ERROR; + return; + } + + if(sourceLimit==NULL) { + /* get limit of single-byte-NUL-terminated source string */ + sourceLimit=uprv_strchr(*source, 0); + } + + if(reset) { + ucnv_resetToUnicode(sourceCnv); + ucnv_resetFromUnicode(targetCnv); + *pivotSource=*pivotTarget=pivotStart; + } else if(targetCnv->charErrorBufferLength>0) { + /* output the targetCnv overflow buffer */ + if(ucnv_outputOverflowFromUnicode(targetCnv, target, targetLimit, NULL, pErrorCode)) { + /* U_BUFFER_OVERFLOW_ERROR */ + return; + } + /* *target has moved, therefore stop using t */ + + if( !flush && + targetCnv->preFromULength>=0 && *pivotSource==*pivotTarget && + sourceCnv->UCharErrorBufferLength==0 && sourceCnv->preToULength>=0 && s==sourceLimit + ) { + /* the fromUnicode overflow buffer is emptied and there is no new input: we are done */ + return; + } + } + + /* Is direct-UTF-8 conversion available? */ + if( sourceCnv->sharedData->staticData->conversionType==UCNV_UTF8 && + targetCnv->sharedData->impl->fromUTF8!=NULL + ) { + convert=targetCnv->sharedData->impl->fromUTF8; + } else if( targetCnv->sharedData->staticData->conversionType==UCNV_UTF8 && + sourceCnv->sharedData->impl->toUTF8!=NULL + ) { + convert=sourceCnv->sharedData->impl->toUTF8; + } else { + convert=NULL; + } + + /* + * If direct-UTF-8 conversion is available, then we use a smaller + * pivot buffer for error handling and partial matches + * so that we quickly return to direct conversion. + * + * 32 is large enough for UCNV_EXT_MAX_UCHARS and UCNV_ERROR_BUFFER_LENGTH. + * + * We could reduce the pivot buffer size further, at the cost of + * buffer overflows from callbacks. + * The pivot buffer should not be smaller than the maximum number of + * fromUnicode extension table input UChars + * (for m:n conversion, see + * targetCnv->sharedData->mbcs.extIndexes[UCNV_EXT_COUNT_UCHARS]) + * or 2 for surrogate pairs. + * + * Too small a buffer can cause thrashing between pivoting and direct + * conversion, with function call overhead outweighing the benefits + * of direct conversion. + */ + if(convert!=NULL && (pivotLimit-pivotStart)>32) { + pivotLimit=pivotStart+32; + } + + /* prepare the converter arguments */ + fromUArgs.converter=targetCnv; + fromUArgs.flush=FALSE; + fromUArgs.offsets=NULL; + fromUArgs.target=*target; + fromUArgs.targetLimit=targetLimit; + fromUArgs.size=sizeof(fromUArgs); + + toUArgs.converter=sourceCnv; + toUArgs.flush=flush; + toUArgs.offsets=NULL; + toUArgs.source=s; + toUArgs.sourceLimit=sourceLimit; + toUArgs.targetLimit=pivotLimit; + toUArgs.size=sizeof(toUArgs); + + /* + * TODO: Consider separating this function into two functions, + * extracting exactly the conversion loop, + * for readability and to reduce the set of visible variables. + * + * Otherwise stop using s and t from here on. + */ + s=t=NULL; + + /* + * conversion loop + * + * The sequence of steps in the loop may appear backward, + * but the principle is simple: + * In the chain of + * source - sourceCnv overflow - pivot - targetCnv overflow - target + * empty out later buffers before refilling them from earlier ones. + * + * The targetCnv overflow buffer is flushed out only once before the loop. + */ + for(;;) { + /* + * if(pivot not empty or error or replay or flush fromUnicode) { + * fromUnicode(pivot -> target); + * } + * + * For pivoting conversion; and for direct conversion for + * error callback handling and flushing the replay buffer. + */ + if( *pivotSource<*pivotTarget || + U_FAILURE(*pErrorCode) || + targetCnv->preFromULength<0 || + fromUArgs.flush + ) { + fromUArgs.source=*pivotSource; + fromUArgs.sourceLimit=*pivotTarget; + _fromUnicodeWithCallback(&fromUArgs, pErrorCode); + if(U_FAILURE(*pErrorCode)) { + /* target overflow, or conversion error */ + *pivotSource=(UChar *)fromUArgs.source; + break; + } + + /* + * _fromUnicodeWithCallback() must have consumed the pivot contents + * (*pivotSource==*pivotTarget) since it returned with U_SUCCESS() + */ + } + + /* The pivot buffer is empty; reset it so we start at pivotStart. */ + *pivotSource=*pivotTarget=pivotStart; + + /* + * if(sourceCnv overflow buffer not empty) { + * move(sourceCnv overflow buffer -> pivot); + * continue; + * } + */ + /* output the sourceCnv overflow buffer */ + if(sourceCnv->UCharErrorBufferLength>0) { + if(ucnv_outputOverflowToUnicode(sourceCnv, pivotTarget, pivotLimit, NULL, pErrorCode)) { + /* U_BUFFER_OVERFLOW_ERROR */ + *pErrorCode=U_ZERO_ERROR; + } + continue; + } + + /* + * check for end of input and break if done + * + * Checking both flush and fromUArgs.flush ensures that the converters + * have been called with the flush flag set if the ucnv_convertEx() + * caller set it. + */ + if( toUArgs.source==sourceLimit && + sourceCnv->preToULength>=0 && sourceCnv->toULength==0 && + (!flush || fromUArgs.flush) + ) { + /* done successfully */ + break; + } + + /* + * use direct conversion if available + * but not if continuing a partial match + * or flushing the toUnicode replay buffer + */ + if(convert!=NULL && targetCnv->preFromUFirstCP<0 && sourceCnv->preToULength==0) { + if(*pErrorCode==U_USING_DEFAULT_WARNING) { + /* remove a warning that may be set by this function */ + *pErrorCode=U_ZERO_ERROR; + } + convert(&fromUArgs, &toUArgs, pErrorCode); + if(*pErrorCode==U_BUFFER_OVERFLOW_ERROR) { + break; + } else if(U_FAILURE(*pErrorCode)) { + if(sourceCnv->toULength>0) { + /* + * Fall through to calling _toUnicodeWithCallback() + * for callback handling. + * + * The pivot buffer will be reset with + * *pivotSource=*pivotTarget=pivotStart; + * which indicates a toUnicode error to the caller + * (*pivotSource==pivotStart shows no pivot UChars consumed). + */ + } else { + /* + * Indicate a fromUnicode error to the caller + * (*pivotSource>pivotStart shows some pivot UChars consumed). + */ + *pivotSource=*pivotTarget=pivotStart+1; + /* + * Loop around to calling _fromUnicodeWithCallbacks() + * for callback handling. + */ + continue; + } + } else if(*pErrorCode==U_USING_DEFAULT_WARNING) { + /* + * No error, but the implementation requested to temporarily + * fall back to pivoting. + */ + *pErrorCode=U_ZERO_ERROR; + /* + * The following else branches are almost identical to the end-of-input + * handling in _toUnicodeWithCallback(). + * Avoid calling it just for the end of input. + */ + } else if(flush && sourceCnv->toULength>0) { /* flush==toUArgs.flush */ + /* + * the entire input stream is consumed + * and there is a partial, truncated input sequence left + */ + + /* inject an error and continue with callback handling */ + *pErrorCode=U_TRUNCATED_CHAR_FOUND; + } else { + /* input consumed */ + if(flush) { + /* reset the converters without calling the callback functions */ + _reset(sourceCnv, UCNV_RESET_TO_UNICODE, FALSE); + _reset(targetCnv, UCNV_RESET_FROM_UNICODE, FALSE); + } + + /* done successfully */ + break; + } + } + + /* + * toUnicode(source -> pivot); + * + * For pivoting conversion; and for direct conversion for + * error callback handling, continuing partial matches + * and flushing the replay buffer. + * + * The pivot buffer is empty and reset. + */ + toUArgs.target=pivotStart; /* ==*pivotTarget */ + /* toUArgs.targetLimit=pivotLimit; already set before the loop */ + _toUnicodeWithCallback(&toUArgs, pErrorCode); + *pivotTarget=toUArgs.target; + if(*pErrorCode==U_BUFFER_OVERFLOW_ERROR) { + /* pivot overflow: continue with the conversion loop */ + *pErrorCode=U_ZERO_ERROR; + } else if(U_FAILURE(*pErrorCode) || (!flush && *pivotTarget==pivotStart)) { + /* conversion error, or there was nothing left to convert */ + break; + } + /* + * else: + * _toUnicodeWithCallback() wrote into the pivot buffer, + * continue with fromUnicode conversion. + * + * Set the fromUnicode flush flag if we flush and if toUnicode has + * processed the end of the input. + */ + if( flush && toUArgs.source==sourceLimit && + sourceCnv->preToULength>=0 && + sourceCnv->UCharErrorBufferLength==0 + ) { + fromUArgs.flush=TRUE; + } + } + + /* + * The conversion loop is exited when one of the following is true: + * - the entire source text has been converted successfully to the target buffer + * - a target buffer overflow occurred + * - a conversion error occurred + */ + + *source=toUArgs.source; + *target=fromUArgs.target; + + /* terminate the target buffer if possible */ + if(flush && U_SUCCESS(*pErrorCode)) { + if(*target!=targetLimit) { + **target=0; + if(*pErrorCode==U_STRING_NOT_TERMINATED_WARNING) { + *pErrorCode=U_ZERO_ERROR; + } + } else { + *pErrorCode=U_STRING_NOT_TERMINATED_WARNING; + } + } +} + +/* internal implementation of ucnv_convert() etc. with preflighting */ +static int32_t +ucnv_internalConvert(UConverter *outConverter, UConverter *inConverter, + char *target, int32_t targetCapacity, + const char *source, int32_t sourceLength, + UErrorCode *pErrorCode) { + UChar pivotBuffer[CHUNK_SIZE]; + UChar *pivot, *pivot2; + + char *myTarget; + const char *sourceLimit; + const char *targetLimit; + int32_t targetLength=0; + + /* set up */ + if(sourceLength<0) { + sourceLimit=uprv_strchr(source, 0); + } else { + sourceLimit=source+sourceLength; + } + + /* if there is no input data, we're done */ + if(source==sourceLimit) { + return u_terminateChars(target, targetCapacity, 0, pErrorCode); + } + + pivot=pivot2=pivotBuffer; + myTarget=target; + targetLength=0; + + if(targetCapacity>0) { + /* perform real conversion */ + targetLimit=target+targetCapacity; + ucnv_convertEx(outConverter, inConverter, + &myTarget, targetLimit, + &source, sourceLimit, + pivotBuffer, &pivot, &pivot2, pivotBuffer+CHUNK_SIZE, + FALSE, + TRUE, + pErrorCode); + targetLength=(int32_t)(myTarget-target); + } + + /* + * If the output buffer is exhausted (or we are only "preflighting"), we need to stop writing + * to it but continue the conversion in order to store in targetCapacity + * the number of bytes that was required. + */ + if(*pErrorCode==U_BUFFER_OVERFLOW_ERROR || targetCapacity==0) + { + char targetBuffer[CHUNK_SIZE]; + + targetLimit=targetBuffer+CHUNK_SIZE; + do { + *pErrorCode=U_ZERO_ERROR; + myTarget=targetBuffer; + ucnv_convertEx(outConverter, inConverter, + &myTarget, targetLimit, + &source, sourceLimit, + pivotBuffer, &pivot, &pivot2, pivotBuffer+CHUNK_SIZE, + FALSE, + TRUE, + pErrorCode); + targetLength+=(int32_t)(myTarget-targetBuffer); + } while(*pErrorCode==U_BUFFER_OVERFLOW_ERROR); + + /* done with preflighting, set warnings and errors as appropriate */ + return u_terminateChars(target, targetCapacity, targetLength, pErrorCode); + } + + /* no need to call u_terminateChars() because ucnv_convertEx() took care of that */ + return targetLength; +} + +U_CAPI int32_t U_EXPORT2 +ucnv_convert(const char *toConverterName, const char *fromConverterName, + char *target, int32_t targetCapacity, + const char *source, int32_t sourceLength, + UErrorCode *pErrorCode) { + UConverter in, out; /* stack-allocated */ + UConverter *inConverter, *outConverter; + int32_t targetLength; + + if(pErrorCode==NULL || U_FAILURE(*pErrorCode)) { + return 0; + } + + if( source==NULL || sourceLength<-1 || + targetCapacity<0 || (targetCapacity>0 && target==NULL) + ) { + *pErrorCode=U_ILLEGAL_ARGUMENT_ERROR; + return 0; + } + + /* if there is no input data, we're done */ + if(sourceLength==0 || (sourceLength<0 && *source==0)) { + return u_terminateChars(target, targetCapacity, 0, pErrorCode); + } + + /* create the converters */ + inConverter=ucnv_createConverter(&in, fromConverterName, pErrorCode); + if(U_FAILURE(*pErrorCode)) { + return 0; + } + + outConverter=ucnv_createConverter(&out, toConverterName, pErrorCode); + if(U_FAILURE(*pErrorCode)) { + ucnv_close(inConverter); + return 0; + } + + targetLength=ucnv_internalConvert(outConverter, inConverter, + target, targetCapacity, + source, sourceLength, + pErrorCode); + + ucnv_close(inConverter); + ucnv_close(outConverter); + + return targetLength; +} + +/* @internal */ +static int32_t +ucnv_convertAlgorithmic(UBool convertToAlgorithmic, + UConverterType algorithmicType, + UConverter *cnv, + char *target, int32_t targetCapacity, + const char *source, int32_t sourceLength, + UErrorCode *pErrorCode) { + UConverter algoConverterStatic; /* stack-allocated */ + UConverter *algoConverter, *to, *from; + int32_t targetLength; + + if(pErrorCode==NULL || U_FAILURE(*pErrorCode)) { + return 0; + } + + if( cnv==NULL || source==NULL || sourceLength<-1 || + targetCapacity<0 || (targetCapacity>0 && target==NULL) + ) { + *pErrorCode=U_ILLEGAL_ARGUMENT_ERROR; + return 0; + } + + /* if there is no input data, we're done */ + if(sourceLength==0 || (sourceLength<0 && *source==0)) { + return u_terminateChars(target, targetCapacity, 0, pErrorCode); + } + + /* create the algorithmic converter */ + algoConverter=ucnv_createAlgorithmicConverter(&algoConverterStatic, algorithmicType, + "", 0, pErrorCode); + if(U_FAILURE(*pErrorCode)) { + return 0; + } + + /* reset the other converter */ + if(convertToAlgorithmic) { + /* cnv->Unicode->algo */ + ucnv_resetToUnicode(cnv); + to=algoConverter; + from=cnv; + } else { + /* algo->Unicode->cnv */ + ucnv_resetFromUnicode(cnv); + from=algoConverter; + to=cnv; + } + + targetLength=ucnv_internalConvert(to, from, + target, targetCapacity, + source, sourceLength, + pErrorCode); + + ucnv_close(algoConverter); + + return targetLength; +} + +U_CAPI int32_t U_EXPORT2 +ucnv_toAlgorithmic(UConverterType algorithmicType, + UConverter *cnv, + char *target, int32_t targetCapacity, + const char *source, int32_t sourceLength, + UErrorCode *pErrorCode) { + return ucnv_convertAlgorithmic(TRUE, algorithmicType, cnv, + target, targetCapacity, + source, sourceLength, + pErrorCode); +} + +U_CAPI int32_t U_EXPORT2 +ucnv_fromAlgorithmic(UConverter *cnv, + UConverterType algorithmicType, + char *target, int32_t targetCapacity, + const char *source, int32_t sourceLength, + UErrorCode *pErrorCode) { + return ucnv_convertAlgorithmic(FALSE, algorithmicType, cnv, + target, targetCapacity, + source, sourceLength, + pErrorCode); +} + +U_CAPI UConverterType U_EXPORT2 +ucnv_getType(const UConverter* converter) +{ + int8_t type = converter->sharedData->staticData->conversionType; +#if !UCONFIG_NO_LEGACY_CONVERSION + if(type == UCNV_MBCS) { + return ucnv_MBCSGetType(converter); + } +#endif + return (UConverterType)type; +} + +U_CAPI void U_EXPORT2 +ucnv_getStarters(const UConverter* converter, + UBool starters[256], + UErrorCode* err) +{ + if (err == NULL || U_FAILURE(*err)) { + return; + } + + if(converter->sharedData->impl->getStarters != NULL) { + converter->sharedData->impl->getStarters(converter, starters, err); + } else { + *err = U_ILLEGAL_ARGUMENT_ERROR; + } +} + +static const UAmbiguousConverter *ucnv_getAmbiguous(const UConverter *cnv) +{ + UErrorCode errorCode; + const char *name; + int32_t i; + + if(cnv==NULL) { + return NULL; + } + + errorCode=U_ZERO_ERROR; + name=ucnv_getName(cnv, &errorCode); + if(U_FAILURE(errorCode)) { + return NULL; + } + + for(i=0; ivariant5c; + for(i=0; iuseFallback = usesFallback; +} + +U_CAPI UBool U_EXPORT2 +ucnv_usesFallback(const UConverter *cnv) +{ + return cnv->useFallback; +} + +U_CAPI void U_EXPORT2 +ucnv_getInvalidChars (const UConverter * converter, + char *errBytes, + int8_t * len, + UErrorCode * err) +{ + if (err == NULL || U_FAILURE(*err)) + { + return; + } + if (len == NULL || errBytes == NULL || converter == NULL) + { + *err = U_ILLEGAL_ARGUMENT_ERROR; + return; + } + if (*len < converter->invalidCharLength) + { + *err = U_INDEX_OUTOFBOUNDS_ERROR; + return; + } + if ((*len = converter->invalidCharLength) > 0) + { + uprv_memcpy (errBytes, converter->invalidCharBuffer, *len); + } +} + +U_CAPI void U_EXPORT2 +ucnv_getInvalidUChars (const UConverter * converter, + UChar *errChars, + int8_t * len, + UErrorCode * err) +{ + if (err == NULL || U_FAILURE(*err)) + { + return; + } + if (len == NULL || errChars == NULL || converter == NULL) + { + *err = U_ILLEGAL_ARGUMENT_ERROR; + return; + } + if (*len < converter->invalidUCharLength) + { + *err = U_INDEX_OUTOFBOUNDS_ERROR; + return; + } + if ((*len = converter->invalidUCharLength) > 0) + { + u_memcpy (errChars, converter->invalidUCharBuffer, *len); + } +} + +#define SIG_MAX_LEN 5 + +U_CAPI const char* U_EXPORT2 +ucnv_detectUnicodeSignature( const char* source, + int32_t sourceLength, + int32_t* signatureLength, + UErrorCode* pErrorCode) { + int32_t dummy; + + /* initial 0xa5 bytes: make sure that if we read preFromUFirstCP >= 0){ + return U16_LENGTH(cnv->preFromUFirstCP)+cnv->preFromULength ; + }else if(cnv->preFromULength < 0){ + return -cnv->preFromULength ; + }else if(cnv->fromUChar32 > 0){ + return 1; + } + return 0; + +} + +U_CAPI int32_t U_EXPORT2 +ucnv_toUCountPending(const UConverter* cnv, UErrorCode* status){ + + if(status == NULL || U_FAILURE(*status)){ + return -1; + } + if(cnv == NULL){ + *status = U_ILLEGAL_ARGUMENT_ERROR; + return -1; + } + + if(cnv->preToULength > 0){ + return cnv->preToULength ; + }else if(cnv->preToULength < 0){ + return -cnv->preToULength; + }else if(cnv->toULength > 0){ + return cnv->toULength; + } + return 0; +} + +U_CAPI UBool U_EXPORT2 +ucnv_isFixedWidth(UConverter *cnv, UErrorCode *status){ + if (U_FAILURE(*status)) { + return FALSE; + } + + if (cnv == NULL) { + *status = U_ILLEGAL_ARGUMENT_ERROR; + return FALSE; + } + + switch (ucnv_getType(cnv)) { + case UCNV_SBCS: + case UCNV_DBCS: + case UCNV_UTF32_BigEndian: + case UCNV_UTF32_LittleEndian: + case UCNV_UTF32: + case UCNV_US_ASCII: + return TRUE; + default: + return FALSE; + } +} +#endif + +/* + * Hey, Emacs, please set the following: + * + * Local Variables: + * indent-tabs-mode: nil + * End: + * + */ diff --git a/Build/source/libs/icu/icu-src/source/common/ucnv2022.cpp b/Build/source/libs/icu/icu-src/source/common/ucnv2022.cpp index 9c0a06426bd..f0d0946c3f9 100644 --- a/Build/source/libs/icu/icu-src/source/common/ucnv2022.cpp +++ b/Build/source/libs/icu/icu-src/source/common/ucnv2022.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** @@ -6,7 +6,7 @@ * Corporation and others. All Rights Reserved. ********************************************************************** * file name: ucnv2022.cpp -* encoding: US-ASCII +* encoding: UTF-8 * tab size: 8 (not used) * indentation:4 * diff --git a/Build/source/libs/icu/icu-src/source/common/ucnv_bld.cpp b/Build/source/libs/icu/icu-src/source/common/ucnv_bld.cpp index 078f293ea17..14de21bd739 100644 --- a/Build/source/libs/icu/icu-src/source/common/ucnv_bld.cpp +++ b/Build/source/libs/icu/icu-src/source/common/ucnv_bld.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************** diff --git a/Build/source/libs/icu/icu-src/source/common/ucnv_bld.h b/Build/source/libs/icu/icu-src/source/common/ucnv_bld.h index 212c4ea9161..a1e2df6730c 100644 --- a/Build/source/libs/icu/icu-src/source/common/ucnv_bld.h +++ b/Build/source/libs/icu/icu-src/source/common/ucnv_bld.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** diff --git a/Build/source/libs/icu/icu-src/source/common/ucnv_cb.c b/Build/source/libs/icu/icu-src/source/common/ucnv_cb.c deleted file mode 100644 index 0c9cc2459f1..00000000000 --- a/Build/source/libs/icu/icu-src/source/common/ucnv_cb.c +++ /dev/null @@ -1,261 +0,0 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. -// License & terms of use: http://www.unicode.org/copyright.html -/* -********************************************************************** -* Copyright (C) 2000-2006, International Business Machines -* Corporation and others. All Rights Reserved. -********************************************************************** - * ucnv_cb.c: - * External APIs for the ICU's codeset conversion library - * Helena Shih - * - * Modification History: - * - * Date Name Description - * 7/28/2000 srl Implementation - */ - -/** - * @name Character Conversion C API - * - */ - -#include "unicode/utypes.h" - -#if !UCONFIG_NO_CONVERSION - -#include "unicode/ucnv_cb.h" -#include "ucnv_bld.h" -#include "ucnv_cnv.h" -#include "cmemory.h" - -/* need to update the offsets when the target moves. */ -/* Note: Recursion may occur in the cb functions, be sure to update the offsets correctly -if you don't use ucnv_cbXXX functions. Make sure you don't use the same callback within -the same call stack if the complexity arises. */ -U_CAPI void U_EXPORT2 -ucnv_cbFromUWriteBytes (UConverterFromUnicodeArgs *args, - const char* source, - int32_t length, - int32_t offsetIndex, - UErrorCode * err) -{ - if(U_FAILURE(*err)) { - return; - } - - ucnv_fromUWriteBytes( - args->converter, - source, length, - &args->target, args->targetLimit, - &args->offsets, offsetIndex, - err); -} - -U_CAPI void U_EXPORT2 -ucnv_cbFromUWriteUChars(UConverterFromUnicodeArgs *args, - const UChar** source, - const UChar* sourceLimit, - int32_t offsetIndex, - UErrorCode * err) -{ - /* - This is a fun one. Recursion can occur - we're basically going to - just retry shoving data through the same converter. Note, if you got - here through some kind of invalid sequence, you maybe should emit a - reset sequence of some kind and/or call ucnv_reset(). Since this - IS an actual conversion, take care that you've changed the callback - or the data, or you'll get an infinite loop. - - Please set the err value to something reasonable before calling - into this. - */ - - char *oldTarget; - - if(U_FAILURE(*err)) - { - return; - } - - oldTarget = args->target; - - ucnv_fromUnicode(args->converter, - &args->target, - args->targetLimit, - source, - sourceLimit, - NULL, /* no offsets */ - FALSE, /* no flush */ - err); - - if(args->offsets) - { - while (args->target != oldTarget) /* if it moved at all.. */ - { - *(args->offsets)++ = offsetIndex; - oldTarget++; - } - } - - /* - Note, if you did something like used a Stop subcallback, things would get interesting. - In fact, here's where we want to return the partially consumed in-source! - */ - if(*err == U_BUFFER_OVERFLOW_ERROR) - /* && (*source < sourceLimit && args->target >= args->targetLimit) - -- S. Hrcek */ - { - /* Overflowed the target. Now, we'll write into the charErrorBuffer. - It's a fixed size. If we overflow it... Hmm */ - char *newTarget; - const char *newTargetLimit; - UErrorCode err2 = U_ZERO_ERROR; - - int8_t errBuffLen; - - errBuffLen = args->converter->charErrorBufferLength; - - /* start the new target at the first free slot in the errbuff.. */ - newTarget = (char *)(args->converter->charErrorBuffer + errBuffLen); - - newTargetLimit = (char *)(args->converter->charErrorBuffer + - sizeof(args->converter->charErrorBuffer)); - - if(newTarget >= newTargetLimit) - { - *err = U_INTERNAL_PROGRAM_ERROR; - return; - } - - /* We're going to tell the converter that the errbuff len is empty. - This prevents the existing errbuff from being 'flushed' out onto - itself. If the errbuff is needed by the converter this time, - we're hosed - we're out of space! */ - - args->converter->charErrorBufferLength = 0; - - ucnv_fromUnicode(args->converter, - &newTarget, - newTargetLimit, - source, - sourceLimit, - NULL, - FALSE, - &err2); - - /* We can go ahead and overwrite the length here. We know just how - to recalculate it. */ - - args->converter->charErrorBufferLength = (int8_t)( - newTarget - (char*)args->converter->charErrorBuffer); - - if((newTarget >= newTargetLimit) || (err2 == U_BUFFER_OVERFLOW_ERROR)) - { - /* now we're REALLY in trouble. - Internal program error - callback shouldn't have written this much - data! - */ - *err = U_INTERNAL_PROGRAM_ERROR; - return; - } - /*else {*/ - /* sub errs could be invalid/truncated/illegal chars or w/e. - These might want to be passed on up.. But the problem is, we already - need to pass U_BUFFER_OVERFLOW_ERROR. That has to override these - other errs.. */ - - /* - if(U_FAILURE(err2)) - ?? - */ - /*}*/ - } -} - -U_CAPI void U_EXPORT2 -ucnv_cbFromUWriteSub (UConverterFromUnicodeArgs *args, - int32_t offsetIndex, - UErrorCode * err) -{ - UConverter *converter; - int32_t length; - - if(U_FAILURE(*err)) { - return; - } - converter = args->converter; - length = converter->subCharLen; - - if(length == 0) { - return; - } - - if(length < 0) { - /* - * Write/convert the substitution string. Its real length is -length. - * Unlike the escape callback, we need not change the converter's - * callback function because ucnv_setSubstString() verified that - * the string can be converted, so we will not get a conversion error - * and will not recurse. - * At worst we should get a U_BUFFER_OVERFLOW_ERROR. - */ - const UChar *source = (const UChar *)converter->subChars; - ucnv_cbFromUWriteUChars(args, &source, source - length, offsetIndex, err); - return; - } - - if(converter->sharedData->impl->writeSub!=NULL) { - converter->sharedData->impl->writeSub(args, offsetIndex, err); - } - else if(converter->subChar1!=0 && (uint16_t)converter->invalidUCharBuffer[0]<=(uint16_t)0xffu) { - /* - TODO: Is this untestable because the MBCS converter has a writeSub function to call - and the other converters don't use subChar1? - */ - ucnv_cbFromUWriteBytes(args, - (const char *)&converter->subChar1, 1, - offsetIndex, err); - } - else { - ucnv_cbFromUWriteBytes(args, - (const char *)converter->subChars, length, - offsetIndex, err); - } -} - -U_CAPI void U_EXPORT2 -ucnv_cbToUWriteUChars (UConverterToUnicodeArgs *args, - const UChar* source, - int32_t length, - int32_t offsetIndex, - UErrorCode * err) -{ - if(U_FAILURE(*err)) { - return; - } - - ucnv_toUWriteUChars( - args->converter, - source, length, - &args->target, args->targetLimit, - &args->offsets, offsetIndex, - err); -} - -U_CAPI void U_EXPORT2 -ucnv_cbToUWriteSub (UConverterToUnicodeArgs *args, - int32_t offsetIndex, - UErrorCode * err) -{ - static const UChar kSubstituteChar1 = 0x1A, kSubstituteChar = 0xFFFD; - - /* could optimize this case, just one uchar */ - if(args->converter->invalidCharLength == 1 && args->converter->subChar1 != 0) { - ucnv_cbToUWriteUChars(args, &kSubstituteChar1, 1, offsetIndex, err); - } else { - ucnv_cbToUWriteUChars(args, &kSubstituteChar, 1, offsetIndex, err); - } -} - -#endif diff --git a/Build/source/libs/icu/icu-src/source/common/ucnv_cb.cpp b/Build/source/libs/icu/icu-src/source/common/ucnv_cb.cpp new file mode 100644 index 00000000000..1bb00120149 --- /dev/null +++ b/Build/source/libs/icu/icu-src/source/common/ucnv_cb.cpp @@ -0,0 +1,261 @@ +// © 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html +/* +********************************************************************** +* Copyright (C) 2000-2006, International Business Machines +* Corporation and others. All Rights Reserved. +********************************************************************** + * ucnv_cb.c: + * External APIs for the ICU's codeset conversion library + * Helena Shih + * + * Modification History: + * + * Date Name Description + * 7/28/2000 srl Implementation + */ + +/** + * @name Character Conversion C API + * + */ + +#include "unicode/utypes.h" + +#if !UCONFIG_NO_CONVERSION + +#include "unicode/ucnv_cb.h" +#include "ucnv_bld.h" +#include "ucnv_cnv.h" +#include "cmemory.h" + +/* need to update the offsets when the target moves. */ +/* Note: Recursion may occur in the cb functions, be sure to update the offsets correctly +if you don't use ucnv_cbXXX functions. Make sure you don't use the same callback within +the same call stack if the complexity arises. */ +U_CAPI void U_EXPORT2 +ucnv_cbFromUWriteBytes (UConverterFromUnicodeArgs *args, + const char* source, + int32_t length, + int32_t offsetIndex, + UErrorCode * err) +{ + if(U_FAILURE(*err)) { + return; + } + + ucnv_fromUWriteBytes( + args->converter, + source, length, + &args->target, args->targetLimit, + &args->offsets, offsetIndex, + err); +} + +U_CAPI void U_EXPORT2 +ucnv_cbFromUWriteUChars(UConverterFromUnicodeArgs *args, + const UChar** source, + const UChar* sourceLimit, + int32_t offsetIndex, + UErrorCode * err) +{ + /* + This is a fun one. Recursion can occur - we're basically going to + just retry shoving data through the same converter. Note, if you got + here through some kind of invalid sequence, you maybe should emit a + reset sequence of some kind and/or call ucnv_reset(). Since this + IS an actual conversion, take care that you've changed the callback + or the data, or you'll get an infinite loop. + + Please set the err value to something reasonable before calling + into this. + */ + + char *oldTarget; + + if(U_FAILURE(*err)) + { + return; + } + + oldTarget = args->target; + + ucnv_fromUnicode(args->converter, + &args->target, + args->targetLimit, + source, + sourceLimit, + NULL, /* no offsets */ + FALSE, /* no flush */ + err); + + if(args->offsets) + { + while (args->target != oldTarget) /* if it moved at all.. */ + { + *(args->offsets)++ = offsetIndex; + oldTarget++; + } + } + + /* + Note, if you did something like used a Stop subcallback, things would get interesting. + In fact, here's where we want to return the partially consumed in-source! + */ + if(*err == U_BUFFER_OVERFLOW_ERROR) + /* && (*source < sourceLimit && args->target >= args->targetLimit) + -- S. Hrcek */ + { + /* Overflowed the target. Now, we'll write into the charErrorBuffer. + It's a fixed size. If we overflow it... Hmm */ + char *newTarget; + const char *newTargetLimit; + UErrorCode err2 = U_ZERO_ERROR; + + int8_t errBuffLen; + + errBuffLen = args->converter->charErrorBufferLength; + + /* start the new target at the first free slot in the errbuff.. */ + newTarget = (char *)(args->converter->charErrorBuffer + errBuffLen); + + newTargetLimit = (char *)(args->converter->charErrorBuffer + + sizeof(args->converter->charErrorBuffer)); + + if(newTarget >= newTargetLimit) + { + *err = U_INTERNAL_PROGRAM_ERROR; + return; + } + + /* We're going to tell the converter that the errbuff len is empty. + This prevents the existing errbuff from being 'flushed' out onto + itself. If the errbuff is needed by the converter this time, + we're hosed - we're out of space! */ + + args->converter->charErrorBufferLength = 0; + + ucnv_fromUnicode(args->converter, + &newTarget, + newTargetLimit, + source, + sourceLimit, + NULL, + FALSE, + &err2); + + /* We can go ahead and overwrite the length here. We know just how + to recalculate it. */ + + args->converter->charErrorBufferLength = (int8_t)( + newTarget - (char*)args->converter->charErrorBuffer); + + if((newTarget >= newTargetLimit) || (err2 == U_BUFFER_OVERFLOW_ERROR)) + { + /* now we're REALLY in trouble. + Internal program error - callback shouldn't have written this much + data! + */ + *err = U_INTERNAL_PROGRAM_ERROR; + return; + } + /*else {*/ + /* sub errs could be invalid/truncated/illegal chars or w/e. + These might want to be passed on up.. But the problem is, we already + need to pass U_BUFFER_OVERFLOW_ERROR. That has to override these + other errs.. */ + + /* + if(U_FAILURE(err2)) + ?? + */ + /*}*/ + } +} + +U_CAPI void U_EXPORT2 +ucnv_cbFromUWriteSub (UConverterFromUnicodeArgs *args, + int32_t offsetIndex, + UErrorCode * err) +{ + UConverter *converter; + int32_t length; + + if(U_FAILURE(*err)) { + return; + } + converter = args->converter; + length = converter->subCharLen; + + if(length == 0) { + return; + } + + if(length < 0) { + /* + * Write/convert the substitution string. Its real length is -length. + * Unlike the escape callback, we need not change the converter's + * callback function because ucnv_setSubstString() verified that + * the string can be converted, so we will not get a conversion error + * and will not recurse. + * At worst we should get a U_BUFFER_OVERFLOW_ERROR. + */ + const UChar *source = (const UChar *)converter->subChars; + ucnv_cbFromUWriteUChars(args, &source, source - length, offsetIndex, err); + return; + } + + if(converter->sharedData->impl->writeSub!=NULL) { + converter->sharedData->impl->writeSub(args, offsetIndex, err); + } + else if(converter->subChar1!=0 && (uint16_t)converter->invalidUCharBuffer[0]<=(uint16_t)0xffu) { + /* + TODO: Is this untestable because the MBCS converter has a writeSub function to call + and the other converters don't use subChar1? + */ + ucnv_cbFromUWriteBytes(args, + (const char *)&converter->subChar1, 1, + offsetIndex, err); + } + else { + ucnv_cbFromUWriteBytes(args, + (const char *)converter->subChars, length, + offsetIndex, err); + } +} + +U_CAPI void U_EXPORT2 +ucnv_cbToUWriteUChars (UConverterToUnicodeArgs *args, + const UChar* source, + int32_t length, + int32_t offsetIndex, + UErrorCode * err) +{ + if(U_FAILURE(*err)) { + return; + } + + ucnv_toUWriteUChars( + args->converter, + source, length, + &args->target, args->targetLimit, + &args->offsets, offsetIndex, + err); +} + +U_CAPI void U_EXPORT2 +ucnv_cbToUWriteSub (UConverterToUnicodeArgs *args, + int32_t offsetIndex, + UErrorCode * err) +{ + static const UChar kSubstituteChar1 = 0x1A, kSubstituteChar = 0xFFFD; + + /* could optimize this case, just one uchar */ + if(args->converter->invalidCharLength == 1 && args->converter->subChar1 != 0) { + ucnv_cbToUWriteUChars(args, &kSubstituteChar1, 1, offsetIndex, err); + } else { + ucnv_cbToUWriteUChars(args, &kSubstituteChar, 1, offsetIndex, err); + } +} + +#endif diff --git a/Build/source/libs/icu/icu-src/source/common/ucnv_cnv.c b/Build/source/libs/icu/icu-src/source/common/ucnv_cnv.c deleted file mode 100644 index 01f84829dd3..00000000000 --- a/Build/source/libs/icu/icu-src/source/common/ucnv_cnv.c +++ /dev/null @@ -1,176 +0,0 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. -// License & terms of use: http://www.unicode.org/copyright.html -/* -****************************************************************************** -* -* Copyright (C) 1999-2004, International Business Machines -* Corporation and others. All Rights Reserved. -* -****************************************************************************** -* -* uconv_cnv.c: -* Implements all the low level conversion functions -* T_UnicodeConverter_{to,from}Unicode_$ConversionType -* -* Change history: -* -* 06/29/2000 helena Major rewrite of the callback APIs. -*/ - -#include "unicode/utypes.h" - -#if !UCONFIG_NO_CONVERSION - -#include "unicode/ucnv_err.h" -#include "unicode/ucnv.h" -#include "unicode/uset.h" -#include "ucnv_cnv.h" -#include "ucnv_bld.h" -#include "cmemory.h" - -U_CFUNC void -ucnv_getCompleteUnicodeSet(const UConverter *cnv, - const USetAdder *sa, - UConverterUnicodeSet which, - UErrorCode *pErrorCode) { - sa->addRange(sa->set, 0, 0x10ffff); -} - -U_CFUNC void -ucnv_getNonSurrogateUnicodeSet(const UConverter *cnv, - const USetAdder *sa, - UConverterUnicodeSet which, - UErrorCode *pErrorCode) { - sa->addRange(sa->set, 0, 0xd7ff); - sa->addRange(sa->set, 0xe000, 0x10ffff); -} - -U_CFUNC void -ucnv_fromUWriteBytes(UConverter *cnv, - const char *bytes, int32_t length, - char **target, const char *targetLimit, - int32_t **offsets, - int32_t sourceIndex, - UErrorCode *pErrorCode) { - char *t=*target; - int32_t *o; - - /* write bytes */ - if(offsets==NULL || (o=*offsets)==NULL) { - while(length>0 && t0 && t0) { - if(cnv!=NULL) { - t=(char *)cnv->charErrorBuffer; - cnv->charErrorBufferLength=(int8_t)length; - do { - *t++=(uint8_t)*bytes++; - } while(--length>0); - } - *pErrorCode=U_BUFFER_OVERFLOW_ERROR; - } -} - -U_CFUNC void -ucnv_toUWriteUChars(UConverter *cnv, - const UChar *uchars, int32_t length, - UChar **target, const UChar *targetLimit, - int32_t **offsets, - int32_t sourceIndex, - UErrorCode *pErrorCode) { - UChar *t=*target; - int32_t *o; - - /* write UChars */ - if(offsets==NULL || (o=*offsets)==NULL) { - while(length>0 && t0 && t0) { - if(cnv!=NULL) { - t=cnv->UCharErrorBuffer; - cnv->UCharErrorBufferLength=(int8_t)length; - do { - *t++=*uchars++; - } while(--length>0); - } - *pErrorCode=U_BUFFER_OVERFLOW_ERROR; - } -} - -U_CFUNC void -ucnv_toUWriteCodePoint(UConverter *cnv, - UChar32 c, - UChar **target, const UChar *targetLimit, - int32_t **offsets, - int32_t sourceIndex, - UErrorCode *pErrorCode) { - UChar *t; - int32_t *o; - - t=*target; - - if(t=0) { - if(cnv!=NULL) { - int8_t i=0; - U16_APPEND_UNSAFE(cnv->UCharErrorBuffer, i, c); - cnv->UCharErrorBufferLength=i; - } - *pErrorCode=U_BUFFER_OVERFLOW_ERROR; - } -} - -#endif diff --git a/Build/source/libs/icu/icu-src/source/common/ucnv_cnv.cpp b/Build/source/libs/icu/icu-src/source/common/ucnv_cnv.cpp new file mode 100644 index 00000000000..ea71acf92c7 --- /dev/null +++ b/Build/source/libs/icu/icu-src/source/common/ucnv_cnv.cpp @@ -0,0 +1,182 @@ +// © 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html +/* +****************************************************************************** +* +* Copyright (C) 1999-2004, International Business Machines +* Corporation and others. All Rights Reserved. +* +****************************************************************************** +* +* uconv_cnv.c: +* Implements all the low level conversion functions +* T_UnicodeConverter_{to,from}Unicode_$ConversionType +* +* Change history: +* +* 06/29/2000 helena Major rewrite of the callback APIs. +*/ + +#include "unicode/utypes.h" + +#if !UCONFIG_NO_CONVERSION + +#include "unicode/ucnv_err.h" +#include "unicode/ucnv.h" +#include "unicode/uset.h" +#include "ucnv_cnv.h" +#include "ucnv_bld.h" +#include "cmemory.h" + +U_CFUNC void +ucnv_getCompleteUnicodeSet(const UConverter *cnv, + const USetAdder *sa, + UConverterUnicodeSet which, + UErrorCode *pErrorCode) { + (void)cnv; + (void)which; + (void)pErrorCode; + sa->addRange(sa->set, 0, 0x10ffff); +} + +U_CFUNC void +ucnv_getNonSurrogateUnicodeSet(const UConverter *cnv, + const USetAdder *sa, + UConverterUnicodeSet which, + UErrorCode *pErrorCode) { + (void)cnv; + (void)which; + (void)pErrorCode; + sa->addRange(sa->set, 0, 0xd7ff); + sa->addRange(sa->set, 0xe000, 0x10ffff); +} + +U_CFUNC void +ucnv_fromUWriteBytes(UConverter *cnv, + const char *bytes, int32_t length, + char **target, const char *targetLimit, + int32_t **offsets, + int32_t sourceIndex, + UErrorCode *pErrorCode) { + char *t=*target; + int32_t *o; + + /* write bytes */ + if(offsets==NULL || (o=*offsets)==NULL) { + while(length>0 && t0 && t0) { + if(cnv!=NULL) { + t=(char *)cnv->charErrorBuffer; + cnv->charErrorBufferLength=(int8_t)length; + do { + *t++=(uint8_t)*bytes++; + } while(--length>0); + } + *pErrorCode=U_BUFFER_OVERFLOW_ERROR; + } +} + +U_CFUNC void +ucnv_toUWriteUChars(UConverter *cnv, + const UChar *uchars, int32_t length, + UChar **target, const UChar *targetLimit, + int32_t **offsets, + int32_t sourceIndex, + UErrorCode *pErrorCode) { + UChar *t=*target; + int32_t *o; + + /* write UChars */ + if(offsets==NULL || (o=*offsets)==NULL) { + while(length>0 && t0 && t0) { + if(cnv!=NULL) { + t=cnv->UCharErrorBuffer; + cnv->UCharErrorBufferLength=(int8_t)length; + do { + *t++=*uchars++; + } while(--length>0); + } + *pErrorCode=U_BUFFER_OVERFLOW_ERROR; + } +} + +U_CFUNC void +ucnv_toUWriteCodePoint(UConverter *cnv, + UChar32 c, + UChar **target, const UChar *targetLimit, + int32_t **offsets, + int32_t sourceIndex, + UErrorCode *pErrorCode) { + UChar *t; + int32_t *o; + + t=*target; + + if(t=0) { + if(cnv!=NULL) { + int8_t i=0; + U16_APPEND_UNSAFE(cnv->UCharErrorBuffer, i, c); + cnv->UCharErrorBufferLength=i; + } + *pErrorCode=U_BUFFER_OVERFLOW_ERROR; + } +} + +#endif diff --git a/Build/source/libs/icu/icu-src/source/common/ucnv_cnv.h b/Build/source/libs/icu/icu-src/source/common/ucnv_cnv.h index 4394672b470..2eed2c60df6 100644 --- a/Build/source/libs/icu/icu-src/source/common/ucnv_cnv.h +++ b/Build/source/libs/icu/icu-src/source/common/ucnv_cnv.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** diff --git a/Build/source/libs/icu/icu-src/source/common/ucnv_ct.c b/Build/source/libs/icu/icu-src/source/common/ucnv_ct.c deleted file mode 100644 index f76919c4a54..00000000000 --- a/Build/source/libs/icu/icu-src/source/common/ucnv_ct.c +++ /dev/null @@ -1,637 +0,0 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. -// License & terms of use: http://www.unicode.org/copyright.html -/* -********************************************************************** -* Copyright (C) 2010-2015, International Business Machines -* Corporation and others. All Rights Reserved. -********************************************************************** -* file name: ucnv_ct.c -* encoding: US-ASCII -* tab size: 8 (not used) -* indentation:4 -* -* created on: 2010Dec09 -* created by: Michael Ow -*/ - -#include "unicode/utypes.h" - -#if !UCONFIG_NO_CONVERSION && !UCONFIG_NO_LEGACY_CONVERSION && !UCONFIG_ONLY_HTML_CONVERSION - -#include "unicode/ucnv.h" -#include "unicode/uset.h" -#include "unicode/ucnv_err.h" -#include "unicode/ucnv_cb.h" -#include "unicode/utf16.h" -#include "ucnv_imp.h" -#include "ucnv_bld.h" -#include "ucnv_cnv.h" -#include "ucnvmbcs.h" -#include "cstring.h" -#include "cmemory.h" - -typedef enum { - INVALID = -2, - DO_SEARCH = -1, - - COMPOUND_TEXT_SINGLE_0 = 0, - COMPOUND_TEXT_SINGLE_1 = 1, - COMPOUND_TEXT_SINGLE_2 = 2, - COMPOUND_TEXT_SINGLE_3 = 3, - - COMPOUND_TEXT_DOUBLE_1 = 4, - COMPOUND_TEXT_DOUBLE_2 = 5, - COMPOUND_TEXT_DOUBLE_3 = 6, - COMPOUND_TEXT_DOUBLE_4 = 7, - COMPOUND_TEXT_DOUBLE_5 = 8, - COMPOUND_TEXT_DOUBLE_6 = 9, - COMPOUND_TEXT_DOUBLE_7 = 10, - - COMPOUND_TEXT_TRIPLE_DOUBLE = 11, - - IBM_915 = 12, - IBM_916 = 13, - IBM_914 = 14, - IBM_874 = 15, - IBM_912 = 16, - IBM_913 = 17, - ISO_8859_14 = 18, - IBM_923 = 19, - NUM_OF_CONVERTERS = 20 -} COMPOUND_TEXT_CONVERTERS; - -#define SEARCH_LENGTH 12 - -static const uint8_t escSeqCompoundText[NUM_OF_CONVERTERS][5] = { - /* Single */ - { 0x1B, 0x2D, 0x41, 0, 0 }, - { 0x1B, 0x2D, 0x4D, 0, 0 }, - { 0x1B, 0x2D, 0x46, 0, 0 }, - { 0x1B, 0x2D, 0x47, 0, 0 }, - - /* Double */ - { 0x1B, 0x24, 0x29, 0x41, 0 }, - { 0x1B, 0x24, 0x29, 0x42, 0 }, - { 0x1B, 0x24, 0x29, 0x43, 0 }, - { 0x1B, 0x24, 0x29, 0x44, 0 }, - { 0x1B, 0x24, 0x29, 0x47, 0 }, - { 0x1B, 0x24, 0x29, 0x48, 0 }, - { 0x1B, 0x24, 0x29, 0x49, 0 }, - - /* Triple/Double */ - { 0x1B, 0x25, 0x47, 0, 0 }, - - /*IBM-915*/ - { 0x1B, 0x2D, 0x4C, 0, 0 }, - /*IBM-916*/ - { 0x1B, 0x2D, 0x48, 0, 0 }, - /*IBM-914*/ - { 0x1B, 0x2D, 0x44, 0, 0 }, - /*IBM-874*/ - { 0x1B, 0x2D, 0x54, 0, 0 }, - /*IBM-912*/ - { 0x1B, 0x2D, 0x42, 0, 0 }, - /* IBM-913 */ - { 0x1B, 0x2D, 0x43, 0, 0 }, - /* ISO-8859_14 */ - { 0x1B, 0x2D, 0x5F, 0, 0 }, - /* IBM-923 */ - { 0x1B, 0x2D, 0x62, 0, 0 }, -}; - -#define ESC_START 0x1B - -#define isASCIIRange(codepoint) \ - ((codepoint == 0x0000) || (codepoint == 0x0009) || (codepoint == 0x000A) || \ - (codepoint >= 0x0020 && codepoint <= 0x007f) || (codepoint >= 0x00A0 && codepoint <= 0x00FF)) - -#define isIBM915(codepoint) \ - ((codepoint >= 0x0401 && codepoint <= 0x045F) || (codepoint == 0x2116)) - -#define isIBM916(codepoint) \ - ((codepoint >= 0x05D0 && codepoint <= 0x05EA) || (codepoint == 0x2017) || (codepoint == 0x203E)) - -#define isCompoundS3(codepoint) \ - ((codepoint == 0x060C) || (codepoint == 0x061B) || (codepoint == 0x061F) || (codepoint >= 0x0621 && codepoint <= 0x063A) || \ - (codepoint >= 0x0640 && codepoint <= 0x0652) || (codepoint >= 0x0660 && codepoint <= 0x066D) || (codepoint == 0x200B) || \ - (codepoint >= 0x0FE70 && codepoint <= 0x0FE72) || (codepoint == 0x0FE74) || (codepoint >= 0x0FE76 && codepoint <= 0x0FEBE)) - -#define isCompoundS2(codepoint) \ - ((codepoint == 0x02BC) || (codepoint == 0x02BD) || (codepoint >= 0x0384 && codepoint <= 0x03CE) || (codepoint == 0x2015)) - -#define isIBM914(codepoint) \ - ((codepoint == 0x0100) || (codepoint == 0x0101) || (codepoint == 0x0112) || (codepoint == 0x0113) || (codepoint == 0x0116) || (codepoint == 0x0117) || \ - (codepoint == 0x0122) || (codepoint == 0x0123) || (codepoint >= 0x0128 && codepoint <= 0x012B) || (codepoint == 0x012E) || (codepoint == 0x012F) || \ - (codepoint >= 0x0136 && codepoint <= 0x0138) || (codepoint == 0x013B) || (codepoint == 0x013C) || (codepoint == 0x0145) || (codepoint == 0x0146) || \ - (codepoint >= 0x014A && codepoint <= 0x014D) || (codepoint == 0x0156) || (codepoint == 0x0157) || (codepoint >= 0x0166 && codepoint <= 0x016B) || \ - (codepoint == 0x0172) || (codepoint == 0x0173)) - -#define isIBM874(codepoint) \ - ((codepoint >= 0x0E01 && codepoint <= 0x0E3A) || (codepoint >= 0x0E3F && codepoint <= 0x0E5B)) - -#define isIBM912(codepoint) \ - ((codepoint >= 0x0102 && codepoint <= 0x0107) || (codepoint >= 0x010C && codepoint <= 0x0111) || (codepoint >= 0x0118 && codepoint <= 0x011B) || \ - (codepoint == 0x0139) || (codepoint == 0x013A) || (codepoint == 0x013D) || (codepoint == 0x013E) || (codepoint >= 0x0141 && codepoint <= 0x0144) || \ - (codepoint == 0x0147) || (codepoint == 0x0147) || (codepoint == 0x0150) || (codepoint == 0x0151) || (codepoint == 0x0154) || (codepoint == 0x0155) || \ - (codepoint >= 0x0158 && codepoint <= 0x015B) || (codepoint == 0x015E) || (codepoint == 0x015F) || (codepoint >= 0x0160 && codepoint <= 0x0165) || \ - (codepoint == 0x016E) || (codepoint == 0x016F) || (codepoint == 0x0170) || (codepoint == 0x0171) || (codepoint >= 0x0179 && codepoint <= 0x017E) || \ - (codepoint == 0x02C7) || (codepoint == 0x02D8) || (codepoint == 0x02D9) || (codepoint == 0x02DB) || (codepoint == 0x02DD)) - -#define isIBM913(codepoint) \ - ((codepoint >= 0x0108 && codepoint <= 0x010B) || (codepoint == 0x011C) || \ - (codepoint == 0x011D) || (codepoint == 0x0120) || (codepoint == 0x0121) || \ - (codepoint >= 0x0124 && codepoint <= 0x0127) || (codepoint == 0x0134) || (codepoint == 0x0135) || \ - (codepoint == 0x015C) || (codepoint == 0x015D) || (codepoint == 0x016C) || (codepoint == 0x016D)) - -#define isCompoundS1(codepoint) \ - ((codepoint == 0x011E) || (codepoint == 0x011F) || (codepoint == 0x0130) || \ - (codepoint == 0x0131) || (codepoint >= 0x0218 && codepoint <= 0x021B)) - -#define isISO8859_14(codepoint) \ - ((codepoint >= 0x0174 && codepoint <= 0x0177) || (codepoint == 0x1E0A) || \ - (codepoint == 0x1E0B) || (codepoint == 0x1E1E) || (codepoint == 0x1E1F) || \ - (codepoint == 0x1E40) || (codepoint == 0x1E41) || (codepoint == 0x1E56) || \ - (codepoint == 0x1E57) || (codepoint == 0x1E60) || (codepoint == 0x1E61) || \ - (codepoint == 0x1E6A) || (codepoint == 0x1E6B) || (codepoint == 0x1EF2) || \ - (codepoint == 0x1EF3) || (codepoint >= 0x1E80 && codepoint <= 0x1E85)) - -#define isIBM923(codepoint) \ - ((codepoint == 0x0152) || (codepoint == 0x0153) || (codepoint == 0x0178) || (codepoint == 0x20AC)) - - -typedef struct{ - UConverterSharedData *myConverterArray[NUM_OF_CONVERTERS]; - COMPOUND_TEXT_CONVERTERS state; -} UConverterDataCompoundText; - -/*********** Compound Text Converter Protos ***********/ -static void -_CompoundTextOpen(UConverter *cnv, UConverterLoadArgs *pArgs, UErrorCode *errorCode); - -static void - _CompoundTextClose(UConverter *converter); - -static void -_CompoundTextReset(UConverter *converter, UConverterResetChoice choice); - -static const char* -_CompoundTextgetName(const UConverter* cnv); - - -static int32_t findNextEsc(const char *source, const char *sourceLimit) { - int32_t length = sourceLimit - source; - int32_t i; - for (i = 1; i < length; i++) { - if (*(source + i) == 0x1B) { - return i; - } - } - - return length; -} - -static COMPOUND_TEXT_CONVERTERS getState(int codepoint) { - COMPOUND_TEXT_CONVERTERS state = DO_SEARCH; - - if (isASCIIRange(codepoint)) { - state = COMPOUND_TEXT_SINGLE_0; - } else if (isIBM912(codepoint)) { - state = IBM_912; - }else if (isIBM913(codepoint)) { - state = IBM_913; - } else if (isISO8859_14(codepoint)) { - state = ISO_8859_14; - } else if (isIBM923(codepoint)) { - state = IBM_923; - } else if (isIBM874(codepoint)) { - state = IBM_874; - } else if (isIBM914(codepoint)) { - state = IBM_914; - } else if (isCompoundS2(codepoint)) { - state = COMPOUND_TEXT_SINGLE_2; - } else if (isCompoundS3(codepoint)) { - state = COMPOUND_TEXT_SINGLE_3; - } else if (isIBM916(codepoint)) { - state = IBM_916; - } else if (isIBM915(codepoint)) { - state = IBM_915; - } else if (isCompoundS1(codepoint)) { - state = COMPOUND_TEXT_SINGLE_1; - } - - return state; -} - -static COMPOUND_TEXT_CONVERTERS findStateFromEscSeq(const char* source, const char* sourceLimit, const uint8_t* toUBytesBuffer, int32_t toUBytesBufferLength, UErrorCode *err) { - COMPOUND_TEXT_CONVERTERS state = INVALID; - UBool matchFound = FALSE; - int32_t i, n, offset = toUBytesBufferLength; - - for (i = 0; i < NUM_OF_CONVERTERS; i++) { - matchFound = TRUE; - for (n = 0; escSeqCompoundText[i][n] != 0; n++) { - if (n < toUBytesBufferLength) { - if (toUBytesBuffer[n] != escSeqCompoundText[i][n]) { - matchFound = FALSE; - break; - } - } else if ((source + (n - offset)) >= sourceLimit) { - *err = U_TRUNCATED_CHAR_FOUND; - matchFound = FALSE; - break; - } else if (*(source + (n - offset)) != escSeqCompoundText[i][n]) { - matchFound = FALSE; - break; - } - } - - if (matchFound) { - break; - } - } - - if (matchFound) { - state = (COMPOUND_TEXT_CONVERTERS)i; - } - - return state; -} - -static void -_CompoundTextOpen(UConverter *cnv, UConverterLoadArgs *pArgs, UErrorCode *errorCode){ - cnv->extraInfo = uprv_malloc (sizeof (UConverterDataCompoundText)); - if (cnv->extraInfo != NULL) { - UConverterDataCompoundText *myConverterData = (UConverterDataCompoundText *) cnv->extraInfo; - - UConverterNamePieces stackPieces; - UConverterLoadArgs stackArgs={ (int32_t)sizeof(UConverterLoadArgs) }; - - myConverterData->myConverterArray[COMPOUND_TEXT_SINGLE_0] = NULL; - myConverterData->myConverterArray[COMPOUND_TEXT_SINGLE_1] = ucnv_loadSharedData("icu-internal-compound-s1", &stackPieces, &stackArgs, errorCode); - myConverterData->myConverterArray[COMPOUND_TEXT_SINGLE_2] = ucnv_loadSharedData("icu-internal-compound-s2", &stackPieces, &stackArgs, errorCode); - myConverterData->myConverterArray[COMPOUND_TEXT_SINGLE_3] = ucnv_loadSharedData("icu-internal-compound-s3", &stackPieces, &stackArgs, errorCode); - myConverterData->myConverterArray[COMPOUND_TEXT_DOUBLE_1] = ucnv_loadSharedData("icu-internal-compound-d1", &stackPieces, &stackArgs, errorCode); - myConverterData->myConverterArray[COMPOUND_TEXT_DOUBLE_2] = ucnv_loadSharedData("icu-internal-compound-d2", &stackPieces, &stackArgs, errorCode); - myConverterData->myConverterArray[COMPOUND_TEXT_DOUBLE_3] = ucnv_loadSharedData("icu-internal-compound-d3", &stackPieces, &stackArgs, errorCode); - myConverterData->myConverterArray[COMPOUND_TEXT_DOUBLE_4] = ucnv_loadSharedData("icu-internal-compound-d4", &stackPieces, &stackArgs, errorCode); - myConverterData->myConverterArray[COMPOUND_TEXT_DOUBLE_5] = ucnv_loadSharedData("icu-internal-compound-d5", &stackPieces, &stackArgs, errorCode); - myConverterData->myConverterArray[COMPOUND_TEXT_DOUBLE_6] = ucnv_loadSharedData("icu-internal-compound-d6", &stackPieces, &stackArgs, errorCode); - myConverterData->myConverterArray[COMPOUND_TEXT_DOUBLE_7] = ucnv_loadSharedData("icu-internal-compound-d7", &stackPieces, &stackArgs, errorCode); - myConverterData->myConverterArray[COMPOUND_TEXT_TRIPLE_DOUBLE] = ucnv_loadSharedData("icu-internal-compound-t", &stackPieces, &stackArgs, errorCode); - - myConverterData->myConverterArray[IBM_915] = ucnv_loadSharedData("ibm-915_P100-1995", &stackPieces, &stackArgs, errorCode); - myConverterData->myConverterArray[IBM_916] = ucnv_loadSharedData("ibm-916_P100-1995", &stackPieces, &stackArgs, errorCode); - myConverterData->myConverterArray[IBM_914] = ucnv_loadSharedData("ibm-914_P100-1995", &stackPieces, &stackArgs, errorCode); - myConverterData->myConverterArray[IBM_874] = ucnv_loadSharedData("ibm-874_P100-1995", &stackPieces, &stackArgs, errorCode); - myConverterData->myConverterArray[IBM_912] = ucnv_loadSharedData("ibm-912_P100-1995", &stackPieces, &stackArgs, errorCode); - myConverterData->myConverterArray[IBM_913] = ucnv_loadSharedData("ibm-913_P100-2000", &stackPieces, &stackArgs, errorCode); - myConverterData->myConverterArray[ISO_8859_14] = ucnv_loadSharedData("iso-8859_14-1998", &stackPieces, &stackArgs, errorCode); - myConverterData->myConverterArray[IBM_923] = ucnv_loadSharedData("ibm-923_P100-1998", &stackPieces, &stackArgs, errorCode); - - if (U_FAILURE(*errorCode) || pArgs->onlyTestIsLoadable) { - _CompoundTextClose(cnv); - return; - } - - myConverterData->state = (COMPOUND_TEXT_CONVERTERS)0; - } else { - *errorCode = U_MEMORY_ALLOCATION_ERROR; - } -} - - -static void -_CompoundTextClose(UConverter *converter) { - UConverterDataCompoundText* myConverterData = (UConverterDataCompoundText*)(converter->extraInfo); - int32_t i; - - if (converter->extraInfo != NULL) { - /*close the array of converter pointers and free the memory*/ - for (i = 0; i < NUM_OF_CONVERTERS; i++) { - if (myConverterData->myConverterArray[i] != NULL) { - ucnv_unloadSharedDataIfReady(myConverterData->myConverterArray[i]); - } - } - - uprv_free(converter->extraInfo); - } -} - -static void -_CompoundTextReset(UConverter *converter, UConverterResetChoice choice) { -} - -static const char* -_CompoundTextgetName(const UConverter* cnv){ - return "x11-compound-text"; -} - -static void -UConverter_fromUnicode_CompoundText_OFFSETS(UConverterFromUnicodeArgs* args, UErrorCode* err){ - UConverter *cnv = args->converter; - uint8_t *target = (uint8_t *) args->target; - const uint8_t *targetLimit = (const uint8_t *) args->targetLimit; - const UChar* source = args->source; - const UChar* sourceLimit = args->sourceLimit; - /* int32_t* offsets = args->offsets; */ - UChar32 sourceChar; - UBool useFallback = cnv->useFallback; - uint8_t tmpTargetBuffer[7]; - int32_t tmpTargetBufferLength = 0; - COMPOUND_TEXT_CONVERTERS currentState, tmpState; - uint32_t pValue; - int32_t pValueLength = 0; - int32_t i, n, j; - - UConverterDataCompoundText *myConverterData = (UConverterDataCompoundText *) cnv->extraInfo; - - currentState = myConverterData->state; - - /* check if the last codepoint of previous buffer was a lead surrogate*/ - if((sourceChar = cnv->fromUChar32)!=0 && target< targetLimit) { - goto getTrail; - } - - while( source < sourceLimit){ - if(target < targetLimit){ - - sourceChar = *(source++); - /*check if the char is a First surrogate*/ - if(U16_IS_SURROGATE(sourceChar)) { - if(U16_IS_SURROGATE_LEAD(sourceChar)) { -getTrail: - /*look ahead to find the trail surrogate*/ - if(source < sourceLimit) { - /* test the following code unit */ - UChar trail=(UChar) *source; - if(U16_IS_TRAIL(trail)) { - source++; - sourceChar=U16_GET_SUPPLEMENTARY(sourceChar, trail); - cnv->fromUChar32=0x00; - /* convert this supplementary code point */ - /* exit this condition tree */ - } else { - /* this is an unmatched lead code unit (1st surrogate) */ - /* callback(illegal) */ - *err=U_ILLEGAL_CHAR_FOUND; - cnv->fromUChar32=sourceChar; - break; - } - } else { - /* no more input */ - cnv->fromUChar32=sourceChar; - break; - } - } else { - /* this is an unmatched trail code unit (2nd surrogate) */ - /* callback(illegal) */ - *err=U_ILLEGAL_CHAR_FOUND; - cnv->fromUChar32=sourceChar; - break; - } - } - - tmpTargetBufferLength = 0; - tmpState = getState(sourceChar); - - if (tmpState != DO_SEARCH && currentState != tmpState) { - /* Get escape sequence if necessary */ - currentState = tmpState; - for (i = 0; escSeqCompoundText[currentState][i] != 0; i++) { - tmpTargetBuffer[tmpTargetBufferLength++] = escSeqCompoundText[currentState][i]; - } - } - - if (tmpState == DO_SEARCH) { - /* Test all available converters */ - for (i = 1; i < SEARCH_LENGTH; i++) { - pValueLength = ucnv_MBCSFromUChar32(myConverterData->myConverterArray[i], sourceChar, &pValue, useFallback); - if (pValueLength > 0) { - tmpState = (COMPOUND_TEXT_CONVERTERS)i; - if (currentState != tmpState) { - currentState = tmpState; - for (j = 0; escSeqCompoundText[currentState][j] != 0; j++) { - tmpTargetBuffer[tmpTargetBufferLength++] = escSeqCompoundText[currentState][j]; - } - } - for (n = (pValueLength - 1); n >= 0; n--) { - tmpTargetBuffer[tmpTargetBufferLength++] = (uint8_t)(pValue >> (n * 8)); - } - break; - } - } - } else if (tmpState == COMPOUND_TEXT_SINGLE_0) { - tmpTargetBuffer[tmpTargetBufferLength++] = (uint8_t)sourceChar; - } else { - pValueLength = ucnv_MBCSFromUChar32(myConverterData->myConverterArray[currentState], sourceChar, &pValue, useFallback); - if (pValueLength > 0) { - for (n = (pValueLength - 1); n >= 0; n--) { - tmpTargetBuffer[tmpTargetBufferLength++] = (uint8_t)(pValue >> (n * 8)); - } - } - } - - for (i = 0; i < tmpTargetBufferLength; i++) { - if (target < targetLimit) { - *target++ = tmpTargetBuffer[i]; - } else { - *err = U_BUFFER_OVERFLOW_ERROR; - break; - } - } - - if (*err == U_BUFFER_OVERFLOW_ERROR) { - for (; i < tmpTargetBufferLength; i++) { - args->converter->charErrorBuffer[args->converter->charErrorBufferLength++] = tmpTargetBuffer[i]; - } - } - } else { - *err = U_BUFFER_OVERFLOW_ERROR; - break; - } - } - - /*save the state and return */ - myConverterData->state = currentState; - args->source = source; - args->target = (char*)target; -} - - -static void -UConverter_toUnicode_CompoundText_OFFSETS(UConverterToUnicodeArgs *args, - UErrorCode* err){ - const char *mySource = (char *) args->source; - UChar *myTarget = args->target; - const char *mySourceLimit = args->sourceLimit; - const char *tmpSourceLimit = mySourceLimit; - uint32_t mySourceChar = 0x0000; - COMPOUND_TEXT_CONVERTERS currentState, tmpState; - int32_t sourceOffset = 0; - UConverterDataCompoundText *myConverterData = (UConverterDataCompoundText *) args->converter->extraInfo; - UConverterSharedData* savedSharedData = NULL; - - UConverterToUnicodeArgs subArgs; - int32_t minArgsSize; - - /* set up the subconverter arguments */ - if(args->sizesize; - } else { - minArgsSize = (int32_t)sizeof(UConverterToUnicodeArgs); - } - - uprv_memcpy(&subArgs, args, minArgsSize); - subArgs.size = (uint16_t)minArgsSize; - - currentState = tmpState = myConverterData->state; - - while(mySource < mySourceLimit){ - if(myTarget < args->targetLimit){ - if (args->converter->toULength > 0) { - mySourceChar = args->converter->toUBytes[0]; - } else { - mySourceChar = (uint8_t)*mySource; - } - - if (mySourceChar == ESC_START) { - tmpState = findStateFromEscSeq(mySource, mySourceLimit, args->converter->toUBytes, args->converter->toULength, err); - - if (*err == U_TRUNCATED_CHAR_FOUND) { - for (; mySource < mySourceLimit;) { - args->converter->toUBytes[args->converter->toULength++] = *mySource++; - } - *err = U_ZERO_ERROR; - break; - } else if (tmpState == INVALID) { - if (args->converter->toULength == 0) { - mySource++; /* skip over the 0x1b byte */ - } - *err = U_ILLEGAL_CHAR_FOUND; - break; - } - - if (tmpState != currentState) { - currentState = tmpState; - } - - sourceOffset = uprv_strlen((char*)escSeqCompoundText[currentState]) - args->converter->toULength; - - mySource += sourceOffset; - - args->converter->toULength = 0; - } - - if (currentState == COMPOUND_TEXT_SINGLE_0) { - while (mySource < mySourceLimit) { - if (*mySource == ESC_START) { - break; - } - if (myTarget < args->targetLimit) { - *myTarget++ = 0x00ff&(*mySource++); - } else { - *err = U_BUFFER_OVERFLOW_ERROR; - break; - } - } - } else if (mySource < mySourceLimit){ - sourceOffset = findNextEsc(mySource, mySourceLimit); - - tmpSourceLimit = mySource + sourceOffset; - - subArgs.source = mySource; - subArgs.sourceLimit = tmpSourceLimit; - subArgs.target = myTarget; - savedSharedData = subArgs.converter->sharedData; - subArgs.converter->sharedData = myConverterData->myConverterArray[currentState]; - - ucnv_MBCSToUnicodeWithOffsets(&subArgs, err); - - subArgs.converter->sharedData = savedSharedData; - - mySource = subArgs.source; - myTarget = subArgs.target; - - if (U_FAILURE(*err)) { - if(*err == U_BUFFER_OVERFLOW_ERROR) { - if(subArgs.converter->UCharErrorBufferLength > 0) { - uprv_memcpy(args->converter->UCharErrorBuffer, subArgs.converter->UCharErrorBuffer, - subArgs.converter->UCharErrorBufferLength); - } - args->converter->UCharErrorBufferLength=subArgs.converter->UCharErrorBufferLength; - subArgs.converter->UCharErrorBufferLength = 0; - } - break; - } - } - } else { - *err = U_BUFFER_OVERFLOW_ERROR; - break; - } - } - myConverterData->state = currentState; - args->target = myTarget; - args->source = mySource; -} - -static void -_CompoundText_GetUnicodeSet(const UConverter *cnv, - const USetAdder *sa, - UConverterUnicodeSet which, - UErrorCode *pErrorCode) { - UConverterDataCompoundText *myConverterData = (UConverterDataCompoundText *)cnv->extraInfo; - int32_t i; - - for (i = 1; i < NUM_OF_CONVERTERS; i++) { - ucnv_MBCSGetUnicodeSetForUnicode(myConverterData->myConverterArray[i], sa, which, pErrorCode); - } - sa->add(sa->set, 0x0000); - sa->add(sa->set, 0x0009); - sa->add(sa->set, 0x000A); - sa->addRange(sa->set, 0x0020, 0x007F); - sa->addRange(sa->set, 0x00A0, 0x00FF); -} - -static const UConverterImpl _CompoundTextImpl = { - - UCNV_COMPOUND_TEXT, - - NULL, - NULL, - - _CompoundTextOpen, - _CompoundTextClose, - _CompoundTextReset, - - UConverter_toUnicode_CompoundText_OFFSETS, - UConverter_toUnicode_CompoundText_OFFSETS, - UConverter_fromUnicode_CompoundText_OFFSETS, - UConverter_fromUnicode_CompoundText_OFFSETS, - NULL, - - NULL, - _CompoundTextgetName, - NULL, - NULL, - _CompoundText_GetUnicodeSet -}; -static const UConverterStaticData _CompoundTextStaticData = { - sizeof(UConverterStaticData), - "COMPOUND_TEXT", - 0, - UCNV_IBM, - UCNV_COMPOUND_TEXT, - 1, - 6, - { 0xef, 0, 0, 0 }, - 1, - FALSE, - FALSE, - 0, - 0, - { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 } /* reserved */ -}; -const UConverterSharedData _CompoundTextData = - UCNV_IMMUTABLE_SHARED_DATA_INITIALIZER(&_CompoundTextStaticData, &_CompoundTextImpl); - -#endif /* #if !UCONFIG_NO_LEGACY_CONVERSION */ diff --git a/Build/source/libs/icu/icu-src/source/common/ucnv_ct.cpp b/Build/source/libs/icu/icu-src/source/common/ucnv_ct.cpp new file mode 100644 index 00000000000..51e31aa4116 --- /dev/null +++ b/Build/source/libs/icu/icu-src/source/common/ucnv_ct.cpp @@ -0,0 +1,646 @@ +// © 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html +/* +********************************************************************** +* Copyright (C) 2010-2015, International Business Machines +* Corporation and others. All Rights Reserved. +********************************************************************** +* file name: ucnv_ct.c +* encoding: UTF-8 +* tab size: 8 (not used) +* indentation:4 +* +* created on: 2010Dec09 +* created by: Michael Ow +*/ + +#include "unicode/utypes.h" + +#if !UCONFIG_NO_CONVERSION && !UCONFIG_NO_LEGACY_CONVERSION && !UCONFIG_ONLY_HTML_CONVERSION + +#include "unicode/ucnv.h" +#include "unicode/uset.h" +#include "unicode/ucnv_err.h" +#include "unicode/ucnv_cb.h" +#include "unicode/utf16.h" +#include "ucnv_imp.h" +#include "ucnv_bld.h" +#include "ucnv_cnv.h" +#include "ucnvmbcs.h" +#include "cstring.h" +#include "cmemory.h" + +typedef enum { + INVALID = -2, + DO_SEARCH = -1, + + COMPOUND_TEXT_SINGLE_0 = 0, + COMPOUND_TEXT_SINGLE_1 = 1, + COMPOUND_TEXT_SINGLE_2 = 2, + COMPOUND_TEXT_SINGLE_3 = 3, + + COMPOUND_TEXT_DOUBLE_1 = 4, + COMPOUND_TEXT_DOUBLE_2 = 5, + COMPOUND_TEXT_DOUBLE_3 = 6, + COMPOUND_TEXT_DOUBLE_4 = 7, + COMPOUND_TEXT_DOUBLE_5 = 8, + COMPOUND_TEXT_DOUBLE_6 = 9, + COMPOUND_TEXT_DOUBLE_7 = 10, + + COMPOUND_TEXT_TRIPLE_DOUBLE = 11, + + IBM_915 = 12, + IBM_916 = 13, + IBM_914 = 14, + IBM_874 = 15, + IBM_912 = 16, + IBM_913 = 17, + ISO_8859_14 = 18, + IBM_923 = 19, + NUM_OF_CONVERTERS = 20 +} COMPOUND_TEXT_CONVERTERS; + +#define SEARCH_LENGTH 12 + +static const uint8_t escSeqCompoundText[NUM_OF_CONVERTERS][5] = { + /* Single */ + { 0x1B, 0x2D, 0x41, 0, 0 }, + { 0x1B, 0x2D, 0x4D, 0, 0 }, + { 0x1B, 0x2D, 0x46, 0, 0 }, + { 0x1B, 0x2D, 0x47, 0, 0 }, + + /* Double */ + { 0x1B, 0x24, 0x29, 0x41, 0 }, + { 0x1B, 0x24, 0x29, 0x42, 0 }, + { 0x1B, 0x24, 0x29, 0x43, 0 }, + { 0x1B, 0x24, 0x29, 0x44, 0 }, + { 0x1B, 0x24, 0x29, 0x47, 0 }, + { 0x1B, 0x24, 0x29, 0x48, 0 }, + { 0x1B, 0x24, 0x29, 0x49, 0 }, + + /* Triple/Double */ + { 0x1B, 0x25, 0x47, 0, 0 }, + + /*IBM-915*/ + { 0x1B, 0x2D, 0x4C, 0, 0 }, + /*IBM-916*/ + { 0x1B, 0x2D, 0x48, 0, 0 }, + /*IBM-914*/ + { 0x1B, 0x2D, 0x44, 0, 0 }, + /*IBM-874*/ + { 0x1B, 0x2D, 0x54, 0, 0 }, + /*IBM-912*/ + { 0x1B, 0x2D, 0x42, 0, 0 }, + /* IBM-913 */ + { 0x1B, 0x2D, 0x43, 0, 0 }, + /* ISO-8859_14 */ + { 0x1B, 0x2D, 0x5F, 0, 0 }, + /* IBM-923 */ + { 0x1B, 0x2D, 0x62, 0, 0 }, +}; + +#define ESC_START 0x1B + +#define isASCIIRange(codepoint) \ + ((codepoint == 0x0000) || (codepoint == 0x0009) || (codepoint == 0x000A) || \ + (codepoint >= 0x0020 && codepoint <= 0x007f) || (codepoint >= 0x00A0 && codepoint <= 0x00FF)) + +#define isIBM915(codepoint) \ + ((codepoint >= 0x0401 && codepoint <= 0x045F) || (codepoint == 0x2116)) + +#define isIBM916(codepoint) \ + ((codepoint >= 0x05D0 && codepoint <= 0x05EA) || (codepoint == 0x2017) || (codepoint == 0x203E)) + +#define isCompoundS3(codepoint) \ + ((codepoint == 0x060C) || (codepoint == 0x061B) || (codepoint == 0x061F) || (codepoint >= 0x0621 && codepoint <= 0x063A) || \ + (codepoint >= 0x0640 && codepoint <= 0x0652) || (codepoint >= 0x0660 && codepoint <= 0x066D) || (codepoint == 0x200B) || \ + (codepoint >= 0x0FE70 && codepoint <= 0x0FE72) || (codepoint == 0x0FE74) || (codepoint >= 0x0FE76 && codepoint <= 0x0FEBE)) + +#define isCompoundS2(codepoint) \ + ((codepoint == 0x02BC) || (codepoint == 0x02BD) || (codepoint >= 0x0384 && codepoint <= 0x03CE) || (codepoint == 0x2015)) + +#define isIBM914(codepoint) \ + ((codepoint == 0x0100) || (codepoint == 0x0101) || (codepoint == 0x0112) || (codepoint == 0x0113) || (codepoint == 0x0116) || (codepoint == 0x0117) || \ + (codepoint == 0x0122) || (codepoint == 0x0123) || (codepoint >= 0x0128 && codepoint <= 0x012B) || (codepoint == 0x012E) || (codepoint == 0x012F) || \ + (codepoint >= 0x0136 && codepoint <= 0x0138) || (codepoint == 0x013B) || (codepoint == 0x013C) || (codepoint == 0x0145) || (codepoint == 0x0146) || \ + (codepoint >= 0x014A && codepoint <= 0x014D) || (codepoint == 0x0156) || (codepoint == 0x0157) || (codepoint >= 0x0166 && codepoint <= 0x016B) || \ + (codepoint == 0x0172) || (codepoint == 0x0173)) + +#define isIBM874(codepoint) \ + ((codepoint >= 0x0E01 && codepoint <= 0x0E3A) || (codepoint >= 0x0E3F && codepoint <= 0x0E5B)) + +#define isIBM912(codepoint) \ + ((codepoint >= 0x0102 && codepoint <= 0x0107) || (codepoint >= 0x010C && codepoint <= 0x0111) || (codepoint >= 0x0118 && codepoint <= 0x011B) || \ + (codepoint == 0x0139) || (codepoint == 0x013A) || (codepoint == 0x013D) || (codepoint == 0x013E) || (codepoint >= 0x0141 && codepoint <= 0x0144) || \ + (codepoint == 0x0147) || (codepoint == 0x0147) || (codepoint == 0x0150) || (codepoint == 0x0151) || (codepoint == 0x0154) || (codepoint == 0x0155) || \ + (codepoint >= 0x0158 && codepoint <= 0x015B) || (codepoint == 0x015E) || (codepoint == 0x015F) || (codepoint >= 0x0160 && codepoint <= 0x0165) || \ + (codepoint == 0x016E) || (codepoint == 0x016F) || (codepoint == 0x0170) || (codepoint == 0x0171) || (codepoint >= 0x0179 && codepoint <= 0x017E) || \ + (codepoint == 0x02C7) || (codepoint == 0x02D8) || (codepoint == 0x02D9) || (codepoint == 0x02DB) || (codepoint == 0x02DD)) + +#define isIBM913(codepoint) \ + ((codepoint >= 0x0108 && codepoint <= 0x010B) || (codepoint == 0x011C) || \ + (codepoint == 0x011D) || (codepoint == 0x0120) || (codepoint == 0x0121) || \ + (codepoint >= 0x0124 && codepoint <= 0x0127) || (codepoint == 0x0134) || (codepoint == 0x0135) || \ + (codepoint == 0x015C) || (codepoint == 0x015D) || (codepoint == 0x016C) || (codepoint == 0x016D)) + +#define isCompoundS1(codepoint) \ + ((codepoint == 0x011E) || (codepoint == 0x011F) || (codepoint == 0x0130) || \ + (codepoint == 0x0131) || (codepoint >= 0x0218 && codepoint <= 0x021B)) + +#define isISO8859_14(codepoint) \ + ((codepoint >= 0x0174 && codepoint <= 0x0177) || (codepoint == 0x1E0A) || \ + (codepoint == 0x1E0B) || (codepoint == 0x1E1E) || (codepoint == 0x1E1F) || \ + (codepoint == 0x1E40) || (codepoint == 0x1E41) || (codepoint == 0x1E56) || \ + (codepoint == 0x1E57) || (codepoint == 0x1E60) || (codepoint == 0x1E61) || \ + (codepoint == 0x1E6A) || (codepoint == 0x1E6B) || (codepoint == 0x1EF2) || \ + (codepoint == 0x1EF3) || (codepoint >= 0x1E80 && codepoint <= 0x1E85)) + +#define isIBM923(codepoint) \ + ((codepoint == 0x0152) || (codepoint == 0x0153) || (codepoint == 0x0178) || (codepoint == 0x20AC)) + + +typedef struct{ + UConverterSharedData *myConverterArray[NUM_OF_CONVERTERS]; + COMPOUND_TEXT_CONVERTERS state; +} UConverterDataCompoundText; + +/*********** Compound Text Converter Protos ***********/ +U_CDECL_BEGIN +static void U_CALLCONV +_CompoundTextOpen(UConverter *cnv, UConverterLoadArgs *pArgs, UErrorCode *errorCode); + +static void U_CALLCONV + _CompoundTextClose(UConverter *converter); + +static void U_CALLCONV +_CompoundTextReset(UConverter *converter, UConverterResetChoice choice); + +static const char* U_CALLCONV +_CompoundTextgetName(const UConverter* cnv); + + +static int32_t findNextEsc(const char *source, const char *sourceLimit) { + int32_t length = sourceLimit - source; + int32_t i; + for (i = 1; i < length; i++) { + if (*(source + i) == 0x1B) { + return i; + } + } + + return length; +} + +static COMPOUND_TEXT_CONVERTERS getState(int codepoint) { + COMPOUND_TEXT_CONVERTERS state = DO_SEARCH; + + if (isASCIIRange(codepoint)) { + state = COMPOUND_TEXT_SINGLE_0; + } else if (isIBM912(codepoint)) { + state = IBM_912; + }else if (isIBM913(codepoint)) { + state = IBM_913; + } else if (isISO8859_14(codepoint)) { + state = ISO_8859_14; + } else if (isIBM923(codepoint)) { + state = IBM_923; + } else if (isIBM874(codepoint)) { + state = IBM_874; + } else if (isIBM914(codepoint)) { + state = IBM_914; + } else if (isCompoundS2(codepoint)) { + state = COMPOUND_TEXT_SINGLE_2; + } else if (isCompoundS3(codepoint)) { + state = COMPOUND_TEXT_SINGLE_3; + } else if (isIBM916(codepoint)) { + state = IBM_916; + } else if (isIBM915(codepoint)) { + state = IBM_915; + } else if (isCompoundS1(codepoint)) { + state = COMPOUND_TEXT_SINGLE_1; + } + + return state; +} + +static COMPOUND_TEXT_CONVERTERS findStateFromEscSeq(const char* source, const char* sourceLimit, const uint8_t* toUBytesBuffer, int32_t toUBytesBufferLength, UErrorCode *err) { + COMPOUND_TEXT_CONVERTERS state = INVALID; + UBool matchFound = FALSE; + int32_t i, n, offset = toUBytesBufferLength; + + for (i = 0; i < NUM_OF_CONVERTERS; i++) { + matchFound = TRUE; + for (n = 0; escSeqCompoundText[i][n] != 0; n++) { + if (n < toUBytesBufferLength) { + if (toUBytesBuffer[n] != escSeqCompoundText[i][n]) { + matchFound = FALSE; + break; + } + } else if ((source + (n - offset)) >= sourceLimit) { + *err = U_TRUNCATED_CHAR_FOUND; + matchFound = FALSE; + break; + } else if (*(source + (n - offset)) != escSeqCompoundText[i][n]) { + matchFound = FALSE; + break; + } + } + + if (matchFound) { + break; + } + } + + if (matchFound) { + state = (COMPOUND_TEXT_CONVERTERS)i; + } + + return state; +} + +static void U_CALLCONV +_CompoundTextOpen(UConverter *cnv, UConverterLoadArgs *pArgs, UErrorCode *errorCode){ + cnv->extraInfo = uprv_malloc (sizeof (UConverterDataCompoundText)); + if (cnv->extraInfo != NULL) { + UConverterDataCompoundText *myConverterData = (UConverterDataCompoundText *) cnv->extraInfo; + + UConverterNamePieces stackPieces; + UConverterLoadArgs stackArgs=UCNV_LOAD_ARGS_INITIALIZER; + + myConverterData->myConverterArray[COMPOUND_TEXT_SINGLE_0] = NULL; + myConverterData->myConverterArray[COMPOUND_TEXT_SINGLE_1] = ucnv_loadSharedData("icu-internal-compound-s1", &stackPieces, &stackArgs, errorCode); + myConverterData->myConverterArray[COMPOUND_TEXT_SINGLE_2] = ucnv_loadSharedData("icu-internal-compound-s2", &stackPieces, &stackArgs, errorCode); + myConverterData->myConverterArray[COMPOUND_TEXT_SINGLE_3] = ucnv_loadSharedData("icu-internal-compound-s3", &stackPieces, &stackArgs, errorCode); + myConverterData->myConverterArray[COMPOUND_TEXT_DOUBLE_1] = ucnv_loadSharedData("icu-internal-compound-d1", &stackPieces, &stackArgs, errorCode); + myConverterData->myConverterArray[COMPOUND_TEXT_DOUBLE_2] = ucnv_loadSharedData("icu-internal-compound-d2", &stackPieces, &stackArgs, errorCode); + myConverterData->myConverterArray[COMPOUND_TEXT_DOUBLE_3] = ucnv_loadSharedData("icu-internal-compound-d3", &stackPieces, &stackArgs, errorCode); + myConverterData->myConverterArray[COMPOUND_TEXT_DOUBLE_4] = ucnv_loadSharedData("icu-internal-compound-d4", &stackPieces, &stackArgs, errorCode); + myConverterData->myConverterArray[COMPOUND_TEXT_DOUBLE_5] = ucnv_loadSharedData("icu-internal-compound-d5", &stackPieces, &stackArgs, errorCode); + myConverterData->myConverterArray[COMPOUND_TEXT_DOUBLE_6] = ucnv_loadSharedData("icu-internal-compound-d6", &stackPieces, &stackArgs, errorCode); + myConverterData->myConverterArray[COMPOUND_TEXT_DOUBLE_7] = ucnv_loadSharedData("icu-internal-compound-d7", &stackPieces, &stackArgs, errorCode); + myConverterData->myConverterArray[COMPOUND_TEXT_TRIPLE_DOUBLE] = ucnv_loadSharedData("icu-internal-compound-t", &stackPieces, &stackArgs, errorCode); + + myConverterData->myConverterArray[IBM_915] = ucnv_loadSharedData("ibm-915_P100-1995", &stackPieces, &stackArgs, errorCode); + myConverterData->myConverterArray[IBM_916] = ucnv_loadSharedData("ibm-916_P100-1995", &stackPieces, &stackArgs, errorCode); + myConverterData->myConverterArray[IBM_914] = ucnv_loadSharedData("ibm-914_P100-1995", &stackPieces, &stackArgs, errorCode); + myConverterData->myConverterArray[IBM_874] = ucnv_loadSharedData("ibm-874_P100-1995", &stackPieces, &stackArgs, errorCode); + myConverterData->myConverterArray[IBM_912] = ucnv_loadSharedData("ibm-912_P100-1995", &stackPieces, &stackArgs, errorCode); + myConverterData->myConverterArray[IBM_913] = ucnv_loadSharedData("ibm-913_P100-2000", &stackPieces, &stackArgs, errorCode); + myConverterData->myConverterArray[ISO_8859_14] = ucnv_loadSharedData("iso-8859_14-1998", &stackPieces, &stackArgs, errorCode); + myConverterData->myConverterArray[IBM_923] = ucnv_loadSharedData("ibm-923_P100-1998", &stackPieces, &stackArgs, errorCode); + + if (U_FAILURE(*errorCode) || pArgs->onlyTestIsLoadable) { + _CompoundTextClose(cnv); + return; + } + + myConverterData->state = (COMPOUND_TEXT_CONVERTERS)0; + } else { + *errorCode = U_MEMORY_ALLOCATION_ERROR; + } +} + + +static void U_CALLCONV +_CompoundTextClose(UConverter *converter) { + UConverterDataCompoundText* myConverterData = (UConverterDataCompoundText*)(converter->extraInfo); + int32_t i; + + if (converter->extraInfo != NULL) { + /*close the array of converter pointers and free the memory*/ + for (i = 0; i < NUM_OF_CONVERTERS; i++) { + if (myConverterData->myConverterArray[i] != NULL) { + ucnv_unloadSharedDataIfReady(myConverterData->myConverterArray[i]); + } + } + + uprv_free(converter->extraInfo); + converter->extraInfo = NULL; + } +} + +static void U_CALLCONV +_CompoundTextReset(UConverter *converter, UConverterResetChoice choice) { + (void)converter; + (void)choice; +} + +static const char* U_CALLCONV +_CompoundTextgetName(const UConverter* cnv){ + (void)cnv; + return "x11-compound-text"; +} + +static void U_CALLCONV +UConverter_fromUnicode_CompoundText_OFFSETS(UConverterFromUnicodeArgs* args, UErrorCode* err){ + UConverter *cnv = args->converter; + uint8_t *target = (uint8_t *) args->target; + const uint8_t *targetLimit = (const uint8_t *) args->targetLimit; + const UChar* source = args->source; + const UChar* sourceLimit = args->sourceLimit; + /* int32_t* offsets = args->offsets; */ + UChar32 sourceChar; + UBool useFallback = cnv->useFallback; + uint8_t tmpTargetBuffer[7]; + int32_t tmpTargetBufferLength = 0; + COMPOUND_TEXT_CONVERTERS currentState, tmpState; + uint32_t pValue; + int32_t pValueLength = 0; + int32_t i, n, j; + + UConverterDataCompoundText *myConverterData = (UConverterDataCompoundText *) cnv->extraInfo; + + currentState = myConverterData->state; + + /* check if the last codepoint of previous buffer was a lead surrogate*/ + if((sourceChar = cnv->fromUChar32)!=0 && target< targetLimit) { + goto getTrail; + } + + while( source < sourceLimit){ + if(target < targetLimit){ + + sourceChar = *(source++); + /*check if the char is a First surrogate*/ + if(U16_IS_SURROGATE(sourceChar)) { + if(U16_IS_SURROGATE_LEAD(sourceChar)) { +getTrail: + /*look ahead to find the trail surrogate*/ + if(source < sourceLimit) { + /* test the following code unit */ + UChar trail=(UChar) *source; + if(U16_IS_TRAIL(trail)) { + source++; + sourceChar=U16_GET_SUPPLEMENTARY(sourceChar, trail); + cnv->fromUChar32=0x00; + /* convert this supplementary code point */ + /* exit this condition tree */ + } else { + /* this is an unmatched lead code unit (1st surrogate) */ + /* callback(illegal) */ + *err=U_ILLEGAL_CHAR_FOUND; + cnv->fromUChar32=sourceChar; + break; + } + } else { + /* no more input */ + cnv->fromUChar32=sourceChar; + break; + } + } else { + /* this is an unmatched trail code unit (2nd surrogate) */ + /* callback(illegal) */ + *err=U_ILLEGAL_CHAR_FOUND; + cnv->fromUChar32=sourceChar; + break; + } + } + + tmpTargetBufferLength = 0; + tmpState = getState(sourceChar); + + if (tmpState != DO_SEARCH && currentState != tmpState) { + /* Get escape sequence if necessary */ + currentState = tmpState; + for (i = 0; escSeqCompoundText[currentState][i] != 0; i++) { + tmpTargetBuffer[tmpTargetBufferLength++] = escSeqCompoundText[currentState][i]; + } + } + + if (tmpState == DO_SEARCH) { + /* Test all available converters */ + for (i = 1; i < SEARCH_LENGTH; i++) { + pValueLength = ucnv_MBCSFromUChar32(myConverterData->myConverterArray[i], sourceChar, &pValue, useFallback); + if (pValueLength > 0) { + tmpState = (COMPOUND_TEXT_CONVERTERS)i; + if (currentState != tmpState) { + currentState = tmpState; + for (j = 0; escSeqCompoundText[currentState][j] != 0; j++) { + tmpTargetBuffer[tmpTargetBufferLength++] = escSeqCompoundText[currentState][j]; + } + } + for (n = (pValueLength - 1); n >= 0; n--) { + tmpTargetBuffer[tmpTargetBufferLength++] = (uint8_t)(pValue >> (n * 8)); + } + break; + } + } + } else if (tmpState == COMPOUND_TEXT_SINGLE_0) { + tmpTargetBuffer[tmpTargetBufferLength++] = (uint8_t)sourceChar; + } else { + pValueLength = ucnv_MBCSFromUChar32(myConverterData->myConverterArray[currentState], sourceChar, &pValue, useFallback); + if (pValueLength > 0) { + for (n = (pValueLength - 1); n >= 0; n--) { + tmpTargetBuffer[tmpTargetBufferLength++] = (uint8_t)(pValue >> (n * 8)); + } + } + } + + for (i = 0; i < tmpTargetBufferLength; i++) { + if (target < targetLimit) { + *target++ = tmpTargetBuffer[i]; + } else { + *err = U_BUFFER_OVERFLOW_ERROR; + break; + } + } + + if (*err == U_BUFFER_OVERFLOW_ERROR) { + for (; i < tmpTargetBufferLength; i++) { + args->converter->charErrorBuffer[args->converter->charErrorBufferLength++] = tmpTargetBuffer[i]; + } + } + } else { + *err = U_BUFFER_OVERFLOW_ERROR; + break; + } + } + + /*save the state and return */ + myConverterData->state = currentState; + args->source = source; + args->target = (char*)target; +} + + +static void U_CALLCONV +UConverter_toUnicode_CompoundText_OFFSETS(UConverterToUnicodeArgs *args, + UErrorCode* err){ + const char *mySource = (char *) args->source; + UChar *myTarget = args->target; + const char *mySourceLimit = args->sourceLimit; + const char *tmpSourceLimit = mySourceLimit; + uint32_t mySourceChar = 0x0000; + COMPOUND_TEXT_CONVERTERS currentState, tmpState; + int32_t sourceOffset = 0; + UConverterDataCompoundText *myConverterData = (UConverterDataCompoundText *) args->converter->extraInfo; + UConverterSharedData* savedSharedData = NULL; + + UConverterToUnicodeArgs subArgs; + int32_t minArgsSize; + + /* set up the subconverter arguments */ + if(args->sizesize; + } else { + minArgsSize = (int32_t)sizeof(UConverterToUnicodeArgs); + } + + uprv_memcpy(&subArgs, args, minArgsSize); + subArgs.size = (uint16_t)minArgsSize; + + currentState = tmpState = myConverterData->state; + + while(mySource < mySourceLimit){ + if(myTarget < args->targetLimit){ + if (args->converter->toULength > 0) { + mySourceChar = args->converter->toUBytes[0]; + } else { + mySourceChar = (uint8_t)*mySource; + } + + if (mySourceChar == ESC_START) { + tmpState = findStateFromEscSeq(mySource, mySourceLimit, args->converter->toUBytes, args->converter->toULength, err); + + if (*err == U_TRUNCATED_CHAR_FOUND) { + for (; mySource < mySourceLimit;) { + args->converter->toUBytes[args->converter->toULength++] = *mySource++; + } + *err = U_ZERO_ERROR; + break; + } else if (tmpState == INVALID) { + if (args->converter->toULength == 0) { + mySource++; /* skip over the 0x1b byte */ + } + *err = U_ILLEGAL_CHAR_FOUND; + break; + } + + if (tmpState != currentState) { + currentState = tmpState; + } + + sourceOffset = static_cast(uprv_strlen((char*)escSeqCompoundText[currentState]) - args->converter->toULength); + + mySource += sourceOffset; + + args->converter->toULength = 0; + } + + if (currentState == COMPOUND_TEXT_SINGLE_0) { + while (mySource < mySourceLimit) { + if (*mySource == ESC_START) { + break; + } + if (myTarget < args->targetLimit) { + *myTarget++ = 0x00ff&(*mySource++); + } else { + *err = U_BUFFER_OVERFLOW_ERROR; + break; + } + } + } else if (mySource < mySourceLimit){ + sourceOffset = findNextEsc(mySource, mySourceLimit); + + tmpSourceLimit = mySource + sourceOffset; + + subArgs.source = mySource; + subArgs.sourceLimit = tmpSourceLimit; + subArgs.target = myTarget; + savedSharedData = subArgs.converter->sharedData; + subArgs.converter->sharedData = myConverterData->myConverterArray[currentState]; + + ucnv_MBCSToUnicodeWithOffsets(&subArgs, err); + + subArgs.converter->sharedData = savedSharedData; + + mySource = subArgs.source; + myTarget = subArgs.target; + + if (U_FAILURE(*err)) { + if(*err == U_BUFFER_OVERFLOW_ERROR) { + if(subArgs.converter->UCharErrorBufferLength > 0) { + uprv_memcpy(args->converter->UCharErrorBuffer, subArgs.converter->UCharErrorBuffer, + subArgs.converter->UCharErrorBufferLength); + } + args->converter->UCharErrorBufferLength=subArgs.converter->UCharErrorBufferLength; + subArgs.converter->UCharErrorBufferLength = 0; + } + break; + } + } + } else { + *err = U_BUFFER_OVERFLOW_ERROR; + break; + } + } + myConverterData->state = currentState; + args->target = myTarget; + args->source = mySource; +} + +static void U_CALLCONV +_CompoundText_GetUnicodeSet(const UConverter *cnv, + const USetAdder *sa, + UConverterUnicodeSet which, + UErrorCode *pErrorCode) { + UConverterDataCompoundText *myConverterData = (UConverterDataCompoundText *)cnv->extraInfo; + int32_t i; + + for (i = 1; i < NUM_OF_CONVERTERS; i++) { + ucnv_MBCSGetUnicodeSetForUnicode(myConverterData->myConverterArray[i], sa, which, pErrorCode); + } + sa->add(sa->set, 0x0000); + sa->add(sa->set, 0x0009); + sa->add(sa->set, 0x000A); + sa->addRange(sa->set, 0x0020, 0x007F); + sa->addRange(sa->set, 0x00A0, 0x00FF); +} +U_CDECL_END + +static const UConverterImpl _CompoundTextImpl = { + + UCNV_COMPOUND_TEXT, + + NULL, + NULL, + + _CompoundTextOpen, + _CompoundTextClose, + _CompoundTextReset, + + UConverter_toUnicode_CompoundText_OFFSETS, + UConverter_toUnicode_CompoundText_OFFSETS, + UConverter_fromUnicode_CompoundText_OFFSETS, + UConverter_fromUnicode_CompoundText_OFFSETS, + NULL, + + NULL, + _CompoundTextgetName, + NULL, + NULL, + _CompoundText_GetUnicodeSet, + NULL, + NULL +}; + +static const UConverterStaticData _CompoundTextStaticData = { + sizeof(UConverterStaticData), + "COMPOUND_TEXT", + 0, + UCNV_IBM, + UCNV_COMPOUND_TEXT, + 1, + 6, + { 0xef, 0, 0, 0 }, + 1, + FALSE, + FALSE, + 0, + 0, + { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 } /* reserved */ +}; +const UConverterSharedData _CompoundTextData = + UCNV_IMMUTABLE_SHARED_DATA_INITIALIZER(&_CompoundTextStaticData, &_CompoundTextImpl); + +#endif /* #if !UCONFIG_NO_LEGACY_CONVERSION */ diff --git a/Build/source/libs/icu/icu-src/source/common/ucnv_err.c b/Build/source/libs/icu/icu-src/source/common/ucnv_err.c deleted file mode 100644 index c609bed4bd9..00000000000 --- a/Build/source/libs/icu/icu-src/source/common/ucnv_err.c +++ /dev/null @@ -1,481 +0,0 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. -// License & terms of use: http://www.unicode.org/copyright.html -/* - ***************************************************************************** - * - * Copyright (C) 1998-2016, International Business Machines - * Corporation and others. All Rights Reserved. - * - ***************************************************************************** - * - * ucnv_err.c - * Implements error behaviour functions called by T_UConverter_{from,to}Unicode - * - * -* Change history: -* -* 06/29/2000 helena Major rewrite of the callback APIs. -*/ - -#include "unicode/utypes.h" - -#if !UCONFIG_NO_CONVERSION - -#include "unicode/ucnv_err.h" -#include "unicode/ucnv_cb.h" -#include "ucnv_cnv.h" -#include "cmemory.h" -#include "unicode/ucnv.h" -#include "ustrfmt.h" - -#define VALUE_STRING_LENGTH 48 -/*Magic # 32 = 4(number of char in value string) * 8(max number of bytes per char for any converter) */ -#define UNICODE_PERCENT_SIGN_CODEPOINT 0x0025 -#define UNICODE_U_CODEPOINT 0x0055 -#define UNICODE_X_CODEPOINT 0x0058 -#define UNICODE_RS_CODEPOINT 0x005C -#define UNICODE_U_LOW_CODEPOINT 0x0075 -#define UNICODE_X_LOW_CODEPOINT 0x0078 -#define UNICODE_AMP_CODEPOINT 0x0026 -#define UNICODE_HASH_CODEPOINT 0x0023 -#define UNICODE_SEMICOLON_CODEPOINT 0x003B -#define UNICODE_PLUS_CODEPOINT 0x002B -#define UNICODE_LEFT_CURLY_CODEPOINT 0x007B -#define UNICODE_RIGHT_CURLY_CODEPOINT 0x007D -#define UNICODE_SPACE_CODEPOINT 0x0020 -#define UCNV_PRV_ESCAPE_ICU 0 -#define UCNV_PRV_ESCAPE_C 'C' -#define UCNV_PRV_ESCAPE_XML_DEC 'D' -#define UCNV_PRV_ESCAPE_XML_HEX 'X' -#define UCNV_PRV_ESCAPE_JAVA 'J' -#define UCNV_PRV_ESCAPE_UNICODE 'U' -#define UCNV_PRV_ESCAPE_CSS2 'S' -#define UCNV_PRV_STOP_ON_ILLEGAL 'i' - -/* - * IS_DEFAULT_IGNORABLE_CODE_POINT - * This is to check if a code point has the default ignorable unicode property. - * As such, this list needs to be updated if the ignorable code point list ever - * changes. - * To avoid dependency on other code, this list is hard coded here. - * When an ignorable code point is found and is unmappable, the default callbacks - * will ignore them. - * For a list of the default ignorable code points, use this link: http://unicode.org/cldr/utility/list-unicodeset.jsp?a=[%3ADI%3A]&g= - * - * This list should be sync with the one in CharsetCallback.java - */ -#define IS_DEFAULT_IGNORABLE_CODE_POINT(c) (\ - (c == 0x00AD) || \ - (c == 0x034F) || \ - (c == 0x061C) || \ - (c == 0x115F) || \ - (c == 0x1160) || \ - (0x17B4 <= c && c <= 0x17B5) || \ - (0x180B <= c && c <= 0x180E) || \ - (0x200B <= c && c <= 0x200F) || \ - (0x202A <= c && c <= 0x202E) || \ - (c == 0x2060) || \ - (0x2066 <= c && c <= 0x2069) || \ - (0x2061 <= c && c <= 0x2064) || \ - (0x206A <= c && c <= 0x206F) || \ - (c == 0x3164) || \ - (0x0FE00 <= c && c <= 0x0FE0F) || \ - (c == 0x0FEFF) || \ - (c == 0x0FFA0) || \ - (0x01BCA0 <= c && c <= 0x01BCA3) || \ - (0x01D173 <= c && c <= 0x01D17A) || \ - (c == 0x0E0001) || \ - (0x0E0020 <= c && c <= 0x0E007F) || \ - (0x0E0100 <= c && c <= 0x0E01EF) || \ - (c == 0x2065) || \ - (0x0FFF0 <= c && c <= 0x0FFF8) || \ - (c == 0x0E0000) || \ - (0x0E0002 <= c && c <= 0x0E001F) || \ - (0x0E0080 <= c && c <= 0x0E00FF) || \ - (0x0E01F0 <= c && c <= 0x0E0FFF) \ - ) - - -/*Function Pointer STOPS at the ILLEGAL_SEQUENCE */ -U_CAPI void U_EXPORT2 -UCNV_FROM_U_CALLBACK_STOP ( - const void *context, - UConverterFromUnicodeArgs *fromUArgs, - const UChar* codeUnits, - int32_t length, - UChar32 codePoint, - UConverterCallbackReason reason, - UErrorCode * err) -{ - if (reason == UCNV_UNASSIGNED && IS_DEFAULT_IGNORABLE_CODE_POINT(codePoint)) - { - /* - * Skip if the codepoint has unicode property of default ignorable. - */ - *err = U_ZERO_ERROR; - } - /* the caller must have set the error code accordingly */ - return; -} - - -/*Function Pointer STOPS at the ILLEGAL_SEQUENCE */ -U_CAPI void U_EXPORT2 -UCNV_TO_U_CALLBACK_STOP ( - const void *context, - UConverterToUnicodeArgs *toUArgs, - const char* codePoints, - int32_t length, - UConverterCallbackReason reason, - UErrorCode * err) -{ - /* the caller must have set the error code accordingly */ - return; -} - -U_CAPI void U_EXPORT2 -UCNV_FROM_U_CALLBACK_SKIP ( - const void *context, - UConverterFromUnicodeArgs *fromUArgs, - const UChar* codeUnits, - int32_t length, - UChar32 codePoint, - UConverterCallbackReason reason, - UErrorCode * err) -{ - if (reason <= UCNV_IRREGULAR) - { - if (reason == UCNV_UNASSIGNED && IS_DEFAULT_IGNORABLE_CODE_POINT(codePoint)) - { - /* - * Skip if the codepoint has unicode property of default ignorable. - */ - *err = U_ZERO_ERROR; - } - else if (context == NULL || (*((char*)context) == UCNV_PRV_STOP_ON_ILLEGAL && reason == UCNV_UNASSIGNED)) - { - *err = U_ZERO_ERROR; - } - /* else the caller must have set the error code accordingly. */ - } - /* else ignore the reset, close and clone calls. */ -} - -U_CAPI void U_EXPORT2 -UCNV_FROM_U_CALLBACK_SUBSTITUTE ( - const void *context, - UConverterFromUnicodeArgs *fromArgs, - const UChar* codeUnits, - int32_t length, - UChar32 codePoint, - UConverterCallbackReason reason, - UErrorCode * err) -{ - if (reason <= UCNV_IRREGULAR) - { - if (reason == UCNV_UNASSIGNED && IS_DEFAULT_IGNORABLE_CODE_POINT(codePoint)) - { - /* - * Skip if the codepoint has unicode property of default ignorable. - */ - *err = U_ZERO_ERROR; - } - else if (context == NULL || (*((char*)context) == UCNV_PRV_STOP_ON_ILLEGAL && reason == UCNV_UNASSIGNED)) - { - *err = U_ZERO_ERROR; - ucnv_cbFromUWriteSub(fromArgs, 0, err); - } - /* else the caller must have set the error code accordingly. */ - } - /* else ignore the reset, close and clone calls. */ -} - -/*uses uprv_itou to get a unicode escape sequence of the offensive sequence, - *uses a clean copy (resetted) of the converter, to convert that unicode - *escape sequence to the target codepage (if conversion failure happens then - *we revert to substituting with subchar) - */ -U_CAPI void U_EXPORT2 -UCNV_FROM_U_CALLBACK_ESCAPE ( - const void *context, - UConverterFromUnicodeArgs *fromArgs, - const UChar *codeUnits, - int32_t length, - UChar32 codePoint, - UConverterCallbackReason reason, - UErrorCode * err) -{ - - UChar valueString[VALUE_STRING_LENGTH]; - int32_t valueStringLength = 0; - int32_t i = 0; - - const UChar *myValueSource = NULL; - UErrorCode err2 = U_ZERO_ERROR; - UConverterFromUCallback original = NULL; - const void *originalContext; - - UConverterFromUCallback ignoredCallback = NULL; - const void *ignoredContext; - - if (reason > UCNV_IRREGULAR) - { - return; - } - else if (reason == UCNV_UNASSIGNED && IS_DEFAULT_IGNORABLE_CODE_POINT(codePoint)) - { - /* - * Skip if the codepoint has unicode property of default ignorable. - */ - *err = U_ZERO_ERROR; - return; - } - - ucnv_setFromUCallBack (fromArgs->converter, - (UConverterFromUCallback) UCNV_FROM_U_CALLBACK_SUBSTITUTE, - NULL, - &original, - &originalContext, - &err2); - - if (U_FAILURE (err2)) - { - *err = err2; - return; - } - if(context==NULL) - { - while (i < length) - { - valueString[valueStringLength++] = (UChar) UNICODE_PERCENT_SIGN_CODEPOINT; /* adding % */ - valueString[valueStringLength++] = (UChar) UNICODE_U_CODEPOINT; /* adding U */ - valueStringLength += uprv_itou (valueString + valueStringLength, VALUE_STRING_LENGTH - valueStringLength, (uint16_t)codeUnits[i++], 16, 4); - } - } - else - { - switch(*((char*)context)) - { - case UCNV_PRV_ESCAPE_JAVA: - while (i < length) - { - valueString[valueStringLength++] = (UChar) UNICODE_RS_CODEPOINT; /* adding \ */ - valueString[valueStringLength++] = (UChar) UNICODE_U_LOW_CODEPOINT; /* adding u */ - valueStringLength += uprv_itou (valueString + valueStringLength, VALUE_STRING_LENGTH - valueStringLength, (uint16_t)codeUnits[i++], 16, 4); - } - break; - - case UCNV_PRV_ESCAPE_C: - valueString[valueStringLength++] = (UChar) UNICODE_RS_CODEPOINT; /* adding \ */ - - if(length==2){ - valueString[valueStringLength++] = (UChar) UNICODE_U_CODEPOINT; /* adding U */ - valueStringLength += uprv_itou (valueString + valueStringLength, VALUE_STRING_LENGTH - valueStringLength, codePoint, 16, 8); - - } - else{ - valueString[valueStringLength++] = (UChar) UNICODE_U_LOW_CODEPOINT; /* adding u */ - valueStringLength += uprv_itou (valueString + valueStringLength, VALUE_STRING_LENGTH - valueStringLength, (uint16_t)codeUnits[0], 16, 4); - } - break; - - case UCNV_PRV_ESCAPE_XML_DEC: - - valueString[valueStringLength++] = (UChar) UNICODE_AMP_CODEPOINT; /* adding & */ - valueString[valueStringLength++] = (UChar) UNICODE_HASH_CODEPOINT; /* adding # */ - if(length==2){ - valueStringLength += uprv_itou (valueString + valueStringLength, VALUE_STRING_LENGTH - valueStringLength, codePoint, 10, 0); - } - else{ - valueStringLength += uprv_itou (valueString + valueStringLength, VALUE_STRING_LENGTH - valueStringLength, (uint16_t)codeUnits[0], 10, 0); - } - valueString[valueStringLength++] = (UChar) UNICODE_SEMICOLON_CODEPOINT; /* adding ; */ - break; - - case UCNV_PRV_ESCAPE_XML_HEX: - - valueString[valueStringLength++] = (UChar) UNICODE_AMP_CODEPOINT; /* adding & */ - valueString[valueStringLength++] = (UChar) UNICODE_HASH_CODEPOINT; /* adding # */ - valueString[valueStringLength++] = (UChar) UNICODE_X_LOW_CODEPOINT; /* adding x */ - if(length==2){ - valueStringLength += uprv_itou (valueString + valueStringLength, VALUE_STRING_LENGTH - valueStringLength, codePoint, 16, 0); - } - else{ - valueStringLength += uprv_itou (valueString + valueStringLength, VALUE_STRING_LENGTH - valueStringLength, (uint16_t)codeUnits[0], 16, 0); - } - valueString[valueStringLength++] = (UChar) UNICODE_SEMICOLON_CODEPOINT; /* adding ; */ - break; - - case UCNV_PRV_ESCAPE_UNICODE: - valueString[valueStringLength++] = (UChar) UNICODE_LEFT_CURLY_CODEPOINT; /* adding { */ - valueString[valueStringLength++] = (UChar) UNICODE_U_CODEPOINT; /* adding U */ - valueString[valueStringLength++] = (UChar) UNICODE_PLUS_CODEPOINT; /* adding + */ - if (length == 2) { - valueStringLength += uprv_itou (valueString + valueStringLength, VALUE_STRING_LENGTH - valueStringLength, codePoint, 16, 4); - } else { - valueStringLength += uprv_itou (valueString + valueStringLength, VALUE_STRING_LENGTH - valueStringLength, (uint16_t)codeUnits[0], 16, 4); - } - valueString[valueStringLength++] = (UChar) UNICODE_RIGHT_CURLY_CODEPOINT; /* adding } */ - break; - - case UCNV_PRV_ESCAPE_CSS2: - valueString[valueStringLength++] = (UChar) UNICODE_RS_CODEPOINT; /* adding \ */ - valueStringLength += uprv_itou (valueString + valueStringLength, VALUE_STRING_LENGTH - valueStringLength, codePoint, 16, 0); - /* Always add space character, becase the next character might be whitespace, - which would erroneously be considered the termination of the escape sequence. */ - valueString[valueStringLength++] = (UChar) UNICODE_SPACE_CODEPOINT; - break; - - default: - while (i < length) - { - valueString[valueStringLength++] = (UChar) UNICODE_PERCENT_SIGN_CODEPOINT; /* adding % */ - valueString[valueStringLength++] = (UChar) UNICODE_U_CODEPOINT; /* adding U */ - valueStringLength += uprv_itou (valueString + valueStringLength, VALUE_STRING_LENGTH - valueStringLength, (uint16_t)codeUnits[i++], 16, 4); - } - } - } - myValueSource = valueString; - - /* reset the error */ - *err = U_ZERO_ERROR; - - ucnv_cbFromUWriteUChars(fromArgs, &myValueSource, myValueSource+valueStringLength, 0, err); - - ucnv_setFromUCallBack (fromArgs->converter, - original, - originalContext, - &ignoredCallback, - &ignoredContext, - &err2); - if (U_FAILURE (err2)) - { - *err = err2; - return; - } - - return; -} - - - -U_CAPI void U_EXPORT2 -UCNV_TO_U_CALLBACK_SKIP ( - const void *context, - UConverterToUnicodeArgs *toArgs, - const char* codeUnits, - int32_t length, - UConverterCallbackReason reason, - UErrorCode * err) -{ - if (reason <= UCNV_IRREGULAR) - { - if (context == NULL || (*((char*)context) == UCNV_PRV_STOP_ON_ILLEGAL && reason == UCNV_UNASSIGNED)) - { - *err = U_ZERO_ERROR; - } - /* else the caller must have set the error code accordingly. */ - } - /* else ignore the reset, close and clone calls. */ -} - -U_CAPI void U_EXPORT2 -UCNV_TO_U_CALLBACK_SUBSTITUTE ( - const void *context, - UConverterToUnicodeArgs *toArgs, - const char* codeUnits, - int32_t length, - UConverterCallbackReason reason, - UErrorCode * err) -{ - if (reason <= UCNV_IRREGULAR) - { - if (context == NULL || (*((char*)context) == UCNV_PRV_STOP_ON_ILLEGAL && reason == UCNV_UNASSIGNED)) - { - *err = U_ZERO_ERROR; - ucnv_cbToUWriteSub(toArgs,0,err); - } - /* else the caller must have set the error code accordingly. */ - } - /* else ignore the reset, close and clone calls. */ -} - -/*uses uprv_itou to get a unicode escape sequence of the offensive sequence, - *and uses that as the substitution sequence - */ -U_CAPI void U_EXPORT2 -UCNV_TO_U_CALLBACK_ESCAPE ( - const void *context, - UConverterToUnicodeArgs *toArgs, - const char* codeUnits, - int32_t length, - UConverterCallbackReason reason, - UErrorCode * err) -{ - UChar uniValueString[VALUE_STRING_LENGTH]; - int32_t valueStringLength = 0; - int32_t i = 0; - - if (reason > UCNV_IRREGULAR) - { - return; - } - - if(context==NULL) - { - while (i < length) - { - uniValueString[valueStringLength++] = (UChar) UNICODE_PERCENT_SIGN_CODEPOINT; /* adding % */ - uniValueString[valueStringLength++] = (UChar) UNICODE_X_CODEPOINT; /* adding X */ - valueStringLength += uprv_itou (uniValueString + valueStringLength, VALUE_STRING_LENGTH - valueStringLength, (uint8_t) codeUnits[i++], 16, 2); - } - } - else - { - switch(*((char*)context)) - { - case UCNV_PRV_ESCAPE_XML_DEC: - while (i < length) - { - uniValueString[valueStringLength++] = (UChar) UNICODE_AMP_CODEPOINT; /* adding & */ - uniValueString[valueStringLength++] = (UChar) UNICODE_HASH_CODEPOINT; /* adding # */ - valueStringLength += uprv_itou (uniValueString + valueStringLength, VALUE_STRING_LENGTH - valueStringLength, (uint8_t)codeUnits[i++], 10, 0); - uniValueString[valueStringLength++] = (UChar) UNICODE_SEMICOLON_CODEPOINT; /* adding ; */ - } - break; - - case UCNV_PRV_ESCAPE_XML_HEX: - while (i < length) - { - uniValueString[valueStringLength++] = (UChar) UNICODE_AMP_CODEPOINT; /* adding & */ - uniValueString[valueStringLength++] = (UChar) UNICODE_HASH_CODEPOINT; /* adding # */ - uniValueString[valueStringLength++] = (UChar) UNICODE_X_LOW_CODEPOINT; /* adding x */ - valueStringLength += uprv_itou (uniValueString + valueStringLength, VALUE_STRING_LENGTH - valueStringLength, (uint8_t)codeUnits[i++], 16, 0); - uniValueString[valueStringLength++] = (UChar) UNICODE_SEMICOLON_CODEPOINT; /* adding ; */ - } - break; - case UCNV_PRV_ESCAPE_C: - while (i < length) - { - uniValueString[valueStringLength++] = (UChar) UNICODE_RS_CODEPOINT; /* adding \ */ - uniValueString[valueStringLength++] = (UChar) UNICODE_X_LOW_CODEPOINT; /* adding x */ - valueStringLength += uprv_itou (uniValueString + valueStringLength, VALUE_STRING_LENGTH - valueStringLength, (uint8_t)codeUnits[i++], 16, 2); - } - break; - default: - while (i < length) - { - uniValueString[valueStringLength++] = (UChar) UNICODE_PERCENT_SIGN_CODEPOINT; /* adding % */ - uniValueString[valueStringLength++] = (UChar) UNICODE_X_CODEPOINT; /* adding X */ - uprv_itou (uniValueString + valueStringLength, VALUE_STRING_LENGTH - valueStringLength, (uint8_t) codeUnits[i++], 16, 2); - valueStringLength += 2; - } - } - } - /* reset the error */ - *err = U_ZERO_ERROR; - - ucnv_cbToUWriteUChars(toArgs, uniValueString, valueStringLength, 0, err); -} - -#endif diff --git a/Build/source/libs/icu/icu-src/source/common/ucnv_err.cpp b/Build/source/libs/icu/icu-src/source/common/ucnv_err.cpp new file mode 100644 index 00000000000..31bb2ac0f9d --- /dev/null +++ b/Build/source/libs/icu/icu-src/source/common/ucnv_err.cpp @@ -0,0 +1,496 @@ +// © 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html +/* + ***************************************************************************** + * + * Copyright (C) 1998-2016, International Business Machines + * Corporation and others. All Rights Reserved. + * + ***************************************************************************** + * + * ucnv_err.c + * Implements error behaviour functions called by T_UConverter_{from,to}Unicode + * + * +* Change history: +* +* 06/29/2000 helena Major rewrite of the callback APIs. +*/ + +#include "unicode/utypes.h" + +#if !UCONFIG_NO_CONVERSION + +#include "unicode/ucnv_err.h" +#include "unicode/ucnv_cb.h" +#include "ucnv_cnv.h" +#include "cmemory.h" +#include "unicode/ucnv.h" +#include "ustrfmt.h" + +#define VALUE_STRING_LENGTH 48 +/*Magic # 32 = 4(number of char in value string) * 8(max number of bytes per char for any converter) */ +#define UNICODE_PERCENT_SIGN_CODEPOINT 0x0025 +#define UNICODE_U_CODEPOINT 0x0055 +#define UNICODE_X_CODEPOINT 0x0058 +#define UNICODE_RS_CODEPOINT 0x005C +#define UNICODE_U_LOW_CODEPOINT 0x0075 +#define UNICODE_X_LOW_CODEPOINT 0x0078 +#define UNICODE_AMP_CODEPOINT 0x0026 +#define UNICODE_HASH_CODEPOINT 0x0023 +#define UNICODE_SEMICOLON_CODEPOINT 0x003B +#define UNICODE_PLUS_CODEPOINT 0x002B +#define UNICODE_LEFT_CURLY_CODEPOINT 0x007B +#define UNICODE_RIGHT_CURLY_CODEPOINT 0x007D +#define UNICODE_SPACE_CODEPOINT 0x0020 +#define UCNV_PRV_ESCAPE_ICU 0 +#define UCNV_PRV_ESCAPE_C 'C' +#define UCNV_PRV_ESCAPE_XML_DEC 'D' +#define UCNV_PRV_ESCAPE_XML_HEX 'X' +#define UCNV_PRV_ESCAPE_JAVA 'J' +#define UCNV_PRV_ESCAPE_UNICODE 'U' +#define UCNV_PRV_ESCAPE_CSS2 'S' +#define UCNV_PRV_STOP_ON_ILLEGAL 'i' + +/* + * IS_DEFAULT_IGNORABLE_CODE_POINT + * This is to check if a code point has the default ignorable unicode property. + * As such, this list needs to be updated if the ignorable code point list ever + * changes. + * To avoid dependency on other code, this list is hard coded here. + * When an ignorable code point is found and is unmappable, the default callbacks + * will ignore them. + * For a list of the default ignorable code points, use this link: http://unicode.org/cldr/utility/list-unicodeset.jsp?a=[%3ADI%3A]&g= + * + * This list should be sync with the one in CharsetCallback.java + */ +#define IS_DEFAULT_IGNORABLE_CODE_POINT(c) (\ + (c == 0x00AD) || \ + (c == 0x034F) || \ + (c == 0x061C) || \ + (c == 0x115F) || \ + (c == 0x1160) || \ + (0x17B4 <= c && c <= 0x17B5) || \ + (0x180B <= c && c <= 0x180E) || \ + (0x200B <= c && c <= 0x200F) || \ + (0x202A <= c && c <= 0x202E) || \ + (c == 0x2060) || \ + (0x2066 <= c && c <= 0x2069) || \ + (0x2061 <= c && c <= 0x2064) || \ + (0x206A <= c && c <= 0x206F) || \ + (c == 0x3164) || \ + (0x0FE00 <= c && c <= 0x0FE0F) || \ + (c == 0x0FEFF) || \ + (c == 0x0FFA0) || \ + (0x01BCA0 <= c && c <= 0x01BCA3) || \ + (0x01D173 <= c && c <= 0x01D17A) || \ + (c == 0x0E0001) || \ + (0x0E0020 <= c && c <= 0x0E007F) || \ + (0x0E0100 <= c && c <= 0x0E01EF) || \ + (c == 0x2065) || \ + (0x0FFF0 <= c && c <= 0x0FFF8) || \ + (c == 0x0E0000) || \ + (0x0E0002 <= c && c <= 0x0E001F) || \ + (0x0E0080 <= c && c <= 0x0E00FF) || \ + (0x0E01F0 <= c && c <= 0x0E0FFF) \ + ) + + +/*Function Pointer STOPS at the ILLEGAL_SEQUENCE */ +U_CAPI void U_EXPORT2 +UCNV_FROM_U_CALLBACK_STOP ( + const void *context, + UConverterFromUnicodeArgs *fromUArgs, + const UChar* codeUnits, + int32_t length, + UChar32 codePoint, + UConverterCallbackReason reason, + UErrorCode * err) +{ + (void)context; + (void)fromUArgs; + (void)codeUnits; + (void)length; + if (reason == UCNV_UNASSIGNED && IS_DEFAULT_IGNORABLE_CODE_POINT(codePoint)) + { + /* + * Skip if the codepoint has unicode property of default ignorable. + */ + *err = U_ZERO_ERROR; + } + /* the caller must have set the error code accordingly */ + return; +} + + +/*Function Pointer STOPS at the ILLEGAL_SEQUENCE */ +U_CAPI void U_EXPORT2 +UCNV_TO_U_CALLBACK_STOP ( + const void *context, + UConverterToUnicodeArgs *toUArgs, + const char* codePoints, + int32_t length, + UConverterCallbackReason reason, + UErrorCode * err) +{ + /* the caller must have set the error code accordingly */ + (void)context; (void)toUArgs; (void)codePoints; (void)length; (void)reason; (void)err; + return; +} + +U_CAPI void U_EXPORT2 +UCNV_FROM_U_CALLBACK_SKIP ( + const void *context, + UConverterFromUnicodeArgs *fromUArgs, + const UChar* codeUnits, + int32_t length, + UChar32 codePoint, + UConverterCallbackReason reason, + UErrorCode * err) +{ + (void)fromUArgs; + (void)codeUnits; + (void)length; + if (reason <= UCNV_IRREGULAR) + { + if (reason == UCNV_UNASSIGNED && IS_DEFAULT_IGNORABLE_CODE_POINT(codePoint)) + { + /* + * Skip if the codepoint has unicode property of default ignorable. + */ + *err = U_ZERO_ERROR; + } + else if (context == NULL || (*((char*)context) == UCNV_PRV_STOP_ON_ILLEGAL && reason == UCNV_UNASSIGNED)) + { + *err = U_ZERO_ERROR; + } + /* else the caller must have set the error code accordingly. */ + } + /* else ignore the reset, close and clone calls. */ +} + +U_CAPI void U_EXPORT2 +UCNV_FROM_U_CALLBACK_SUBSTITUTE ( + const void *context, + UConverterFromUnicodeArgs *fromArgs, + const UChar* codeUnits, + int32_t length, + UChar32 codePoint, + UConverterCallbackReason reason, + UErrorCode * err) +{ + (void)codeUnits; + (void)length; + if (reason <= UCNV_IRREGULAR) + { + if (reason == UCNV_UNASSIGNED && IS_DEFAULT_IGNORABLE_CODE_POINT(codePoint)) + { + /* + * Skip if the codepoint has unicode property of default ignorable. + */ + *err = U_ZERO_ERROR; + } + else if (context == NULL || (*((char*)context) == UCNV_PRV_STOP_ON_ILLEGAL && reason == UCNV_UNASSIGNED)) + { + *err = U_ZERO_ERROR; + ucnv_cbFromUWriteSub(fromArgs, 0, err); + } + /* else the caller must have set the error code accordingly. */ + } + /* else ignore the reset, close and clone calls. */ +} + +/*uses uprv_itou to get a unicode escape sequence of the offensive sequence, + *uses a clean copy (resetted) of the converter, to convert that unicode + *escape sequence to the target codepage (if conversion failure happens then + *we revert to substituting with subchar) + */ +U_CAPI void U_EXPORT2 +UCNV_FROM_U_CALLBACK_ESCAPE ( + const void *context, + UConverterFromUnicodeArgs *fromArgs, + const UChar *codeUnits, + int32_t length, + UChar32 codePoint, + UConverterCallbackReason reason, + UErrorCode * err) +{ + + UChar valueString[VALUE_STRING_LENGTH]; + int32_t valueStringLength = 0; + int32_t i = 0; + + const UChar *myValueSource = NULL; + UErrorCode err2 = U_ZERO_ERROR; + UConverterFromUCallback original = NULL; + const void *originalContext; + + UConverterFromUCallback ignoredCallback = NULL; + const void *ignoredContext; + + if (reason > UCNV_IRREGULAR) + { + return; + } + else if (reason == UCNV_UNASSIGNED && IS_DEFAULT_IGNORABLE_CODE_POINT(codePoint)) + { + /* + * Skip if the codepoint has unicode property of default ignorable. + */ + *err = U_ZERO_ERROR; + return; + } + + ucnv_setFromUCallBack (fromArgs->converter, + (UConverterFromUCallback) UCNV_FROM_U_CALLBACK_SUBSTITUTE, + NULL, + &original, + &originalContext, + &err2); + + if (U_FAILURE (err2)) + { + *err = err2; + return; + } + if(context==NULL) + { + while (i < length) + { + valueString[valueStringLength++] = (UChar) UNICODE_PERCENT_SIGN_CODEPOINT; /* adding % */ + valueString[valueStringLength++] = (UChar) UNICODE_U_CODEPOINT; /* adding U */ + valueStringLength += uprv_itou (valueString + valueStringLength, VALUE_STRING_LENGTH - valueStringLength, (uint16_t)codeUnits[i++], 16, 4); + } + } + else + { + switch(*((char*)context)) + { + case UCNV_PRV_ESCAPE_JAVA: + while (i < length) + { + valueString[valueStringLength++] = (UChar) UNICODE_RS_CODEPOINT; /* adding \ */ + valueString[valueStringLength++] = (UChar) UNICODE_U_LOW_CODEPOINT; /* adding u */ + valueStringLength += uprv_itou (valueString + valueStringLength, VALUE_STRING_LENGTH - valueStringLength, (uint16_t)codeUnits[i++], 16, 4); + } + break; + + case UCNV_PRV_ESCAPE_C: + valueString[valueStringLength++] = (UChar) UNICODE_RS_CODEPOINT; /* adding \ */ + + if(length==2){ + valueString[valueStringLength++] = (UChar) UNICODE_U_CODEPOINT; /* adding U */ + valueStringLength += uprv_itou (valueString + valueStringLength, VALUE_STRING_LENGTH - valueStringLength, codePoint, 16, 8); + + } + else{ + valueString[valueStringLength++] = (UChar) UNICODE_U_LOW_CODEPOINT; /* adding u */ + valueStringLength += uprv_itou (valueString + valueStringLength, VALUE_STRING_LENGTH - valueStringLength, (uint16_t)codeUnits[0], 16, 4); + } + break; + + case UCNV_PRV_ESCAPE_XML_DEC: + + valueString[valueStringLength++] = (UChar) UNICODE_AMP_CODEPOINT; /* adding & */ + valueString[valueStringLength++] = (UChar) UNICODE_HASH_CODEPOINT; /* adding # */ + if(length==2){ + valueStringLength += uprv_itou (valueString + valueStringLength, VALUE_STRING_LENGTH - valueStringLength, codePoint, 10, 0); + } + else{ + valueStringLength += uprv_itou (valueString + valueStringLength, VALUE_STRING_LENGTH - valueStringLength, (uint16_t)codeUnits[0], 10, 0); + } + valueString[valueStringLength++] = (UChar) UNICODE_SEMICOLON_CODEPOINT; /* adding ; */ + break; + + case UCNV_PRV_ESCAPE_XML_HEX: + + valueString[valueStringLength++] = (UChar) UNICODE_AMP_CODEPOINT; /* adding & */ + valueString[valueStringLength++] = (UChar) UNICODE_HASH_CODEPOINT; /* adding # */ + valueString[valueStringLength++] = (UChar) UNICODE_X_LOW_CODEPOINT; /* adding x */ + if(length==2){ + valueStringLength += uprv_itou (valueString + valueStringLength, VALUE_STRING_LENGTH - valueStringLength, codePoint, 16, 0); + } + else{ + valueStringLength += uprv_itou (valueString + valueStringLength, VALUE_STRING_LENGTH - valueStringLength, (uint16_t)codeUnits[0], 16, 0); + } + valueString[valueStringLength++] = (UChar) UNICODE_SEMICOLON_CODEPOINT; /* adding ; */ + break; + + case UCNV_PRV_ESCAPE_UNICODE: + valueString[valueStringLength++] = (UChar) UNICODE_LEFT_CURLY_CODEPOINT; /* adding { */ + valueString[valueStringLength++] = (UChar) UNICODE_U_CODEPOINT; /* adding U */ + valueString[valueStringLength++] = (UChar) UNICODE_PLUS_CODEPOINT; /* adding + */ + if (length == 2) { + valueStringLength += uprv_itou (valueString + valueStringLength, VALUE_STRING_LENGTH - valueStringLength, codePoint, 16, 4); + } else { + valueStringLength += uprv_itou (valueString + valueStringLength, VALUE_STRING_LENGTH - valueStringLength, (uint16_t)codeUnits[0], 16, 4); + } + valueString[valueStringLength++] = (UChar) UNICODE_RIGHT_CURLY_CODEPOINT; /* adding } */ + break; + + case UCNV_PRV_ESCAPE_CSS2: + valueString[valueStringLength++] = (UChar) UNICODE_RS_CODEPOINT; /* adding \ */ + valueStringLength += uprv_itou (valueString + valueStringLength, VALUE_STRING_LENGTH - valueStringLength, codePoint, 16, 0); + /* Always add space character, becase the next character might be whitespace, + which would erroneously be considered the termination of the escape sequence. */ + valueString[valueStringLength++] = (UChar) UNICODE_SPACE_CODEPOINT; + break; + + default: + while (i < length) + { + valueString[valueStringLength++] = (UChar) UNICODE_PERCENT_SIGN_CODEPOINT; /* adding % */ + valueString[valueStringLength++] = (UChar) UNICODE_U_CODEPOINT; /* adding U */ + valueStringLength += uprv_itou (valueString + valueStringLength, VALUE_STRING_LENGTH - valueStringLength, (uint16_t)codeUnits[i++], 16, 4); + } + } + } + myValueSource = valueString; + + /* reset the error */ + *err = U_ZERO_ERROR; + + ucnv_cbFromUWriteUChars(fromArgs, &myValueSource, myValueSource+valueStringLength, 0, err); + + ucnv_setFromUCallBack (fromArgs->converter, + original, + originalContext, + &ignoredCallback, + &ignoredContext, + &err2); + if (U_FAILURE (err2)) + { + *err = err2; + return; + } + + return; +} + + + +U_CAPI void U_EXPORT2 +UCNV_TO_U_CALLBACK_SKIP ( + const void *context, + UConverterToUnicodeArgs *toArgs, + const char* codeUnits, + int32_t length, + UConverterCallbackReason reason, + UErrorCode * err) +{ + (void)toArgs; + (void)codeUnits; + (void)length; + if (reason <= UCNV_IRREGULAR) + { + if (context == NULL || (*((char*)context) == UCNV_PRV_STOP_ON_ILLEGAL && reason == UCNV_UNASSIGNED)) + { + *err = U_ZERO_ERROR; + } + /* else the caller must have set the error code accordingly. */ + } + /* else ignore the reset, close and clone calls. */ +} + +U_CAPI void U_EXPORT2 +UCNV_TO_U_CALLBACK_SUBSTITUTE ( + const void *context, + UConverterToUnicodeArgs *toArgs, + const char* codeUnits, + int32_t length, + UConverterCallbackReason reason, + UErrorCode * err) +{ + (void)codeUnits; + (void)length; + if (reason <= UCNV_IRREGULAR) + { + if (context == NULL || (*((char*)context) == UCNV_PRV_STOP_ON_ILLEGAL && reason == UCNV_UNASSIGNED)) + { + *err = U_ZERO_ERROR; + ucnv_cbToUWriteSub(toArgs,0,err); + } + /* else the caller must have set the error code accordingly. */ + } + /* else ignore the reset, close and clone calls. */ +} + +/*uses uprv_itou to get a unicode escape sequence of the offensive sequence, + *and uses that as the substitution sequence + */ +U_CAPI void U_EXPORT2 +UCNV_TO_U_CALLBACK_ESCAPE ( + const void *context, + UConverterToUnicodeArgs *toArgs, + const char* codeUnits, + int32_t length, + UConverterCallbackReason reason, + UErrorCode * err) +{ + UChar uniValueString[VALUE_STRING_LENGTH]; + int32_t valueStringLength = 0; + int32_t i = 0; + + if (reason > UCNV_IRREGULAR) + { + return; + } + + if(context==NULL) + { + while (i < length) + { + uniValueString[valueStringLength++] = (UChar) UNICODE_PERCENT_SIGN_CODEPOINT; /* adding % */ + uniValueString[valueStringLength++] = (UChar) UNICODE_X_CODEPOINT; /* adding X */ + valueStringLength += uprv_itou (uniValueString + valueStringLength, VALUE_STRING_LENGTH - valueStringLength, (uint8_t) codeUnits[i++], 16, 2); + } + } + else + { + switch(*((char*)context)) + { + case UCNV_PRV_ESCAPE_XML_DEC: + while (i < length) + { + uniValueString[valueStringLength++] = (UChar) UNICODE_AMP_CODEPOINT; /* adding & */ + uniValueString[valueStringLength++] = (UChar) UNICODE_HASH_CODEPOINT; /* adding # */ + valueStringLength += uprv_itou (uniValueString + valueStringLength, VALUE_STRING_LENGTH - valueStringLength, (uint8_t)codeUnits[i++], 10, 0); + uniValueString[valueStringLength++] = (UChar) UNICODE_SEMICOLON_CODEPOINT; /* adding ; */ + } + break; + + case UCNV_PRV_ESCAPE_XML_HEX: + while (i < length) + { + uniValueString[valueStringLength++] = (UChar) UNICODE_AMP_CODEPOINT; /* adding & */ + uniValueString[valueStringLength++] = (UChar) UNICODE_HASH_CODEPOINT; /* adding # */ + uniValueString[valueStringLength++] = (UChar) UNICODE_X_LOW_CODEPOINT; /* adding x */ + valueStringLength += uprv_itou (uniValueString + valueStringLength, VALUE_STRING_LENGTH - valueStringLength, (uint8_t)codeUnits[i++], 16, 0); + uniValueString[valueStringLength++] = (UChar) UNICODE_SEMICOLON_CODEPOINT; /* adding ; */ + } + break; + case UCNV_PRV_ESCAPE_C: + while (i < length) + { + uniValueString[valueStringLength++] = (UChar) UNICODE_RS_CODEPOINT; /* adding \ */ + uniValueString[valueStringLength++] = (UChar) UNICODE_X_LOW_CODEPOINT; /* adding x */ + valueStringLength += uprv_itou (uniValueString + valueStringLength, VALUE_STRING_LENGTH - valueStringLength, (uint8_t)codeUnits[i++], 16, 2); + } + break; + default: + while (i < length) + { + uniValueString[valueStringLength++] = (UChar) UNICODE_PERCENT_SIGN_CODEPOINT; /* adding % */ + uniValueString[valueStringLength++] = (UChar) UNICODE_X_CODEPOINT; /* adding X */ + uprv_itou (uniValueString + valueStringLength, VALUE_STRING_LENGTH - valueStringLength, (uint8_t) codeUnits[i++], 16, 2); + valueStringLength += 2; + } + } + } + /* reset the error */ + *err = U_ZERO_ERROR; + + ucnv_cbToUWriteUChars(toArgs, uniValueString, valueStringLength, 0, err); +} + +#endif diff --git a/Build/source/libs/icu/icu-src/source/common/ucnv_ext.cpp b/Build/source/libs/icu/icu-src/source/common/ucnv_ext.cpp index f8605187240..7dea4eef41a 100644 --- a/Build/source/libs/icu/icu-src/source/common/ucnv_ext.cpp +++ b/Build/source/libs/icu/icu-src/source/common/ucnv_ext.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ****************************************************************************** @@ -8,7 +8,7 @@ * ****************************************************************************** * file name: ucnv_ext.cpp -* encoding: US-ASCII +* encoding: UTF-8 * tab size: 8 (not used) * indentation:4 * @@ -23,6 +23,7 @@ #if !UCONFIG_NO_CONVERSION && !UCONFIG_NO_LEGACY_CONVERSION #include "unicode/uset.h" +#include "unicode/ustring.h" #include "ucnv_bld.h" #include "ucnv_cnv.h" #include "ucnv_ext.h" diff --git a/Build/source/libs/icu/icu-src/source/common/ucnv_ext.h b/Build/source/libs/icu/icu-src/source/common/ucnv_ext.h index c2f459c7a21..dceea7ef126 100644 --- a/Build/source/libs/icu/icu-src/source/common/ucnv_ext.h +++ b/Build/source/libs/icu/icu-src/source/common/ucnv_ext.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ****************************************************************************** @@ -8,7 +8,7 @@ * ****************************************************************************** * file name: ucnv_ext.h -* encoding: US-ASCII +* encoding: UTF-8 * tab size: 8 (not used) * indentation:4 * diff --git a/Build/source/libs/icu/icu-src/source/common/ucnv_imp.h b/Build/source/libs/icu/icu-src/source/common/ucnv_imp.h index 81aa80fd272..c5e6aeb47e4 100644 --- a/Build/source/libs/icu/icu-src/source/common/ucnv_imp.h +++ b/Build/source/libs/icu/icu-src/source/common/ucnv_imp.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** diff --git a/Build/source/libs/icu/icu-src/source/common/ucnv_io.cpp b/Build/source/libs/icu/icu-src/source/common/ucnv_io.cpp index c3301e11af6..7a95a3f1e61 100644 --- a/Build/source/libs/icu/icu-src/source/common/ucnv_io.cpp +++ b/Build/source/libs/icu/icu-src/source/common/ucnv_io.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ****************************************************************************** diff --git a/Build/source/libs/icu/icu-src/source/common/ucnv_io.h b/Build/source/libs/icu/icu-src/source/common/ucnv_io.h index 8b3585786d3..8f2d7b5a02b 100644 --- a/Build/source/libs/icu/icu-src/source/common/ucnv_io.h +++ b/Build/source/libs/icu/icu-src/source/common/ucnv_io.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** diff --git a/Build/source/libs/icu/icu-src/source/common/ucnv_lmb.c b/Build/source/libs/icu/icu-src/source/common/ucnv_lmb.c deleted file mode 100644 index e4277909fe8..00000000000 --- a/Build/source/libs/icu/icu-src/source/common/ucnv_lmb.c +++ /dev/null @@ -1,1378 +0,0 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. -// License & terms of use: http://www.unicode.org/copyright.html -/* -********************************************************************** -* Copyright (C) 2000-2016, International Business Machines -* Corporation and others. All Rights Reserved. -********************************************************************** -* file name: ucnv_lmb.cpp -* encoding: US-ASCII -* tab size: 4 (not used) -* indentation:4 -* -* created on: 2000feb09 -* created by: Brendan Murray -* extensively hacked up by: Jim Snyder-Grant -* -* Modification History: -* -* Date Name Description -* -* 06/20/2000 helena OS/400 port changes; mostly typecast. -* 06/27/2000 Jim Snyder-Grant Deal with partial characters and small buffers. -* Add comments to document LMBCS format and implementation -* restructured order & breakdown of functions -* 06/28/2000 helena Major rewrite for the callback API changes. -*/ - -#include "unicode/utypes.h" - -#if !UCONFIG_NO_CONVERSION && !UCONFIG_NO_LEGACY_CONVERSION && !UCONFIG_ONLY_HTML_CONVERSION - -#include "unicode/ucnv_err.h" -#include "unicode/ucnv.h" -#include "unicode/uset.h" -#include "cmemory.h" -#include "cstring.h" -#include "uassert.h" -#include "ucnv_imp.h" -#include "ucnv_bld.h" -#include "ucnv_cnv.h" - -#ifdef EBCDIC_RTL - #include "ascii_a.h" -#endif - -/* - LMBCS - - (Lotus Multi-Byte Character Set) - - LMBCS was invented in the late 1980's and is primarily used in Lotus Notes - databases and in Lotus 1-2-3 files. Programmers who work with the APIs - into these products will sometimes need to deal with strings in this format. - - The code in this file provides an implementation for an ICU converter of - LMBCS to and from Unicode. - - Since the LMBCS character set is only sparsely documented in existing - printed or online material, we have added extensive annotation to this - file to serve as a guide to understanding LMBCS. - - LMBCS was originally designed with these four sometimes-competing design goals: - - -Provide encodings for the characters in 12 existing national standards - (plus a few other characters) - -Minimal memory footprint - -Maximal speed of conversion into the existing national character sets - -No need to track a changing state as you interpret a string. - - - All of the national character sets LMBCS was trying to encode are 'ANSI' - based, in that the bytes from 0x20 - 0x7F are almost exactly the - same common Latin unaccented characters and symbols in all character sets. - - So, in order to help meet the speed & memory design goals, the common ANSI - bytes from 0x20-0x7F are represented by the same single-byte values in LMBCS. - - The general LMBCS code unit is from 1-3 bytes. We can describe the 3 bytes as - follows: - - [G] D1 [D2] - - That is, a sometimes-optional 'group' byte, followed by 1 and sometimes 2 - data bytes. The maximum size of a LMBCS chjaracter is 3 bytes: -*/ -#define ULMBCS_CHARSIZE_MAX 3 -/* - The single-byte values from 0x20 to 0x7F are examples of single D1 bytes. - We often have to figure out if byte values are below or above this, so we - use the ANSI nomenclature 'C0' and 'C1' to refer to the range of control - characters just above & below the common lower-ANSI range */ -#define ULMBCS_C0END 0x1F -#define ULMBCS_C1START 0x80 -/* - Since LMBCS is always dealing in byte units. we create a local type here for - dealing with these units of LMBCS code units: - -*/ -typedef uint8_t ulmbcs_byte_t; - -/* - Most of the values less than 0x20 are reserved in LMBCS to announce - which national character standard is being used for the 'D' bytes. - In the comments we show the common name and the IBM character-set ID - for these character-set announcers: -*/ - -#define ULMBCS_GRP_L1 0x01 /* Latin-1 :ibm-850 */ -#define ULMBCS_GRP_GR 0x02 /* Greek :ibm-851 */ -#define ULMBCS_GRP_HE 0x03 /* Hebrew :ibm-1255 */ -#define ULMBCS_GRP_AR 0x04 /* Arabic :ibm-1256 */ -#define ULMBCS_GRP_RU 0x05 /* Cyrillic :ibm-1251 */ -#define ULMBCS_GRP_L2 0x06 /* Latin-2 :ibm-852 */ -#define ULMBCS_GRP_TR 0x08 /* Turkish :ibm-1254 */ -#define ULMBCS_GRP_TH 0x0B /* Thai :ibm-874 */ -#define ULMBCS_GRP_JA 0x10 /* Japanese :ibm-943 */ -#define ULMBCS_GRP_KO 0x11 /* Korean :ibm-1261 */ -#define ULMBCS_GRP_TW 0x12 /* Chinese SC :ibm-950 */ -#define ULMBCS_GRP_CN 0x13 /* Chinese TC :ibm-1386 */ - -/* - So, the beginning of understanding LMBCS is that IF the first byte of a LMBCS - character is one of those 12 values, you can interpret the remaining bytes of - that character as coming from one of those character sets. Since the lower - ANSI bytes already are represented in single bytes, using one of the character - set announcers is used to announce a character that starts with a byte of - 0x80 or greater. - - The character sets are arranged so that the single byte sets all appear - before the multi-byte character sets. When we need to tell whether a - group byte is for a single byte char set or not we use this define: */ - -#define ULMBCS_DOUBLEOPTGROUP_START 0x10 - -/* -However, to fully understand LMBCS, you must also understand a series of -exceptions & optimizations made in service of the design goals. - -First, those of you who are character set mavens may have noticed that -the 'double-byte' character sets are actually multi-byte character sets -that can have 1 or two bytes, even in the upper-ascii range. To force -each group byte to introduce a fixed-width encoding (to make it faster to -count characters), we use a convention of doubling up on the group byte -to introduce any single-byte character > 0x80 in an otherwise double-byte -character set. So, for example, the LMBCS sequence x10 x10 xAE is the -same as '0xAE' in the Japanese code page 943. - -Next, you will notice that the list of group bytes has some gaps. -These are used in various ways. - -We reserve a few special single byte values for common control -characters. These are in the same place as their ANSI eqivalents for speed. -*/ - -#define ULMBCS_HT 0x09 /* Fixed control char - Horizontal Tab */ -#define ULMBCS_LF 0x0A /* Fixed control char - Line Feed */ -#define ULMBCS_CR 0x0D /* Fixed control char - Carriage Return */ - -/* Then, 1-2-3 reserved a special single-byte character to put at the -beginning of internal 'system' range names: */ - -#define ULMBCS_123SYSTEMRANGE 0x19 - -/* Then we needed a place to put all the other ansi control characters -that must be moved to different values because LMBCS reserves those -values for other purposes. To represent the control characters, we start -with a first byte of 0xF & add the control chaarcter value as the -second byte */ -#define ULMBCS_GRP_CTRL 0x0F - -/* For the C0 controls (less than 0x20), we add 0x20 to preserve the -useful doctrine that any byte less than 0x20 in a LMBCS char must be -the first byte of a character:*/ -#define ULMBCS_CTRLOFFSET 0x20 - -/* -Where to put the characters that aren't part of any of the 12 national -character sets? The first thing that was done, in the earlier years of -LMBCS, was to use up the spaces of the form - - [G] D1, - - where 'G' was one of the single-byte character groups, and - D1 was less than 0x80. These sequences are gathered together - into a Lotus-invented doublebyte character set to represent a - lot of stray values. Internally, in this implementation, we track this - as group '0', as a place to tuck this exceptions list.*/ - -#define ULMBCS_GRP_EXCEPT 0x00 -/* - Finally, as the durability and usefulness of UNICODE became clear, - LOTUS added a new group 0x14 to hold Unicode values not otherwise - represented in LMBCS: */ -#define ULMBCS_GRP_UNICODE 0x14 -/* The two bytes appearing after a 0x14 are intrepreted as UFT-16 BE -(Big-Endian) characters. The exception comes when the UTF16 -representation would have a zero as the second byte. In that case, -'F6' is used in its place, and the bytes are swapped. (This prevents -LMBCS from encoding any Unicode values of the form U+F6xx, but that's OK: -0xF6xx is in the middle of the Private Use Area.)*/ -#define ULMBCS_UNICOMPATZERO 0xF6 - -/* It is also useful in our code to have a constant for the size of -a LMBCS char that holds a literal Unicode value */ -#define ULMBCS_UNICODE_SIZE 3 - -/* -To squish the LMBCS representations down even further, and to make -translations even faster,sometimes the optimization group byte can be dropped -from a LMBCS character. This is decided on a process-by-process basis. The -group byte that is dropped is called the 'optimization group'. - -For Notes, the optimzation group is always 0x1.*/ -#define ULMBCS_DEFAULTOPTGROUP 0x1 -/* For 1-2-3 files, the optimzation group is stored in the header of the 1-2-3 -file. - - In any case, when using ICU, you either pass in the -optimization group as part of the name of the converter (LMBCS-1, LMBCS-2, -etc.). Using plain 'LMBCS' as the name of the converter will give you -LMBCS-1. - - -*** Implementation strategy *** - - -Because of the extensive use of other character sets, the LMBCS converter -keeps a mapping between optimization groups and IBM character sets, so that -ICU converters can be created and used as needed. */ - -/* As you can see, even though any byte below 0x20 could be an optimization -byte, only those at 0x13 or below can map to an actual converter. To limit -some loops and searches, we define a value for that last group converter:*/ - -#define ULMBCS_GRP_LAST 0x13 /* last LMBCS group that has a converter */ - -static const char * const OptGroupByteToCPName[ULMBCS_GRP_LAST + 1] = { - /* 0x0000 */ "lmb-excp", /* internal home for the LOTUS exceptions list */ - /* 0x0001 */ "ibm-850", - /* 0x0002 */ "ibm-851", - /* 0x0003 */ "windows-1255", - /* 0x0004 */ "windows-1256", - /* 0x0005 */ "windows-1251", - /* 0x0006 */ "ibm-852", - /* 0x0007 */ NULL, /* Unused */ - /* 0x0008 */ "windows-1254", - /* 0x0009 */ NULL, /* Control char HT */ - /* 0x000A */ NULL, /* Control char LF */ - /* 0x000B */ "windows-874", - /* 0x000C */ NULL, /* Unused */ - /* 0x000D */ NULL, /* Control char CR */ - /* 0x000E */ NULL, /* Unused */ - /* 0x000F */ NULL, /* Control chars: 0x0F20 + C0/C1 character: algorithmic */ - /* 0x0010 */ "windows-932", - /* 0x0011 */ "windows-949", - /* 0x0012 */ "windows-950", - /* 0x0013 */ "windows-936" - - /* The rest are null, including the 0x0014 Unicode compatibility region - and 0x0019, the 1-2-3 system range control char */ -}; - - -/* That's approximately all the data that's needed for translating - LMBCS to Unicode. - - -However, to translate Unicode to LMBCS, we need some more support. - -That's because there are often more than one possible mappings from a Unicode -code point back into LMBCS. The first thing we do is look up into a table -to figure out if there are more than one possible mappings. This table, -arranged by Unicode values (including ranges) either lists which group -to use, or says that it could go into one or more of the SBCS sets, or -into one or more of the DBCS sets. (If the character exists in both DBCS & -SBCS, the table will place it in the SBCS sets, to make the LMBCS code point -length as small as possible. Here's the two special markers we use to indicate -ambiguous mappings: */ - -#define ULMBCS_AMBIGUOUS_SBCS 0x80 /* could fit in more than one - LMBCS sbcs native encoding - (example: most accented latin) */ -#define ULMBCS_AMBIGUOUS_MBCS 0x81 /* could fit in more than one - LMBCS mbcs native encoding - (example: Unihan) */ -#define ULMBCS_AMBIGUOUS_ALL 0x82 -/* And here's a simple way to see if a group falls in an appropriate range */ -#define ULMBCS_AMBIGUOUS_MATCH(agroup, xgroup) \ - ((((agroup) == ULMBCS_AMBIGUOUS_SBCS) && \ - (xgroup) < ULMBCS_DOUBLEOPTGROUP_START) || \ - (((agroup) == ULMBCS_AMBIGUOUS_MBCS) && \ - (xgroup) >= ULMBCS_DOUBLEOPTGROUP_START)) || \ - ((agroup) == ULMBCS_AMBIGUOUS_ALL) - - -/* The table & some code to use it: */ - - -static const struct _UniLMBCSGrpMap -{ - const UChar uniStartRange; - const UChar uniEndRange; - const ulmbcs_byte_t GrpType; -} UniLMBCSGrpMap[] -= -{ - - {0x0001, 0x001F, ULMBCS_GRP_CTRL}, - {0x0080, 0x009F, ULMBCS_GRP_CTRL}, - {0x00A0, 0x00A6, ULMBCS_AMBIGUOUS_SBCS}, - {0x00A7, 0x00A8, ULMBCS_AMBIGUOUS_ALL}, - {0x00A9, 0x00AF, ULMBCS_AMBIGUOUS_SBCS}, - {0x00B0, 0x00B1, ULMBCS_AMBIGUOUS_ALL}, - {0x00B2, 0x00B3, ULMBCS_AMBIGUOUS_SBCS}, - {0x00B4, 0x00B4, ULMBCS_AMBIGUOUS_ALL}, - {0x00B5, 0x00B5, ULMBCS_AMBIGUOUS_SBCS}, - {0x00B6, 0x00B6, ULMBCS_AMBIGUOUS_ALL}, - {0x00B7, 0x00D6, ULMBCS_AMBIGUOUS_SBCS}, - {0x00D7, 0x00D7, ULMBCS_AMBIGUOUS_ALL}, - {0x00D8, 0x00F6, ULMBCS_AMBIGUOUS_SBCS}, - {0x00F7, 0x00F7, ULMBCS_AMBIGUOUS_ALL}, - {0x00F8, 0x01CD, ULMBCS_AMBIGUOUS_SBCS}, - {0x01CE, 0x01CE, ULMBCS_GRP_TW }, - {0x01CF, 0x02B9, ULMBCS_AMBIGUOUS_SBCS}, - {0x02BA, 0x02BA, ULMBCS_GRP_CN}, - {0x02BC, 0x02C8, ULMBCS_AMBIGUOUS_SBCS}, - {0x02C9, 0x02D0, ULMBCS_AMBIGUOUS_MBCS}, - {0x02D8, 0x02DD, ULMBCS_AMBIGUOUS_SBCS}, - {0x0384, 0x0390, ULMBCS_AMBIGUOUS_SBCS}, - {0x0391, 0x03A9, ULMBCS_AMBIGUOUS_ALL}, - {0x03AA, 0x03B0, ULMBCS_AMBIGUOUS_SBCS}, - {0x03B1, 0x03C9, ULMBCS_AMBIGUOUS_ALL}, - {0x03CA, 0x03CE, ULMBCS_AMBIGUOUS_SBCS}, - {0x0400, 0x0400, ULMBCS_GRP_RU}, - {0x0401, 0x0401, ULMBCS_AMBIGUOUS_ALL}, - {0x0402, 0x040F, ULMBCS_GRP_RU}, - {0x0410, 0x0431, ULMBCS_AMBIGUOUS_ALL}, - {0x0432, 0x044E, ULMBCS_GRP_RU}, - {0x044F, 0x044F, ULMBCS_AMBIGUOUS_ALL}, - {0x0450, 0x0491, ULMBCS_GRP_RU}, - {0x05B0, 0x05F2, ULMBCS_GRP_HE}, - {0x060C, 0x06AF, ULMBCS_GRP_AR}, - {0x0E01, 0x0E5B, ULMBCS_GRP_TH}, - {0x200C, 0x200F, ULMBCS_AMBIGUOUS_SBCS}, - {0x2010, 0x2010, ULMBCS_AMBIGUOUS_MBCS}, - {0x2013, 0x2014, ULMBCS_AMBIGUOUS_SBCS}, - {0x2015, 0x2015, ULMBCS_AMBIGUOUS_MBCS}, - {0x2016, 0x2016, ULMBCS_AMBIGUOUS_MBCS}, - {0x2017, 0x2017, ULMBCS_AMBIGUOUS_SBCS}, - {0x2018, 0x2019, ULMBCS_AMBIGUOUS_ALL}, - {0x201A, 0x201B, ULMBCS_AMBIGUOUS_SBCS}, - {0x201C, 0x201D, ULMBCS_AMBIGUOUS_ALL}, - {0x201E, 0x201F, ULMBCS_AMBIGUOUS_SBCS}, - {0x2020, 0x2021, ULMBCS_AMBIGUOUS_ALL}, - {0x2022, 0x2024, ULMBCS_AMBIGUOUS_SBCS}, - {0x2025, 0x2025, ULMBCS_AMBIGUOUS_MBCS}, - {0x2026, 0x2026, ULMBCS_AMBIGUOUS_ALL}, - {0x2027, 0x2027, ULMBCS_GRP_TW}, - {0x2030, 0x2030, ULMBCS_AMBIGUOUS_ALL}, - {0x2031, 0x2031, ULMBCS_AMBIGUOUS_SBCS}, - {0x2032, 0x2033, ULMBCS_AMBIGUOUS_MBCS}, - {0x2035, 0x2035, ULMBCS_AMBIGUOUS_MBCS}, - {0x2039, 0x203A, ULMBCS_AMBIGUOUS_SBCS}, - {0x203B, 0x203B, ULMBCS_AMBIGUOUS_MBCS}, - {0x203C, 0x203C, ULMBCS_GRP_EXCEPT}, - {0x2074, 0x2074, ULMBCS_GRP_KO}, - {0x207F, 0x207F, ULMBCS_GRP_EXCEPT}, - {0x2081, 0x2084, ULMBCS_GRP_KO}, - {0x20A4, 0x20AC, ULMBCS_AMBIGUOUS_SBCS}, - {0x2103, 0x2109, ULMBCS_AMBIGUOUS_MBCS}, - {0x2111, 0x2120, ULMBCS_AMBIGUOUS_SBCS}, - /*zhujin: upgrade, for regressiont test, spr HKIA4YHTSU*/ - {0x2121, 0x2121, ULMBCS_AMBIGUOUS_MBCS}, - {0x2122, 0x2126, ULMBCS_AMBIGUOUS_SBCS}, - {0x212B, 0x212B, ULMBCS_AMBIGUOUS_MBCS}, - {0x2135, 0x2135, ULMBCS_AMBIGUOUS_SBCS}, - {0x2153, 0x2154, ULMBCS_GRP_KO}, - {0x215B, 0x215E, ULMBCS_GRP_EXCEPT}, - {0x2160, 0x2179, ULMBCS_AMBIGUOUS_MBCS}, - {0x2190, 0x2193, ULMBCS_AMBIGUOUS_ALL}, - {0x2194, 0x2195, ULMBCS_GRP_EXCEPT}, - {0x2196, 0x2199, ULMBCS_AMBIGUOUS_MBCS}, - {0x21A8, 0x21A8, ULMBCS_GRP_EXCEPT}, - {0x21B8, 0x21B9, ULMBCS_GRP_CN}, - {0x21D0, 0x21D1, ULMBCS_GRP_EXCEPT}, - {0x21D2, 0x21D2, ULMBCS_AMBIGUOUS_MBCS}, - {0x21D3, 0x21D3, ULMBCS_GRP_EXCEPT}, - {0x21D4, 0x21D4, ULMBCS_AMBIGUOUS_MBCS}, - {0x21D5, 0x21D5, ULMBCS_GRP_EXCEPT}, - {0x21E7, 0x21E7, ULMBCS_GRP_CN}, - {0x2200, 0x2200, ULMBCS_AMBIGUOUS_MBCS}, - {0x2201, 0x2201, ULMBCS_GRP_EXCEPT}, - {0x2202, 0x2202, ULMBCS_AMBIGUOUS_MBCS}, - {0x2203, 0x2203, ULMBCS_AMBIGUOUS_MBCS}, - {0x2204, 0x2206, ULMBCS_GRP_EXCEPT}, - {0x2207, 0x2208, ULMBCS_AMBIGUOUS_MBCS}, - {0x2209, 0x220A, ULMBCS_GRP_EXCEPT}, - {0x220B, 0x220B, ULMBCS_AMBIGUOUS_MBCS}, - {0x220F, 0x2215, ULMBCS_AMBIGUOUS_MBCS}, - {0x2219, 0x2219, ULMBCS_GRP_EXCEPT}, - {0x221A, 0x221A, ULMBCS_AMBIGUOUS_MBCS}, - {0x221B, 0x221C, ULMBCS_GRP_EXCEPT}, - {0x221D, 0x221E, ULMBCS_AMBIGUOUS_MBCS}, - {0x221F, 0x221F, ULMBCS_GRP_EXCEPT}, - {0x2220, 0x2220, ULMBCS_AMBIGUOUS_MBCS}, - {0x2223, 0x222A, ULMBCS_AMBIGUOUS_MBCS}, - {0x222B, 0x223D, ULMBCS_AMBIGUOUS_MBCS}, - {0x2245, 0x2248, ULMBCS_GRP_EXCEPT}, - {0x224C, 0x224C, ULMBCS_GRP_TW}, - {0x2252, 0x2252, ULMBCS_AMBIGUOUS_MBCS}, - {0x2260, 0x2261, ULMBCS_AMBIGUOUS_MBCS}, - {0x2262, 0x2265, ULMBCS_GRP_EXCEPT}, - {0x2266, 0x226F, ULMBCS_AMBIGUOUS_MBCS}, - {0x2282, 0x2283, ULMBCS_AMBIGUOUS_MBCS}, - {0x2284, 0x2285, ULMBCS_GRP_EXCEPT}, - {0x2286, 0x2287, ULMBCS_AMBIGUOUS_MBCS}, - {0x2288, 0x2297, ULMBCS_GRP_EXCEPT}, - {0x2299, 0x22BF, ULMBCS_AMBIGUOUS_MBCS}, - {0x22C0, 0x22C0, ULMBCS_GRP_EXCEPT}, - {0x2310, 0x2310, ULMBCS_GRP_EXCEPT}, - {0x2312, 0x2312, ULMBCS_AMBIGUOUS_MBCS}, - {0x2318, 0x2321, ULMBCS_GRP_EXCEPT}, - {0x2318, 0x2321, ULMBCS_GRP_CN}, - {0x2460, 0x24E9, ULMBCS_AMBIGUOUS_MBCS}, - {0x2500, 0x2500, ULMBCS_AMBIGUOUS_SBCS}, - {0x2501, 0x2501, ULMBCS_AMBIGUOUS_MBCS}, - {0x2502, 0x2502, ULMBCS_AMBIGUOUS_ALL}, - {0x2503, 0x2503, ULMBCS_AMBIGUOUS_MBCS}, - {0x2504, 0x2505, ULMBCS_GRP_TW}, - {0x2506, 0x2665, ULMBCS_AMBIGUOUS_ALL}, - {0x2666, 0x2666, ULMBCS_GRP_EXCEPT}, - {0x2667, 0x2669, ULMBCS_AMBIGUOUS_SBCS}, - {0x266A, 0x266A, ULMBCS_AMBIGUOUS_ALL}, - {0x266B, 0x266C, ULMBCS_AMBIGUOUS_SBCS}, - {0x266D, 0x266D, ULMBCS_AMBIGUOUS_MBCS}, - {0x266E, 0x266E, ULMBCS_AMBIGUOUS_SBCS}, - {0x266F, 0x266F, ULMBCS_GRP_JA}, - {0x2670, 0x2E7F, ULMBCS_AMBIGUOUS_SBCS}, - {0x2E80, 0xF861, ULMBCS_AMBIGUOUS_MBCS}, - {0xF862, 0xF8FF, ULMBCS_GRP_EXCEPT}, - {0xF900, 0xFA2D, ULMBCS_AMBIGUOUS_MBCS}, - {0xFB00, 0xFEFF, ULMBCS_AMBIGUOUS_SBCS}, - {0xFF01, 0xFFEE, ULMBCS_AMBIGUOUS_MBCS}, - {0xFFFF, 0xFFFF, ULMBCS_GRP_UNICODE} -}; - -static ulmbcs_byte_t -FindLMBCSUniRange(UChar uniChar) -{ - const struct _UniLMBCSGrpMap * pTable = UniLMBCSGrpMap; - - while (uniChar > pTable->uniEndRange) - { - pTable++; - } - - if (uniChar >= pTable->uniStartRange) - { - return pTable->GrpType; - } - return ULMBCS_GRP_UNICODE; -} - -/* -We also ask the creator of a converter to send in a preferred locale -that we can use in resolving ambiguous mappings. They send the locale -in as a string, and we map it, if possible, to one of the -LMBCS groups. We use this table, and the associated code, to -do the lookup: */ - -/************************************************** - This table maps locale ID's to LMBCS opt groups. - The default return is group 0x01. Note that for - performance reasons, the table is sorted in - increasing alphabetic order, with the notable - exception of zhTW. This is to force the check - for Traditonal Chinese before dropping back to - Simplified. - - Note too that the Latin-1 groups have been - commented out because it's the default, and - this shortens the table, allowing a serial - search to go quickly. - *************************************************/ - -static const struct _LocaleLMBCSGrpMap -{ - const char *LocaleID; - const ulmbcs_byte_t OptGroup; -} LocaleLMBCSGrpMap[] = -{ - {"ar", ULMBCS_GRP_AR}, - {"be", ULMBCS_GRP_RU}, - {"bg", ULMBCS_GRP_L2}, - /* {"ca", ULMBCS_GRP_L1}, */ - {"cs", ULMBCS_GRP_L2}, - /* {"da", ULMBCS_GRP_L1}, */ - /* {"de", ULMBCS_GRP_L1}, */ - {"el", ULMBCS_GRP_GR}, - /* {"en", ULMBCS_GRP_L1}, */ - /* {"es", ULMBCS_GRP_L1}, */ - /* {"et", ULMBCS_GRP_L1}, */ - /* {"fi", ULMBCS_GRP_L1}, */ - /* {"fr", ULMBCS_GRP_L1}, */ - {"he", ULMBCS_GRP_HE}, - {"hu", ULMBCS_GRP_L2}, - /* {"is", ULMBCS_GRP_L1}, */ - /* {"it", ULMBCS_GRP_L1}, */ - {"iw", ULMBCS_GRP_HE}, - {"ja", ULMBCS_GRP_JA}, - {"ko", ULMBCS_GRP_KO}, - /* {"lt", ULMBCS_GRP_L1}, */ - /* {"lv", ULMBCS_GRP_L1}, */ - {"mk", ULMBCS_GRP_RU}, - /* {"nl", ULMBCS_GRP_L1}, */ - /* {"no", ULMBCS_GRP_L1}, */ - {"pl", ULMBCS_GRP_L2}, - /* {"pt", ULMBCS_GRP_L1}, */ - {"ro", ULMBCS_GRP_L2}, - {"ru", ULMBCS_GRP_RU}, - {"sh", ULMBCS_GRP_L2}, - {"sk", ULMBCS_GRP_L2}, - {"sl", ULMBCS_GRP_L2}, - {"sq", ULMBCS_GRP_L2}, - {"sr", ULMBCS_GRP_RU}, - /* {"sv", ULMBCS_GRP_L1}, */ - {"th", ULMBCS_GRP_TH}, - {"tr", ULMBCS_GRP_TR}, - {"uk", ULMBCS_GRP_RU}, - /* {"vi", ULMBCS_GRP_L1}, */ - {"zhTW", ULMBCS_GRP_TW}, - {"zh", ULMBCS_GRP_CN}, - {NULL, ULMBCS_GRP_L1} -}; - - -static ulmbcs_byte_t -FindLMBCSLocale(const char *LocaleID) -{ - const struct _LocaleLMBCSGrpMap *pTable = LocaleLMBCSGrpMap; - - if ((!LocaleID) || (!*LocaleID)) - { - return 0; - } - - while (pTable->LocaleID) - { - if (*pTable->LocaleID == *LocaleID) /* Check only first char for speed */ - { - /* First char matches - check whole name, for entry-length */ - if (uprv_strncmp(pTable->LocaleID, LocaleID, strlen(pTable->LocaleID)) == 0) - return pTable->OptGroup; - } - else - if (*pTable->LocaleID > *LocaleID) /* Sorted alphabetically - exit */ - break; - pTable++; - } - return ULMBCS_GRP_L1; -} - - -/* - Before we get to the main body of code, here's how we hook up to the rest - of ICU. ICU converters are required to define a structure that includes - some function pointers, and some common data, in the style of a C++ - vtable. There is also room in there for converter-specific data. LMBCS - uses that converter-specific data to keep track of the 12 subconverters - we use, the optimization group, and the group (if any) that matches the - locale. We have one structure instantiated for each of the 12 possible - optimization groups. To avoid typos & to avoid boring the reader, we - put the declarations of these structures and functions into macros. To see - the definitions of these structures, see unicode\ucnv_bld.h -*/ - -typedef struct - { - UConverterSharedData *OptGrpConverter[ULMBCS_GRP_LAST+1]; /* Converter per Opt. grp. */ - uint8_t OptGroup; /* default Opt. grp. for this LMBCS session */ - uint8_t localeConverterIndex; /* reasonable locale match for index */ - } -UConverterDataLMBCS; - -static void _LMBCSClose(UConverter * _this); - -#define DECLARE_LMBCS_DATA(n) \ -static const UConverterImpl _LMBCSImpl##n={\ - UCNV_LMBCS_##n,\ - NULL,NULL,\ - _LMBCSOpen##n,\ - _LMBCSClose,\ - NULL,\ - _LMBCSToUnicodeWithOffsets,\ - _LMBCSToUnicodeWithOffsets,\ - _LMBCSFromUnicode,\ - _LMBCSFromUnicode,\ - NULL,\ - NULL,\ - NULL,\ - NULL,\ - _LMBCSSafeClone,\ - ucnv_getCompleteUnicodeSet\ -};\ -static const UConverterStaticData _LMBCSStaticData##n={\ - sizeof(UConverterStaticData),\ - "LMBCS-" #n,\ - 0, UCNV_IBM, UCNV_LMBCS_##n, 1, 3,\ - { 0x3f, 0, 0, 0 },1,FALSE,FALSE,0,0,{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0} \ -};\ -const UConverterSharedData _LMBCSData##n= \ - UCNV_IMMUTABLE_SHARED_DATA_INITIALIZER(&_LMBCSStaticData##n, &_LMBCSImpl##n); - - /* The only function we needed to duplicate 12 times was the 'open' -function, which will do basically the same thing except set a different -optimization group. So, we put the common stuff into a worker function, -and set up another macro to stamp out the 12 open functions:*/ -#define DEFINE_LMBCS_OPEN(n) \ -static void \ - _LMBCSOpen##n(UConverter* _this, UConverterLoadArgs* pArgs, UErrorCode* err) \ -{ _LMBCSOpenWorker(_this, pArgs, err, n); } - - - -/* Here's the open worker & the common close function */ -static void -_LMBCSOpenWorker(UConverter* _this, - UConverterLoadArgs *pArgs, - UErrorCode* err, - ulmbcs_byte_t OptGroup) -{ - UConverterDataLMBCS * extraInfo = _this->extraInfo = - (UConverterDataLMBCS*)uprv_malloc (sizeof (UConverterDataLMBCS)); - if(extraInfo != NULL) - { - UConverterNamePieces stackPieces; - UConverterLoadArgs stackArgs={ (int32_t)sizeof(UConverterLoadArgs) }; - ulmbcs_byte_t i; - - uprv_memset(extraInfo, 0, sizeof(UConverterDataLMBCS)); - - stackArgs.onlyTestIsLoadable = pArgs->onlyTestIsLoadable; - - for (i=0; i <= ULMBCS_GRP_LAST && U_SUCCESS(*err); i++) - { - if(OptGroupByteToCPName[i] != NULL) { - extraInfo->OptGrpConverter[i] = ucnv_loadSharedData(OptGroupByteToCPName[i], &stackPieces, &stackArgs, err); - } - } - - if(U_FAILURE(*err) || pArgs->onlyTestIsLoadable) { - _LMBCSClose(_this); - return; - } - extraInfo->OptGroup = OptGroup; - extraInfo->localeConverterIndex = FindLMBCSLocale(pArgs->locale); - } - else - { - *err = U_MEMORY_ALLOCATION_ERROR; - } -} - -static void -_LMBCSClose(UConverter * _this) -{ - if (_this->extraInfo != NULL) - { - ulmbcs_byte_t Ix; - UConverterDataLMBCS * extraInfo = (UConverterDataLMBCS *) _this->extraInfo; - - for (Ix=0; Ix <= ULMBCS_GRP_LAST; Ix++) - { - if (extraInfo->OptGrpConverter[Ix] != NULL) - ucnv_unloadSharedDataIfReady(extraInfo->OptGrpConverter[Ix]); - } - if (!_this->isExtraLocal) { - uprv_free (_this->extraInfo); - _this->extraInfo = NULL; - } - } -} - -typedef struct LMBCSClone { - UConverter cnv; - UConverterDataLMBCS lmbcs; -} LMBCSClone; - -static UConverter * -_LMBCSSafeClone(const UConverter *cnv, - void *stackBuffer, - int32_t *pBufferSize, - UErrorCode *status) { - LMBCSClone *newLMBCS; - UConverterDataLMBCS *extraInfo; - int32_t i; - - if(*pBufferSize<=0) { - *pBufferSize=(int32_t)sizeof(LMBCSClone); - return NULL; - } - - extraInfo=(UConverterDataLMBCS *)cnv->extraInfo; - newLMBCS=(LMBCSClone *)stackBuffer; - - /* ucnv.c/ucnv_safeClone() copied the main UConverter already */ - - uprv_memcpy(&newLMBCS->lmbcs, extraInfo, sizeof(UConverterDataLMBCS)); - - /* share the subconverters */ - for(i = 0; i <= ULMBCS_GRP_LAST; ++i) { - if(extraInfo->OptGrpConverter[i] != NULL) { - ucnv_incrementRefCount(extraInfo->OptGrpConverter[i]); - } - } - - newLMBCS->cnv.extraInfo = &newLMBCS->lmbcs; - newLMBCS->cnv.isExtraLocal = TRUE; - return &newLMBCS->cnv; -} - -/* - * There used to be a _LMBCSGetUnicodeSet() function here (up to svn revision 20117) - * which added all code points except for U+F6xx - * because those cannot be represented in the Unicode group. - * However, it turns out that windows-950 has roundtrips for all of U+F6xx - * which means that LMBCS can convert all Unicode code points after all. - * We now simply use ucnv_getCompleteUnicodeSet(). - * - * This may need to be looked at again as Lotus uses _LMBCSGetUnicodeSet(). (091216) - */ - -/* - Here's the basic helper function that we use when converting from - Unicode to LMBCS, and we suspect that a Unicode character will fit into - one of the 12 groups. The return value is the number of bytes written - starting at pStartLMBCS (if any). -*/ - -static size_t -LMBCSConversionWorker ( - UConverterDataLMBCS * extraInfo, /* subconverters, opt & locale groups */ - ulmbcs_byte_t group, /* The group to try */ - ulmbcs_byte_t * pStartLMBCS, /* where to put the results */ - UChar * pUniChar, /* The input unicode character */ - ulmbcs_byte_t * lastConverterIndex, /* output: track last successful group used */ - UBool * groups_tried /* output: track any unsuccessful groups */ -) -{ - ulmbcs_byte_t * pLMBCS = pStartLMBCS; - UConverterSharedData * xcnv = extraInfo->OptGrpConverter[group]; - - int bytesConverted; - uint32_t value; - ulmbcs_byte_t firstByte; - - U_ASSERT(xcnv); - U_ASSERT(group 0) { - firstByte = (ulmbcs_byte_t)(value >> ((bytesConverted - 1) * 8)); - } else { - /* most common failure mode is an unassigned character */ - groups_tried[group] = TRUE; - return 0; - } - - *lastConverterIndex = group; - - /* All initial byte values in lower ascii range should have been caught by now, - except with the exception group. - */ - U_ASSERT((firstByte <= ULMBCS_C0END) || (firstByte >= ULMBCS_C1START) || (group == ULMBCS_GRP_EXCEPT)); - - /* use converted data: first write 0, 1 or two group bytes */ - if (group != ULMBCS_GRP_EXCEPT && extraInfo->OptGroup != group) - { - *pLMBCS++ = group; - if (bytesConverted == 1 && group >= ULMBCS_DOUBLEOPTGROUP_START) - { - *pLMBCS++ = group; - } - } - - /* don't emit control chars */ - if ( bytesConverted == 1 && firstByte < 0x20 ) - return 0; - - - /* then move over the converted data */ - switch(bytesConverted) - { - case 4: - *pLMBCS++ = (ulmbcs_byte_t)(value >> 24); - U_FALLTHROUGH; - case 3: - *pLMBCS++ = (ulmbcs_byte_t)(value >> 16); - U_FALLTHROUGH; - case 2: - *pLMBCS++ = (ulmbcs_byte_t)(value >> 8); - U_FALLTHROUGH; - case 1: - *pLMBCS++ = (ulmbcs_byte_t)value; - U_FALLTHROUGH; - default: - /* will never occur */ - break; - } - - return (pLMBCS - pStartLMBCS); -} - - -/* This is a much simpler version of above, when we -know we are writing LMBCS using the Unicode group -*/ -static size_t -LMBCSConvertUni(ulmbcs_byte_t * pLMBCS, UChar uniChar) -{ - /* encode into LMBCS Unicode range */ - uint8_t LowCh = (uint8_t)(uniChar & 0x00FF); - uint8_t HighCh = (uint8_t)(uniChar >> 8); - - *pLMBCS++ = ULMBCS_GRP_UNICODE; - - if (LowCh == 0) - { - *pLMBCS++ = ULMBCS_UNICOMPATZERO; - *pLMBCS++ = HighCh; - } - else - { - *pLMBCS++ = HighCh; - *pLMBCS++ = LowCh; - } - return ULMBCS_UNICODE_SIZE; -} - - - -/* The main Unicode to LMBCS conversion function */ -static void -_LMBCSFromUnicode(UConverterFromUnicodeArgs* args, - UErrorCode* err) -{ - ulmbcs_byte_t lastConverterIndex = 0; - UChar uniChar; - ulmbcs_byte_t LMBCS[ULMBCS_CHARSIZE_MAX]; - ulmbcs_byte_t * pLMBCS; - int32_t bytes_written; - UBool groups_tried[ULMBCS_GRP_LAST+1]; - UConverterDataLMBCS * extraInfo = (UConverterDataLMBCS *) args->converter->extraInfo; - int sourceIndex = 0; - - /* Basic strategy: attempt to fill in local LMBCS 1-char buffer.(LMBCS) - If that succeeds, see if it will all fit into the target & copy it over - if it does. - - We try conversions in the following order: - - 1. Single-byte ascii & special fixed control chars (&null) - 2. Look up group in table & try that (could be - A) Unicode group - B) control group, - C) national encoding, - or ambiguous SBCS or MBCS group (on to step 4...) - - 3. If its ambiguous, try this order: - A) The optimization group - B) The locale group - C) The last group that succeeded with this string. - D) every other group that's relevent (single or double) - E) If its single-byte ambiguous, try the exceptions group - - 4. And as a grand fallback: Unicode - */ - - /*Fix for SPR#DJOE66JFN3 (Lotus)*/ - ulmbcs_byte_t OldConverterIndex = 0; - - while (args->source < args->sourceLimit && !U_FAILURE(*err)) - { - /*Fix for SPR#DJOE66JFN3 (Lotus)*/ - OldConverterIndex = extraInfo->localeConverterIndex; - - if (args->target >= args->targetLimit) - { - *err = U_BUFFER_OVERFLOW_ERROR; - break; - } - uniChar = *(args->source); - bytes_written = 0; - pLMBCS = LMBCS; - - /* check cases in rough order of how common they are, for speed */ - - /* single byte matches: strategy 1 */ - /*Fix for SPR#DJOE66JFN3 (Lotus)*/ - if((uniChar>=0x80) && (uniChar<=0xff) - /*Fix for SPR#JUYA6XAERU and TSAO7GL5NK (Lotus)*/ &&(uniChar!=0xB1) &&(uniChar!=0xD7) &&(uniChar!=0xF7) - &&(uniChar!=0xB0) &&(uniChar!=0xB4) &&(uniChar!=0xB6) &&(uniChar!=0xA7) &&(uniChar!=0xA8)) - { - extraInfo->localeConverterIndex = ULMBCS_GRP_L1; - } - if (((uniChar > ULMBCS_C0END) && (uniChar < ULMBCS_C1START)) || - uniChar == 0 || uniChar == ULMBCS_HT || uniChar == ULMBCS_CR || - uniChar == ULMBCS_LF || uniChar == ULMBCS_123SYSTEMRANGE - ) - { - *pLMBCS++ = (ulmbcs_byte_t ) uniChar; - bytes_written = 1; - } - - - if (!bytes_written) - { - /* Check by UNICODE range (Strategy 2) */ - ulmbcs_byte_t group = FindLMBCSUniRange(uniChar); - - if (group == ULMBCS_GRP_UNICODE) /* (Strategy 2A) */ - { - pLMBCS += LMBCSConvertUni(pLMBCS,uniChar); - - bytes_written = (int32_t)(pLMBCS - LMBCS); - } - else if (group == ULMBCS_GRP_CTRL) /* (Strategy 2B) */ - { - /* Handle control characters here */ - if (uniChar <= ULMBCS_C0END) - { - *pLMBCS++ = ULMBCS_GRP_CTRL; - *pLMBCS++ = (ulmbcs_byte_t)(ULMBCS_CTRLOFFSET + uniChar); - } - else if (uniChar >= ULMBCS_C1START && uniChar <= ULMBCS_C1START + ULMBCS_CTRLOFFSET) - { - *pLMBCS++ = ULMBCS_GRP_CTRL; - *pLMBCS++ = (ulmbcs_byte_t ) (uniChar & 0x00FF); - } - bytes_written = (int32_t)(pLMBCS - LMBCS); - } - else if (group < ULMBCS_GRP_UNICODE) /* (Strategy 2C) */ - { - /* a specific converter has been identified - use it */ - bytes_written = (int32_t)LMBCSConversionWorker ( - extraInfo, group, pLMBCS, &uniChar, - &lastConverterIndex, groups_tried); - } - if (!bytes_written) /* the ambiguous group cases (Strategy 3) */ - { - uprv_memset(groups_tried, 0, sizeof(groups_tried)); - - /* check for non-default optimization group (Strategy 3A )*/ - if ((extraInfo->OptGroup != 1) && (ULMBCS_AMBIGUOUS_MATCH(group, extraInfo->OptGroup))) - { - /*zhujin: upgrade, merge #39299 here (Lotus) */ - /*To make R5 compatible translation, look for exceptional group first for non-DBCS*/ - - if(extraInfo->localeConverterIndex < ULMBCS_DOUBLEOPTGROUP_START) - { - bytes_written = LMBCSConversionWorker (extraInfo, - ULMBCS_GRP_L1, pLMBCS, &uniChar, - &lastConverterIndex, groups_tried); - - if(!bytes_written) - { - bytes_written = LMBCSConversionWorker (extraInfo, - ULMBCS_GRP_EXCEPT, pLMBCS, &uniChar, - &lastConverterIndex, groups_tried); - } - if(!bytes_written) - { - bytes_written = LMBCSConversionWorker (extraInfo, - extraInfo->localeConverterIndex, pLMBCS, &uniChar, - &lastConverterIndex, groups_tried); - } - } - else - { - bytes_written = LMBCSConversionWorker (extraInfo, - extraInfo->localeConverterIndex, pLMBCS, &uniChar, - &lastConverterIndex, groups_tried); - } - } - /* check for locale optimization group (Strategy 3B) */ - if (!bytes_written && (extraInfo->localeConverterIndex) && (ULMBCS_AMBIGUOUS_MATCH(group, extraInfo->localeConverterIndex))) - { - bytes_written = (int32_t)LMBCSConversionWorker (extraInfo, - extraInfo->localeConverterIndex, pLMBCS, &uniChar, &lastConverterIndex, groups_tried); - } - /* check for last optimization group used for this string (Strategy 3C) */ - if (!bytes_written && (lastConverterIndex) && (ULMBCS_AMBIGUOUS_MATCH(group, lastConverterIndex))) - { - bytes_written = (int32_t)LMBCSConversionWorker (extraInfo, - lastConverterIndex, pLMBCS, &uniChar, &lastConverterIndex, groups_tried); - } - if (!bytes_written) - { - /* just check every possible matching converter (Strategy 3D) */ - ulmbcs_byte_t grp_start; - ulmbcs_byte_t grp_end; - ulmbcs_byte_t grp_ix; - grp_start = (ulmbcs_byte_t)((group == ULMBCS_AMBIGUOUS_MBCS) - ? ULMBCS_DOUBLEOPTGROUP_START - : ULMBCS_GRP_L1); - grp_end = (ulmbcs_byte_t)((group == ULMBCS_AMBIGUOUS_MBCS) - ? ULMBCS_GRP_LAST - : ULMBCS_GRP_TH); - if(group == ULMBCS_AMBIGUOUS_ALL) - { - grp_start = ULMBCS_GRP_L1; - grp_end = ULMBCS_GRP_LAST; - } - for (grp_ix = grp_start; - grp_ix <= grp_end && !bytes_written; - grp_ix++) - { - if (extraInfo->OptGrpConverter [grp_ix] && !groups_tried [grp_ix]) - { - bytes_written = (int32_t)LMBCSConversionWorker (extraInfo, - grp_ix, pLMBCS, &uniChar, - &lastConverterIndex, groups_tried); - } - } - /* a final conversion fallback to the exceptions group if its likely - to be single byte (Strategy 3E) */ - if (!bytes_written && grp_start == ULMBCS_GRP_L1) - { - bytes_written = (int32_t)LMBCSConversionWorker (extraInfo, - ULMBCS_GRP_EXCEPT, pLMBCS, &uniChar, - &lastConverterIndex, groups_tried); - } - } - /* all of our other strategies failed. Fallback to Unicode. (Strategy 4)*/ - if (!bytes_written) - { - - pLMBCS += LMBCSConvertUni(pLMBCS, uniChar); - bytes_written = (int32_t)(pLMBCS - LMBCS); - } - } - } - - /* we have a translation. increment source and write as much as posible to target */ - args->source++; - pLMBCS = LMBCS; - while (args->target < args->targetLimit && bytes_written--) - { - *(args->target)++ = *pLMBCS++; - if (args->offsets) - { - *(args->offsets)++ = sourceIndex; - } - } - sourceIndex++; - if (bytes_written > 0) - { - /* write any bytes that didn't fit in target to the error buffer, - common code will move this to target if we get called back with - enough target room - */ - uint8_t * pErrorBuffer = args->converter->charErrorBuffer; - *err = U_BUFFER_OVERFLOW_ERROR; - args->converter->charErrorBufferLength = (int8_t)bytes_written; - while (bytes_written--) - { - *pErrorBuffer++ = *pLMBCS++; - } - } - /*Fix for SPR#DJOE66JFN3 (Lotus)*/ - extraInfo->localeConverterIndex = OldConverterIndex; - } -} - - -/* Now, the Unicode from LMBCS section */ - - -/* A function to call when we are looking at the Unicode group byte in LMBCS */ -static UChar -GetUniFromLMBCSUni(char const ** ppLMBCSin) /* Called with LMBCS-style Unicode byte stream */ -{ - uint8_t HighCh = *(*ppLMBCSin)++; /* Big-endian Unicode in LMBCS compatibility group*/ - uint8_t LowCh = *(*ppLMBCSin)++; - - if (HighCh == ULMBCS_UNICOMPATZERO ) - { - HighCh = LowCh; - LowCh = 0; /* zero-byte in LSB special character */ - } - return (UChar)((HighCh << 8) | LowCh); -} - - - -/* CHECK_SOURCE_LIMIT: Helper macro to verify that there are at least'index' - bytes left in source up to sourceLimit.Errors appropriately if not. - If we reach the limit, then update the source pointer to there to consume - all input as required by ICU converter semantics. -*/ - -#define CHECK_SOURCE_LIMIT(index) \ - if (args->source+index > args->sourceLimit){\ - *err = U_TRUNCATED_CHAR_FOUND;\ - args->source = args->sourceLimit;\ - return 0xffff;} - -/* Return the Unicode representation for the current LMBCS character */ - -static UChar32 -_LMBCSGetNextUCharWorker(UConverterToUnicodeArgs* args, - UErrorCode* err) -{ - UChar32 uniChar = 0; /* an output UNICODE char */ - ulmbcs_byte_t CurByte; /* A byte from the input stream */ - - /* error check */ - if (args->source >= args->sourceLimit) - { - *err = U_ILLEGAL_ARGUMENT_ERROR; - return 0xffff; - } - /* Grab first byte & save address for error recovery */ - CurByte = *((ulmbcs_byte_t *) (args->source++)); - - /* - * at entry of each if clause: - * 1. 'CurByte' points at the first byte of a LMBCS character - * 2. '*source'points to the next byte of the source stream after 'CurByte' - * - * the job of each if clause is: - * 1. set '*source' to point at the beginning of next char (nop if LMBCS char is only 1 byte) - * 2. set 'uniChar' up with the right Unicode value, or set 'err' appropriately - */ - - /* First lets check the simple fixed values. */ - - if(((CurByte > ULMBCS_C0END) && (CurByte < ULMBCS_C1START)) /* ascii range */ - || (CurByte == 0) - || CurByte == ULMBCS_HT || CurByte == ULMBCS_CR - || CurByte == ULMBCS_LF || CurByte == ULMBCS_123SYSTEMRANGE) - { - uniChar = CurByte; - } - else - { - UConverterDataLMBCS * extraInfo; - ulmbcs_byte_t group; - UConverterSharedData *cnv; - - if (CurByte == ULMBCS_GRP_CTRL) /* Control character group - no opt group update */ - { - ulmbcs_byte_t C0C1byte; - CHECK_SOURCE_LIMIT(1); - C0C1byte = *(args->source)++; - uniChar = (C0C1byte < ULMBCS_C1START) ? C0C1byte - ULMBCS_CTRLOFFSET : C0C1byte; - } - else - if (CurByte == ULMBCS_GRP_UNICODE) /* Unicode compatibility group: BigEndian UTF16 */ - { - CHECK_SOURCE_LIMIT(2); - - /* don't check for error indicators fffe/ffff below */ - return GetUniFromLMBCSUni(&(args->source)); - } - else if (CurByte <= ULMBCS_CTRLOFFSET) - { - group = CurByte; /* group byte is in the source */ - extraInfo = (UConverterDataLMBCS *) args->converter->extraInfo; - if (group > ULMBCS_GRP_LAST || (cnv = extraInfo->OptGrpConverter[group]) == NULL) - { - /* this is not a valid group byte - no converter*/ - *err = U_INVALID_CHAR_FOUND; - } - else if (group >= ULMBCS_DOUBLEOPTGROUP_START) /* double byte conversion */ - { - - CHECK_SOURCE_LIMIT(2); - - /* check for LMBCS doubled-group-byte case */ - if (*args->source == group) { - /* single byte */ - ++args->source; - uniChar = ucnv_MBCSSimpleGetNextUChar(cnv, args->source, 1, FALSE); - ++args->source; - } else { - /* double byte */ - uniChar = ucnv_MBCSSimpleGetNextUChar(cnv, args->source, 2, FALSE); - args->source += 2; - } - } - else { /* single byte conversion */ - CHECK_SOURCE_LIMIT(1); - CurByte = *(args->source)++; - - if (CurByte >= ULMBCS_C1START) - { - uniChar = _MBCS_SINGLE_SIMPLE_GET_NEXT_BMP(cnv, CurByte); - } - else - { - /* The non-optimizable oddballs where there is an explicit byte - * AND the second byte is not in the upper ascii range - */ - char bytes[2]; - - extraInfo = (UConverterDataLMBCS *) args->converter->extraInfo; - cnv = extraInfo->OptGrpConverter [ULMBCS_GRP_EXCEPT]; - - /* Lookup value must include opt group */ - bytes[0] = group; - bytes[1] = CurByte; - uniChar = ucnv_MBCSSimpleGetNextUChar(cnv, bytes, 2, FALSE); - } - } - } - else if (CurByte >= ULMBCS_C1START) /* group byte is implicit */ - { - extraInfo = (UConverterDataLMBCS *) args->converter->extraInfo; - group = extraInfo->OptGroup; - cnv = extraInfo->OptGrpConverter[group]; - if (group >= ULMBCS_DOUBLEOPTGROUP_START) /* double byte conversion */ - { - if (!ucnv_MBCSIsLeadByte(cnv, CurByte)) - { - CHECK_SOURCE_LIMIT(0); - - /* let the MBCS conversion consume CurByte again */ - uniChar = ucnv_MBCSSimpleGetNextUChar(cnv, args->source - 1, 1, FALSE); - } - else - { - CHECK_SOURCE_LIMIT(1); - /* let the MBCS conversion consume CurByte again */ - uniChar = ucnv_MBCSSimpleGetNextUChar(cnv, args->source - 1, 2, FALSE); - ++args->source; - } - } - else /* single byte conversion */ - { - uniChar = _MBCS_SINGLE_SIMPLE_GET_NEXT_BMP(cnv, CurByte); - } - } - } - return uniChar; -} - - -/* The exported function that converts lmbcs to one or more - UChars - currently UTF-16 -*/ -static void -_LMBCSToUnicodeWithOffsets(UConverterToUnicodeArgs* args, - UErrorCode* err) -{ - char LMBCS [ULMBCS_CHARSIZE_MAX]; - UChar uniChar; /* one output UNICODE char */ - const char * saveSource; /* beginning of current code point */ - const char * pStartLMBCS = args->source; /* beginning of whole string */ - const char * errSource = NULL; /* pointer to actual input in case an error occurs */ - int8_t savebytes = 0; - - /* Process from source to limit, or until error */ - while (U_SUCCESS(*err) && args->sourceLimit > args->source && args->targetLimit > args->target) - { - saveSource = args->source; /* beginning of current code point */ - - if (args->converter->toULength) /* reassemble char from previous call */ - { - const char *saveSourceLimit; - size_t size_old = args->converter->toULength; - - /* limit from source is either remainder of temp buffer, or user limit on source */ - size_t size_new_maybe_1 = sizeof(LMBCS) - size_old; - size_t size_new_maybe_2 = args->sourceLimit - args->source; - size_t size_new = (size_new_maybe_1 < size_new_maybe_2) ? size_new_maybe_1 : size_new_maybe_2; - - - uprv_memcpy(LMBCS, args->converter->toUBytes, size_old); - uprv_memcpy(LMBCS + size_old, args->source, size_new); - saveSourceLimit = args->sourceLimit; - args->source = errSource = LMBCS; - args->sourceLimit = LMBCS+size_old+size_new; - savebytes = (int8_t)(size_old+size_new); - uniChar = (UChar) _LMBCSGetNextUCharWorker(args, err); - args->source = saveSource + ((args->source - LMBCS) - size_old); - args->sourceLimit = saveSourceLimit; - - if (*err == U_TRUNCATED_CHAR_FOUND) - { - /* evil special case: source buffers so small a char spans more than 2 buffers */ - args->converter->toULength = savebytes; - uprv_memcpy(args->converter->toUBytes, LMBCS, savebytes); - args->source = args->sourceLimit; - *err = U_ZERO_ERROR; - return; - } - else - { - /* clear the partial-char marker */ - args->converter->toULength = 0; - } - } - else - { - errSource = saveSource; - uniChar = (UChar) _LMBCSGetNextUCharWorker(args, err); - savebytes = (int8_t)(args->source - saveSource); - } - if (U_SUCCESS(*err)) - { - if (uniChar < 0xfffe) - { - *(args->target)++ = uniChar; - if(args->offsets) - { - *(args->offsets)++ = (int32_t)(saveSource - pStartLMBCS); - } - } - else if (uniChar == 0xfffe) - { - *err = U_INVALID_CHAR_FOUND; - } - else /* if (uniChar == 0xffff) */ - { - *err = U_ILLEGAL_CHAR_FOUND; - } - } - } - /* if target ran out before source, return U_BUFFER_OVERFLOW_ERROR */ - if (U_SUCCESS(*err) && args->sourceLimit > args->source && args->targetLimit <= args->target) - { - *err = U_BUFFER_OVERFLOW_ERROR; - } - else if (U_FAILURE(*err)) - { - /* If character incomplete or unmappable/illegal, store it in toUBytes[] */ - args->converter->toULength = savebytes; - if (savebytes > 0) { - uprv_memcpy(args->converter->toUBytes, errSource, savebytes); - } - if (*err == U_TRUNCATED_CHAR_FOUND) { - *err = U_ZERO_ERROR; - } - } -} - -/* And now, the macroized declarations of data & functions: */ -DEFINE_LMBCS_OPEN(1) -DEFINE_LMBCS_OPEN(2) -DEFINE_LMBCS_OPEN(3) -DEFINE_LMBCS_OPEN(4) -DEFINE_LMBCS_OPEN(5) -DEFINE_LMBCS_OPEN(6) -DEFINE_LMBCS_OPEN(8) -DEFINE_LMBCS_OPEN(11) -DEFINE_LMBCS_OPEN(16) -DEFINE_LMBCS_OPEN(17) -DEFINE_LMBCS_OPEN(18) -DEFINE_LMBCS_OPEN(19) - - -DECLARE_LMBCS_DATA(1) -DECLARE_LMBCS_DATA(2) -DECLARE_LMBCS_DATA(3) -DECLARE_LMBCS_DATA(4) -DECLARE_LMBCS_DATA(5) -DECLARE_LMBCS_DATA(6) -DECLARE_LMBCS_DATA(8) -DECLARE_LMBCS_DATA(11) -DECLARE_LMBCS_DATA(16) -DECLARE_LMBCS_DATA(17) -DECLARE_LMBCS_DATA(18) -DECLARE_LMBCS_DATA(19) - -#endif /* #if !UCONFIG_NO_LEGACY_CONVERSION */ diff --git a/Build/source/libs/icu/icu-src/source/common/ucnv_lmb.cpp b/Build/source/libs/icu/icu-src/source/common/ucnv_lmb.cpp new file mode 100644 index 00000000000..1ec56f7a45f --- /dev/null +++ b/Build/source/libs/icu/icu-src/source/common/ucnv_lmb.cpp @@ -0,0 +1,1386 @@ +// © 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html +/* +********************************************************************** +* Copyright (C) 2000-2016, International Business Machines +* Corporation and others. All Rights Reserved. +********************************************************************** +* file name: ucnv_lmb.cpp +* encoding: UTF-8 +* tab size: 4 (not used) +* indentation:4 +* +* created on: 2000feb09 +* created by: Brendan Murray +* extensively hacked up by: Jim Snyder-Grant +* +* Modification History: +* +* Date Name Description +* +* 06/20/2000 helena OS/400 port changes; mostly typecast. +* 06/27/2000 Jim Snyder-Grant Deal with partial characters and small buffers. +* Add comments to document LMBCS format and implementation +* restructured order & breakdown of functions +* 06/28/2000 helena Major rewrite for the callback API changes. +*/ + +#include "unicode/utypes.h" + +#if !UCONFIG_NO_CONVERSION && !UCONFIG_NO_LEGACY_CONVERSION && !UCONFIG_ONLY_HTML_CONVERSION + +#include "unicode/ucnv_err.h" +#include "unicode/ucnv.h" +#include "unicode/uset.h" +#include "cmemory.h" +#include "cstring.h" +#include "uassert.h" +#include "ucnv_imp.h" +#include "ucnv_bld.h" +#include "ucnv_cnv.h" + +#ifdef EBCDIC_RTL + #include "ascii_a.h" +#endif + +/* + LMBCS + + (Lotus Multi-Byte Character Set) + + LMBCS was invented in the late 1980's and is primarily used in Lotus Notes + databases and in Lotus 1-2-3 files. Programmers who work with the APIs + into these products will sometimes need to deal with strings in this format. + + The code in this file provides an implementation for an ICU converter of + LMBCS to and from Unicode. + + Since the LMBCS character set is only sparsely documented in existing + printed or online material, we have added extensive annotation to this + file to serve as a guide to understanding LMBCS. + + LMBCS was originally designed with these four sometimes-competing design goals: + + -Provide encodings for the characters in 12 existing national standards + (plus a few other characters) + -Minimal memory footprint + -Maximal speed of conversion into the existing national character sets + -No need to track a changing state as you interpret a string. + + + All of the national character sets LMBCS was trying to encode are 'ANSI' + based, in that the bytes from 0x20 - 0x7F are almost exactly the + same common Latin unaccented characters and symbols in all character sets. + + So, in order to help meet the speed & memory design goals, the common ANSI + bytes from 0x20-0x7F are represented by the same single-byte values in LMBCS. + + The general LMBCS code unit is from 1-3 bytes. We can describe the 3 bytes as + follows: + + [G] D1 [D2] + + That is, a sometimes-optional 'group' byte, followed by 1 and sometimes 2 + data bytes. The maximum size of a LMBCS chjaracter is 3 bytes: +*/ +#define ULMBCS_CHARSIZE_MAX 3 +/* + The single-byte values from 0x20 to 0x7F are examples of single D1 bytes. + We often have to figure out if byte values are below or above this, so we + use the ANSI nomenclature 'C0' and 'C1' to refer to the range of control + characters just above & below the common lower-ANSI range */ +#define ULMBCS_C0END 0x1F +#define ULMBCS_C1START 0x80 +/* + Since LMBCS is always dealing in byte units. we create a local type here for + dealing with these units of LMBCS code units: + +*/ +typedef uint8_t ulmbcs_byte_t; + +/* + Most of the values less than 0x20 are reserved in LMBCS to announce + which national character standard is being used for the 'D' bytes. + In the comments we show the common name and the IBM character-set ID + for these character-set announcers: +*/ + +#define ULMBCS_GRP_L1 0x01 /* Latin-1 :ibm-850 */ +#define ULMBCS_GRP_GR 0x02 /* Greek :ibm-851 */ +#define ULMBCS_GRP_HE 0x03 /* Hebrew :ibm-1255 */ +#define ULMBCS_GRP_AR 0x04 /* Arabic :ibm-1256 */ +#define ULMBCS_GRP_RU 0x05 /* Cyrillic :ibm-1251 */ +#define ULMBCS_GRP_L2 0x06 /* Latin-2 :ibm-852 */ +#define ULMBCS_GRP_TR 0x08 /* Turkish :ibm-1254 */ +#define ULMBCS_GRP_TH 0x0B /* Thai :ibm-874 */ +#define ULMBCS_GRP_JA 0x10 /* Japanese :ibm-943 */ +#define ULMBCS_GRP_KO 0x11 /* Korean :ibm-1261 */ +#define ULMBCS_GRP_TW 0x12 /* Chinese SC :ibm-950 */ +#define ULMBCS_GRP_CN 0x13 /* Chinese TC :ibm-1386 */ + +/* + So, the beginning of understanding LMBCS is that IF the first byte of a LMBCS + character is one of those 12 values, you can interpret the remaining bytes of + that character as coming from one of those character sets. Since the lower + ANSI bytes already are represented in single bytes, using one of the character + set announcers is used to announce a character that starts with a byte of + 0x80 or greater. + + The character sets are arranged so that the single byte sets all appear + before the multi-byte character sets. When we need to tell whether a + group byte is for a single byte char set or not we use this define: */ + +#define ULMBCS_DOUBLEOPTGROUP_START 0x10 + +/* +However, to fully understand LMBCS, you must also understand a series of +exceptions & optimizations made in service of the design goals. + +First, those of you who are character set mavens may have noticed that +the 'double-byte' character sets are actually multi-byte character sets +that can have 1 or two bytes, even in the upper-ascii range. To force +each group byte to introduce a fixed-width encoding (to make it faster to +count characters), we use a convention of doubling up on the group byte +to introduce any single-byte character > 0x80 in an otherwise double-byte +character set. So, for example, the LMBCS sequence x10 x10 xAE is the +same as '0xAE' in the Japanese code page 943. + +Next, you will notice that the list of group bytes has some gaps. +These are used in various ways. + +We reserve a few special single byte values for common control +characters. These are in the same place as their ANSI eqivalents for speed. +*/ + +#define ULMBCS_HT 0x09 /* Fixed control char - Horizontal Tab */ +#define ULMBCS_LF 0x0A /* Fixed control char - Line Feed */ +#define ULMBCS_CR 0x0D /* Fixed control char - Carriage Return */ + +/* Then, 1-2-3 reserved a special single-byte character to put at the +beginning of internal 'system' range names: */ + +#define ULMBCS_123SYSTEMRANGE 0x19 + +/* Then we needed a place to put all the other ansi control characters +that must be moved to different values because LMBCS reserves those +values for other purposes. To represent the control characters, we start +with a first byte of 0xF & add the control chaarcter value as the +second byte */ +#define ULMBCS_GRP_CTRL 0x0F + +/* For the C0 controls (less than 0x20), we add 0x20 to preserve the +useful doctrine that any byte less than 0x20 in a LMBCS char must be +the first byte of a character:*/ +#define ULMBCS_CTRLOFFSET 0x20 + +/* +Where to put the characters that aren't part of any of the 12 national +character sets? The first thing that was done, in the earlier years of +LMBCS, was to use up the spaces of the form + + [G] D1, + + where 'G' was one of the single-byte character groups, and + D1 was less than 0x80. These sequences are gathered together + into a Lotus-invented doublebyte character set to represent a + lot of stray values. Internally, in this implementation, we track this + as group '0', as a place to tuck this exceptions list.*/ + +#define ULMBCS_GRP_EXCEPT 0x00 +/* + Finally, as the durability and usefulness of UNICODE became clear, + LOTUS added a new group 0x14 to hold Unicode values not otherwise + represented in LMBCS: */ +#define ULMBCS_GRP_UNICODE 0x14 +/* The two bytes appearing after a 0x14 are intrepreted as UFT-16 BE +(Big-Endian) characters. The exception comes when the UTF16 +representation would have a zero as the second byte. In that case, +'F6' is used in its place, and the bytes are swapped. (This prevents +LMBCS from encoding any Unicode values of the form U+F6xx, but that's OK: +0xF6xx is in the middle of the Private Use Area.)*/ +#define ULMBCS_UNICOMPATZERO 0xF6 + +/* It is also useful in our code to have a constant for the size of +a LMBCS char that holds a literal Unicode value */ +#define ULMBCS_UNICODE_SIZE 3 + +/* +To squish the LMBCS representations down even further, and to make +translations even faster,sometimes the optimization group byte can be dropped +from a LMBCS character. This is decided on a process-by-process basis. The +group byte that is dropped is called the 'optimization group'. + +For Notes, the optimzation group is always 0x1.*/ +#define ULMBCS_DEFAULTOPTGROUP 0x1 +/* For 1-2-3 files, the optimzation group is stored in the header of the 1-2-3 +file. + + In any case, when using ICU, you either pass in the +optimization group as part of the name of the converter (LMBCS-1, LMBCS-2, +etc.). Using plain 'LMBCS' as the name of the converter will give you +LMBCS-1. + + +*** Implementation strategy *** + + +Because of the extensive use of other character sets, the LMBCS converter +keeps a mapping between optimization groups and IBM character sets, so that +ICU converters can be created and used as needed. */ + +/* As you can see, even though any byte below 0x20 could be an optimization +byte, only those at 0x13 or below can map to an actual converter. To limit +some loops and searches, we define a value for that last group converter:*/ + +#define ULMBCS_GRP_LAST 0x13 /* last LMBCS group that has a converter */ + +static const char * const OptGroupByteToCPName[ULMBCS_GRP_LAST + 1] = { + /* 0x0000 */ "lmb-excp", /* internal home for the LOTUS exceptions list */ + /* 0x0001 */ "ibm-850", + /* 0x0002 */ "ibm-851", + /* 0x0003 */ "windows-1255", + /* 0x0004 */ "windows-1256", + /* 0x0005 */ "windows-1251", + /* 0x0006 */ "ibm-852", + /* 0x0007 */ NULL, /* Unused */ + /* 0x0008 */ "windows-1254", + /* 0x0009 */ NULL, /* Control char HT */ + /* 0x000A */ NULL, /* Control char LF */ + /* 0x000B */ "windows-874", + /* 0x000C */ NULL, /* Unused */ + /* 0x000D */ NULL, /* Control char CR */ + /* 0x000E */ NULL, /* Unused */ + /* 0x000F */ NULL, /* Control chars: 0x0F20 + C0/C1 character: algorithmic */ + /* 0x0010 */ "windows-932", + /* 0x0011 */ "windows-949", + /* 0x0012 */ "windows-950", + /* 0x0013 */ "windows-936" + + /* The rest are null, including the 0x0014 Unicode compatibility region + and 0x0019, the 1-2-3 system range control char */ +}; + + +/* That's approximately all the data that's needed for translating + LMBCS to Unicode. + + +However, to translate Unicode to LMBCS, we need some more support. + +That's because there are often more than one possible mappings from a Unicode +code point back into LMBCS. The first thing we do is look up into a table +to figure out if there are more than one possible mappings. This table, +arranged by Unicode values (including ranges) either lists which group +to use, or says that it could go into one or more of the SBCS sets, or +into one or more of the DBCS sets. (If the character exists in both DBCS & +SBCS, the table will place it in the SBCS sets, to make the LMBCS code point +length as small as possible. Here's the two special markers we use to indicate +ambiguous mappings: */ + +#define ULMBCS_AMBIGUOUS_SBCS 0x80 /* could fit in more than one + LMBCS sbcs native encoding + (example: most accented latin) */ +#define ULMBCS_AMBIGUOUS_MBCS 0x81 /* could fit in more than one + LMBCS mbcs native encoding + (example: Unihan) */ +#define ULMBCS_AMBIGUOUS_ALL 0x82 +/* And here's a simple way to see if a group falls in an appropriate range */ +#define ULMBCS_AMBIGUOUS_MATCH(agroup, xgroup) \ + ((((agroup) == ULMBCS_AMBIGUOUS_SBCS) && \ + (xgroup) < ULMBCS_DOUBLEOPTGROUP_START) || \ + (((agroup) == ULMBCS_AMBIGUOUS_MBCS) && \ + (xgroup) >= ULMBCS_DOUBLEOPTGROUP_START)) || \ + ((agroup) == ULMBCS_AMBIGUOUS_ALL) + + +/* The table & some code to use it: */ + + +static const struct _UniLMBCSGrpMap +{ + const UChar uniStartRange; + const UChar uniEndRange; + const ulmbcs_byte_t GrpType; +} UniLMBCSGrpMap[] += +{ + + {0x0001, 0x001F, ULMBCS_GRP_CTRL}, + {0x0080, 0x009F, ULMBCS_GRP_CTRL}, + {0x00A0, 0x00A6, ULMBCS_AMBIGUOUS_SBCS}, + {0x00A7, 0x00A8, ULMBCS_AMBIGUOUS_ALL}, + {0x00A9, 0x00AF, ULMBCS_AMBIGUOUS_SBCS}, + {0x00B0, 0x00B1, ULMBCS_AMBIGUOUS_ALL}, + {0x00B2, 0x00B3, ULMBCS_AMBIGUOUS_SBCS}, + {0x00B4, 0x00B4, ULMBCS_AMBIGUOUS_ALL}, + {0x00B5, 0x00B5, ULMBCS_AMBIGUOUS_SBCS}, + {0x00B6, 0x00B6, ULMBCS_AMBIGUOUS_ALL}, + {0x00B7, 0x00D6, ULMBCS_AMBIGUOUS_SBCS}, + {0x00D7, 0x00D7, ULMBCS_AMBIGUOUS_ALL}, + {0x00D8, 0x00F6, ULMBCS_AMBIGUOUS_SBCS}, + {0x00F7, 0x00F7, ULMBCS_AMBIGUOUS_ALL}, + {0x00F8, 0x01CD, ULMBCS_AMBIGUOUS_SBCS}, + {0x01CE, 0x01CE, ULMBCS_GRP_TW }, + {0x01CF, 0x02B9, ULMBCS_AMBIGUOUS_SBCS}, + {0x02BA, 0x02BA, ULMBCS_GRP_CN}, + {0x02BC, 0x02C8, ULMBCS_AMBIGUOUS_SBCS}, + {0x02C9, 0x02D0, ULMBCS_AMBIGUOUS_MBCS}, + {0x02D8, 0x02DD, ULMBCS_AMBIGUOUS_SBCS}, + {0x0384, 0x0390, ULMBCS_AMBIGUOUS_SBCS}, + {0x0391, 0x03A9, ULMBCS_AMBIGUOUS_ALL}, + {0x03AA, 0x03B0, ULMBCS_AMBIGUOUS_SBCS}, + {0x03B1, 0x03C9, ULMBCS_AMBIGUOUS_ALL}, + {0x03CA, 0x03CE, ULMBCS_AMBIGUOUS_SBCS}, + {0x0400, 0x0400, ULMBCS_GRP_RU}, + {0x0401, 0x0401, ULMBCS_AMBIGUOUS_ALL}, + {0x0402, 0x040F, ULMBCS_GRP_RU}, + {0x0410, 0x0431, ULMBCS_AMBIGUOUS_ALL}, + {0x0432, 0x044E, ULMBCS_GRP_RU}, + {0x044F, 0x044F, ULMBCS_AMBIGUOUS_ALL}, + {0x0450, 0x0491, ULMBCS_GRP_RU}, + {0x05B0, 0x05F2, ULMBCS_GRP_HE}, + {0x060C, 0x06AF, ULMBCS_GRP_AR}, + {0x0E01, 0x0E5B, ULMBCS_GRP_TH}, + {0x200C, 0x200F, ULMBCS_AMBIGUOUS_SBCS}, + {0x2010, 0x2010, ULMBCS_AMBIGUOUS_MBCS}, + {0x2013, 0x2014, ULMBCS_AMBIGUOUS_SBCS}, + {0x2015, 0x2015, ULMBCS_AMBIGUOUS_MBCS}, + {0x2016, 0x2016, ULMBCS_AMBIGUOUS_MBCS}, + {0x2017, 0x2017, ULMBCS_AMBIGUOUS_SBCS}, + {0x2018, 0x2019, ULMBCS_AMBIGUOUS_ALL}, + {0x201A, 0x201B, ULMBCS_AMBIGUOUS_SBCS}, + {0x201C, 0x201D, ULMBCS_AMBIGUOUS_ALL}, + {0x201E, 0x201F, ULMBCS_AMBIGUOUS_SBCS}, + {0x2020, 0x2021, ULMBCS_AMBIGUOUS_ALL}, + {0x2022, 0x2024, ULMBCS_AMBIGUOUS_SBCS}, + {0x2025, 0x2025, ULMBCS_AMBIGUOUS_MBCS}, + {0x2026, 0x2026, ULMBCS_AMBIGUOUS_ALL}, + {0x2027, 0x2027, ULMBCS_GRP_TW}, + {0x2030, 0x2030, ULMBCS_AMBIGUOUS_ALL}, + {0x2031, 0x2031, ULMBCS_AMBIGUOUS_SBCS}, + {0x2032, 0x2033, ULMBCS_AMBIGUOUS_MBCS}, + {0x2035, 0x2035, ULMBCS_AMBIGUOUS_MBCS}, + {0x2039, 0x203A, ULMBCS_AMBIGUOUS_SBCS}, + {0x203B, 0x203B, ULMBCS_AMBIGUOUS_MBCS}, + {0x203C, 0x203C, ULMBCS_GRP_EXCEPT}, + {0x2074, 0x2074, ULMBCS_GRP_KO}, + {0x207F, 0x207F, ULMBCS_GRP_EXCEPT}, + {0x2081, 0x2084, ULMBCS_GRP_KO}, + {0x20A4, 0x20AC, ULMBCS_AMBIGUOUS_SBCS}, + {0x2103, 0x2109, ULMBCS_AMBIGUOUS_MBCS}, + {0x2111, 0x2120, ULMBCS_AMBIGUOUS_SBCS}, + /*zhujin: upgrade, for regressiont test, spr HKIA4YHTSU*/ + {0x2121, 0x2121, ULMBCS_AMBIGUOUS_MBCS}, + {0x2122, 0x2126, ULMBCS_AMBIGUOUS_SBCS}, + {0x212B, 0x212B, ULMBCS_AMBIGUOUS_MBCS}, + {0x2135, 0x2135, ULMBCS_AMBIGUOUS_SBCS}, + {0x2153, 0x2154, ULMBCS_GRP_KO}, + {0x215B, 0x215E, ULMBCS_GRP_EXCEPT}, + {0x2160, 0x2179, ULMBCS_AMBIGUOUS_MBCS}, + {0x2190, 0x2193, ULMBCS_AMBIGUOUS_ALL}, + {0x2194, 0x2195, ULMBCS_GRP_EXCEPT}, + {0x2196, 0x2199, ULMBCS_AMBIGUOUS_MBCS}, + {0x21A8, 0x21A8, ULMBCS_GRP_EXCEPT}, + {0x21B8, 0x21B9, ULMBCS_GRP_CN}, + {0x21D0, 0x21D1, ULMBCS_GRP_EXCEPT}, + {0x21D2, 0x21D2, ULMBCS_AMBIGUOUS_MBCS}, + {0x21D3, 0x21D3, ULMBCS_GRP_EXCEPT}, + {0x21D4, 0x21D4, ULMBCS_AMBIGUOUS_MBCS}, + {0x21D5, 0x21D5, ULMBCS_GRP_EXCEPT}, + {0x21E7, 0x21E7, ULMBCS_GRP_CN}, + {0x2200, 0x2200, ULMBCS_AMBIGUOUS_MBCS}, + {0x2201, 0x2201, ULMBCS_GRP_EXCEPT}, + {0x2202, 0x2202, ULMBCS_AMBIGUOUS_MBCS}, + {0x2203, 0x2203, ULMBCS_AMBIGUOUS_MBCS}, + {0x2204, 0x2206, ULMBCS_GRP_EXCEPT}, + {0x2207, 0x2208, ULMBCS_AMBIGUOUS_MBCS}, + {0x2209, 0x220A, ULMBCS_GRP_EXCEPT}, + {0x220B, 0x220B, ULMBCS_AMBIGUOUS_MBCS}, + {0x220F, 0x2215, ULMBCS_AMBIGUOUS_MBCS}, + {0x2219, 0x2219, ULMBCS_GRP_EXCEPT}, + {0x221A, 0x221A, ULMBCS_AMBIGUOUS_MBCS}, + {0x221B, 0x221C, ULMBCS_GRP_EXCEPT}, + {0x221D, 0x221E, ULMBCS_AMBIGUOUS_MBCS}, + {0x221F, 0x221F, ULMBCS_GRP_EXCEPT}, + {0x2220, 0x2220, ULMBCS_AMBIGUOUS_MBCS}, + {0x2223, 0x222A, ULMBCS_AMBIGUOUS_MBCS}, + {0x222B, 0x223D, ULMBCS_AMBIGUOUS_MBCS}, + {0x2245, 0x2248, ULMBCS_GRP_EXCEPT}, + {0x224C, 0x224C, ULMBCS_GRP_TW}, + {0x2252, 0x2252, ULMBCS_AMBIGUOUS_MBCS}, + {0x2260, 0x2261, ULMBCS_AMBIGUOUS_MBCS}, + {0x2262, 0x2265, ULMBCS_GRP_EXCEPT}, + {0x2266, 0x226F, ULMBCS_AMBIGUOUS_MBCS}, + {0x2282, 0x2283, ULMBCS_AMBIGUOUS_MBCS}, + {0x2284, 0x2285, ULMBCS_GRP_EXCEPT}, + {0x2286, 0x2287, ULMBCS_AMBIGUOUS_MBCS}, + {0x2288, 0x2297, ULMBCS_GRP_EXCEPT}, + {0x2299, 0x22BF, ULMBCS_AMBIGUOUS_MBCS}, + {0x22C0, 0x22C0, ULMBCS_GRP_EXCEPT}, + {0x2310, 0x2310, ULMBCS_GRP_EXCEPT}, + {0x2312, 0x2312, ULMBCS_AMBIGUOUS_MBCS}, + {0x2318, 0x2321, ULMBCS_GRP_EXCEPT}, + {0x2318, 0x2321, ULMBCS_GRP_CN}, + {0x2460, 0x24E9, ULMBCS_AMBIGUOUS_MBCS}, + {0x2500, 0x2500, ULMBCS_AMBIGUOUS_SBCS}, + {0x2501, 0x2501, ULMBCS_AMBIGUOUS_MBCS}, + {0x2502, 0x2502, ULMBCS_AMBIGUOUS_ALL}, + {0x2503, 0x2503, ULMBCS_AMBIGUOUS_MBCS}, + {0x2504, 0x2505, ULMBCS_GRP_TW}, + {0x2506, 0x2665, ULMBCS_AMBIGUOUS_ALL}, + {0x2666, 0x2666, ULMBCS_GRP_EXCEPT}, + {0x2667, 0x2669, ULMBCS_AMBIGUOUS_SBCS}, + {0x266A, 0x266A, ULMBCS_AMBIGUOUS_ALL}, + {0x266B, 0x266C, ULMBCS_AMBIGUOUS_SBCS}, + {0x266D, 0x266D, ULMBCS_AMBIGUOUS_MBCS}, + {0x266E, 0x266E, ULMBCS_AMBIGUOUS_SBCS}, + {0x266F, 0x266F, ULMBCS_GRP_JA}, + {0x2670, 0x2E7F, ULMBCS_AMBIGUOUS_SBCS}, + {0x2E80, 0xF861, ULMBCS_AMBIGUOUS_MBCS}, + {0xF862, 0xF8FF, ULMBCS_GRP_EXCEPT}, + {0xF900, 0xFA2D, ULMBCS_AMBIGUOUS_MBCS}, + {0xFB00, 0xFEFF, ULMBCS_AMBIGUOUS_SBCS}, + {0xFF01, 0xFFEE, ULMBCS_AMBIGUOUS_MBCS}, + {0xFFFF, 0xFFFF, ULMBCS_GRP_UNICODE} +}; + +static ulmbcs_byte_t +FindLMBCSUniRange(UChar uniChar) +{ + const struct _UniLMBCSGrpMap * pTable = UniLMBCSGrpMap; + + while (uniChar > pTable->uniEndRange) + { + pTable++; + } + + if (uniChar >= pTable->uniStartRange) + { + return pTable->GrpType; + } + return ULMBCS_GRP_UNICODE; +} + +/* +We also ask the creator of a converter to send in a preferred locale +that we can use in resolving ambiguous mappings. They send the locale +in as a string, and we map it, if possible, to one of the +LMBCS groups. We use this table, and the associated code, to +do the lookup: */ + +/************************************************** + This table maps locale ID's to LMBCS opt groups. + The default return is group 0x01. Note that for + performance reasons, the table is sorted in + increasing alphabetic order, with the notable + exception of zhTW. This is to force the check + for Traditonal Chinese before dropping back to + Simplified. + + Note too that the Latin-1 groups have been + commented out because it's the default, and + this shortens the table, allowing a serial + search to go quickly. + *************************************************/ + +static const struct _LocaleLMBCSGrpMap +{ + const char *LocaleID; + const ulmbcs_byte_t OptGroup; +} LocaleLMBCSGrpMap[] = +{ + {"ar", ULMBCS_GRP_AR}, + {"be", ULMBCS_GRP_RU}, + {"bg", ULMBCS_GRP_L2}, + /* {"ca", ULMBCS_GRP_L1}, */ + {"cs", ULMBCS_GRP_L2}, + /* {"da", ULMBCS_GRP_L1}, */ + /* {"de", ULMBCS_GRP_L1}, */ + {"el", ULMBCS_GRP_GR}, + /* {"en", ULMBCS_GRP_L1}, */ + /* {"es", ULMBCS_GRP_L1}, */ + /* {"et", ULMBCS_GRP_L1}, */ + /* {"fi", ULMBCS_GRP_L1}, */ + /* {"fr", ULMBCS_GRP_L1}, */ + {"he", ULMBCS_GRP_HE}, + {"hu", ULMBCS_GRP_L2}, + /* {"is", ULMBCS_GRP_L1}, */ + /* {"it", ULMBCS_GRP_L1}, */ + {"iw", ULMBCS_GRP_HE}, + {"ja", ULMBCS_GRP_JA}, + {"ko", ULMBCS_GRP_KO}, + /* {"lt", ULMBCS_GRP_L1}, */ + /* {"lv", ULMBCS_GRP_L1}, */ + {"mk", ULMBCS_GRP_RU}, + /* {"nl", ULMBCS_GRP_L1}, */ + /* {"no", ULMBCS_GRP_L1}, */ + {"pl", ULMBCS_GRP_L2}, + /* {"pt", ULMBCS_GRP_L1}, */ + {"ro", ULMBCS_GRP_L2}, + {"ru", ULMBCS_GRP_RU}, + {"sh", ULMBCS_GRP_L2}, + {"sk", ULMBCS_GRP_L2}, + {"sl", ULMBCS_GRP_L2}, + {"sq", ULMBCS_GRP_L2}, + {"sr", ULMBCS_GRP_RU}, + /* {"sv", ULMBCS_GRP_L1}, */ + {"th", ULMBCS_GRP_TH}, + {"tr", ULMBCS_GRP_TR}, + {"uk", ULMBCS_GRP_RU}, + /* {"vi", ULMBCS_GRP_L1}, */ + {"zhTW", ULMBCS_GRP_TW}, + {"zh", ULMBCS_GRP_CN}, + {NULL, ULMBCS_GRP_L1} +}; + + +static ulmbcs_byte_t +FindLMBCSLocale(const char *LocaleID) +{ + const struct _LocaleLMBCSGrpMap *pTable = LocaleLMBCSGrpMap; + + if ((!LocaleID) || (!*LocaleID)) + { + return 0; + } + + while (pTable->LocaleID) + { + if (*pTable->LocaleID == *LocaleID) /* Check only first char for speed */ + { + /* First char matches - check whole name, for entry-length */ + if (uprv_strncmp(pTable->LocaleID, LocaleID, strlen(pTable->LocaleID)) == 0) + return pTable->OptGroup; + } + else + if (*pTable->LocaleID > *LocaleID) /* Sorted alphabetically - exit */ + break; + pTable++; + } + return ULMBCS_GRP_L1; +} + + +/* + Before we get to the main body of code, here's how we hook up to the rest + of ICU. ICU converters are required to define a structure that includes + some function pointers, and some common data, in the style of a C++ + vtable. There is also room in there for converter-specific data. LMBCS + uses that converter-specific data to keep track of the 12 subconverters + we use, the optimization group, and the group (if any) that matches the + locale. We have one structure instantiated for each of the 12 possible + optimization groups. To avoid typos & to avoid boring the reader, we + put the declarations of these structures and functions into macros. To see + the definitions of these structures, see unicode\ucnv_bld.h +*/ + +typedef struct + { + UConverterSharedData *OptGrpConverter[ULMBCS_GRP_LAST+1]; /* Converter per Opt. grp. */ + uint8_t OptGroup; /* default Opt. grp. for this LMBCS session */ + uint8_t localeConverterIndex; /* reasonable locale match for index */ + } +UConverterDataLMBCS; + +U_CDECL_BEGIN +static void U_CALLCONV _LMBCSClose(UConverter * _this); +U_CDECL_END + +#define DECLARE_LMBCS_DATA(n) \ +static const UConverterImpl _LMBCSImpl##n={\ + UCNV_LMBCS_##n,\ + NULL,NULL,\ + _LMBCSOpen##n,\ + _LMBCSClose,\ + NULL,\ + _LMBCSToUnicodeWithOffsets,\ + _LMBCSToUnicodeWithOffsets,\ + _LMBCSFromUnicode,\ + _LMBCSFromUnicode,\ + NULL,\ + NULL,\ + NULL,\ + NULL,\ + _LMBCSSafeClone,\ + ucnv_getCompleteUnicodeSet,\ + NULL,\ + NULL\ +};\ +static const UConverterStaticData _LMBCSStaticData##n={\ + sizeof(UConverterStaticData),\ + "LMBCS-" #n,\ + 0, UCNV_IBM, UCNV_LMBCS_##n, 1, 3,\ + { 0x3f, 0, 0, 0 },1,FALSE,FALSE,0,0,{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0} \ +};\ +const UConverterSharedData _LMBCSData##n= \ + UCNV_IMMUTABLE_SHARED_DATA_INITIALIZER(&_LMBCSStaticData##n, &_LMBCSImpl##n); + + /* The only function we needed to duplicate 12 times was the 'open' +function, which will do basically the same thing except set a different +optimization group. So, we put the common stuff into a worker function, +and set up another macro to stamp out the 12 open functions:*/ +#define DEFINE_LMBCS_OPEN(n) \ +static void U_CALLCONV \ + _LMBCSOpen##n(UConverter* _this, UConverterLoadArgs* pArgs, UErrorCode* err) \ +{ _LMBCSOpenWorker(_this, pArgs, err, n); } + + + +/* Here's the open worker & the common close function */ +static void +_LMBCSOpenWorker(UConverter* _this, + UConverterLoadArgs *pArgs, + UErrorCode* err, + ulmbcs_byte_t OptGroup) +{ + UConverterDataLMBCS * extraInfo = (UConverterDataLMBCS*)uprv_malloc (sizeof (UConverterDataLMBCS)); + _this->extraInfo = extraInfo; + if(extraInfo != NULL) + { + UConverterNamePieces stackPieces; + UConverterLoadArgs stackArgs= UCNV_LOAD_ARGS_INITIALIZER; + ulmbcs_byte_t i; + + uprv_memset(extraInfo, 0, sizeof(UConverterDataLMBCS)); + + stackArgs.onlyTestIsLoadable = pArgs->onlyTestIsLoadable; + + for (i=0; i <= ULMBCS_GRP_LAST && U_SUCCESS(*err); i++) + { + if(OptGroupByteToCPName[i] != NULL) { + extraInfo->OptGrpConverter[i] = ucnv_loadSharedData(OptGroupByteToCPName[i], &stackPieces, &stackArgs, err); + } + } + + if(U_FAILURE(*err) || pArgs->onlyTestIsLoadable) { + _LMBCSClose(_this); + return; + } + extraInfo->OptGroup = OptGroup; + extraInfo->localeConverterIndex = FindLMBCSLocale(pArgs->locale); + } + else + { + *err = U_MEMORY_ALLOCATION_ERROR; + } +} + +U_CDECL_BEGIN +static void U_CALLCONV +_LMBCSClose(UConverter * _this) +{ + if (_this->extraInfo != NULL) + { + ulmbcs_byte_t Ix; + UConverterDataLMBCS * extraInfo = (UConverterDataLMBCS *) _this->extraInfo; + + for (Ix=0; Ix <= ULMBCS_GRP_LAST; Ix++) + { + if (extraInfo->OptGrpConverter[Ix] != NULL) + ucnv_unloadSharedDataIfReady(extraInfo->OptGrpConverter[Ix]); + } + if (!_this->isExtraLocal) { + uprv_free (_this->extraInfo); + _this->extraInfo = NULL; + } + } +} + +typedef struct LMBCSClone { + UConverter cnv; + UConverterDataLMBCS lmbcs; +} LMBCSClone; + +static UConverter * U_CALLCONV +_LMBCSSafeClone(const UConverter *cnv, + void *stackBuffer, + int32_t *pBufferSize, + UErrorCode *status) { + (void)status; + LMBCSClone *newLMBCS; + UConverterDataLMBCS *extraInfo; + int32_t i; + + if(*pBufferSize<=0) { + *pBufferSize=(int32_t)sizeof(LMBCSClone); + return NULL; + } + + extraInfo=(UConverterDataLMBCS *)cnv->extraInfo; + newLMBCS=(LMBCSClone *)stackBuffer; + + /* ucnv.c/ucnv_safeClone() copied the main UConverter already */ + + uprv_memcpy(&newLMBCS->lmbcs, extraInfo, sizeof(UConverterDataLMBCS)); + + /* share the subconverters */ + for(i = 0; i <= ULMBCS_GRP_LAST; ++i) { + if(extraInfo->OptGrpConverter[i] != NULL) { + ucnv_incrementRefCount(extraInfo->OptGrpConverter[i]); + } + } + + newLMBCS->cnv.extraInfo = &newLMBCS->lmbcs; + newLMBCS->cnv.isExtraLocal = TRUE; + return &newLMBCS->cnv; +} + +/* + * There used to be a _LMBCSGetUnicodeSet() function here (up to svn revision 20117) + * which added all code points except for U+F6xx + * because those cannot be represented in the Unicode group. + * However, it turns out that windows-950 has roundtrips for all of U+F6xx + * which means that LMBCS can convert all Unicode code points after all. + * We now simply use ucnv_getCompleteUnicodeSet(). + * + * This may need to be looked at again as Lotus uses _LMBCSGetUnicodeSet(). (091216) + */ + +/* + Here's the basic helper function that we use when converting from + Unicode to LMBCS, and we suspect that a Unicode character will fit into + one of the 12 groups. The return value is the number of bytes written + starting at pStartLMBCS (if any). +*/ + +static size_t +LMBCSConversionWorker ( + UConverterDataLMBCS * extraInfo, /* subconverters, opt & locale groups */ + ulmbcs_byte_t group, /* The group to try */ + ulmbcs_byte_t * pStartLMBCS, /* where to put the results */ + UChar * pUniChar, /* The input unicode character */ + ulmbcs_byte_t * lastConverterIndex, /* output: track last successful group used */ + UBool * groups_tried /* output: track any unsuccessful groups */ +) +{ + ulmbcs_byte_t * pLMBCS = pStartLMBCS; + UConverterSharedData * xcnv = extraInfo->OptGrpConverter[group]; + + int bytesConverted; + uint32_t value; + ulmbcs_byte_t firstByte; + + U_ASSERT(xcnv); + U_ASSERT(group 0) { + firstByte = (ulmbcs_byte_t)(value >> ((bytesConverted - 1) * 8)); + } else { + /* most common failure mode is an unassigned character */ + groups_tried[group] = TRUE; + return 0; + } + + *lastConverterIndex = group; + + /* All initial byte values in lower ascii range should have been caught by now, + except with the exception group. + */ + U_ASSERT((firstByte <= ULMBCS_C0END) || (firstByte >= ULMBCS_C1START) || (group == ULMBCS_GRP_EXCEPT)); + + /* use converted data: first write 0, 1 or two group bytes */ + if (group != ULMBCS_GRP_EXCEPT && extraInfo->OptGroup != group) + { + *pLMBCS++ = group; + if (bytesConverted == 1 && group >= ULMBCS_DOUBLEOPTGROUP_START) + { + *pLMBCS++ = group; + } + } + + /* don't emit control chars */ + if ( bytesConverted == 1 && firstByte < 0x20 ) + return 0; + + + /* then move over the converted data */ + switch(bytesConverted) + { + case 4: + *pLMBCS++ = (ulmbcs_byte_t)(value >> 24); + U_FALLTHROUGH; + case 3: + *pLMBCS++ = (ulmbcs_byte_t)(value >> 16); + U_FALLTHROUGH; + case 2: + *pLMBCS++ = (ulmbcs_byte_t)(value >> 8); + U_FALLTHROUGH; + case 1: + *pLMBCS++ = (ulmbcs_byte_t)value; + U_FALLTHROUGH; + default: + /* will never occur */ + break; + } + + return (pLMBCS - pStartLMBCS); +} + + +/* This is a much simpler version of above, when we +know we are writing LMBCS using the Unicode group +*/ +static size_t +LMBCSConvertUni(ulmbcs_byte_t * pLMBCS, UChar uniChar) +{ + /* encode into LMBCS Unicode range */ + uint8_t LowCh = (uint8_t)(uniChar & 0x00FF); + uint8_t HighCh = (uint8_t)(uniChar >> 8); + + *pLMBCS++ = ULMBCS_GRP_UNICODE; + + if (LowCh == 0) + { + *pLMBCS++ = ULMBCS_UNICOMPATZERO; + *pLMBCS++ = HighCh; + } + else + { + *pLMBCS++ = HighCh; + *pLMBCS++ = LowCh; + } + return ULMBCS_UNICODE_SIZE; +} + + + +/* The main Unicode to LMBCS conversion function */ +static void U_CALLCONV +_LMBCSFromUnicode(UConverterFromUnicodeArgs* args, + UErrorCode* err) +{ + ulmbcs_byte_t lastConverterIndex = 0; + UChar uniChar; + ulmbcs_byte_t LMBCS[ULMBCS_CHARSIZE_MAX]; + ulmbcs_byte_t * pLMBCS; + int32_t bytes_written; + UBool groups_tried[ULMBCS_GRP_LAST+1]; + UConverterDataLMBCS * extraInfo = (UConverterDataLMBCS *) args->converter->extraInfo; + int sourceIndex = 0; + + /* Basic strategy: attempt to fill in local LMBCS 1-char buffer.(LMBCS) + If that succeeds, see if it will all fit into the target & copy it over + if it does. + + We try conversions in the following order: + + 1. Single-byte ascii & special fixed control chars (&null) + 2. Look up group in table & try that (could be + A) Unicode group + B) control group, + C) national encoding, + or ambiguous SBCS or MBCS group (on to step 4...) + + 3. If its ambiguous, try this order: + A) The optimization group + B) The locale group + C) The last group that succeeded with this string. + D) every other group that's relevent (single or double) + E) If its single-byte ambiguous, try the exceptions group + + 4. And as a grand fallback: Unicode + */ + + /*Fix for SPR#DJOE66JFN3 (Lotus)*/ + ulmbcs_byte_t OldConverterIndex = 0; + + while (args->source < args->sourceLimit && !U_FAILURE(*err)) + { + /*Fix for SPR#DJOE66JFN3 (Lotus)*/ + OldConverterIndex = extraInfo->localeConverterIndex; + + if (args->target >= args->targetLimit) + { + *err = U_BUFFER_OVERFLOW_ERROR; + break; + } + uniChar = *(args->source); + bytes_written = 0; + pLMBCS = LMBCS; + + /* check cases in rough order of how common they are, for speed */ + + /* single byte matches: strategy 1 */ + /*Fix for SPR#DJOE66JFN3 (Lotus)*/ + if((uniChar>=0x80) && (uniChar<=0xff) + /*Fix for SPR#JUYA6XAERU and TSAO7GL5NK (Lotus)*/ &&(uniChar!=0xB1) &&(uniChar!=0xD7) &&(uniChar!=0xF7) + &&(uniChar!=0xB0) &&(uniChar!=0xB4) &&(uniChar!=0xB6) &&(uniChar!=0xA7) &&(uniChar!=0xA8)) + { + extraInfo->localeConverterIndex = ULMBCS_GRP_L1; + } + if (((uniChar > ULMBCS_C0END) && (uniChar < ULMBCS_C1START)) || + uniChar == 0 || uniChar == ULMBCS_HT || uniChar == ULMBCS_CR || + uniChar == ULMBCS_LF || uniChar == ULMBCS_123SYSTEMRANGE + ) + { + *pLMBCS++ = (ulmbcs_byte_t ) uniChar; + bytes_written = 1; + } + + + if (!bytes_written) + { + /* Check by UNICODE range (Strategy 2) */ + ulmbcs_byte_t group = FindLMBCSUniRange(uniChar); + + if (group == ULMBCS_GRP_UNICODE) /* (Strategy 2A) */ + { + pLMBCS += LMBCSConvertUni(pLMBCS,uniChar); + + bytes_written = (int32_t)(pLMBCS - LMBCS); + } + else if (group == ULMBCS_GRP_CTRL) /* (Strategy 2B) */ + { + /* Handle control characters here */ + if (uniChar <= ULMBCS_C0END) + { + *pLMBCS++ = ULMBCS_GRP_CTRL; + *pLMBCS++ = (ulmbcs_byte_t)(ULMBCS_CTRLOFFSET + uniChar); + } + else if (uniChar >= ULMBCS_C1START && uniChar <= ULMBCS_C1START + ULMBCS_CTRLOFFSET) + { + *pLMBCS++ = ULMBCS_GRP_CTRL; + *pLMBCS++ = (ulmbcs_byte_t ) (uniChar & 0x00FF); + } + bytes_written = (int32_t)(pLMBCS - LMBCS); + } + else if (group < ULMBCS_GRP_UNICODE) /* (Strategy 2C) */ + { + /* a specific converter has been identified - use it */ + bytes_written = (int32_t)LMBCSConversionWorker ( + extraInfo, group, pLMBCS, &uniChar, + &lastConverterIndex, groups_tried); + } + if (!bytes_written) /* the ambiguous group cases (Strategy 3) */ + { + uprv_memset(groups_tried, 0, sizeof(groups_tried)); + + /* check for non-default optimization group (Strategy 3A )*/ + if ((extraInfo->OptGroup != 1) && (ULMBCS_AMBIGUOUS_MATCH(group, extraInfo->OptGroup))) + { + /*zhujin: upgrade, merge #39299 here (Lotus) */ + /*To make R5 compatible translation, look for exceptional group first for non-DBCS*/ + + if(extraInfo->localeConverterIndex < ULMBCS_DOUBLEOPTGROUP_START) + { + bytes_written = (int32_t)LMBCSConversionWorker (extraInfo, + ULMBCS_GRP_L1, pLMBCS, &uniChar, + &lastConverterIndex, groups_tried); + + if(!bytes_written) + { + bytes_written = (int32_t)LMBCSConversionWorker (extraInfo, + ULMBCS_GRP_EXCEPT, pLMBCS, &uniChar, + &lastConverterIndex, groups_tried); + } + if(!bytes_written) + { + bytes_written = (int32_t)LMBCSConversionWorker (extraInfo, + extraInfo->localeConverterIndex, pLMBCS, &uniChar, + &lastConverterIndex, groups_tried); + } + } + else + { + bytes_written = (int32_t)LMBCSConversionWorker (extraInfo, + extraInfo->localeConverterIndex, pLMBCS, &uniChar, + &lastConverterIndex, groups_tried); + } + } + /* check for locale optimization group (Strategy 3B) */ + if (!bytes_written && (extraInfo->localeConverterIndex) && (ULMBCS_AMBIGUOUS_MATCH(group, extraInfo->localeConverterIndex))) + { + bytes_written = (int32_t)LMBCSConversionWorker (extraInfo, + extraInfo->localeConverterIndex, pLMBCS, &uniChar, &lastConverterIndex, groups_tried); + } + /* check for last optimization group used for this string (Strategy 3C) */ + if (!bytes_written && (lastConverterIndex) && (ULMBCS_AMBIGUOUS_MATCH(group, lastConverterIndex))) + { + bytes_written = (int32_t)LMBCSConversionWorker (extraInfo, + lastConverterIndex, pLMBCS, &uniChar, &lastConverterIndex, groups_tried); + } + if (!bytes_written) + { + /* just check every possible matching converter (Strategy 3D) */ + ulmbcs_byte_t grp_start; + ulmbcs_byte_t grp_end; + ulmbcs_byte_t grp_ix; + grp_start = (ulmbcs_byte_t)((group == ULMBCS_AMBIGUOUS_MBCS) + ? ULMBCS_DOUBLEOPTGROUP_START + : ULMBCS_GRP_L1); + grp_end = (ulmbcs_byte_t)((group == ULMBCS_AMBIGUOUS_MBCS) + ? ULMBCS_GRP_LAST + : ULMBCS_GRP_TH); + if(group == ULMBCS_AMBIGUOUS_ALL) + { + grp_start = ULMBCS_GRP_L1; + grp_end = ULMBCS_GRP_LAST; + } + for (grp_ix = grp_start; + grp_ix <= grp_end && !bytes_written; + grp_ix++) + { + if (extraInfo->OptGrpConverter [grp_ix] && !groups_tried [grp_ix]) + { + bytes_written = (int32_t)LMBCSConversionWorker (extraInfo, + grp_ix, pLMBCS, &uniChar, + &lastConverterIndex, groups_tried); + } + } + /* a final conversion fallback to the exceptions group if its likely + to be single byte (Strategy 3E) */ + if (!bytes_written && grp_start == ULMBCS_GRP_L1) + { + bytes_written = (int32_t)LMBCSConversionWorker (extraInfo, + ULMBCS_GRP_EXCEPT, pLMBCS, &uniChar, + &lastConverterIndex, groups_tried); + } + } + /* all of our other strategies failed. Fallback to Unicode. (Strategy 4)*/ + if (!bytes_written) + { + + pLMBCS += LMBCSConvertUni(pLMBCS, uniChar); + bytes_written = (int32_t)(pLMBCS - LMBCS); + } + } + } + + /* we have a translation. increment source and write as much as posible to target */ + args->source++; + pLMBCS = LMBCS; + while (args->target < args->targetLimit && bytes_written--) + { + *(args->target)++ = *pLMBCS++; + if (args->offsets) + { + *(args->offsets)++ = sourceIndex; + } + } + sourceIndex++; + if (bytes_written > 0) + { + /* write any bytes that didn't fit in target to the error buffer, + common code will move this to target if we get called back with + enough target room + */ + uint8_t * pErrorBuffer = args->converter->charErrorBuffer; + *err = U_BUFFER_OVERFLOW_ERROR; + args->converter->charErrorBufferLength = (int8_t)bytes_written; + while (bytes_written--) + { + *pErrorBuffer++ = *pLMBCS++; + } + } + /*Fix for SPR#DJOE66JFN3 (Lotus)*/ + extraInfo->localeConverterIndex = OldConverterIndex; + } +} + + +/* Now, the Unicode from LMBCS section */ + + +/* A function to call when we are looking at the Unicode group byte in LMBCS */ +static UChar +GetUniFromLMBCSUni(char const ** ppLMBCSin) /* Called with LMBCS-style Unicode byte stream */ +{ + uint8_t HighCh = *(*ppLMBCSin)++; /* Big-endian Unicode in LMBCS compatibility group*/ + uint8_t LowCh = *(*ppLMBCSin)++; + + if (HighCh == ULMBCS_UNICOMPATZERO ) + { + HighCh = LowCh; + LowCh = 0; /* zero-byte in LSB special character */ + } + return (UChar)((HighCh << 8) | LowCh); +} + + + +/* CHECK_SOURCE_LIMIT: Helper macro to verify that there are at least'index' + bytes left in source up to sourceLimit.Errors appropriately if not. + If we reach the limit, then update the source pointer to there to consume + all input as required by ICU converter semantics. +*/ + +#define CHECK_SOURCE_LIMIT(index) \ + if (args->source+index > args->sourceLimit){\ + *err = U_TRUNCATED_CHAR_FOUND;\ + args->source = args->sourceLimit;\ + return 0xffff;} + +/* Return the Unicode representation for the current LMBCS character */ + +static UChar32 U_CALLCONV +_LMBCSGetNextUCharWorker(UConverterToUnicodeArgs* args, + UErrorCode* err) +{ + UChar32 uniChar = 0; /* an output UNICODE char */ + ulmbcs_byte_t CurByte; /* A byte from the input stream */ + + /* error check */ + if (args->source >= args->sourceLimit) + { + *err = U_ILLEGAL_ARGUMENT_ERROR; + return 0xffff; + } + /* Grab first byte & save address for error recovery */ + CurByte = *((ulmbcs_byte_t *) (args->source++)); + + /* + * at entry of each if clause: + * 1. 'CurByte' points at the first byte of a LMBCS character + * 2. '*source'points to the next byte of the source stream after 'CurByte' + * + * the job of each if clause is: + * 1. set '*source' to point at the beginning of next char (nop if LMBCS char is only 1 byte) + * 2. set 'uniChar' up with the right Unicode value, or set 'err' appropriately + */ + + /* First lets check the simple fixed values. */ + + if(((CurByte > ULMBCS_C0END) && (CurByte < ULMBCS_C1START)) /* ascii range */ + || (CurByte == 0) + || CurByte == ULMBCS_HT || CurByte == ULMBCS_CR + || CurByte == ULMBCS_LF || CurByte == ULMBCS_123SYSTEMRANGE) + { + uniChar = CurByte; + } + else + { + UConverterDataLMBCS * extraInfo; + ulmbcs_byte_t group; + UConverterSharedData *cnv; + + if (CurByte == ULMBCS_GRP_CTRL) /* Control character group - no opt group update */ + { + ulmbcs_byte_t C0C1byte; + CHECK_SOURCE_LIMIT(1); + C0C1byte = *(args->source)++; + uniChar = (C0C1byte < ULMBCS_C1START) ? C0C1byte - ULMBCS_CTRLOFFSET : C0C1byte; + } + else + if (CurByte == ULMBCS_GRP_UNICODE) /* Unicode compatibility group: BigEndian UTF16 */ + { + CHECK_SOURCE_LIMIT(2); + + /* don't check for error indicators fffe/ffff below */ + return GetUniFromLMBCSUni(&(args->source)); + } + else if (CurByte <= ULMBCS_CTRLOFFSET) + { + group = CurByte; /* group byte is in the source */ + extraInfo = (UConverterDataLMBCS *) args->converter->extraInfo; + if (group > ULMBCS_GRP_LAST || (cnv = extraInfo->OptGrpConverter[group]) == NULL) + { + /* this is not a valid group byte - no converter*/ + *err = U_INVALID_CHAR_FOUND; + } + else if (group >= ULMBCS_DOUBLEOPTGROUP_START) /* double byte conversion */ + { + + CHECK_SOURCE_LIMIT(2); + + /* check for LMBCS doubled-group-byte case */ + if (*args->source == group) { + /* single byte */ + ++args->source; + uniChar = ucnv_MBCSSimpleGetNextUChar(cnv, args->source, 1, FALSE); + ++args->source; + } else { + /* double byte */ + uniChar = ucnv_MBCSSimpleGetNextUChar(cnv, args->source, 2, FALSE); + args->source += 2; + } + } + else { /* single byte conversion */ + CHECK_SOURCE_LIMIT(1); + CurByte = *(args->source)++; + + if (CurByte >= ULMBCS_C1START) + { + uniChar = _MBCS_SINGLE_SIMPLE_GET_NEXT_BMP(cnv, CurByte); + } + else + { + /* The non-optimizable oddballs where there is an explicit byte + * AND the second byte is not in the upper ascii range + */ + char bytes[2]; + + extraInfo = (UConverterDataLMBCS *) args->converter->extraInfo; + cnv = extraInfo->OptGrpConverter [ULMBCS_GRP_EXCEPT]; + + /* Lookup value must include opt group */ + bytes[0] = group; + bytes[1] = CurByte; + uniChar = ucnv_MBCSSimpleGetNextUChar(cnv, bytes, 2, FALSE); + } + } + } + else if (CurByte >= ULMBCS_C1START) /* group byte is implicit */ + { + extraInfo = (UConverterDataLMBCS *) args->converter->extraInfo; + group = extraInfo->OptGroup; + cnv = extraInfo->OptGrpConverter[group]; + if (group >= ULMBCS_DOUBLEOPTGROUP_START) /* double byte conversion */ + { + if (!ucnv_MBCSIsLeadByte(cnv, CurByte)) + { + CHECK_SOURCE_LIMIT(0); + + /* let the MBCS conversion consume CurByte again */ + uniChar = ucnv_MBCSSimpleGetNextUChar(cnv, args->source - 1, 1, FALSE); + } + else + { + CHECK_SOURCE_LIMIT(1); + /* let the MBCS conversion consume CurByte again */ + uniChar = ucnv_MBCSSimpleGetNextUChar(cnv, args->source - 1, 2, FALSE); + ++args->source; + } + } + else /* single byte conversion */ + { + uniChar = _MBCS_SINGLE_SIMPLE_GET_NEXT_BMP(cnv, CurByte); + } + } + } + return uniChar; +} + + +/* The exported function that converts lmbcs to one or more + UChars - currently UTF-16 +*/ +static void U_CALLCONV +_LMBCSToUnicodeWithOffsets(UConverterToUnicodeArgs* args, + UErrorCode* err) +{ + char LMBCS [ULMBCS_CHARSIZE_MAX]; + UChar uniChar; /* one output UNICODE char */ + const char * saveSource; /* beginning of current code point */ + const char * pStartLMBCS = args->source; /* beginning of whole string */ + const char * errSource = NULL; /* pointer to actual input in case an error occurs */ + int8_t savebytes = 0; + + /* Process from source to limit, or until error */ + while (U_SUCCESS(*err) && args->sourceLimit > args->source && args->targetLimit > args->target) + { + saveSource = args->source; /* beginning of current code point */ + + if (args->converter->toULength) /* reassemble char from previous call */ + { + const char *saveSourceLimit; + size_t size_old = args->converter->toULength; + + /* limit from source is either remainder of temp buffer, or user limit on source */ + size_t size_new_maybe_1 = sizeof(LMBCS) - size_old; + size_t size_new_maybe_2 = args->sourceLimit - args->source; + size_t size_new = (size_new_maybe_1 < size_new_maybe_2) ? size_new_maybe_1 : size_new_maybe_2; + + + uprv_memcpy(LMBCS, args->converter->toUBytes, size_old); + uprv_memcpy(LMBCS + size_old, args->source, size_new); + saveSourceLimit = args->sourceLimit; + args->source = errSource = LMBCS; + args->sourceLimit = LMBCS+size_old+size_new; + savebytes = (int8_t)(size_old+size_new); + uniChar = (UChar) _LMBCSGetNextUCharWorker(args, err); + args->source = saveSource + ((args->source - LMBCS) - size_old); + args->sourceLimit = saveSourceLimit; + + if (*err == U_TRUNCATED_CHAR_FOUND) + { + /* evil special case: source buffers so small a char spans more than 2 buffers */ + args->converter->toULength = savebytes; + uprv_memcpy(args->converter->toUBytes, LMBCS, savebytes); + args->source = args->sourceLimit; + *err = U_ZERO_ERROR; + return; + } + else + { + /* clear the partial-char marker */ + args->converter->toULength = 0; + } + } + else + { + errSource = saveSource; + uniChar = (UChar) _LMBCSGetNextUCharWorker(args, err); + savebytes = (int8_t)(args->source - saveSource); + } + if (U_SUCCESS(*err)) + { + if (uniChar < 0xfffe) + { + *(args->target)++ = uniChar; + if(args->offsets) + { + *(args->offsets)++ = (int32_t)(saveSource - pStartLMBCS); + } + } + else if (uniChar == 0xfffe) + { + *err = U_INVALID_CHAR_FOUND; + } + else /* if (uniChar == 0xffff) */ + { + *err = U_ILLEGAL_CHAR_FOUND; + } + } + } + /* if target ran out before source, return U_BUFFER_OVERFLOW_ERROR */ + if (U_SUCCESS(*err) && args->sourceLimit > args->source && args->targetLimit <= args->target) + { + *err = U_BUFFER_OVERFLOW_ERROR; + } + else if (U_FAILURE(*err)) + { + /* If character incomplete or unmappable/illegal, store it in toUBytes[] */ + args->converter->toULength = savebytes; + if (savebytes > 0) { + uprv_memcpy(args->converter->toUBytes, errSource, savebytes); + } + if (*err == U_TRUNCATED_CHAR_FOUND) { + *err = U_ZERO_ERROR; + } + } +} + +/* And now, the macroized declarations of data & functions: */ +DEFINE_LMBCS_OPEN(1) +DEFINE_LMBCS_OPEN(2) +DEFINE_LMBCS_OPEN(3) +DEFINE_LMBCS_OPEN(4) +DEFINE_LMBCS_OPEN(5) +DEFINE_LMBCS_OPEN(6) +DEFINE_LMBCS_OPEN(8) +DEFINE_LMBCS_OPEN(11) +DEFINE_LMBCS_OPEN(16) +DEFINE_LMBCS_OPEN(17) +DEFINE_LMBCS_OPEN(18) +DEFINE_LMBCS_OPEN(19) + + +DECLARE_LMBCS_DATA(1) +DECLARE_LMBCS_DATA(2) +DECLARE_LMBCS_DATA(3) +DECLARE_LMBCS_DATA(4) +DECLARE_LMBCS_DATA(5) +DECLARE_LMBCS_DATA(6) +DECLARE_LMBCS_DATA(8) +DECLARE_LMBCS_DATA(11) +DECLARE_LMBCS_DATA(16) +DECLARE_LMBCS_DATA(17) +DECLARE_LMBCS_DATA(18) +DECLARE_LMBCS_DATA(19) + +U_CDECL_END + +#endif /* #if !UCONFIG_NO_LEGACY_CONVERSION */ diff --git a/Build/source/libs/icu/icu-src/source/common/ucnv_set.c b/Build/source/libs/icu/icu-src/source/common/ucnv_set.c deleted file mode 100644 index c3933ab6109..00000000000 --- a/Build/source/libs/icu/icu-src/source/common/ucnv_set.c +++ /dev/null @@ -1,70 +0,0 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. -// License & terms of use: http://www.unicode.org/copyright.html -/* -******************************************************************************* -* -* Copyright (C) 2003-2007, International Business Machines -* Corporation and others. All Rights Reserved. -* -******************************************************************************* -* file name: ucnv_set.c -* encoding: US-ASCII -* tab size: 8 (not used) -* indentation:4 -* -* created on: 2004sep07 -* created by: Markus W. Scherer -* -* Conversion API functions using USet (ucnv_getUnicodeSet()) -* moved here from ucnv.c for removing the dependency of other ucnv_ -* implementation functions on the USet implementation. -*/ - -#include "unicode/utypes.h" -#include "unicode/uset.h" -#include "unicode/ucnv.h" -#include "ucnv_bld.h" -#include "uset_imp.h" - -#if !UCONFIG_NO_CONVERSION - -U_CAPI void U_EXPORT2 -ucnv_getUnicodeSet(const UConverter *cnv, - USet *setFillIn, - UConverterUnicodeSet whichSet, - UErrorCode *pErrorCode) { - /* argument checking */ - if(pErrorCode==NULL || U_FAILURE(*pErrorCode)) { - return; - } - if(cnv==NULL || setFillIn==NULL || whichSetsharedData->impl->getUnicodeSet==NULL) { - *pErrorCode=U_UNSUPPORTED_ERROR; - return; - } - - { - USetAdder sa={ - NULL, - uset_add, - uset_addRange, - uset_addString, - uset_remove, - uset_removeRange - }; - sa.set=setFillIn; - - /* empty the set */ - uset_clear(setFillIn); - - /* call the converter to add the code points it supports */ - cnv->sharedData->impl->getUnicodeSet(cnv, &sa, whichSet, pErrorCode); - } -} - -#endif diff --git a/Build/source/libs/icu/icu-src/source/common/ucnv_set.cpp b/Build/source/libs/icu/icu-src/source/common/ucnv_set.cpp new file mode 100644 index 00000000000..926cee0de81 --- /dev/null +++ b/Build/source/libs/icu/icu-src/source/common/ucnv_set.cpp @@ -0,0 +1,70 @@ +// © 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html +/* +******************************************************************************* +* +* Copyright (C) 2003-2007, International Business Machines +* Corporation and others. All Rights Reserved. +* +******************************************************************************* +* file name: ucnv_set.c +* encoding: UTF-8 +* tab size: 8 (not used) +* indentation:4 +* +* created on: 2004sep07 +* created by: Markus W. Scherer +* +* Conversion API functions using USet (ucnv_getUnicodeSet()) +* moved here from ucnv.c for removing the dependency of other ucnv_ +* implementation functions on the USet implementation. +*/ + +#include "unicode/utypes.h" +#include "unicode/uset.h" +#include "unicode/ucnv.h" +#include "ucnv_bld.h" +#include "uset_imp.h" + +#if !UCONFIG_NO_CONVERSION + +U_CAPI void U_EXPORT2 +ucnv_getUnicodeSet(const UConverter *cnv, + USet *setFillIn, + UConverterUnicodeSet whichSet, + UErrorCode *pErrorCode) { + /* argument checking */ + if(pErrorCode==NULL || U_FAILURE(*pErrorCode)) { + return; + } + if(cnv==NULL || setFillIn==NULL || whichSetsharedData->impl->getUnicodeSet==NULL) { + *pErrorCode=U_UNSUPPORTED_ERROR; + return; + } + + { + USetAdder sa={ + NULL, + uset_add, + uset_addRange, + uset_addString, + uset_remove, + uset_removeRange + }; + sa.set=setFillIn; + + /* empty the set */ + uset_clear(setFillIn); + + /* call the converter to add the code points it supports */ + cnv->sharedData->impl->getUnicodeSet(cnv, &sa, whichSet, pErrorCode); + } +} + +#endif diff --git a/Build/source/libs/icu/icu-src/source/common/ucnv_u16.c b/Build/source/libs/icu/icu-src/source/common/ucnv_u16.c deleted file mode 100644 index 1458a8a4b32..00000000000 --- a/Build/source/libs/icu/icu-src/source/common/ucnv_u16.c +++ /dev/null @@ -1,1563 +0,0 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. -// License & terms of use: http://www.unicode.org/copyright.html -/* -********************************************************************** -* Copyright (C) 2002-2015, International Business Machines -* Corporation and others. All Rights Reserved. -********************************************************************** -* file name: ucnv_u16.c -* encoding: US-ASCII -* tab size: 8 (not used) -* indentation:4 -* -* created on: 2002jul01 -* created by: Markus W. Scherer -* -* UTF-16 converter implementation. Used to be in ucnv_utf.c. -*/ - -#include "unicode/utypes.h" - -#if !UCONFIG_NO_CONVERSION - -#include "unicode/ucnv.h" -#include "ucnv_bld.h" -#include "ucnv_cnv.h" -#include "cmemory.h" - -enum { - UCNV_NEED_TO_WRITE_BOM=1 -}; - -/* - * The UTF-16 toUnicode implementation is also used for the Java-specific - * "with BOM" variants of UTF-16BE and UTF-16LE. - */ -static void -_UTF16ToUnicodeWithOffsets(UConverterToUnicodeArgs *pArgs, - UErrorCode *pErrorCode); - -/* UTF-16BE ----------------------------------------------------------------- */ - -#if U_IS_BIG_ENDIAN -# define _UTF16PEFromUnicodeWithOffsets _UTF16BEFromUnicodeWithOffsets -#else -# define _UTF16PEFromUnicodeWithOffsets _UTF16LEFromUnicodeWithOffsets -#endif - - -static void -_UTF16BEFromUnicodeWithOffsets(UConverterFromUnicodeArgs *pArgs, - UErrorCode *pErrorCode) { - UConverter *cnv; - const UChar *source; - char *target; - int32_t *offsets; - - uint32_t targetCapacity, length, sourceIndex; - UChar c, trail; - char overflow[4]; - - source=pArgs->source; - length=(int32_t)(pArgs->sourceLimit-source); - if(length<=0) { - /* no input, nothing to do */ - return; - } - - cnv=pArgs->converter; - - /* write the BOM if necessary */ - if(cnv->fromUnicodeStatus==UCNV_NEED_TO_WRITE_BOM) { - static const char bom[]={ (char)0xfe, (char)0xff }; - ucnv_fromUWriteBytes(cnv, - bom, 2, - &pArgs->target, pArgs->targetLimit, - &pArgs->offsets, -1, - pErrorCode); - cnv->fromUnicodeStatus=0; - } - - target=pArgs->target; - if(target >= pArgs->targetLimit) { - *pErrorCode=U_BUFFER_OVERFLOW_ERROR; - return; - } - - targetCapacity=(uint32_t)(pArgs->targetLimit-target); - offsets=pArgs->offsets; - sourceIndex=0; - - /* c!=0 indicates in several places outside the main loops that a surrogate was found */ - - if((c=(UChar)cnv->fromUChar32)!=0 && U16_IS_TRAIL(trail=*source) && targetCapacity>=4) { - /* the last buffer ended with a lead surrogate, output the surrogate pair */ - ++source; - --length; - target[0]=(uint8_t)(c>>8); - target[1]=(uint8_t)c; - target[2]=(uint8_t)(trail>>8); - target[3]=(uint8_t)trail; - target+=4; - targetCapacity-=4; - if(offsets!=NULL) { - *offsets++=-1; - *offsets++=-1; - *offsets++=-1; - *offsets++=-1; - } - sourceIndex=1; - cnv->fromUChar32=c=0; - } - - if(c==0) { - /* copy an even number of bytes for complete UChars */ - uint32_t count=2*length; - if(count>targetCapacity) { - count=targetCapacity&~1; - } - /* count is even */ - targetCapacity-=count; - count>>=1; - length-=count; - - if(offsets==NULL) { - while(count>0) { - c=*source++; - if(U16_IS_SINGLE(c)) { - target[0]=(uint8_t)(c>>8); - target[1]=(uint8_t)c; - target+=2; - } else if(U16_IS_SURROGATE_LEAD(c) && count>=2 && U16_IS_TRAIL(trail=*source)) { - ++source; - --count; - target[0]=(uint8_t)(c>>8); - target[1]=(uint8_t)c; - target[2]=(uint8_t)(trail>>8); - target[3]=(uint8_t)trail; - target+=4; - } else { - break; - } - --count; - } - } else { - while(count>0) { - c=*source++; - if(U16_IS_SINGLE(c)) { - target[0]=(uint8_t)(c>>8); - target[1]=(uint8_t)c; - target+=2; - *offsets++=sourceIndex; - *offsets++=sourceIndex++; - } else if(U16_IS_SURROGATE_LEAD(c) && count>=2 && U16_IS_TRAIL(trail=*source)) { - ++source; - --count; - target[0]=(uint8_t)(c>>8); - target[1]=(uint8_t)c; - target[2]=(uint8_t)(trail>>8); - target[3]=(uint8_t)trail; - target+=4; - *offsets++=sourceIndex; - *offsets++=sourceIndex; - *offsets++=sourceIndex; - *offsets++=sourceIndex; - sourceIndex+=2; - } else { - break; - } - --count; - } - } - - if(count==0) { - /* done with the loop for complete UChars */ - if(length>0 && targetCapacity>0) { - /* - * there is more input and some target capacity - - * it must be targetCapacity==1 because otherwise - * the above would have copied more; - * prepare for overflow output - */ - if(U16_IS_SINGLE(c=*source++)) { - overflow[0]=(char)(c>>8); - overflow[1]=(char)c; - length=2; /* 2 bytes to output */ - c=0; - /* } else { keep c for surrogate handling, length will be set there */ - } - } else { - length=0; - c=0; - } - } else { - /* keep c for surrogate handling, length will be set there */ - targetCapacity+=2*count; - } - } else { - length=0; /* from here on, length counts the bytes in overflow[] */ - } - - if(c!=0) { - /* - * c is a surrogate, and - * - source or target too short - * - or the surrogate is unmatched - */ - length=0; - if(U16_IS_SURROGATE_LEAD(c)) { - if(sourcesourceLimit) { - if(U16_IS_TRAIL(trail=*source)) { - /* output the surrogate pair, will overflow (see conditions comment above) */ - ++source; - overflow[0]=(char)(c>>8); - overflow[1]=(char)c; - overflow[2]=(char)(trail>>8); - overflow[3]=(char)trail; - length=4; /* 4 bytes to output */ - c=0; - } else { - /* unmatched lead surrogate */ - *pErrorCode=U_ILLEGAL_CHAR_FOUND; - } - } else { - /* see if the trail surrogate is in the next buffer */ - } - } else { - /* unmatched trail surrogate */ - *pErrorCode=U_ILLEGAL_CHAR_FOUND; - } - cnv->fromUChar32=c; - } - - if(length>0) { - /* output length bytes with overflow (length>targetCapacity>0) */ - ucnv_fromUWriteBytes(cnv, - overflow, length, - (char **)&target, pArgs->targetLimit, - &offsets, sourceIndex, - pErrorCode); - targetCapacity=(uint32_t)(pArgs->targetLimit-(char *)target); - } - - if(U_SUCCESS(*pErrorCode) && sourcesourceLimit && targetCapacity==0) { - *pErrorCode=U_BUFFER_OVERFLOW_ERROR; - } - - /* write back the updated pointers */ - pArgs->source=source; - pArgs->target=(char *)target; - pArgs->offsets=offsets; -} - -static void -_UTF16BEToUnicodeWithOffsets(UConverterToUnicodeArgs *pArgs, - UErrorCode *pErrorCode) { - UConverter *cnv; - const uint8_t *source; - UChar *target; - int32_t *offsets; - - uint32_t targetCapacity, length, count, sourceIndex; - UChar c, trail; - - if(pArgs->converter->mode<8) { - _UTF16ToUnicodeWithOffsets(pArgs, pErrorCode); - return; - } - - cnv=pArgs->converter; - source=(const uint8_t *)pArgs->source; - length=(int32_t)((const uint8_t *)pArgs->sourceLimit-source); - if(length<=0 && cnv->toUnicodeStatus==0) { - /* no input, nothing to do */ - return; - } - - target=pArgs->target; - if(target >= pArgs->targetLimit) { - *pErrorCode=U_BUFFER_OVERFLOW_ERROR; - return; - } - - targetCapacity=(uint32_t)(pArgs->targetLimit-target); - offsets=pArgs->offsets; - sourceIndex=0; - c=0; - - /* complete a partial UChar or pair from the last call */ - if(cnv->toUnicodeStatus!=0) { - /* - * special case: single byte from a previous buffer, - * where the byte turned out not to belong to a trail surrogate - * and the preceding, unmatched lead surrogate was put into toUBytes[] - * for error handling - */ - cnv->toUBytes[0]=(uint8_t)cnv->toUnicodeStatus; - cnv->toULength=1; - cnv->toUnicodeStatus=0; - } - if((count=cnv->toULength)!=0) { - uint8_t *p=cnv->toUBytes; - do { - p[count++]=*source++; - ++sourceIndex; - --length; - if(count==2) { - c=((UChar)p[0]<<8)|p[1]; - if(U16_IS_SINGLE(c)) { - /* output the BMP code point */ - *target++=c; - if(offsets!=NULL) { - *offsets++=-1; - } - --targetCapacity; - count=0; - c=0; - break; - } else if(U16_IS_SURROGATE_LEAD(c)) { - /* continue collecting bytes for the trail surrogate */ - c=0; /* avoid unnecessary surrogate handling below */ - } else { - /* fall through to error handling for an unmatched trail surrogate */ - break; - } - } else if(count==4) { - c=((UChar)p[0]<<8)|p[1]; - trail=((UChar)p[2]<<8)|p[3]; - if(U16_IS_TRAIL(trail)) { - /* output the surrogate pair */ - *target++=c; - if(targetCapacity>=2) { - *target++=trail; - if(offsets!=NULL) { - *offsets++=-1; - *offsets++=-1; - } - targetCapacity-=2; - } else /* targetCapacity==1 */ { - targetCapacity=0; - cnv->UCharErrorBuffer[0]=trail; - cnv->UCharErrorBufferLength=1; - *pErrorCode=U_BUFFER_OVERFLOW_ERROR; - } - count=0; - c=0; - break; - } else { - /* unmatched lead surrogate, handle here for consistent toUBytes[] */ - *pErrorCode=U_ILLEGAL_CHAR_FOUND; - - /* back out reading the code unit after it */ - if(((const uint8_t *)pArgs->source-source)>=2) { - source-=2; - } else { - /* - * if the trail unit's first byte was in a previous buffer, then - * we need to put it into a special place because toUBytes[] will be - * used for the lead unit's bytes - */ - cnv->toUnicodeStatus=0x100|p[2]; - --source; - } - cnv->toULength=2; - - /* write back the updated pointers */ - pArgs->source=(const char *)source; - pArgs->target=target; - pArgs->offsets=offsets; - return; - } - } - } while(length>0); - cnv->toULength=(int8_t)count; - } - - /* copy an even number of bytes for complete UChars */ - count=2*targetCapacity; - if(count>length) { - count=length&~1; - } - if(c==0 && count>0) { - length-=count; - count>>=1; - targetCapacity-=count; - if(offsets==NULL) { - do { - c=((UChar)source[0]<<8)|source[1]; - source+=2; - if(U16_IS_SINGLE(c)) { - *target++=c; - } else if(U16_IS_SURROGATE_LEAD(c) && count>=2 && - U16_IS_TRAIL(trail=((UChar)source[0]<<8)|source[1]) - ) { - source+=2; - --count; - *target++=c; - *target++=trail; - } else { - break; - } - } while(--count>0); - } else { - do { - c=((UChar)source[0]<<8)|source[1]; - source+=2; - if(U16_IS_SINGLE(c)) { - *target++=c; - *offsets++=sourceIndex; - sourceIndex+=2; - } else if(U16_IS_SURROGATE_LEAD(c) && count>=2 && - U16_IS_TRAIL(trail=((UChar)source[0]<<8)|source[1]) - ) { - source+=2; - --count; - *target++=c; - *target++=trail; - *offsets++=sourceIndex; - *offsets++=sourceIndex; - sourceIndex+=4; - } else { - break; - } - } while(--count>0); - } - - if(count==0) { - /* done with the loop for complete UChars */ - c=0; - } else { - /* keep c for surrogate handling, trail will be set there */ - length+=2*(count-1); /* one more byte pair was consumed than count decremented */ - targetCapacity+=count; - } - } - - if(c!=0) { - /* - * c is a surrogate, and - * - source or target too short - * - or the surrogate is unmatched - */ - cnv->toUBytes[0]=(uint8_t)(c>>8); - cnv->toUBytes[1]=(uint8_t)c; - cnv->toULength=2; - - if(U16_IS_SURROGATE_LEAD(c)) { - if(length>=2) { - if(U16_IS_TRAIL(trail=((UChar)source[0]<<8)|source[1])) { - /* output the surrogate pair, will overflow (see conditions comment above) */ - source+=2; - length-=2; - *target++=c; - if(offsets!=NULL) { - *offsets++=sourceIndex; - } - cnv->UCharErrorBuffer[0]=trail; - cnv->UCharErrorBufferLength=1; - cnv->toULength=0; - *pErrorCode=U_BUFFER_OVERFLOW_ERROR; - } else { - /* unmatched lead surrogate */ - *pErrorCode=U_ILLEGAL_CHAR_FOUND; - } - } else { - /* see if the trail surrogate is in the next buffer */ - } - } else { - /* unmatched trail surrogate */ - *pErrorCode=U_ILLEGAL_CHAR_FOUND; - } - } - - if(U_SUCCESS(*pErrorCode)) { - /* check for a remaining source byte */ - if(length>0) { - if(targetCapacity==0) { - *pErrorCode=U_BUFFER_OVERFLOW_ERROR; - } else { - /* it must be length==1 because otherwise the above would have copied more */ - cnv->toUBytes[cnv->toULength++]=*source++; - } - } - } - - /* write back the updated pointers */ - pArgs->source=(const char *)source; - pArgs->target=target; - pArgs->offsets=offsets; -} - -static UChar32 -_UTF16BEGetNextUChar(UConverterToUnicodeArgs *pArgs, UErrorCode *err) { - const uint8_t *s, *sourceLimit; - UChar32 c; - - if(pArgs->converter->mode<8) { - return UCNV_GET_NEXT_UCHAR_USE_TO_U; - } - - s=(const uint8_t *)pArgs->source; - sourceLimit=(const uint8_t *)pArgs->sourceLimit; - - if(s>=sourceLimit) { - /* no input */ - *err=U_INDEX_OUTOFBOUNDS_ERROR; - return 0xffff; - } - - if(s+2>sourceLimit) { - /* only one byte: truncated UChar */ - pArgs->converter->toUBytes[0]=*s++; - pArgs->converter->toULength=1; - pArgs->source=(const char *)s; - *err = U_TRUNCATED_CHAR_FOUND; - return 0xffff; - } - - /* get one UChar */ - c=((UChar32)*s<<8)|s[1]; - s+=2; - - /* check for a surrogate pair */ - if(U_IS_SURROGATE(c)) { - if(U16_IS_SURROGATE_LEAD(c)) { - if(s+2<=sourceLimit) { - UChar trail; - - /* get a second UChar and see if it is a trail surrogate */ - trail=((UChar)*s<<8)|s[1]; - if(U16_IS_TRAIL(trail)) { - c=U16_GET_SUPPLEMENTARY(c, trail); - s+=2; - } else { - /* unmatched lead surrogate */ - c=-2; - } - } else { - /* too few (2 or 3) bytes for a surrogate pair: truncated code point */ - uint8_t *bytes=pArgs->converter->toUBytes; - s-=2; - pArgs->converter->toULength=(int8_t)(sourceLimit-s); - do { - *bytes++=*s++; - } while(sconverter->toUBytes; - pArgs->converter->toULength=2; - *bytes=*(s-2); - bytes[1]=*(s-1); - - c=0xffff; - *err=U_ILLEGAL_CHAR_FOUND; - } - } - - pArgs->source=(const char *)s; - return c; -} - -static void -_UTF16BEReset(UConverter *cnv, UConverterResetChoice choice) { - if(choice<=UCNV_RESET_TO_UNICODE) { - /* reset toUnicode state */ - if(UCNV_GET_VERSION(cnv)==0) { - cnv->mode=8; /* no BOM handling */ - } else { - cnv->mode=0; /* Java-specific "UnicodeBig" requires BE BOM or no BOM */ - } - } - if(choice!=UCNV_RESET_TO_UNICODE && UCNV_GET_VERSION(cnv)==1) { - /* reset fromUnicode for "UnicodeBig": prepare to output the UTF-16BE BOM */ - cnv->fromUnicodeStatus=UCNV_NEED_TO_WRITE_BOM; - } -} - -static void -_UTF16BEOpen(UConverter *cnv, - UConverterLoadArgs *pArgs, - UErrorCode *pErrorCode) { - if(UCNV_GET_VERSION(cnv)<=1) { - _UTF16BEReset(cnv, UCNV_RESET_BOTH); - } else { - *pErrorCode=U_ILLEGAL_ARGUMENT_ERROR; - } -} - -static const char * -_UTF16BEGetName(const UConverter *cnv) { - if(UCNV_GET_VERSION(cnv)==0) { - return "UTF-16BE"; - } else { - return "UTF-16BE,version=1"; - } -} - -static const UConverterImpl _UTF16BEImpl={ - UCNV_UTF16_BigEndian, - - NULL, - NULL, - - _UTF16BEOpen, - NULL, - _UTF16BEReset, - - _UTF16BEToUnicodeWithOffsets, - _UTF16BEToUnicodeWithOffsets, - _UTF16BEFromUnicodeWithOffsets, - _UTF16BEFromUnicodeWithOffsets, - _UTF16BEGetNextUChar, - - NULL, - _UTF16BEGetName, - NULL, - NULL, - ucnv_getNonSurrogateUnicodeSet, - - NULL, - NULL -}; - -static const UConverterStaticData _UTF16BEStaticData={ - sizeof(UConverterStaticData), - "UTF-16BE", - 1200, UCNV_IBM, UCNV_UTF16_BigEndian, 2, 2, - { 0xff, 0xfd, 0, 0 },2,FALSE,FALSE, - 0, - 0, - { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 } /* reserved */ -}; - - -const UConverterSharedData _UTF16BEData= - UCNV_IMMUTABLE_SHARED_DATA_INITIALIZER(&_UTF16BEStaticData, &_UTF16BEImpl); - -/* UTF-16LE ----------------------------------------------------------------- */ - -static void -_UTF16LEFromUnicodeWithOffsets(UConverterFromUnicodeArgs *pArgs, - UErrorCode *pErrorCode) { - UConverter *cnv; - const UChar *source; - char *target; - int32_t *offsets; - - uint32_t targetCapacity, length, sourceIndex; - UChar c, trail; - char overflow[4]; - - source=pArgs->source; - length=(int32_t)(pArgs->sourceLimit-source); - if(length<=0) { - /* no input, nothing to do */ - return; - } - - cnv=pArgs->converter; - - /* write the BOM if necessary */ - if(cnv->fromUnicodeStatus==UCNV_NEED_TO_WRITE_BOM) { - static const char bom[]={ (char)0xff, (char)0xfe }; - ucnv_fromUWriteBytes(cnv, - bom, 2, - &pArgs->target, pArgs->targetLimit, - &pArgs->offsets, -1, - pErrorCode); - cnv->fromUnicodeStatus=0; - } - - target=pArgs->target; - if(target >= pArgs->targetLimit) { - *pErrorCode=U_BUFFER_OVERFLOW_ERROR; - return; - } - - targetCapacity=(uint32_t)(pArgs->targetLimit-pArgs->target); - offsets=pArgs->offsets; - sourceIndex=0; - - /* c!=0 indicates in several places outside the main loops that a surrogate was found */ - - if((c=(UChar)cnv->fromUChar32)!=0 && U16_IS_TRAIL(trail=*source) && targetCapacity>=4) { - /* the last buffer ended with a lead surrogate, output the surrogate pair */ - ++source; - --length; - target[0]=(uint8_t)c; - target[1]=(uint8_t)(c>>8); - target[2]=(uint8_t)trail; - target[3]=(uint8_t)(trail>>8); - target+=4; - targetCapacity-=4; - if(offsets!=NULL) { - *offsets++=-1; - *offsets++=-1; - *offsets++=-1; - *offsets++=-1; - } - sourceIndex=1; - cnv->fromUChar32=c=0; - } - - if(c==0) { - /* copy an even number of bytes for complete UChars */ - uint32_t count=2*length; - if(count>targetCapacity) { - count=targetCapacity&~1; - } - /* count is even */ - targetCapacity-=count; - count>>=1; - length-=count; - - if(offsets==NULL) { - while(count>0) { - c=*source++; - if(U16_IS_SINGLE(c)) { - target[0]=(uint8_t)c; - target[1]=(uint8_t)(c>>8); - target+=2; - } else if(U16_IS_SURROGATE_LEAD(c) && count>=2 && U16_IS_TRAIL(trail=*source)) { - ++source; - --count; - target[0]=(uint8_t)c; - target[1]=(uint8_t)(c>>8); - target[2]=(uint8_t)trail; - target[3]=(uint8_t)(trail>>8); - target+=4; - } else { - break; - } - --count; - } - } else { - while(count>0) { - c=*source++; - if(U16_IS_SINGLE(c)) { - target[0]=(uint8_t)c; - target[1]=(uint8_t)(c>>8); - target+=2; - *offsets++=sourceIndex; - *offsets++=sourceIndex++; - } else if(U16_IS_SURROGATE_LEAD(c) && count>=2 && U16_IS_TRAIL(trail=*source)) { - ++source; - --count; - target[0]=(uint8_t)c; - target[1]=(uint8_t)(c>>8); - target[2]=(uint8_t)trail; - target[3]=(uint8_t)(trail>>8); - target+=4; - *offsets++=sourceIndex; - *offsets++=sourceIndex; - *offsets++=sourceIndex; - *offsets++=sourceIndex; - sourceIndex+=2; - } else { - break; - } - --count; - } - } - - if(count==0) { - /* done with the loop for complete UChars */ - if(length>0 && targetCapacity>0) { - /* - * there is more input and some target capacity - - * it must be targetCapacity==1 because otherwise - * the above would have copied more; - * prepare for overflow output - */ - if(U16_IS_SINGLE(c=*source++)) { - overflow[0]=(char)c; - overflow[1]=(char)(c>>8); - length=2; /* 2 bytes to output */ - c=0; - /* } else { keep c for surrogate handling, length will be set there */ - } - } else { - length=0; - c=0; - } - } else { - /* keep c for surrogate handling, length will be set there */ - targetCapacity+=2*count; - } - } else { - length=0; /* from here on, length counts the bytes in overflow[] */ - } - - if(c!=0) { - /* - * c is a surrogate, and - * - source or target too short - * - or the surrogate is unmatched - */ - length=0; - if(U16_IS_SURROGATE_LEAD(c)) { - if(sourcesourceLimit) { - if(U16_IS_TRAIL(trail=*source)) { - /* output the surrogate pair, will overflow (see conditions comment above) */ - ++source; - overflow[0]=(char)c; - overflow[1]=(char)(c>>8); - overflow[2]=(char)trail; - overflow[3]=(char)(trail>>8); - length=4; /* 4 bytes to output */ - c=0; - } else { - /* unmatched lead surrogate */ - *pErrorCode=U_ILLEGAL_CHAR_FOUND; - } - } else { - /* see if the trail surrogate is in the next buffer */ - } - } else { - /* unmatched trail surrogate */ - *pErrorCode=U_ILLEGAL_CHAR_FOUND; - } - cnv->fromUChar32=c; - } - - if(length>0) { - /* output length bytes with overflow (length>targetCapacity>0) */ - ucnv_fromUWriteBytes(cnv, - overflow, length, - &target, pArgs->targetLimit, - &offsets, sourceIndex, - pErrorCode); - targetCapacity=(uint32_t)(pArgs->targetLimit-(char *)target); - } - - if(U_SUCCESS(*pErrorCode) && sourcesourceLimit && targetCapacity==0) { - *pErrorCode=U_BUFFER_OVERFLOW_ERROR; - } - - /* write back the updated pointers */ - pArgs->source=source; - pArgs->target=target; - pArgs->offsets=offsets; -} - -static void -_UTF16LEToUnicodeWithOffsets(UConverterToUnicodeArgs *pArgs, - UErrorCode *pErrorCode) { - UConverter *cnv; - const uint8_t *source; - UChar *target; - int32_t *offsets; - - uint32_t targetCapacity, length, count, sourceIndex; - UChar c, trail; - - if(pArgs->converter->mode<8) { - _UTF16ToUnicodeWithOffsets(pArgs, pErrorCode); - return; - } - - cnv=pArgs->converter; - source=(const uint8_t *)pArgs->source; - length=(int32_t)((const uint8_t *)pArgs->sourceLimit-source); - if(length<=0 && cnv->toUnicodeStatus==0) { - /* no input, nothing to do */ - return; - } - - target=pArgs->target; - if(target >= pArgs->targetLimit) { - *pErrorCode=U_BUFFER_OVERFLOW_ERROR; - return; - } - - targetCapacity=(uint32_t)(pArgs->targetLimit-pArgs->target); - offsets=pArgs->offsets; - sourceIndex=0; - c=0; - - /* complete a partial UChar or pair from the last call */ - if(cnv->toUnicodeStatus!=0) { - /* - * special case: single byte from a previous buffer, - * where the byte turned out not to belong to a trail surrogate - * and the preceding, unmatched lead surrogate was put into toUBytes[] - * for error handling - */ - cnv->toUBytes[0]=(uint8_t)cnv->toUnicodeStatus; - cnv->toULength=1; - cnv->toUnicodeStatus=0; - } - if((count=cnv->toULength)!=0) { - uint8_t *p=cnv->toUBytes; - do { - p[count++]=*source++; - ++sourceIndex; - --length; - if(count==2) { - c=((UChar)p[1]<<8)|p[0]; - if(U16_IS_SINGLE(c)) { - /* output the BMP code point */ - *target++=c; - if(offsets!=NULL) { - *offsets++=-1; - } - --targetCapacity; - count=0; - c=0; - break; - } else if(U16_IS_SURROGATE_LEAD(c)) { - /* continue collecting bytes for the trail surrogate */ - c=0; /* avoid unnecessary surrogate handling below */ - } else { - /* fall through to error handling for an unmatched trail surrogate */ - break; - } - } else if(count==4) { - c=((UChar)p[1]<<8)|p[0]; - trail=((UChar)p[3]<<8)|p[2]; - if(U16_IS_TRAIL(trail)) { - /* output the surrogate pair */ - *target++=c; - if(targetCapacity>=2) { - *target++=trail; - if(offsets!=NULL) { - *offsets++=-1; - *offsets++=-1; - } - targetCapacity-=2; - } else /* targetCapacity==1 */ { - targetCapacity=0; - cnv->UCharErrorBuffer[0]=trail; - cnv->UCharErrorBufferLength=1; - *pErrorCode=U_BUFFER_OVERFLOW_ERROR; - } - count=0; - c=0; - break; - } else { - /* unmatched lead surrogate, handle here for consistent toUBytes[] */ - *pErrorCode=U_ILLEGAL_CHAR_FOUND; - - /* back out reading the code unit after it */ - if(((const uint8_t *)pArgs->source-source)>=2) { - source-=2; - } else { - /* - * if the trail unit's first byte was in a previous buffer, then - * we need to put it into a special place because toUBytes[] will be - * used for the lead unit's bytes - */ - cnv->toUnicodeStatus=0x100|p[2]; - --source; - } - cnv->toULength=2; - - /* write back the updated pointers */ - pArgs->source=(const char *)source; - pArgs->target=target; - pArgs->offsets=offsets; - return; - } - } - } while(length>0); - cnv->toULength=(int8_t)count; - } - - /* copy an even number of bytes for complete UChars */ - count=2*targetCapacity; - if(count>length) { - count=length&~1; - } - if(c==0 && count>0) { - length-=count; - count>>=1; - targetCapacity-=count; - if(offsets==NULL) { - do { - c=((UChar)source[1]<<8)|source[0]; - source+=2; - if(U16_IS_SINGLE(c)) { - *target++=c; - } else if(U16_IS_SURROGATE_LEAD(c) && count>=2 && - U16_IS_TRAIL(trail=((UChar)source[1]<<8)|source[0]) - ) { - source+=2; - --count; - *target++=c; - *target++=trail; - } else { - break; - } - } while(--count>0); - } else { - do { - c=((UChar)source[1]<<8)|source[0]; - source+=2; - if(U16_IS_SINGLE(c)) { - *target++=c; - *offsets++=sourceIndex; - sourceIndex+=2; - } else if(U16_IS_SURROGATE_LEAD(c) && count>=2 && - U16_IS_TRAIL(trail=((UChar)source[1]<<8)|source[0]) - ) { - source+=2; - --count; - *target++=c; - *target++=trail; - *offsets++=sourceIndex; - *offsets++=sourceIndex; - sourceIndex+=4; - } else { - break; - } - } while(--count>0); - } - - if(count==0) { - /* done with the loop for complete UChars */ - c=0; - } else { - /* keep c for surrogate handling, trail will be set there */ - length+=2*(count-1); /* one more byte pair was consumed than count decremented */ - targetCapacity+=count; - } - } - - if(c!=0) { - /* - * c is a surrogate, and - * - source or target too short - * - or the surrogate is unmatched - */ - cnv->toUBytes[0]=(uint8_t)c; - cnv->toUBytes[1]=(uint8_t)(c>>8); - cnv->toULength=2; - - if(U16_IS_SURROGATE_LEAD(c)) { - if(length>=2) { - if(U16_IS_TRAIL(trail=((UChar)source[1]<<8)|source[0])) { - /* output the surrogate pair, will overflow (see conditions comment above) */ - source+=2; - length-=2; - *target++=c; - if(offsets!=NULL) { - *offsets++=sourceIndex; - } - cnv->UCharErrorBuffer[0]=trail; - cnv->UCharErrorBufferLength=1; - cnv->toULength=0; - *pErrorCode=U_BUFFER_OVERFLOW_ERROR; - } else { - /* unmatched lead surrogate */ - *pErrorCode=U_ILLEGAL_CHAR_FOUND; - } - } else { - /* see if the trail surrogate is in the next buffer */ - } - } else { - /* unmatched trail surrogate */ - *pErrorCode=U_ILLEGAL_CHAR_FOUND; - } - } - - if(U_SUCCESS(*pErrorCode)) { - /* check for a remaining source byte */ - if(length>0) { - if(targetCapacity==0) { - *pErrorCode=U_BUFFER_OVERFLOW_ERROR; - } else { - /* it must be length==1 because otherwise the above would have copied more */ - cnv->toUBytes[cnv->toULength++]=*source++; - } - } - } - - /* write back the updated pointers */ - pArgs->source=(const char *)source; - pArgs->target=target; - pArgs->offsets=offsets; -} - -static UChar32 -_UTF16LEGetNextUChar(UConverterToUnicodeArgs *pArgs, UErrorCode *err) { - const uint8_t *s, *sourceLimit; - UChar32 c; - - if(pArgs->converter->mode<8) { - return UCNV_GET_NEXT_UCHAR_USE_TO_U; - } - - s=(const uint8_t *)pArgs->source; - sourceLimit=(const uint8_t *)pArgs->sourceLimit; - - if(s>=sourceLimit) { - /* no input */ - *err=U_INDEX_OUTOFBOUNDS_ERROR; - return 0xffff; - } - - if(s+2>sourceLimit) { - /* only one byte: truncated UChar */ - pArgs->converter->toUBytes[0]=*s++; - pArgs->converter->toULength=1; - pArgs->source=(const char *)s; - *err = U_TRUNCATED_CHAR_FOUND; - return 0xffff; - } - - /* get one UChar */ - c=((UChar32)s[1]<<8)|*s; - s+=2; - - /* check for a surrogate pair */ - if(U_IS_SURROGATE(c)) { - if(U16_IS_SURROGATE_LEAD(c)) { - if(s+2<=sourceLimit) { - UChar trail; - - /* get a second UChar and see if it is a trail surrogate */ - trail=((UChar)s[1]<<8)|*s; - if(U16_IS_TRAIL(trail)) { - c=U16_GET_SUPPLEMENTARY(c, trail); - s+=2; - } else { - /* unmatched lead surrogate */ - c=-2; - } - } else { - /* too few (2 or 3) bytes for a surrogate pair: truncated code point */ - uint8_t *bytes=pArgs->converter->toUBytes; - s-=2; - pArgs->converter->toULength=(int8_t)(sourceLimit-s); - do { - *bytes++=*s++; - } while(sconverter->toUBytes; - pArgs->converter->toULength=2; - *bytes=*(s-2); - bytes[1]=*(s-1); - - c=0xffff; - *err=U_ILLEGAL_CHAR_FOUND; - } - } - - pArgs->source=(const char *)s; - return c; -} - -static void -_UTF16LEReset(UConverter *cnv, UConverterResetChoice choice) { - if(choice<=UCNV_RESET_TO_UNICODE) { - /* reset toUnicode state */ - if(UCNV_GET_VERSION(cnv)==0) { - cnv->mode=8; /* no BOM handling */ - } else { - cnv->mode=0; /* Java-specific "UnicodeLittle" requires LE BOM or no BOM */ - } - } - if(choice!=UCNV_RESET_TO_UNICODE && UCNV_GET_VERSION(cnv)==1) { - /* reset fromUnicode for "UnicodeLittle": prepare to output the UTF-16LE BOM */ - cnv->fromUnicodeStatus=UCNV_NEED_TO_WRITE_BOM; - } -} - -static void -_UTF16LEOpen(UConverter *cnv, - UConverterLoadArgs *pArgs, - UErrorCode *pErrorCode) { - if(UCNV_GET_VERSION(cnv)<=1) { - _UTF16LEReset(cnv, UCNV_RESET_BOTH); - } else { - *pErrorCode=U_ILLEGAL_ARGUMENT_ERROR; - } -} - -static const char * -_UTF16LEGetName(const UConverter *cnv) { - if(UCNV_GET_VERSION(cnv)==0) { - return "UTF-16LE"; - } else { - return "UTF-16LE,version=1"; - } -} - -static const UConverterImpl _UTF16LEImpl={ - UCNV_UTF16_LittleEndian, - - NULL, - NULL, - - _UTF16LEOpen, - NULL, - _UTF16LEReset, - - _UTF16LEToUnicodeWithOffsets, - _UTF16LEToUnicodeWithOffsets, - _UTF16LEFromUnicodeWithOffsets, - _UTF16LEFromUnicodeWithOffsets, - _UTF16LEGetNextUChar, - - NULL, - _UTF16LEGetName, - NULL, - NULL, - ucnv_getNonSurrogateUnicodeSet, - - NULL, - NULL -}; - - -static const UConverterStaticData _UTF16LEStaticData={ - sizeof(UConverterStaticData), - "UTF-16LE", - 1202, UCNV_IBM, UCNV_UTF16_LittleEndian, 2, 2, - { 0xfd, 0xff, 0, 0 },2,FALSE,FALSE, - 0, - 0, - { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 } /* reserved */ -}; - - -const UConverterSharedData _UTF16LEData= - UCNV_IMMUTABLE_SHARED_DATA_INITIALIZER(&_UTF16LEStaticData, &_UTF16LEImpl); - -/* UTF-16 (Detect BOM) ------------------------------------------------------ */ - -/* - * Detect a BOM at the beginning of the stream and select UTF-16BE or UTF-16LE - * accordingly. - * This is a simpler version of the UTF-32 converter, with - * fewer states for shorter BOMs. - * - * State values: - * 0 initial state - * 1 saw first byte - * 2..5 - - * 6..7 see _UTF16ToUnicodeWithOffsets() comments in state 1 - * 8 UTF-16BE mode - * 9 UTF-16LE mode - * - * During detection: state==number of initial bytes seen so far. - * - * On output, emit U+FEFF as the first code point. - * - * Variants: - * - UTF-16,version=1 (Java "Unicode" encoding) treats a missing BOM as an error. - * - UTF-16BE,version=1 (Java "UnicodeBig" encoding) and - * UTF-16LE,version=1 (Java "UnicodeLittle" encoding) treat a reverse BOM as an error. - */ - -static void -_UTF16Reset(UConverter *cnv, UConverterResetChoice choice) { - if(choice<=UCNV_RESET_TO_UNICODE) { - /* reset toUnicode: state=0 */ - cnv->mode=0; - } - if(choice!=UCNV_RESET_TO_UNICODE) { - /* reset fromUnicode: prepare to output the UTF-16PE BOM */ - cnv->fromUnicodeStatus=UCNV_NEED_TO_WRITE_BOM; - } -} - -static const UConverterSharedData _UTF16v2Data; - -static void -_UTF16Open(UConverter *cnv, - UConverterLoadArgs *pArgs, - UErrorCode *pErrorCode) { - if(UCNV_GET_VERSION(cnv)<=2) { - if(UCNV_GET_VERSION(cnv)==2 && !pArgs->onlyTestIsLoadable) { - /* - * Switch implementation, and switch the staticData that's different - * and was copied into the UConverter. - * (See ucnv_createConverterFromSharedData() in ucnv_bld.c.) - * UTF-16,version=2 fromUnicode() always writes a big-endian byte stream. - */ - cnv->sharedData=(UConverterSharedData*)&_UTF16v2Data; - uprv_memcpy(cnv->subChars, _UTF16v2Data.staticData->subChar, UCNV_MAX_SUBCHAR_LEN); - } - _UTF16Reset(cnv, UCNV_RESET_BOTH); - } else { - *pErrorCode=U_ILLEGAL_ARGUMENT_ERROR; - } -} - -static const char * -_UTF16GetName(const UConverter *cnv) { - if(UCNV_GET_VERSION(cnv)==0) { - return "UTF-16"; - } else if(UCNV_GET_VERSION(cnv)==1) { - return "UTF-16,version=1"; - } else { - return "UTF-16,version=2"; - } -} - -const UConverterSharedData _UTF16Data; - -#define IS_UTF16BE(cnv) ((cnv)->sharedData==&_UTF16BEData) -#define IS_UTF16LE(cnv) ((cnv)->sharedData==&_UTF16LEData) -#define IS_UTF16(cnv) ((cnv)->sharedData==&_UTF16Data || (cnv)->sharedData==&_UTF16v2Data) - -static void -_UTF16ToUnicodeWithOffsets(UConverterToUnicodeArgs *pArgs, - UErrorCode *pErrorCode) { - UConverter *cnv=pArgs->converter; - const char *source=pArgs->source; - const char *sourceLimit=pArgs->sourceLimit; - int32_t *offsets=pArgs->offsets; - - int32_t state, offsetDelta; - uint8_t b; - - state=cnv->mode; - - /* - * If we detect a BOM in this buffer, then we must add the BOM size to the - * offsets because the actual converter function will not see and count the BOM. - * offsetDelta will have the number of the BOM bytes that are in the current buffer. - */ - offsetDelta=0; - - while(sourcetoUBytes[0]=(uint8_t)*source++; - cnv->toULength=1; - state=1; - break; - case 1: - /* - * Only inside this switch case can the state variable - * temporarily take two additional values: - * 6: BOM error, continue with BE - * 7: BOM error, continue with LE - */ - b=*source; - if(cnv->toUBytes[0]==0xfe && b==0xff) { - if(IS_UTF16LE(cnv)) { - state=7; /* illegal reverse BOM for Java "UnicodeLittle" */ - } else { - state=8; /* detect UTF-16BE */ - } - } else if(cnv->toUBytes[0]==0xff && b==0xfe) { - if(IS_UTF16BE(cnv)) { - state=6; /* illegal reverse BOM for Java "UnicodeBig" */ - } else { - state=9; /* detect UTF-16LE */ - } - } else if((IS_UTF16(cnv) && UCNV_GET_VERSION(cnv)==1)) { - state=6; /* illegal missing BOM for Java "Unicode" */ - } - if(state>=8) { - /* BOM detected, consume it */ - ++source; - cnv->toULength=0; - offsetDelta=(int32_t)(source-pArgs->source); - } else if(state<6) { - /* ok: no BOM, and not a reverse BOM */ - if(source!=pArgs->source) { - /* reset the source for a correct first offset */ - source=pArgs->source; - cnv->toULength=0; - } - if(IS_UTF16LE(cnv)) { - /* Make Java "UnicodeLittle" default to LE. */ - state=9; - } else { - /* Make standard UTF-16 and Java "UnicodeBig" default to BE. */ - state=8; - } - } else { - /* - * error: missing BOM, or reverse BOM - * UTF-16,version=1: Java-specific "Unicode" requires a BOM. - * UTF-16BE,version=1: Java-specific "UnicodeBig" requires a BE BOM or no BOM. - * UTF-16LE,version=1: Java-specific "UnicodeLittle" requires an LE BOM or no BOM. - */ - /* report the non-BOM or reverse BOM as an illegal sequence */ - cnv->toUBytes[1]=b; - cnv->toULength=2; - pArgs->source=source+1; - /* continue with conversion if the callback resets the error */ - /* - * Make Java "Unicode" default to BE like standard UTF-16. - * Make Java "UnicodeBig" and "UnicodeLittle" default - * to their normal endiannesses. - */ - cnv->mode=state+2; - *pErrorCode=U_ILLEGAL_ESCAPE_SEQUENCE; - return; - } - /* convert the rest of the stream */ - cnv->mode=state; - continue; - case 8: - /* call UTF-16BE */ - pArgs->source=source; - _UTF16BEToUnicodeWithOffsets(pArgs, pErrorCode); - source=pArgs->source; - break; - case 9: - /* call UTF-16LE */ - pArgs->source=source; - _UTF16LEToUnicodeWithOffsets(pArgs, pErrorCode); - source=pArgs->source; - break; - default: - break; /* does not occur */ - } - } - - /* add BOM size to offsets - see comment at offsetDelta declaration */ - if(offsets!=NULL && offsetDelta!=0) { - int32_t *offsetsLimit=pArgs->offsets; - while(offsetssource=source; - - if(source==sourceLimit && pArgs->flush) { - /* handle truncated input */ - switch(state) { - case 0: - break; /* no input at all, nothing to do */ - case 8: - _UTF16BEToUnicodeWithOffsets(pArgs, pErrorCode); - break; - case 9: - _UTF16LEToUnicodeWithOffsets(pArgs, pErrorCode); - break; - default: - /* 0mode=state; -} - -static UChar32 -_UTF16GetNextUChar(UConverterToUnicodeArgs *pArgs, - UErrorCode *pErrorCode) { - switch(pArgs->converter->mode) { - case 8: - return _UTF16BEGetNextUChar(pArgs, pErrorCode); - case 9: - return _UTF16LEGetNextUChar(pArgs, pErrorCode); - default: - return UCNV_GET_NEXT_UCHAR_USE_TO_U; - } -} - -static const UConverterImpl _UTF16Impl = { - UCNV_UTF16, - - NULL, - NULL, - - _UTF16Open, - NULL, - _UTF16Reset, - - _UTF16ToUnicodeWithOffsets, - _UTF16ToUnicodeWithOffsets, - _UTF16PEFromUnicodeWithOffsets, - _UTF16PEFromUnicodeWithOffsets, - _UTF16GetNextUChar, - - NULL, /* ### TODO implement getStarters for all Unicode encodings?! */ - _UTF16GetName, - NULL, - NULL, - ucnv_getNonSurrogateUnicodeSet, - - NULL, - NULL -}; - -static const UConverterStaticData _UTF16StaticData = { - sizeof(UConverterStaticData), - "UTF-16", - 1204, /* CCSID for BOM sensitive UTF-16 */ - UCNV_IBM, UCNV_UTF16, 2, 2, -#if U_IS_BIG_ENDIAN - { 0xff, 0xfd, 0, 0 }, 2, -#else - { 0xfd, 0xff, 0, 0 }, 2, -#endif - FALSE, FALSE, - 0, - 0, - { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 } /* reserved */ -}; - -const UConverterSharedData _UTF16Data = - UCNV_IMMUTABLE_SHARED_DATA_INITIALIZER(&_UTF16StaticData, &_UTF16Impl); - -static const UConverterImpl _UTF16v2Impl = { - UCNV_UTF16, - - NULL, - NULL, - - _UTF16Open, - NULL, - _UTF16Reset, - - _UTF16ToUnicodeWithOffsets, - _UTF16ToUnicodeWithOffsets, - _UTF16BEFromUnicodeWithOffsets, - _UTF16BEFromUnicodeWithOffsets, - _UTF16GetNextUChar, - - NULL, /* ### TODO implement getStarters for all Unicode encodings?! */ - _UTF16GetName, - NULL, - NULL, - ucnv_getNonSurrogateUnicodeSet, - - NULL, - NULL -}; - -static const UConverterStaticData _UTF16v2StaticData = { - sizeof(UConverterStaticData), - "UTF-16,version=2", - 1204, /* CCSID for BOM sensitive UTF-16 */ - UCNV_IBM, UCNV_UTF16, 2, 2, - { 0xff, 0xfd, 0, 0 }, 2, - FALSE, FALSE, - 0, - 0, - { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 } /* reserved */ -}; - -static const UConverterSharedData _UTF16v2Data = - UCNV_IMMUTABLE_SHARED_DATA_INITIALIZER(&_UTF16v2StaticData, &_UTF16v2Impl); - -#endif diff --git a/Build/source/libs/icu/icu-src/source/common/ucnv_u16.cpp b/Build/source/libs/icu/icu-src/source/common/ucnv_u16.cpp new file mode 100644 index 00000000000..28f2727ecdf --- /dev/null +++ b/Build/source/libs/icu/icu-src/source/common/ucnv_u16.cpp @@ -0,0 +1,1579 @@ +// © 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html +/* +********************************************************************** +* Copyright (C) 2002-2015, International Business Machines +* Corporation and others. All Rights Reserved. +********************************************************************** +* file name: ucnv_u16.c +* encoding: UTF-8 +* tab size: 8 (not used) +* indentation:4 +* +* created on: 2002jul01 +* created by: Markus W. Scherer +* +* UTF-16 converter implementation. Used to be in ucnv_utf.c. +*/ + +#include "unicode/utypes.h" + +#if !UCONFIG_NO_CONVERSION + +#include "unicode/ucnv.h" +#include "unicode/uversion.h" +#include "ucnv_bld.h" +#include "ucnv_cnv.h" +#include "cmemory.h" + +enum { + UCNV_NEED_TO_WRITE_BOM=1 +}; + +U_CDECL_BEGIN +/* + * The UTF-16 toUnicode implementation is also used for the Java-specific + * "with BOM" variants of UTF-16BE and UTF-16LE. + */ +static void U_CALLCONV +_UTF16ToUnicodeWithOffsets(UConverterToUnicodeArgs *pArgs, + UErrorCode *pErrorCode); + +/* UTF-16BE ----------------------------------------------------------------- */ + +#if U_IS_BIG_ENDIAN +# define _UTF16PEFromUnicodeWithOffsets _UTF16BEFromUnicodeWithOffsets +#else +# define _UTF16PEFromUnicodeWithOffsets _UTF16LEFromUnicodeWithOffsets +#endif + + +static void U_CALLCONV +_UTF16BEFromUnicodeWithOffsets(UConverterFromUnicodeArgs *pArgs, + UErrorCode *pErrorCode) { + UConverter *cnv; + const UChar *source; + char *target; + int32_t *offsets; + + uint32_t targetCapacity, length, sourceIndex; + UChar c, trail; + char overflow[4]; + + source=pArgs->source; + length=(int32_t)(pArgs->sourceLimit-source); + if(length<=0) { + /* no input, nothing to do */ + return; + } + + cnv=pArgs->converter; + + /* write the BOM if necessary */ + if(cnv->fromUnicodeStatus==UCNV_NEED_TO_WRITE_BOM) { + static const char bom[]={ (char)0xfe, (char)0xff }; + ucnv_fromUWriteBytes(cnv, + bom, 2, + &pArgs->target, pArgs->targetLimit, + &pArgs->offsets, -1, + pErrorCode); + cnv->fromUnicodeStatus=0; + } + + target=pArgs->target; + if(target >= pArgs->targetLimit) { + *pErrorCode=U_BUFFER_OVERFLOW_ERROR; + return; + } + + targetCapacity=(uint32_t)(pArgs->targetLimit-target); + offsets=pArgs->offsets; + sourceIndex=0; + + /* c!=0 indicates in several places outside the main loops that a surrogate was found */ + + if((c=(UChar)cnv->fromUChar32)!=0 && U16_IS_TRAIL(trail=*source) && targetCapacity>=4) { + /* the last buffer ended with a lead surrogate, output the surrogate pair */ + ++source; + --length; + target[0]=(uint8_t)(c>>8); + target[1]=(uint8_t)c; + target[2]=(uint8_t)(trail>>8); + target[3]=(uint8_t)trail; + target+=4; + targetCapacity-=4; + if(offsets!=NULL) { + *offsets++=-1; + *offsets++=-1; + *offsets++=-1; + *offsets++=-1; + } + sourceIndex=1; + cnv->fromUChar32=c=0; + } + + if(c==0) { + /* copy an even number of bytes for complete UChars */ + uint32_t count=2*length; + if(count>targetCapacity) { + count=targetCapacity&~1; + } + /* count is even */ + targetCapacity-=count; + count>>=1; + length-=count; + + if(offsets==NULL) { + while(count>0) { + c=*source++; + if(U16_IS_SINGLE(c)) { + target[0]=(uint8_t)(c>>8); + target[1]=(uint8_t)c; + target+=2; + } else if(U16_IS_SURROGATE_LEAD(c) && count>=2 && U16_IS_TRAIL(trail=*source)) { + ++source; + --count; + target[0]=(uint8_t)(c>>8); + target[1]=(uint8_t)c; + target[2]=(uint8_t)(trail>>8); + target[3]=(uint8_t)trail; + target+=4; + } else { + break; + } + --count; + } + } else { + while(count>0) { + c=*source++; + if(U16_IS_SINGLE(c)) { + target[0]=(uint8_t)(c>>8); + target[1]=(uint8_t)c; + target+=2; + *offsets++=sourceIndex; + *offsets++=sourceIndex++; + } else if(U16_IS_SURROGATE_LEAD(c) && count>=2 && U16_IS_TRAIL(trail=*source)) { + ++source; + --count; + target[0]=(uint8_t)(c>>8); + target[1]=(uint8_t)c; + target[2]=(uint8_t)(trail>>8); + target[3]=(uint8_t)trail; + target+=4; + *offsets++=sourceIndex; + *offsets++=sourceIndex; + *offsets++=sourceIndex; + *offsets++=sourceIndex; + sourceIndex+=2; + } else { + break; + } + --count; + } + } + + if(count==0) { + /* done with the loop for complete UChars */ + if(length>0 && targetCapacity>0) { + /* + * there is more input and some target capacity - + * it must be targetCapacity==1 because otherwise + * the above would have copied more; + * prepare for overflow output + */ + if(U16_IS_SINGLE(c=*source++)) { + overflow[0]=(char)(c>>8); + overflow[1]=(char)c; + length=2; /* 2 bytes to output */ + c=0; + /* } else { keep c for surrogate handling, length will be set there */ + } + } else { + length=0; + c=0; + } + } else { + /* keep c for surrogate handling, length will be set there */ + targetCapacity+=2*count; + } + } else { + length=0; /* from here on, length counts the bytes in overflow[] */ + } + + if(c!=0) { + /* + * c is a surrogate, and + * - source or target too short + * - or the surrogate is unmatched + */ + length=0; + if(U16_IS_SURROGATE_LEAD(c)) { + if(sourcesourceLimit) { + if(U16_IS_TRAIL(trail=*source)) { + /* output the surrogate pair, will overflow (see conditions comment above) */ + ++source; + overflow[0]=(char)(c>>8); + overflow[1]=(char)c; + overflow[2]=(char)(trail>>8); + overflow[3]=(char)trail; + length=4; /* 4 bytes to output */ + c=0; + } else { + /* unmatched lead surrogate */ + *pErrorCode=U_ILLEGAL_CHAR_FOUND; + } + } else { + /* see if the trail surrogate is in the next buffer */ + } + } else { + /* unmatched trail surrogate */ + *pErrorCode=U_ILLEGAL_CHAR_FOUND; + } + cnv->fromUChar32=c; + } + + if(length>0) { + /* output length bytes with overflow (length>targetCapacity>0) */ + ucnv_fromUWriteBytes(cnv, + overflow, length, + (char **)&target, pArgs->targetLimit, + &offsets, sourceIndex, + pErrorCode); + targetCapacity=(uint32_t)(pArgs->targetLimit-(char *)target); + } + + if(U_SUCCESS(*pErrorCode) && sourcesourceLimit && targetCapacity==0) { + *pErrorCode=U_BUFFER_OVERFLOW_ERROR; + } + + /* write back the updated pointers */ + pArgs->source=source; + pArgs->target=(char *)target; + pArgs->offsets=offsets; +} + +static void U_CALLCONV +_UTF16BEToUnicodeWithOffsets(UConverterToUnicodeArgs *pArgs, + UErrorCode *pErrorCode) { + UConverter *cnv; + const uint8_t *source; + UChar *target; + int32_t *offsets; + + uint32_t targetCapacity, length, count, sourceIndex; + UChar c, trail; + + if(pArgs->converter->mode<8) { + _UTF16ToUnicodeWithOffsets(pArgs, pErrorCode); + return; + } + + cnv=pArgs->converter; + source=(const uint8_t *)pArgs->source; + length=(int32_t)((const uint8_t *)pArgs->sourceLimit-source); + if(length<=0 && cnv->toUnicodeStatus==0) { + /* no input, nothing to do */ + return; + } + + target=pArgs->target; + if(target >= pArgs->targetLimit) { + *pErrorCode=U_BUFFER_OVERFLOW_ERROR; + return; + } + + targetCapacity=(uint32_t)(pArgs->targetLimit-target); + offsets=pArgs->offsets; + sourceIndex=0; + c=0; + + /* complete a partial UChar or pair from the last call */ + if(cnv->toUnicodeStatus!=0) { + /* + * special case: single byte from a previous buffer, + * where the byte turned out not to belong to a trail surrogate + * and the preceding, unmatched lead surrogate was put into toUBytes[] + * for error handling + */ + cnv->toUBytes[0]=(uint8_t)cnv->toUnicodeStatus; + cnv->toULength=1; + cnv->toUnicodeStatus=0; + } + if((count=cnv->toULength)!=0) { + uint8_t *p=cnv->toUBytes; + do { + p[count++]=*source++; + ++sourceIndex; + --length; + if(count==2) { + c=((UChar)p[0]<<8)|p[1]; + if(U16_IS_SINGLE(c)) { + /* output the BMP code point */ + *target++=c; + if(offsets!=NULL) { + *offsets++=-1; + } + --targetCapacity; + count=0; + c=0; + break; + } else if(U16_IS_SURROGATE_LEAD(c)) { + /* continue collecting bytes for the trail surrogate */ + c=0; /* avoid unnecessary surrogate handling below */ + } else { + /* fall through to error handling for an unmatched trail surrogate */ + break; + } + } else if(count==4) { + c=((UChar)p[0]<<8)|p[1]; + trail=((UChar)p[2]<<8)|p[3]; + if(U16_IS_TRAIL(trail)) { + /* output the surrogate pair */ + *target++=c; + if(targetCapacity>=2) { + *target++=trail; + if(offsets!=NULL) { + *offsets++=-1; + *offsets++=-1; + } + targetCapacity-=2; + } else /* targetCapacity==1 */ { + targetCapacity=0; + cnv->UCharErrorBuffer[0]=trail; + cnv->UCharErrorBufferLength=1; + *pErrorCode=U_BUFFER_OVERFLOW_ERROR; + } + count=0; + c=0; + break; + } else { + /* unmatched lead surrogate, handle here for consistent toUBytes[] */ + *pErrorCode=U_ILLEGAL_CHAR_FOUND; + + /* back out reading the code unit after it */ + if(((const uint8_t *)pArgs->source-source)>=2) { + source-=2; + } else { + /* + * if the trail unit's first byte was in a previous buffer, then + * we need to put it into a special place because toUBytes[] will be + * used for the lead unit's bytes + */ + cnv->toUnicodeStatus=0x100|p[2]; + --source; + } + cnv->toULength=2; + + /* write back the updated pointers */ + pArgs->source=(const char *)source; + pArgs->target=target; + pArgs->offsets=offsets; + return; + } + } + } while(length>0); + cnv->toULength=(int8_t)count; + } + + /* copy an even number of bytes for complete UChars */ + count=2*targetCapacity; + if(count>length) { + count=length&~1; + } + if(c==0 && count>0) { + length-=count; + count>>=1; + targetCapacity-=count; + if(offsets==NULL) { + do { + c=((UChar)source[0]<<8)|source[1]; + source+=2; + if(U16_IS_SINGLE(c)) { + *target++=c; + } else if(U16_IS_SURROGATE_LEAD(c) && count>=2 && + U16_IS_TRAIL(trail=((UChar)source[0]<<8)|source[1]) + ) { + source+=2; + --count; + *target++=c; + *target++=trail; + } else { + break; + } + } while(--count>0); + } else { + do { + c=((UChar)source[0]<<8)|source[1]; + source+=2; + if(U16_IS_SINGLE(c)) { + *target++=c; + *offsets++=sourceIndex; + sourceIndex+=2; + } else if(U16_IS_SURROGATE_LEAD(c) && count>=2 && + U16_IS_TRAIL(trail=((UChar)source[0]<<8)|source[1]) + ) { + source+=2; + --count; + *target++=c; + *target++=trail; + *offsets++=sourceIndex; + *offsets++=sourceIndex; + sourceIndex+=4; + } else { + break; + } + } while(--count>0); + } + + if(count==0) { + /* done with the loop for complete UChars */ + c=0; + } else { + /* keep c for surrogate handling, trail will be set there */ + length+=2*(count-1); /* one more byte pair was consumed than count decremented */ + targetCapacity+=count; + } + } + + if(c!=0) { + /* + * c is a surrogate, and + * - source or target too short + * - or the surrogate is unmatched + */ + cnv->toUBytes[0]=(uint8_t)(c>>8); + cnv->toUBytes[1]=(uint8_t)c; + cnv->toULength=2; + + if(U16_IS_SURROGATE_LEAD(c)) { + if(length>=2) { + if(U16_IS_TRAIL(trail=((UChar)source[0]<<8)|source[1])) { + /* output the surrogate pair, will overflow (see conditions comment above) */ + source+=2; + length-=2; + *target++=c; + if(offsets!=NULL) { + *offsets++=sourceIndex; + } + cnv->UCharErrorBuffer[0]=trail; + cnv->UCharErrorBufferLength=1; + cnv->toULength=0; + *pErrorCode=U_BUFFER_OVERFLOW_ERROR; + } else { + /* unmatched lead surrogate */ + *pErrorCode=U_ILLEGAL_CHAR_FOUND; + } + } else { + /* see if the trail surrogate is in the next buffer */ + } + } else { + /* unmatched trail surrogate */ + *pErrorCode=U_ILLEGAL_CHAR_FOUND; + } + } + + if(U_SUCCESS(*pErrorCode)) { + /* check for a remaining source byte */ + if(length>0) { + if(targetCapacity==0) { + *pErrorCode=U_BUFFER_OVERFLOW_ERROR; + } else { + /* it must be length==1 because otherwise the above would have copied more */ + cnv->toUBytes[cnv->toULength++]=*source++; + } + } + } + + /* write back the updated pointers */ + pArgs->source=(const char *)source; + pArgs->target=target; + pArgs->offsets=offsets; +} + +static UChar32 U_CALLCONV +_UTF16BEGetNextUChar(UConverterToUnicodeArgs *pArgs, UErrorCode *err) { + const uint8_t *s, *sourceLimit; + UChar32 c; + + if(pArgs->converter->mode<8) { + return UCNV_GET_NEXT_UCHAR_USE_TO_U; + } + + s=(const uint8_t *)pArgs->source; + sourceLimit=(const uint8_t *)pArgs->sourceLimit; + + if(s>=sourceLimit) { + /* no input */ + *err=U_INDEX_OUTOFBOUNDS_ERROR; + return 0xffff; + } + + if(s+2>sourceLimit) { + /* only one byte: truncated UChar */ + pArgs->converter->toUBytes[0]=*s++; + pArgs->converter->toULength=1; + pArgs->source=(const char *)s; + *err = U_TRUNCATED_CHAR_FOUND; + return 0xffff; + } + + /* get one UChar */ + c=((UChar32)*s<<8)|s[1]; + s+=2; + + /* check for a surrogate pair */ + if(U_IS_SURROGATE(c)) { + if(U16_IS_SURROGATE_LEAD(c)) { + if(s+2<=sourceLimit) { + UChar trail; + + /* get a second UChar and see if it is a trail surrogate */ + trail=((UChar)*s<<8)|s[1]; + if(U16_IS_TRAIL(trail)) { + c=U16_GET_SUPPLEMENTARY(c, trail); + s+=2; + } else { + /* unmatched lead surrogate */ + c=-2; + } + } else { + /* too few (2 or 3) bytes for a surrogate pair: truncated code point */ + uint8_t *bytes=pArgs->converter->toUBytes; + s-=2; + pArgs->converter->toULength=(int8_t)(sourceLimit-s); + do { + *bytes++=*s++; + } while(sconverter->toUBytes; + pArgs->converter->toULength=2; + *bytes=*(s-2); + bytes[1]=*(s-1); + + c=0xffff; + *err=U_ILLEGAL_CHAR_FOUND; + } + } + + pArgs->source=(const char *)s; + return c; +} + +static void U_CALLCONV +_UTF16BEReset(UConverter *cnv, UConverterResetChoice choice) { + if(choice<=UCNV_RESET_TO_UNICODE) { + /* reset toUnicode state */ + if(UCNV_GET_VERSION(cnv)==0) { + cnv->mode=8; /* no BOM handling */ + } else { + cnv->mode=0; /* Java-specific "UnicodeBig" requires BE BOM or no BOM */ + } + } + if(choice!=UCNV_RESET_TO_UNICODE && UCNV_GET_VERSION(cnv)==1) { + /* reset fromUnicode for "UnicodeBig": prepare to output the UTF-16BE BOM */ + cnv->fromUnicodeStatus=UCNV_NEED_TO_WRITE_BOM; + } +} + +static void U_CALLCONV +_UTF16BEOpen(UConverter *cnv, + UConverterLoadArgs *pArgs, + UErrorCode *pErrorCode) { + (void)pArgs; + if(UCNV_GET_VERSION(cnv)<=1) { + _UTF16BEReset(cnv, UCNV_RESET_BOTH); + } else { + *pErrorCode=U_ILLEGAL_ARGUMENT_ERROR; + } +} + +static const char * U_CALLCONV +_UTF16BEGetName(const UConverter *cnv) { + if(UCNV_GET_VERSION(cnv)==0) { + return "UTF-16BE"; + } else { + return "UTF-16BE,version=1"; + } +} +U_CDECL_END + +static const UConverterImpl _UTF16BEImpl={ + UCNV_UTF16_BigEndian, + + NULL, + NULL, + + _UTF16BEOpen, + NULL, + _UTF16BEReset, + + _UTF16BEToUnicodeWithOffsets, + _UTF16BEToUnicodeWithOffsets, + _UTF16BEFromUnicodeWithOffsets, + _UTF16BEFromUnicodeWithOffsets, + _UTF16BEGetNextUChar, + + NULL, + _UTF16BEGetName, + NULL, + NULL, + ucnv_getNonSurrogateUnicodeSet, + + NULL, + NULL +}; + +static const UConverterStaticData _UTF16BEStaticData={ + sizeof(UConverterStaticData), + "UTF-16BE", + 1200, UCNV_IBM, UCNV_UTF16_BigEndian, 2, 2, + { 0xff, 0xfd, 0, 0 },2,FALSE,FALSE, + 0, + 0, + { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 } /* reserved */ +}; + + +const UConverterSharedData _UTF16BEData= + UCNV_IMMUTABLE_SHARED_DATA_INITIALIZER(&_UTF16BEStaticData, &_UTF16BEImpl); + +/* UTF-16LE ----------------------------------------------------------------- */ +U_CDECL_BEGIN +static void U_CALLCONV +_UTF16LEFromUnicodeWithOffsets(UConverterFromUnicodeArgs *pArgs, + UErrorCode *pErrorCode) { + UConverter *cnv; + const UChar *source; + char *target; + int32_t *offsets; + + uint32_t targetCapacity, length, sourceIndex; + UChar c, trail; + char overflow[4]; + + source=pArgs->source; + length=(int32_t)(pArgs->sourceLimit-source); + if(length<=0) { + /* no input, nothing to do */ + return; + } + + cnv=pArgs->converter; + + /* write the BOM if necessary */ + if(cnv->fromUnicodeStatus==UCNV_NEED_TO_WRITE_BOM) { + static const char bom[]={ (char)0xff, (char)0xfe }; + ucnv_fromUWriteBytes(cnv, + bom, 2, + &pArgs->target, pArgs->targetLimit, + &pArgs->offsets, -1, + pErrorCode); + cnv->fromUnicodeStatus=0; + } + + target=pArgs->target; + if(target >= pArgs->targetLimit) { + *pErrorCode=U_BUFFER_OVERFLOW_ERROR; + return; + } + + targetCapacity=(uint32_t)(pArgs->targetLimit-pArgs->target); + offsets=pArgs->offsets; + sourceIndex=0; + + /* c!=0 indicates in several places outside the main loops that a surrogate was found */ + + if((c=(UChar)cnv->fromUChar32)!=0 && U16_IS_TRAIL(trail=*source) && targetCapacity>=4) { + /* the last buffer ended with a lead surrogate, output the surrogate pair */ + ++source; + --length; + target[0]=(uint8_t)c; + target[1]=(uint8_t)(c>>8); + target[2]=(uint8_t)trail; + target[3]=(uint8_t)(trail>>8); + target+=4; + targetCapacity-=4; + if(offsets!=NULL) { + *offsets++=-1; + *offsets++=-1; + *offsets++=-1; + *offsets++=-1; + } + sourceIndex=1; + cnv->fromUChar32=c=0; + } + + if(c==0) { + /* copy an even number of bytes for complete UChars */ + uint32_t count=2*length; + if(count>targetCapacity) { + count=targetCapacity&~1; + } + /* count is even */ + targetCapacity-=count; + count>>=1; + length-=count; + + if(offsets==NULL) { + while(count>0) { + c=*source++; + if(U16_IS_SINGLE(c)) { + target[0]=(uint8_t)c; + target[1]=(uint8_t)(c>>8); + target+=2; + } else if(U16_IS_SURROGATE_LEAD(c) && count>=2 && U16_IS_TRAIL(trail=*source)) { + ++source; + --count; + target[0]=(uint8_t)c; + target[1]=(uint8_t)(c>>8); + target[2]=(uint8_t)trail; + target[3]=(uint8_t)(trail>>8); + target+=4; + } else { + break; + } + --count; + } + } else { + while(count>0) { + c=*source++; + if(U16_IS_SINGLE(c)) { + target[0]=(uint8_t)c; + target[1]=(uint8_t)(c>>8); + target+=2; + *offsets++=sourceIndex; + *offsets++=sourceIndex++; + } else if(U16_IS_SURROGATE_LEAD(c) && count>=2 && U16_IS_TRAIL(trail=*source)) { + ++source; + --count; + target[0]=(uint8_t)c; + target[1]=(uint8_t)(c>>8); + target[2]=(uint8_t)trail; + target[3]=(uint8_t)(trail>>8); + target+=4; + *offsets++=sourceIndex; + *offsets++=sourceIndex; + *offsets++=sourceIndex; + *offsets++=sourceIndex; + sourceIndex+=2; + } else { + break; + } + --count; + } + } + + if(count==0) { + /* done with the loop for complete UChars */ + if(length>0 && targetCapacity>0) { + /* + * there is more input and some target capacity - + * it must be targetCapacity==1 because otherwise + * the above would have copied more; + * prepare for overflow output + */ + if(U16_IS_SINGLE(c=*source++)) { + overflow[0]=(char)c; + overflow[1]=(char)(c>>8); + length=2; /* 2 bytes to output */ + c=0; + /* } else { keep c for surrogate handling, length will be set there */ + } + } else { + length=0; + c=0; + } + } else { + /* keep c for surrogate handling, length will be set there */ + targetCapacity+=2*count; + } + } else { + length=0; /* from here on, length counts the bytes in overflow[] */ + } + + if(c!=0) { + /* + * c is a surrogate, and + * - source or target too short + * - or the surrogate is unmatched + */ + length=0; + if(U16_IS_SURROGATE_LEAD(c)) { + if(sourcesourceLimit) { + if(U16_IS_TRAIL(trail=*source)) { + /* output the surrogate pair, will overflow (see conditions comment above) */ + ++source; + overflow[0]=(char)c; + overflow[1]=(char)(c>>8); + overflow[2]=(char)trail; + overflow[3]=(char)(trail>>8); + length=4; /* 4 bytes to output */ + c=0; + } else { + /* unmatched lead surrogate */ + *pErrorCode=U_ILLEGAL_CHAR_FOUND; + } + } else { + /* see if the trail surrogate is in the next buffer */ + } + } else { + /* unmatched trail surrogate */ + *pErrorCode=U_ILLEGAL_CHAR_FOUND; + } + cnv->fromUChar32=c; + } + + if(length>0) { + /* output length bytes with overflow (length>targetCapacity>0) */ + ucnv_fromUWriteBytes(cnv, + overflow, length, + &target, pArgs->targetLimit, + &offsets, sourceIndex, + pErrorCode); + targetCapacity=(uint32_t)(pArgs->targetLimit-(char *)target); + } + + if(U_SUCCESS(*pErrorCode) && sourcesourceLimit && targetCapacity==0) { + *pErrorCode=U_BUFFER_OVERFLOW_ERROR; + } + + /* write back the updated pointers */ + pArgs->source=source; + pArgs->target=target; + pArgs->offsets=offsets; +} + +static void U_CALLCONV +_UTF16LEToUnicodeWithOffsets(UConverterToUnicodeArgs *pArgs, + UErrorCode *pErrorCode) { + UConverter *cnv; + const uint8_t *source; + UChar *target; + int32_t *offsets; + + uint32_t targetCapacity, length, count, sourceIndex; + UChar c, trail; + + if(pArgs->converter->mode<8) { + _UTF16ToUnicodeWithOffsets(pArgs, pErrorCode); + return; + } + + cnv=pArgs->converter; + source=(const uint8_t *)pArgs->source; + length=(int32_t)((const uint8_t *)pArgs->sourceLimit-source); + if(length<=0 && cnv->toUnicodeStatus==0) { + /* no input, nothing to do */ + return; + } + + target=pArgs->target; + if(target >= pArgs->targetLimit) { + *pErrorCode=U_BUFFER_OVERFLOW_ERROR; + return; + } + + targetCapacity=(uint32_t)(pArgs->targetLimit-pArgs->target); + offsets=pArgs->offsets; + sourceIndex=0; + c=0; + + /* complete a partial UChar or pair from the last call */ + if(cnv->toUnicodeStatus!=0) { + /* + * special case: single byte from a previous buffer, + * where the byte turned out not to belong to a trail surrogate + * and the preceding, unmatched lead surrogate was put into toUBytes[] + * for error handling + */ + cnv->toUBytes[0]=(uint8_t)cnv->toUnicodeStatus; + cnv->toULength=1; + cnv->toUnicodeStatus=0; + } + if((count=cnv->toULength)!=0) { + uint8_t *p=cnv->toUBytes; + do { + p[count++]=*source++; + ++sourceIndex; + --length; + if(count==2) { + c=((UChar)p[1]<<8)|p[0]; + if(U16_IS_SINGLE(c)) { + /* output the BMP code point */ + *target++=c; + if(offsets!=NULL) { + *offsets++=-1; + } + --targetCapacity; + count=0; + c=0; + break; + } else if(U16_IS_SURROGATE_LEAD(c)) { + /* continue collecting bytes for the trail surrogate */ + c=0; /* avoid unnecessary surrogate handling below */ + } else { + /* fall through to error handling for an unmatched trail surrogate */ + break; + } + } else if(count==4) { + c=((UChar)p[1]<<8)|p[0]; + trail=((UChar)p[3]<<8)|p[2]; + if(U16_IS_TRAIL(trail)) { + /* output the surrogate pair */ + *target++=c; + if(targetCapacity>=2) { + *target++=trail; + if(offsets!=NULL) { + *offsets++=-1; + *offsets++=-1; + } + targetCapacity-=2; + } else /* targetCapacity==1 */ { + targetCapacity=0; + cnv->UCharErrorBuffer[0]=trail; + cnv->UCharErrorBufferLength=1; + *pErrorCode=U_BUFFER_OVERFLOW_ERROR; + } + count=0; + c=0; + break; + } else { + /* unmatched lead surrogate, handle here for consistent toUBytes[] */ + *pErrorCode=U_ILLEGAL_CHAR_FOUND; + + /* back out reading the code unit after it */ + if(((const uint8_t *)pArgs->source-source)>=2) { + source-=2; + } else { + /* + * if the trail unit's first byte was in a previous buffer, then + * we need to put it into a special place because toUBytes[] will be + * used for the lead unit's bytes + */ + cnv->toUnicodeStatus=0x100|p[2]; + --source; + } + cnv->toULength=2; + + /* write back the updated pointers */ + pArgs->source=(const char *)source; + pArgs->target=target; + pArgs->offsets=offsets; + return; + } + } + } while(length>0); + cnv->toULength=(int8_t)count; + } + + /* copy an even number of bytes for complete UChars */ + count=2*targetCapacity; + if(count>length) { + count=length&~1; + } + if(c==0 && count>0) { + length-=count; + count>>=1; + targetCapacity-=count; + if(offsets==NULL) { + do { + c=((UChar)source[1]<<8)|source[0]; + source+=2; + if(U16_IS_SINGLE(c)) { + *target++=c; + } else if(U16_IS_SURROGATE_LEAD(c) && count>=2 && + U16_IS_TRAIL(trail=((UChar)source[1]<<8)|source[0]) + ) { + source+=2; + --count; + *target++=c; + *target++=trail; + } else { + break; + } + } while(--count>0); + } else { + do { + c=((UChar)source[1]<<8)|source[0]; + source+=2; + if(U16_IS_SINGLE(c)) { + *target++=c; + *offsets++=sourceIndex; + sourceIndex+=2; + } else if(U16_IS_SURROGATE_LEAD(c) && count>=2 && + U16_IS_TRAIL(trail=((UChar)source[1]<<8)|source[0]) + ) { + source+=2; + --count; + *target++=c; + *target++=trail; + *offsets++=sourceIndex; + *offsets++=sourceIndex; + sourceIndex+=4; + } else { + break; + } + } while(--count>0); + } + + if(count==0) { + /* done with the loop for complete UChars */ + c=0; + } else { + /* keep c for surrogate handling, trail will be set there */ + length+=2*(count-1); /* one more byte pair was consumed than count decremented */ + targetCapacity+=count; + } + } + + if(c!=0) { + /* + * c is a surrogate, and + * - source or target too short + * - or the surrogate is unmatched + */ + cnv->toUBytes[0]=(uint8_t)c; + cnv->toUBytes[1]=(uint8_t)(c>>8); + cnv->toULength=2; + + if(U16_IS_SURROGATE_LEAD(c)) { + if(length>=2) { + if(U16_IS_TRAIL(trail=((UChar)source[1]<<8)|source[0])) { + /* output the surrogate pair, will overflow (see conditions comment above) */ + source+=2; + length-=2; + *target++=c; + if(offsets!=NULL) { + *offsets++=sourceIndex; + } + cnv->UCharErrorBuffer[0]=trail; + cnv->UCharErrorBufferLength=1; + cnv->toULength=0; + *pErrorCode=U_BUFFER_OVERFLOW_ERROR; + } else { + /* unmatched lead surrogate */ + *pErrorCode=U_ILLEGAL_CHAR_FOUND; + } + } else { + /* see if the trail surrogate is in the next buffer */ + } + } else { + /* unmatched trail surrogate */ + *pErrorCode=U_ILLEGAL_CHAR_FOUND; + } + } + + if(U_SUCCESS(*pErrorCode)) { + /* check for a remaining source byte */ + if(length>0) { + if(targetCapacity==0) { + *pErrorCode=U_BUFFER_OVERFLOW_ERROR; + } else { + /* it must be length==1 because otherwise the above would have copied more */ + cnv->toUBytes[cnv->toULength++]=*source++; + } + } + } + + /* write back the updated pointers */ + pArgs->source=(const char *)source; + pArgs->target=target; + pArgs->offsets=offsets; +} + +static UChar32 U_CALLCONV +_UTF16LEGetNextUChar(UConverterToUnicodeArgs *pArgs, UErrorCode *err) { + const uint8_t *s, *sourceLimit; + UChar32 c; + + if(pArgs->converter->mode<8) { + return UCNV_GET_NEXT_UCHAR_USE_TO_U; + } + + s=(const uint8_t *)pArgs->source; + sourceLimit=(const uint8_t *)pArgs->sourceLimit; + + if(s>=sourceLimit) { + /* no input */ + *err=U_INDEX_OUTOFBOUNDS_ERROR; + return 0xffff; + } + + if(s+2>sourceLimit) { + /* only one byte: truncated UChar */ + pArgs->converter->toUBytes[0]=*s++; + pArgs->converter->toULength=1; + pArgs->source=(const char *)s; + *err = U_TRUNCATED_CHAR_FOUND; + return 0xffff; + } + + /* get one UChar */ + c=((UChar32)s[1]<<8)|*s; + s+=2; + + /* check for a surrogate pair */ + if(U_IS_SURROGATE(c)) { + if(U16_IS_SURROGATE_LEAD(c)) { + if(s+2<=sourceLimit) { + UChar trail; + + /* get a second UChar and see if it is a trail surrogate */ + trail=((UChar)s[1]<<8)|*s; + if(U16_IS_TRAIL(trail)) { + c=U16_GET_SUPPLEMENTARY(c, trail); + s+=2; + } else { + /* unmatched lead surrogate */ + c=-2; + } + } else { + /* too few (2 or 3) bytes for a surrogate pair: truncated code point */ + uint8_t *bytes=pArgs->converter->toUBytes; + s-=2; + pArgs->converter->toULength=(int8_t)(sourceLimit-s); + do { + *bytes++=*s++; + } while(sconverter->toUBytes; + pArgs->converter->toULength=2; + *bytes=*(s-2); + bytes[1]=*(s-1); + + c=0xffff; + *err=U_ILLEGAL_CHAR_FOUND; + } + } + + pArgs->source=(const char *)s; + return c; +} + +static void U_CALLCONV +_UTF16LEReset(UConverter *cnv, UConverterResetChoice choice) { + if(choice<=UCNV_RESET_TO_UNICODE) { + /* reset toUnicode state */ + if(UCNV_GET_VERSION(cnv)==0) { + cnv->mode=8; /* no BOM handling */ + } else { + cnv->mode=0; /* Java-specific "UnicodeLittle" requires LE BOM or no BOM */ + } + } + if(choice!=UCNV_RESET_TO_UNICODE && UCNV_GET_VERSION(cnv)==1) { + /* reset fromUnicode for "UnicodeLittle": prepare to output the UTF-16LE BOM */ + cnv->fromUnicodeStatus=UCNV_NEED_TO_WRITE_BOM; + } +} + +static void U_CALLCONV +_UTF16LEOpen(UConverter *cnv, + UConverterLoadArgs *pArgs, + UErrorCode *pErrorCode) { + (void)pArgs; + if(UCNV_GET_VERSION(cnv)<=1) { + _UTF16LEReset(cnv, UCNV_RESET_BOTH); + } else { + *pErrorCode=U_ILLEGAL_ARGUMENT_ERROR; + } +} + +static const char * U_CALLCONV +_UTF16LEGetName(const UConverter *cnv) { + if(UCNV_GET_VERSION(cnv)==0) { + return "UTF-16LE"; + } else { + return "UTF-16LE,version=1"; + } +} +U_CDECL_END + +static const UConverterImpl _UTF16LEImpl={ + UCNV_UTF16_LittleEndian, + + NULL, + NULL, + + _UTF16LEOpen, + NULL, + _UTF16LEReset, + + _UTF16LEToUnicodeWithOffsets, + _UTF16LEToUnicodeWithOffsets, + _UTF16LEFromUnicodeWithOffsets, + _UTF16LEFromUnicodeWithOffsets, + _UTF16LEGetNextUChar, + + NULL, + _UTF16LEGetName, + NULL, + NULL, + ucnv_getNonSurrogateUnicodeSet, + + NULL, + NULL +}; + + +static const UConverterStaticData _UTF16LEStaticData={ + sizeof(UConverterStaticData), + "UTF-16LE", + 1202, UCNV_IBM, UCNV_UTF16_LittleEndian, 2, 2, + { 0xfd, 0xff, 0, 0 },2,FALSE,FALSE, + 0, + 0, + { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 } /* reserved */ +}; + + +const UConverterSharedData _UTF16LEData= + UCNV_IMMUTABLE_SHARED_DATA_INITIALIZER(&_UTF16LEStaticData, &_UTF16LEImpl); + +/* UTF-16 (Detect BOM) ------------------------------------------------------ */ + +/* + * Detect a BOM at the beginning of the stream and select UTF-16BE or UTF-16LE + * accordingly. + * This is a simpler version of the UTF-32 converter, with + * fewer states for shorter BOMs. + * + * State values: + * 0 initial state + * 1 saw first byte + * 2..5 - + * 6..7 see _UTF16ToUnicodeWithOffsets() comments in state 1 + * 8 UTF-16BE mode + * 9 UTF-16LE mode + * + * During detection: state==number of initial bytes seen so far. + * + * On output, emit U+FEFF as the first code point. + * + * Variants: + * - UTF-16,version=1 (Java "Unicode" encoding) treats a missing BOM as an error. + * - UTF-16BE,version=1 (Java "UnicodeBig" encoding) and + * UTF-16LE,version=1 (Java "UnicodeLittle" encoding) treat a reverse BOM as an error. + */ +U_CDECL_BEGIN +static void U_CALLCONV +_UTF16Reset(UConverter *cnv, UConverterResetChoice choice) { + if(choice<=UCNV_RESET_TO_UNICODE) { + /* reset toUnicode: state=0 */ + cnv->mode=0; + } + if(choice!=UCNV_RESET_TO_UNICODE) { + /* reset fromUnicode: prepare to output the UTF-16PE BOM */ + cnv->fromUnicodeStatus=UCNV_NEED_TO_WRITE_BOM; + } +} +U_CDECL_END +extern const UConverterSharedData _UTF16v2Data; +U_CDECL_BEGIN +static void U_CALLCONV +_UTF16Open(UConverter *cnv, + UConverterLoadArgs *pArgs, + UErrorCode *pErrorCode) { + if(UCNV_GET_VERSION(cnv)<=2) { + if(UCNV_GET_VERSION(cnv)==2 && !pArgs->onlyTestIsLoadable) { + /* + * Switch implementation, and switch the staticData that's different + * and was copied into the UConverter. + * (See ucnv_createConverterFromSharedData() in ucnv_bld.c.) + * UTF-16,version=2 fromUnicode() always writes a big-endian byte stream. + */ + cnv->sharedData=(UConverterSharedData*)&_UTF16v2Data; + uprv_memcpy(cnv->subChars, _UTF16v2Data.staticData->subChar, UCNV_MAX_SUBCHAR_LEN); + } + _UTF16Reset(cnv, UCNV_RESET_BOTH); + } else { + *pErrorCode=U_ILLEGAL_ARGUMENT_ERROR; + } +} + +static const char * U_CALLCONV +_UTF16GetName(const UConverter *cnv) { + if(UCNV_GET_VERSION(cnv)==0) { + return "UTF-16"; + } else if(UCNV_GET_VERSION(cnv)==1) { + return "UTF-16,version=1"; + } else { + return "UTF-16,version=2"; + } +} +U_CDECL_END +extern const UConverterSharedData _UTF16Data; + +static inline bool IS_UTF16BE(const UConverter *cnv) { + return ((cnv)->sharedData == &_UTF16BEData); +} + +static inline bool IS_UTF16LE(const UConverter *cnv) { + return ((cnv)->sharedData == &_UTF16LEData); +} + +static inline bool IS_UTF16(const UConverter *cnv) { + return ((cnv)->sharedData==&_UTF16Data) || ((cnv)->sharedData == &_UTF16v2Data); +} + +U_CDECL_BEGIN +static void U_CALLCONV +_UTF16ToUnicodeWithOffsets(UConverterToUnicodeArgs *pArgs, + UErrorCode *pErrorCode) { + UConverter *cnv=pArgs->converter; + const char *source=pArgs->source; + const char *sourceLimit=pArgs->sourceLimit; + int32_t *offsets=pArgs->offsets; + + int32_t state, offsetDelta; + uint8_t b; + + state=cnv->mode; + + /* + * If we detect a BOM in this buffer, then we must add the BOM size to the + * offsets because the actual converter function will not see and count the BOM. + * offsetDelta will have the number of the BOM bytes that are in the current buffer. + */ + offsetDelta=0; + + while(sourcetoUBytes[0]=(uint8_t)*source++; + cnv->toULength=1; + state=1; + break; + case 1: + /* + * Only inside this switch case can the state variable + * temporarily take two additional values: + * 6: BOM error, continue with BE + * 7: BOM error, continue with LE + */ + b=*source; + if(cnv->toUBytes[0]==0xfe && b==0xff) { + if(IS_UTF16LE(cnv)) { + state=7; /* illegal reverse BOM for Java "UnicodeLittle" */ + } else { + state=8; /* detect UTF-16BE */ + } + } else if(cnv->toUBytes[0]==0xff && b==0xfe) { + if(IS_UTF16BE(cnv)) { + state=6; /* illegal reverse BOM for Java "UnicodeBig" */ + } else { + state=9; /* detect UTF-16LE */ + } + } else if((IS_UTF16(cnv) && UCNV_GET_VERSION(cnv)==1)) { + state=6; /* illegal missing BOM for Java "Unicode" */ + } + if(state>=8) { + /* BOM detected, consume it */ + ++source; + cnv->toULength=0; + offsetDelta=(int32_t)(source-pArgs->source); + } else if(state<6) { + /* ok: no BOM, and not a reverse BOM */ + if(source!=pArgs->source) { + /* reset the source for a correct first offset */ + source=pArgs->source; + cnv->toULength=0; + } + if(IS_UTF16LE(cnv)) { + /* Make Java "UnicodeLittle" default to LE. */ + state=9; + } else { + /* Make standard UTF-16 and Java "UnicodeBig" default to BE. */ + state=8; + } + } else { + /* + * error: missing BOM, or reverse BOM + * UTF-16,version=1: Java-specific "Unicode" requires a BOM. + * UTF-16BE,version=1: Java-specific "UnicodeBig" requires a BE BOM or no BOM. + * UTF-16LE,version=1: Java-specific "UnicodeLittle" requires an LE BOM or no BOM. + */ + /* report the non-BOM or reverse BOM as an illegal sequence */ + cnv->toUBytes[1]=b; + cnv->toULength=2; + pArgs->source=source+1; + /* continue with conversion if the callback resets the error */ + /* + * Make Java "Unicode" default to BE like standard UTF-16. + * Make Java "UnicodeBig" and "UnicodeLittle" default + * to their normal endiannesses. + */ + cnv->mode=state+2; + *pErrorCode=U_ILLEGAL_ESCAPE_SEQUENCE; + return; + } + /* convert the rest of the stream */ + cnv->mode=state; + continue; + case 8: + /* call UTF-16BE */ + pArgs->source=source; + _UTF16BEToUnicodeWithOffsets(pArgs, pErrorCode); + source=pArgs->source; + break; + case 9: + /* call UTF-16LE */ + pArgs->source=source; + _UTF16LEToUnicodeWithOffsets(pArgs, pErrorCode); + source=pArgs->source; + break; + default: + break; /* does not occur */ + } + } + + /* add BOM size to offsets - see comment at offsetDelta declaration */ + if(offsets!=NULL && offsetDelta!=0) { + int32_t *offsetsLimit=pArgs->offsets; + while(offsetssource=source; + + if(source==sourceLimit && pArgs->flush) { + /* handle truncated input */ + switch(state) { + case 0: + break; /* no input at all, nothing to do */ + case 8: + _UTF16BEToUnicodeWithOffsets(pArgs, pErrorCode); + break; + case 9: + _UTF16LEToUnicodeWithOffsets(pArgs, pErrorCode); + break; + default: + /* 0mode=state; +} + +static UChar32 U_CALLCONV +_UTF16GetNextUChar(UConverterToUnicodeArgs *pArgs, + UErrorCode *pErrorCode) { + switch(pArgs->converter->mode) { + case 8: + return _UTF16BEGetNextUChar(pArgs, pErrorCode); + case 9: + return _UTF16LEGetNextUChar(pArgs, pErrorCode); + default: + return UCNV_GET_NEXT_UCHAR_USE_TO_U; + } +} +U_CDECL_END + +static const UConverterImpl _UTF16Impl = { + UCNV_UTF16, + + NULL, + NULL, + + _UTF16Open, + NULL, + _UTF16Reset, + + _UTF16ToUnicodeWithOffsets, + _UTF16ToUnicodeWithOffsets, + _UTF16PEFromUnicodeWithOffsets, + _UTF16PEFromUnicodeWithOffsets, + _UTF16GetNextUChar, + + NULL, /* ### TODO implement getStarters for all Unicode encodings?! */ + _UTF16GetName, + NULL, + NULL, + ucnv_getNonSurrogateUnicodeSet, + + NULL, + NULL +}; + +static const UConverterStaticData _UTF16StaticData = { + sizeof(UConverterStaticData), + "UTF-16", + 1204, /* CCSID for BOM sensitive UTF-16 */ + UCNV_IBM, UCNV_UTF16, 2, 2, +#if U_IS_BIG_ENDIAN + { 0xff, 0xfd, 0, 0 }, 2, +#else + { 0xfd, 0xff, 0, 0 }, 2, +#endif + FALSE, FALSE, + 0, + 0, + { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 } /* reserved */ +}; + +const UConverterSharedData _UTF16Data = + UCNV_IMMUTABLE_SHARED_DATA_INITIALIZER(&_UTF16StaticData, &_UTF16Impl); + +static const UConverterImpl _UTF16v2Impl = { + UCNV_UTF16, + + NULL, + NULL, + + _UTF16Open, + NULL, + _UTF16Reset, + + _UTF16ToUnicodeWithOffsets, + _UTF16ToUnicodeWithOffsets, + _UTF16BEFromUnicodeWithOffsets, + _UTF16BEFromUnicodeWithOffsets, + _UTF16GetNextUChar, + + NULL, /* ### TODO implement getStarters for all Unicode encodings?! */ + _UTF16GetName, + NULL, + NULL, + ucnv_getNonSurrogateUnicodeSet, + + NULL, + NULL +}; + +static const UConverterStaticData _UTF16v2StaticData = { + sizeof(UConverterStaticData), + "UTF-16,version=2", + 1204, /* CCSID for BOM sensitive UTF-16 */ + UCNV_IBM, UCNV_UTF16, 2, 2, + { 0xff, 0xfd, 0, 0 }, 2, + FALSE, FALSE, + 0, + 0, + { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 } /* reserved */ +}; + +const UConverterSharedData _UTF16v2Data = + UCNV_IMMUTABLE_SHARED_DATA_INITIALIZER(&_UTF16v2StaticData, &_UTF16v2Impl); + +#endif diff --git a/Build/source/libs/icu/icu-src/source/common/ucnv_u32.c b/Build/source/libs/icu/icu-src/source/common/ucnv_u32.c deleted file mode 100644 index b0a0fe28529..00000000000 --- a/Build/source/libs/icu/icu-src/source/common/ucnv_u32.c +++ /dev/null @@ -1,1251 +0,0 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. -// License & terms of use: http://www.unicode.org/copyright.html -/* -********************************************************************** -* Copyright (C) 2002-2015, International Business Machines -* Corporation and others. All Rights Reserved. -********************************************************************** -* file name: ucnv_u32.c -* encoding: US-ASCII -* tab size: 8 (not used) -* indentation:4 -* -* created on: 2002jul01 -* created by: Markus W. Scherer -* -* UTF-32 converter implementation. Used to be in ucnv_utf.c. -*/ - -#include "unicode/utypes.h" - -#if !UCONFIG_NO_CONVERSION && !UCONFIG_ONLY_HTML_CONVERSION - -#include "unicode/ucnv.h" -#include "unicode/utf.h" -#include "ucnv_bld.h" -#include "ucnv_cnv.h" -#include "cmemory.h" - -#define MAXIMUM_UCS2 0x0000FFFF -#define MAXIMUM_UTF 0x0010FFFF -#define HALF_SHIFT 10 -#define HALF_BASE 0x0010000 -#define HALF_MASK 0x3FF -#define SURROGATE_HIGH_START 0xD800 -#define SURROGATE_LOW_START 0xDC00 - -/* -SURROGATE_LOW_START + HALF_BASE */ -#define SURROGATE_LOW_BASE 9216 - -enum { - UCNV_NEED_TO_WRITE_BOM=1 -}; - -/* UTF-32BE ----------------------------------------------------------------- */ - -static void -T_UConverter_toUnicode_UTF32_BE(UConverterToUnicodeArgs * args, - UErrorCode * err) -{ - const unsigned char *mySource = (unsigned char *) args->source; - UChar *myTarget = args->target; - const unsigned char *sourceLimit = (unsigned char *) args->sourceLimit; - const UChar *targetLimit = args->targetLimit; - unsigned char *toUBytes = args->converter->toUBytes; - uint32_t ch, i; - - /* Restore state of current sequence */ - if (args->converter->toUnicodeStatus && myTarget < targetLimit) { - i = args->converter->toULength; /* restore # of bytes consumed */ - args->converter->toULength = 0; - - ch = args->converter->toUnicodeStatus - 1;/*Stores the previously calculated ch from a previous call*/ - args->converter->toUnicodeStatus = 0; - goto morebytes; - } - - while (mySource < sourceLimit && myTarget < targetLimit) { - i = 0; - ch = 0; -morebytes: - while (i < sizeof(uint32_t)) { - if (mySource < sourceLimit) { - ch = (ch << 8) | (uint8_t)(*mySource); - toUBytes[i++] = (char) *(mySource++); - } - else { - /* stores a partially calculated target*/ - /* + 1 to make 0 a valid character */ - args->converter->toUnicodeStatus = ch + 1; - args->converter->toULength = (int8_t) i; - goto donefornow; - } - } - - if (ch <= MAXIMUM_UTF && !U_IS_SURROGATE(ch)) { - /* Normal valid byte when the loop has not prematurely terminated (i < inBytes) */ - if (ch <= MAXIMUM_UCS2) - { - /* fits in 16 bits */ - *(myTarget++) = (UChar) ch; - } - else { - /* write out the surrogates */ - *(myTarget++) = U16_LEAD(ch); - ch = U16_TRAIL(ch); - if (myTarget < targetLimit) { - *(myTarget++) = (UChar)ch; - } - else { - /* Put in overflow buffer (not handled here) */ - args->converter->UCharErrorBuffer[0] = (UChar) ch; - args->converter->UCharErrorBufferLength = 1; - *err = U_BUFFER_OVERFLOW_ERROR; - break; - } - } - } - else { - args->converter->toULength = (int8_t)i; - *err = U_ILLEGAL_CHAR_FOUND; - break; - } - } - -donefornow: - if (mySource < sourceLimit && myTarget >= targetLimit && U_SUCCESS(*err)) { - /* End of target buffer */ - *err = U_BUFFER_OVERFLOW_ERROR; - } - - args->target = myTarget; - args->source = (const char *) mySource; -} - -static void -T_UConverter_toUnicode_UTF32_BE_OFFSET_LOGIC(UConverterToUnicodeArgs * args, - UErrorCode * err) -{ - const unsigned char *mySource = (unsigned char *) args->source; - UChar *myTarget = args->target; - int32_t *myOffsets = args->offsets; - const unsigned char *sourceLimit = (unsigned char *) args->sourceLimit; - const UChar *targetLimit = args->targetLimit; - unsigned char *toUBytes = args->converter->toUBytes; - uint32_t ch, i; - int32_t offsetNum = 0; - - /* Restore state of current sequence */ - if (args->converter->toUnicodeStatus && myTarget < targetLimit) { - i = args->converter->toULength; /* restore # of bytes consumed */ - args->converter->toULength = 0; - - ch = args->converter->toUnicodeStatus - 1;/*Stores the previously calculated ch from a previous call*/ - args->converter->toUnicodeStatus = 0; - goto morebytes; - } - - while (mySource < sourceLimit && myTarget < targetLimit) { - i = 0; - ch = 0; -morebytes: - while (i < sizeof(uint32_t)) { - if (mySource < sourceLimit) { - ch = (ch << 8) | (uint8_t)(*mySource); - toUBytes[i++] = (char) *(mySource++); - } - else { - /* stores a partially calculated target*/ - /* + 1 to make 0 a valid character */ - args->converter->toUnicodeStatus = ch + 1; - args->converter->toULength = (int8_t) i; - goto donefornow; - } - } - - if (ch <= MAXIMUM_UTF && !U_IS_SURROGATE(ch)) { - /* Normal valid byte when the loop has not prematurely terminated (i < inBytes) */ - if (ch <= MAXIMUM_UCS2) { - /* fits in 16 bits */ - *(myTarget++) = (UChar) ch; - *(myOffsets++) = offsetNum; - } - else { - /* write out the surrogates */ - *(myTarget++) = U16_LEAD(ch); - *myOffsets++ = offsetNum; - ch = U16_TRAIL(ch); - if (myTarget < targetLimit) - { - *(myTarget++) = (UChar)ch; - *(myOffsets++) = offsetNum; - } - else { - /* Put in overflow buffer (not handled here) */ - args->converter->UCharErrorBuffer[0] = (UChar) ch; - args->converter->UCharErrorBufferLength = 1; - *err = U_BUFFER_OVERFLOW_ERROR; - break; - } - } - } - else { - args->converter->toULength = (int8_t)i; - *err = U_ILLEGAL_CHAR_FOUND; - break; - } - offsetNum += i; - } - -donefornow: - if (mySource < sourceLimit && myTarget >= targetLimit && U_SUCCESS(*err)) - { - /* End of target buffer */ - *err = U_BUFFER_OVERFLOW_ERROR; - } - - args->target = myTarget; - args->source = (const char *) mySource; - args->offsets = myOffsets; -} - -static void -T_UConverter_fromUnicode_UTF32_BE(UConverterFromUnicodeArgs * args, - UErrorCode * err) -{ - const UChar *mySource = args->source; - unsigned char *myTarget; - const UChar *sourceLimit = args->sourceLimit; - const unsigned char *targetLimit = (unsigned char *) args->targetLimit; - UChar32 ch, ch2; - unsigned int indexToWrite; - unsigned char temp[sizeof(uint32_t)]; - - if(mySource >= sourceLimit) { - /* no input, nothing to do */ - return; - } - - /* write the BOM if necessary */ - if(args->converter->fromUnicodeStatus==UCNV_NEED_TO_WRITE_BOM) { - static const char bom[]={ 0, 0, (char)0xfe, (char)0xff }; - ucnv_fromUWriteBytes(args->converter, - bom, 4, - &args->target, args->targetLimit, - &args->offsets, -1, - err); - args->converter->fromUnicodeStatus=0; - } - - myTarget = (unsigned char *) args->target; - temp[0] = 0; - - if (args->converter->fromUChar32) { - ch = args->converter->fromUChar32; - args->converter->fromUChar32 = 0; - goto lowsurogate; - } - - while (mySource < sourceLimit && myTarget < targetLimit) { - ch = *(mySource++); - - if (U_IS_SURROGATE(ch)) { - if (U_IS_LEAD(ch)) { -lowsurogate: - if (mySource < sourceLimit) { - ch2 = *mySource; - if (U_IS_TRAIL(ch2)) { - ch = ((ch - SURROGATE_HIGH_START) << HALF_SHIFT) + ch2 + SURROGATE_LOW_BASE; - mySource++; - } - else { - /* this is an unmatched trail code unit (2nd surrogate) */ - /* callback(illegal) */ - args->converter->fromUChar32 = ch; - *err = U_ILLEGAL_CHAR_FOUND; - break; - } - } - else { - /* ran out of source */ - args->converter->fromUChar32 = ch; - if (args->flush) { - /* this is an unmatched trail code unit (2nd surrogate) */ - /* callback(illegal) */ - *err = U_ILLEGAL_CHAR_FOUND; - } - break; - } - } - else { - /* this is an unmatched trail code unit (2nd surrogate) */ - /* callback(illegal) */ - args->converter->fromUChar32 = ch; - *err = U_ILLEGAL_CHAR_FOUND; - break; - } - } - - /* We cannot get any larger than 10FFFF because we are coming from UTF-16 */ - temp[1] = (uint8_t) (ch >> 16 & 0x1F); - temp[2] = (uint8_t) (ch >> 8); /* unsigned cast implicitly does (ch & FF) */ - temp[3] = (uint8_t) (ch); /* unsigned cast implicitly does (ch & FF) */ - - for (indexToWrite = 0; indexToWrite <= sizeof(uint32_t) - 1; indexToWrite++) { - if (myTarget < targetLimit) { - *(myTarget++) = temp[indexToWrite]; - } - else { - args->converter->charErrorBuffer[args->converter->charErrorBufferLength++] = temp[indexToWrite]; - *err = U_BUFFER_OVERFLOW_ERROR; - } - } - } - - if (mySource < sourceLimit && myTarget >= targetLimit && U_SUCCESS(*err)) { - *err = U_BUFFER_OVERFLOW_ERROR; - } - - args->target = (char *) myTarget; - args->source = mySource; -} - -static void -T_UConverter_fromUnicode_UTF32_BE_OFFSET_LOGIC(UConverterFromUnicodeArgs * args, - UErrorCode * err) -{ - const UChar *mySource = args->source; - unsigned char *myTarget; - int32_t *myOffsets; - const UChar *sourceLimit = args->sourceLimit; - const unsigned char *targetLimit = (unsigned char *) args->targetLimit; - UChar32 ch, ch2; - int32_t offsetNum = 0; - unsigned int indexToWrite; - unsigned char temp[sizeof(uint32_t)]; - - if(mySource >= sourceLimit) { - /* no input, nothing to do */ - return; - } - - /* write the BOM if necessary */ - if(args->converter->fromUnicodeStatus==UCNV_NEED_TO_WRITE_BOM) { - static const char bom[]={ 0, 0, (char)0xfe, (char)0xff }; - ucnv_fromUWriteBytes(args->converter, - bom, 4, - &args->target, args->targetLimit, - &args->offsets, -1, - err); - args->converter->fromUnicodeStatus=0; - } - - myTarget = (unsigned char *) args->target; - myOffsets = args->offsets; - temp[0] = 0; - - if (args->converter->fromUChar32) { - ch = args->converter->fromUChar32; - args->converter->fromUChar32 = 0; - goto lowsurogate; - } - - while (mySource < sourceLimit && myTarget < targetLimit) { - ch = *(mySource++); - - if (U_IS_SURROGATE(ch)) { - if (U_IS_LEAD(ch)) { -lowsurogate: - if (mySource < sourceLimit) { - ch2 = *mySource; - if (U_IS_TRAIL(ch2)) { - ch = ((ch - SURROGATE_HIGH_START) << HALF_SHIFT) + ch2 + SURROGATE_LOW_BASE; - mySource++; - } - else { - /* this is an unmatched trail code unit (2nd surrogate) */ - /* callback(illegal) */ - args->converter->fromUChar32 = ch; - *err = U_ILLEGAL_CHAR_FOUND; - break; - } - } - else { - /* ran out of source */ - args->converter->fromUChar32 = ch; - if (args->flush) { - /* this is an unmatched trail code unit (2nd surrogate) */ - /* callback(illegal) */ - *err = U_ILLEGAL_CHAR_FOUND; - } - break; - } - } - else { - /* this is an unmatched trail code unit (2nd surrogate) */ - /* callback(illegal) */ - args->converter->fromUChar32 = ch; - *err = U_ILLEGAL_CHAR_FOUND; - break; - } - } - - /* We cannot get any larger than 10FFFF because we are coming from UTF-16 */ - temp[1] = (uint8_t) (ch >> 16 & 0x1F); - temp[2] = (uint8_t) (ch >> 8); /* unsigned cast implicitly does (ch & FF) */ - temp[3] = (uint8_t) (ch); /* unsigned cast implicitly does (ch & FF) */ - - for (indexToWrite = 0; indexToWrite <= sizeof(uint32_t) - 1; indexToWrite++) { - if (myTarget < targetLimit) { - *(myTarget++) = temp[indexToWrite]; - *(myOffsets++) = offsetNum; - } - else { - args->converter->charErrorBuffer[args->converter->charErrorBufferLength++] = temp[indexToWrite]; - *err = U_BUFFER_OVERFLOW_ERROR; - } - } - offsetNum = offsetNum + 1 + (temp[1] != 0); - } - - if (mySource < sourceLimit && myTarget >= targetLimit && U_SUCCESS(*err)) { - *err = U_BUFFER_OVERFLOW_ERROR; - } - - args->target = (char *) myTarget; - args->source = mySource; - args->offsets = myOffsets; -} - -static UChar32 -T_UConverter_getNextUChar_UTF32_BE(UConverterToUnicodeArgs* args, - UErrorCode* err) -{ - const uint8_t *mySource; - UChar32 myUChar; - int32_t length; - - mySource = (const uint8_t *)args->source; - if (mySource >= (const uint8_t *)args->sourceLimit) - { - /* no input */ - *err = U_INDEX_OUTOFBOUNDS_ERROR; - return 0xffff; - } - - length = (int32_t)((const uint8_t *)args->sourceLimit - mySource); - if (length < 4) - { - /* got a partial character */ - uprv_memcpy(args->converter->toUBytes, mySource, length); - args->converter->toULength = (int8_t)length; - args->source = (const char *)(mySource + length); - *err = U_TRUNCATED_CHAR_FOUND; - return 0xffff; - } - - /* Don't even try to do a direct cast because the value may be on an odd address. */ - myUChar = ((UChar32)mySource[0] << 24) - | ((UChar32)mySource[1] << 16) - | ((UChar32)mySource[2] << 8) - | ((UChar32)mySource[3]); - - args->source = (const char *)(mySource + 4); - if ((uint32_t)myUChar <= MAXIMUM_UTF && !U_IS_SURROGATE(myUChar)) { - return myUChar; - } - - uprv_memcpy(args->converter->toUBytes, mySource, 4); - args->converter->toULength = 4; - - *err = U_ILLEGAL_CHAR_FOUND; - return 0xffff; -} - -static const UConverterImpl _UTF32BEImpl = { - UCNV_UTF32_BigEndian, - - NULL, - NULL, - - NULL, - NULL, - NULL, - - T_UConverter_toUnicode_UTF32_BE, - T_UConverter_toUnicode_UTF32_BE_OFFSET_LOGIC, - T_UConverter_fromUnicode_UTF32_BE, - T_UConverter_fromUnicode_UTF32_BE_OFFSET_LOGIC, - T_UConverter_getNextUChar_UTF32_BE, - - NULL, - NULL, - NULL, - NULL, - ucnv_getNonSurrogateUnicodeSet, - - NULL, - NULL -}; - -/* The 1232 CCSID refers to any version of Unicode with any endianess of UTF-32 */ -static const UConverterStaticData _UTF32BEStaticData = { - sizeof(UConverterStaticData), - "UTF-32BE", - 1232, - UCNV_IBM, UCNV_UTF32_BigEndian, 4, 4, - { 0, 0, 0xff, 0xfd }, 4, FALSE, FALSE, - 0, - 0, - { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 } /* reserved */ -}; - -const UConverterSharedData _UTF32BEData = - UCNV_IMMUTABLE_SHARED_DATA_INITIALIZER(&_UTF32BEStaticData, &_UTF32BEImpl); - -/* UTF-32LE ---------------------------------------------------------- */ - -static void -T_UConverter_toUnicode_UTF32_LE(UConverterToUnicodeArgs * args, - UErrorCode * err) -{ - const unsigned char *mySource = (unsigned char *) args->source; - UChar *myTarget = args->target; - const unsigned char *sourceLimit = (unsigned char *) args->sourceLimit; - const UChar *targetLimit = args->targetLimit; - unsigned char *toUBytes = args->converter->toUBytes; - uint32_t ch, i; - - /* Restore state of current sequence */ - if (args->converter->toUnicodeStatus && myTarget < targetLimit) - { - i = args->converter->toULength; /* restore # of bytes consumed */ - args->converter->toULength = 0; - - /* Stores the previously calculated ch from a previous call*/ - ch = args->converter->toUnicodeStatus - 1; - args->converter->toUnicodeStatus = 0; - goto morebytes; - } - - while (mySource < sourceLimit && myTarget < targetLimit) - { - i = 0; - ch = 0; -morebytes: - while (i < sizeof(uint32_t)) - { - if (mySource < sourceLimit) - { - ch |= ((uint8_t)(*mySource)) << (i * 8); - toUBytes[i++] = (char) *(mySource++); - } - else - { - /* stores a partially calculated target*/ - /* + 1 to make 0 a valid character */ - args->converter->toUnicodeStatus = ch + 1; - args->converter->toULength = (int8_t) i; - goto donefornow; - } - } - - if (ch <= MAXIMUM_UTF && !U_IS_SURROGATE(ch)) { - /* Normal valid byte when the loop has not prematurely terminated (i < inBytes) */ - if (ch <= MAXIMUM_UCS2) { - /* fits in 16 bits */ - *(myTarget++) = (UChar) ch; - } - else { - /* write out the surrogates */ - *(myTarget++) = U16_LEAD(ch); - ch = U16_TRAIL(ch); - if (myTarget < targetLimit) { - *(myTarget++) = (UChar)ch; - } - else { - /* Put in overflow buffer (not handled here) */ - args->converter->UCharErrorBuffer[0] = (UChar) ch; - args->converter->UCharErrorBufferLength = 1; - *err = U_BUFFER_OVERFLOW_ERROR; - break; - } - } - } - else { - args->converter->toULength = (int8_t)i; - *err = U_ILLEGAL_CHAR_FOUND; - break; - } - } - -donefornow: - if (mySource < sourceLimit && myTarget >= targetLimit && U_SUCCESS(*err)) - { - /* End of target buffer */ - *err = U_BUFFER_OVERFLOW_ERROR; - } - - args->target = myTarget; - args->source = (const char *) mySource; -} - -static void -T_UConverter_toUnicode_UTF32_LE_OFFSET_LOGIC(UConverterToUnicodeArgs * args, - UErrorCode * err) -{ - const unsigned char *mySource = (unsigned char *) args->source; - UChar *myTarget = args->target; - int32_t *myOffsets = args->offsets; - const unsigned char *sourceLimit = (unsigned char *) args->sourceLimit; - const UChar *targetLimit = args->targetLimit; - unsigned char *toUBytes = args->converter->toUBytes; - uint32_t ch, i; - int32_t offsetNum = 0; - - /* Restore state of current sequence */ - if (args->converter->toUnicodeStatus && myTarget < targetLimit) - { - i = args->converter->toULength; /* restore # of bytes consumed */ - args->converter->toULength = 0; - - /* Stores the previously calculated ch from a previous call*/ - ch = args->converter->toUnicodeStatus - 1; - args->converter->toUnicodeStatus = 0; - goto morebytes; - } - - while (mySource < sourceLimit && myTarget < targetLimit) - { - i = 0; - ch = 0; -morebytes: - while (i < sizeof(uint32_t)) - { - if (mySource < sourceLimit) - { - ch |= ((uint8_t)(*mySource)) << (i * 8); - toUBytes[i++] = (char) *(mySource++); - } - else - { - /* stores a partially calculated target*/ - /* + 1 to make 0 a valid character */ - args->converter->toUnicodeStatus = ch + 1; - args->converter->toULength = (int8_t) i; - goto donefornow; - } - } - - if (ch <= MAXIMUM_UTF && !U_IS_SURROGATE(ch)) - { - /* Normal valid byte when the loop has not prematurely terminated (i < inBytes) */ - if (ch <= MAXIMUM_UCS2) - { - /* fits in 16 bits */ - *(myTarget++) = (UChar) ch; - *(myOffsets++) = offsetNum; - } - else { - /* write out the surrogates */ - *(myTarget++) = U16_LEAD(ch); - *(myOffsets++) = offsetNum; - ch = U16_TRAIL(ch); - if (myTarget < targetLimit) - { - *(myTarget++) = (UChar)ch; - *(myOffsets++) = offsetNum; - } - else - { - /* Put in overflow buffer (not handled here) */ - args->converter->UCharErrorBuffer[0] = (UChar) ch; - args->converter->UCharErrorBufferLength = 1; - *err = U_BUFFER_OVERFLOW_ERROR; - break; - } - } - } - else - { - args->converter->toULength = (int8_t)i; - *err = U_ILLEGAL_CHAR_FOUND; - break; - } - offsetNum += i; - } - -donefornow: - if (mySource < sourceLimit && myTarget >= targetLimit && U_SUCCESS(*err)) - { - /* End of target buffer */ - *err = U_BUFFER_OVERFLOW_ERROR; - } - - args->target = myTarget; - args->source = (const char *) mySource; - args->offsets = myOffsets; -} - -static void -T_UConverter_fromUnicode_UTF32_LE(UConverterFromUnicodeArgs * args, - UErrorCode * err) -{ - const UChar *mySource = args->source; - unsigned char *myTarget; - const UChar *sourceLimit = args->sourceLimit; - const unsigned char *targetLimit = (unsigned char *) args->targetLimit; - UChar32 ch, ch2; - unsigned int indexToWrite; - unsigned char temp[sizeof(uint32_t)]; - - if(mySource >= sourceLimit) { - /* no input, nothing to do */ - return; - } - - /* write the BOM if necessary */ - if(args->converter->fromUnicodeStatus==UCNV_NEED_TO_WRITE_BOM) { - static const char bom[]={ (char)0xff, (char)0xfe, 0, 0 }; - ucnv_fromUWriteBytes(args->converter, - bom, 4, - &args->target, args->targetLimit, - &args->offsets, -1, - err); - args->converter->fromUnicodeStatus=0; - } - - myTarget = (unsigned char *) args->target; - temp[3] = 0; - - if (args->converter->fromUChar32) - { - ch = args->converter->fromUChar32; - args->converter->fromUChar32 = 0; - goto lowsurogate; - } - - while (mySource < sourceLimit && myTarget < targetLimit) - { - ch = *(mySource++); - - if (U16_IS_SURROGATE(ch)) { - if (U16_IS_LEAD(ch)) - { -lowsurogate: - if (mySource < sourceLimit) - { - ch2 = *mySource; - if (U16_IS_TRAIL(ch2)) { - ch = ((ch - SURROGATE_HIGH_START) << HALF_SHIFT) + ch2 + SURROGATE_LOW_BASE; - mySource++; - } - else { - /* this is an unmatched trail code unit (2nd surrogate) */ - /* callback(illegal) */ - args->converter->fromUChar32 = ch; - *err = U_ILLEGAL_CHAR_FOUND; - break; - } - } - else { - /* ran out of source */ - args->converter->fromUChar32 = ch; - if (args->flush) { - /* this is an unmatched trail code unit (2nd surrogate) */ - /* callback(illegal) */ - *err = U_ILLEGAL_CHAR_FOUND; - } - break; - } - } - else { - /* this is an unmatched trail code unit (2nd surrogate) */ - /* callback(illegal) */ - args->converter->fromUChar32 = ch; - *err = U_ILLEGAL_CHAR_FOUND; - break; - } - } - - /* We cannot get any larger than 10FFFF because we are coming from UTF-16 */ - temp[2] = (uint8_t) (ch >> 16 & 0x1F); - temp[1] = (uint8_t) (ch >> 8); /* unsigned cast implicitly does (ch & FF) */ - temp[0] = (uint8_t) (ch); /* unsigned cast implicitly does (ch & FF) */ - - for (indexToWrite = 0; indexToWrite <= sizeof(uint32_t) - 1; indexToWrite++) - { - if (myTarget < targetLimit) - { - *(myTarget++) = temp[indexToWrite]; - } - else - { - args->converter->charErrorBuffer[args->converter->charErrorBufferLength++] = temp[indexToWrite]; - *err = U_BUFFER_OVERFLOW_ERROR; - } - } - } - - if (mySource < sourceLimit && myTarget >= targetLimit && U_SUCCESS(*err)) - { - *err = U_BUFFER_OVERFLOW_ERROR; - } - - args->target = (char *) myTarget; - args->source = mySource; -} - -static void -T_UConverter_fromUnicode_UTF32_LE_OFFSET_LOGIC(UConverterFromUnicodeArgs * args, - UErrorCode * err) -{ - const UChar *mySource = args->source; - unsigned char *myTarget; - int32_t *myOffsets; - const UChar *sourceLimit = args->sourceLimit; - const unsigned char *targetLimit = (unsigned char *) args->targetLimit; - UChar32 ch, ch2; - unsigned int indexToWrite; - unsigned char temp[sizeof(uint32_t)]; - int32_t offsetNum = 0; - - if(mySource >= sourceLimit) { - /* no input, nothing to do */ - return; - } - - /* write the BOM if necessary */ - if(args->converter->fromUnicodeStatus==UCNV_NEED_TO_WRITE_BOM) { - static const char bom[]={ (char)0xff, (char)0xfe, 0, 0 }; - ucnv_fromUWriteBytes(args->converter, - bom, 4, - &args->target, args->targetLimit, - &args->offsets, -1, - err); - args->converter->fromUnicodeStatus=0; - } - - myTarget = (unsigned char *) args->target; - myOffsets = args->offsets; - temp[3] = 0; - - if (args->converter->fromUChar32) - { - ch = args->converter->fromUChar32; - args->converter->fromUChar32 = 0; - goto lowsurogate; - } - - while (mySource < sourceLimit && myTarget < targetLimit) - { - ch = *(mySource++); - - if (U16_IS_SURROGATE(ch)) { - if (U16_IS_LEAD(ch)) - { -lowsurogate: - if (mySource < sourceLimit) - { - ch2 = *mySource; - if (U16_IS_TRAIL(ch2)) - { - ch = ((ch - SURROGATE_HIGH_START) << HALF_SHIFT) + ch2 + SURROGATE_LOW_BASE; - mySource++; - } - else { - /* this is an unmatched trail code unit (2nd surrogate) */ - /* callback(illegal) */ - args->converter->fromUChar32 = ch; - *err = U_ILLEGAL_CHAR_FOUND; - break; - } - } - else { - /* ran out of source */ - args->converter->fromUChar32 = ch; - if (args->flush) { - /* this is an unmatched trail code unit (2nd surrogate) */ - /* callback(illegal) */ - *err = U_ILLEGAL_CHAR_FOUND; - } - break; - } - } - else { - /* this is an unmatched trail code unit (2nd surrogate) */ - /* callback(illegal) */ - args->converter->fromUChar32 = ch; - *err = U_ILLEGAL_CHAR_FOUND; - break; - } - } - - /* We cannot get any larger than 10FFFF because we are coming from UTF-16 */ - temp[2] = (uint8_t) (ch >> 16 & 0x1F); - temp[1] = (uint8_t) (ch >> 8); /* unsigned cast implicitly does (ch & FF) */ - temp[0] = (uint8_t) (ch); /* unsigned cast implicitly does (ch & FF) */ - - for (indexToWrite = 0; indexToWrite <= sizeof(uint32_t) - 1; indexToWrite++) - { - if (myTarget < targetLimit) - { - *(myTarget++) = temp[indexToWrite]; - *(myOffsets++) = offsetNum; - } - else - { - args->converter->charErrorBuffer[args->converter->charErrorBufferLength++] = temp[indexToWrite]; - *err = U_BUFFER_OVERFLOW_ERROR; - } - } - offsetNum = offsetNum + 1 + (temp[2] != 0); - } - - if (mySource < sourceLimit && myTarget >= targetLimit && U_SUCCESS(*err)) - { - *err = U_BUFFER_OVERFLOW_ERROR; - } - - args->target = (char *) myTarget; - args->source = mySource; - args->offsets = myOffsets; -} - -static UChar32 -T_UConverter_getNextUChar_UTF32_LE(UConverterToUnicodeArgs* args, - UErrorCode* err) -{ - const uint8_t *mySource; - UChar32 myUChar; - int32_t length; - - mySource = (const uint8_t *)args->source; - if (mySource >= (const uint8_t *)args->sourceLimit) - { - /* no input */ - *err = U_INDEX_OUTOFBOUNDS_ERROR; - return 0xffff; - } - - length = (int32_t)((const uint8_t *)args->sourceLimit - mySource); - if (length < 4) - { - /* got a partial character */ - uprv_memcpy(args->converter->toUBytes, mySource, length); - args->converter->toULength = (int8_t)length; - args->source = (const char *)(mySource + length); - *err = U_TRUNCATED_CHAR_FOUND; - return 0xffff; - } - - /* Don't even try to do a direct cast because the value may be on an odd address. */ - myUChar = ((UChar32)mySource[3] << 24) - | ((UChar32)mySource[2] << 16) - | ((UChar32)mySource[1] << 8) - | ((UChar32)mySource[0]); - - args->source = (const char *)(mySource + 4); - if ((uint32_t)myUChar <= MAXIMUM_UTF && !U_IS_SURROGATE(myUChar)) { - return myUChar; - } - - uprv_memcpy(args->converter->toUBytes, mySource, 4); - args->converter->toULength = 4; - - *err = U_ILLEGAL_CHAR_FOUND; - return 0xffff; -} - -static const UConverterImpl _UTF32LEImpl = { - UCNV_UTF32_LittleEndian, - - NULL, - NULL, - - NULL, - NULL, - NULL, - - T_UConverter_toUnicode_UTF32_LE, - T_UConverter_toUnicode_UTF32_LE_OFFSET_LOGIC, - T_UConverter_fromUnicode_UTF32_LE, - T_UConverter_fromUnicode_UTF32_LE_OFFSET_LOGIC, - T_UConverter_getNextUChar_UTF32_LE, - - NULL, - NULL, - NULL, - NULL, - ucnv_getNonSurrogateUnicodeSet, - - NULL, - NULL -}; - -/* The 1232 CCSID refers to any version of Unicode with any endianess of UTF-32 */ -static const UConverterStaticData _UTF32LEStaticData = { - sizeof(UConverterStaticData), - "UTF-32LE", - 1234, - UCNV_IBM, UCNV_UTF32_LittleEndian, 4, 4, - { 0xfd, 0xff, 0, 0 }, 4, FALSE, FALSE, - 0, - 0, - { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 } /* reserved */ -}; - - -const UConverterSharedData _UTF32LEData = - UCNV_IMMUTABLE_SHARED_DATA_INITIALIZER(&_UTF32LEStaticData, &_UTF32LEImpl); - -/* UTF-32 (Detect BOM) ------------------------------------------------------ */ - -/* - * Detect a BOM at the beginning of the stream and select UTF-32BE or UTF-32LE - * accordingly. - * - * State values: - * 0 initial state - * 1 saw 00 - * 2 saw 00 00 - * 3 saw 00 00 FE - * 4 - - * 5 saw FF - * 6 saw FF FE - * 7 saw FF FE 00 - * 8 UTF-32BE mode - * 9 UTF-32LE mode - * - * During detection: state&3==number of matching bytes so far. - * - * On output, emit U+FEFF as the first code point. - */ - -static void -_UTF32Reset(UConverter *cnv, UConverterResetChoice choice) { - if(choice<=UCNV_RESET_TO_UNICODE) { - /* reset toUnicode: state=0 */ - cnv->mode=0; - } - if(choice!=UCNV_RESET_TO_UNICODE) { - /* reset fromUnicode: prepare to output the UTF-32PE BOM */ - cnv->fromUnicodeStatus=UCNV_NEED_TO_WRITE_BOM; - } -} - -static void -_UTF32Open(UConverter *cnv, - UConverterLoadArgs *pArgs, - UErrorCode *pErrorCode) { - _UTF32Reset(cnv, UCNV_RESET_BOTH); -} - -static const char utf32BOM[8]={ 0, 0, (char)0xfe, (char)0xff, (char)0xff, (char)0xfe, 0, 0 }; - -static void -_UTF32ToUnicodeWithOffsets(UConverterToUnicodeArgs *pArgs, - UErrorCode *pErrorCode) { - UConverter *cnv=pArgs->converter; - const char *source=pArgs->source; - const char *sourceLimit=pArgs->sourceLimit; - int32_t *offsets=pArgs->offsets; - - int32_t state, offsetDelta; - char b; - - state=cnv->mode; - - /* - * If we detect a BOM in this buffer, then we must add the BOM size to the - * offsets because the actual converter function will not see and count the BOM. - * offsetDelta will have the number of the BOM bytes that are in the current buffer. - */ - offsetDelta=0; - - while(sourcesource); - } else if(state==8) { - state=9; /* detect UTF-32LE */ - offsetDelta=(int32_t)(source-pArgs->source); - } - } else { - /* switch to UTF-32BE and pass the previous bytes */ - int32_t count=(int32_t)(source-pArgs->source); /* number of bytes from this buffer */ - - /* reset the source */ - source=pArgs->source; - - if(count==(state&3)) { - /* simple: all in the same buffer, just reset source */ - } else { - UBool oldFlush=pArgs->flush; - - /* some of the bytes are from a previous buffer, replay those first */ - pArgs->source=utf32BOM+(state&4); /* select the correct BOM */ - pArgs->sourceLimit=pArgs->source+((state&3)-count); /* replay previous bytes */ - pArgs->flush=FALSE; /* this sourceLimit is not the real source stream limit */ - - /* no offsets: bytes from previous buffer, and not enough for output */ - T_UConverter_toUnicode_UTF32_BE(pArgs, pErrorCode); - - /* restore real pointers; pArgs->source will be set in case 8/9 */ - pArgs->sourceLimit=sourceLimit; - pArgs->flush=oldFlush; - } - state=8; - continue; - } - break; - case 8: - /* call UTF-32BE */ - pArgs->source=source; - if(offsets==NULL) { - T_UConverter_toUnicode_UTF32_BE(pArgs, pErrorCode); - } else { - T_UConverter_toUnicode_UTF32_BE_OFFSET_LOGIC(pArgs, pErrorCode); - } - source=pArgs->source; - break; - case 9: - /* call UTF-32LE */ - pArgs->source=source; - if(offsets==NULL) { - T_UConverter_toUnicode_UTF32_LE(pArgs, pErrorCode); - } else { - T_UConverter_toUnicode_UTF32_LE_OFFSET_LOGIC(pArgs, pErrorCode); - } - source=pArgs->source; - break; - default: - break; /* does not occur */ - } - } - - /* add BOM size to offsets - see comment at offsetDelta declaration */ - if(offsets!=NULL && offsetDelta!=0) { - int32_t *offsetsLimit=pArgs->offsets; - while(offsetssource=source; - - if(source==sourceLimit && pArgs->flush) { - /* handle truncated input */ - switch(state) { - case 0: - break; /* no input at all, nothing to do */ - case 8: - T_UConverter_toUnicode_UTF32_BE(pArgs, pErrorCode); - break; - case 9: - T_UConverter_toUnicode_UTF32_LE(pArgs, pErrorCode); - break; - default: - /* handle 0source=utf32BOM+(state&4); /* select the correct BOM */ - pArgs->sourceLimit=pArgs->source+(state&3); /* replay bytes */ - - /* no offsets: not enough for output */ - T_UConverter_toUnicode_UTF32_BE(pArgs, pErrorCode); - pArgs->source=source; - pArgs->sourceLimit=sourceLimit; - state=8; - break; - } - } - - cnv->mode=state; -} - -static UChar32 -_UTF32GetNextUChar(UConverterToUnicodeArgs *pArgs, - UErrorCode *pErrorCode) { - switch(pArgs->converter->mode) { - case 8: - return T_UConverter_getNextUChar_UTF32_BE(pArgs, pErrorCode); - case 9: - return T_UConverter_getNextUChar_UTF32_LE(pArgs, pErrorCode); - default: - return UCNV_GET_NEXT_UCHAR_USE_TO_U; - } -} - -static const UConverterImpl _UTF32Impl = { - UCNV_UTF32, - - NULL, - NULL, - - _UTF32Open, - NULL, - _UTF32Reset, - - _UTF32ToUnicodeWithOffsets, - _UTF32ToUnicodeWithOffsets, -#if U_IS_BIG_ENDIAN - T_UConverter_fromUnicode_UTF32_BE, - T_UConverter_fromUnicode_UTF32_BE_OFFSET_LOGIC, -#else - T_UConverter_fromUnicode_UTF32_LE, - T_UConverter_fromUnicode_UTF32_LE_OFFSET_LOGIC, -#endif - _UTF32GetNextUChar, - - NULL, /* ### TODO implement getStarters for all Unicode encodings?! */ - NULL, - NULL, - NULL, - ucnv_getNonSurrogateUnicodeSet, - - NULL, - NULL -}; - -/* The 1236 CCSID refers to any version of Unicode with a BOM sensitive endianess of UTF-32 */ -static const UConverterStaticData _UTF32StaticData = { - sizeof(UConverterStaticData), - "UTF-32", - 1236, - UCNV_IBM, UCNV_UTF32, 4, 4, -#if U_IS_BIG_ENDIAN - { 0, 0, 0xff, 0xfd }, 4, -#else - { 0xfd, 0xff, 0, 0 }, 4, -#endif - FALSE, FALSE, - 0, - 0, - { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 } /* reserved */ -}; - -const UConverterSharedData _UTF32Data = - UCNV_IMMUTABLE_SHARED_DATA_INITIALIZER(&_UTF32StaticData, &_UTF32Impl); - -#endif diff --git a/Build/source/libs/icu/icu-src/source/common/ucnv_u32.cpp b/Build/source/libs/icu/icu-src/source/common/ucnv_u32.cpp new file mode 100644 index 00000000000..e1b755ab7f2 --- /dev/null +++ b/Build/source/libs/icu/icu-src/source/common/ucnv_u32.cpp @@ -0,0 +1,1253 @@ +// © 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html +/* +********************************************************************** +* Copyright (C) 2002-2015, International Business Machines +* Corporation and others. All Rights Reserved. +********************************************************************** +* file name: ucnv_u32.c +* encoding: UTF-8 +* tab size: 8 (not used) +* indentation:4 +* +* created on: 2002jul01 +* created by: Markus W. Scherer +* +* UTF-32 converter implementation. Used to be in ucnv_utf.c. +*/ + +#include "unicode/utypes.h" + +#if !UCONFIG_NO_CONVERSION && !UCONFIG_ONLY_HTML_CONVERSION + +#include "unicode/ucnv.h" +#include "unicode/utf.h" +#include "ucnv_bld.h" +#include "ucnv_cnv.h" +#include "cmemory.h" + +#define MAXIMUM_UCS2 0x0000FFFF +#define MAXIMUM_UTF 0x0010FFFF +#define HALF_SHIFT 10 +#define HALF_BASE 0x0010000 +#define HALF_MASK 0x3FF +#define SURROGATE_HIGH_START 0xD800 +#define SURROGATE_LOW_START 0xDC00 + +/* -SURROGATE_LOW_START + HALF_BASE */ +#define SURROGATE_LOW_BASE 9216 + +enum { + UCNV_NEED_TO_WRITE_BOM=1 +}; + +/* UTF-32BE ----------------------------------------------------------------- */ +U_CDECL_BEGIN +static void U_CALLCONV +T_UConverter_toUnicode_UTF32_BE(UConverterToUnicodeArgs * args, + UErrorCode * err) +{ + const unsigned char *mySource = (unsigned char *) args->source; + UChar *myTarget = args->target; + const unsigned char *sourceLimit = (unsigned char *) args->sourceLimit; + const UChar *targetLimit = args->targetLimit; + unsigned char *toUBytes = args->converter->toUBytes; + uint32_t ch, i; + + /* Restore state of current sequence */ + if (args->converter->toUnicodeStatus && myTarget < targetLimit) { + i = args->converter->toULength; /* restore # of bytes consumed */ + args->converter->toULength = 0; + + ch = args->converter->toUnicodeStatus - 1;/*Stores the previously calculated ch from a previous call*/ + args->converter->toUnicodeStatus = 0; + goto morebytes; + } + + while (mySource < sourceLimit && myTarget < targetLimit) { + i = 0; + ch = 0; +morebytes: + while (i < sizeof(uint32_t)) { + if (mySource < sourceLimit) { + ch = (ch << 8) | (uint8_t)(*mySource); + toUBytes[i++] = (char) *(mySource++); + } + else { + /* stores a partially calculated target*/ + /* + 1 to make 0 a valid character */ + args->converter->toUnicodeStatus = ch + 1; + args->converter->toULength = (int8_t) i; + goto donefornow; + } + } + + if (ch <= MAXIMUM_UTF && !U_IS_SURROGATE(ch)) { + /* Normal valid byte when the loop has not prematurely terminated (i < inBytes) */ + if (ch <= MAXIMUM_UCS2) + { + /* fits in 16 bits */ + *(myTarget++) = (UChar) ch; + } + else { + /* write out the surrogates */ + *(myTarget++) = U16_LEAD(ch); + ch = U16_TRAIL(ch); + if (myTarget < targetLimit) { + *(myTarget++) = (UChar)ch; + } + else { + /* Put in overflow buffer (not handled here) */ + args->converter->UCharErrorBuffer[0] = (UChar) ch; + args->converter->UCharErrorBufferLength = 1; + *err = U_BUFFER_OVERFLOW_ERROR; + break; + } + } + } + else { + args->converter->toULength = (int8_t)i; + *err = U_ILLEGAL_CHAR_FOUND; + break; + } + } + +donefornow: + if (mySource < sourceLimit && myTarget >= targetLimit && U_SUCCESS(*err)) { + /* End of target buffer */ + *err = U_BUFFER_OVERFLOW_ERROR; + } + + args->target = myTarget; + args->source = (const char *) mySource; +} + +static void U_CALLCONV +T_UConverter_toUnicode_UTF32_BE_OFFSET_LOGIC(UConverterToUnicodeArgs * args, + UErrorCode * err) +{ + const unsigned char *mySource = (unsigned char *) args->source; + UChar *myTarget = args->target; + int32_t *myOffsets = args->offsets; + const unsigned char *sourceLimit = (unsigned char *) args->sourceLimit; + const UChar *targetLimit = args->targetLimit; + unsigned char *toUBytes = args->converter->toUBytes; + uint32_t ch, i; + int32_t offsetNum = 0; + + /* Restore state of current sequence */ + if (args->converter->toUnicodeStatus && myTarget < targetLimit) { + i = args->converter->toULength; /* restore # of bytes consumed */ + args->converter->toULength = 0; + + ch = args->converter->toUnicodeStatus - 1;/*Stores the previously calculated ch from a previous call*/ + args->converter->toUnicodeStatus = 0; + goto morebytes; + } + + while (mySource < sourceLimit && myTarget < targetLimit) { + i = 0; + ch = 0; +morebytes: + while (i < sizeof(uint32_t)) { + if (mySource < sourceLimit) { + ch = (ch << 8) | (uint8_t)(*mySource); + toUBytes[i++] = (char) *(mySource++); + } + else { + /* stores a partially calculated target*/ + /* + 1 to make 0 a valid character */ + args->converter->toUnicodeStatus = ch + 1; + args->converter->toULength = (int8_t) i; + goto donefornow; + } + } + + if (ch <= MAXIMUM_UTF && !U_IS_SURROGATE(ch)) { + /* Normal valid byte when the loop has not prematurely terminated (i < inBytes) */ + if (ch <= MAXIMUM_UCS2) { + /* fits in 16 bits */ + *(myTarget++) = (UChar) ch; + *(myOffsets++) = offsetNum; + } + else { + /* write out the surrogates */ + *(myTarget++) = U16_LEAD(ch); + *myOffsets++ = offsetNum; + ch = U16_TRAIL(ch); + if (myTarget < targetLimit) + { + *(myTarget++) = (UChar)ch; + *(myOffsets++) = offsetNum; + } + else { + /* Put in overflow buffer (not handled here) */ + args->converter->UCharErrorBuffer[0] = (UChar) ch; + args->converter->UCharErrorBufferLength = 1; + *err = U_BUFFER_OVERFLOW_ERROR; + break; + } + } + } + else { + args->converter->toULength = (int8_t)i; + *err = U_ILLEGAL_CHAR_FOUND; + break; + } + offsetNum += i; + } + +donefornow: + if (mySource < sourceLimit && myTarget >= targetLimit && U_SUCCESS(*err)) + { + /* End of target buffer */ + *err = U_BUFFER_OVERFLOW_ERROR; + } + + args->target = myTarget; + args->source = (const char *) mySource; + args->offsets = myOffsets; +} + +static void U_CALLCONV +T_UConverter_fromUnicode_UTF32_BE(UConverterFromUnicodeArgs * args, + UErrorCode * err) +{ + const UChar *mySource = args->source; + unsigned char *myTarget; + const UChar *sourceLimit = args->sourceLimit; + const unsigned char *targetLimit = (unsigned char *) args->targetLimit; + UChar32 ch, ch2; + unsigned int indexToWrite; + unsigned char temp[sizeof(uint32_t)]; + + if(mySource >= sourceLimit) { + /* no input, nothing to do */ + return; + } + + /* write the BOM if necessary */ + if(args->converter->fromUnicodeStatus==UCNV_NEED_TO_WRITE_BOM) { + static const char bom[]={ 0, 0, (char)0xfe, (char)0xff }; + ucnv_fromUWriteBytes(args->converter, + bom, 4, + &args->target, args->targetLimit, + &args->offsets, -1, + err); + args->converter->fromUnicodeStatus=0; + } + + myTarget = (unsigned char *) args->target; + temp[0] = 0; + + if (args->converter->fromUChar32) { + ch = args->converter->fromUChar32; + args->converter->fromUChar32 = 0; + goto lowsurogate; + } + + while (mySource < sourceLimit && myTarget < targetLimit) { + ch = *(mySource++); + + if (U_IS_SURROGATE(ch)) { + if (U_IS_LEAD(ch)) { +lowsurogate: + if (mySource < sourceLimit) { + ch2 = *mySource; + if (U_IS_TRAIL(ch2)) { + ch = ((ch - SURROGATE_HIGH_START) << HALF_SHIFT) + ch2 + SURROGATE_LOW_BASE; + mySource++; + } + else { + /* this is an unmatched trail code unit (2nd surrogate) */ + /* callback(illegal) */ + args->converter->fromUChar32 = ch; + *err = U_ILLEGAL_CHAR_FOUND; + break; + } + } + else { + /* ran out of source */ + args->converter->fromUChar32 = ch; + if (args->flush) { + /* this is an unmatched trail code unit (2nd surrogate) */ + /* callback(illegal) */ + *err = U_ILLEGAL_CHAR_FOUND; + } + break; + } + } + else { + /* this is an unmatched trail code unit (2nd surrogate) */ + /* callback(illegal) */ + args->converter->fromUChar32 = ch; + *err = U_ILLEGAL_CHAR_FOUND; + break; + } + } + + /* We cannot get any larger than 10FFFF because we are coming from UTF-16 */ + temp[1] = (uint8_t) (ch >> 16 & 0x1F); + temp[2] = (uint8_t) (ch >> 8); /* unsigned cast implicitly does (ch & FF) */ + temp[3] = (uint8_t) (ch); /* unsigned cast implicitly does (ch & FF) */ + + for (indexToWrite = 0; indexToWrite <= sizeof(uint32_t) - 1; indexToWrite++) { + if (myTarget < targetLimit) { + *(myTarget++) = temp[indexToWrite]; + } + else { + args->converter->charErrorBuffer[args->converter->charErrorBufferLength++] = temp[indexToWrite]; + *err = U_BUFFER_OVERFLOW_ERROR; + } + } + } + + if (mySource < sourceLimit && myTarget >= targetLimit && U_SUCCESS(*err)) { + *err = U_BUFFER_OVERFLOW_ERROR; + } + + args->target = (char *) myTarget; + args->source = mySource; +} + +static void U_CALLCONV +T_UConverter_fromUnicode_UTF32_BE_OFFSET_LOGIC(UConverterFromUnicodeArgs * args, + UErrorCode * err) +{ + const UChar *mySource = args->source; + unsigned char *myTarget; + int32_t *myOffsets; + const UChar *sourceLimit = args->sourceLimit; + const unsigned char *targetLimit = (unsigned char *) args->targetLimit; + UChar32 ch, ch2; + int32_t offsetNum = 0; + unsigned int indexToWrite; + unsigned char temp[sizeof(uint32_t)]; + + if(mySource >= sourceLimit) { + /* no input, nothing to do */ + return; + } + + /* write the BOM if necessary */ + if(args->converter->fromUnicodeStatus==UCNV_NEED_TO_WRITE_BOM) { + static const char bom[]={ 0, 0, (char)0xfe, (char)0xff }; + ucnv_fromUWriteBytes(args->converter, + bom, 4, + &args->target, args->targetLimit, + &args->offsets, -1, + err); + args->converter->fromUnicodeStatus=0; + } + + myTarget = (unsigned char *) args->target; + myOffsets = args->offsets; + temp[0] = 0; + + if (args->converter->fromUChar32) { + ch = args->converter->fromUChar32; + args->converter->fromUChar32 = 0; + goto lowsurogate; + } + + while (mySource < sourceLimit && myTarget < targetLimit) { + ch = *(mySource++); + + if (U_IS_SURROGATE(ch)) { + if (U_IS_LEAD(ch)) { +lowsurogate: + if (mySource < sourceLimit) { + ch2 = *mySource; + if (U_IS_TRAIL(ch2)) { + ch = ((ch - SURROGATE_HIGH_START) << HALF_SHIFT) + ch2 + SURROGATE_LOW_BASE; + mySource++; + } + else { + /* this is an unmatched trail code unit (2nd surrogate) */ + /* callback(illegal) */ + args->converter->fromUChar32 = ch; + *err = U_ILLEGAL_CHAR_FOUND; + break; + } + } + else { + /* ran out of source */ + args->converter->fromUChar32 = ch; + if (args->flush) { + /* this is an unmatched trail code unit (2nd surrogate) */ + /* callback(illegal) */ + *err = U_ILLEGAL_CHAR_FOUND; + } + break; + } + } + else { + /* this is an unmatched trail code unit (2nd surrogate) */ + /* callback(illegal) */ + args->converter->fromUChar32 = ch; + *err = U_ILLEGAL_CHAR_FOUND; + break; + } + } + + /* We cannot get any larger than 10FFFF because we are coming from UTF-16 */ + temp[1] = (uint8_t) (ch >> 16 & 0x1F); + temp[2] = (uint8_t) (ch >> 8); /* unsigned cast implicitly does (ch & FF) */ + temp[3] = (uint8_t) (ch); /* unsigned cast implicitly does (ch & FF) */ + + for (indexToWrite = 0; indexToWrite <= sizeof(uint32_t) - 1; indexToWrite++) { + if (myTarget < targetLimit) { + *(myTarget++) = temp[indexToWrite]; + *(myOffsets++) = offsetNum; + } + else { + args->converter->charErrorBuffer[args->converter->charErrorBufferLength++] = temp[indexToWrite]; + *err = U_BUFFER_OVERFLOW_ERROR; + } + } + offsetNum = offsetNum + 1 + (temp[1] != 0); + } + + if (mySource < sourceLimit && myTarget >= targetLimit && U_SUCCESS(*err)) { + *err = U_BUFFER_OVERFLOW_ERROR; + } + + args->target = (char *) myTarget; + args->source = mySource; + args->offsets = myOffsets; +} + +static UChar32 U_CALLCONV +T_UConverter_getNextUChar_UTF32_BE(UConverterToUnicodeArgs* args, + UErrorCode* err) +{ + const uint8_t *mySource; + UChar32 myUChar; + int32_t length; + + mySource = (const uint8_t *)args->source; + if (mySource >= (const uint8_t *)args->sourceLimit) + { + /* no input */ + *err = U_INDEX_OUTOFBOUNDS_ERROR; + return 0xffff; + } + + length = (int32_t)((const uint8_t *)args->sourceLimit - mySource); + if (length < 4) + { + /* got a partial character */ + uprv_memcpy(args->converter->toUBytes, mySource, length); + args->converter->toULength = (int8_t)length; + args->source = (const char *)(mySource + length); + *err = U_TRUNCATED_CHAR_FOUND; + return 0xffff; + } + + /* Don't even try to do a direct cast because the value may be on an odd address. */ + myUChar = ((UChar32)mySource[0] << 24) + | ((UChar32)mySource[1] << 16) + | ((UChar32)mySource[2] << 8) + | ((UChar32)mySource[3]); + + args->source = (const char *)(mySource + 4); + if ((uint32_t)myUChar <= MAXIMUM_UTF && !U_IS_SURROGATE(myUChar)) { + return myUChar; + } + + uprv_memcpy(args->converter->toUBytes, mySource, 4); + args->converter->toULength = 4; + + *err = U_ILLEGAL_CHAR_FOUND; + return 0xffff; +} +U_CDECL_END +static const UConverterImpl _UTF32BEImpl = { + UCNV_UTF32_BigEndian, + + NULL, + NULL, + + NULL, + NULL, + NULL, + + T_UConverter_toUnicode_UTF32_BE, + T_UConverter_toUnicode_UTF32_BE_OFFSET_LOGIC, + T_UConverter_fromUnicode_UTF32_BE, + T_UConverter_fromUnicode_UTF32_BE_OFFSET_LOGIC, + T_UConverter_getNextUChar_UTF32_BE, + + NULL, + NULL, + NULL, + NULL, + ucnv_getNonSurrogateUnicodeSet, + + NULL, + NULL +}; + +/* The 1232 CCSID refers to any version of Unicode with any endianess of UTF-32 */ +static const UConverterStaticData _UTF32BEStaticData = { + sizeof(UConverterStaticData), + "UTF-32BE", + 1232, + UCNV_IBM, UCNV_UTF32_BigEndian, 4, 4, + { 0, 0, 0xff, 0xfd }, 4, FALSE, FALSE, + 0, + 0, + { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 } /* reserved */ +}; + +const UConverterSharedData _UTF32BEData = + UCNV_IMMUTABLE_SHARED_DATA_INITIALIZER(&_UTF32BEStaticData, &_UTF32BEImpl); + +/* UTF-32LE ---------------------------------------------------------- */ +U_CDECL_BEGIN +static void U_CALLCONV +T_UConverter_toUnicode_UTF32_LE(UConverterToUnicodeArgs * args, + UErrorCode * err) +{ + const unsigned char *mySource = (unsigned char *) args->source; + UChar *myTarget = args->target; + const unsigned char *sourceLimit = (unsigned char *) args->sourceLimit; + const UChar *targetLimit = args->targetLimit; + unsigned char *toUBytes = args->converter->toUBytes; + uint32_t ch, i; + + /* Restore state of current sequence */ + if (args->converter->toUnicodeStatus && myTarget < targetLimit) + { + i = args->converter->toULength; /* restore # of bytes consumed */ + args->converter->toULength = 0; + + /* Stores the previously calculated ch from a previous call*/ + ch = args->converter->toUnicodeStatus - 1; + args->converter->toUnicodeStatus = 0; + goto morebytes; + } + + while (mySource < sourceLimit && myTarget < targetLimit) + { + i = 0; + ch = 0; +morebytes: + while (i < sizeof(uint32_t)) + { + if (mySource < sourceLimit) + { + ch |= ((uint8_t)(*mySource)) << (i * 8); + toUBytes[i++] = (char) *(mySource++); + } + else + { + /* stores a partially calculated target*/ + /* + 1 to make 0 a valid character */ + args->converter->toUnicodeStatus = ch + 1; + args->converter->toULength = (int8_t) i; + goto donefornow; + } + } + + if (ch <= MAXIMUM_UTF && !U_IS_SURROGATE(ch)) { + /* Normal valid byte when the loop has not prematurely terminated (i < inBytes) */ + if (ch <= MAXIMUM_UCS2) { + /* fits in 16 bits */ + *(myTarget++) = (UChar) ch; + } + else { + /* write out the surrogates */ + *(myTarget++) = U16_LEAD(ch); + ch = U16_TRAIL(ch); + if (myTarget < targetLimit) { + *(myTarget++) = (UChar)ch; + } + else { + /* Put in overflow buffer (not handled here) */ + args->converter->UCharErrorBuffer[0] = (UChar) ch; + args->converter->UCharErrorBufferLength = 1; + *err = U_BUFFER_OVERFLOW_ERROR; + break; + } + } + } + else { + args->converter->toULength = (int8_t)i; + *err = U_ILLEGAL_CHAR_FOUND; + break; + } + } + +donefornow: + if (mySource < sourceLimit && myTarget >= targetLimit && U_SUCCESS(*err)) + { + /* End of target buffer */ + *err = U_BUFFER_OVERFLOW_ERROR; + } + + args->target = myTarget; + args->source = (const char *) mySource; +} + +static void U_CALLCONV +T_UConverter_toUnicode_UTF32_LE_OFFSET_LOGIC(UConverterToUnicodeArgs * args, + UErrorCode * err) +{ + const unsigned char *mySource = (unsigned char *) args->source; + UChar *myTarget = args->target; + int32_t *myOffsets = args->offsets; + const unsigned char *sourceLimit = (unsigned char *) args->sourceLimit; + const UChar *targetLimit = args->targetLimit; + unsigned char *toUBytes = args->converter->toUBytes; + uint32_t ch, i; + int32_t offsetNum = 0; + + /* Restore state of current sequence */ + if (args->converter->toUnicodeStatus && myTarget < targetLimit) + { + i = args->converter->toULength; /* restore # of bytes consumed */ + args->converter->toULength = 0; + + /* Stores the previously calculated ch from a previous call*/ + ch = args->converter->toUnicodeStatus - 1; + args->converter->toUnicodeStatus = 0; + goto morebytes; + } + + while (mySource < sourceLimit && myTarget < targetLimit) + { + i = 0; + ch = 0; +morebytes: + while (i < sizeof(uint32_t)) + { + if (mySource < sourceLimit) + { + ch |= ((uint8_t)(*mySource)) << (i * 8); + toUBytes[i++] = (char) *(mySource++); + } + else + { + /* stores a partially calculated target*/ + /* + 1 to make 0 a valid character */ + args->converter->toUnicodeStatus = ch + 1; + args->converter->toULength = (int8_t) i; + goto donefornow; + } + } + + if (ch <= MAXIMUM_UTF && !U_IS_SURROGATE(ch)) + { + /* Normal valid byte when the loop has not prematurely terminated (i < inBytes) */ + if (ch <= MAXIMUM_UCS2) + { + /* fits in 16 bits */ + *(myTarget++) = (UChar) ch; + *(myOffsets++) = offsetNum; + } + else { + /* write out the surrogates */ + *(myTarget++) = U16_LEAD(ch); + *(myOffsets++) = offsetNum; + ch = U16_TRAIL(ch); + if (myTarget < targetLimit) + { + *(myTarget++) = (UChar)ch; + *(myOffsets++) = offsetNum; + } + else + { + /* Put in overflow buffer (not handled here) */ + args->converter->UCharErrorBuffer[0] = (UChar) ch; + args->converter->UCharErrorBufferLength = 1; + *err = U_BUFFER_OVERFLOW_ERROR; + break; + } + } + } + else + { + args->converter->toULength = (int8_t)i; + *err = U_ILLEGAL_CHAR_FOUND; + break; + } + offsetNum += i; + } + +donefornow: + if (mySource < sourceLimit && myTarget >= targetLimit && U_SUCCESS(*err)) + { + /* End of target buffer */ + *err = U_BUFFER_OVERFLOW_ERROR; + } + + args->target = myTarget; + args->source = (const char *) mySource; + args->offsets = myOffsets; +} + +static void U_CALLCONV +T_UConverter_fromUnicode_UTF32_LE(UConverterFromUnicodeArgs * args, + UErrorCode * err) +{ + const UChar *mySource = args->source; + unsigned char *myTarget; + const UChar *sourceLimit = args->sourceLimit; + const unsigned char *targetLimit = (unsigned char *) args->targetLimit; + UChar32 ch, ch2; + unsigned int indexToWrite; + unsigned char temp[sizeof(uint32_t)]; + + if(mySource >= sourceLimit) { + /* no input, nothing to do */ + return; + } + + /* write the BOM if necessary */ + if(args->converter->fromUnicodeStatus==UCNV_NEED_TO_WRITE_BOM) { + static const char bom[]={ (char)0xff, (char)0xfe, 0, 0 }; + ucnv_fromUWriteBytes(args->converter, + bom, 4, + &args->target, args->targetLimit, + &args->offsets, -1, + err); + args->converter->fromUnicodeStatus=0; + } + + myTarget = (unsigned char *) args->target; + temp[3] = 0; + + if (args->converter->fromUChar32) + { + ch = args->converter->fromUChar32; + args->converter->fromUChar32 = 0; + goto lowsurogate; + } + + while (mySource < sourceLimit && myTarget < targetLimit) + { + ch = *(mySource++); + + if (U16_IS_SURROGATE(ch)) { + if (U16_IS_LEAD(ch)) + { +lowsurogate: + if (mySource < sourceLimit) + { + ch2 = *mySource; + if (U16_IS_TRAIL(ch2)) { + ch = ((ch - SURROGATE_HIGH_START) << HALF_SHIFT) + ch2 + SURROGATE_LOW_BASE; + mySource++; + } + else { + /* this is an unmatched trail code unit (2nd surrogate) */ + /* callback(illegal) */ + args->converter->fromUChar32 = ch; + *err = U_ILLEGAL_CHAR_FOUND; + break; + } + } + else { + /* ran out of source */ + args->converter->fromUChar32 = ch; + if (args->flush) { + /* this is an unmatched trail code unit (2nd surrogate) */ + /* callback(illegal) */ + *err = U_ILLEGAL_CHAR_FOUND; + } + break; + } + } + else { + /* this is an unmatched trail code unit (2nd surrogate) */ + /* callback(illegal) */ + args->converter->fromUChar32 = ch; + *err = U_ILLEGAL_CHAR_FOUND; + break; + } + } + + /* We cannot get any larger than 10FFFF because we are coming from UTF-16 */ + temp[2] = (uint8_t) (ch >> 16 & 0x1F); + temp[1] = (uint8_t) (ch >> 8); /* unsigned cast implicitly does (ch & FF) */ + temp[0] = (uint8_t) (ch); /* unsigned cast implicitly does (ch & FF) */ + + for (indexToWrite = 0; indexToWrite <= sizeof(uint32_t) - 1; indexToWrite++) + { + if (myTarget < targetLimit) + { + *(myTarget++) = temp[indexToWrite]; + } + else + { + args->converter->charErrorBuffer[args->converter->charErrorBufferLength++] = temp[indexToWrite]; + *err = U_BUFFER_OVERFLOW_ERROR; + } + } + } + + if (mySource < sourceLimit && myTarget >= targetLimit && U_SUCCESS(*err)) + { + *err = U_BUFFER_OVERFLOW_ERROR; + } + + args->target = (char *) myTarget; + args->source = mySource; +} + +static void U_CALLCONV +T_UConverter_fromUnicode_UTF32_LE_OFFSET_LOGIC(UConverterFromUnicodeArgs * args, + UErrorCode * err) +{ + const UChar *mySource = args->source; + unsigned char *myTarget; + int32_t *myOffsets; + const UChar *sourceLimit = args->sourceLimit; + const unsigned char *targetLimit = (unsigned char *) args->targetLimit; + UChar32 ch, ch2; + unsigned int indexToWrite; + unsigned char temp[sizeof(uint32_t)]; + int32_t offsetNum = 0; + + if(mySource >= sourceLimit) { + /* no input, nothing to do */ + return; + } + + /* write the BOM if necessary */ + if(args->converter->fromUnicodeStatus==UCNV_NEED_TO_WRITE_BOM) { + static const char bom[]={ (char)0xff, (char)0xfe, 0, 0 }; + ucnv_fromUWriteBytes(args->converter, + bom, 4, + &args->target, args->targetLimit, + &args->offsets, -1, + err); + args->converter->fromUnicodeStatus=0; + } + + myTarget = (unsigned char *) args->target; + myOffsets = args->offsets; + temp[3] = 0; + + if (args->converter->fromUChar32) + { + ch = args->converter->fromUChar32; + args->converter->fromUChar32 = 0; + goto lowsurogate; + } + + while (mySource < sourceLimit && myTarget < targetLimit) + { + ch = *(mySource++); + + if (U16_IS_SURROGATE(ch)) { + if (U16_IS_LEAD(ch)) + { +lowsurogate: + if (mySource < sourceLimit) + { + ch2 = *mySource; + if (U16_IS_TRAIL(ch2)) + { + ch = ((ch - SURROGATE_HIGH_START) << HALF_SHIFT) + ch2 + SURROGATE_LOW_BASE; + mySource++; + } + else { + /* this is an unmatched trail code unit (2nd surrogate) */ + /* callback(illegal) */ + args->converter->fromUChar32 = ch; + *err = U_ILLEGAL_CHAR_FOUND; + break; + } + } + else { + /* ran out of source */ + args->converter->fromUChar32 = ch; + if (args->flush) { + /* this is an unmatched trail code unit (2nd surrogate) */ + /* callback(illegal) */ + *err = U_ILLEGAL_CHAR_FOUND; + } + break; + } + } + else { + /* this is an unmatched trail code unit (2nd surrogate) */ + /* callback(illegal) */ + args->converter->fromUChar32 = ch; + *err = U_ILLEGAL_CHAR_FOUND; + break; + } + } + + /* We cannot get any larger than 10FFFF because we are coming from UTF-16 */ + temp[2] = (uint8_t) (ch >> 16 & 0x1F); + temp[1] = (uint8_t) (ch >> 8); /* unsigned cast implicitly does (ch & FF) */ + temp[0] = (uint8_t) (ch); /* unsigned cast implicitly does (ch & FF) */ + + for (indexToWrite = 0; indexToWrite <= sizeof(uint32_t) - 1; indexToWrite++) + { + if (myTarget < targetLimit) + { + *(myTarget++) = temp[indexToWrite]; + *(myOffsets++) = offsetNum; + } + else + { + args->converter->charErrorBuffer[args->converter->charErrorBufferLength++] = temp[indexToWrite]; + *err = U_BUFFER_OVERFLOW_ERROR; + } + } + offsetNum = offsetNum + 1 + (temp[2] != 0); + } + + if (mySource < sourceLimit && myTarget >= targetLimit && U_SUCCESS(*err)) + { + *err = U_BUFFER_OVERFLOW_ERROR; + } + + args->target = (char *) myTarget; + args->source = mySource; + args->offsets = myOffsets; +} + +static UChar32 U_CALLCONV +T_UConverter_getNextUChar_UTF32_LE(UConverterToUnicodeArgs* args, + UErrorCode* err) +{ + const uint8_t *mySource; + UChar32 myUChar; + int32_t length; + + mySource = (const uint8_t *)args->source; + if (mySource >= (const uint8_t *)args->sourceLimit) + { + /* no input */ + *err = U_INDEX_OUTOFBOUNDS_ERROR; + return 0xffff; + } + + length = (int32_t)((const uint8_t *)args->sourceLimit - mySource); + if (length < 4) + { + /* got a partial character */ + uprv_memcpy(args->converter->toUBytes, mySource, length); + args->converter->toULength = (int8_t)length; + args->source = (const char *)(mySource + length); + *err = U_TRUNCATED_CHAR_FOUND; + return 0xffff; + } + + /* Don't even try to do a direct cast because the value may be on an odd address. */ + myUChar = ((UChar32)mySource[3] << 24) + | ((UChar32)mySource[2] << 16) + | ((UChar32)mySource[1] << 8) + | ((UChar32)mySource[0]); + + args->source = (const char *)(mySource + 4); + if ((uint32_t)myUChar <= MAXIMUM_UTF && !U_IS_SURROGATE(myUChar)) { + return myUChar; + } + + uprv_memcpy(args->converter->toUBytes, mySource, 4); + args->converter->toULength = 4; + + *err = U_ILLEGAL_CHAR_FOUND; + return 0xffff; +} +U_CDECL_END +static const UConverterImpl _UTF32LEImpl = { + UCNV_UTF32_LittleEndian, + + NULL, + NULL, + + NULL, + NULL, + NULL, + + T_UConverter_toUnicode_UTF32_LE, + T_UConverter_toUnicode_UTF32_LE_OFFSET_LOGIC, + T_UConverter_fromUnicode_UTF32_LE, + T_UConverter_fromUnicode_UTF32_LE_OFFSET_LOGIC, + T_UConverter_getNextUChar_UTF32_LE, + + NULL, + NULL, + NULL, + NULL, + ucnv_getNonSurrogateUnicodeSet, + + NULL, + NULL +}; + +/* The 1232 CCSID refers to any version of Unicode with any endianess of UTF-32 */ +static const UConverterStaticData _UTF32LEStaticData = { + sizeof(UConverterStaticData), + "UTF-32LE", + 1234, + UCNV_IBM, UCNV_UTF32_LittleEndian, 4, 4, + { 0xfd, 0xff, 0, 0 }, 4, FALSE, FALSE, + 0, + 0, + { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 } /* reserved */ +}; + + +const UConverterSharedData _UTF32LEData = + UCNV_IMMUTABLE_SHARED_DATA_INITIALIZER(&_UTF32LEStaticData, &_UTF32LEImpl); + +/* UTF-32 (Detect BOM) ------------------------------------------------------ */ + +/* + * Detect a BOM at the beginning of the stream and select UTF-32BE or UTF-32LE + * accordingly. + * + * State values: + * 0 initial state + * 1 saw 00 + * 2 saw 00 00 + * 3 saw 00 00 FE + * 4 - + * 5 saw FF + * 6 saw FF FE + * 7 saw FF FE 00 + * 8 UTF-32BE mode + * 9 UTF-32LE mode + * + * During detection: state&3==number of matching bytes so far. + * + * On output, emit U+FEFF as the first code point. + */ +U_CDECL_BEGIN +static void U_CALLCONV +_UTF32Reset(UConverter *cnv, UConverterResetChoice choice) { + if(choice<=UCNV_RESET_TO_UNICODE) { + /* reset toUnicode: state=0 */ + cnv->mode=0; + } + if(choice!=UCNV_RESET_TO_UNICODE) { + /* reset fromUnicode: prepare to output the UTF-32PE BOM */ + cnv->fromUnicodeStatus=UCNV_NEED_TO_WRITE_BOM; + } +} + +static void U_CALLCONV +_UTF32Open(UConverter *cnv, + UConverterLoadArgs *pArgs, + UErrorCode *pErrorCode) { + (void)pArgs; + (void)pErrorCode; + _UTF32Reset(cnv, UCNV_RESET_BOTH); +} + +static const char utf32BOM[8]={ 0, 0, (char)0xfe, (char)0xff, (char)0xff, (char)0xfe, 0, 0 }; + +static void U_CALLCONV +_UTF32ToUnicodeWithOffsets(UConverterToUnicodeArgs *pArgs, + UErrorCode *pErrorCode) { + UConverter *cnv=pArgs->converter; + const char *source=pArgs->source; + const char *sourceLimit=pArgs->sourceLimit; + int32_t *offsets=pArgs->offsets; + + int32_t state, offsetDelta; + char b; + + state=cnv->mode; + + /* + * If we detect a BOM in this buffer, then we must add the BOM size to the + * offsets because the actual converter function will not see and count the BOM. + * offsetDelta will have the number of the BOM bytes that are in the current buffer. + */ + offsetDelta=0; + + while(sourcesource); + } else if(state==8) { + state=9; /* detect UTF-32LE */ + offsetDelta=(int32_t)(source-pArgs->source); + } + } else { + /* switch to UTF-32BE and pass the previous bytes */ + int32_t count=(int32_t)(source-pArgs->source); /* number of bytes from this buffer */ + + /* reset the source */ + source=pArgs->source; + + if(count==(state&3)) { + /* simple: all in the same buffer, just reset source */ + } else { + UBool oldFlush=pArgs->flush; + + /* some of the bytes are from a previous buffer, replay those first */ + pArgs->source=utf32BOM+(state&4); /* select the correct BOM */ + pArgs->sourceLimit=pArgs->source+((state&3)-count); /* replay previous bytes */ + pArgs->flush=FALSE; /* this sourceLimit is not the real source stream limit */ + + /* no offsets: bytes from previous buffer, and not enough for output */ + T_UConverter_toUnicode_UTF32_BE(pArgs, pErrorCode); + + /* restore real pointers; pArgs->source will be set in case 8/9 */ + pArgs->sourceLimit=sourceLimit; + pArgs->flush=oldFlush; + } + state=8; + continue; + } + break; + case 8: + /* call UTF-32BE */ + pArgs->source=source; + if(offsets==NULL) { + T_UConverter_toUnicode_UTF32_BE(pArgs, pErrorCode); + } else { + T_UConverter_toUnicode_UTF32_BE_OFFSET_LOGIC(pArgs, pErrorCode); + } + source=pArgs->source; + break; + case 9: + /* call UTF-32LE */ + pArgs->source=source; + if(offsets==NULL) { + T_UConverter_toUnicode_UTF32_LE(pArgs, pErrorCode); + } else { + T_UConverter_toUnicode_UTF32_LE_OFFSET_LOGIC(pArgs, pErrorCode); + } + source=pArgs->source; + break; + default: + break; /* does not occur */ + } + } + + /* add BOM size to offsets - see comment at offsetDelta declaration */ + if(offsets!=NULL && offsetDelta!=0) { + int32_t *offsetsLimit=pArgs->offsets; + while(offsetssource=source; + + if(source==sourceLimit && pArgs->flush) { + /* handle truncated input */ + switch(state) { + case 0: + break; /* no input at all, nothing to do */ + case 8: + T_UConverter_toUnicode_UTF32_BE(pArgs, pErrorCode); + break; + case 9: + T_UConverter_toUnicode_UTF32_LE(pArgs, pErrorCode); + break; + default: + /* handle 0source=utf32BOM+(state&4); /* select the correct BOM */ + pArgs->sourceLimit=pArgs->source+(state&3); /* replay bytes */ + + /* no offsets: not enough for output */ + T_UConverter_toUnicode_UTF32_BE(pArgs, pErrorCode); + pArgs->source=source; + pArgs->sourceLimit=sourceLimit; + state=8; + break; + } + } + + cnv->mode=state; +} + +static UChar32 U_CALLCONV +_UTF32GetNextUChar(UConverterToUnicodeArgs *pArgs, + UErrorCode *pErrorCode) { + switch(pArgs->converter->mode) { + case 8: + return T_UConverter_getNextUChar_UTF32_BE(pArgs, pErrorCode); + case 9: + return T_UConverter_getNextUChar_UTF32_LE(pArgs, pErrorCode); + default: + return UCNV_GET_NEXT_UCHAR_USE_TO_U; + } +} +U_CDECL_END +static const UConverterImpl _UTF32Impl = { + UCNV_UTF32, + + NULL, + NULL, + + _UTF32Open, + NULL, + _UTF32Reset, + + _UTF32ToUnicodeWithOffsets, + _UTF32ToUnicodeWithOffsets, +#if U_IS_BIG_ENDIAN + T_UConverter_fromUnicode_UTF32_BE, + T_UConverter_fromUnicode_UTF32_BE_OFFSET_LOGIC, +#else + T_UConverter_fromUnicode_UTF32_LE, + T_UConverter_fromUnicode_UTF32_LE_OFFSET_LOGIC, +#endif + _UTF32GetNextUChar, + + NULL, /* ### TODO implement getStarters for all Unicode encodings?! */ + NULL, + NULL, + NULL, + ucnv_getNonSurrogateUnicodeSet, + + NULL, + NULL +}; + +/* The 1236 CCSID refers to any version of Unicode with a BOM sensitive endianess of UTF-32 */ +static const UConverterStaticData _UTF32StaticData = { + sizeof(UConverterStaticData), + "UTF-32", + 1236, + UCNV_IBM, UCNV_UTF32, 4, 4, +#if U_IS_BIG_ENDIAN + { 0, 0, 0xff, 0xfd }, 4, +#else + { 0xfd, 0xff, 0, 0 }, 4, +#endif + FALSE, FALSE, + 0, + 0, + { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 } /* reserved */ +}; + +const UConverterSharedData _UTF32Data = + UCNV_IMMUTABLE_SHARED_DATA_INITIALIZER(&_UTF32StaticData, &_UTF32Impl); + +#endif diff --git a/Build/source/libs/icu/icu-src/source/common/ucnv_u7.c b/Build/source/libs/icu/icu-src/source/common/ucnv_u7.c deleted file mode 100644 index c3b4d74b9a9..00000000000 --- a/Build/source/libs/icu/icu-src/source/common/ucnv_u7.c +++ /dev/null @@ -1,1484 +0,0 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. -// License & terms of use: http://www.unicode.org/copyright.html -/* -********************************************************************** -* Copyright (C) 2002-2016, International Business Machines -* Corporation and others. All Rights Reserved. -********************************************************************** -* file name: ucnv_u7.c -* encoding: US-ASCII -* tab size: 8 (not used) -* indentation:4 -* -* created on: 2002jul01 -* created by: Markus W. Scherer -* -* UTF-7 converter implementation. Used to be in ucnv_utf.c. -*/ - -#include "unicode/utypes.h" - -#if !UCONFIG_NO_CONVERSION && !UCONFIG_ONLY_HTML_CONVERSION - -#include "cmemory.h" -#include "unicode/ucnv.h" -#include "ucnv_bld.h" -#include "ucnv_cnv.h" -#include "uassert.h" - -/* UTF-7 -------------------------------------------------------------------- */ - -/* - * UTF-7 is a stateful encoding of Unicode. - * It is defined in RFC 2152. (http://www.ietf.org/rfc/rfc2152.txt) - * It was intended for use in Internet email systems, using in its bytewise - * encoding only a subset of 7-bit US-ASCII. - * UTF-7 is deprecated in favor of UTF-8/16/32 and SCSU, but still - * occasionally used. - * - * For converting Unicode to UTF-7, the RFC allows to encode some US-ASCII - * characters directly or in base64. Especially, the characters in set O - * as defined in the RFC (see below) may be encoded directly but are not - * allowed in, e.g., email headers. - * By default, the ICU UTF-7 converter encodes set O directly. - * By choosing the option "version=1", set O will be escaped instead. - * For example: - * utf7Converter=ucnv_open("UTF-7,version=1"); - * - * For details about email headers see RFC 2047. - */ - -/* - * Tests for US-ASCII characters belonging to character classes - * defined in UTF-7. - * - * Set D (directly encoded characters) consists of the following - * characters: the upper and lower case letters A through Z - * and a through z, the 10 digits 0-9, and the following nine special - * characters (note that "+" and "=" are omitted): - * '(),-./:? - * - * Set O (optional direct characters) consists of the following - * characters (note that "\" and "~" are omitted): - * !"#$%&*;<=>@[]^_`{|} - * - * According to the rules in RFC 2152, the byte values for the following - * US-ASCII characters are not used in UTF-7 and are therefore illegal: - * - all C0 control codes except for CR LF TAB - * - BACKSLASH - * - TILDE - * - DEL - * - all codes beyond US-ASCII, i.e. all >127 - */ -#define inSetD(c) \ - ((uint8_t)((c)-97)<26 || (uint8_t)((c)-65)<26 || /* letters */ \ - (uint8_t)((c)-48)<10 || /* digits */ \ - (uint8_t)((c)-39)<3 || /* '() */ \ - (uint8_t)((c)-44)<4 || /* ,-./ */ \ - (c)==58 || (c)==63 /* :? */ \ - ) - -#define inSetO(c) \ - ((uint8_t)((c)-33)<6 || /* !"#$%& */ \ - (uint8_t)((c)-59)<4 || /* ;<=> */ \ - (uint8_t)((c)-93)<4 || /* ]^_` */ \ - (uint8_t)((c)-123)<3 || /* {|} */ \ - (c)==42 || (c)==64 || (c)==91 /* *@[ */ \ - ) - -#define isCRLFTAB(c) ((c)==13 || (c)==10 || (c)==9) -#define isCRLFSPTAB(c) ((c)==32 || (c)==13 || (c)==10 || (c)==9) - -#define PLUS 43 -#define MINUS 45 -#define BACKSLASH 92 -#define TILDE 126 - -/* legal byte values: all US-ASCII graphic characters from space to before tilde, and CR LF TAB */ -#define isLegalUTF7(c) (((uint8_t)((c)-32)<94 && (c)!=BACKSLASH) || isCRLFTAB(c)) - -/* encode directly sets D and O and CR LF SP TAB */ -static const UBool encodeDirectlyMaximum[128]={ - /* 0 1 2 3 4 5 6 7 8 9 a b c d e f */ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, - - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0 -}; - -/* encode directly set D and CR LF SP TAB but not set O */ -static const UBool encodeDirectlyRestricted[128]={ - /* 0 1 2 3 4 5 6 7 8 9 a b c d e f */ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - - 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, - - 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, - - 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0 -}; - -static const uint8_t -toBase64[64]={ - /* A-Z */ - 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, - 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, - /* a-z */ - 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, - 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, - /* 0-9 */ - 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, - /* +/ */ - 43, 47 -}; - -static const int8_t -fromBase64[128]={ - /* C0 controls, -1 for legal ones (CR LF TAB), -3 for illegal ones */ - -3, -3, -3, -3, -3, -3, -3, -3, -3, -1, -1, -3, -3, -1, -3, -3, - -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, - - /* general punctuation with + and / and a special value (-2) for - */ - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 62, -1, -2, -1, 63, - /* digits */ - 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, -1, -1, -1, -1, -1, -1, - - /* A-Z */ - -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, -3, -1, -1, -1, - - /* a-z */ - -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, -3, -3 -}; - -/* - * converter status values: - * - * toUnicodeStatus: - * 24 inDirectMode (boolean) - * 23..16 base64Counter (-1..7) - * 15..0 bits (up to 14 bits incoming base64) - * - * fromUnicodeStatus: - * 31..28 version (0: set O direct 1: set O escaped) - * 24 inDirectMode (boolean) - * 23..16 base64Counter (0..2) - * 7..0 bits (6 bits outgoing base64) - * - */ - -static void -_UTF7Reset(UConverter *cnv, UConverterResetChoice choice) { - if(choice<=UCNV_RESET_TO_UNICODE) { - /* reset toUnicode */ - cnv->toUnicodeStatus=0x1000000; /* inDirectMode=TRUE */ - cnv->toULength=0; - } - if(choice!=UCNV_RESET_TO_UNICODE) { - /* reset fromUnicode */ - cnv->fromUnicodeStatus=(cnv->fromUnicodeStatus&0xf0000000)|0x1000000; /* keep version, inDirectMode=TRUE */ - } -} - -static void -_UTF7Open(UConverter *cnv, - UConverterLoadArgs *pArgs, - UErrorCode *pErrorCode) { - if(UCNV_GET_VERSION(cnv)<=1) { - /* TODO(markus): Should just use cnv->options rather than copying the version number. */ - cnv->fromUnicodeStatus=UCNV_GET_VERSION(cnv)<<28; - _UTF7Reset(cnv, UCNV_RESET_BOTH); - } else { - *pErrorCode=U_ILLEGAL_ARGUMENT_ERROR; - } -} - -static void -_UTF7ToUnicodeWithOffsets(UConverterToUnicodeArgs *pArgs, - UErrorCode *pErrorCode) { - UConverter *cnv; - const uint8_t *source, *sourceLimit; - UChar *target; - const UChar *targetLimit; - int32_t *offsets; - - uint8_t *bytes; - uint8_t byteIndex; - - int32_t length, targetCapacity; - - /* UTF-7 state */ - uint16_t bits; - int8_t base64Counter; - UBool inDirectMode; - - int8_t base64Value; - - int32_t sourceIndex, nextSourceIndex; - - uint8_t b; - /* set up the local pointers */ - cnv=pArgs->converter; - - source=(const uint8_t *)pArgs->source; - sourceLimit=(const uint8_t *)pArgs->sourceLimit; - target=pArgs->target; - targetLimit=pArgs->targetLimit; - offsets=pArgs->offsets; - /* get the state machine state */ - { - uint32_t status=cnv->toUnicodeStatus; - inDirectMode=(UBool)((status>>24)&1); - base64Counter=(int8_t)(status>>16); - bits=(uint16_t)status; - } - bytes=cnv->toUBytes; - byteIndex=cnv->toULength; - - /* sourceIndex=-1 if the current character began in the previous buffer */ - sourceIndex=byteIndex==0 ? 0 : -1; - nextSourceIndex=0; - - if(inDirectMode) { -directMode: - /* - * In Direct Mode, most US-ASCII characters are encoded directly, i.e., - * with their US-ASCII byte values. - * Backslash and Tilde and most control characters are not allowed in UTF-7. - * A plus sign starts Unicode (or "escape") Mode. - * - * In Direct Mode, only the sourceIndex is used. - */ - byteIndex=0; - length=(int32_t)(sourceLimit-source); - targetCapacity=(int32_t)(targetLimit-target); - if(length>targetCapacity) { - length=targetCapacity; - } - while(length>0) { - b=*source++; - if(!isLegalUTF7(b)) { - /* illegal */ - bytes[0]=b; - byteIndex=1; - *pErrorCode=U_ILLEGAL_CHAR_FOUND; - break; - } else if(b!=PLUS) { - /* write directly encoded character */ - *target++=b; - if(offsets!=NULL) { - *offsets++=sourceIndex++; - } - } else /* PLUS */ { - /* switch to Unicode mode */ - nextSourceIndex=++sourceIndex; - inDirectMode=FALSE; - byteIndex=0; - bits=0; - base64Counter=-1; - goto unicodeMode; - } - --length; - } - if(source=targetLimit) { - /* target is full */ - *pErrorCode=U_BUFFER_OVERFLOW_ERROR; - } - } else { -unicodeMode: - /* - * In Unicode (or "escape") Mode, UTF-16BE is base64-encoded. - * The base64 sequence ends with any character that is not in the base64 alphabet. - * A terminating minus sign is consumed. - * - * In Unicode Mode, the sourceIndex has the index to the start of the current - * base64 bytes, while nextSourceIndex is precisely parallel to source, - * keeping the index to the following byte. - * Note that in 2 out of 3 cases, UChars overlap within a base64 byte. - */ - while(source=126 || (base64Value=fromBase64[b])==-3 || base64Value==-1) { - /* either - * base64Value==-1 for any legal character except base64 and minus sign, or - * base64Value==-3 for illegal characters: - * 1. In either case, leave Unicode mode. - * 2.1. If we ended with an incomplete UChar or none after the +, then - * generate an error for the preceding erroneous sequence and deal with - * the current (possibly illegal) character next time through. - * 2.2. Else the current char comes after a complete UChar, which was already - * pushed to the output buf, so: - * 2.2.1. If the current char is legal, just save it for processing next time. - * It may be for example, a plus which we need to deal with in direct mode. - * 2.2.2. Else if the current char is illegal, we might as well deal with it here. - */ - inDirectMode=TRUE; - if(base64Counter==-1) { - /* illegal: + immediately followed by something other than base64 or minus sign */ - /* include the plus sign in the reported sequence, but not the subsequent char */ - --source; - bytes[0]=PLUS; - byteIndex=1; - *pErrorCode=U_ILLEGAL_CHAR_FOUND; - break; - } else if(bits!=0) { - /* bits are illegally left over, a UChar is incomplete */ - /* don't include current char (legal or illegal) in error seq */ - --source; - --byteIndex; - *pErrorCode=U_ILLEGAL_CHAR_FOUND; - break; - } else { - /* previous UChar was complete */ - if(base64Value==-3) { - /* current character is illegal, deal with it here */ - *pErrorCode=U_ILLEGAL_CHAR_FOUND; - break; - } else { - /* un-read the current character in case it is a plus sign */ - --source; - sourceIndex=nextSourceIndex-1; - goto directMode; - } - } - } else if(base64Value>=0) { - /* collect base64 bytes into UChars */ - switch(base64Counter) { - case -1: /* -1 is immediately after the + */ - case 0: - bits=base64Value; - base64Counter=1; - break; - case 1: - case 3: - case 4: - case 6: - bits=(uint16_t)((bits<<6)|base64Value); - ++base64Counter; - break; - case 2: - *target++=(UChar)((bits<<4)|(base64Value>>2)); - if(offsets!=NULL) { - *offsets++=sourceIndex; - sourceIndex=nextSourceIndex-1; - } - bytes[0]=b; /* keep this byte in case an error occurs */ - byteIndex=1; - bits=(uint16_t)(base64Value&3); - base64Counter=3; - break; - case 5: - *target++=(UChar)((bits<<2)|(base64Value>>4)); - if(offsets!=NULL) { - *offsets++=sourceIndex; - sourceIndex=nextSourceIndex-1; - } - bytes[0]=b; /* keep this byte in case an error occurs */ - byteIndex=1; - bits=(uint16_t)(base64Value&15); - base64Counter=6; - break; - case 7: - *target++=(UChar)((bits<<6)|base64Value); - if(offsets!=NULL) { - *offsets++=sourceIndex; - sourceIndex=nextSourceIndex; - } - byteIndex=0; - bits=0; - base64Counter=0; - break; - default: - /* will never occur */ - break; - } - } else /*base64Value==-2*/ { - /* minus sign terminates the base64 sequence */ - inDirectMode=TRUE; - if(base64Counter==-1) { - /* +- i.e. a minus immediately following a plus */ - *target++=PLUS; - if(offsets!=NULL) { - *offsets++=sourceIndex-1; - } - } else { - /* absorb the minus and leave the Unicode Mode */ - if(bits!=0) { - /* bits are illegally left over, a UChar is incomplete */ - *pErrorCode=U_ILLEGAL_CHAR_FOUND; - break; - } - } - sourceIndex=nextSourceIndex; - goto directMode; - } - } else { - /* target is full */ - *pErrorCode=U_BUFFER_OVERFLOW_ERROR; - break; - } - } - } - - if(U_SUCCESS(*pErrorCode) && pArgs->flush && source==sourceLimit && bits==0) { - /* - * if we are in Unicode mode, then the byteIndex might not be 0, - * but that is ok if bits==0 - * -> we set byteIndex=0 at the end of the stream to avoid a truncated error - * (not true for IMAP-mailbox-name where we must end in direct mode) - */ - byteIndex=0; - } - - /* set the converter state back into UConverter */ - cnv->toUnicodeStatus=((uint32_t)inDirectMode<<24)|((uint32_t)((uint8_t)base64Counter)<<16)|(uint32_t)bits; - cnv->toULength=byteIndex; - - /* write back the updated pointers */ - pArgs->source=(const char *)source; - pArgs->target=target; - pArgs->offsets=offsets; - return; -} - -static void -_UTF7FromUnicodeWithOffsets(UConverterFromUnicodeArgs *pArgs, - UErrorCode *pErrorCode) { - UConverter *cnv; - const UChar *source, *sourceLimit; - uint8_t *target, *targetLimit; - int32_t *offsets; - - int32_t length, targetCapacity, sourceIndex; - UChar c; - - /* UTF-7 state */ - const UBool *encodeDirectly; - uint8_t bits; - int8_t base64Counter; - UBool inDirectMode; - - /* set up the local pointers */ - cnv=pArgs->converter; - - /* set up the local pointers */ - source=pArgs->source; - sourceLimit=pArgs->sourceLimit; - target=(uint8_t *)pArgs->target; - targetLimit=(uint8_t *)pArgs->targetLimit; - offsets=pArgs->offsets; - - /* get the state machine state */ - { - uint32_t status=cnv->fromUnicodeStatus; - encodeDirectly= status<0x10000000 ? encodeDirectlyMaximum : encodeDirectlyRestricted; - inDirectMode=(UBool)((status>>24)&1); - base64Counter=(int8_t)(status>>16); - bits=(uint8_t)status; - U_ASSERT(bits<=UPRV_LENGTHOF(toBase64)); - } - - /* UTF-7 always encodes UTF-16 code units, therefore we need only a simple sourceIndex */ - sourceIndex=0; - - if(inDirectMode) { -directMode: - length=(int32_t)(sourceLimit-source); - targetCapacity=(int32_t)(targetLimit-target); - if(length>targetCapacity) { - length=targetCapacity; - } - while(length>0) { - c=*source++; - /* currently always encode CR LF SP TAB directly */ - if(c<=127 && encodeDirectly[c]) { - /* encode directly */ - *target++=(uint8_t)c; - if(offsets!=NULL) { - *offsets++=sourceIndex++; - } - } else if(c==PLUS) { - /* output +- for + */ - *target++=PLUS; - if(targetcharErrorBuffer[0]=MINUS; - cnv->charErrorBufferLength=1; - *pErrorCode=U_BUFFER_OVERFLOW_ERROR; - break; - } - } else { - /* un-read this character and switch to Unicode Mode */ - --source; - *target++=PLUS; - if(offsets!=NULL) { - *offsets++=sourceIndex; - } - inDirectMode=FALSE; - base64Counter=0; - goto unicodeMode; - } - --length; - } - if(source=targetLimit) { - /* target is full */ - *pErrorCode=U_BUFFER_OVERFLOW_ERROR; - } - } else { -unicodeMode: - while(sourcecharErrorBuffer[0]=MINUS; - cnv->charErrorBufferLength=1; - *pErrorCode=U_BUFFER_OVERFLOW_ERROR; - break; - } - } - goto directMode; - } else { - /* - * base64 this character: - * Output 2 or 3 base64 bytes for the remaining bits of the previous character - * and the bits of this character, each implicitly in UTF-16BE. - * - * Here, bits is an 8-bit variable because only 6 bits need to be kept from one - * character to the next. The actual 2 or 4 bits are shifted to the left edge - * of the 6-bits field 5..0 to make the termination of the base64 sequence easier. - */ - switch(base64Counter) { - case 0: - *target++=toBase64[c>>10]; - if(target>4)&0x3f]; - if(offsets!=NULL) { - *offsets++=sourceIndex; - *offsets++=sourceIndex++; - } - } else { - if(offsets!=NULL) { - *offsets++=sourceIndex++; - } - cnv->charErrorBuffer[0]=toBase64[(c>>4)&0x3f]; - cnv->charErrorBufferLength=1; - *pErrorCode=U_BUFFER_OVERFLOW_ERROR; - } - bits=(uint8_t)((c&15)<<2); - base64Counter=1; - break; - case 1: - *target++=toBase64[bits|(c>>14)]; - if(target>8)&0x3f]; - if(target>2)&0x3f]; - if(offsets!=NULL) { - *offsets++=sourceIndex; - *offsets++=sourceIndex; - *offsets++=sourceIndex++; - } - } else { - if(offsets!=NULL) { - *offsets++=sourceIndex; - *offsets++=sourceIndex++; - } - cnv->charErrorBuffer[0]=toBase64[(c>>2)&0x3f]; - cnv->charErrorBufferLength=1; - *pErrorCode=U_BUFFER_OVERFLOW_ERROR; - } - } else { - if(offsets!=NULL) { - *offsets++=sourceIndex++; - } - cnv->charErrorBuffer[0]=toBase64[(c>>8)&0x3f]; - cnv->charErrorBuffer[1]=toBase64[(c>>2)&0x3f]; - cnv->charErrorBufferLength=2; - *pErrorCode=U_BUFFER_OVERFLOW_ERROR; - } - bits=(uint8_t)((c&3)<<4); - base64Counter=2; - break; - case 2: - *target++=toBase64[bits|(c>>12)]; - if(target>6)&0x3f]; - if(targetcharErrorBuffer[0]=toBase64[c&0x3f]; - cnv->charErrorBufferLength=1; - *pErrorCode=U_BUFFER_OVERFLOW_ERROR; - } - } else { - if(offsets!=NULL) { - *offsets++=sourceIndex++; - } - cnv->charErrorBuffer[0]=toBase64[(c>>6)&0x3f]; - cnv->charErrorBuffer[1]=toBase64[c&0x3f]; - cnv->charErrorBufferLength=2; - *pErrorCode=U_BUFFER_OVERFLOW_ERROR; - } - bits=0; - base64Counter=0; - break; - default: - /* will never occur */ - break; - } - } - } else { - /* target is full */ - *pErrorCode=U_BUFFER_OVERFLOW_ERROR; - break; - } - } - } - - if(pArgs->flush && source>=sourceLimit) { - /* flush remaining bits to the target */ - if(!inDirectMode) { - if (base64Counter!=0) { - if(targetcharErrorBuffer[cnv->charErrorBufferLength++]=toBase64[bits]; - *pErrorCode=U_BUFFER_OVERFLOW_ERROR; - } - } - /* Add final MINUS to terminate unicodeMode */ - if(targetcharErrorBuffer[cnv->charErrorBufferLength++]=MINUS; - *pErrorCode=U_BUFFER_OVERFLOW_ERROR; - } - } - /* reset the state for the next conversion */ - cnv->fromUnicodeStatus=(cnv->fromUnicodeStatus&0xf0000000)|0x1000000; /* keep version, inDirectMode=TRUE */ - } else { - /* set the converter state back into UConverter */ - cnv->fromUnicodeStatus= - (cnv->fromUnicodeStatus&0xf0000000)| /* keep version*/ - ((uint32_t)inDirectMode<<24)|((uint32_t)base64Counter<<16)|(uint32_t)bits; - } - - /* write back the updated pointers */ - pArgs->source=source; - pArgs->target=(char *)target; - pArgs->offsets=offsets; - return; -} - -static const char * -_UTF7GetName(const UConverter *cnv) { - switch(cnv->fromUnicodeStatus>>28) { - case 1: - return "UTF-7,version=1"; - default: - return "UTF-7"; - } -} - -static const UConverterImpl _UTF7Impl={ - UCNV_UTF7, - - NULL, - NULL, - - _UTF7Open, - NULL, - _UTF7Reset, - - _UTF7ToUnicodeWithOffsets, - _UTF7ToUnicodeWithOffsets, - _UTF7FromUnicodeWithOffsets, - _UTF7FromUnicodeWithOffsets, - NULL, - - NULL, - _UTF7GetName, - NULL, /* we don't need writeSub() because we never call a callback at fromUnicode() */ - NULL, - ucnv_getCompleteUnicodeSet, - - NULL, - NULL -}; - -static const UConverterStaticData _UTF7StaticData={ - sizeof(UConverterStaticData), - "UTF-7", - 0, /* TODO CCSID for UTF-7 */ - UCNV_IBM, UCNV_UTF7, - 1, 4, - { 0x3f, 0, 0, 0 }, 1, /* the subchar is not used */ - FALSE, FALSE, - 0, - 0, - { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 } /* reserved */ -}; - -const UConverterSharedData _UTF7Data= - UCNV_IMMUTABLE_SHARED_DATA_INITIALIZER(&_UTF7StaticData, &_UTF7Impl); - -/* IMAP mailbox name encoding ----------------------------------------------- */ - -/* - * RFC 2060: INTERNET MESSAGE ACCESS PROTOCOL - VERSION 4rev1 - * http://www.ietf.org/rfc/rfc2060.txt - * - * 5.1.3. Mailbox International Naming Convention - * - * By convention, international mailbox names are specified using a - * modified version of the UTF-7 encoding described in [UTF-7]. The - * purpose of these modifications is to correct the following problems - * with UTF-7: - * - * 1) UTF-7 uses the "+" character for shifting; this conflicts with - * the common use of "+" in mailbox names, in particular USENET - * newsgroup names. - * - * 2) UTF-7's encoding is BASE64 which uses the "/" character; this - * conflicts with the use of "/" as a popular hierarchy delimiter. - * - * 3) UTF-7 prohibits the unencoded usage of "\"; this conflicts with - * the use of "\" as a popular hierarchy delimiter. - * - * 4) UTF-7 prohibits the unencoded usage of "~"; this conflicts with - * the use of "~" in some servers as a home directory indicator. - * - * 5) UTF-7 permits multiple alternate forms to represent the same - * string; in particular, printable US-ASCII chararacters can be - * represented in encoded form. - * - * In modified UTF-7, printable US-ASCII characters except for "&" - * represent themselves; that is, characters with octet values 0x20-0x25 - * and 0x27-0x7e. The character "&" (0x26) is represented by the two- - * octet sequence "&-". - * - * All other characters (octet values 0x00-0x1f, 0x7f-0xff, and all - * Unicode 16-bit octets) are represented in modified BASE64, with a - * further modification from [UTF-7] that "," is used instead of "/". - * Modified BASE64 MUST NOT be used to represent any printing US-ASCII - * character which can represent itself. - * - * "&" is used to shift to modified BASE64 and "-" to shift back to US- - * ASCII. All names start in US-ASCII, and MUST end in US-ASCII (that - * is, a name that ends with a Unicode 16-bit octet MUST end with a "- - * "). - * - * For example, here is a mailbox name which mixes English, Japanese, - * and Chinese text: ~peter/mail/&ZeVnLIqe-/&U,BTFw- - */ - -/* - * Tests for US-ASCII characters belonging to character classes - * defined in UTF-7. - * - * Set D (directly encoded characters) consists of the following - * characters: the upper and lower case letters A through Z - * and a through z, the 10 digits 0-9, and the following nine special - * characters (note that "+" and "=" are omitted): - * '(),-./:? - * - * Set O (optional direct characters) consists of the following - * characters (note that "\" and "~" are omitted): - * !"#$%&*;<=>@[]^_`{|} - * - * According to the rules in RFC 2152, the byte values for the following - * US-ASCII characters are not used in UTF-7 and are therefore illegal: - * - all C0 control codes except for CR LF TAB - * - BACKSLASH - * - TILDE - * - DEL - * - all codes beyond US-ASCII, i.e. all >127 - */ - -/* uses '&' not '+' to start a base64 sequence */ -#define AMPERSAND 0x26 -#define COMMA 0x2c -#define SLASH 0x2f - -/* legal byte values: all US-ASCII graphic characters 0x20..0x7e */ -#define isLegalIMAP(c) (0x20<=(c) && (c)<=0x7e) - -/* direct-encode all of printable ASCII 0x20..0x7e except '&' 0x26 */ -#define inSetDIMAP(c) (isLegalIMAP(c) && c!=AMPERSAND) - -#define TO_BASE64_IMAP(n) ((n)<63 ? toBase64[n] : COMMA) -#define FROM_BASE64_IMAP(c) ((c)==COMMA ? 63 : (c)==SLASH ? -1 : fromBase64[c]) - -/* - * converter status values: - * - * toUnicodeStatus: - * 24 inDirectMode (boolean) - * 23..16 base64Counter (-1..7) - * 15..0 bits (up to 14 bits incoming base64) - * - * fromUnicodeStatus: - * 24 inDirectMode (boolean) - * 23..16 base64Counter (0..2) - * 7..0 bits (6 bits outgoing base64) - * - * ignore bits 31..25 - */ - -static void -_IMAPToUnicodeWithOffsets(UConverterToUnicodeArgs *pArgs, - UErrorCode *pErrorCode) { - UConverter *cnv; - const uint8_t *source, *sourceLimit; - UChar *target; - const UChar *targetLimit; - int32_t *offsets; - - uint8_t *bytes; - uint8_t byteIndex; - - int32_t length, targetCapacity; - - /* UTF-7 state */ - uint16_t bits; - int8_t base64Counter; - UBool inDirectMode; - - int8_t base64Value; - - int32_t sourceIndex, nextSourceIndex; - - UChar c; - uint8_t b; - - /* set up the local pointers */ - cnv=pArgs->converter; - - source=(const uint8_t *)pArgs->source; - sourceLimit=(const uint8_t *)pArgs->sourceLimit; - target=pArgs->target; - targetLimit=pArgs->targetLimit; - offsets=pArgs->offsets; - /* get the state machine state */ - { - uint32_t status=cnv->toUnicodeStatus; - inDirectMode=(UBool)((status>>24)&1); - base64Counter=(int8_t)(status>>16); - bits=(uint16_t)status; - } - bytes=cnv->toUBytes; - byteIndex=cnv->toULength; - - /* sourceIndex=-1 if the current character began in the previous buffer */ - sourceIndex=byteIndex==0 ? 0 : -1; - nextSourceIndex=0; - - if(inDirectMode) { -directMode: - /* - * In Direct Mode, US-ASCII characters are encoded directly, i.e., - * with their US-ASCII byte values. - * An ampersand starts Unicode (or "escape") Mode. - * - * In Direct Mode, only the sourceIndex is used. - */ - byteIndex=0; - length=(int32_t)(sourceLimit-source); - targetCapacity=(int32_t)(targetLimit-target); - if(length>targetCapacity) { - length=targetCapacity; - } - while(length>0) { - b=*source++; - if(!isLegalIMAP(b)) { - /* illegal */ - bytes[0]=b; - byteIndex=1; - *pErrorCode=U_ILLEGAL_CHAR_FOUND; - break; - } else if(b!=AMPERSAND) { - /* write directly encoded character */ - *target++=b; - if(offsets!=NULL) { - *offsets++=sourceIndex++; - } - } else /* AMPERSAND */ { - /* switch to Unicode mode */ - nextSourceIndex=++sourceIndex; - inDirectMode=FALSE; - byteIndex=0; - bits=0; - base64Counter=-1; - goto unicodeMode; - } - --length; - } - if(source=targetLimit) { - /* target is full */ - *pErrorCode=U_BUFFER_OVERFLOW_ERROR; - } - } else { -unicodeMode: - /* - * In Unicode (or "escape") Mode, UTF-16BE is base64-encoded. - * The base64 sequence ends with any character that is not in the base64 alphabet. - * A terminating minus sign is consumed. - * US-ASCII must not be base64-ed. - * - * In Unicode Mode, the sourceIndex has the index to the start of the current - * base64 bytes, while nextSourceIndex is precisely parallel to source, - * keeping the index to the following byte. - * Note that in 2 out of 3 cases, UChars overlap within a base64 byte. - */ - while(source0x7e) { - /* illegal - test other illegal US-ASCII values by base64Value==-3 */ - inDirectMode=TRUE; - *pErrorCode=U_ILLEGAL_CHAR_FOUND; - break; - } else if((base64Value=FROM_BASE64_IMAP(b))>=0) { - /* collect base64 bytes into UChars */ - switch(base64Counter) { - case -1: /* -1 is immediately after the & */ - case 0: - bits=base64Value; - base64Counter=1; - break; - case 1: - case 3: - case 4: - case 6: - bits=(uint16_t)((bits<<6)|base64Value); - ++base64Counter; - break; - case 2: - c=(UChar)((bits<<4)|(base64Value>>2)); - if(isLegalIMAP(c)) { - /* illegal */ - inDirectMode=TRUE; - *pErrorCode=U_ILLEGAL_CHAR_FOUND; - goto endloop; - } - *target++=c; - if(offsets!=NULL) { - *offsets++=sourceIndex; - sourceIndex=nextSourceIndex-1; - } - bytes[0]=b; /* keep this byte in case an error occurs */ - byteIndex=1; - bits=(uint16_t)(base64Value&3); - base64Counter=3; - break; - case 5: - c=(UChar)((bits<<2)|(base64Value>>4)); - if(isLegalIMAP(c)) { - /* illegal */ - inDirectMode=TRUE; - *pErrorCode=U_ILLEGAL_CHAR_FOUND; - goto endloop; - } - *target++=c; - if(offsets!=NULL) { - *offsets++=sourceIndex; - sourceIndex=nextSourceIndex-1; - } - bytes[0]=b; /* keep this byte in case an error occurs */ - byteIndex=1; - bits=(uint16_t)(base64Value&15); - base64Counter=6; - break; - case 7: - c=(UChar)((bits<<6)|base64Value); - if(isLegalIMAP(c)) { - /* illegal */ - inDirectMode=TRUE; - *pErrorCode=U_ILLEGAL_CHAR_FOUND; - goto endloop; - } - *target++=c; - if(offsets!=NULL) { - *offsets++=sourceIndex; - sourceIndex=nextSourceIndex; - } - byteIndex=0; - bits=0; - base64Counter=0; - break; - default: - /* will never occur */ - break; - } - } else if(base64Value==-2) { - /* minus sign terminates the base64 sequence */ - inDirectMode=TRUE; - if(base64Counter==-1) { - /* &- i.e. a minus immediately following an ampersand */ - *target++=AMPERSAND; - if(offsets!=NULL) { - *offsets++=sourceIndex-1; - } - } else { - /* absorb the minus and leave the Unicode Mode */ - if(bits!=0 || (base64Counter!=0 && base64Counter!=3 && base64Counter!=6)) { - /* bits are illegally left over, a UChar is incomplete */ - /* base64Counter other than 0, 3, 6 means non-minimal zero-padding, also illegal */ - *pErrorCode=U_ILLEGAL_CHAR_FOUND; - break; - } - } - sourceIndex=nextSourceIndex; - goto directMode; - } else { - if(base64Counter==-1) { - /* illegal: & immediately followed by something other than base64 or minus sign */ - /* include the ampersand in the reported sequence */ - --sourceIndex; - bytes[0]=AMPERSAND; - bytes[1]=b; - byteIndex=2; - } - /* base64Value==-1 for characters that are illegal only in Unicode mode */ - /* base64Value==-3 for illegal characters */ - /* illegal */ - inDirectMode=TRUE; - *pErrorCode=U_ILLEGAL_CHAR_FOUND; - break; - } - } else { - /* target is full */ - *pErrorCode=U_BUFFER_OVERFLOW_ERROR; - break; - } - } - } -endloop: - - /* - * the end of the input stream and detection of truncated input - * are handled by the framework, but here we must check if we are in Unicode - * mode and byteIndex==0 because we must end in direct mode - * - * conditions: - * successful - * in Unicode mode and byteIndex==0 - * end of input and no truncated input - */ - if( U_SUCCESS(*pErrorCode) && - !inDirectMode && byteIndex==0 && - pArgs->flush && source>=sourceLimit - ) { - if(base64Counter==-1) { - /* & at the very end of the input */ - /* make the ampersand the reported sequence */ - bytes[0]=AMPERSAND; - byteIndex=1; - } - /* else if(base64Counter!=-1) byteIndex remains 0 because there is no particular byte sequence */ - - inDirectMode=TRUE; /* avoid looping */ - *pErrorCode=U_TRUNCATED_CHAR_FOUND; - } - - /* set the converter state back into UConverter */ - cnv->toUnicodeStatus=((uint32_t)inDirectMode<<24)|((uint32_t)((uint8_t)base64Counter)<<16)|(uint32_t)bits; - cnv->toULength=byteIndex; - - /* write back the updated pointers */ - pArgs->source=(const char *)source; - pArgs->target=target; - pArgs->offsets=offsets; - return; -} - -static void -_IMAPFromUnicodeWithOffsets(UConverterFromUnicodeArgs *pArgs, - UErrorCode *pErrorCode) { - UConverter *cnv; - const UChar *source, *sourceLimit; - uint8_t *target, *targetLimit; - int32_t *offsets; - - int32_t length, targetCapacity, sourceIndex; - UChar c; - uint8_t b; - - /* UTF-7 state */ - uint8_t bits; - int8_t base64Counter; - UBool inDirectMode; - - /* set up the local pointers */ - cnv=pArgs->converter; - - /* set up the local pointers */ - source=pArgs->source; - sourceLimit=pArgs->sourceLimit; - target=(uint8_t *)pArgs->target; - targetLimit=(uint8_t *)pArgs->targetLimit; - offsets=pArgs->offsets; - - /* get the state machine state */ - { - uint32_t status=cnv->fromUnicodeStatus; - inDirectMode=(UBool)((status>>24)&1); - base64Counter=(int8_t)(status>>16); - bits=(uint8_t)status; - } - - /* UTF-7 always encodes UTF-16 code units, therefore we need only a simple sourceIndex */ - sourceIndex=0; - - if(inDirectMode) { -directMode: - length=(int32_t)(sourceLimit-source); - targetCapacity=(int32_t)(targetLimit-target); - if(length>targetCapacity) { - length=targetCapacity; - } - while(length>0) { - c=*source++; - /* encode 0x20..0x7e except '&' directly */ - if(inSetDIMAP(c)) { - /* encode directly */ - *target++=(uint8_t)c; - if(offsets!=NULL) { - *offsets++=sourceIndex++; - } - } else if(c==AMPERSAND) { - /* output &- for & */ - *target++=AMPERSAND; - if(targetcharErrorBuffer[0]=MINUS; - cnv->charErrorBufferLength=1; - *pErrorCode=U_BUFFER_OVERFLOW_ERROR; - break; - } - } else { - /* un-read this character and switch to Unicode Mode */ - --source; - *target++=AMPERSAND; - if(offsets!=NULL) { - *offsets++=sourceIndex; - } - inDirectMode=FALSE; - base64Counter=0; - goto unicodeMode; - } - --length; - } - if(source=targetLimit) { - /* target is full */ - *pErrorCode=U_BUFFER_OVERFLOW_ERROR; - } - } else { -unicodeMode: - while(sourcecharErrorBuffer[0]=MINUS; - cnv->charErrorBufferLength=1; - *pErrorCode=U_BUFFER_OVERFLOW_ERROR; - break; - } - goto directMode; - } else { - /* - * base64 this character: - * Output 2 or 3 base64 bytes for the remaining bits of the previous character - * and the bits of this character, each implicitly in UTF-16BE. - * - * Here, bits is an 8-bit variable because only 6 bits need to be kept from one - * character to the next. The actual 2 or 4 bits are shifted to the left edge - * of the 6-bits field 5..0 to make the termination of the base64 sequence easier. - */ - switch(base64Counter) { - case 0: - b=(uint8_t)(c>>10); - *target++=TO_BASE64_IMAP(b); - if(target>4)&0x3f); - *target++=TO_BASE64_IMAP(b); - if(offsets!=NULL) { - *offsets++=sourceIndex; - *offsets++=sourceIndex++; - } - } else { - if(offsets!=NULL) { - *offsets++=sourceIndex++; - } - b=(uint8_t)((c>>4)&0x3f); - cnv->charErrorBuffer[0]=TO_BASE64_IMAP(b); - cnv->charErrorBufferLength=1; - *pErrorCode=U_BUFFER_OVERFLOW_ERROR; - } - bits=(uint8_t)((c&15)<<2); - base64Counter=1; - break; - case 1: - b=(uint8_t)(bits|(c>>14)); - *target++=TO_BASE64_IMAP(b); - if(target>8)&0x3f); - *target++=TO_BASE64_IMAP(b); - if(target>2)&0x3f); - *target++=TO_BASE64_IMAP(b); - if(offsets!=NULL) { - *offsets++=sourceIndex; - *offsets++=sourceIndex; - *offsets++=sourceIndex++; - } - } else { - if(offsets!=NULL) { - *offsets++=sourceIndex; - *offsets++=sourceIndex++; - } - b=(uint8_t)((c>>2)&0x3f); - cnv->charErrorBuffer[0]=TO_BASE64_IMAP(b); - cnv->charErrorBufferLength=1; - *pErrorCode=U_BUFFER_OVERFLOW_ERROR; - } - } else { - if(offsets!=NULL) { - *offsets++=sourceIndex++; - } - b=(uint8_t)((c>>8)&0x3f); - cnv->charErrorBuffer[0]=TO_BASE64_IMAP(b); - b=(uint8_t)((c>>2)&0x3f); - cnv->charErrorBuffer[1]=TO_BASE64_IMAP(b); - cnv->charErrorBufferLength=2; - *pErrorCode=U_BUFFER_OVERFLOW_ERROR; - } - bits=(uint8_t)((c&3)<<4); - base64Counter=2; - break; - case 2: - b=(uint8_t)(bits|(c>>12)); - *target++=TO_BASE64_IMAP(b); - if(target>6)&0x3f); - *target++=TO_BASE64_IMAP(b); - if(targetcharErrorBuffer[0]=TO_BASE64_IMAP(b); - cnv->charErrorBufferLength=1; - *pErrorCode=U_BUFFER_OVERFLOW_ERROR; - } - } else { - if(offsets!=NULL) { - *offsets++=sourceIndex++; - } - b=(uint8_t)((c>>6)&0x3f); - cnv->charErrorBuffer[0]=TO_BASE64_IMAP(b); - b=(uint8_t)(c&0x3f); - cnv->charErrorBuffer[1]=TO_BASE64_IMAP(b); - cnv->charErrorBufferLength=2; - *pErrorCode=U_BUFFER_OVERFLOW_ERROR; - } - bits=0; - base64Counter=0; - break; - default: - /* will never occur */ - break; - } - } - } else { - /* target is full */ - *pErrorCode=U_BUFFER_OVERFLOW_ERROR; - break; - } - } - } - - if(pArgs->flush && source>=sourceLimit) { - /* flush remaining bits to the target */ - if(!inDirectMode) { - if(base64Counter!=0) { - if(targetcharErrorBuffer[cnv->charErrorBufferLength++]=TO_BASE64_IMAP(bits); - *pErrorCode=U_BUFFER_OVERFLOW_ERROR; - } - } - /* need to terminate with a minus */ - if(targetcharErrorBuffer[cnv->charErrorBufferLength++]=MINUS; - *pErrorCode=U_BUFFER_OVERFLOW_ERROR; - } - } - /* reset the state for the next conversion */ - cnv->fromUnicodeStatus=(cnv->fromUnicodeStatus&0xf0000000)|0x1000000; /* keep version, inDirectMode=TRUE */ - } else { - /* set the converter state back into UConverter */ - cnv->fromUnicodeStatus= - (cnv->fromUnicodeStatus&0xf0000000)| /* keep version*/ - ((uint32_t)inDirectMode<<24)|((uint32_t)base64Counter<<16)|(uint32_t)bits; - } - - /* write back the updated pointers */ - pArgs->source=source; - pArgs->target=(char *)target; - pArgs->offsets=offsets; - return; -} - -static const UConverterImpl _IMAPImpl={ - UCNV_IMAP_MAILBOX, - - NULL, - NULL, - - _UTF7Open, - NULL, - _UTF7Reset, - - _IMAPToUnicodeWithOffsets, - _IMAPToUnicodeWithOffsets, - _IMAPFromUnicodeWithOffsets, - _IMAPFromUnicodeWithOffsets, - NULL, - - NULL, - NULL, - NULL, /* we don't need writeSub() because we never call a callback at fromUnicode() */ - NULL, - ucnv_getCompleteUnicodeSet -}; - -static const UConverterStaticData _IMAPStaticData={ - sizeof(UConverterStaticData), - "IMAP-mailbox-name", - 0, /* TODO CCSID for IMAP-mailbox-name */ - UCNV_IBM, UCNV_IMAP_MAILBOX, - 1, 4, - { 0x3f, 0, 0, 0 }, 1, /* the subchar is not used */ - FALSE, FALSE, - 0, - 0, - { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 } /* reserved */ -}; - -const UConverterSharedData _IMAPData= - UCNV_IMMUTABLE_SHARED_DATA_INITIALIZER(&_IMAPStaticData, &_IMAPImpl); - -#endif diff --git a/Build/source/libs/icu/icu-src/source/common/ucnv_u7.cpp b/Build/source/libs/icu/icu-src/source/common/ucnv_u7.cpp new file mode 100644 index 00000000000..87ba8cf37ec --- /dev/null +++ b/Build/source/libs/icu/icu-src/source/common/ucnv_u7.cpp @@ -0,0 +1,1491 @@ +// © 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html +/* +********************************************************************** +* Copyright (C) 2002-2016, International Business Machines +* Corporation and others. All Rights Reserved. +********************************************************************** +* file name: ucnv_u7.c +* encoding: UTF-8 +* tab size: 8 (not used) +* indentation:4 +* +* created on: 2002jul01 +* created by: Markus W. Scherer +* +* UTF-7 converter implementation. Used to be in ucnv_utf.c. +*/ + +#include "unicode/utypes.h" + +#if !UCONFIG_NO_CONVERSION && !UCONFIG_ONLY_HTML_CONVERSION + +#include "cmemory.h" +#include "unicode/ucnv.h" +#include "ucnv_bld.h" +#include "ucnv_cnv.h" +#include "uassert.h" + +/* UTF-7 -------------------------------------------------------------------- */ + +/* + * UTF-7 is a stateful encoding of Unicode. + * It is defined in RFC 2152. (http://www.ietf.org/rfc/rfc2152.txt) + * It was intended for use in Internet email systems, using in its bytewise + * encoding only a subset of 7-bit US-ASCII. + * UTF-7 is deprecated in favor of UTF-8/16/32 and SCSU, but still + * occasionally used. + * + * For converting Unicode to UTF-7, the RFC allows to encode some US-ASCII + * characters directly or in base64. Especially, the characters in set O + * as defined in the RFC (see below) may be encoded directly but are not + * allowed in, e.g., email headers. + * By default, the ICU UTF-7 converter encodes set O directly. + * By choosing the option "version=1", set O will be escaped instead. + * For example: + * utf7Converter=ucnv_open("UTF-7,version=1"); + * + * For details about email headers see RFC 2047. + */ + +/* + * Tests for US-ASCII characters belonging to character classes + * defined in UTF-7. + * + * Set D (directly encoded characters) consists of the following + * characters: the upper and lower case letters A through Z + * and a through z, the 10 digits 0-9, and the following nine special + * characters (note that "+" and "=" are omitted): + * '(),-./:? + * + * Set O (optional direct characters) consists of the following + * characters (note that "\" and "~" are omitted): + * !"#$%&*;<=>@[]^_`{|} + * + * According to the rules in RFC 2152, the byte values for the following + * US-ASCII characters are not used in UTF-7 and are therefore illegal: + * - all C0 control codes except for CR LF TAB + * - BACKSLASH + * - TILDE + * - DEL + * - all codes beyond US-ASCII, i.e. all >127 + */ +#define inSetD(c) \ + ((uint8_t)((c)-97)<26 || (uint8_t)((c)-65)<26 || /* letters */ \ + (uint8_t)((c)-48)<10 || /* digits */ \ + (uint8_t)((c)-39)<3 || /* '() */ \ + (uint8_t)((c)-44)<4 || /* ,-./ */ \ + (c)==58 || (c)==63 /* :? */ \ + ) + +#define inSetO(c) \ + ((uint8_t)((c)-33)<6 || /* !"#$%& */ \ + (uint8_t)((c)-59)<4 || /* ;<=> */ \ + (uint8_t)((c)-93)<4 || /* ]^_` */ \ + (uint8_t)((c)-123)<3 || /* {|} */ \ + (c)==42 || (c)==64 || (c)==91 /* *@[ */ \ + ) + +#define isCRLFTAB(c) ((c)==13 || (c)==10 || (c)==9) +#define isCRLFSPTAB(c) ((c)==32 || (c)==13 || (c)==10 || (c)==9) + +#define PLUS 43 +#define MINUS 45 +#define BACKSLASH 92 +#define TILDE 126 + +/* legal byte values: all US-ASCII graphic characters from space to before tilde, and CR LF TAB */ +#define isLegalUTF7(c) (((uint8_t)((c)-32)<94 && (c)!=BACKSLASH) || isCRLFTAB(c)) + +/* encode directly sets D and O and CR LF SP TAB */ +static const UBool encodeDirectlyMaximum[128]={ + /* 0 1 2 3 4 5 6 7 8 9 a b c d e f */ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, + + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0 +}; + +/* encode directly set D and CR LF SP TAB but not set O */ +static const UBool encodeDirectlyRestricted[128]={ + /* 0 1 2 3 4 5 6 7 8 9 a b c d e f */ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, + + 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, + + 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0 +}; + +static const uint8_t +toBase64[64]={ + /* A-Z */ + 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, + 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, + /* a-z */ + 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, + 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, + /* 0-9 */ + 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, + /* +/ */ + 43, 47 +}; + +static const int8_t +fromBase64[128]={ + /* C0 controls, -1 for legal ones (CR LF TAB), -3 for illegal ones */ + -3, -3, -3, -3, -3, -3, -3, -3, -3, -1, -1, -3, -3, -1, -3, -3, + -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, + + /* general punctuation with + and / and a special value (-2) for - */ + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 62, -1, -2, -1, 63, + /* digits */ + 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, -1, -1, -1, -1, -1, -1, + + /* A-Z */ + -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, -3, -1, -1, -1, + + /* a-z */ + -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, -3, -3 +}; + +/* + * converter status values: + * + * toUnicodeStatus: + * 24 inDirectMode (boolean) + * 23..16 base64Counter (-1..7) + * 15..0 bits (up to 14 bits incoming base64) + * + * fromUnicodeStatus: + * 31..28 version (0: set O direct 1: set O escaped) + * 24 inDirectMode (boolean) + * 23..16 base64Counter (0..2) + * 7..0 bits (6 bits outgoing base64) + * + */ + +U_CDECL_BEGIN +static void U_CALLCONV +_UTF7Reset(UConverter *cnv, UConverterResetChoice choice) { + if(choice<=UCNV_RESET_TO_UNICODE) { + /* reset toUnicode */ + cnv->toUnicodeStatus=0x1000000; /* inDirectMode=TRUE */ + cnv->toULength=0; + } + if(choice!=UCNV_RESET_TO_UNICODE) { + /* reset fromUnicode */ + cnv->fromUnicodeStatus=(cnv->fromUnicodeStatus&0xf0000000)|0x1000000; /* keep version, inDirectMode=TRUE */ + } +} + +static void U_CALLCONV +_UTF7Open(UConverter *cnv, + UConverterLoadArgs *pArgs, + UErrorCode *pErrorCode) { + (void)pArgs; + if(UCNV_GET_VERSION(cnv)<=1) { + /* TODO(markus): Should just use cnv->options rather than copying the version number. */ + cnv->fromUnicodeStatus=UCNV_GET_VERSION(cnv)<<28; + _UTF7Reset(cnv, UCNV_RESET_BOTH); + } else { + *pErrorCode=U_ILLEGAL_ARGUMENT_ERROR; + } +} + +static void U_CALLCONV +_UTF7ToUnicodeWithOffsets(UConverterToUnicodeArgs *pArgs, + UErrorCode *pErrorCode) { + UConverter *cnv; + const uint8_t *source, *sourceLimit; + UChar *target; + const UChar *targetLimit; + int32_t *offsets; + + uint8_t *bytes; + uint8_t byteIndex; + + int32_t length, targetCapacity; + + /* UTF-7 state */ + uint16_t bits; + int8_t base64Counter; + UBool inDirectMode; + + int8_t base64Value; + + int32_t sourceIndex, nextSourceIndex; + + uint8_t b; + /* set up the local pointers */ + cnv=pArgs->converter; + + source=(const uint8_t *)pArgs->source; + sourceLimit=(const uint8_t *)pArgs->sourceLimit; + target=pArgs->target; + targetLimit=pArgs->targetLimit; + offsets=pArgs->offsets; + /* get the state machine state */ + { + uint32_t status=cnv->toUnicodeStatus; + inDirectMode=(UBool)((status>>24)&1); + base64Counter=(int8_t)(status>>16); + bits=(uint16_t)status; + } + bytes=cnv->toUBytes; + byteIndex=cnv->toULength; + + /* sourceIndex=-1 if the current character began in the previous buffer */ + sourceIndex=byteIndex==0 ? 0 : -1; + nextSourceIndex=0; + + if(inDirectMode) { +directMode: + /* + * In Direct Mode, most US-ASCII characters are encoded directly, i.e., + * with their US-ASCII byte values. + * Backslash and Tilde and most control characters are not allowed in UTF-7. + * A plus sign starts Unicode (or "escape") Mode. + * + * In Direct Mode, only the sourceIndex is used. + */ + byteIndex=0; + length=(int32_t)(sourceLimit-source); + targetCapacity=(int32_t)(targetLimit-target); + if(length>targetCapacity) { + length=targetCapacity; + } + while(length>0) { + b=*source++; + if(!isLegalUTF7(b)) { + /* illegal */ + bytes[0]=b; + byteIndex=1; + *pErrorCode=U_ILLEGAL_CHAR_FOUND; + break; + } else if(b!=PLUS) { + /* write directly encoded character */ + *target++=b; + if(offsets!=NULL) { + *offsets++=sourceIndex++; + } + } else /* PLUS */ { + /* switch to Unicode mode */ + nextSourceIndex=++sourceIndex; + inDirectMode=FALSE; + byteIndex=0; + bits=0; + base64Counter=-1; + goto unicodeMode; + } + --length; + } + if(source=targetLimit) { + /* target is full */ + *pErrorCode=U_BUFFER_OVERFLOW_ERROR; + } + } else { +unicodeMode: + /* + * In Unicode (or "escape") Mode, UTF-16BE is base64-encoded. + * The base64 sequence ends with any character that is not in the base64 alphabet. + * A terminating minus sign is consumed. + * + * In Unicode Mode, the sourceIndex has the index to the start of the current + * base64 bytes, while nextSourceIndex is precisely parallel to source, + * keeping the index to the following byte. + * Note that in 2 out of 3 cases, UChars overlap within a base64 byte. + */ + while(source=126 || (base64Value=fromBase64[b])==-3 || base64Value==-1) { + /* either + * base64Value==-1 for any legal character except base64 and minus sign, or + * base64Value==-3 for illegal characters: + * 1. In either case, leave Unicode mode. + * 2.1. If we ended with an incomplete UChar or none after the +, then + * generate an error for the preceding erroneous sequence and deal with + * the current (possibly illegal) character next time through. + * 2.2. Else the current char comes after a complete UChar, which was already + * pushed to the output buf, so: + * 2.2.1. If the current char is legal, just save it for processing next time. + * It may be for example, a plus which we need to deal with in direct mode. + * 2.2.2. Else if the current char is illegal, we might as well deal with it here. + */ + inDirectMode=TRUE; + if(base64Counter==-1) { + /* illegal: + immediately followed by something other than base64 or minus sign */ + /* include the plus sign in the reported sequence, but not the subsequent char */ + --source; + bytes[0]=PLUS; + byteIndex=1; + *pErrorCode=U_ILLEGAL_CHAR_FOUND; + break; + } else if(bits!=0) { + /* bits are illegally left over, a UChar is incomplete */ + /* don't include current char (legal or illegal) in error seq */ + --source; + --byteIndex; + *pErrorCode=U_ILLEGAL_CHAR_FOUND; + break; + } else { + /* previous UChar was complete */ + if(base64Value==-3) { + /* current character is illegal, deal with it here */ + *pErrorCode=U_ILLEGAL_CHAR_FOUND; + break; + } else { + /* un-read the current character in case it is a plus sign */ + --source; + sourceIndex=nextSourceIndex-1; + goto directMode; + } + } + } else if(base64Value>=0) { + /* collect base64 bytes into UChars */ + switch(base64Counter) { + case -1: /* -1 is immediately after the + */ + case 0: + bits=base64Value; + base64Counter=1; + break; + case 1: + case 3: + case 4: + case 6: + bits=(uint16_t)((bits<<6)|base64Value); + ++base64Counter; + break; + case 2: + *target++=(UChar)((bits<<4)|(base64Value>>2)); + if(offsets!=NULL) { + *offsets++=sourceIndex; + sourceIndex=nextSourceIndex-1; + } + bytes[0]=b; /* keep this byte in case an error occurs */ + byteIndex=1; + bits=(uint16_t)(base64Value&3); + base64Counter=3; + break; + case 5: + *target++=(UChar)((bits<<2)|(base64Value>>4)); + if(offsets!=NULL) { + *offsets++=sourceIndex; + sourceIndex=nextSourceIndex-1; + } + bytes[0]=b; /* keep this byte in case an error occurs */ + byteIndex=1; + bits=(uint16_t)(base64Value&15); + base64Counter=6; + break; + case 7: + *target++=(UChar)((bits<<6)|base64Value); + if(offsets!=NULL) { + *offsets++=sourceIndex; + sourceIndex=nextSourceIndex; + } + byteIndex=0; + bits=0; + base64Counter=0; + break; + default: + /* will never occur */ + break; + } + } else /*base64Value==-2*/ { + /* minus sign terminates the base64 sequence */ + inDirectMode=TRUE; + if(base64Counter==-1) { + /* +- i.e. a minus immediately following a plus */ + *target++=PLUS; + if(offsets!=NULL) { + *offsets++=sourceIndex-1; + } + } else { + /* absorb the minus and leave the Unicode Mode */ + if(bits!=0) { + /* bits are illegally left over, a UChar is incomplete */ + *pErrorCode=U_ILLEGAL_CHAR_FOUND; + break; + } + } + sourceIndex=nextSourceIndex; + goto directMode; + } + } else { + /* target is full */ + *pErrorCode=U_BUFFER_OVERFLOW_ERROR; + break; + } + } + } + + if(U_SUCCESS(*pErrorCode) && pArgs->flush && source==sourceLimit && bits==0) { + /* + * if we are in Unicode mode, then the byteIndex might not be 0, + * but that is ok if bits==0 + * -> we set byteIndex=0 at the end of the stream to avoid a truncated error + * (not true for IMAP-mailbox-name where we must end in direct mode) + */ + byteIndex=0; + } + + /* set the converter state back into UConverter */ + cnv->toUnicodeStatus=((uint32_t)inDirectMode<<24)|((uint32_t)((uint8_t)base64Counter)<<16)|(uint32_t)bits; + cnv->toULength=byteIndex; + + /* write back the updated pointers */ + pArgs->source=(const char *)source; + pArgs->target=target; + pArgs->offsets=offsets; + return; +} + +static void U_CALLCONV +_UTF7FromUnicodeWithOffsets(UConverterFromUnicodeArgs *pArgs, + UErrorCode *pErrorCode) { + UConverter *cnv; + const UChar *source, *sourceLimit; + uint8_t *target, *targetLimit; + int32_t *offsets; + + int32_t length, targetCapacity, sourceIndex; + UChar c; + + /* UTF-7 state */ + const UBool *encodeDirectly; + uint8_t bits; + int8_t base64Counter; + UBool inDirectMode; + + /* set up the local pointers */ + cnv=pArgs->converter; + + /* set up the local pointers */ + source=pArgs->source; + sourceLimit=pArgs->sourceLimit; + target=(uint8_t *)pArgs->target; + targetLimit=(uint8_t *)pArgs->targetLimit; + offsets=pArgs->offsets; + + /* get the state machine state */ + { + uint32_t status=cnv->fromUnicodeStatus; + encodeDirectly= status<0x10000000 ? encodeDirectlyMaximum : encodeDirectlyRestricted; + inDirectMode=(UBool)((status>>24)&1); + base64Counter=(int8_t)(status>>16); + bits=(uint8_t)status; + U_ASSERT(bits<=UPRV_LENGTHOF(toBase64)); + } + + /* UTF-7 always encodes UTF-16 code units, therefore we need only a simple sourceIndex */ + sourceIndex=0; + + if(inDirectMode) { +directMode: + length=(int32_t)(sourceLimit-source); + targetCapacity=(int32_t)(targetLimit-target); + if(length>targetCapacity) { + length=targetCapacity; + } + while(length>0) { + c=*source++; + /* currently always encode CR LF SP TAB directly */ + if(c<=127 && encodeDirectly[c]) { + /* encode directly */ + *target++=(uint8_t)c; + if(offsets!=NULL) { + *offsets++=sourceIndex++; + } + } else if(c==PLUS) { + /* output +- for + */ + *target++=PLUS; + if(targetcharErrorBuffer[0]=MINUS; + cnv->charErrorBufferLength=1; + *pErrorCode=U_BUFFER_OVERFLOW_ERROR; + break; + } + } else { + /* un-read this character and switch to Unicode Mode */ + --source; + *target++=PLUS; + if(offsets!=NULL) { + *offsets++=sourceIndex; + } + inDirectMode=FALSE; + base64Counter=0; + goto unicodeMode; + } + --length; + } + if(source=targetLimit) { + /* target is full */ + *pErrorCode=U_BUFFER_OVERFLOW_ERROR; + } + } else { +unicodeMode: + while(sourcecharErrorBuffer[0]=MINUS; + cnv->charErrorBufferLength=1; + *pErrorCode=U_BUFFER_OVERFLOW_ERROR; + break; + } + } + goto directMode; + } else { + /* + * base64 this character: + * Output 2 or 3 base64 bytes for the remaining bits of the previous character + * and the bits of this character, each implicitly in UTF-16BE. + * + * Here, bits is an 8-bit variable because only 6 bits need to be kept from one + * character to the next. The actual 2 or 4 bits are shifted to the left edge + * of the 6-bits field 5..0 to make the termination of the base64 sequence easier. + */ + switch(base64Counter) { + case 0: + *target++=toBase64[c>>10]; + if(target>4)&0x3f]; + if(offsets!=NULL) { + *offsets++=sourceIndex; + *offsets++=sourceIndex++; + } + } else { + if(offsets!=NULL) { + *offsets++=sourceIndex++; + } + cnv->charErrorBuffer[0]=toBase64[(c>>4)&0x3f]; + cnv->charErrorBufferLength=1; + *pErrorCode=U_BUFFER_OVERFLOW_ERROR; + } + bits=(uint8_t)((c&15)<<2); + base64Counter=1; + break; + case 1: + *target++=toBase64[bits|(c>>14)]; + if(target>8)&0x3f]; + if(target>2)&0x3f]; + if(offsets!=NULL) { + *offsets++=sourceIndex; + *offsets++=sourceIndex; + *offsets++=sourceIndex++; + } + } else { + if(offsets!=NULL) { + *offsets++=sourceIndex; + *offsets++=sourceIndex++; + } + cnv->charErrorBuffer[0]=toBase64[(c>>2)&0x3f]; + cnv->charErrorBufferLength=1; + *pErrorCode=U_BUFFER_OVERFLOW_ERROR; + } + } else { + if(offsets!=NULL) { + *offsets++=sourceIndex++; + } + cnv->charErrorBuffer[0]=toBase64[(c>>8)&0x3f]; + cnv->charErrorBuffer[1]=toBase64[(c>>2)&0x3f]; + cnv->charErrorBufferLength=2; + *pErrorCode=U_BUFFER_OVERFLOW_ERROR; + } + bits=(uint8_t)((c&3)<<4); + base64Counter=2; + break; + case 2: + *target++=toBase64[bits|(c>>12)]; + if(target>6)&0x3f]; + if(targetcharErrorBuffer[0]=toBase64[c&0x3f]; + cnv->charErrorBufferLength=1; + *pErrorCode=U_BUFFER_OVERFLOW_ERROR; + } + } else { + if(offsets!=NULL) { + *offsets++=sourceIndex++; + } + cnv->charErrorBuffer[0]=toBase64[(c>>6)&0x3f]; + cnv->charErrorBuffer[1]=toBase64[c&0x3f]; + cnv->charErrorBufferLength=2; + *pErrorCode=U_BUFFER_OVERFLOW_ERROR; + } + bits=0; + base64Counter=0; + break; + default: + /* will never occur */ + break; + } + } + } else { + /* target is full */ + *pErrorCode=U_BUFFER_OVERFLOW_ERROR; + break; + } + } + } + + if(pArgs->flush && source>=sourceLimit) { + /* flush remaining bits to the target */ + if(!inDirectMode) { + if (base64Counter!=0) { + if(targetcharErrorBuffer[cnv->charErrorBufferLength++]=toBase64[bits]; + *pErrorCode=U_BUFFER_OVERFLOW_ERROR; + } + } + /* Add final MINUS to terminate unicodeMode */ + if(targetcharErrorBuffer[cnv->charErrorBufferLength++]=MINUS; + *pErrorCode=U_BUFFER_OVERFLOW_ERROR; + } + } + /* reset the state for the next conversion */ + cnv->fromUnicodeStatus=(cnv->fromUnicodeStatus&0xf0000000)|0x1000000; /* keep version, inDirectMode=TRUE */ + } else { + /* set the converter state back into UConverter */ + cnv->fromUnicodeStatus= + (cnv->fromUnicodeStatus&0xf0000000)| /* keep version*/ + ((uint32_t)inDirectMode<<24)|((uint32_t)base64Counter<<16)|(uint32_t)bits; + } + + /* write back the updated pointers */ + pArgs->source=source; + pArgs->target=(char *)target; + pArgs->offsets=offsets; + return; +} + +static const char * U_CALLCONV +_UTF7GetName(const UConverter *cnv) { + switch(cnv->fromUnicodeStatus>>28) { + case 1: + return "UTF-7,version=1"; + default: + return "UTF-7"; + } +} +U_CDECL_END + +static const UConverterImpl _UTF7Impl={ + UCNV_UTF7, + + NULL, + NULL, + + _UTF7Open, + NULL, + _UTF7Reset, + + _UTF7ToUnicodeWithOffsets, + _UTF7ToUnicodeWithOffsets, + _UTF7FromUnicodeWithOffsets, + _UTF7FromUnicodeWithOffsets, + NULL, + + NULL, + _UTF7GetName, + NULL, /* we don't need writeSub() because we never call a callback at fromUnicode() */ + NULL, + ucnv_getCompleteUnicodeSet, + + NULL, + NULL +}; + +static const UConverterStaticData _UTF7StaticData={ + sizeof(UConverterStaticData), + "UTF-7", + 0, /* TODO CCSID for UTF-7 */ + UCNV_IBM, UCNV_UTF7, + 1, 4, + { 0x3f, 0, 0, 0 }, 1, /* the subchar is not used */ + FALSE, FALSE, + 0, + 0, + { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 } /* reserved */ +}; + +const UConverterSharedData _UTF7Data= + UCNV_IMMUTABLE_SHARED_DATA_INITIALIZER(&_UTF7StaticData, &_UTF7Impl); + +/* IMAP mailbox name encoding ----------------------------------------------- */ + +/* + * RFC 2060: INTERNET MESSAGE ACCESS PROTOCOL - VERSION 4rev1 + * http://www.ietf.org/rfc/rfc2060.txt + * + * 5.1.3. Mailbox International Naming Convention + * + * By convention, international mailbox names are specified using a + * modified version of the UTF-7 encoding described in [UTF-7]. The + * purpose of these modifications is to correct the following problems + * with UTF-7: + * + * 1) UTF-7 uses the "+" character for shifting; this conflicts with + * the common use of "+" in mailbox names, in particular USENET + * newsgroup names. + * + * 2) UTF-7's encoding is BASE64 which uses the "/" character; this + * conflicts with the use of "/" as a popular hierarchy delimiter. + * + * 3) UTF-7 prohibits the unencoded usage of "\"; this conflicts with + * the use of "\" as a popular hierarchy delimiter. + * + * 4) UTF-7 prohibits the unencoded usage of "~"; this conflicts with + * the use of "~" in some servers as a home directory indicator. + * + * 5) UTF-7 permits multiple alternate forms to represent the same + * string; in particular, printable US-ASCII chararacters can be + * represented in encoded form. + * + * In modified UTF-7, printable US-ASCII characters except for "&" + * represent themselves; that is, characters with octet values 0x20-0x25 + * and 0x27-0x7e. The character "&" (0x26) is represented by the two- + * octet sequence "&-". + * + * All other characters (octet values 0x00-0x1f, 0x7f-0xff, and all + * Unicode 16-bit octets) are represented in modified BASE64, with a + * further modification from [UTF-7] that "," is used instead of "/". + * Modified BASE64 MUST NOT be used to represent any printing US-ASCII + * character which can represent itself. + * + * "&" is used to shift to modified BASE64 and "-" to shift back to US- + * ASCII. All names start in US-ASCII, and MUST end in US-ASCII (that + * is, a name that ends with a Unicode 16-bit octet MUST end with a "- + * "). + * + * For example, here is a mailbox name which mixes English, Japanese, + * and Chinese text: ~peter/mail/&ZeVnLIqe-/&U,BTFw- + */ + +/* + * Tests for US-ASCII characters belonging to character classes + * defined in UTF-7. + * + * Set D (directly encoded characters) consists of the following + * characters: the upper and lower case letters A through Z + * and a through z, the 10 digits 0-9, and the following nine special + * characters (note that "+" and "=" are omitted): + * '(),-./:? + * + * Set O (optional direct characters) consists of the following + * characters (note that "\" and "~" are omitted): + * !"#$%&*;<=>@[]^_`{|} + * + * According to the rules in RFC 2152, the byte values for the following + * US-ASCII characters are not used in UTF-7 and are therefore illegal: + * - all C0 control codes except for CR LF TAB + * - BACKSLASH + * - TILDE + * - DEL + * - all codes beyond US-ASCII, i.e. all >127 + */ + +/* uses '&' not '+' to start a base64 sequence */ +#define AMPERSAND 0x26 +#define COMMA 0x2c +#define SLASH 0x2f + +/* legal byte values: all US-ASCII graphic characters 0x20..0x7e */ +#define isLegalIMAP(c) (0x20<=(c) && (c)<=0x7e) + +/* direct-encode all of printable ASCII 0x20..0x7e except '&' 0x26 */ +#define inSetDIMAP(c) (isLegalIMAP(c) && c!=AMPERSAND) + +#define TO_BASE64_IMAP(n) ((n)<63 ? toBase64[n] : COMMA) +#define FROM_BASE64_IMAP(c) ((c)==COMMA ? 63 : (c)==SLASH ? -1 : fromBase64[c]) + +/* + * converter status values: + * + * toUnicodeStatus: + * 24 inDirectMode (boolean) + * 23..16 base64Counter (-1..7) + * 15..0 bits (up to 14 bits incoming base64) + * + * fromUnicodeStatus: + * 24 inDirectMode (boolean) + * 23..16 base64Counter (0..2) + * 7..0 bits (6 bits outgoing base64) + * + * ignore bits 31..25 + */ + +U_CDECL_BEGIN +static void U_CALLCONV +_IMAPToUnicodeWithOffsets(UConverterToUnicodeArgs *pArgs, + UErrorCode *pErrorCode) { + UConverter *cnv; + const uint8_t *source, *sourceLimit; + UChar *target; + const UChar *targetLimit; + int32_t *offsets; + + uint8_t *bytes; + uint8_t byteIndex; + + int32_t length, targetCapacity; + + /* UTF-7 state */ + uint16_t bits; + int8_t base64Counter; + UBool inDirectMode; + + int8_t base64Value; + + int32_t sourceIndex, nextSourceIndex; + + UChar c; + uint8_t b; + + /* set up the local pointers */ + cnv=pArgs->converter; + + source=(const uint8_t *)pArgs->source; + sourceLimit=(const uint8_t *)pArgs->sourceLimit; + target=pArgs->target; + targetLimit=pArgs->targetLimit; + offsets=pArgs->offsets; + /* get the state machine state */ + { + uint32_t status=cnv->toUnicodeStatus; + inDirectMode=(UBool)((status>>24)&1); + base64Counter=(int8_t)(status>>16); + bits=(uint16_t)status; + } + bytes=cnv->toUBytes; + byteIndex=cnv->toULength; + + /* sourceIndex=-1 if the current character began in the previous buffer */ + sourceIndex=byteIndex==0 ? 0 : -1; + nextSourceIndex=0; + + if(inDirectMode) { +directMode: + /* + * In Direct Mode, US-ASCII characters are encoded directly, i.e., + * with their US-ASCII byte values. + * An ampersand starts Unicode (or "escape") Mode. + * + * In Direct Mode, only the sourceIndex is used. + */ + byteIndex=0; + length=(int32_t)(sourceLimit-source); + targetCapacity=(int32_t)(targetLimit-target); + if(length>targetCapacity) { + length=targetCapacity; + } + while(length>0) { + b=*source++; + if(!isLegalIMAP(b)) { + /* illegal */ + bytes[0]=b; + byteIndex=1; + *pErrorCode=U_ILLEGAL_CHAR_FOUND; + break; + } else if(b!=AMPERSAND) { + /* write directly encoded character */ + *target++=b; + if(offsets!=NULL) { + *offsets++=sourceIndex++; + } + } else /* AMPERSAND */ { + /* switch to Unicode mode */ + nextSourceIndex=++sourceIndex; + inDirectMode=FALSE; + byteIndex=0; + bits=0; + base64Counter=-1; + goto unicodeMode; + } + --length; + } + if(source=targetLimit) { + /* target is full */ + *pErrorCode=U_BUFFER_OVERFLOW_ERROR; + } + } else { +unicodeMode: + /* + * In Unicode (or "escape") Mode, UTF-16BE is base64-encoded. + * The base64 sequence ends with any character that is not in the base64 alphabet. + * A terminating minus sign is consumed. + * US-ASCII must not be base64-ed. + * + * In Unicode Mode, the sourceIndex has the index to the start of the current + * base64 bytes, while nextSourceIndex is precisely parallel to source, + * keeping the index to the following byte. + * Note that in 2 out of 3 cases, UChars overlap within a base64 byte. + */ + while(source0x7e) { + /* illegal - test other illegal US-ASCII values by base64Value==-3 */ + inDirectMode=TRUE; + *pErrorCode=U_ILLEGAL_CHAR_FOUND; + break; + } else if((base64Value=FROM_BASE64_IMAP(b))>=0) { + /* collect base64 bytes into UChars */ + switch(base64Counter) { + case -1: /* -1 is immediately after the & */ + case 0: + bits=base64Value; + base64Counter=1; + break; + case 1: + case 3: + case 4: + case 6: + bits=(uint16_t)((bits<<6)|base64Value); + ++base64Counter; + break; + case 2: + c=(UChar)((bits<<4)|(base64Value>>2)); + if(isLegalIMAP(c)) { + /* illegal */ + inDirectMode=TRUE; + *pErrorCode=U_ILLEGAL_CHAR_FOUND; + goto endloop; + } + *target++=c; + if(offsets!=NULL) { + *offsets++=sourceIndex; + sourceIndex=nextSourceIndex-1; + } + bytes[0]=b; /* keep this byte in case an error occurs */ + byteIndex=1; + bits=(uint16_t)(base64Value&3); + base64Counter=3; + break; + case 5: + c=(UChar)((bits<<2)|(base64Value>>4)); + if(isLegalIMAP(c)) { + /* illegal */ + inDirectMode=TRUE; + *pErrorCode=U_ILLEGAL_CHAR_FOUND; + goto endloop; + } + *target++=c; + if(offsets!=NULL) { + *offsets++=sourceIndex; + sourceIndex=nextSourceIndex-1; + } + bytes[0]=b; /* keep this byte in case an error occurs */ + byteIndex=1; + bits=(uint16_t)(base64Value&15); + base64Counter=6; + break; + case 7: + c=(UChar)((bits<<6)|base64Value); + if(isLegalIMAP(c)) { + /* illegal */ + inDirectMode=TRUE; + *pErrorCode=U_ILLEGAL_CHAR_FOUND; + goto endloop; + } + *target++=c; + if(offsets!=NULL) { + *offsets++=sourceIndex; + sourceIndex=nextSourceIndex; + } + byteIndex=0; + bits=0; + base64Counter=0; + break; + default: + /* will never occur */ + break; + } + } else if(base64Value==-2) { + /* minus sign terminates the base64 sequence */ + inDirectMode=TRUE; + if(base64Counter==-1) { + /* &- i.e. a minus immediately following an ampersand */ + *target++=AMPERSAND; + if(offsets!=NULL) { + *offsets++=sourceIndex-1; + } + } else { + /* absorb the minus and leave the Unicode Mode */ + if(bits!=0 || (base64Counter!=0 && base64Counter!=3 && base64Counter!=6)) { + /* bits are illegally left over, a UChar is incomplete */ + /* base64Counter other than 0, 3, 6 means non-minimal zero-padding, also illegal */ + *pErrorCode=U_ILLEGAL_CHAR_FOUND; + break; + } + } + sourceIndex=nextSourceIndex; + goto directMode; + } else { + if(base64Counter==-1) { + /* illegal: & immediately followed by something other than base64 or minus sign */ + /* include the ampersand in the reported sequence */ + --sourceIndex; + bytes[0]=AMPERSAND; + bytes[1]=b; + byteIndex=2; + } + /* base64Value==-1 for characters that are illegal only in Unicode mode */ + /* base64Value==-3 for illegal characters */ + /* illegal */ + inDirectMode=TRUE; + *pErrorCode=U_ILLEGAL_CHAR_FOUND; + break; + } + } else { + /* target is full */ + *pErrorCode=U_BUFFER_OVERFLOW_ERROR; + break; + } + } + } +endloop: + + /* + * the end of the input stream and detection of truncated input + * are handled by the framework, but here we must check if we are in Unicode + * mode and byteIndex==0 because we must end in direct mode + * + * conditions: + * successful + * in Unicode mode and byteIndex==0 + * end of input and no truncated input + */ + if( U_SUCCESS(*pErrorCode) && + !inDirectMode && byteIndex==0 && + pArgs->flush && source>=sourceLimit + ) { + if(base64Counter==-1) { + /* & at the very end of the input */ + /* make the ampersand the reported sequence */ + bytes[0]=AMPERSAND; + byteIndex=1; + } + /* else if(base64Counter!=-1) byteIndex remains 0 because there is no particular byte sequence */ + + inDirectMode=TRUE; /* avoid looping */ + *pErrorCode=U_TRUNCATED_CHAR_FOUND; + } + + /* set the converter state back into UConverter */ + cnv->toUnicodeStatus=((uint32_t)inDirectMode<<24)|((uint32_t)((uint8_t)base64Counter)<<16)|(uint32_t)bits; + cnv->toULength=byteIndex; + + /* write back the updated pointers */ + pArgs->source=(const char *)source; + pArgs->target=target; + pArgs->offsets=offsets; + return; +} + +static void U_CALLCONV +_IMAPFromUnicodeWithOffsets(UConverterFromUnicodeArgs *pArgs, + UErrorCode *pErrorCode) { + UConverter *cnv; + const UChar *source, *sourceLimit; + uint8_t *target, *targetLimit; + int32_t *offsets; + + int32_t length, targetCapacity, sourceIndex; + UChar c; + uint8_t b; + + /* UTF-7 state */ + uint8_t bits; + int8_t base64Counter; + UBool inDirectMode; + + /* set up the local pointers */ + cnv=pArgs->converter; + + /* set up the local pointers */ + source=pArgs->source; + sourceLimit=pArgs->sourceLimit; + target=(uint8_t *)pArgs->target; + targetLimit=(uint8_t *)pArgs->targetLimit; + offsets=pArgs->offsets; + + /* get the state machine state */ + { + uint32_t status=cnv->fromUnicodeStatus; + inDirectMode=(UBool)((status>>24)&1); + base64Counter=(int8_t)(status>>16); + bits=(uint8_t)status; + } + + /* UTF-7 always encodes UTF-16 code units, therefore we need only a simple sourceIndex */ + sourceIndex=0; + + if(inDirectMode) { +directMode: + length=(int32_t)(sourceLimit-source); + targetCapacity=(int32_t)(targetLimit-target); + if(length>targetCapacity) { + length=targetCapacity; + } + while(length>0) { + c=*source++; + /* encode 0x20..0x7e except '&' directly */ + if(inSetDIMAP(c)) { + /* encode directly */ + *target++=(uint8_t)c; + if(offsets!=NULL) { + *offsets++=sourceIndex++; + } + } else if(c==AMPERSAND) { + /* output &- for & */ + *target++=AMPERSAND; + if(targetcharErrorBuffer[0]=MINUS; + cnv->charErrorBufferLength=1; + *pErrorCode=U_BUFFER_OVERFLOW_ERROR; + break; + } + } else { + /* un-read this character and switch to Unicode Mode */ + --source; + *target++=AMPERSAND; + if(offsets!=NULL) { + *offsets++=sourceIndex; + } + inDirectMode=FALSE; + base64Counter=0; + goto unicodeMode; + } + --length; + } + if(source=targetLimit) { + /* target is full */ + *pErrorCode=U_BUFFER_OVERFLOW_ERROR; + } + } else { +unicodeMode: + while(sourcecharErrorBuffer[0]=MINUS; + cnv->charErrorBufferLength=1; + *pErrorCode=U_BUFFER_OVERFLOW_ERROR; + break; + } + goto directMode; + } else { + /* + * base64 this character: + * Output 2 or 3 base64 bytes for the remaining bits of the previous character + * and the bits of this character, each implicitly in UTF-16BE. + * + * Here, bits is an 8-bit variable because only 6 bits need to be kept from one + * character to the next. The actual 2 or 4 bits are shifted to the left edge + * of the 6-bits field 5..0 to make the termination of the base64 sequence easier. + */ + switch(base64Counter) { + case 0: + b=(uint8_t)(c>>10); + *target++=TO_BASE64_IMAP(b); + if(target>4)&0x3f); + *target++=TO_BASE64_IMAP(b); + if(offsets!=NULL) { + *offsets++=sourceIndex; + *offsets++=sourceIndex++; + } + } else { + if(offsets!=NULL) { + *offsets++=sourceIndex++; + } + b=(uint8_t)((c>>4)&0x3f); + cnv->charErrorBuffer[0]=TO_BASE64_IMAP(b); + cnv->charErrorBufferLength=1; + *pErrorCode=U_BUFFER_OVERFLOW_ERROR; + } + bits=(uint8_t)((c&15)<<2); + base64Counter=1; + break; + case 1: + b=(uint8_t)(bits|(c>>14)); + *target++=TO_BASE64_IMAP(b); + if(target>8)&0x3f); + *target++=TO_BASE64_IMAP(b); + if(target>2)&0x3f); + *target++=TO_BASE64_IMAP(b); + if(offsets!=NULL) { + *offsets++=sourceIndex; + *offsets++=sourceIndex; + *offsets++=sourceIndex++; + } + } else { + if(offsets!=NULL) { + *offsets++=sourceIndex; + *offsets++=sourceIndex++; + } + b=(uint8_t)((c>>2)&0x3f); + cnv->charErrorBuffer[0]=TO_BASE64_IMAP(b); + cnv->charErrorBufferLength=1; + *pErrorCode=U_BUFFER_OVERFLOW_ERROR; + } + } else { + if(offsets!=NULL) { + *offsets++=sourceIndex++; + } + b=(uint8_t)((c>>8)&0x3f); + cnv->charErrorBuffer[0]=TO_BASE64_IMAP(b); + b=(uint8_t)((c>>2)&0x3f); + cnv->charErrorBuffer[1]=TO_BASE64_IMAP(b); + cnv->charErrorBufferLength=2; + *pErrorCode=U_BUFFER_OVERFLOW_ERROR; + } + bits=(uint8_t)((c&3)<<4); + base64Counter=2; + break; + case 2: + b=(uint8_t)(bits|(c>>12)); + *target++=TO_BASE64_IMAP(b); + if(target>6)&0x3f); + *target++=TO_BASE64_IMAP(b); + if(targetcharErrorBuffer[0]=TO_BASE64_IMAP(b); + cnv->charErrorBufferLength=1; + *pErrorCode=U_BUFFER_OVERFLOW_ERROR; + } + } else { + if(offsets!=NULL) { + *offsets++=sourceIndex++; + } + b=(uint8_t)((c>>6)&0x3f); + cnv->charErrorBuffer[0]=TO_BASE64_IMAP(b); + b=(uint8_t)(c&0x3f); + cnv->charErrorBuffer[1]=TO_BASE64_IMAP(b); + cnv->charErrorBufferLength=2; + *pErrorCode=U_BUFFER_OVERFLOW_ERROR; + } + bits=0; + base64Counter=0; + break; + default: + /* will never occur */ + break; + } + } + } else { + /* target is full */ + *pErrorCode=U_BUFFER_OVERFLOW_ERROR; + break; + } + } + } + + if(pArgs->flush && source>=sourceLimit) { + /* flush remaining bits to the target */ + if(!inDirectMode) { + if(base64Counter!=0) { + if(targetcharErrorBuffer[cnv->charErrorBufferLength++]=TO_BASE64_IMAP(bits); + *pErrorCode=U_BUFFER_OVERFLOW_ERROR; + } + } + /* need to terminate with a minus */ + if(targetcharErrorBuffer[cnv->charErrorBufferLength++]=MINUS; + *pErrorCode=U_BUFFER_OVERFLOW_ERROR; + } + } + /* reset the state for the next conversion */ + cnv->fromUnicodeStatus=(cnv->fromUnicodeStatus&0xf0000000)|0x1000000; /* keep version, inDirectMode=TRUE */ + } else { + /* set the converter state back into UConverter */ + cnv->fromUnicodeStatus= + (cnv->fromUnicodeStatus&0xf0000000)| /* keep version*/ + ((uint32_t)inDirectMode<<24)|((uint32_t)base64Counter<<16)|(uint32_t)bits; + } + + /* write back the updated pointers */ + pArgs->source=source; + pArgs->target=(char *)target; + pArgs->offsets=offsets; + return; +} +U_CDECL_END + +static const UConverterImpl _IMAPImpl={ + UCNV_IMAP_MAILBOX, + + NULL, + NULL, + + _UTF7Open, + NULL, + _UTF7Reset, + + _IMAPToUnicodeWithOffsets, + _IMAPToUnicodeWithOffsets, + _IMAPFromUnicodeWithOffsets, + _IMAPFromUnicodeWithOffsets, + NULL, + + NULL, + NULL, + NULL, /* we don't need writeSub() because we never call a callback at fromUnicode() */ + NULL, + ucnv_getCompleteUnicodeSet, + NULL, + NULL +}; + +static const UConverterStaticData _IMAPStaticData={ + sizeof(UConverterStaticData), + "IMAP-mailbox-name", + 0, /* TODO CCSID for IMAP-mailbox-name */ + UCNV_IBM, UCNV_IMAP_MAILBOX, + 1, 4, + { 0x3f, 0, 0, 0 }, 1, /* the subchar is not used */ + FALSE, FALSE, + 0, + 0, + { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 } /* reserved */ +}; + +const UConverterSharedData _IMAPData= + UCNV_IMMUTABLE_SHARED_DATA_INITIALIZER(&_IMAPStaticData, &_IMAPImpl); + +#endif diff --git a/Build/source/libs/icu/icu-src/source/common/ucnv_u8.c b/Build/source/libs/icu/icu-src/source/common/ucnv_u8.c deleted file mode 100644 index 0258347aeb1..00000000000 --- a/Build/source/libs/icu/icu-src/source/common/ucnv_u8.c +++ /dev/null @@ -1,1098 +0,0 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. -// License & terms of use: http://www.unicode.org/copyright.html -/* -********************************************************************** -* Copyright (C) 2002-2016, International Business Machines -* Corporation and others. All Rights Reserved. -********************************************************************** -* file name: ucnv_u8.c -* encoding: US-ASCII -* tab size: 8 (not used) -* indentation:4 -* -* created on: 2002jul01 -* created by: Markus W. Scherer -* -* UTF-8 converter implementation. Used to be in ucnv_utf.c. -* -* Also, CESU-8 implementation, see UTR 26. -* The CESU-8 converter uses all the same functions as the -* UTF-8 converter, with a branch for converting supplementary code points. -*/ - -#include "unicode/utypes.h" - -#if !UCONFIG_NO_CONVERSION - -#include "unicode/ucnv.h" -#include "unicode/utf.h" -#include "unicode/utf8.h" -#include "unicode/utf16.h" -#include "ucnv_bld.h" -#include "ucnv_cnv.h" -#include "cmemory.h" - -/* Prototypes --------------------------------------------------------------- */ - -/* Keep these here to make finicky compilers happy */ - -U_CFUNC void ucnv_fromUnicode_UTF8(UConverterFromUnicodeArgs *args, - UErrorCode *err); -U_CFUNC void ucnv_fromUnicode_UTF8_OFFSETS_LOGIC(UConverterFromUnicodeArgs *args, - UErrorCode *err); - - -/* UTF-8 -------------------------------------------------------------------- */ - -/* UTF-8 Conversion DATA - * for more information see Unicode Standard 2.0, Transformation Formats Appendix A-9 - */ -/*static const uint32_t REPLACEMENT_CHARACTER = 0x0000FFFD;*/ -#define MAXIMUM_UCS2 0x0000FFFF -#define MAXIMUM_UTF 0x0010FFFF -#define MAXIMUM_UCS4 0x7FFFFFFF -#define HALF_SHIFT 10 -#define HALF_BASE 0x0010000 -#define HALF_MASK 0x3FF -#define SURROGATE_HIGH_START 0xD800 -#define SURROGATE_HIGH_END 0xDBFF -#define SURROGATE_LOW_START 0xDC00 -#define SURROGATE_LOW_END 0xDFFF - -/* -SURROGATE_LOW_START + HALF_BASE */ -#define SURROGATE_LOW_BASE 9216 - -static const uint32_t offsetsFromUTF8[7] = {0, - (uint32_t) 0x00000000, (uint32_t) 0x00003080, (uint32_t) 0x000E2080, - (uint32_t) 0x03C82080, (uint32_t) 0xFA082080, (uint32_t) 0x82082080 -}; - -/* END OF UTF-8 Conversion DATA */ - -static const int8_t bytesFromUTF8[256] = { - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 6, 6, 0, 0 -}; - -/* - * Starting with Unicode 3.0.1: - * UTF-8 byte sequences of length N _must_ encode code points of or above utf8_minChar32[N]; - * byte sequences with more than 4 bytes are illegal in UTF-8, - * which is tested with impossible values for them - */ -static const uint32_t -utf8_minChar32[7]={ 0, 0, 0x80, 0x800, 0x10000, 0xffffffff, 0xffffffff }; - -static UBool hasCESU8Data(const UConverter *cnv) -{ -#if UCONFIG_ONLY_HTML_CONVERSION - return FALSE; -#else - return (UBool)(cnv->sharedData == &_CESU8Data); -#endif -} - -static void ucnv_toUnicode_UTF8 (UConverterToUnicodeArgs * args, - UErrorCode * err) -{ - UConverter *cnv = args->converter; - const unsigned char *mySource = (unsigned char *) args->source; - UChar *myTarget = args->target; - const unsigned char *sourceLimit = (unsigned char *) args->sourceLimit; - const UChar *targetLimit = args->targetLimit; - unsigned char *toUBytes = cnv->toUBytes; - UBool isCESU8 = hasCESU8Data(cnv); - uint32_t ch, ch2 = 0; - int32_t i, inBytes; - - /* Restore size of current sequence */ - if (cnv->toUnicodeStatus && myTarget < targetLimit) - { - inBytes = cnv->mode; /* restore # of bytes to consume */ - i = cnv->toULength; /* restore # of bytes consumed */ - cnv->toULength = 0; - - ch = cnv->toUnicodeStatus;/*Stores the previously calculated ch from a previous call*/ - cnv->toUnicodeStatus = 0; - goto morebytes; - } - - - while (mySource < sourceLimit && myTarget < targetLimit) - { - ch = *(mySource++); - if (ch < 0x80) /* Simple case */ - { - *(myTarget++) = (UChar) ch; - } - else - { - /* store the first char */ - toUBytes[0] = (char)ch; - inBytes = bytesFromUTF8[ch]; /* lookup current sequence length */ - i = 1; - -morebytes: - while (i < inBytes) - { - if (mySource < sourceLimit) - { - toUBytes[i] = (char) (ch2 = *mySource); - if (!U8_IS_TRAIL(ch2)) - { - break; /* i < inBytes */ - } - ch = (ch << 6) + ch2; - ++mySource; - i++; - } - else - { - /* stores a partially calculated target*/ - cnv->toUnicodeStatus = ch; - cnv->mode = inBytes; - cnv->toULength = (int8_t) i; - goto donefornow; - } - } - - /* Remove the accumulated high bits */ - ch -= offsetsFromUTF8[inBytes]; - - /* - * Legal UTF-8 byte sequences in Unicode 3.0.1 and up: - * - use only trail bytes after a lead byte (checked above) - * - use the right number of trail bytes for a given lead byte - * - encode a code point <= U+10ffff - * - use the fewest possible number of bytes for their code points - * - use at most 4 bytes (for i>=5 it is 0x10ffff= utf8_minChar32[i] && - (isCESU8 ? i <= 3 : !U_IS_SURROGATE(ch))) - { - /* Normal valid byte when the loop has not prematurely terminated (i < inBytes) */ - if (ch <= MAXIMUM_UCS2) - { - /* fits in 16 bits */ - *(myTarget++) = (UChar) ch; - } - else - { - /* write out the surrogates */ - ch -= HALF_BASE; - *(myTarget++) = (UChar) ((ch >> HALF_SHIFT) + SURROGATE_HIGH_START); - ch = (ch & HALF_MASK) + SURROGATE_LOW_START; - if (myTarget < targetLimit) - { - *(myTarget++) = (UChar)ch; - } - else - { - /* Put in overflow buffer (not handled here) */ - cnv->UCharErrorBuffer[0] = (UChar) ch; - cnv->UCharErrorBufferLength = 1; - *err = U_BUFFER_OVERFLOW_ERROR; - break; - } - } - } - else - { - cnv->toULength = (int8_t)i; - *err = U_ILLEGAL_CHAR_FOUND; - break; - } - } - } - -donefornow: - if (mySource < sourceLimit && myTarget >= targetLimit && U_SUCCESS(*err)) - { - /* End of target buffer */ - *err = U_BUFFER_OVERFLOW_ERROR; - } - - args->target = myTarget; - args->source = (const char *) mySource; -} - -static void ucnv_toUnicode_UTF8_OFFSETS_LOGIC (UConverterToUnicodeArgs * args, - UErrorCode * err) -{ - UConverter *cnv = args->converter; - const unsigned char *mySource = (unsigned char *) args->source; - UChar *myTarget = args->target; - int32_t *myOffsets = args->offsets; - int32_t offsetNum = 0; - const unsigned char *sourceLimit = (unsigned char *) args->sourceLimit; - const UChar *targetLimit = args->targetLimit; - unsigned char *toUBytes = cnv->toUBytes; - UBool isCESU8 = hasCESU8Data(cnv); - uint32_t ch, ch2 = 0; - int32_t i, inBytes; - - /* Restore size of current sequence */ - if (cnv->toUnicodeStatus && myTarget < targetLimit) - { - inBytes = cnv->mode; /* restore # of bytes to consume */ - i = cnv->toULength; /* restore # of bytes consumed */ - cnv->toULength = 0; - - ch = cnv->toUnicodeStatus;/*Stores the previously calculated ch from a previous call*/ - cnv->toUnicodeStatus = 0; - goto morebytes; - } - - while (mySource < sourceLimit && myTarget < targetLimit) - { - ch = *(mySource++); - if (ch < 0x80) /* Simple case */ - { - *(myTarget++) = (UChar) ch; - *(myOffsets++) = offsetNum++; - } - else - { - toUBytes[0] = (char)ch; - inBytes = bytesFromUTF8[ch]; - i = 1; - -morebytes: - while (i < inBytes) - { - if (mySource < sourceLimit) - { - toUBytes[i] = (char) (ch2 = *mySource); - if (!U8_IS_TRAIL(ch2)) - { - break; /* i < inBytes */ - } - ch = (ch << 6) + ch2; - ++mySource; - i++; - } - else - { - cnv->toUnicodeStatus = ch; - cnv->mode = inBytes; - cnv->toULength = (int8_t)i; - goto donefornow; - } - } - - /* Remove the accumulated high bits */ - ch -= offsetsFromUTF8[inBytes]; - - /* - * Legal UTF-8 byte sequences in Unicode 3.0.1 and up: - * - use only trail bytes after a lead byte (checked above) - * - use the right number of trail bytes for a given lead byte - * - encode a code point <= U+10ffff - * - use the fewest possible number of bytes for their code points - * - use at most 4 bytes (for i>=5 it is 0x10ffff= utf8_minChar32[i] && - (isCESU8 ? i <= 3 : !U_IS_SURROGATE(ch))) - { - /* Normal valid byte when the loop has not prematurely terminated (i < inBytes) */ - if (ch <= MAXIMUM_UCS2) - { - /* fits in 16 bits */ - *(myTarget++) = (UChar) ch; - *(myOffsets++) = offsetNum; - } - else - { - /* write out the surrogates */ - ch -= HALF_BASE; - *(myTarget++) = (UChar) ((ch >> HALF_SHIFT) + SURROGATE_HIGH_START); - *(myOffsets++) = offsetNum; - ch = (ch & HALF_MASK) + SURROGATE_LOW_START; - if (myTarget < targetLimit) - { - *(myTarget++) = (UChar)ch; - *(myOffsets++) = offsetNum; - } - else - { - cnv->UCharErrorBuffer[0] = (UChar) ch; - cnv->UCharErrorBufferLength = 1; - *err = U_BUFFER_OVERFLOW_ERROR; - } - } - offsetNum += i; - } - else - { - cnv->toULength = (int8_t)i; - *err = U_ILLEGAL_CHAR_FOUND; - break; - } - } - } - -donefornow: - if (mySource < sourceLimit && myTarget >= targetLimit && U_SUCCESS(*err)) - { /* End of target buffer */ - *err = U_BUFFER_OVERFLOW_ERROR; - } - - args->target = myTarget; - args->source = (const char *) mySource; - args->offsets = myOffsets; -} - -U_CFUNC void ucnv_fromUnicode_UTF8 (UConverterFromUnicodeArgs * args, - UErrorCode * err) -{ - UConverter *cnv = args->converter; - const UChar *mySource = args->source; - const UChar *sourceLimit = args->sourceLimit; - uint8_t *myTarget = (uint8_t *) args->target; - const uint8_t *targetLimit = (uint8_t *) args->targetLimit; - uint8_t *tempPtr; - UChar32 ch; - uint8_t tempBuf[4]; - int32_t indexToWrite; - UBool isNotCESU8 = !hasCESU8Data(cnv); - - if (cnv->fromUChar32 && myTarget < targetLimit) - { - ch = cnv->fromUChar32; - cnv->fromUChar32 = 0; - goto lowsurrogate; - } - - while (mySource < sourceLimit && myTarget < targetLimit) - { - ch = *(mySource++); - - if (ch < 0x80) /* Single byte */ - { - *(myTarget++) = (uint8_t) ch; - } - else if (ch < 0x800) /* Double byte */ - { - *(myTarget++) = (uint8_t) ((ch >> 6) | 0xc0); - if (myTarget < targetLimit) - { - *(myTarget++) = (uint8_t) ((ch & 0x3f) | 0x80); - } - else - { - cnv->charErrorBuffer[0] = (uint8_t) ((ch & 0x3f) | 0x80); - cnv->charErrorBufferLength = 1; - *err = U_BUFFER_OVERFLOW_ERROR; - } - } - else { - /* Check for surrogates */ - if(U16_IS_SURROGATE(ch) && isNotCESU8) { -lowsurrogate: - if (mySource < sourceLimit) { - /* test both code units */ - if(U16_IS_SURROGATE_LEAD(ch) && U16_IS_TRAIL(*mySource)) { - /* convert and consume this supplementary code point */ - ch=U16_GET_SUPPLEMENTARY(ch, *mySource); - ++mySource; - /* exit this condition tree */ - } - else { - /* this is an unpaired trail or lead code unit */ - /* callback(illegal) */ - cnv->fromUChar32 = ch; - *err = U_ILLEGAL_CHAR_FOUND; - break; - } - } - else { - /* no more input */ - cnv->fromUChar32 = ch; - break; - } - } - - /* Do we write the buffer directly for speed, - or do we have to be careful about target buffer space? */ - tempPtr = (((targetLimit - myTarget) >= 4) ? myTarget : tempBuf); - - if (ch <= MAXIMUM_UCS2) { - indexToWrite = 2; - tempPtr[0] = (uint8_t) ((ch >> 12) | 0xe0); - } - else { - indexToWrite = 3; - tempPtr[0] = (uint8_t) ((ch >> 18) | 0xf0); - tempPtr[1] = (uint8_t) (((ch >> 12) & 0x3f) | 0x80); - } - tempPtr[indexToWrite-1] = (uint8_t) (((ch >> 6) & 0x3f) | 0x80); - tempPtr[indexToWrite] = (uint8_t) ((ch & 0x3f) | 0x80); - - if (tempPtr == myTarget) { - /* There was enough space to write the codepoint directly. */ - myTarget += (indexToWrite + 1); - } - else { - /* We might run out of room soon. Write it slowly. */ - for (; tempPtr <= (tempBuf + indexToWrite); tempPtr++) { - if (myTarget < targetLimit) { - *(myTarget++) = *tempPtr; - } - else { - cnv->charErrorBuffer[cnv->charErrorBufferLength++] = *tempPtr; - *err = U_BUFFER_OVERFLOW_ERROR; - } - } - } - } - } - - if (mySource < sourceLimit && myTarget >= targetLimit && U_SUCCESS(*err)) - { - *err = U_BUFFER_OVERFLOW_ERROR; - } - - args->target = (char *) myTarget; - args->source = mySource; -} - -U_CFUNC void ucnv_fromUnicode_UTF8_OFFSETS_LOGIC (UConverterFromUnicodeArgs * args, - UErrorCode * err) -{ - UConverter *cnv = args->converter; - const UChar *mySource = args->source; - int32_t *myOffsets = args->offsets; - const UChar *sourceLimit = args->sourceLimit; - uint8_t *myTarget = (uint8_t *) args->target; - const uint8_t *targetLimit = (uint8_t *) args->targetLimit; - uint8_t *tempPtr; - UChar32 ch; - int32_t offsetNum, nextSourceIndex; - int32_t indexToWrite; - uint8_t tempBuf[4]; - UBool isNotCESU8 = !hasCESU8Data(cnv); - - if (cnv->fromUChar32 && myTarget < targetLimit) - { - ch = cnv->fromUChar32; - cnv->fromUChar32 = 0; - offsetNum = -1; - nextSourceIndex = 0; - goto lowsurrogate; - } else { - offsetNum = 0; - } - - while (mySource < sourceLimit && myTarget < targetLimit) - { - ch = *(mySource++); - - if (ch < 0x80) /* Single byte */ - { - *(myOffsets++) = offsetNum++; - *(myTarget++) = (char) ch; - } - else if (ch < 0x800) /* Double byte */ - { - *(myOffsets++) = offsetNum; - *(myTarget++) = (uint8_t) ((ch >> 6) | 0xc0); - if (myTarget < targetLimit) - { - *(myOffsets++) = offsetNum++; - *(myTarget++) = (uint8_t) ((ch & 0x3f) | 0x80); - } - else - { - cnv->charErrorBuffer[0] = (uint8_t) ((ch & 0x3f) | 0x80); - cnv->charErrorBufferLength = 1; - *err = U_BUFFER_OVERFLOW_ERROR; - } - } - else - /* Check for surrogates */ - { - nextSourceIndex = offsetNum + 1; - - if(U16_IS_SURROGATE(ch) && isNotCESU8) { -lowsurrogate: - if (mySource < sourceLimit) { - /* test both code units */ - if(U16_IS_SURROGATE_LEAD(ch) && U16_IS_TRAIL(*mySource)) { - /* convert and consume this supplementary code point */ - ch=U16_GET_SUPPLEMENTARY(ch, *mySource); - ++mySource; - ++nextSourceIndex; - /* exit this condition tree */ - } - else { - /* this is an unpaired trail or lead code unit */ - /* callback(illegal) */ - cnv->fromUChar32 = ch; - *err = U_ILLEGAL_CHAR_FOUND; - break; - } - } - else { - /* no more input */ - cnv->fromUChar32 = ch; - break; - } - } - - /* Do we write the buffer directly for speed, - or do we have to be careful about target buffer space? */ - tempPtr = (((targetLimit - myTarget) >= 4) ? myTarget : tempBuf); - - if (ch <= MAXIMUM_UCS2) { - indexToWrite = 2; - tempPtr[0] = (uint8_t) ((ch >> 12) | 0xe0); - } - else { - indexToWrite = 3; - tempPtr[0] = (uint8_t) ((ch >> 18) | 0xf0); - tempPtr[1] = (uint8_t) (((ch >> 12) & 0x3f) | 0x80); - } - tempPtr[indexToWrite-1] = (uint8_t) (((ch >> 6) & 0x3f) | 0x80); - tempPtr[indexToWrite] = (uint8_t) ((ch & 0x3f) | 0x80); - - if (tempPtr == myTarget) { - /* There was enough space to write the codepoint directly. */ - myTarget += (indexToWrite + 1); - myOffsets[0] = offsetNum; - myOffsets[1] = offsetNum; - myOffsets[2] = offsetNum; - if (indexToWrite >= 3) { - myOffsets[3] = offsetNum; - } - myOffsets += (indexToWrite + 1); - } - else { - /* We might run out of room soon. Write it slowly. */ - for (; tempPtr <= (tempBuf + indexToWrite); tempPtr++) { - if (myTarget < targetLimit) - { - *(myOffsets++) = offsetNum; - *(myTarget++) = *tempPtr; - } - else - { - cnv->charErrorBuffer[cnv->charErrorBufferLength++] = *tempPtr; - *err = U_BUFFER_OVERFLOW_ERROR; - } - } - } - offsetNum = nextSourceIndex; - } - } - - if (mySource < sourceLimit && myTarget >= targetLimit && U_SUCCESS(*err)) - { - *err = U_BUFFER_OVERFLOW_ERROR; - } - - args->target = (char *) myTarget; - args->source = mySource; - args->offsets = myOffsets; -} - -static UChar32 ucnv_getNextUChar_UTF8(UConverterToUnicodeArgs *args, - UErrorCode *err) { - UConverter *cnv; - const uint8_t *sourceInitial; - const uint8_t *source; - uint16_t extraBytesToWrite; - uint8_t myByte; - UChar32 ch; - int8_t i, isLegalSequence; - - /* UTF-8 only here, the framework handles CESU-8 to combine surrogate pairs */ - - cnv = args->converter; - sourceInitial = source = (const uint8_t *)args->source; - if (source >= (const uint8_t *)args->sourceLimit) - { - /* no input */ - *err = U_INDEX_OUTOFBOUNDS_ERROR; - return 0xffff; - } - - myByte = (uint8_t)*(source++); - if (myByte < 0x80) - { - args->source = (const char *)source; - return (UChar32)myByte; - } - - extraBytesToWrite = (uint16_t)bytesFromUTF8[myByte]; - if (extraBytesToWrite == 0) { - cnv->toUBytes[0] = myByte; - cnv->toULength = 1; - *err = U_ILLEGAL_CHAR_FOUND; - args->source = (const char *)source; - return 0xffff; - } - - /*The byte sequence is longer than the buffer area passed*/ - if (((const char *)source + extraBytesToWrite - 1) > args->sourceLimit) - { - /* check if all of the remaining bytes are trail bytes */ - cnv->toUBytes[0] = myByte; - i = 1; - *err = U_TRUNCATED_CHAR_FOUND; - while(source < (const uint8_t *)args->sourceLimit) { - if(U8_IS_TRAIL(myByte = *source)) { - cnv->toUBytes[i++] = myByte; - ++source; - } else { - /* error even before we run out of input */ - *err = U_ILLEGAL_CHAR_FOUND; - break; - } - } - cnv->toULength = i; - args->source = (const char *)source; - return 0xffff; - } - - isLegalSequence = 1; - ch = myByte << 6; - switch(extraBytesToWrite) - { - /* note: code falls through cases! (sic)*/ - case 6: - ch += (myByte = *source); - ch <<= 6; - if (!U8_IS_TRAIL(myByte)) - { - isLegalSequence = 0; - break; - } - ++source; - U_FALLTHROUGH; - case 5: - ch += (myByte = *source); - ch <<= 6; - if (!U8_IS_TRAIL(myByte)) - { - isLegalSequence = 0; - break; - } - ++source; - U_FALLTHROUGH; - case 4: - ch += (myByte = *source); - ch <<= 6; - if (!U8_IS_TRAIL(myByte)) - { - isLegalSequence = 0; - break; - } - ++source; - U_FALLTHROUGH; - case 3: - ch += (myByte = *source); - ch <<= 6; - if (!U8_IS_TRAIL(myByte)) - { - isLegalSequence = 0; - break; - } - ++source; - U_FALLTHROUGH; - case 2: - ch += (myByte = *source); - if (!U8_IS_TRAIL(myByte)) - { - isLegalSequence = 0; - break; - } - ++source; - }; - ch -= offsetsFromUTF8[extraBytesToWrite]; - args->source = (const char *)source; - - /* - * Legal UTF-8 byte sequences in Unicode 3.0.1 and up: - * - use only trail bytes after a lead byte (checked above) - * - use the right number of trail bytes for a given lead byte - * - encode a code point <= U+10ffff - * - use the fewest possible number of bytes for their code points - * - use at most 4 bytes (for i>=5 it is 0x10ffff= utf8_minChar32[extraBytesToWrite] && - !U_IS_SURROGATE(ch) - ) { - return ch; /* return the code point */ - } - - for(i = 0; sourceInitial < source; ++i) { - cnv->toUBytes[i] = *sourceInitial++; - } - cnv->toULength = i; - *err = U_ILLEGAL_CHAR_FOUND; - return 0xffff; -} - -/* UTF-8-from-UTF-8 conversion functions ------------------------------------ */ - -/* minimum code point values for n-byte UTF-8 sequences, n=0..4 */ -static const UChar32 -utf8_minLegal[5]={ 0, 0, 0x80, 0x800, 0x10000 }; - -/* offsets for n-byte UTF-8 sequences that were calculated with ((lead<<6)+trail)<<6+trail... */ -static const UChar32 -utf8_offsets[7]={ 0, 0, 0x3080, 0xE2080, 0x3C82080 }; - -/* "Convert" UTF-8 to UTF-8: Validate and copy. Modified from ucnv_DBCSFromUTF8(). */ -static void -ucnv_UTF8FromUTF8(UConverterFromUnicodeArgs *pFromUArgs, - UConverterToUnicodeArgs *pToUArgs, - UErrorCode *pErrorCode) { - UConverter *utf8; - const uint8_t *source, *sourceLimit; - uint8_t *target; - int32_t targetCapacity; - int32_t count; - - int8_t oldToULength, toULength, toULimit; - - UChar32 c; - uint8_t b, t1, t2; - - /* set up the local pointers */ - utf8=pToUArgs->converter; - source=(uint8_t *)pToUArgs->source; - sourceLimit=(uint8_t *)pToUArgs->sourceLimit; - target=(uint8_t *)pFromUArgs->target; - targetCapacity=(int32_t)(pFromUArgs->targetLimit-pFromUArgs->target); - - /* get the converter state from the UTF-8 UConverter */ - c=(UChar32)utf8->toUnicodeStatus; - if(c!=0) { - toULength=oldToULength=utf8->toULength; - toULimit=(int8_t)utf8->mode; - } else { - toULength=oldToULength=toULimit=0; - } - - count=(int32_t)(sourceLimit-source)+oldToULength; - if(counttargetCapacity) { - count=targetCapacity; - } - - i=0; - while(i<3 && i<(count-toULimit)) { - b=source[count-oldToULength-i-1]; - if(U8_IS_TRAIL(b)) { - ++i; - } else { - if(itoUnicodeStatus=0; - utf8->toULength=0; - goto moreBytes; - /* See note in ucnv_SBCSFromUTF8() about this goto. */ - } - - /* conversion loop */ - while(count>0) { - b=*source++; - if((int8_t)b>=0) { - /* convert ASCII */ - *target++=b; - --count; - continue; - } else { - if(b>0xe0) { - if( /* handle U+1000..U+D7FF inline */ - (t1=source[0]) >= 0x80 && ((b<0xed && (t1 <= 0xbf)) || - (b==0xed && (t1 <= 0x9f))) && - (t2=source[1]) >= 0x80 && t2 <= 0xbf - ) { - source+=2; - *target++=b; - *target++=t1; - *target++=t2; - count-=3; - continue; - } - } else if(b<0xe0) { - if( /* handle U+0080..U+07FF inline */ - b>=0xc2 && - (t1=*source) >= 0x80 && t1 <= 0xbf - ) { - ++source; - *target++=b; - *target++=t1; - count-=2; - continue; - } - } else if(b==0xe0) { - if( /* handle U+0800..U+0FFF inline */ - (t1=source[0]) >= 0xa0 && t1 <= 0xbf && - (t2=source[1]) >= 0x80 && t2 <= 0xbf - ) { - source+=2; - *target++=b; - *target++=t1; - *target++=t2; - count-=3; - continue; - } - } - - /* handle "complicated" and error cases, and continuing partial characters */ - oldToULength=0; - toULength=1; - toULimit=U8_COUNT_TRAIL_BYTES(b)+1; - c=b; -moreBytes: - while(toULengthtoUBytes[oldToULength++]=*source++; - } - utf8->toUnicodeStatus=c; - utf8->toULength=toULength; - utf8->mode=toULimit; - pToUArgs->source=(char *)source; - pFromUArgs->target=(char *)target; - return; - } - } - - if( toULength==toULimit && /* consumed all trail bytes */ - (toULength==3 || toULength==2) && /* BMP */ - (c-=utf8_offsets[toULength])>=utf8_minLegal[toULength] && - (c<=0xd7ff || 0xe000<=c) /* not a surrogate */ - ) { - /* legal byte sequence for BMP code point */ - } else if( - toULength==toULimit && toULength==4 && - (0x10000<=(c-=utf8_offsets[4]) && c<=0x10ffff) - ) { - /* legal byte sequence for supplementary code point */ - } else { - /* error handling: illegal UTF-8 byte sequence */ - source-=(toULength-oldToULength); - while(oldToULengthtoUBytes[oldToULength++]=*source++; - } - utf8->toULength=toULength; - pToUArgs->source=(char *)source; - pFromUArgs->target=(char *)target; - *pErrorCode=U_ILLEGAL_CHAR_FOUND; - return; - } - - /* copy the legal byte sequence to the target */ - { - int8_t i; - - for(i=0; itoUBytes[i]; - } - source-=(toULength-oldToULength); - for(; itargetLimit) { - *pErrorCode=U_BUFFER_OVERFLOW_ERROR; - } else { - b=*source; - toULimit=U8_COUNT_TRAIL_BYTES(b)+1; - if(toULimit>(sourceLimit-source)) { - /* collect a truncated byte sequence */ - toULength=0; - c=b; - for(;;) { - utf8->toUBytes[toULength++]=b; - if(++source==sourceLimit) { - /* partial byte sequence at end of source */ - utf8->toUnicodeStatus=c; - utf8->toULength=toULength; - utf8->mode=toULimit; - break; - } else if(!U8_IS_TRAIL(b=*source)) { - /* lead byte in trail byte position */ - utf8->toULength=toULength; - *pErrorCode=U_ILLEGAL_CHAR_FOUND; - break; - } - c=(c<<6)+b; - } - } else { - /* partial-sequence target overflow: fall back to the pivoting implementation */ - *pErrorCode=U_USING_DEFAULT_WARNING; - } - } - } - - /* write back the updated pointers */ - pToUArgs->source=(char *)source; - pFromUArgs->target=(char *)target; -} - -/* UTF-8 converter data ----------------------------------------------------- */ - -static const UConverterImpl _UTF8Impl={ - UCNV_UTF8, - - NULL, - NULL, - - NULL, - NULL, - NULL, - - ucnv_toUnicode_UTF8, - ucnv_toUnicode_UTF8_OFFSETS_LOGIC, - ucnv_fromUnicode_UTF8, - ucnv_fromUnicode_UTF8_OFFSETS_LOGIC, - ucnv_getNextUChar_UTF8, - - NULL, - NULL, - NULL, - NULL, - ucnv_getNonSurrogateUnicodeSet, - - ucnv_UTF8FromUTF8, - ucnv_UTF8FromUTF8 -}; - -/* The 1208 CCSID refers to any version of Unicode of UTF-8 */ -static const UConverterStaticData _UTF8StaticData={ - sizeof(UConverterStaticData), - "UTF-8", - 1208, UCNV_IBM, UCNV_UTF8, - 1, 3, /* max 3 bytes per UChar from UTF-8 (4 bytes from surrogate _pair_) */ - { 0xef, 0xbf, 0xbd, 0 },3,FALSE,FALSE, - 0, - 0, - { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 } /* reserved */ -}; - - -const UConverterSharedData _UTF8Data= - UCNV_IMMUTABLE_SHARED_DATA_INITIALIZER(&_UTF8StaticData, &_UTF8Impl); - -/* CESU-8 converter data ---------------------------------------------------- */ - -static const UConverterImpl _CESU8Impl={ - UCNV_CESU8, - - NULL, - NULL, - - NULL, - NULL, - NULL, - - ucnv_toUnicode_UTF8, - ucnv_toUnicode_UTF8_OFFSETS_LOGIC, - ucnv_fromUnicode_UTF8, - ucnv_fromUnicode_UTF8_OFFSETS_LOGIC, - NULL, - - NULL, - NULL, - NULL, - NULL, - ucnv_getCompleteUnicodeSet, - - NULL, - NULL -}; - -static const UConverterStaticData _CESU8StaticData={ - sizeof(UConverterStaticData), - "CESU-8", - 9400, /* CCSID for CESU-8 */ - UCNV_UNKNOWN, UCNV_CESU8, 1, 3, - { 0xef, 0xbf, 0xbd, 0 },3,FALSE,FALSE, - 0, - 0, - { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 } /* reserved */ -}; - - -const UConverterSharedData _CESU8Data= - UCNV_IMMUTABLE_SHARED_DATA_INITIALIZER(&_CESU8StaticData, &_CESU8Impl); - -#endif diff --git a/Build/source/libs/icu/icu-src/source/common/ucnv_u8.cpp b/Build/source/libs/icu/icu-src/source/common/ucnv_u8.cpp new file mode 100644 index 00000000000..5d72f8ef377 --- /dev/null +++ b/Build/source/libs/icu/icu-src/source/common/ucnv_u8.cpp @@ -0,0 +1,968 @@ +// © 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html +/* +********************************************************************** +* Copyright (C) 2002-2016, International Business Machines +* Corporation and others. All Rights Reserved. +********************************************************************** +* file name: ucnv_u8.c +* encoding: UTF-8 +* tab size: 8 (not used) +* indentation:4 +* +* created on: 2002jul01 +* created by: Markus W. Scherer +* +* UTF-8 converter implementation. Used to be in ucnv_utf.c. +* +* Also, CESU-8 implementation, see UTR 26. +* The CESU-8 converter uses all the same functions as the +* UTF-8 converter, with a branch for converting supplementary code points. +*/ + +#include "unicode/utypes.h" + +#if !UCONFIG_NO_CONVERSION + +#include "unicode/ucnv.h" +#include "unicode/utf.h" +#include "unicode/utf8.h" +#include "unicode/utf16.h" +#include "uassert.h" +#include "ucnv_bld.h" +#include "ucnv_cnv.h" +#include "cmemory.h" +#include "ustr_imp.h" + +/* Prototypes --------------------------------------------------------------- */ + +/* Keep these here to make finicky compilers happy */ + +U_CFUNC void ucnv_fromUnicode_UTF8(UConverterFromUnicodeArgs *args, + UErrorCode *err); +U_CFUNC void ucnv_fromUnicode_UTF8_OFFSETS_LOGIC(UConverterFromUnicodeArgs *args, + UErrorCode *err); + + +/* UTF-8 -------------------------------------------------------------------- */ + +#define MAXIMUM_UCS2 0x0000FFFF + +static const uint32_t offsetsFromUTF8[5] = {0, + (uint32_t) 0x00000000, (uint32_t) 0x00003080, (uint32_t) 0x000E2080, + (uint32_t) 0x03C82080 +}; + +static UBool hasCESU8Data(const UConverter *cnv) +{ +#if UCONFIG_ONLY_HTML_CONVERSION + return FALSE; +#else + return (UBool)(cnv->sharedData == &_CESU8Data); +#endif +} +U_CDECL_BEGIN +static void U_CALLCONV ucnv_toUnicode_UTF8 (UConverterToUnicodeArgs * args, + UErrorCode * err) +{ + UConverter *cnv = args->converter; + const unsigned char *mySource = (unsigned char *) args->source; + UChar *myTarget = args->target; + const unsigned char *sourceLimit = (unsigned char *) args->sourceLimit; + const UChar *targetLimit = args->targetLimit; + unsigned char *toUBytes = cnv->toUBytes; + UBool isCESU8 = hasCESU8Data(cnv); + uint32_t ch, ch2 = 0; + int32_t i, inBytes; + + /* Restore size of current sequence */ + if (cnv->toUnicodeStatus && myTarget < targetLimit) + { + inBytes = cnv->mode; /* restore # of bytes to consume */ + i = cnv->toULength; /* restore # of bytes consumed */ + cnv->toULength = 0; + + ch = cnv->toUnicodeStatus;/*Stores the previously calculated ch from a previous call*/ + cnv->toUnicodeStatus = 0; + goto morebytes; + } + + + while (mySource < sourceLimit && myTarget < targetLimit) + { + ch = *(mySource++); + if (U8_IS_SINGLE(ch)) /* Simple case */ + { + *(myTarget++) = (UChar) ch; + } + else + { + /* store the first char */ + toUBytes[0] = (char)ch; + inBytes = U8_COUNT_BYTES_NON_ASCII(ch); /* lookup current sequence length */ + i = 1; + +morebytes: + while (i < inBytes) + { + if (mySource < sourceLimit) + { + toUBytes[i] = (char) (ch2 = *mySource); + if (!icu::UTF8::isValidTrail(ch, ch2, i, inBytes) && + !(isCESU8 && i == 1 && ch == 0xed && U8_IS_TRAIL(ch2))) + { + break; /* i < inBytes */ + } + ch = (ch << 6) + ch2; + ++mySource; + i++; + } + else + { + /* stores a partially calculated target*/ + cnv->toUnicodeStatus = ch; + cnv->mode = inBytes; + cnv->toULength = (int8_t) i; + goto donefornow; + } + } + + // In CESU-8, only surrogates, not supplementary code points, are encoded directly. + if (i == inBytes && (!isCESU8 || i <= 3)) + { + /* Remove the accumulated high bits */ + ch -= offsetsFromUTF8[inBytes]; + + /* Normal valid byte when the loop has not prematurely terminated (i < inBytes) */ + if (ch <= MAXIMUM_UCS2) + { + /* fits in 16 bits */ + *(myTarget++) = (UChar) ch; + } + else + { + /* write out the surrogates */ + *(myTarget++) = U16_LEAD(ch); + ch = U16_TRAIL(ch); + if (myTarget < targetLimit) + { + *(myTarget++) = (UChar)ch; + } + else + { + /* Put in overflow buffer (not handled here) */ + cnv->UCharErrorBuffer[0] = (UChar) ch; + cnv->UCharErrorBufferLength = 1; + *err = U_BUFFER_OVERFLOW_ERROR; + break; + } + } + } + else + { + cnv->toULength = (int8_t)i; + *err = U_ILLEGAL_CHAR_FOUND; + break; + } + } + } + +donefornow: + if (mySource < sourceLimit && myTarget >= targetLimit && U_SUCCESS(*err)) + { + /* End of target buffer */ + *err = U_BUFFER_OVERFLOW_ERROR; + } + + args->target = myTarget; + args->source = (const char *) mySource; +} + +static void U_CALLCONV ucnv_toUnicode_UTF8_OFFSETS_LOGIC (UConverterToUnicodeArgs * args, + UErrorCode * err) +{ + UConverter *cnv = args->converter; + const unsigned char *mySource = (unsigned char *) args->source; + UChar *myTarget = args->target; + int32_t *myOffsets = args->offsets; + int32_t offsetNum = 0; + const unsigned char *sourceLimit = (unsigned char *) args->sourceLimit; + const UChar *targetLimit = args->targetLimit; + unsigned char *toUBytes = cnv->toUBytes; + UBool isCESU8 = hasCESU8Data(cnv); + uint32_t ch, ch2 = 0; + int32_t i, inBytes; + + /* Restore size of current sequence */ + if (cnv->toUnicodeStatus && myTarget < targetLimit) + { + inBytes = cnv->mode; /* restore # of bytes to consume */ + i = cnv->toULength; /* restore # of bytes consumed */ + cnv->toULength = 0; + + ch = cnv->toUnicodeStatus;/*Stores the previously calculated ch from a previous call*/ + cnv->toUnicodeStatus = 0; + goto morebytes; + } + + while (mySource < sourceLimit && myTarget < targetLimit) + { + ch = *(mySource++); + if (U8_IS_SINGLE(ch)) /* Simple case */ + { + *(myTarget++) = (UChar) ch; + *(myOffsets++) = offsetNum++; + } + else + { + toUBytes[0] = (char)ch; + inBytes = U8_COUNT_BYTES_NON_ASCII(ch); + i = 1; + +morebytes: + while (i < inBytes) + { + if (mySource < sourceLimit) + { + toUBytes[i] = (char) (ch2 = *mySource); + if (!icu::UTF8::isValidTrail(ch, ch2, i, inBytes) && + !(isCESU8 && i == 1 && ch == 0xed && U8_IS_TRAIL(ch2))) + { + break; /* i < inBytes */ + } + ch = (ch << 6) + ch2; + ++mySource; + i++; + } + else + { + cnv->toUnicodeStatus = ch; + cnv->mode = inBytes; + cnv->toULength = (int8_t)i; + goto donefornow; + } + } + + // In CESU-8, only surrogates, not supplementary code points, are encoded directly. + if (i == inBytes && (!isCESU8 || i <= 3)) + { + /* Remove the accumulated high bits */ + ch -= offsetsFromUTF8[inBytes]; + + /* Normal valid byte when the loop has not prematurely terminated (i < inBytes) */ + if (ch <= MAXIMUM_UCS2) + { + /* fits in 16 bits */ + *(myTarget++) = (UChar) ch; + *(myOffsets++) = offsetNum; + } + else + { + /* write out the surrogates */ + *(myTarget++) = U16_LEAD(ch); + *(myOffsets++) = offsetNum; + ch = U16_TRAIL(ch); + if (myTarget < targetLimit) + { + *(myTarget++) = (UChar)ch; + *(myOffsets++) = offsetNum; + } + else + { + cnv->UCharErrorBuffer[0] = (UChar) ch; + cnv->UCharErrorBufferLength = 1; + *err = U_BUFFER_OVERFLOW_ERROR; + } + } + offsetNum += i; + } + else + { + cnv->toULength = (int8_t)i; + *err = U_ILLEGAL_CHAR_FOUND; + break; + } + } + } + +donefornow: + if (mySource < sourceLimit && myTarget >= targetLimit && U_SUCCESS(*err)) + { /* End of target buffer */ + *err = U_BUFFER_OVERFLOW_ERROR; + } + + args->target = myTarget; + args->source = (const char *) mySource; + args->offsets = myOffsets; +} +U_CDECL_END + +U_CFUNC void U_CALLCONV ucnv_fromUnicode_UTF8 (UConverterFromUnicodeArgs * args, + UErrorCode * err) +{ + UConverter *cnv = args->converter; + const UChar *mySource = args->source; + const UChar *sourceLimit = args->sourceLimit; + uint8_t *myTarget = (uint8_t *) args->target; + const uint8_t *targetLimit = (uint8_t *) args->targetLimit; + uint8_t *tempPtr; + UChar32 ch; + uint8_t tempBuf[4]; + int32_t indexToWrite; + UBool isNotCESU8 = !hasCESU8Data(cnv); + + if (cnv->fromUChar32 && myTarget < targetLimit) + { + ch = cnv->fromUChar32; + cnv->fromUChar32 = 0; + goto lowsurrogate; + } + + while (mySource < sourceLimit && myTarget < targetLimit) + { + ch = *(mySource++); + + if (ch < 0x80) /* Single byte */ + { + *(myTarget++) = (uint8_t) ch; + } + else if (ch < 0x800) /* Double byte */ + { + *(myTarget++) = (uint8_t) ((ch >> 6) | 0xc0); + if (myTarget < targetLimit) + { + *(myTarget++) = (uint8_t) ((ch & 0x3f) | 0x80); + } + else + { + cnv->charErrorBuffer[0] = (uint8_t) ((ch & 0x3f) | 0x80); + cnv->charErrorBufferLength = 1; + *err = U_BUFFER_OVERFLOW_ERROR; + } + } + else { + /* Check for surrogates */ + if(U16_IS_SURROGATE(ch) && isNotCESU8) { +lowsurrogate: + if (mySource < sourceLimit) { + /* test both code units */ + if(U16_IS_SURROGATE_LEAD(ch) && U16_IS_TRAIL(*mySource)) { + /* convert and consume this supplementary code point */ + ch=U16_GET_SUPPLEMENTARY(ch, *mySource); + ++mySource; + /* exit this condition tree */ + } + else { + /* this is an unpaired trail or lead code unit */ + /* callback(illegal) */ + cnv->fromUChar32 = ch; + *err = U_ILLEGAL_CHAR_FOUND; + break; + } + } + else { + /* no more input */ + cnv->fromUChar32 = ch; + break; + } + } + + /* Do we write the buffer directly for speed, + or do we have to be careful about target buffer space? */ + tempPtr = (((targetLimit - myTarget) >= 4) ? myTarget : tempBuf); + + if (ch <= MAXIMUM_UCS2) { + indexToWrite = 2; + tempPtr[0] = (uint8_t) ((ch >> 12) | 0xe0); + } + else { + indexToWrite = 3; + tempPtr[0] = (uint8_t) ((ch >> 18) | 0xf0); + tempPtr[1] = (uint8_t) (((ch >> 12) & 0x3f) | 0x80); + } + tempPtr[indexToWrite-1] = (uint8_t) (((ch >> 6) & 0x3f) | 0x80); + tempPtr[indexToWrite] = (uint8_t) ((ch & 0x3f) | 0x80); + + if (tempPtr == myTarget) { + /* There was enough space to write the codepoint directly. */ + myTarget += (indexToWrite + 1); + } + else { + /* We might run out of room soon. Write it slowly. */ + for (; tempPtr <= (tempBuf + indexToWrite); tempPtr++) { + if (myTarget < targetLimit) { + *(myTarget++) = *tempPtr; + } + else { + cnv->charErrorBuffer[cnv->charErrorBufferLength++] = *tempPtr; + *err = U_BUFFER_OVERFLOW_ERROR; + } + } + } + } + } + + if (mySource < sourceLimit && myTarget >= targetLimit && U_SUCCESS(*err)) + { + *err = U_BUFFER_OVERFLOW_ERROR; + } + + args->target = (char *) myTarget; + args->source = mySource; +} + +U_CFUNC void U_CALLCONV ucnv_fromUnicode_UTF8_OFFSETS_LOGIC (UConverterFromUnicodeArgs * args, + UErrorCode * err) +{ + UConverter *cnv = args->converter; + const UChar *mySource = args->source; + int32_t *myOffsets = args->offsets; + const UChar *sourceLimit = args->sourceLimit; + uint8_t *myTarget = (uint8_t *) args->target; + const uint8_t *targetLimit = (uint8_t *) args->targetLimit; + uint8_t *tempPtr; + UChar32 ch; + int32_t offsetNum, nextSourceIndex; + int32_t indexToWrite; + uint8_t tempBuf[4]; + UBool isNotCESU8 = !hasCESU8Data(cnv); + + if (cnv->fromUChar32 && myTarget < targetLimit) + { + ch = cnv->fromUChar32; + cnv->fromUChar32 = 0; + offsetNum = -1; + nextSourceIndex = 0; + goto lowsurrogate; + } else { + offsetNum = 0; + } + + while (mySource < sourceLimit && myTarget < targetLimit) + { + ch = *(mySource++); + + if (ch < 0x80) /* Single byte */ + { + *(myOffsets++) = offsetNum++; + *(myTarget++) = (char) ch; + } + else if (ch < 0x800) /* Double byte */ + { + *(myOffsets++) = offsetNum; + *(myTarget++) = (uint8_t) ((ch >> 6) | 0xc0); + if (myTarget < targetLimit) + { + *(myOffsets++) = offsetNum++; + *(myTarget++) = (uint8_t) ((ch & 0x3f) | 0x80); + } + else + { + cnv->charErrorBuffer[0] = (uint8_t) ((ch & 0x3f) | 0x80); + cnv->charErrorBufferLength = 1; + *err = U_BUFFER_OVERFLOW_ERROR; + } + } + else + /* Check for surrogates */ + { + nextSourceIndex = offsetNum + 1; + + if(U16_IS_SURROGATE(ch) && isNotCESU8) { +lowsurrogate: + if (mySource < sourceLimit) { + /* test both code units */ + if(U16_IS_SURROGATE_LEAD(ch) && U16_IS_TRAIL(*mySource)) { + /* convert and consume this supplementary code point */ + ch=U16_GET_SUPPLEMENTARY(ch, *mySource); + ++mySource; + ++nextSourceIndex; + /* exit this condition tree */ + } + else { + /* this is an unpaired trail or lead code unit */ + /* callback(illegal) */ + cnv->fromUChar32 = ch; + *err = U_ILLEGAL_CHAR_FOUND; + break; + } + } + else { + /* no more input */ + cnv->fromUChar32 = ch; + break; + } + } + + /* Do we write the buffer directly for speed, + or do we have to be careful about target buffer space? */ + tempPtr = (((targetLimit - myTarget) >= 4) ? myTarget : tempBuf); + + if (ch <= MAXIMUM_UCS2) { + indexToWrite = 2; + tempPtr[0] = (uint8_t) ((ch >> 12) | 0xe0); + } + else { + indexToWrite = 3; + tempPtr[0] = (uint8_t) ((ch >> 18) | 0xf0); + tempPtr[1] = (uint8_t) (((ch >> 12) & 0x3f) | 0x80); + } + tempPtr[indexToWrite-1] = (uint8_t) (((ch >> 6) & 0x3f) | 0x80); + tempPtr[indexToWrite] = (uint8_t) ((ch & 0x3f) | 0x80); + + if (tempPtr == myTarget) { + /* There was enough space to write the codepoint directly. */ + myTarget += (indexToWrite + 1); + myOffsets[0] = offsetNum; + myOffsets[1] = offsetNum; + myOffsets[2] = offsetNum; + if (indexToWrite >= 3) { + myOffsets[3] = offsetNum; + } + myOffsets += (indexToWrite + 1); + } + else { + /* We might run out of room soon. Write it slowly. */ + for (; tempPtr <= (tempBuf + indexToWrite); tempPtr++) { + if (myTarget < targetLimit) + { + *(myOffsets++) = offsetNum; + *(myTarget++) = *tempPtr; + } + else + { + cnv->charErrorBuffer[cnv->charErrorBufferLength++] = *tempPtr; + *err = U_BUFFER_OVERFLOW_ERROR; + } + } + } + offsetNum = nextSourceIndex; + } + } + + if (mySource < sourceLimit && myTarget >= targetLimit && U_SUCCESS(*err)) + { + *err = U_BUFFER_OVERFLOW_ERROR; + } + + args->target = (char *) myTarget; + args->source = mySource; + args->offsets = myOffsets; +} + +U_CDECL_BEGIN +static UChar32 U_CALLCONV ucnv_getNextUChar_UTF8(UConverterToUnicodeArgs *args, + UErrorCode *err) { + UConverter *cnv; + const uint8_t *sourceInitial; + const uint8_t *source; + uint8_t myByte; + UChar32 ch; + int8_t i; + + /* UTF-8 only here, the framework handles CESU-8 to combine surrogate pairs */ + + cnv = args->converter; + sourceInitial = source = (const uint8_t *)args->source; + if (source >= (const uint8_t *)args->sourceLimit) + { + /* no input */ + *err = U_INDEX_OUTOFBOUNDS_ERROR; + return 0xffff; + } + + myByte = (uint8_t)*(source++); + if (U8_IS_SINGLE(myByte)) + { + args->source = (const char *)source; + return (UChar32)myByte; + } + + uint16_t countTrailBytes = U8_COUNT_TRAIL_BYTES(myByte); + if (countTrailBytes == 0) { + cnv->toUBytes[0] = myByte; + cnv->toULength = 1; + *err = U_ILLEGAL_CHAR_FOUND; + args->source = (const char *)source; + return 0xffff; + } + + /*The byte sequence is longer than the buffer area passed*/ + if (((const char *)source + countTrailBytes) > args->sourceLimit) + { + /* check if all of the remaining bytes are trail bytes */ + uint16_t extraBytesToWrite = countTrailBytes + 1; + cnv->toUBytes[0] = myByte; + i = 1; + *err = U_TRUNCATED_CHAR_FOUND; + while(source < (const uint8_t *)args->sourceLimit) { + uint8_t b = *source; + if(icu::UTF8::isValidTrail(myByte, b, i, extraBytesToWrite)) { + cnv->toUBytes[i++] = b; + ++source; + } else { + /* error even before we run out of input */ + *err = U_ILLEGAL_CHAR_FOUND; + break; + } + } + cnv->toULength = i; + args->source = (const char *)source; + return 0xffff; + } + + ch = myByte << 6; + if(countTrailBytes == 2) { + uint8_t t1 = *source, t2; + if(U8_IS_VALID_LEAD3_AND_T1(myByte, t1) && U8_IS_TRAIL(t2 = *++source)) { + args->source = (const char *)(source + 1); + return (((ch + t1) << 6) + t2) - offsetsFromUTF8[3]; + } + } else if(countTrailBytes == 1) { + uint8_t t1 = *source; + if(U8_IS_TRAIL(t1)) { + args->source = (const char *)(source + 1); + return (ch + t1) - offsetsFromUTF8[2]; + } + } else { // countTrailBytes == 3 + uint8_t t1 = *source, t2, t3; + if(U8_IS_VALID_LEAD4_AND_T1(myByte, t1) && U8_IS_TRAIL(t2 = *++source) && + U8_IS_TRAIL(t3 = *++source)) { + args->source = (const char *)(source + 1); + return (((((ch + t1) << 6) + t2) << 6) + t3) - offsetsFromUTF8[4]; + } + } + args->source = (const char *)source; + + for(i = 0; sourceInitial < source; ++i) { + cnv->toUBytes[i] = *sourceInitial++; + } + cnv->toULength = i; + *err = U_ILLEGAL_CHAR_FOUND; + return 0xffff; +} +U_CDECL_END + +/* UTF-8-from-UTF-8 conversion functions ------------------------------------ */ + +U_CDECL_BEGIN +/* "Convert" UTF-8 to UTF-8: Validate and copy. Modified from ucnv_DBCSFromUTF8(). */ +static void U_CALLCONV +ucnv_UTF8FromUTF8(UConverterFromUnicodeArgs *pFromUArgs, + UConverterToUnicodeArgs *pToUArgs, + UErrorCode *pErrorCode) { + UConverter *utf8; + const uint8_t *source, *sourceLimit; + uint8_t *target; + int32_t targetCapacity; + int32_t count; + + int8_t oldToULength, toULength, toULimit; + + UChar32 c; + uint8_t b, t1, t2; + + /* set up the local pointers */ + utf8=pToUArgs->converter; + source=(uint8_t *)pToUArgs->source; + sourceLimit=(uint8_t *)pToUArgs->sourceLimit; + target=(uint8_t *)pFromUArgs->target; + targetCapacity=(int32_t)(pFromUArgs->targetLimit-pFromUArgs->target); + + /* get the converter state from the UTF-8 UConverter */ + c=(UChar32)utf8->toUnicodeStatus; + if(c!=0) { + toULength=oldToULength=utf8->toULength; + toULimit=(int8_t)utf8->mode; + } else { + toULength=oldToULength=toULimit=0; + } + + count=(int32_t)(sourceLimit-source)+oldToULength; + if(counttargetCapacity) { + limit-=(count-targetCapacity); + count=targetCapacity; + } + + // The conversion loop checks count>0 only once per 1/2/3-byte character. + // If the buffer ends with a truncated 2- or 3-byte sequence, + // then we reduce the count to stop before that, + // and collect the remaining bytes after the conversion loop. + { + // Do not go back into the bytes that will be read for finishing a partial + // sequence from the previous buffer. + int32_t length=count-toULimit; + if(length>0) { + uint8_t b1=*(limit-1); + if(U8_IS_SINGLE(b1)) { + // common ASCII character + } else if(U8_IS_TRAIL(b1) && length>=2) { + uint8_t b2=*(limit-2); + if(0xe0<=b2 && b2<0xf0 && U8_IS_VALID_LEAD3_AND_T1(b2, b1)) { + // truncated 3-byte sequence + count-=2; + } + } else if(0xc2<=b1 && b1<0xf0) { + // truncated 2- or 3-byte sequence + --count; + } + } + } + } + + if(c!=0) { + utf8->toUnicodeStatus=0; + utf8->toULength=0; + goto moreBytes; + /* See note in ucnv_SBCSFromUTF8() about this goto. */ + } + + /* conversion loop */ + while(count>0) { + b=*source++; + if(U8_IS_SINGLE(b)) { + /* convert ASCII */ + *target++=b; + --count; + continue; + } else { + if(b>=0xe0) { + if( /* handle U+0800..U+FFFF inline */ + b<0xf0 && + U8_IS_VALID_LEAD3_AND_T1(b, t1=source[0]) && + U8_IS_TRAIL(t2=source[1]) + ) { + source+=2; + *target++=b; + *target++=t1; + *target++=t2; + count-=3; + continue; + } + } else { + if( /* handle U+0080..U+07FF inline */ + b>=0xc2 && + U8_IS_TRAIL(t1=*source) + ) { + ++source; + *target++=b; + *target++=t1; + count-=2; + continue; + } + } + + /* handle "complicated" and error cases, and continuing partial characters */ + oldToULength=0; + toULength=1; + toULimit=U8_COUNT_BYTES_NON_ASCII(b); + c=b; +moreBytes: + while(toULengthtoUBytes[oldToULength++]=*source++; + } + utf8->toUnicodeStatus=c; + utf8->toULength=toULength; + utf8->mode=toULimit; + pToUArgs->source=(char *)source; + pFromUArgs->target=(char *)target; + return; + } + } + + if(toULength!=toULimit) { + /* error handling: illegal UTF-8 byte sequence */ + source-=(toULength-oldToULength); + while(oldToULengthtoUBytes[oldToULength++]=*source++; + } + utf8->toULength=toULength; + pToUArgs->source=(char *)source; + pFromUArgs->target=(char *)target; + *pErrorCode=U_ILLEGAL_CHAR_FOUND; + return; + } + + /* copy the legal byte sequence to the target */ + if(count>=toULength) { + int8_t i; + + for(i=0; itoUBytes[i]; + } + source-=(toULength-oldToULength); + for(; isource=(char *)source; + pFromUArgs->target=(char *)target; + *pErrorCode=U_USING_DEFAULT_WARNING; + return; + } + } + } + U_ASSERT(count>=0); + + if(U_SUCCESS(*pErrorCode) && sourcetargetLimit) { + *pErrorCode=U_BUFFER_OVERFLOW_ERROR; + } else { + b=*source; + toULimit=U8_COUNT_BYTES(b); + if(toULimit>(sourceLimit-source)) { + /* collect a truncated byte sequence */ + toULength=0; + c=b; + for(;;) { + utf8->toUBytes[toULength++]=b; + if(++source==sourceLimit) { + /* partial byte sequence at end of source */ + utf8->toUnicodeStatus=c; + utf8->toULength=toULength; + utf8->mode=toULimit; + break; + } else if(!U8_IS_TRAIL(b=*source)) { + /* lead byte in trail byte position */ + utf8->toULength=toULength; + *pErrorCode=U_ILLEGAL_CHAR_FOUND; + break; + } + c=(c<<6)+b; + } + } else { + /* partial-sequence target overflow: fall back to the pivoting implementation */ + *pErrorCode=U_USING_DEFAULT_WARNING; + } + } + } + + /* write back the updated pointers */ + pToUArgs->source=(char *)source; + pFromUArgs->target=(char *)target; +} + +U_CDECL_END + +/* UTF-8 converter data ----------------------------------------------------- */ + +static const UConverterImpl _UTF8Impl={ + UCNV_UTF8, + + NULL, + NULL, + + NULL, + NULL, + NULL, + + ucnv_toUnicode_UTF8, + ucnv_toUnicode_UTF8_OFFSETS_LOGIC, + ucnv_fromUnicode_UTF8, + ucnv_fromUnicode_UTF8_OFFSETS_LOGIC, + ucnv_getNextUChar_UTF8, + + NULL, + NULL, + NULL, + NULL, + ucnv_getNonSurrogateUnicodeSet, + + ucnv_UTF8FromUTF8, + ucnv_UTF8FromUTF8 +}; + +/* The 1208 CCSID refers to any version of Unicode of UTF-8 */ +static const UConverterStaticData _UTF8StaticData={ + sizeof(UConverterStaticData), + "UTF-8", + 1208, UCNV_IBM, UCNV_UTF8, + 1, 3, /* max 3 bytes per UChar from UTF-8 (4 bytes from surrogate _pair_) */ + { 0xef, 0xbf, 0xbd, 0 },3,FALSE,FALSE, + 0, + 0, + { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 } /* reserved */ +}; + + +const UConverterSharedData _UTF8Data= + UCNV_IMMUTABLE_SHARED_DATA_INITIALIZER(&_UTF8StaticData, &_UTF8Impl); + +/* CESU-8 converter data ---------------------------------------------------- */ + +static const UConverterImpl _CESU8Impl={ + UCNV_CESU8, + + NULL, + NULL, + + NULL, + NULL, + NULL, + + ucnv_toUnicode_UTF8, + ucnv_toUnicode_UTF8_OFFSETS_LOGIC, + ucnv_fromUnicode_UTF8, + ucnv_fromUnicode_UTF8_OFFSETS_LOGIC, + NULL, + + NULL, + NULL, + NULL, + NULL, + ucnv_getCompleteUnicodeSet, + + NULL, + NULL +}; + +static const UConverterStaticData _CESU8StaticData={ + sizeof(UConverterStaticData), + "CESU-8", + 9400, /* CCSID for CESU-8 */ + UCNV_UNKNOWN, UCNV_CESU8, 1, 3, + { 0xef, 0xbf, 0xbd, 0 },3,FALSE,FALSE, + 0, + 0, + { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 } /* reserved */ +}; + + +const UConverterSharedData _CESU8Data= + UCNV_IMMUTABLE_SHARED_DATA_INITIALIZER(&_CESU8StaticData, &_CESU8Impl); + +#endif diff --git a/Build/source/libs/icu/icu-src/source/common/ucnvbocu.cpp b/Build/source/libs/icu/icu-src/source/common/ucnvbocu.cpp index 69763ca3213..5b66c5059a5 100644 --- a/Build/source/libs/icu/icu-src/source/common/ucnvbocu.cpp +++ b/Build/source/libs/icu/icu-src/source/common/ucnvbocu.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ****************************************************************************** @@ -8,7 +8,7 @@ * ****************************************************************************** * file name: ucnvbocu.cpp -* encoding: US-ASCII +* encoding: UTF-8 * tab size: 8 (not used) * indentation:4 * diff --git a/Build/source/libs/icu/icu-src/source/common/ucnvdisp.c b/Build/source/libs/icu/icu-src/source/common/ucnvdisp.c deleted file mode 100644 index e30f665f4a0..00000000000 --- a/Build/source/libs/icu/icu-src/source/common/ucnvdisp.c +++ /dev/null @@ -1,88 +0,0 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. -// License & terms of use: http://www.unicode.org/copyright.html -/* -****************************************************************************** -* -* Copyright (C) 1998-2004, International Business Machines -* Corporation and others. All Rights Reserved. -* -****************************************************************************** -* -* ucnvdisp.c: -* Implements APIs for the ICU's codeset conversion library display names. -* -* Modification History: -* -* Date Name Description -* 04/04/99 helena Fixed internal header inclusion. -* 05/09/00 helena Added implementation to handle fallback mappings. -* 06/20/2000 helena OS/400 port changes; mostly typecast. -* 09/08/2004 grhoten split from ucnv.c -*/ - -#include "unicode/utypes.h" - -#if !UCONFIG_NO_CONVERSION - -#include "unicode/ustring.h" -#include "unicode/ures.h" -#include "unicode/ucnv.h" -#include "cstring.h" -#include "ustr_imp.h" -#include "ucnv_imp.h" -#include "putilimp.h" - -U_CAPI int32_t U_EXPORT2 -ucnv_getDisplayName(const UConverter *cnv, - const char *displayLocale, - UChar *displayName, int32_t displayNameCapacity, - UErrorCode *pErrorCode) { - UResourceBundle *rb; - const UChar *name; - int32_t length; - UErrorCode localStatus = U_ZERO_ERROR; - - /* check arguments */ - if(pErrorCode==NULL || U_FAILURE(*pErrorCode)) { - return 0; - } - - if(cnv==NULL || displayNameCapacity<0 || (displayNameCapacity>0 && displayName==NULL)) { - *pErrorCode=U_ILLEGAL_ARGUMENT_ERROR; - return 0; - } - - /* open the resource bundle and get the display name string */ - rb=ures_open(NULL, displayLocale, pErrorCode); - if(U_FAILURE(*pErrorCode)) { - return 0; - } - - /* use the internal name as the key */ - name=ures_getStringByKey(rb, cnv->sharedData->staticData->name, &length, &localStatus); - ures_close(rb); - - if(U_SUCCESS(localStatus)) { - /* copy the string */ - if (*pErrorCode == U_ZERO_ERROR) { - *pErrorCode = localStatus; - } - u_memcpy(displayName, name, uprv_min(length, displayNameCapacity)*U_SIZEOF_UCHAR); - } else { - /* convert the internal name into a Unicode string */ - length=(int32_t)uprv_strlen(cnv->sharedData->staticData->name); - u_charsToUChars(cnv->sharedData->staticData->name, displayName, uprv_min(length, displayNameCapacity)); - } - return u_terminateUChars(displayName, displayNameCapacity, length, pErrorCode); -} - -#endif - -/* - * Hey, Emacs, please set the following: - * - * Local Variables: - * indent-tabs-mode: nil - * End: - * - */ diff --git a/Build/source/libs/icu/icu-src/source/common/ucnvdisp.cpp b/Build/source/libs/icu/icu-src/source/common/ucnvdisp.cpp new file mode 100644 index 00000000000..ac86b985970 --- /dev/null +++ b/Build/source/libs/icu/icu-src/source/common/ucnvdisp.cpp @@ -0,0 +1,88 @@ +// © 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html +/* +****************************************************************************** +* +* Copyright (C) 1998-2004, International Business Machines +* Corporation and others. All Rights Reserved. +* +****************************************************************************** +* +* ucnvdisp.c: +* Implements APIs for the ICU's codeset conversion library display names. +* +* Modification History: +* +* Date Name Description +* 04/04/99 helena Fixed internal header inclusion. +* 05/09/00 helena Added implementation to handle fallback mappings. +* 06/20/2000 helena OS/400 port changes; mostly typecast. +* 09/08/2004 grhoten split from ucnv.c +*/ + +#include "unicode/utypes.h" + +#if !UCONFIG_NO_CONVERSION + +#include "unicode/ustring.h" +#include "unicode/ures.h" +#include "unicode/ucnv.h" +#include "cstring.h" +#include "ustr_imp.h" +#include "ucnv_imp.h" +#include "putilimp.h" + +U_CAPI int32_t U_EXPORT2 +ucnv_getDisplayName(const UConverter *cnv, + const char *displayLocale, + UChar *displayName, int32_t displayNameCapacity, + UErrorCode *pErrorCode) { + UResourceBundle *rb; + const UChar *name; + int32_t length; + UErrorCode localStatus = U_ZERO_ERROR; + + /* check arguments */ + if(pErrorCode==NULL || U_FAILURE(*pErrorCode)) { + return 0; + } + + if(cnv==NULL || displayNameCapacity<0 || (displayNameCapacity>0 && displayName==NULL)) { + *pErrorCode=U_ILLEGAL_ARGUMENT_ERROR; + return 0; + } + + /* open the resource bundle and get the display name string */ + rb=ures_open(NULL, displayLocale, pErrorCode); + if(U_FAILURE(*pErrorCode)) { + return 0; + } + + /* use the internal name as the key */ + name=ures_getStringByKey(rb, cnv->sharedData->staticData->name, &length, &localStatus); + ures_close(rb); + + if(U_SUCCESS(localStatus)) { + /* copy the string */ + if (*pErrorCode == U_ZERO_ERROR) { + *pErrorCode = localStatus; + } + u_memcpy(displayName, name, uprv_min(length, displayNameCapacity)*U_SIZEOF_UCHAR); + } else { + /* convert the internal name into a Unicode string */ + length=(int32_t)uprv_strlen(cnv->sharedData->staticData->name); + u_charsToUChars(cnv->sharedData->staticData->name, displayName, uprv_min(length, displayNameCapacity)); + } + return u_terminateUChars(displayName, displayNameCapacity, length, pErrorCode); +} + +#endif + +/* + * Hey, Emacs, please set the following: + * + * Local Variables: + * indent-tabs-mode: nil + * End: + * + */ diff --git a/Build/source/libs/icu/icu-src/source/common/ucnvhz.c b/Build/source/libs/icu/icu-src/source/common/ucnvhz.c deleted file mode 100644 index d35551628b0..00000000000 --- a/Build/source/libs/icu/icu-src/source/common/ucnvhz.c +++ /dev/null @@ -1,631 +0,0 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. -// License & terms of use: http://www.unicode.org/copyright.html -/* -********************************************************************** -* Copyright (C) 2000-2015, International Business Machines -* Corporation and others. All Rights Reserved. -********************************************************************** -* file name: ucnvhz.c -* encoding: US-ASCII -* tab size: 8 (not used) -* indentation:4 -* -* created on: 2000oct16 -* created by: Ram Viswanadha -* 10/31/2000 Ram Implemented offsets logic function -* -*/ - -#include "unicode/utypes.h" - -#if !UCONFIG_NO_CONVERSION && !UCONFIG_NO_LEGACY_CONVERSION && !UCONFIG_ONLY_HTML_CONVERSION - -#include "cmemory.h" -#include "unicode/ucnv.h" -#include "unicode/ucnv_cb.h" -#include "unicode/uset.h" -#include "unicode/utf16.h" -#include "ucnv_bld.h" -#include "ucnv_cnv.h" -#include "ucnv_imp.h" - -#define UCNV_TILDE 0x7E /* ~ */ -#define UCNV_OPEN_BRACE 0x7B /* { */ -#define UCNV_CLOSE_BRACE 0x7D /* } */ -#define SB_ESCAPE "\x7E\x7D" -#define DB_ESCAPE "\x7E\x7B" -#define TILDE_ESCAPE "\x7E\x7E" -#define ESC_LEN 2 - - -#define CONCAT_ESCAPE_MACRO( args, targetIndex,targetLength,strToAppend, err, len,sourceIndex){ \ - while(len-->0){ \ - if(targetIndex < targetLength){ \ - args->target[targetIndex] = (unsigned char) *strToAppend; \ - if(args->offsets!=NULL){ \ - *(offsets++) = sourceIndex-1; \ - } \ - targetIndex++; \ - } \ - else{ \ - args->converter->charErrorBuffer[(int)args->converter->charErrorBufferLength++] = (unsigned char) *strToAppend; \ - *err =U_BUFFER_OVERFLOW_ERROR; \ - } \ - strToAppend++; \ - } \ -} - - -typedef struct{ - UConverter* gbConverter; - int32_t targetIndex; - int32_t sourceIndex; - UBool isEscapeAppended; - UBool isStateDBCS; - UBool isTargetUCharDBCS; - UBool isEmptySegment; -}UConverterDataHZ; - - - -static void -_HZOpen(UConverter *cnv, UConverterLoadArgs *pArgs, UErrorCode *errorCode){ - UConverter *gbConverter; - if(pArgs->onlyTestIsLoadable) { - ucnv_canCreateConverter("GBK", errorCode); /* errorCode carries result */ - return; - } - gbConverter = ucnv_open("GBK", errorCode); - if(U_FAILURE(*errorCode)) { - return; - } - cnv->toUnicodeStatus = 0; - cnv->fromUnicodeStatus= 0; - cnv->mode=0; - cnv->fromUChar32=0x0000; - cnv->extraInfo = uprv_calloc(1, sizeof(UConverterDataHZ)); - if(cnv->extraInfo != NULL){ - ((UConverterDataHZ*)cnv->extraInfo)->gbConverter = gbConverter; - } - else { - ucnv_close(gbConverter); - *errorCode = U_MEMORY_ALLOCATION_ERROR; - return; - } -} - -static void -_HZClose(UConverter *cnv){ - if(cnv->extraInfo != NULL) { - ucnv_close (((UConverterDataHZ *) (cnv->extraInfo))->gbConverter); - if(!cnv->isExtraLocal) { - uprv_free(cnv->extraInfo); - } - cnv->extraInfo = NULL; - } -} - -static void -_HZReset(UConverter *cnv, UConverterResetChoice choice){ - if(choice<=UCNV_RESET_TO_UNICODE) { - cnv->toUnicodeStatus = 0; - cnv->mode=0; - if(cnv->extraInfo != NULL){ - ((UConverterDataHZ*)cnv->extraInfo)->isStateDBCS = FALSE; - ((UConverterDataHZ*)cnv->extraInfo)->isEmptySegment = FALSE; - } - } - if(choice!=UCNV_RESET_TO_UNICODE) { - cnv->fromUnicodeStatus= 0; - cnv->fromUChar32=0x0000; - if(cnv->extraInfo != NULL){ - ((UConverterDataHZ*)cnv->extraInfo)->isEscapeAppended = FALSE; - ((UConverterDataHZ*)cnv->extraInfo)->targetIndex = 0; - ((UConverterDataHZ*)cnv->extraInfo)->sourceIndex = 0; - ((UConverterDataHZ*)cnv->extraInfo)->isTargetUCharDBCS = FALSE; - } - } -} - -/**************************************HZ Encoding************************************************* -* Rules for HZ encoding -* -* In ASCII mode, a byte is interpreted as an ASCII character, unless a -* '~' is encountered. The character '~' is an escape character. By -* convention, it must be immediately followed ONLY by '~', '{' or '\n' -* (), with the following special meaning. - -* 1. The escape sequence '~~' is interpreted as a '~'. -* 2. The escape-to-GB sequence '~{' switches the mode from ASCII to GB. -* 3. The escape sequence '~\n' is a line-continuation marker to be -* consumed with no output produced. -* In GB mode, characters are interpreted two bytes at a time as (pure) -* GB codes until the escape-from-GB code '~}' is read. This code -* switches the mode from GB back to ASCII. (Note that the escape- -* from-GB code '~}' ($7E7D) is outside the defined GB range.) -* -* Source: RFC 1842 -* -* Note that the formal syntax in RFC 1842 is invalid. I assume that the -* intended definition of single-byte-segment is as follows (pedberg): -* single-byte-segment = single-byte-seq 1*single-byte-char -*/ - - -static void -UConverter_toUnicode_HZ_OFFSETS_LOGIC(UConverterToUnicodeArgs *args, - UErrorCode* err){ - char tempBuf[2]; - const char *mySource = ( char *) args->source; - UChar *myTarget = args->target; - const char *mySourceLimit = args->sourceLimit; - UChar32 targetUniChar = 0x0000; - int32_t mySourceChar = 0x0000; - UConverterDataHZ* myData=(UConverterDataHZ*)(args->converter->extraInfo); - tempBuf[0]=0; - tempBuf[1]=0; - - /* Calling code already handles this situation. */ - /*if ((args->converter == NULL) || (args->targetLimit < args->target) || (mySourceLimit < args->source)){ - *err = U_ILLEGAL_ARGUMENT_ERROR; - return; - }*/ - - while(mySource< mySourceLimit){ - - if(myTarget < args->targetLimit){ - - mySourceChar= (unsigned char) *mySource++; - - if(args->converter->mode == UCNV_TILDE) { - /* second byte after ~ */ - args->converter->mode=0; - switch(mySourceChar) { - case 0x0A: - /* no output for ~\n (line-continuation marker) */ - continue; - case UCNV_TILDE: - if(args->offsets) { - args->offsets[myTarget - args->target]=(int32_t)(mySource - args->source - 2); - } - *(myTarget++)=(UChar)mySourceChar; - myData->isEmptySegment = FALSE; - continue; - case UCNV_OPEN_BRACE: - case UCNV_CLOSE_BRACE: - myData->isStateDBCS = (mySourceChar == UCNV_OPEN_BRACE); - if (myData->isEmptySegment) { - myData->isEmptySegment = FALSE; /* we are handling it, reset to avoid future spurious errors */ - *err = U_ILLEGAL_ESCAPE_SEQUENCE; - args->converter->toUCallbackReason = UCNV_IRREGULAR; - args->converter->toUBytes[0] = UCNV_TILDE; - args->converter->toUBytes[1] = mySourceChar; - args->converter->toULength = 2; - args->target = myTarget; - args->source = mySource; - return; - } - myData->isEmptySegment = TRUE; - continue; - default: - /* if the first byte is equal to TILDE and the trail byte - * is not a valid byte then it is an error condition - */ - /* - * Ticket 5691: consistent illegal sequences: - * - We include at least the first byte in the illegal sequence. - * - If any of the non-initial bytes could be the start of a character, - * we stop the illegal sequence before the first one of those. - */ - myData->isEmptySegment = FALSE; /* different error here, reset this to avoid spurious future error */ - *err = U_ILLEGAL_ESCAPE_SEQUENCE; - args->converter->toUBytes[0] = UCNV_TILDE; - if( myData->isStateDBCS ? - (0x21 <= mySourceChar && mySourceChar <= 0x7e) : - mySourceChar <= 0x7f - ) { - /* The current byte could be the start of a character: Back it out. */ - args->converter->toULength = 1; - --mySource; - } else { - /* Include the current byte in the illegal sequence. */ - args->converter->toUBytes[1] = mySourceChar; - args->converter->toULength = 2; - } - args->target = myTarget; - args->source = mySource; - return; - } - } else if(myData->isStateDBCS) { - if(args->converter->toUnicodeStatus == 0x00){ - /* lead byte */ - if(mySourceChar == UCNV_TILDE) { - args->converter->mode = UCNV_TILDE; - } else { - /* add another bit to distinguish a 0 byte from not having seen a lead byte */ - args->converter->toUnicodeStatus = (uint32_t) (mySourceChar | 0x100); - myData->isEmptySegment = FALSE; /* the segment has something, either valid or will produce a different error, so reset this */ - } - continue; - } - else{ - /* trail byte */ - int leadIsOk, trailIsOk; - uint32_t leadByte = args->converter->toUnicodeStatus & 0xff; - targetUniChar = 0xffff; - /* - * Ticket 5691: consistent illegal sequences: - * - We include at least the first byte in the illegal sequence. - * - If any of the non-initial bytes could be the start of a character, - * we stop the illegal sequence before the first one of those. - * - * In HZ DBCS, if the second byte is in the 21..7e range, - * we report only the first byte as the illegal sequence. - * Otherwise we convert or report the pair of bytes. - */ - leadIsOk = (uint8_t)(leadByte - 0x21) <= (0x7d - 0x21); - trailIsOk = (uint8_t)(mySourceChar - 0x21) <= (0x7e - 0x21); - if (leadIsOk && trailIsOk) { - tempBuf[0] = (char) (leadByte+0x80) ; - tempBuf[1] = (char) (mySourceChar+0x80); - targetUniChar = ucnv_MBCSSimpleGetNextUChar(myData->gbConverter->sharedData, - tempBuf, 2, args->converter->useFallback); - mySourceChar= (leadByte << 8) | mySourceChar; - } else if (trailIsOk) { - /* report a single illegal byte and continue with the following DBCS starter byte */ - --mySource; - mySourceChar = (int32_t)leadByte; - } else { - /* report a pair of illegal bytes if the second byte is not a DBCS starter */ - /* add another bit so that the code below writes 2 bytes in case of error */ - mySourceChar= 0x10000 | (leadByte << 8) | mySourceChar; - } - args->converter->toUnicodeStatus =0x00; - } - } - else{ - if(mySourceChar == UCNV_TILDE) { - args->converter->mode = UCNV_TILDE; - continue; - } else if(mySourceChar <= 0x7f) { - targetUniChar = (UChar)mySourceChar; /* ASCII */ - myData->isEmptySegment = FALSE; /* the segment has something valid */ - } else { - targetUniChar = 0xffff; - myData->isEmptySegment = FALSE; /* different error here, reset this to avoid spurious future error */ - } - } - if(targetUniChar < 0xfffe){ - if(args->offsets) { - args->offsets[myTarget - args->target]=(int32_t)(mySource - args->source - 1-(myData->isStateDBCS)); - } - - *(myTarget++)=(UChar)targetUniChar; - } - else /* targetUniChar>=0xfffe */ { - if(targetUniChar == 0xfffe){ - *err = U_INVALID_CHAR_FOUND; - } - else{ - *err = U_ILLEGAL_CHAR_FOUND; - } - if(mySourceChar > 0xff){ - args->converter->toUBytes[0] = (uint8_t)(mySourceChar >> 8); - args->converter->toUBytes[1] = (uint8_t)mySourceChar; - args->converter->toULength=2; - } - else{ - args->converter->toUBytes[0] = (uint8_t)mySourceChar; - args->converter->toULength=1; - } - break; - } - } - else{ - *err =U_BUFFER_OVERFLOW_ERROR; - break; - } - } - - args->target = myTarget; - args->source = mySource; -} - - -static void -UConverter_fromUnicode_HZ_OFFSETS_LOGIC (UConverterFromUnicodeArgs * args, - UErrorCode * err){ - const UChar *mySource = args->source; - char *myTarget = args->target; - int32_t* offsets = args->offsets; - int32_t mySourceIndex = 0; - int32_t myTargetIndex = 0; - int32_t targetLength = (int32_t)(args->targetLimit - myTarget); - int32_t mySourceLength = (int32_t)(args->sourceLimit - args->source); - uint32_t targetUniChar = 0x0000; - UChar32 mySourceChar = 0x0000; - UConverterDataHZ *myConverterData=(UConverterDataHZ*)args->converter->extraInfo; - UBool isTargetUCharDBCS = (UBool) myConverterData->isTargetUCharDBCS; - UBool oldIsTargetUCharDBCS; - int len =0; - const char* escSeq=NULL; - - /* Calling code already handles this situation. */ - /*if ((args->converter == NULL) || (args->targetLimit < myTarget) || (args->sourceLimit < args->source)){ - *err = U_ILLEGAL_ARGUMENT_ERROR; - return; - }*/ - if(args->converter->fromUChar32!=0 && myTargetIndex < targetLength) { - goto getTrail; - } - /*writing the char to the output stream */ - while (mySourceIndex < mySourceLength){ - targetUniChar = missingCharMarker; - if (myTargetIndex < targetLength){ - - mySourceChar = (UChar) mySource[mySourceIndex++]; - - - oldIsTargetUCharDBCS = isTargetUCharDBCS; - if(mySourceChar ==UCNV_TILDE){ - /*concatEscape(args, &myTargetIndex, &targetLength,"\x7E\x7E",err,2,&mySourceIndex);*/ - len = ESC_LEN; - escSeq = TILDE_ESCAPE; - CONCAT_ESCAPE_MACRO(args, myTargetIndex, targetLength, escSeq,err,len,mySourceIndex); - continue; - } else if(mySourceChar <= 0x7f) { - targetUniChar = mySourceChar; - } else { - int32_t length= ucnv_MBCSFromUChar32(myConverterData->gbConverter->sharedData, - mySourceChar,&targetUniChar,args->converter->useFallback); - /* we can only use lead bytes 21..7D and trail bytes 21..7E */ - if( length == 2 && - (uint16_t)(targetUniChar - 0xa1a1) <= (0xfdfe - 0xa1a1) && - (uint8_t)(targetUniChar - 0xa1) <= (0xfe - 0xa1) - ) { - targetUniChar -= 0x8080; - } else { - targetUniChar = missingCharMarker; - } - } - if (targetUniChar != missingCharMarker){ - myConverterData->isTargetUCharDBCS = isTargetUCharDBCS = (UBool)(targetUniChar>0x00FF); - if(oldIsTargetUCharDBCS != isTargetUCharDBCS || !myConverterData->isEscapeAppended ){ - /*Shifting from a double byte to single byte mode*/ - if(!isTargetUCharDBCS){ - len =ESC_LEN; - escSeq = SB_ESCAPE; - CONCAT_ESCAPE_MACRO(args, myTargetIndex, targetLength, escSeq,err,len,mySourceIndex); - myConverterData->isEscapeAppended = TRUE; - } - else{ /* Shifting from a single byte to double byte mode*/ - len =ESC_LEN; - escSeq = DB_ESCAPE; - CONCAT_ESCAPE_MACRO(args, myTargetIndex, targetLength, escSeq,err,len,mySourceIndex); - myConverterData->isEscapeAppended = TRUE; - - } - } - - if(isTargetUCharDBCS){ - if( myTargetIndex > 8); - if(offsets){ - *(offsets++) = mySourceIndex-1; - } - if(myTargetIndex < targetLength){ - myTarget[myTargetIndex++] =(char) targetUniChar; - if(offsets){ - *(offsets++) = mySourceIndex-1; - } - }else{ - args->converter->charErrorBuffer[args->converter->charErrorBufferLength++] = (char) targetUniChar; - *err = U_BUFFER_OVERFLOW_ERROR; - } - }else{ - args->converter->charErrorBuffer[args->converter->charErrorBufferLength++] =(char) (targetUniChar >> 8); - args->converter->charErrorBuffer[args->converter->charErrorBufferLength++] = (char) targetUniChar; - *err = U_BUFFER_OVERFLOW_ERROR; - } - - }else{ - if( myTargetIndex converter->charErrorBuffer[args->converter->charErrorBufferLength++] = (char) targetUniChar; - *err = U_BUFFER_OVERFLOW_ERROR; - } - } - - } - else{ - /* oops.. the code point is unassigned */ - /*Handle surrogates */ - /*check if the char is a First surrogate*/ - if(U16_IS_SURROGATE(mySourceChar)) { - if(U16_IS_SURROGATE_LEAD(mySourceChar)) { - args->converter->fromUChar32=mySourceChar; -getTrail: - /*look ahead to find the trail surrogate*/ - if(mySourceIndex < mySourceLength) { - /* test the following code unit */ - UChar trail=(UChar) args->source[mySourceIndex]; - if(U16_IS_TRAIL(trail)) { - ++mySourceIndex; - mySourceChar=U16_GET_SUPPLEMENTARY(args->converter->fromUChar32, trail); - args->converter->fromUChar32=0x00; - /* there are no surrogates in GB2312*/ - *err = U_INVALID_CHAR_FOUND; - /* exit this condition tree */ - } else { - /* this is an unmatched lead code unit (1st surrogate) */ - /* callback(illegal) */ - *err=U_ILLEGAL_CHAR_FOUND; - } - } else { - /* no more input */ - *err = U_ZERO_ERROR; - } - } else { - /* this is an unmatched trail code unit (2nd surrogate) */ - /* callback(illegal) */ - *err=U_ILLEGAL_CHAR_FOUND; - } - } else { - /* callback(unassigned) for a BMP code point */ - *err = U_INVALID_CHAR_FOUND; - } - - args->converter->fromUChar32=mySourceChar; - break; - } - } - else{ - *err = U_BUFFER_OVERFLOW_ERROR; - break; - } - targetUniChar=missingCharMarker; - } - - args->target += myTargetIndex; - args->source += mySourceIndex; - myConverterData->isTargetUCharDBCS = isTargetUCharDBCS; -} - -static void -_HZ_WriteSub(UConverterFromUnicodeArgs *args, int32_t offsetIndex, UErrorCode *err) { - UConverter *cnv = args->converter; - UConverterDataHZ *convData=(UConverterDataHZ *) cnv->extraInfo; - char *p; - char buffer[4]; - p = buffer; - - if( convData->isTargetUCharDBCS){ - *p++= UCNV_TILDE; - *p++= UCNV_CLOSE_BRACE; - convData->isTargetUCharDBCS=FALSE; - } - *p++= (char)cnv->subChars[0]; - - ucnv_cbFromUWriteBytes(args, - buffer, (int32_t)(p - buffer), - offsetIndex, err); -} - -/* - * Structure for cloning an HZ converter into a single memory block. - * ucnv_safeClone() of the HZ converter will align the entire cloneHZStruct, - * and then ucnv_safeClone() of the sub-converter may additionally align - * subCnv inside the cloneHZStruct, for which we need the deadSpace after - * subCnv. This is because UAlignedMemory may be larger than the actually - * necessary alignment size for the platform. - * The other cloneHZStruct fields will not be moved around, - * and are aligned properly with cloneHZStruct's alignment. - */ -struct cloneHZStruct -{ - UConverter cnv; - UConverter subCnv; - UAlignedMemory deadSpace; - UConverterDataHZ mydata; -}; - - -static UConverter * -_HZ_SafeClone(const UConverter *cnv, - void *stackBuffer, - int32_t *pBufferSize, - UErrorCode *status) -{ - struct cloneHZStruct * localClone; - int32_t size, bufferSizeNeeded = sizeof(struct cloneHZStruct); - - if (U_FAILURE(*status)){ - return 0; - } - - if (*pBufferSize == 0){ /* 'preflighting' request - set needed size into *pBufferSize */ - *pBufferSize = bufferSizeNeeded; - return 0; - } - - localClone = (struct cloneHZStruct *)stackBuffer; - /* ucnv.c/ucnv_safeClone() copied the main UConverter already */ - - uprv_memcpy(&localClone->mydata, cnv->extraInfo, sizeof(UConverterDataHZ)); - localClone->cnv.extraInfo = &localClone->mydata; - localClone->cnv.isExtraLocal = TRUE; - - /* deep-clone the sub-converter */ - size = (int32_t)(sizeof(UConverter) + sizeof(UAlignedMemory)); /* include size of padding */ - ((UConverterDataHZ*)localClone->cnv.extraInfo)->gbConverter = - ucnv_safeClone(((UConverterDataHZ*)cnv->extraInfo)->gbConverter, &localClone->subCnv, &size, status); - - return &localClone->cnv; -} - -static void -_HZ_GetUnicodeSet(const UConverter *cnv, - const USetAdder *sa, - UConverterUnicodeSet which, - UErrorCode *pErrorCode) { - /* HZ converts all of ASCII */ - sa->addRange(sa->set, 0, 0x7f); - - /* add all of the code points that the sub-converter handles */ - ucnv_MBCSGetFilteredUnicodeSetForUnicode( - ((UConverterDataHZ*)cnv->extraInfo)->gbConverter->sharedData, - sa, which, UCNV_SET_FILTER_HZ, - pErrorCode); -} - -static const UConverterImpl _HZImpl={ - - UCNV_HZ, - - NULL, - NULL, - - _HZOpen, - _HZClose, - _HZReset, - - UConverter_toUnicode_HZ_OFFSETS_LOGIC, - UConverter_toUnicode_HZ_OFFSETS_LOGIC, - UConverter_fromUnicode_HZ_OFFSETS_LOGIC, - UConverter_fromUnicode_HZ_OFFSETS_LOGIC, - NULL, - - NULL, - NULL, - _HZ_WriteSub, - _HZ_SafeClone, - _HZ_GetUnicodeSet -}; - -static const UConverterStaticData _HZStaticData={ - sizeof(UConverterStaticData), - "HZ", - 0, - UCNV_IBM, - UCNV_HZ, - 1, - 4, - { 0x1a, 0, 0, 0 }, - 1, - FALSE, - FALSE, - 0, - 0, - { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 }, /* reserved */ - -}; - -const UConverterSharedData _HZData= - UCNV_IMMUTABLE_SHARED_DATA_INITIALIZER(&_HZStaticData, &_HZImpl); - -#endif /* #if !UCONFIG_NO_CONVERSION && !UCONFIG_NO_LEGACY_CONVERSION && !UCONFIG_ONLY_HTML_CONVERSION */ diff --git a/Build/source/libs/icu/icu-src/source/common/ucnvhz.cpp b/Build/source/libs/icu/icu-src/source/common/ucnvhz.cpp new file mode 100644 index 00000000000..79a83d759f1 --- /dev/null +++ b/Build/source/libs/icu/icu-src/source/common/ucnvhz.cpp @@ -0,0 +1,633 @@ +// © 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html +/* +********************************************************************** +* Copyright (C) 2000-2015, International Business Machines +* Corporation and others. All Rights Reserved. +********************************************************************** +* file name: ucnvhz.c +* encoding: UTF-8 +* tab size: 8 (not used) +* indentation:4 +* +* created on: 2000oct16 +* created by: Ram Viswanadha +* 10/31/2000 Ram Implemented offsets logic function +* +*/ + +#include "unicode/utypes.h" + +#if !UCONFIG_NO_CONVERSION && !UCONFIG_NO_LEGACY_CONVERSION && !UCONFIG_ONLY_HTML_CONVERSION + +#include "cmemory.h" +#include "unicode/ucnv.h" +#include "unicode/ucnv_cb.h" +#include "unicode/uset.h" +#include "unicode/utf16.h" +#include "ucnv_bld.h" +#include "ucnv_cnv.h" +#include "ucnv_imp.h" + +#define UCNV_TILDE 0x7E /* ~ */ +#define UCNV_OPEN_BRACE 0x7B /* { */ +#define UCNV_CLOSE_BRACE 0x7D /* } */ +#define SB_ESCAPE "\x7E\x7D" +#define DB_ESCAPE "\x7E\x7B" +#define TILDE_ESCAPE "\x7E\x7E" +#define ESC_LEN 2 + + +#define CONCAT_ESCAPE_MACRO( args, targetIndex,targetLength,strToAppend, err, len,sourceIndex){ \ + while(len-->0){ \ + if(targetIndex < targetLength){ \ + args->target[targetIndex] = (unsigned char) *strToAppend; \ + if(args->offsets!=NULL){ \ + *(offsets++) = sourceIndex-1; \ + } \ + targetIndex++; \ + } \ + else{ \ + args->converter->charErrorBuffer[(int)args->converter->charErrorBufferLength++] = (unsigned char) *strToAppend; \ + *err =U_BUFFER_OVERFLOW_ERROR; \ + } \ + strToAppend++; \ + } \ +} + + +typedef struct{ + UConverter* gbConverter; + int32_t targetIndex; + int32_t sourceIndex; + UBool isEscapeAppended; + UBool isStateDBCS; + UBool isTargetUCharDBCS; + UBool isEmptySegment; +}UConverterDataHZ; + + +U_CDECL_BEGIN +static void U_CALLCONV +_HZOpen(UConverter *cnv, UConverterLoadArgs *pArgs, UErrorCode *errorCode){ + UConverter *gbConverter; + if(pArgs->onlyTestIsLoadable) { + ucnv_canCreateConverter("GBK", errorCode); /* errorCode carries result */ + return; + } + gbConverter = ucnv_open("GBK", errorCode); + if(U_FAILURE(*errorCode)) { + return; + } + cnv->toUnicodeStatus = 0; + cnv->fromUnicodeStatus= 0; + cnv->mode=0; + cnv->fromUChar32=0x0000; + cnv->extraInfo = uprv_calloc(1, sizeof(UConverterDataHZ)); + if(cnv->extraInfo != NULL){ + ((UConverterDataHZ*)cnv->extraInfo)->gbConverter = gbConverter; + } + else { + ucnv_close(gbConverter); + *errorCode = U_MEMORY_ALLOCATION_ERROR; + return; + } +} + +static void U_CALLCONV +_HZClose(UConverter *cnv){ + if(cnv->extraInfo != NULL) { + ucnv_close (((UConverterDataHZ *) (cnv->extraInfo))->gbConverter); + if(!cnv->isExtraLocal) { + uprv_free(cnv->extraInfo); + } + cnv->extraInfo = NULL; + } +} + +static void U_CALLCONV +_HZReset(UConverter *cnv, UConverterResetChoice choice){ + if(choice<=UCNV_RESET_TO_UNICODE) { + cnv->toUnicodeStatus = 0; + cnv->mode=0; + if(cnv->extraInfo != NULL){ + ((UConverterDataHZ*)cnv->extraInfo)->isStateDBCS = FALSE; + ((UConverterDataHZ*)cnv->extraInfo)->isEmptySegment = FALSE; + } + } + if(choice!=UCNV_RESET_TO_UNICODE) { + cnv->fromUnicodeStatus= 0; + cnv->fromUChar32=0x0000; + if(cnv->extraInfo != NULL){ + ((UConverterDataHZ*)cnv->extraInfo)->isEscapeAppended = FALSE; + ((UConverterDataHZ*)cnv->extraInfo)->targetIndex = 0; + ((UConverterDataHZ*)cnv->extraInfo)->sourceIndex = 0; + ((UConverterDataHZ*)cnv->extraInfo)->isTargetUCharDBCS = FALSE; + } + } +} + +/**************************************HZ Encoding************************************************* +* Rules for HZ encoding +* +* In ASCII mode, a byte is interpreted as an ASCII character, unless a +* '~' is encountered. The character '~' is an escape character. By +* convention, it must be immediately followed ONLY by '~', '{' or '\n' +* (), with the following special meaning. + +* 1. The escape sequence '~~' is interpreted as a '~'. +* 2. The escape-to-GB sequence '~{' switches the mode from ASCII to GB. +* 3. The escape sequence '~\n' is a line-continuation marker to be +* consumed with no output produced. +* In GB mode, characters are interpreted two bytes at a time as (pure) +* GB codes until the escape-from-GB code '~}' is read. This code +* switches the mode from GB back to ASCII. (Note that the escape- +* from-GB code '~}' ($7E7D) is outside the defined GB range.) +* +* Source: RFC 1842 +* +* Note that the formal syntax in RFC 1842 is invalid. I assume that the +* intended definition of single-byte-segment is as follows (pedberg): +* single-byte-segment = single-byte-seq 1*single-byte-char +*/ + + +static void U_CALLCONV +UConverter_toUnicode_HZ_OFFSETS_LOGIC(UConverterToUnicodeArgs *args, + UErrorCode* err){ + char tempBuf[2]; + const char *mySource = ( char *) args->source; + UChar *myTarget = args->target; + const char *mySourceLimit = args->sourceLimit; + UChar32 targetUniChar = 0x0000; + int32_t mySourceChar = 0x0000; + UConverterDataHZ* myData=(UConverterDataHZ*)(args->converter->extraInfo); + tempBuf[0]=0; + tempBuf[1]=0; + + /* Calling code already handles this situation. */ + /*if ((args->converter == NULL) || (args->targetLimit < args->target) || (mySourceLimit < args->source)){ + *err = U_ILLEGAL_ARGUMENT_ERROR; + return; + }*/ + + while(mySource< mySourceLimit){ + + if(myTarget < args->targetLimit){ + + mySourceChar= (unsigned char) *mySource++; + + if(args->converter->mode == UCNV_TILDE) { + /* second byte after ~ */ + args->converter->mode=0; + switch(mySourceChar) { + case 0x0A: + /* no output for ~\n (line-continuation marker) */ + continue; + case UCNV_TILDE: + if(args->offsets) { + args->offsets[myTarget - args->target]=(int32_t)(mySource - args->source - 2); + } + *(myTarget++)=(UChar)mySourceChar; + myData->isEmptySegment = FALSE; + continue; + case UCNV_OPEN_BRACE: + case UCNV_CLOSE_BRACE: + myData->isStateDBCS = (mySourceChar == UCNV_OPEN_BRACE); + if (myData->isEmptySegment) { + myData->isEmptySegment = FALSE; /* we are handling it, reset to avoid future spurious errors */ + *err = U_ILLEGAL_ESCAPE_SEQUENCE; + args->converter->toUCallbackReason = UCNV_IRREGULAR; + args->converter->toUBytes[0] = UCNV_TILDE; + args->converter->toUBytes[1] = mySourceChar; + args->converter->toULength = 2; + args->target = myTarget; + args->source = mySource; + return; + } + myData->isEmptySegment = TRUE; + continue; + default: + /* if the first byte is equal to TILDE and the trail byte + * is not a valid byte then it is an error condition + */ + /* + * Ticket 5691: consistent illegal sequences: + * - We include at least the first byte in the illegal sequence. + * - If any of the non-initial bytes could be the start of a character, + * we stop the illegal sequence before the first one of those. + */ + myData->isEmptySegment = FALSE; /* different error here, reset this to avoid spurious future error */ + *err = U_ILLEGAL_ESCAPE_SEQUENCE; + args->converter->toUBytes[0] = UCNV_TILDE; + if( myData->isStateDBCS ? + (0x21 <= mySourceChar && mySourceChar <= 0x7e) : + mySourceChar <= 0x7f + ) { + /* The current byte could be the start of a character: Back it out. */ + args->converter->toULength = 1; + --mySource; + } else { + /* Include the current byte in the illegal sequence. */ + args->converter->toUBytes[1] = mySourceChar; + args->converter->toULength = 2; + } + args->target = myTarget; + args->source = mySource; + return; + } + } else if(myData->isStateDBCS) { + if(args->converter->toUnicodeStatus == 0x00){ + /* lead byte */ + if(mySourceChar == UCNV_TILDE) { + args->converter->mode = UCNV_TILDE; + } else { + /* add another bit to distinguish a 0 byte from not having seen a lead byte */ + args->converter->toUnicodeStatus = (uint32_t) (mySourceChar | 0x100); + myData->isEmptySegment = FALSE; /* the segment has something, either valid or will produce a different error, so reset this */ + } + continue; + } + else{ + /* trail byte */ + int leadIsOk, trailIsOk; + uint32_t leadByte = args->converter->toUnicodeStatus & 0xff; + targetUniChar = 0xffff; + /* + * Ticket 5691: consistent illegal sequences: + * - We include at least the first byte in the illegal sequence. + * - If any of the non-initial bytes could be the start of a character, + * we stop the illegal sequence before the first one of those. + * + * In HZ DBCS, if the second byte is in the 21..7e range, + * we report only the first byte as the illegal sequence. + * Otherwise we convert or report the pair of bytes. + */ + leadIsOk = (uint8_t)(leadByte - 0x21) <= (0x7d - 0x21); + trailIsOk = (uint8_t)(mySourceChar - 0x21) <= (0x7e - 0x21); + if (leadIsOk && trailIsOk) { + tempBuf[0] = (char) (leadByte+0x80) ; + tempBuf[1] = (char) (mySourceChar+0x80); + targetUniChar = ucnv_MBCSSimpleGetNextUChar(myData->gbConverter->sharedData, + tempBuf, 2, args->converter->useFallback); + mySourceChar= (leadByte << 8) | mySourceChar; + } else if (trailIsOk) { + /* report a single illegal byte and continue with the following DBCS starter byte */ + --mySource; + mySourceChar = (int32_t)leadByte; + } else { + /* report a pair of illegal bytes if the second byte is not a DBCS starter */ + /* add another bit so that the code below writes 2 bytes in case of error */ + mySourceChar= 0x10000 | (leadByte << 8) | mySourceChar; + } + args->converter->toUnicodeStatus =0x00; + } + } + else{ + if(mySourceChar == UCNV_TILDE) { + args->converter->mode = UCNV_TILDE; + continue; + } else if(mySourceChar <= 0x7f) { + targetUniChar = (UChar)mySourceChar; /* ASCII */ + myData->isEmptySegment = FALSE; /* the segment has something valid */ + } else { + targetUniChar = 0xffff; + myData->isEmptySegment = FALSE; /* different error here, reset this to avoid spurious future error */ + } + } + if(targetUniChar < 0xfffe){ + if(args->offsets) { + args->offsets[myTarget - args->target]=(int32_t)(mySource - args->source - 1-(myData->isStateDBCS)); + } + + *(myTarget++)=(UChar)targetUniChar; + } + else /* targetUniChar>=0xfffe */ { + if(targetUniChar == 0xfffe){ + *err = U_INVALID_CHAR_FOUND; + } + else{ + *err = U_ILLEGAL_CHAR_FOUND; + } + if(mySourceChar > 0xff){ + args->converter->toUBytes[0] = (uint8_t)(mySourceChar >> 8); + args->converter->toUBytes[1] = (uint8_t)mySourceChar; + args->converter->toULength=2; + } + else{ + args->converter->toUBytes[0] = (uint8_t)mySourceChar; + args->converter->toULength=1; + } + break; + } + } + else{ + *err =U_BUFFER_OVERFLOW_ERROR; + break; + } + } + + args->target = myTarget; + args->source = mySource; +} + + +static void U_CALLCONV +UConverter_fromUnicode_HZ_OFFSETS_LOGIC (UConverterFromUnicodeArgs * args, + UErrorCode * err){ + const UChar *mySource = args->source; + char *myTarget = args->target; + int32_t* offsets = args->offsets; + int32_t mySourceIndex = 0; + int32_t myTargetIndex = 0; + int32_t targetLength = (int32_t)(args->targetLimit - myTarget); + int32_t mySourceLength = (int32_t)(args->sourceLimit - args->source); + uint32_t targetUniChar = 0x0000; + UChar32 mySourceChar = 0x0000; + UConverterDataHZ *myConverterData=(UConverterDataHZ*)args->converter->extraInfo; + UBool isTargetUCharDBCS = (UBool) myConverterData->isTargetUCharDBCS; + UBool oldIsTargetUCharDBCS; + int len =0; + const char* escSeq=NULL; + + /* Calling code already handles this situation. */ + /*if ((args->converter == NULL) || (args->targetLimit < myTarget) || (args->sourceLimit < args->source)){ + *err = U_ILLEGAL_ARGUMENT_ERROR; + return; + }*/ + if(args->converter->fromUChar32!=0 && myTargetIndex < targetLength) { + goto getTrail; + } + /*writing the char to the output stream */ + while (mySourceIndex < mySourceLength){ + targetUniChar = missingCharMarker; + if (myTargetIndex < targetLength){ + + mySourceChar = (UChar) mySource[mySourceIndex++]; + + + oldIsTargetUCharDBCS = isTargetUCharDBCS; + if(mySourceChar ==UCNV_TILDE){ + /*concatEscape(args, &myTargetIndex, &targetLength,"\x7E\x7E",err,2,&mySourceIndex);*/ + len = ESC_LEN; + escSeq = TILDE_ESCAPE; + CONCAT_ESCAPE_MACRO(args, myTargetIndex, targetLength, escSeq,err,len,mySourceIndex); + continue; + } else if(mySourceChar <= 0x7f) { + targetUniChar = mySourceChar; + } else { + int32_t length= ucnv_MBCSFromUChar32(myConverterData->gbConverter->sharedData, + mySourceChar,&targetUniChar,args->converter->useFallback); + /* we can only use lead bytes 21..7D and trail bytes 21..7E */ + if( length == 2 && + (uint16_t)(targetUniChar - 0xa1a1) <= (0xfdfe - 0xa1a1) && + (uint8_t)(targetUniChar - 0xa1) <= (0xfe - 0xa1) + ) { + targetUniChar -= 0x8080; + } else { + targetUniChar = missingCharMarker; + } + } + if (targetUniChar != missingCharMarker){ + myConverterData->isTargetUCharDBCS = isTargetUCharDBCS = (UBool)(targetUniChar>0x00FF); + if(oldIsTargetUCharDBCS != isTargetUCharDBCS || !myConverterData->isEscapeAppended ){ + /*Shifting from a double byte to single byte mode*/ + if(!isTargetUCharDBCS){ + len =ESC_LEN; + escSeq = SB_ESCAPE; + CONCAT_ESCAPE_MACRO(args, myTargetIndex, targetLength, escSeq,err,len,mySourceIndex); + myConverterData->isEscapeAppended = TRUE; + } + else{ /* Shifting from a single byte to double byte mode*/ + len =ESC_LEN; + escSeq = DB_ESCAPE; + CONCAT_ESCAPE_MACRO(args, myTargetIndex, targetLength, escSeq,err,len,mySourceIndex); + myConverterData->isEscapeAppended = TRUE; + + } + } + + if(isTargetUCharDBCS){ + if( myTargetIndex > 8); + if(offsets){ + *(offsets++) = mySourceIndex-1; + } + if(myTargetIndex < targetLength){ + myTarget[myTargetIndex++] =(char) targetUniChar; + if(offsets){ + *(offsets++) = mySourceIndex-1; + } + }else{ + args->converter->charErrorBuffer[args->converter->charErrorBufferLength++] = (char) targetUniChar; + *err = U_BUFFER_OVERFLOW_ERROR; + } + }else{ + args->converter->charErrorBuffer[args->converter->charErrorBufferLength++] =(char) (targetUniChar >> 8); + args->converter->charErrorBuffer[args->converter->charErrorBufferLength++] = (char) targetUniChar; + *err = U_BUFFER_OVERFLOW_ERROR; + } + + }else{ + if( myTargetIndex converter->charErrorBuffer[args->converter->charErrorBufferLength++] = (char) targetUniChar; + *err = U_BUFFER_OVERFLOW_ERROR; + } + } + + } + else{ + /* oops.. the code point is unassigned */ + /*Handle surrogates */ + /*check if the char is a First surrogate*/ + if(U16_IS_SURROGATE(mySourceChar)) { + if(U16_IS_SURROGATE_LEAD(mySourceChar)) { + args->converter->fromUChar32=mySourceChar; +getTrail: + /*look ahead to find the trail surrogate*/ + if(mySourceIndex < mySourceLength) { + /* test the following code unit */ + UChar trail=(UChar) args->source[mySourceIndex]; + if(U16_IS_TRAIL(trail)) { + ++mySourceIndex; + mySourceChar=U16_GET_SUPPLEMENTARY(args->converter->fromUChar32, trail); + args->converter->fromUChar32=0x00; + /* there are no surrogates in GB2312*/ + *err = U_INVALID_CHAR_FOUND; + /* exit this condition tree */ + } else { + /* this is an unmatched lead code unit (1st surrogate) */ + /* callback(illegal) */ + *err=U_ILLEGAL_CHAR_FOUND; + } + } else { + /* no more input */ + *err = U_ZERO_ERROR; + } + } else { + /* this is an unmatched trail code unit (2nd surrogate) */ + /* callback(illegal) */ + *err=U_ILLEGAL_CHAR_FOUND; + } + } else { + /* callback(unassigned) for a BMP code point */ + *err = U_INVALID_CHAR_FOUND; + } + + args->converter->fromUChar32=mySourceChar; + break; + } + } + else{ + *err = U_BUFFER_OVERFLOW_ERROR; + break; + } + targetUniChar=missingCharMarker; + } + + args->target += myTargetIndex; + args->source += mySourceIndex; + myConverterData->isTargetUCharDBCS = isTargetUCharDBCS; +} + +static void U_CALLCONV +_HZ_WriteSub(UConverterFromUnicodeArgs *args, int32_t offsetIndex, UErrorCode *err) { + UConverter *cnv = args->converter; + UConverterDataHZ *convData=(UConverterDataHZ *) cnv->extraInfo; + char *p; + char buffer[4]; + p = buffer; + + if( convData->isTargetUCharDBCS){ + *p++= UCNV_TILDE; + *p++= UCNV_CLOSE_BRACE; + convData->isTargetUCharDBCS=FALSE; + } + *p++= (char)cnv->subChars[0]; + + ucnv_cbFromUWriteBytes(args, + buffer, (int32_t)(p - buffer), + offsetIndex, err); +} + +/* + * Structure for cloning an HZ converter into a single memory block. + * ucnv_safeClone() of the HZ converter will align the entire cloneHZStruct, + * and then ucnv_safeClone() of the sub-converter may additionally align + * subCnv inside the cloneHZStruct, for which we need the deadSpace after + * subCnv. This is because UAlignedMemory may be larger than the actually + * necessary alignment size for the platform. + * The other cloneHZStruct fields will not be moved around, + * and are aligned properly with cloneHZStruct's alignment. + */ +struct cloneHZStruct +{ + UConverter cnv; + UConverter subCnv; + UAlignedMemory deadSpace; + UConverterDataHZ mydata; +}; + + +static UConverter * U_CALLCONV +_HZ_SafeClone(const UConverter *cnv, + void *stackBuffer, + int32_t *pBufferSize, + UErrorCode *status) +{ + struct cloneHZStruct * localClone; + int32_t size, bufferSizeNeeded = sizeof(struct cloneHZStruct); + + if (U_FAILURE(*status)){ + return 0; + } + + if (*pBufferSize == 0){ /* 'preflighting' request - set needed size into *pBufferSize */ + *pBufferSize = bufferSizeNeeded; + return 0; + } + + localClone = (struct cloneHZStruct *)stackBuffer; + /* ucnv.c/ucnv_safeClone() copied the main UConverter already */ + + uprv_memcpy(&localClone->mydata, cnv->extraInfo, sizeof(UConverterDataHZ)); + localClone->cnv.extraInfo = &localClone->mydata; + localClone->cnv.isExtraLocal = TRUE; + + /* deep-clone the sub-converter */ + size = (int32_t)(sizeof(UConverter) + sizeof(UAlignedMemory)); /* include size of padding */ + ((UConverterDataHZ*)localClone->cnv.extraInfo)->gbConverter = + ucnv_safeClone(((UConverterDataHZ*)cnv->extraInfo)->gbConverter, &localClone->subCnv, &size, status); + + return &localClone->cnv; +} + +static void U_CALLCONV +_HZ_GetUnicodeSet(const UConverter *cnv, + const USetAdder *sa, + UConverterUnicodeSet which, + UErrorCode *pErrorCode) { + /* HZ converts all of ASCII */ + sa->addRange(sa->set, 0, 0x7f); + + /* add all of the code points that the sub-converter handles */ + ucnv_MBCSGetFilteredUnicodeSetForUnicode( + ((UConverterDataHZ*)cnv->extraInfo)->gbConverter->sharedData, + sa, which, UCNV_SET_FILTER_HZ, + pErrorCode); +} +U_CDECL_END +static const UConverterImpl _HZImpl={ + + UCNV_HZ, + + NULL, + NULL, + + _HZOpen, + _HZClose, + _HZReset, + + UConverter_toUnicode_HZ_OFFSETS_LOGIC, + UConverter_toUnicode_HZ_OFFSETS_LOGIC, + UConverter_fromUnicode_HZ_OFFSETS_LOGIC, + UConverter_fromUnicode_HZ_OFFSETS_LOGIC, + NULL, + + NULL, + NULL, + _HZ_WriteSub, + _HZ_SafeClone, + _HZ_GetUnicodeSet, + NULL, + NULL +}; + +static const UConverterStaticData _HZStaticData={ + sizeof(UConverterStaticData), + "HZ", + 0, + UCNV_IBM, + UCNV_HZ, + 1, + 4, + { 0x1a, 0, 0, 0 }, + 1, + FALSE, + FALSE, + 0, + 0, + { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 }, /* reserved */ + +}; + +const UConverterSharedData _HZData= + UCNV_IMMUTABLE_SHARED_DATA_INITIALIZER(&_HZStaticData, &_HZImpl); + +#endif /* #if !UCONFIG_NO_CONVERSION && !UCONFIG_NO_LEGACY_CONVERSION && !UCONFIG_ONLY_HTML_CONVERSION */ diff --git a/Build/source/libs/icu/icu-src/source/common/ucnvisci.c b/Build/source/libs/icu/icu-src/source/common/ucnvisci.c deleted file mode 100644 index b520fc244e3..00000000000 --- a/Build/source/libs/icu/icu-src/source/common/ucnvisci.c +++ /dev/null @@ -1,1625 +0,0 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. -// License & terms of use: http://www.unicode.org/copyright.html -/* -********************************************************************** -* Copyright (C) 2000-2016, International Business Machines -* Corporation and others. All Rights Reserved. -********************************************************************** -* file name: ucnvisci.c -* encoding: US-ASCII -* tab size: 8 (not used) -* indentation:4 -* -* created on: 2001JUN26 -* created by: Ram Viswanadha -* -* Date Name Description -* 24/7/2001 Ram Added support for EXT character handling -*/ - -#include "unicode/utypes.h" - -#if !UCONFIG_NO_CONVERSION && !UCONFIG_NO_LEGACY_CONVERSION && !UCONFIG_ONLY_HTML_CONVERSION - -#include "unicode/ucnv.h" -#include "unicode/ucnv_cb.h" -#include "unicode/utf16.h" -#include "cmemory.h" -#include "ucnv_bld.h" -#include "ucnv_cnv.h" -#include "cstring.h" -#include "uassert.h" - -#define UCNV_OPTIONS_VERSION_MASK 0xf -#define NUKTA 0x093c -#define HALANT 0x094d -#define ZWNJ 0x200c /* Zero Width Non Joiner */ -#define ZWJ 0x200d /* Zero width Joiner */ -#define INVALID_CHAR 0xffff -#define ATR 0xEF /* Attribute code */ -#define EXT 0xF0 /* Extension code */ -#define DANDA 0x0964 -#define DOUBLE_DANDA 0x0965 -#define ISCII_NUKTA 0xE9 -#define ISCII_HALANT 0xE8 -#define ISCII_DANDA 0xEA -#define ISCII_INV 0xD9 -#define ISCII_VOWEL_SIGN_E 0xE0 -#define INDIC_BLOCK_BEGIN 0x0900 -#define INDIC_BLOCK_END 0x0D7F -#define INDIC_RANGE (INDIC_BLOCK_END - INDIC_BLOCK_BEGIN) -#define VOCALLIC_RR 0x0931 -#define LF 0x0A -#define ASCII_END 0xA0 -#define NO_CHAR_MARKER 0xFFFE -#define TELUGU_DELTA DELTA * TELUGU -#define DEV_ABBR_SIGN 0x0970 -#define DEV_ANUDATTA 0x0952 -#define EXT_RANGE_BEGIN 0xA1 -#define EXT_RANGE_END 0xEE - -#define PNJ_DELTA 0x0100 -#define PNJ_BINDI 0x0A02 -#define PNJ_TIPPI 0x0A70 -#define PNJ_SIGN_VIRAMA 0x0A4D -#define PNJ_ADHAK 0x0A71 -#define PNJ_HA 0x0A39 -#define PNJ_RRA 0x0A5C - -typedef enum { - DEVANAGARI =0, - BENGALI, - GURMUKHI, - GUJARATI, - ORIYA, - TAMIL, - TELUGU, - KANNADA, - MALAYALAM, - DELTA=0x80 -}UniLang; - -/** - * Enumeration for switching code pages if + - * is encountered - */ -typedef enum { - DEF = 0x40, - RMN = 0x41, - DEV = 0x42, - BNG = 0x43, - TML = 0x44, - TLG = 0x45, - ASM = 0x46, - ORI = 0x47, - KND = 0x48, - MLM = 0x49, - GJR = 0x4A, - PNJ = 0x4B, - ARB = 0x71, - PES = 0x72, - URD = 0x73, - SND = 0x74, - KSM = 0x75, - PST = 0x76 -}ISCIILang; - -typedef enum { - DEV_MASK =0x80, - PNJ_MASK =0x40, - GJR_MASK =0x20, - ORI_MASK =0x10, - BNG_MASK =0x08, - KND_MASK =0x04, - MLM_MASK =0x02, - TML_MASK =0x01, - ZERO =0x00 -}MaskEnum; - -#define ISCII_CNV_PREFIX "ISCII,version=" - -typedef struct { - UChar contextCharToUnicode; /* previous Unicode codepoint for contextual analysis */ - UChar contextCharFromUnicode; /* previous Unicode codepoint for contextual analysis */ - uint16_t defDeltaToUnicode; /* delta for switching to default state when DEF is encountered */ - uint16_t currentDeltaFromUnicode; /* current delta in Indic block */ - uint16_t currentDeltaToUnicode; /* current delta in Indic block */ - MaskEnum currentMaskFromUnicode; /* mask for current state in toUnicode */ - MaskEnum currentMaskToUnicode; /* mask for current state in toUnicode */ - MaskEnum defMaskToUnicode; /* mask for default state in toUnicode */ - UBool isFirstBuffer; /* boolean for fromUnicode to see if we need to announce the first script */ - UBool resetToDefaultToUnicode; /* boolean for reseting to default delta and mask when a newline is encountered*/ - char name[sizeof(ISCII_CNV_PREFIX) + 1]; - UChar32 prevToUnicodeStatus; /* Hold the previous toUnicodeStatus. This is necessary because we may need to know the last two code points. */ -} UConverterDataISCII; - -typedef struct LookupDataStruct { - UniLang uniLang; - MaskEnum maskEnum; - ISCIILang isciiLang; -} LookupDataStruct; - -static const LookupDataStruct lookupInitialData[]={ - { DEVANAGARI, DEV_MASK, DEV }, - { BENGALI, BNG_MASK, BNG }, - { GURMUKHI, PNJ_MASK, PNJ }, - { GUJARATI, GJR_MASK, GJR }, - { ORIYA, ORI_MASK, ORI }, - { TAMIL, TML_MASK, TML }, - { TELUGU, KND_MASK, TLG }, - { KANNADA, KND_MASK, KND }, - { MALAYALAM, MLM_MASK, MLM } -}; - -/* - * For special handling of certain Gurmukhi characters. - * Bit 0 (value 1): PNJ consonant - * Bit 1 (value 2): PNJ Bindi Tippi - */ -static const uint8_t pnjMap[80] = { - /* 0A00..0A0F */ - 0, 0, 0, 0, 0, 2, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, - /* 0A10..0A1F */ - 0, 0, 0, 0, 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, - /* 0A20..0A2F */ - 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 3, 3, 3, 3, 3, 3, - /* 0A30..0A3F */ - 3, 0, 0, 0, 0, 3, 3, 0, 3, 3, 0, 0, 0, 0, 0, 2, - /* 0A40..0A4F */ - 0, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 -}; - -static UBool -isPNJConsonant(UChar32 c) { - if (c < 0xa00 || 0xa50 <= c) { - return FALSE; - } else { - return (UBool)(pnjMap[c - 0xa00] & 1); - } -} - -static UBool -isPNJBindiTippi(UChar32 c) { - if (c < 0xa00 || 0xa50 <= c) { - return FALSE; - } else { - return (UBool)(pnjMap[c - 0xa00] >> 1); - } -} - -static void _ISCIIOpen(UConverter *cnv, UConverterLoadArgs *pArgs, UErrorCode *errorCode) { - if(pArgs->onlyTestIsLoadable) { - return; - } - - cnv->extraInfo = uprv_malloc(sizeof(UConverterDataISCII)); - - if (cnv->extraInfo != NULL) { - int32_t len=0; - UConverterDataISCII *converterData= - (UConverterDataISCII *) cnv->extraInfo; - converterData->contextCharToUnicode=NO_CHAR_MARKER; - cnv->toUnicodeStatus = missingCharMarker; - converterData->contextCharFromUnicode=0x0000; - converterData->resetToDefaultToUnicode=FALSE; - /* check if the version requested is supported */ - if ((pArgs->options & UCNV_OPTIONS_VERSION_MASK) < 9) { - /* initialize state variables */ - converterData->currentDeltaFromUnicode - = converterData->currentDeltaToUnicode - = converterData->defDeltaToUnicode = (uint16_t)(lookupInitialData[pArgs->options & UCNV_OPTIONS_VERSION_MASK].uniLang * DELTA); - - converterData->currentMaskFromUnicode - = converterData->currentMaskToUnicode - = converterData->defMaskToUnicode = lookupInitialData[pArgs->options & UCNV_OPTIONS_VERSION_MASK].maskEnum; - - converterData->isFirstBuffer=TRUE; - (void)uprv_strcpy(converterData->name, ISCII_CNV_PREFIX); - len = (int32_t)uprv_strlen(converterData->name); - converterData->name[len]= (char)((pArgs->options & UCNV_OPTIONS_VERSION_MASK) + '0'); - converterData->name[len+1]=0; - - converterData->prevToUnicodeStatus = 0x0000; - } else { - uprv_free(cnv->extraInfo); - cnv->extraInfo = NULL; - *errorCode = U_ILLEGAL_ARGUMENT_ERROR; - } - - } else { - *errorCode =U_MEMORY_ALLOCATION_ERROR; - } -} - -static void _ISCIIClose(UConverter *cnv) { - if (cnv->extraInfo!=NULL) { - if (!cnv->isExtraLocal) { - uprv_free(cnv->extraInfo); - } - cnv->extraInfo=NULL; - } -} - -static const char* _ISCIIgetName(const UConverter* cnv) { - if (cnv->extraInfo) { - UConverterDataISCII* myData= (UConverterDataISCII*)cnv->extraInfo; - return myData->name; - } - return NULL; -} - -static void _ISCIIReset(UConverter *cnv, UConverterResetChoice choice) { - UConverterDataISCII* data =(UConverterDataISCII *) (cnv->extraInfo); - if (choice<=UCNV_RESET_TO_UNICODE) { - cnv->toUnicodeStatus = missingCharMarker; - cnv->mode=0; - data->currentDeltaToUnicode=data->defDeltaToUnicode; - data->currentMaskToUnicode = data->defMaskToUnicode; - data->contextCharToUnicode=NO_CHAR_MARKER; - data->prevToUnicodeStatus = 0x0000; - } - if (choice!=UCNV_RESET_TO_UNICODE) { - cnv->fromUChar32=0x0000; - data->contextCharFromUnicode=0x00; - data->currentMaskFromUnicode=data->defMaskToUnicode; - data->currentDeltaFromUnicode=data->defDeltaToUnicode; - data->isFirstBuffer=TRUE; - data->resetToDefaultToUnicode=FALSE; - } -} - -/** - * The values in validity table are indexed by the lower bits of Unicode - * range 0x0900 - 0x09ff. The values have a structure like: - * --------------------------------------------------------------- - * | DEV | PNJ | GJR | ORI | BNG | TLG | MLM | TML | - * | | | | | ASM | KND | | | - * --------------------------------------------------------------- - * If a code point is valid in a particular script - * then that bit is turned on - * - * Unicode does not distinguish between Bengali and Assamese so we use 1 bit for - * to represent these languages - * - * Telugu and Kannada have same codepoints except for Vocallic_RR which we special case - * and combine and use 1 bit to represent these languages. - * - * TODO: It is probably easier to understand and maintain to change this - * to use uint16_t and give each of the 9 Unicode/script blocks its own bit. - */ - -static const uint8_t validityTable[128] = { -/* This state table is tool generated please do not edit unless you know exactly what you are doing */ -/* Note: This table was edited to mirror the Windows XP implementation */ -/*ISCII:Valid:Unicode */ -/*0xa0 : 0x00: 0x900 */ ZERO + ZERO + ZERO + ZERO + ZERO + ZERO + ZERO + ZERO , -/*0xa1 : 0xb8: 0x901 */ DEV_MASK + PNJ_MASK + GJR_MASK + ORI_MASK + BNG_MASK + ZERO + ZERO + ZERO , -/*0xa2 : 0xfe: 0x902 */ DEV_MASK + PNJ_MASK + GJR_MASK + ORI_MASK + BNG_MASK + KND_MASK + MLM_MASK + TML_MASK , -/*0xa3 : 0xbf: 0x903 */ DEV_MASK + PNJ_MASK + GJR_MASK + ORI_MASK + BNG_MASK + KND_MASK + MLM_MASK + TML_MASK , -/*0x00 : 0x00: 0x904 */ DEV_MASK + ZERO + ZERO + ZERO + ZERO + ZERO + ZERO + ZERO , -/*0xa4 : 0xff: 0x905 */ DEV_MASK + PNJ_MASK + GJR_MASK + ORI_MASK + BNG_MASK + KND_MASK + MLM_MASK + TML_MASK , -/*0xa5 : 0xff: 0x906 */ DEV_MASK + PNJ_MASK + GJR_MASK + ORI_MASK + BNG_MASK + KND_MASK + MLM_MASK + TML_MASK , -/*0xa6 : 0xff: 0x907 */ DEV_MASK + PNJ_MASK + GJR_MASK + ORI_MASK + BNG_MASK + KND_MASK + MLM_MASK + TML_MASK , -/*0xa7 : 0xff: 0x908 */ DEV_MASK + PNJ_MASK + GJR_MASK + ORI_MASK + BNG_MASK + KND_MASK + MLM_MASK + TML_MASK , -/*0xa8 : 0xff: 0x909 */ DEV_MASK + PNJ_MASK + GJR_MASK + ORI_MASK + BNG_MASK + KND_MASK + MLM_MASK + TML_MASK , -/*0xa9 : 0xff: 0x90a */ DEV_MASK + PNJ_MASK + GJR_MASK + ORI_MASK + BNG_MASK + KND_MASK + MLM_MASK + TML_MASK , -/*0xaa : 0xfe: 0x90b */ DEV_MASK + ZERO + GJR_MASK + ORI_MASK + BNG_MASK + KND_MASK + MLM_MASK + ZERO , -/*0x00 : 0x00: 0x90c */ DEV_MASK + ZERO + ZERO + ORI_MASK + BNG_MASK + KND_MASK + MLM_MASK + ZERO , -/*0xae : 0x80: 0x90d */ DEV_MASK + ZERO + GJR_MASK + ZERO + ZERO + ZERO + ZERO + ZERO , -/*0xab : 0x87: 0x90e */ DEV_MASK + ZERO + ZERO + ZERO + ZERO + KND_MASK + MLM_MASK + TML_MASK , -/*0xac : 0xff: 0x90f */ DEV_MASK + PNJ_MASK + GJR_MASK + ORI_MASK + BNG_MASK + KND_MASK + MLM_MASK + TML_MASK , -/*0xad : 0xff: 0x910 */ DEV_MASK + PNJ_MASK + GJR_MASK + ORI_MASK + BNG_MASK + KND_MASK + MLM_MASK + TML_MASK , -/*0xb2 : 0x80: 0x911 */ DEV_MASK + ZERO + GJR_MASK + ZERO + ZERO + ZERO + ZERO + ZERO , -/*0xaf : 0x87: 0x912 */ DEV_MASK + ZERO + ZERO + ZERO + ZERO + KND_MASK + MLM_MASK + TML_MASK , -/*0xb0 : 0xff: 0x913 */ DEV_MASK + PNJ_MASK + GJR_MASK + ORI_MASK + BNG_MASK + KND_MASK + MLM_MASK + TML_MASK , -/*0xb1 : 0xff: 0x914 */ DEV_MASK + PNJ_MASK + GJR_MASK + ORI_MASK + BNG_MASK + KND_MASK + MLM_MASK + TML_MASK , -/*0xb3 : 0xff: 0x915 */ DEV_MASK + PNJ_MASK + GJR_MASK + ORI_MASK + BNG_MASK + KND_MASK + MLM_MASK + TML_MASK , -/*0xb4 : 0xfe: 0x916 */ DEV_MASK + PNJ_MASK + GJR_MASK + ORI_MASK + BNG_MASK + KND_MASK + MLM_MASK + ZERO , -/*0xb5 : 0xfe: 0x917 */ DEV_MASK + PNJ_MASK + GJR_MASK + ORI_MASK + BNG_MASK + KND_MASK + MLM_MASK + ZERO , -/*0xb6 : 0xfe: 0x918 */ DEV_MASK + PNJ_MASK + GJR_MASK + ORI_MASK + BNG_MASK + KND_MASK + MLM_MASK + ZERO , -/*0xb7 : 0xff: 0x919 */ DEV_MASK + PNJ_MASK + GJR_MASK + ORI_MASK + BNG_MASK + KND_MASK + MLM_MASK + TML_MASK , -/*0xb8 : 0xff: 0x91a */ DEV_MASK + PNJ_MASK + GJR_MASK + ORI_MASK + BNG_MASK + KND_MASK + MLM_MASK + TML_MASK , -/*0xb9 : 0xfe: 0x91b */ DEV_MASK + PNJ_MASK + GJR_MASK + ORI_MASK + BNG_MASK + KND_MASK + MLM_MASK + ZERO , -/*0xba : 0xff: 0x91c */ DEV_MASK + PNJ_MASK + GJR_MASK + ORI_MASK + BNG_MASK + KND_MASK + MLM_MASK + TML_MASK , -/*0xbb : 0xfe: 0x91d */ DEV_MASK + PNJ_MASK + GJR_MASK + ORI_MASK + BNG_MASK + KND_MASK + MLM_MASK + ZERO , -/*0xbc : 0xff: 0x91e */ DEV_MASK + PNJ_MASK + GJR_MASK + ORI_MASK + BNG_MASK + KND_MASK + MLM_MASK + TML_MASK , -/*0xbd : 0xff: 0x91f */ DEV_MASK + PNJ_MASK + GJR_MASK + ORI_MASK + BNG_MASK + KND_MASK + MLM_MASK + TML_MASK , -/*0xbe : 0xfe: 0x920 */ DEV_MASK + PNJ_MASK + GJR_MASK + ORI_MASK + BNG_MASK + KND_MASK + MLM_MASK + ZERO , -/*0xbf : 0xfe: 0x921 */ DEV_MASK + PNJ_MASK + GJR_MASK + ORI_MASK + BNG_MASK + KND_MASK + MLM_MASK + ZERO , -/*0xc0 : 0xfe: 0x922 */ DEV_MASK + PNJ_MASK + GJR_MASK + ORI_MASK + BNG_MASK + KND_MASK + MLM_MASK + ZERO , -/*0xc1 : 0xff: 0x923 */ DEV_MASK + PNJ_MASK + GJR_MASK + ORI_MASK + BNG_MASK + KND_MASK + MLM_MASK + TML_MASK , -/*0xc2 : 0xff: 0x924 */ DEV_MASK + PNJ_MASK + GJR_MASK + ORI_MASK + BNG_MASK + KND_MASK + MLM_MASK + TML_MASK , -/*0xc3 : 0xfe: 0x925 */ DEV_MASK + PNJ_MASK + GJR_MASK + ORI_MASK + BNG_MASK + KND_MASK + MLM_MASK + ZERO , -/*0xc4 : 0xfe: 0x926 */ DEV_MASK + PNJ_MASK + GJR_MASK + ORI_MASK + BNG_MASK + KND_MASK + MLM_MASK + ZERO , -/*0xc5 : 0xfe: 0x927 */ DEV_MASK + PNJ_MASK + GJR_MASK + ORI_MASK + BNG_MASK + KND_MASK + MLM_MASK + ZERO , -/*0xc6 : 0xff: 0x928 */ DEV_MASK + PNJ_MASK + GJR_MASK + ORI_MASK + BNG_MASK + KND_MASK + MLM_MASK + TML_MASK , -/*0xc7 : 0x81: 0x929 */ DEV_MASK + ZERO + ZERO + ZERO + ZERO + ZERO + ZERO + TML_MASK , -/*0xc8 : 0xff: 0x92a */ DEV_MASK + PNJ_MASK + GJR_MASK + ORI_MASK + BNG_MASK + KND_MASK + MLM_MASK + TML_MASK , -/*0xc9 : 0xfe: 0x92b */ DEV_MASK + PNJ_MASK + GJR_MASK + ORI_MASK + BNG_MASK + KND_MASK + MLM_MASK + ZERO , -/*0xca : 0xfe: 0x92c */ DEV_MASK + PNJ_MASK + GJR_MASK + ORI_MASK + BNG_MASK + KND_MASK + MLM_MASK + ZERO , -/*0xcb : 0xfe: 0x92d */ DEV_MASK + PNJ_MASK + GJR_MASK + ORI_MASK + BNG_MASK + KND_MASK + MLM_MASK + ZERO , -/*0xcc : 0xfe: 0x92e */ DEV_MASK + PNJ_MASK + GJR_MASK + ORI_MASK + BNG_MASK + KND_MASK + MLM_MASK + TML_MASK , -/*0xcd : 0xff: 0x92f */ DEV_MASK + PNJ_MASK + GJR_MASK + ORI_MASK + BNG_MASK + KND_MASK + MLM_MASK + TML_MASK , -/*0xcf : 0xff: 0x930 */ DEV_MASK + PNJ_MASK + GJR_MASK + ORI_MASK + BNG_MASK + KND_MASK + MLM_MASK + TML_MASK , -/*0xd0 : 0x87: 0x931 */ DEV_MASK + ZERO + ZERO + ZERO + ZERO + ZERO + MLM_MASK + TML_MASK , -/*0xd1 : 0xff: 0x932 */ DEV_MASK + PNJ_MASK + GJR_MASK + ORI_MASK + BNG_MASK + KND_MASK + MLM_MASK + TML_MASK , -/*0xd2 : 0xb7: 0x933 */ DEV_MASK + PNJ_MASK + GJR_MASK + ORI_MASK + ZERO + KND_MASK + MLM_MASK + TML_MASK , -/*0xd3 : 0x83: 0x934 */ DEV_MASK + ZERO + ZERO + ZERO + ZERO + ZERO + MLM_MASK + TML_MASK , -/*0xd4 : 0xff: 0x935 */ DEV_MASK + PNJ_MASK + GJR_MASK + ORI_MASK + ZERO + KND_MASK + MLM_MASK + TML_MASK , -/*0xd5 : 0xfe: 0x936 */ DEV_MASK + PNJ_MASK + GJR_MASK + ORI_MASK + BNG_MASK + KND_MASK + MLM_MASK + ZERO , -/*0xd6 : 0xbf: 0x937 */ DEV_MASK + ZERO + GJR_MASK + ORI_MASK + BNG_MASK + KND_MASK + MLM_MASK + TML_MASK , -/*0xd7 : 0xff: 0x938 */ DEV_MASK + PNJ_MASK + GJR_MASK + ORI_MASK + BNG_MASK + KND_MASK + MLM_MASK + TML_MASK , -/*0xd8 : 0xff: 0x939 */ DEV_MASK + PNJ_MASK + GJR_MASK + ORI_MASK + BNG_MASK + KND_MASK + MLM_MASK + TML_MASK , -/*0x00 : 0x00: 0x93A */ ZERO + ZERO + ZERO + ZERO + ZERO + ZERO + ZERO + ZERO , -/*0x00 : 0x00: 0x93B */ ZERO + ZERO + ZERO + ZERO + ZERO + ZERO + ZERO + ZERO , -/*0xe9 : 0xda: 0x93c */ DEV_MASK + PNJ_MASK + ZERO + ORI_MASK + BNG_MASK + ZERO + ZERO + ZERO , -/*0x00 : 0x00: 0x93d */ DEV_MASK + ZERO + ZERO + ZERO + ZERO + ZERO + ZERO + ZERO , -/*0xda : 0xff: 0x93e */ DEV_MASK + PNJ_MASK + GJR_MASK + ORI_MASK + BNG_MASK + KND_MASK + MLM_MASK + TML_MASK , -/*0xdb : 0xff: 0x93f */ DEV_MASK + PNJ_MASK + GJR_MASK + ORI_MASK + BNG_MASK + KND_MASK + MLM_MASK + TML_MASK , -/*0xdc : 0xff: 0x940 */ DEV_MASK + PNJ_MASK + GJR_MASK + ORI_MASK + BNG_MASK + KND_MASK + MLM_MASK + TML_MASK , -/*0xdd : 0xff: 0x941 */ DEV_MASK + PNJ_MASK + GJR_MASK + ORI_MASK + BNG_MASK + KND_MASK + MLM_MASK + TML_MASK , -/*0xde : 0xff: 0x942 */ DEV_MASK + PNJ_MASK + GJR_MASK + ORI_MASK + BNG_MASK + KND_MASK + MLM_MASK + TML_MASK , -/*0xdf : 0xbe: 0x943 */ DEV_MASK + ZERO + GJR_MASK + ORI_MASK + BNG_MASK + KND_MASK + MLM_MASK + ZERO , -/*0x00 : 0x00: 0x944 */ DEV_MASK + ZERO + GJR_MASK + ZERO + BNG_MASK + KND_MASK + ZERO + ZERO , -/*0xe3 : 0x80: 0x945 */ DEV_MASK + ZERO + GJR_MASK + ZERO + ZERO + ZERO + ZERO + ZERO , -/*0xe0 : 0x87: 0x946 */ DEV_MASK + ZERO + ZERO + ZERO + ZERO + KND_MASK + MLM_MASK + TML_MASK , -/*0xe1 : 0xff: 0x947 */ DEV_MASK + PNJ_MASK + GJR_MASK + ORI_MASK + BNG_MASK + KND_MASK + MLM_MASK + TML_MASK , -/*0xe2 : 0xff: 0x948 */ DEV_MASK + PNJ_MASK + GJR_MASK + ORI_MASK + BNG_MASK + KND_MASK + MLM_MASK + TML_MASK , -/*0xe7 : 0x80: 0x949 */ DEV_MASK + ZERO + GJR_MASK + ZERO + ZERO + ZERO + ZERO + ZERO , -/*0xe4 : 0x87: 0x94a */ DEV_MASK + ZERO + ZERO + ZERO + ZERO + KND_MASK + MLM_MASK + TML_MASK , -/*0xe5 : 0xff: 0x94b */ DEV_MASK + PNJ_MASK + GJR_MASK + ORI_MASK + BNG_MASK + KND_MASK + MLM_MASK + TML_MASK , -/*0xe6 : 0xff: 0x94c */ DEV_MASK + PNJ_MASK + GJR_MASK + ORI_MASK + BNG_MASK + KND_MASK + MLM_MASK + TML_MASK , -/*0xe8 : 0xff: 0x94d */ DEV_MASK + PNJ_MASK + GJR_MASK + ORI_MASK + BNG_MASK + KND_MASK + MLM_MASK + TML_MASK , -/*0xec : 0x00: 0x94e */ ZERO + ZERO + ZERO + ZERO + ZERO + ZERO + ZERO + ZERO , -/*0xed : 0x00: 0x94f */ ZERO + ZERO + ZERO + ZERO + ZERO + ZERO + ZERO + ZERO , -/*0x00 : 0x00: 0x950 */ DEV_MASK + ZERO + GJR_MASK + ZERO + ZERO + ZERO + ZERO + ZERO , -/*0x00 : 0x00: 0x951 */ DEV_MASK + ZERO + ZERO + ZERO + ZERO + ZERO + ZERO + ZERO , -/*0x00 : 0x00: 0x952 */ DEV_MASK + ZERO + ZERO + ZERO + ZERO + ZERO + ZERO + ZERO , -/*0x00 : 0x00: 0x953 */ DEV_MASK + ZERO + ZERO + ZERO + ZERO + ZERO + ZERO + ZERO , -/*0x00 : 0x00: 0x954 */ DEV_MASK + ZERO + ZERO + ZERO + ZERO + ZERO + ZERO + ZERO , -/*0x00 : 0x00: 0x955 */ ZERO + ZERO + ZERO + ZERO + ZERO + KND_MASK + ZERO + ZERO , -/*0x00 : 0x00: 0x956 */ ZERO + ZERO + ZERO + ORI_MASK + ZERO + KND_MASK + ZERO + ZERO , -/*0x00 : 0x00: 0x957 */ ZERO + ZERO + ZERO + ORI_MASK + BNG_MASK + ZERO + MLM_MASK + ZERO , -/*0x00 : 0x00: 0x958 */ DEV_MASK + ZERO + ZERO + ZERO + ZERO + ZERO + ZERO + ZERO , -/*0x00 : 0x00: 0x959 */ DEV_MASK + PNJ_MASK + ZERO + ZERO + ZERO + ZERO + ZERO + ZERO , -/*0x00 : 0x00: 0x95a */ DEV_MASK + PNJ_MASK + ZERO + ZERO + ZERO + ZERO + ZERO + ZERO , -/*0x00 : 0x00: 0x95b */ DEV_MASK + PNJ_MASK + ZERO + ZERO + ZERO + ZERO + ZERO + ZERO , -/*0x00 : 0x00: 0x95c */ DEV_MASK + PNJ_MASK + ZERO + ZERO + BNG_MASK + ZERO + ZERO + ZERO , -/*0x00 : 0x00: 0x95d */ DEV_MASK + ZERO + ZERO + ORI_MASK + BNG_MASK + ZERO + ZERO + ZERO , -/*0x00 : 0x00: 0x95e */ DEV_MASK + PNJ_MASK + ZERO + ZERO + ZERO + ZERO + ZERO + ZERO , -/*0xce : 0x98: 0x95f */ DEV_MASK + ZERO + ZERO + ORI_MASK + BNG_MASK + ZERO + ZERO + ZERO , -/*0x00 : 0x00: 0x960 */ DEV_MASK + ZERO + GJR_MASK + ORI_MASK + BNG_MASK + KND_MASK + MLM_MASK + ZERO , -/*0x00 : 0x00: 0x961 */ DEV_MASK + ZERO + ZERO + ORI_MASK + BNG_MASK + KND_MASK + MLM_MASK + ZERO , -/*0x00 : 0x00: 0x962 */ DEV_MASK + ZERO + ZERO + ZERO + BNG_MASK + ZERO + ZERO + ZERO , -/*0x00 : 0x00: 0x963 */ DEV_MASK + ZERO + ZERO + ZERO + BNG_MASK + ZERO + ZERO + ZERO , -/*0xea : 0xf8: 0x964 */ DEV_MASK + ZERO + ZERO + ZERO + ZERO + ZERO + ZERO + ZERO , -/*0xeaea : 0x00: 0x965*/ DEV_MASK + ZERO + ZERO + ZERO + ZERO + ZERO + ZERO + ZERO , -/*0xf1 : 0xff: 0x966 */ DEV_MASK + PNJ_MASK + GJR_MASK + ORI_MASK + BNG_MASK + KND_MASK + MLM_MASK + TML_MASK , -/*0xf2 : 0xff: 0x967 */ DEV_MASK + PNJ_MASK + GJR_MASK + ORI_MASK + BNG_MASK + KND_MASK + MLM_MASK + TML_MASK , -/*0xf3 : 0xff: 0x968 */ DEV_MASK + PNJ_MASK + GJR_MASK + ORI_MASK + BNG_MASK + KND_MASK + MLM_MASK + TML_MASK , -/*0xf4 : 0xff: 0x969 */ DEV_MASK + PNJ_MASK + GJR_MASK + ORI_MASK + BNG_MASK + KND_MASK + MLM_MASK + TML_MASK , -/*0xf5 : 0xff: 0x96a */ DEV_MASK + PNJ_MASK + GJR_MASK + ORI_MASK + BNG_MASK + KND_MASK + MLM_MASK + TML_MASK , -/*0xf6 : 0xff: 0x96b */ DEV_MASK + PNJ_MASK + GJR_MASK + ORI_MASK + BNG_MASK + KND_MASK + MLM_MASK + TML_MASK , -/*0xf7 : 0xff: 0x96c */ DEV_MASK + PNJ_MASK + GJR_MASK + ORI_MASK + BNG_MASK + KND_MASK + MLM_MASK + TML_MASK , -/*0xf8 : 0xff: 0x96d */ DEV_MASK + PNJ_MASK + GJR_MASK + ORI_MASK + BNG_MASK + KND_MASK + MLM_MASK + TML_MASK , -/*0xf9 : 0xff: 0x96e */ DEV_MASK + PNJ_MASK + GJR_MASK + ORI_MASK + BNG_MASK + KND_MASK + MLM_MASK + TML_MASK , -/*0xfa : 0xff: 0x96f */ DEV_MASK + PNJ_MASK + GJR_MASK + ORI_MASK + BNG_MASK + KND_MASK + MLM_MASK + TML_MASK , -/*0x00 : 0x80: 0x970 */ DEV_MASK + PNJ_MASK + ZERO + ZERO + ZERO + ZERO + ZERO + ZERO , -/* - * The length of the array is 128 to provide values for 0x900..0x97f. - * The last 15 entries for 0x971..0x97f of the validity table are all zero - * because no Indic script uses such Unicode code points. - */ -/*0x00 : 0x00: 0x9yz */ ZERO + ZERO + ZERO + ZERO + ZERO + ZERO + ZERO + ZERO -}; - -static const uint16_t fromUnicodeTable[128]={ - 0x00a0 ,/* 0x0900 */ - 0x00a1 ,/* 0x0901 */ - 0x00a2 ,/* 0x0902 */ - 0x00a3 ,/* 0x0903 */ - 0xa4e0 ,/* 0x0904 */ - 0x00a4 ,/* 0x0905 */ - 0x00a5 ,/* 0x0906 */ - 0x00a6 ,/* 0x0907 */ - 0x00a7 ,/* 0x0908 */ - 0x00a8 ,/* 0x0909 */ - 0x00a9 ,/* 0x090a */ - 0x00aa ,/* 0x090b */ - 0xA6E9 ,/* 0x090c */ - 0x00ae ,/* 0x090d */ - 0x00ab ,/* 0x090e */ - 0x00ac ,/* 0x090f */ - 0x00ad ,/* 0x0910 */ - 0x00b2 ,/* 0x0911 */ - 0x00af ,/* 0x0912 */ - 0x00b0 ,/* 0x0913 */ - 0x00b1 ,/* 0x0914 */ - 0x00b3 ,/* 0x0915 */ - 0x00b4 ,/* 0x0916 */ - 0x00b5 ,/* 0x0917 */ - 0x00b6 ,/* 0x0918 */ - 0x00b7 ,/* 0x0919 */ - 0x00b8 ,/* 0x091a */ - 0x00b9 ,/* 0x091b */ - 0x00ba ,/* 0x091c */ - 0x00bb ,/* 0x091d */ - 0x00bc ,/* 0x091e */ - 0x00bd ,/* 0x091f */ - 0x00be ,/* 0x0920 */ - 0x00bf ,/* 0x0921 */ - 0x00c0 ,/* 0x0922 */ - 0x00c1 ,/* 0x0923 */ - 0x00c2 ,/* 0x0924 */ - 0x00c3 ,/* 0x0925 */ - 0x00c4 ,/* 0x0926 */ - 0x00c5 ,/* 0x0927 */ - 0x00c6 ,/* 0x0928 */ - 0x00c7 ,/* 0x0929 */ - 0x00c8 ,/* 0x092a */ - 0x00c9 ,/* 0x092b */ - 0x00ca ,/* 0x092c */ - 0x00cb ,/* 0x092d */ - 0x00cc ,/* 0x092e */ - 0x00cd ,/* 0x092f */ - 0x00cf ,/* 0x0930 */ - 0x00d0 ,/* 0x0931 */ - 0x00d1 ,/* 0x0932 */ - 0x00d2 ,/* 0x0933 */ - 0x00d3 ,/* 0x0934 */ - 0x00d4 ,/* 0x0935 */ - 0x00d5 ,/* 0x0936 */ - 0x00d6 ,/* 0x0937 */ - 0x00d7 ,/* 0x0938 */ - 0x00d8 ,/* 0x0939 */ - 0xFFFF ,/* 0x093A */ - 0xFFFF ,/* 0x093B */ - 0x00e9 ,/* 0x093c */ - 0xEAE9 ,/* 0x093d */ - 0x00da ,/* 0x093e */ - 0x00db ,/* 0x093f */ - 0x00dc ,/* 0x0940 */ - 0x00dd ,/* 0x0941 */ - 0x00de ,/* 0x0942 */ - 0x00df ,/* 0x0943 */ - 0xDFE9 ,/* 0x0944 */ - 0x00e3 ,/* 0x0945 */ - 0x00e0 ,/* 0x0946 */ - 0x00e1 ,/* 0x0947 */ - 0x00e2 ,/* 0x0948 */ - 0x00e7 ,/* 0x0949 */ - 0x00e4 ,/* 0x094a */ - 0x00e5 ,/* 0x094b */ - 0x00e6 ,/* 0x094c */ - 0x00e8 ,/* 0x094d */ - 0x00ec ,/* 0x094e */ - 0x00ed ,/* 0x094f */ - 0xA1E9 ,/* 0x0950 */ /* OM Symbol */ - 0xFFFF ,/* 0x0951 */ - 0xF0B8 ,/* 0x0952 */ - 0xFFFF ,/* 0x0953 */ - 0xFFFF ,/* 0x0954 */ - 0xFFFF ,/* 0x0955 */ - 0xFFFF ,/* 0x0956 */ - 0xFFFF ,/* 0x0957 */ - 0xb3e9 ,/* 0x0958 */ - 0xb4e9 ,/* 0x0959 */ - 0xb5e9 ,/* 0x095a */ - 0xbae9 ,/* 0x095b */ - 0xbfe9 ,/* 0x095c */ - 0xC0E9 ,/* 0x095d */ - 0xc9e9 ,/* 0x095e */ - 0x00ce ,/* 0x095f */ - 0xAAe9 ,/* 0x0960 */ - 0xA7E9 ,/* 0x0961 */ - 0xDBE9 ,/* 0x0962 */ - 0xDCE9 ,/* 0x0963 */ - 0x00ea ,/* 0x0964 */ - 0xeaea ,/* 0x0965 */ - 0x00f1 ,/* 0x0966 */ - 0x00f2 ,/* 0x0967 */ - 0x00f3 ,/* 0x0968 */ - 0x00f4 ,/* 0x0969 */ - 0x00f5 ,/* 0x096a */ - 0x00f6 ,/* 0x096b */ - 0x00f7 ,/* 0x096c */ - 0x00f8 ,/* 0x096d */ - 0x00f9 ,/* 0x096e */ - 0x00fa ,/* 0x096f */ - 0xF0BF ,/* 0x0970 */ - 0xFFFF ,/* 0x0971 */ - 0xFFFF ,/* 0x0972 */ - 0xFFFF ,/* 0x0973 */ - 0xFFFF ,/* 0x0974 */ - 0xFFFF ,/* 0x0975 */ - 0xFFFF ,/* 0x0976 */ - 0xFFFF ,/* 0x0977 */ - 0xFFFF ,/* 0x0978 */ - 0xFFFF ,/* 0x0979 */ - 0xFFFF ,/* 0x097a */ - 0xFFFF ,/* 0x097b */ - 0xFFFF ,/* 0x097c */ - 0xFFFF ,/* 0x097d */ - 0xFFFF ,/* 0x097e */ - 0xFFFF ,/* 0x097f */ -}; -static const uint16_t toUnicodeTable[256]={ - 0x0000,/* 0x00 */ - 0x0001,/* 0x01 */ - 0x0002,/* 0x02 */ - 0x0003,/* 0x03 */ - 0x0004,/* 0x04 */ - 0x0005,/* 0x05 */ - 0x0006,/* 0x06 */ - 0x0007,/* 0x07 */ - 0x0008,/* 0x08 */ - 0x0009,/* 0x09 */ - 0x000a,/* 0x0a */ - 0x000b,/* 0x0b */ - 0x000c,/* 0x0c */ - 0x000d,/* 0x0d */ - 0x000e,/* 0x0e */ - 0x000f,/* 0x0f */ - 0x0010,/* 0x10 */ - 0x0011,/* 0x11 */ - 0x0012,/* 0x12 */ - 0x0013,/* 0x13 */ - 0x0014,/* 0x14 */ - 0x0015,/* 0x15 */ - 0x0016,/* 0x16 */ - 0x0017,/* 0x17 */ - 0x0018,/* 0x18 */ - 0x0019,/* 0x19 */ - 0x001a,/* 0x1a */ - 0x001b,/* 0x1b */ - 0x001c,/* 0x1c */ - 0x001d,/* 0x1d */ - 0x001e,/* 0x1e */ - 0x001f,/* 0x1f */ - 0x0020,/* 0x20 */ - 0x0021,/* 0x21 */ - 0x0022,/* 0x22 */ - 0x0023,/* 0x23 */ - 0x0024,/* 0x24 */ - 0x0025,/* 0x25 */ - 0x0026,/* 0x26 */ - 0x0027,/* 0x27 */ - 0x0028,/* 0x28 */ - 0x0029,/* 0x29 */ - 0x002a,/* 0x2a */ - 0x002b,/* 0x2b */ - 0x002c,/* 0x2c */ - 0x002d,/* 0x2d */ - 0x002e,/* 0x2e */ - 0x002f,/* 0x2f */ - 0x0030,/* 0x30 */ - 0x0031,/* 0x31 */ - 0x0032,/* 0x32 */ - 0x0033,/* 0x33 */ - 0x0034,/* 0x34 */ - 0x0035,/* 0x35 */ - 0x0036,/* 0x36 */ - 0x0037,/* 0x37 */ - 0x0038,/* 0x38 */ - 0x0039,/* 0x39 */ - 0x003A,/* 0x3A */ - 0x003B,/* 0x3B */ - 0x003c,/* 0x3c */ - 0x003d,/* 0x3d */ - 0x003e,/* 0x3e */ - 0x003f,/* 0x3f */ - 0x0040,/* 0x40 */ - 0x0041,/* 0x41 */ - 0x0042,/* 0x42 */ - 0x0043,/* 0x43 */ - 0x0044,/* 0x44 */ - 0x0045,/* 0x45 */ - 0x0046,/* 0x46 */ - 0x0047,/* 0x47 */ - 0x0048,/* 0x48 */ - 0x0049,/* 0x49 */ - 0x004a,/* 0x4a */ - 0x004b,/* 0x4b */ - 0x004c,/* 0x4c */ - 0x004d,/* 0x4d */ - 0x004e,/* 0x4e */ - 0x004f,/* 0x4f */ - 0x0050,/* 0x50 */ - 0x0051,/* 0x51 */ - 0x0052,/* 0x52 */ - 0x0053,/* 0x53 */ - 0x0054,/* 0x54 */ - 0x0055,/* 0x55 */ - 0x0056,/* 0x56 */ - 0x0057,/* 0x57 */ - 0x0058,/* 0x58 */ - 0x0059,/* 0x59 */ - 0x005a,/* 0x5a */ - 0x005b,/* 0x5b */ - 0x005c,/* 0x5c */ - 0x005d,/* 0x5d */ - 0x005e,/* 0x5e */ - 0x005f,/* 0x5f */ - 0x0060,/* 0x60 */ - 0x0061,/* 0x61 */ - 0x0062,/* 0x62 */ - 0x0063,/* 0x63 */ - 0x0064,/* 0x64 */ - 0x0065,/* 0x65 */ - 0x0066,/* 0x66 */ - 0x0067,/* 0x67 */ - 0x0068,/* 0x68 */ - 0x0069,/* 0x69 */ - 0x006a,/* 0x6a */ - 0x006b,/* 0x6b */ - 0x006c,/* 0x6c */ - 0x006d,/* 0x6d */ - 0x006e,/* 0x6e */ - 0x006f,/* 0x6f */ - 0x0070,/* 0x70 */ - 0x0071,/* 0x71 */ - 0x0072,/* 0x72 */ - 0x0073,/* 0x73 */ - 0x0074,/* 0x74 */ - 0x0075,/* 0x75 */ - 0x0076,/* 0x76 */ - 0x0077,/* 0x77 */ - 0x0078,/* 0x78 */ - 0x0079,/* 0x79 */ - 0x007a,/* 0x7a */ - 0x007b,/* 0x7b */ - 0x007c,/* 0x7c */ - 0x007d,/* 0x7d */ - 0x007e,/* 0x7e */ - 0x007f,/* 0x7f */ - 0x0080,/* 0x80 */ - 0x0081,/* 0x81 */ - 0x0082,/* 0x82 */ - 0x0083,/* 0x83 */ - 0x0084,/* 0x84 */ - 0x0085,/* 0x85 */ - 0x0086,/* 0x86 */ - 0x0087,/* 0x87 */ - 0x0088,/* 0x88 */ - 0x0089,/* 0x89 */ - 0x008a,/* 0x8a */ - 0x008b,/* 0x8b */ - 0x008c,/* 0x8c */ - 0x008d,/* 0x8d */ - 0x008e,/* 0x8e */ - 0x008f,/* 0x8f */ - 0x0090,/* 0x90 */ - 0x0091,/* 0x91 */ - 0x0092,/* 0x92 */ - 0x0093,/* 0x93 */ - 0x0094,/* 0x94 */ - 0x0095,/* 0x95 */ - 0x0096,/* 0x96 */ - 0x0097,/* 0x97 */ - 0x0098,/* 0x98 */ - 0x0099,/* 0x99 */ - 0x009a,/* 0x9a */ - 0x009b,/* 0x9b */ - 0x009c,/* 0x9c */ - 0x009d,/* 0x9d */ - 0x009e,/* 0x9e */ - 0x009f,/* 0x9f */ - 0x00A0,/* 0xa0 */ - 0x0901,/* 0xa1 */ - 0x0902,/* 0xa2 */ - 0x0903,/* 0xa3 */ - 0x0905,/* 0xa4 */ - 0x0906,/* 0xa5 */ - 0x0907,/* 0xa6 */ - 0x0908,/* 0xa7 */ - 0x0909,/* 0xa8 */ - 0x090a,/* 0xa9 */ - 0x090b,/* 0xaa */ - 0x090e,/* 0xab */ - 0x090f,/* 0xac */ - 0x0910,/* 0xad */ - 0x090d,/* 0xae */ - 0x0912,/* 0xaf */ - 0x0913,/* 0xb0 */ - 0x0914,/* 0xb1 */ - 0x0911,/* 0xb2 */ - 0x0915,/* 0xb3 */ - 0x0916,/* 0xb4 */ - 0x0917,/* 0xb5 */ - 0x0918,/* 0xb6 */ - 0x0919,/* 0xb7 */ - 0x091a,/* 0xb8 */ - 0x091b,/* 0xb9 */ - 0x091c,/* 0xba */ - 0x091d,/* 0xbb */ - 0x091e,/* 0xbc */ - 0x091f,/* 0xbd */ - 0x0920,/* 0xbe */ - 0x0921,/* 0xbf */ - 0x0922,/* 0xc0 */ - 0x0923,/* 0xc1 */ - 0x0924,/* 0xc2 */ - 0x0925,/* 0xc3 */ - 0x0926,/* 0xc4 */ - 0x0927,/* 0xc5 */ - 0x0928,/* 0xc6 */ - 0x0929,/* 0xc7 */ - 0x092a,/* 0xc8 */ - 0x092b,/* 0xc9 */ - 0x092c,/* 0xca */ - 0x092d,/* 0xcb */ - 0x092e,/* 0xcc */ - 0x092f,/* 0xcd */ - 0x095f,/* 0xce */ - 0x0930,/* 0xcf */ - 0x0931,/* 0xd0 */ - 0x0932,/* 0xd1 */ - 0x0933,/* 0xd2 */ - 0x0934,/* 0xd3 */ - 0x0935,/* 0xd4 */ - 0x0936,/* 0xd5 */ - 0x0937,/* 0xd6 */ - 0x0938,/* 0xd7 */ - 0x0939,/* 0xd8 */ - 0x200D,/* 0xd9 */ - 0x093e,/* 0xda */ - 0x093f,/* 0xdb */ - 0x0940,/* 0xdc */ - 0x0941,/* 0xdd */ - 0x0942,/* 0xde */ - 0x0943,/* 0xdf */ - 0x0946,/* 0xe0 */ - 0x0947,/* 0xe1 */ - 0x0948,/* 0xe2 */ - 0x0945,/* 0xe3 */ - 0x094a,/* 0xe4 */ - 0x094b,/* 0xe5 */ - 0x094c,/* 0xe6 */ - 0x0949,/* 0xe7 */ - 0x094d,/* 0xe8 */ - 0x093c,/* 0xe9 */ - 0x0964,/* 0xea */ - 0xFFFF,/* 0xeb */ - 0xFFFF,/* 0xec */ - 0xFFFF,/* 0xed */ - 0xFFFF,/* 0xee */ - 0xFFFF,/* 0xef */ - 0xFFFF,/* 0xf0 */ - 0x0966,/* 0xf1 */ - 0x0967,/* 0xf2 */ - 0x0968,/* 0xf3 */ - 0x0969,/* 0xf4 */ - 0x096a,/* 0xf5 */ - 0x096b,/* 0xf6 */ - 0x096c,/* 0xf7 */ - 0x096d,/* 0xf8 */ - 0x096e,/* 0xf9 */ - 0x096f,/* 0xfa */ - 0xFFFF,/* 0xfb */ - 0xFFFF,/* 0xfc */ - 0xFFFF,/* 0xfd */ - 0xFFFF,/* 0xfe */ - 0xFFFF /* 0xff */ -}; - -static const uint16_t vowelSignESpecialCases[][2]={ - { 2 /*length of array*/ , 0 }, - { 0xA4 , 0x0904 }, -}; - -static const uint16_t nuktaSpecialCases[][2]={ - { 16 /*length of array*/ , 0 }, - { 0xA6 , 0x090c }, - { 0xEA , 0x093D }, - { 0xDF , 0x0944 }, - { 0xA1 , 0x0950 }, - { 0xb3 , 0x0958 }, - { 0xb4 , 0x0959 }, - { 0xb5 , 0x095a }, - { 0xba , 0x095b }, - { 0xbf , 0x095c }, - { 0xC0 , 0x095d }, - { 0xc9 , 0x095e }, - { 0xAA , 0x0960 }, - { 0xA7 , 0x0961 }, - { 0xDB , 0x0962 }, - { 0xDC , 0x0963 }, -}; - - -#define WRITE_TO_TARGET_FROM_U(args,offsets,source,target,targetLimit,targetByteUnit,err){ \ - int32_t offset = (int32_t)(source - args->source-1); \ - /* write the targetUniChar to target */ \ - if(target < targetLimit){ \ - if(targetByteUnit <= 0xFF){ \ - *(target)++ = (uint8_t)(targetByteUnit); \ - if(offsets){ \ - *(offsets++) = offset; \ - } \ - }else{ \ - if (targetByteUnit > 0xFFFF) { \ - *(target)++ = (uint8_t)(targetByteUnit>>16); \ - if (offsets) { \ - --offset; \ - *(offsets++) = offset; \ - } \ - } \ - if (!(target < targetLimit)) { \ - args->converter->charErrorBuffer[args->converter->charErrorBufferLength++] = \ - (uint8_t)(targetByteUnit >> 8); \ - args->converter->charErrorBuffer[args->converter->charErrorBufferLength++] = \ - (uint8_t)targetByteUnit; \ - *err = U_BUFFER_OVERFLOW_ERROR; \ - } else { \ - *(target)++ = (uint8_t)(targetByteUnit>>8); \ - if(offsets){ \ - *(offsets++) = offset; \ - } \ - if(target < targetLimit){ \ - *(target)++ = (uint8_t) targetByteUnit; \ - if(offsets){ \ - *(offsets++) = offset ; \ - } \ - }else{ \ - args->converter->charErrorBuffer[args->converter->charErrorBufferLength++] =\ - (uint8_t) (targetByteUnit); \ - *err = U_BUFFER_OVERFLOW_ERROR; \ - } \ - } \ - } \ - }else{ \ - if (targetByteUnit & 0xFF0000) { \ - args->converter->charErrorBuffer[args->converter->charErrorBufferLength++] = \ - (uint8_t) (targetByteUnit >>16); \ - } \ - if(targetByteUnit & 0xFF00){ \ - args->converter->charErrorBuffer[args->converter->charErrorBufferLength++] = \ - (uint8_t) (targetByteUnit >>8); \ - } \ - args->converter->charErrorBuffer[args->converter->charErrorBufferLength++] = \ - (uint8_t) (targetByteUnit); \ - *err = U_BUFFER_OVERFLOW_ERROR; \ - } \ -} - -/* Rules: - * Explicit Halant : - * + - * Soft Halant : - * + - */ - -static void UConverter_fromUnicode_ISCII_OFFSETS_LOGIC( - UConverterFromUnicodeArgs * args, UErrorCode * err) { - const UChar *source = args->source; - const UChar *sourceLimit = args->sourceLimit; - unsigned char *target = (unsigned char *) args->target; - unsigned char *targetLimit = (unsigned char *) args->targetLimit; - int32_t* offsets = args->offsets; - uint32_t targetByteUnit = 0x0000; - UChar32 sourceChar = 0x0000; - UChar32 tempContextFromUnicode = 0x0000; /* For special handling of the Gurmukhi script. */ - UConverterDataISCII *converterData; - uint16_t newDelta=0; - uint16_t range = 0; - UBool deltaChanged = FALSE; - - if ((args->converter == NULL) || (args->targetLimit < args->target) || (args->sourceLimit < args->source)) { - *err = U_ILLEGAL_ARGUMENT_ERROR; - return; - } - /* initialize data */ - converterData=(UConverterDataISCII*)args->converter->extraInfo; - newDelta=converterData->currentDeltaFromUnicode; - range = (uint16_t)(newDelta/DELTA); - - if ((sourceChar = args->converter->fromUChar32)!=0) { - goto getTrail; - } - - /*writing the char to the output stream */ - while (source < sourceLimit) { - /* Write the language code following LF only if LF is not the last character. */ - if (args->converter->fromUnicodeStatus == LF) { - targetByteUnit = ATR<<8; - targetByteUnit += (uint8_t) lookupInitialData[range].isciiLang; - args->converter->fromUnicodeStatus = 0x0000; - /* now append ATR and language code */ - WRITE_TO_TARGET_FROM_U(args,offsets,source,target,targetLimit,targetByteUnit,err); - if (U_FAILURE(*err)) { - break; - } - } - - sourceChar = *source++; - tempContextFromUnicode = converterData->contextCharFromUnicode; - - targetByteUnit = missingCharMarker; - - /*check if input is in ASCII and C0 control codes range*/ - if (sourceChar <= ASCII_END) { - args->converter->fromUnicodeStatus = sourceChar; - WRITE_TO_TARGET_FROM_U(args,offsets,source,target,targetLimit,sourceChar,err); - if (U_FAILURE(*err)) { - break; - } - continue; - } - switch (sourceChar) { - case ZWNJ: - /* contextChar has HALANT */ - if (converterData->contextCharFromUnicode) { - converterData->contextCharFromUnicode = 0x00; - targetByteUnit = ISCII_HALANT; - } else { - /* consume ZWNJ and continue */ - converterData->contextCharFromUnicode = 0x00; - continue; - } - break; - case ZWJ: - /* contextChar has HALANT */ - if (converterData->contextCharFromUnicode) { - targetByteUnit = ISCII_NUKTA; - } else { - targetByteUnit =ISCII_INV; - } - converterData->contextCharFromUnicode = 0x00; - break; - default: - /* is the sourceChar in the INDIC_RANGE? */ - if ((uint16_t)(INDIC_BLOCK_END-sourceChar) <= INDIC_RANGE) { - /* Danda and Double Danda are valid in Northern scripts.. since Unicode - * does not include these codepoints in all Northern scrips we need to - * filter them out - */ - if (sourceChar!= DANDA && sourceChar != DOUBLE_DANDA) { - /* find out to which block the souceChar belongs*/ - range =(uint16_t)((sourceChar-INDIC_BLOCK_BEGIN)/DELTA); - newDelta =(uint16_t)(range*DELTA); - - /* Now are we in the same block as the previous? */ - if (newDelta!= converterData->currentDeltaFromUnicode || converterData->isFirstBuffer) { - converterData->currentDeltaFromUnicode = newDelta; - converterData->currentMaskFromUnicode = lookupInitialData[range].maskEnum; - deltaChanged =TRUE; - converterData->isFirstBuffer=FALSE; - } - - if (converterData->currentDeltaFromUnicode == PNJ_DELTA) { - if (sourceChar == PNJ_TIPPI) { - /* Make sure Tippi is converterd to Bindi. */ - sourceChar = PNJ_BINDI; - } else if (sourceChar == PNJ_ADHAK) { - /* This is for consonant cluster handling. */ - converterData->contextCharFromUnicode = PNJ_ADHAK; - } - - } - /* Normalize all Indic codepoints to Devanagari and map them to ISCII */ - /* now subtract the new delta from sourceChar*/ - sourceChar -= converterData->currentDeltaFromUnicode; - } - - /* get the target byte unit */ - targetByteUnit=fromUnicodeTable[(uint8_t)sourceChar]; - - /* is the code point valid in current script? */ - if ((validityTable[(uint8_t)sourceChar] & converterData->currentMaskFromUnicode)==0) { - /* Vocallic RR is assigned in ISCII Telugu and Unicode */ - if (converterData->currentDeltaFromUnicode!=(TELUGU_DELTA) || sourceChar!=VOCALLIC_RR) { - targetByteUnit=missingCharMarker; - } - } - - if (deltaChanged) { - /* we are in a script block which is different than - * previous sourceChar's script block write ATR and language codes - */ - uint32_t temp=0; - temp =(uint16_t)(ATR<<8); - temp += (uint16_t)((uint8_t) lookupInitialData[range].isciiLang); - /* reset */ - deltaChanged=FALSE; - /* now append ATR and language code */ - WRITE_TO_TARGET_FROM_U(args,offsets,source,target,targetLimit,temp,err); - if (U_FAILURE(*err)) { - break; - } - } - - if (converterData->currentDeltaFromUnicode == PNJ_DELTA && (sourceChar + PNJ_DELTA) == PNJ_ADHAK) { - continue; - } - } - /* reset context char */ - converterData->contextCharFromUnicode = 0x00; - break; - } - if (converterData->currentDeltaFromUnicode == PNJ_DELTA && tempContextFromUnicode == PNJ_ADHAK && isPNJConsonant((sourceChar + PNJ_DELTA))) { - /* If the previous codepoint is Adhak and the current codepoint is a consonant, the targetByteUnit should be C + Halant + C. */ - /* reset context char */ - converterData->contextCharFromUnicode = 0x0000; - targetByteUnit = targetByteUnit << 16 | ISCII_HALANT << 8 | targetByteUnit; - /* write targetByteUnit to target */ - WRITE_TO_TARGET_FROM_U(args, offsets, source, target, targetLimit, targetByteUnit,err); - if (U_FAILURE(*err)) { - break; - } - } else if (targetByteUnit != missingCharMarker) { - if (targetByteUnit==ISCII_HALANT) { - converterData->contextCharFromUnicode = (UChar)targetByteUnit; - } - /* write targetByteUnit to target*/ - WRITE_TO_TARGET_FROM_U(args,offsets,source,target,targetLimit,targetByteUnit,err); - if (U_FAILURE(*err)) { - break; - } - } else { - /* oops.. the code point is unassigned */ - /*check if the char is a First surrogate*/ - if (U16_IS_SURROGATE(sourceChar)) { - if (U16_IS_SURROGATE_LEAD(sourceChar)) { -getTrail: - /*look ahead to find the trail surrogate*/ - if (source < sourceLimit) { - /* test the following code unit */ - UChar trail= (*source); - if (U16_IS_TRAIL(trail)) { - source++; - sourceChar=U16_GET_SUPPLEMENTARY(sourceChar, trail); - *err =U_INVALID_CHAR_FOUND; - /* convert this surrogate code point */ - /* exit this condition tree */ - } else { - /* this is an unmatched lead code unit (1st surrogate) */ - /* callback(illegal) */ - *err=U_ILLEGAL_CHAR_FOUND; - } - } else { - /* no more input */ - *err = U_ZERO_ERROR; - } - } else { - /* this is an unmatched trail code unit (2nd surrogate) */ - /* callback(illegal) */ - *err=U_ILLEGAL_CHAR_FOUND; - } - } else { - /* callback(unassigned) for a BMP code point */ - *err = U_INVALID_CHAR_FOUND; - } - - args->converter->fromUChar32=sourceChar; - break; - } - }/* end while(mySourceIndexsource = source; - args->target = (char*)target; -} - -static const uint16_t lookupTable[][2]={ - { ZERO, ZERO }, /*DEFALT*/ - { ZERO, ZERO }, /*ROMAN*/ - { DEVANAGARI, DEV_MASK }, - { BENGALI, BNG_MASK }, - { TAMIL, TML_MASK }, - { TELUGU, KND_MASK }, - { BENGALI, BNG_MASK }, - { ORIYA, ORI_MASK }, - { KANNADA, KND_MASK }, - { MALAYALAM, MLM_MASK }, - { GUJARATI, GJR_MASK }, - { GURMUKHI, PNJ_MASK } -}; - -#define WRITE_TO_TARGET_TO_U(args,source,target,offsets,offset,targetUniChar,delta, err){\ - /* add offset to current Indic Block */ \ - if(targetUniChar>ASCII_END && \ - targetUniChar != ZWJ && \ - targetUniChar != ZWNJ && \ - targetUniChar != DANDA && \ - targetUniChar != DOUBLE_DANDA){ \ - \ - targetUniChar+=(uint16_t)(delta); \ - } \ - /* now write the targetUniChar */ \ - if(targettargetLimit){ \ - *(target)++ = (UChar)targetUniChar; \ - if(offsets){ \ - *(offsets)++ = (int32_t)(offset); \ - } \ - }else{ \ - args->converter->UCharErrorBuffer[args->converter->UCharErrorBufferLength++] = \ - (UChar)targetUniChar; \ - *err = U_BUFFER_OVERFLOW_ERROR; \ - } \ -} - -#define GET_MAPPING(sourceChar,targetUniChar,data){ \ - targetUniChar = toUnicodeTable[(sourceChar)] ; \ - /* is the code point valid in current script? */ \ - if(sourceChar> ASCII_END && \ - (validityTable[(targetUniChar & 0x7F)] & data->currentMaskToUnicode)==0){ \ - /* Vocallic RR is assigne in ISCII Telugu and Unicode */ \ - if(data->currentDeltaToUnicode!=(TELUGU_DELTA) || \ - targetUniChar!=VOCALLIC_RR){ \ - targetUniChar=missingCharMarker; \ - } \ - } \ -} - -/*********** - * Rules for ISCII to Unicode converter - * ISCII is stateful encoding. To convert ISCII bytes to Unicode, - * which has both precomposed and decomposed forms characters - * pre-context and post-context need to be considered. - * - * Post context - * i) ATR : Attribute code is used to declare the font and script switching. - * Currently we only switch scripts and font codes consumed without generating an error - * ii) EXT : Extention code is used to declare switching to Sanskrit and for obscure, - * obsolete characters - * Pre context - * i) Halant: if preceeded by a halant then it is a explicit halant - * ii) Nukta : - * a) if preceeded by a halant then it is a soft halant - * b) if preceeded by specific consonants and the ligatures have pre-composed - * characters in Unicode then convert to pre-composed characters - * iii) Danda: If Danda is preceeded by a Danda then convert to Double Danda - * - */ - -static void UConverter_toUnicode_ISCII_OFFSETS_LOGIC(UConverterToUnicodeArgs *args, UErrorCode* err) { - const char *source = ( char *) args->source; - UChar *target = args->target; - const char *sourceLimit = args->sourceLimit; - const UChar* targetLimit = args->targetLimit; - uint32_t targetUniChar = 0x0000; - uint8_t sourceChar = 0x0000; - UConverterDataISCII* data; - UChar32* toUnicodeStatus=NULL; - UChar32 tempTargetUniChar = 0x0000; - UChar* contextCharToUnicode= NULL; - UBool found; - int i; - int offset = 0; - - if ((args->converter == NULL) || (target < args->target) || (source < args->source)) { - *err = U_ILLEGAL_ARGUMENT_ERROR; - return; - } - - data = (UConverterDataISCII*)(args->converter->extraInfo); - contextCharToUnicode = &data->contextCharToUnicode; /* contains previous ISCII codepoint visited */ - toUnicodeStatus = (UChar32*)&args->converter->toUnicodeStatus;/* contains the mapping to Unicode of the above codepoint*/ - - while (U_SUCCESS(*err) && sourcecurrentDeltaToUnicode = (uint16_t)(lookupTable[sourceChar & 0x0F][0] * DELTA); - data->currentMaskToUnicode = (MaskEnum)lookupTable[sourceChar & 0x0F][1]; - } else if (sourceChar==DEF) { - /* switch back to default */ - data->currentDeltaToUnicode = data->defDeltaToUnicode; - data->currentMaskToUnicode = data->defMaskToUnicode; - } else { - if ((sourceChar >= 0x21 && sourceChar <= 0x3F)) { - /* these are display codes consume and continue */ - } else { - *err =U_ILLEGAL_CHAR_FOUND; - /* reset */ - *contextCharToUnicode=NO_CHAR_MARKER; - goto CALLBACK; - } - } - - /* reset */ - *contextCharToUnicode=NO_CHAR_MARKER; - - continue; - - } else if (*contextCharToUnicode==EXT) { - /* check if sourceChar is in 0xA1-0xEE range */ - if ((uint8_t) (EXT_RANGE_END - sourceChar) <= (EXT_RANGE_END - EXT_RANGE_BEGIN)) { - /* We currently support only Anudatta and Devanagari abbreviation sign */ - if (sourceChar==0xBF || sourceChar == 0xB8) { - targetUniChar = (sourceChar==0xBF) ? DEV_ABBR_SIGN : DEV_ANUDATTA; - - /* find out if the mapping is valid in this state */ - if (validityTable[(uint8_t)targetUniChar] & data->currentMaskToUnicode) { - *contextCharToUnicode= NO_CHAR_MARKER; - - /* Write the previous toUnicodeStatus, this was delayed to handle consonant clustering for Gurmukhi script. */ - if (data->prevToUnicodeStatus) { - WRITE_TO_TARGET_TO_U(args,source,target,args->offsets,(source-args->source -1),data->prevToUnicodeStatus,0,err); - data->prevToUnicodeStatus = 0x0000; - } - /* write to target */ - WRITE_TO_TARGET_TO_U(args,source,target,args->offsets,(source-args->source -2),targetUniChar,data->currentDeltaToUnicode,err); - - continue; - } - } - /* byte unit is unassigned */ - targetUniChar = missingCharMarker; - *err= U_INVALID_CHAR_FOUND; - } else { - /* only 0xA1 - 0xEE are legal after EXT char */ - *contextCharToUnicode= NO_CHAR_MARKER; - *err = U_ILLEGAL_CHAR_FOUND; - } - goto CALLBACK; - } else if (*contextCharToUnicode==ISCII_INV) { - if (sourceChar==ISCII_HALANT) { - targetUniChar = 0x0020; /* replace with space accoding to Indic FAQ */ - } else { - targetUniChar = ZWJ; - } - - /* Write the previous toUnicodeStatus, this was delayed to handle consonant clustering for Gurmukhi script. */ - if (data->prevToUnicodeStatus) { - WRITE_TO_TARGET_TO_U(args,source,target,args->offsets,(source-args->source -1),data->prevToUnicodeStatus,0,err); - data->prevToUnicodeStatus = 0x0000; - } - /* write to target */ - WRITE_TO_TARGET_TO_U(args,source,target,args->offsets,(source-args->source -2),targetUniChar,data->currentDeltaToUnicode,err); - /* reset */ - *contextCharToUnicode=NO_CHAR_MARKER; - } - - /* look at the pre-context and perform special processing */ - switch (sourceChar) { - case ISCII_INV: - case EXT: - case ATR: - *contextCharToUnicode = (UChar)sourceChar; - - if (*toUnicodeStatus != missingCharMarker) { - /* Write the previous toUnicodeStatus, this was delayed to handle consonant clustering for Gurmukhi script. */ - if (data->prevToUnicodeStatus) { - WRITE_TO_TARGET_TO_U(args,source,target,args->offsets,(source-args->source -1),data->prevToUnicodeStatus,0,err); - data->prevToUnicodeStatus = 0x0000; - } - WRITE_TO_TARGET_TO_U(args,source,target,args->offsets,(source-args->source -2),*toUnicodeStatus,data->currentDeltaToUnicode,err); - *toUnicodeStatus = missingCharMarker; - } - continue; - case ISCII_DANDA: - /* handle double danda*/ - if (*contextCharToUnicode== ISCII_DANDA) { - targetUniChar = DOUBLE_DANDA; - /* clear the context */ - *contextCharToUnicode = NO_CHAR_MARKER; - *toUnicodeStatus = missingCharMarker; - } else { - GET_MAPPING(sourceChar,targetUniChar,data); - *contextCharToUnicode = sourceChar; - } - break; - case ISCII_HALANT: - /* handle explicit halant */ - if (*contextCharToUnicode == ISCII_HALANT) { - targetUniChar = ZWNJ; - /* clear the context */ - *contextCharToUnicode = NO_CHAR_MARKER; - } else { - GET_MAPPING(sourceChar,targetUniChar,data); - *contextCharToUnicode = sourceChar; - } - break; - case 0x0A: - case 0x0D: - data->resetToDefaultToUnicode = TRUE; - GET_MAPPING(sourceChar,targetUniChar,data) - ; - *contextCharToUnicode = sourceChar; - break; - - case ISCII_VOWEL_SIGN_E: - i=1; - found=FALSE; - for (; icurrentMaskToUnicode) { - /*targetUniChar += data->currentDeltaToUnicode ;*/ - *contextCharToUnicode= NO_CHAR_MARKER; - *toUnicodeStatus = missingCharMarker; - break; - } - } - GET_MAPPING(sourceChar,targetUniChar,data); - *contextCharToUnicode = sourceChar; - break; - - case ISCII_NUKTA: - /* handle soft halant */ - if (*contextCharToUnicode == ISCII_HALANT) { - targetUniChar = ZWJ; - /* clear the context */ - *contextCharToUnicode = NO_CHAR_MARKER; - break; - } else if (data->currentDeltaToUnicode == PNJ_DELTA && data->contextCharToUnicode == 0xc0) { - /* Write the previous toUnicodeStatus, this was delayed to handle consonant clustering for Gurmukhi script. */ - if (data->prevToUnicodeStatus) { - WRITE_TO_TARGET_TO_U(args,source,target,args->offsets,(source-args->source -1),data->prevToUnicodeStatus,0,err); - data->prevToUnicodeStatus = 0x0000; - } - /* We got here because ISCII_NUKTA was preceded by 0xc0 and we are converting Gurmukhi. - * In that case we must convert (0xc0 0xe9) to (\u0a5c\u0a4d\u0a39). - */ - targetUniChar = PNJ_RRA; - WRITE_TO_TARGET_TO_U(args, source, target, args->offsets, (source-args->source)-2, targetUniChar, 0, err); - if (U_SUCCESS(*err)) { - targetUniChar = PNJ_SIGN_VIRAMA; - WRITE_TO_TARGET_TO_U(args, source, target, args->offsets, (source-args->source)-2, targetUniChar, 0, err); - if (U_SUCCESS(*err)) { - targetUniChar = PNJ_HA; - WRITE_TO_TARGET_TO_U(args, source, target, args->offsets, (source-args->source)-2, targetUniChar, 0, err); - } else { - args->converter->UCharErrorBuffer[args->converter->UCharErrorBufferLength++]= PNJ_HA; - } - } else { - args->converter->UCharErrorBuffer[args->converter->UCharErrorBufferLength++]= PNJ_SIGN_VIRAMA; - args->converter->UCharErrorBuffer[args->converter->UCharErrorBufferLength++]= PNJ_HA; - } - *toUnicodeStatus = missingCharMarker; - data->contextCharToUnicode = NO_CHAR_MARKER; - continue; - } else { - /* try to handle + ISCII_NUKTA special mappings */ - i=1; - found =FALSE; - for (; icurrentMaskToUnicode) { - /*targetUniChar += data->currentDeltaToUnicode ;*/ - *contextCharToUnicode= NO_CHAR_MARKER; - *toUnicodeStatus = missingCharMarker; - if (data->currentDeltaToUnicode == PNJ_DELTA) { - /* Write the previous toUnicodeStatus, this was delayed to handle consonant clustering for Gurmukhi script. */ - if (data->prevToUnicodeStatus) { - WRITE_TO_TARGET_TO_U(args,source,target,args->offsets,(source-args->source -1),data->prevToUnicodeStatus,0,err); - data->prevToUnicodeStatus = 0x0000; - } - WRITE_TO_TARGET_TO_U(args,source,target,args->offsets,(source-args->source -2),targetUniChar,data->currentDeltaToUnicode,err); - continue; - } - break; - } - /* else fall through to default */ - } - /* else fall through to default */ - U_FALLTHROUGH; - } - default:GET_MAPPING(sourceChar,targetUniChar,data) - ; - *contextCharToUnicode = sourceChar; - break; - } - - if (*toUnicodeStatus != missingCharMarker) { - /* Check to make sure that consonant clusters are handled correct for Gurmukhi script. */ - if (data->currentDeltaToUnicode == PNJ_DELTA && data->prevToUnicodeStatus != 0 && isPNJConsonant(data->prevToUnicodeStatus) && - (*toUnicodeStatus + PNJ_DELTA) == PNJ_SIGN_VIRAMA && (targetUniChar + PNJ_DELTA) == data->prevToUnicodeStatus) { - /* Consonant clusters C + HALANT + C should be encoded as ADHAK + C */ - offset = (int)(source-args->source - 3); - tempTargetUniChar = PNJ_ADHAK; /* This is necessary to avoid some compiler warnings. */ - WRITE_TO_TARGET_TO_U(args,source,target,args->offsets,offset,tempTargetUniChar,0,err); - WRITE_TO_TARGET_TO_U(args,source,target,args->offsets,offset,data->prevToUnicodeStatus,0,err); - data->prevToUnicodeStatus = 0x0000; /* reset the previous unicode code point */ - *toUnicodeStatus = missingCharMarker; - continue; - } else { - /* Write the previous toUnicodeStatus, this was delayed to handle consonant clustering for Gurmukhi script. */ - if (data->prevToUnicodeStatus) { - WRITE_TO_TARGET_TO_U(args,source,target,args->offsets,(source-args->source -1),data->prevToUnicodeStatus,0,err); - data->prevToUnicodeStatus = 0x0000; - } - /* Check to make sure that Bindi and Tippi are handled correctly for Gurmukhi script. - * If 0xA2 is preceded by a codepoint in the PNJ_BINDI_TIPPI_SET then the target codepoint should be Tippi instead of Bindi. - */ - if (data->currentDeltaToUnicode == PNJ_DELTA && (targetUniChar + PNJ_DELTA) == PNJ_BINDI && isPNJBindiTippi((*toUnicodeStatus + PNJ_DELTA))) { - targetUniChar = PNJ_TIPPI - PNJ_DELTA; - WRITE_TO_TARGET_TO_U(args,source,target,args->offsets,(source-args->source -2),*toUnicodeStatus,PNJ_DELTA,err); - } else if (data->currentDeltaToUnicode == PNJ_DELTA && (targetUniChar + PNJ_DELTA) == PNJ_SIGN_VIRAMA && isPNJConsonant((*toUnicodeStatus + PNJ_DELTA))) { - /* Store the current toUnicodeStatus code point for later handling of consonant cluster in Gurmukhi. */ - data->prevToUnicodeStatus = *toUnicodeStatus + PNJ_DELTA; - } else { - /* write the previously mapped codepoint */ - WRITE_TO_TARGET_TO_U(args,source,target,args->offsets,(source-args->source -2),*toUnicodeStatus,data->currentDeltaToUnicode,err); - } - } - *toUnicodeStatus = missingCharMarker; - } - - if (targetUniChar != missingCharMarker) { - /* now save the targetUniChar for delayed write */ - *toUnicodeStatus = (UChar) targetUniChar; - if (data->resetToDefaultToUnicode==TRUE) { - data->currentDeltaToUnicode = data->defDeltaToUnicode; - data->currentMaskToUnicode = data->defMaskToUnicode; - data->resetToDefaultToUnicode=FALSE; - } - } else { - - /* we reach here only if targetUniChar == missingCharMarker - * so assign codes to reason and err - */ - *err = U_INVALID_CHAR_FOUND; -CALLBACK: - args->converter->toUBytes[0] = (uint8_t) sourceChar; - args->converter->toULength = 1; - break; - } - - } else { - *err =U_BUFFER_OVERFLOW_ERROR; - break; - } - } - - if (U_SUCCESS(*err) && args->flush && source == sourceLimit) { - /* end of the input stream */ - UConverter *cnv = args->converter; - - if (*contextCharToUnicode==ATR || *contextCharToUnicode==EXT || *contextCharToUnicode==ISCII_INV) { - /* set toUBytes[] */ - cnv->toUBytes[0] = (uint8_t)*contextCharToUnicode; - cnv->toULength = 1; - - /* avoid looping on truncated sequences */ - *contextCharToUnicode = NO_CHAR_MARKER; - } else { - cnv->toULength = 0; - } - - if (*toUnicodeStatus != missingCharMarker) { - /* output a remaining target character */ - WRITE_TO_TARGET_TO_U(args,source,target,args->offsets,(source - args->source -1),*toUnicodeStatus,data->currentDeltaToUnicode,err); - *toUnicodeStatus = missingCharMarker; - } - } - - args->target = target; - args->source = source; -} - -/* structure for SafeClone calculations */ -struct cloneISCIIStruct { - UConverter cnv; - UConverterDataISCII mydata; -}; - -static UConverter * -_ISCII_SafeClone(const UConverter *cnv, - void *stackBuffer, - int32_t *pBufferSize, - UErrorCode *status) -{ - struct cloneISCIIStruct * localClone; - int32_t bufferSizeNeeded = sizeof(struct cloneISCIIStruct); - - if (U_FAILURE(*status)) { - return 0; - } - - if (*pBufferSize == 0) { /* 'preflighting' request - set needed size into *pBufferSize */ - *pBufferSize = bufferSizeNeeded; - return 0; - } - - localClone = (struct cloneISCIIStruct *)stackBuffer; - /* ucnv.c/ucnv_safeClone() copied the main UConverter already */ - - uprv_memcpy(&localClone->mydata, cnv->extraInfo, sizeof(UConverterDataISCII)); - localClone->cnv.extraInfo = &localClone->mydata; - localClone->cnv.isExtraLocal = TRUE; - - return &localClone->cnv; -} - -static void -_ISCIIGetUnicodeSet(const UConverter *cnv, - const USetAdder *sa, - UConverterUnicodeSet which, - UErrorCode *pErrorCode) -{ - int32_t idx, script; - uint8_t mask; - - /* Since all ISCII versions allow switching to other ISCII - scripts, we add all roundtrippable characters to this set. */ - sa->addRange(sa->set, 0, ASCII_END); - for (script = DEVANAGARI; script <= MALAYALAM; script++) { - mask = (uint8_t)(lookupInitialData[script].maskEnum); - for (idx = 0; idx < DELTA; idx++) { - /* added check for TELUGU character */ - if ((validityTable[idx] & mask) || (script==TELUGU && idx==0x31)) { - sa->add(sa->set, idx + (script * DELTA) + INDIC_BLOCK_BEGIN); - } - } - } - sa->add(sa->set, DANDA); - sa->add(sa->set, DOUBLE_DANDA); - sa->add(sa->set, ZWNJ); - sa->add(sa->set, ZWJ); -} - -static const UConverterImpl _ISCIIImpl={ - - UCNV_ISCII, - - NULL, - NULL, - - _ISCIIOpen, - _ISCIIClose, - _ISCIIReset, - - UConverter_toUnicode_ISCII_OFFSETS_LOGIC, - UConverter_toUnicode_ISCII_OFFSETS_LOGIC, - UConverter_fromUnicode_ISCII_OFFSETS_LOGIC, - UConverter_fromUnicode_ISCII_OFFSETS_LOGIC, - NULL, - - NULL, - _ISCIIgetName, - NULL, - _ISCII_SafeClone, - _ISCIIGetUnicodeSet -}; - -static const UConverterStaticData _ISCIIStaticData={ - sizeof(UConverterStaticData), - "ISCII", - 0, - UCNV_IBM, - UCNV_ISCII, - 1, - 4, - { 0x1a, 0, 0, 0 }, - 0x1, - FALSE, - FALSE, - 0x0, - 0x0, - { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 }, /* reserved */ - -}; - -const UConverterSharedData _ISCIIData= - UCNV_IMMUTABLE_SHARED_DATA_INITIALIZER(&_ISCIIStaticData, &_ISCIIImpl); - -#endif /* #if !UCONFIG_NO_LEGACY_CONVERSION */ diff --git a/Build/source/libs/icu/icu-src/source/common/ucnvisci.cpp b/Build/source/libs/icu/icu-src/source/common/ucnvisci.cpp new file mode 100644 index 00000000000..27a3a3124ad --- /dev/null +++ b/Build/source/libs/icu/icu-src/source/common/ucnvisci.cpp @@ -0,0 +1,1635 @@ +// © 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html +/* +********************************************************************** +* Copyright (C) 2000-2016, International Business Machines +* Corporation and others. All Rights Reserved. +********************************************************************** +* file name: ucnvisci.c +* encoding: UTF-8 +* tab size: 8 (not used) +* indentation:4 +* +* created on: 2001JUN26 +* created by: Ram Viswanadha +* +* Date Name Description +* 24/7/2001 Ram Added support for EXT character handling +*/ + +#include "unicode/utypes.h" + +#if !UCONFIG_NO_CONVERSION && !UCONFIG_NO_LEGACY_CONVERSION && !UCONFIG_ONLY_HTML_CONVERSION + +#include "unicode/ucnv.h" +#include "unicode/ucnv_cb.h" +#include "unicode/utf16.h" +#include "cmemory.h" +#include "ucnv_bld.h" +#include "ucnv_cnv.h" +#include "cstring.h" +#include "uassert.h" + +#define UCNV_OPTIONS_VERSION_MASK 0xf +#define NUKTA 0x093c +#define HALANT 0x094d +#define ZWNJ 0x200c /* Zero Width Non Joiner */ +#define ZWJ 0x200d /* Zero width Joiner */ +#define INVALID_CHAR 0xffff +#define ATR 0xEF /* Attribute code */ +#define EXT 0xF0 /* Extension code */ +#define DANDA 0x0964 +#define DOUBLE_DANDA 0x0965 +#define ISCII_NUKTA 0xE9 +#define ISCII_HALANT 0xE8 +#define ISCII_DANDA 0xEA +#define ISCII_INV 0xD9 +#define ISCII_VOWEL_SIGN_E 0xE0 +#define INDIC_BLOCK_BEGIN 0x0900 +#define INDIC_BLOCK_END 0x0D7F +#define INDIC_RANGE (INDIC_BLOCK_END - INDIC_BLOCK_BEGIN) +#define VOCALLIC_RR 0x0931 +#define LF 0x0A +#define ASCII_END 0xA0 +#define NO_CHAR_MARKER 0xFFFE +#define TELUGU_DELTA DELTA * TELUGU +#define DEV_ABBR_SIGN 0x0970 +#define DEV_ANUDATTA 0x0952 +#define EXT_RANGE_BEGIN 0xA1 +#define EXT_RANGE_END 0xEE + +#define PNJ_DELTA 0x0100 +#define PNJ_BINDI 0x0A02 +#define PNJ_TIPPI 0x0A70 +#define PNJ_SIGN_VIRAMA 0x0A4D +#define PNJ_ADHAK 0x0A71 +#define PNJ_HA 0x0A39 +#define PNJ_RRA 0x0A5C + +typedef enum { + DEVANAGARI =0, + BENGALI, + GURMUKHI, + GUJARATI, + ORIYA, + TAMIL, + TELUGU, + KANNADA, + MALAYALAM, + DELTA=0x80 +}UniLang; + +/** + * Enumeration for switching code pages if + + * is encountered + */ +typedef enum { + DEF = 0x40, + RMN = 0x41, + DEV = 0x42, + BNG = 0x43, + TML = 0x44, + TLG = 0x45, + ASM = 0x46, + ORI = 0x47, + KND = 0x48, + MLM = 0x49, + GJR = 0x4A, + PNJ = 0x4B, + ARB = 0x71, + PES = 0x72, + URD = 0x73, + SND = 0x74, + KSM = 0x75, + PST = 0x76 +}ISCIILang; + +typedef enum { + DEV_MASK =0x80, + PNJ_MASK =0x40, + GJR_MASK =0x20, + ORI_MASK =0x10, + BNG_MASK =0x08, + KND_MASK =0x04, + MLM_MASK =0x02, + TML_MASK =0x01, + ZERO =0x00 +}MaskEnum; + +#define ISCII_CNV_PREFIX "ISCII,version=" + +typedef struct { + UChar contextCharToUnicode; /* previous Unicode codepoint for contextual analysis */ + UChar contextCharFromUnicode; /* previous Unicode codepoint for contextual analysis */ + uint16_t defDeltaToUnicode; /* delta for switching to default state when DEF is encountered */ + uint16_t currentDeltaFromUnicode; /* current delta in Indic block */ + uint16_t currentDeltaToUnicode; /* current delta in Indic block */ + MaskEnum currentMaskFromUnicode; /* mask for current state in toUnicode */ + MaskEnum currentMaskToUnicode; /* mask for current state in toUnicode */ + MaskEnum defMaskToUnicode; /* mask for default state in toUnicode */ + UBool isFirstBuffer; /* boolean for fromUnicode to see if we need to announce the first script */ + UBool resetToDefaultToUnicode; /* boolean for reseting to default delta and mask when a newline is encountered*/ + char name[sizeof(ISCII_CNV_PREFIX) + 1]; + UChar32 prevToUnicodeStatus; /* Hold the previous toUnicodeStatus. This is necessary because we may need to know the last two code points. */ +} UConverterDataISCII; + +typedef struct LookupDataStruct { + UniLang uniLang; + MaskEnum maskEnum; + ISCIILang isciiLang; +} LookupDataStruct; + +static const LookupDataStruct lookupInitialData[]={ + { DEVANAGARI, DEV_MASK, DEV }, + { BENGALI, BNG_MASK, BNG }, + { GURMUKHI, PNJ_MASK, PNJ }, + { GUJARATI, GJR_MASK, GJR }, + { ORIYA, ORI_MASK, ORI }, + { TAMIL, TML_MASK, TML }, + { TELUGU, KND_MASK, TLG }, + { KANNADA, KND_MASK, KND }, + { MALAYALAM, MLM_MASK, MLM } +}; + +/* + * For special handling of certain Gurmukhi characters. + * Bit 0 (value 1): PNJ consonant + * Bit 1 (value 2): PNJ Bindi Tippi + */ +static const uint8_t pnjMap[80] = { + /* 0A00..0A0F */ + 0, 0, 0, 0, 0, 2, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, + /* 0A10..0A1F */ + 0, 0, 0, 0, 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + /* 0A20..0A2F */ + 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 3, 3, 3, 3, 3, 3, + /* 0A30..0A3F */ + 3, 0, 0, 0, 0, 3, 3, 0, 3, 3, 0, 0, 0, 0, 0, 2, + /* 0A40..0A4F */ + 0, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 +}; + +static UBool +isPNJConsonant(UChar32 c) { + if (c < 0xa00 || 0xa50 <= c) { + return FALSE; + } else { + return (UBool)(pnjMap[c - 0xa00] & 1); + } +} + +static UBool +isPNJBindiTippi(UChar32 c) { + if (c < 0xa00 || 0xa50 <= c) { + return FALSE; + } else { + return (UBool)(pnjMap[c - 0xa00] >> 1); + } +} +U_CDECL_BEGIN +static void U_CALLCONV +_ISCIIOpen(UConverter *cnv, UConverterLoadArgs *pArgs, UErrorCode *errorCode) { + if(pArgs->onlyTestIsLoadable) { + return; + } + + cnv->extraInfo = uprv_malloc(sizeof(UConverterDataISCII)); + + if (cnv->extraInfo != NULL) { + int32_t len=0; + UConverterDataISCII *converterData= + (UConverterDataISCII *) cnv->extraInfo; + converterData->contextCharToUnicode=NO_CHAR_MARKER; + cnv->toUnicodeStatus = missingCharMarker; + converterData->contextCharFromUnicode=0x0000; + converterData->resetToDefaultToUnicode=FALSE; + /* check if the version requested is supported */ + if ((pArgs->options & UCNV_OPTIONS_VERSION_MASK) < 9) { + /* initialize state variables */ + converterData->currentDeltaFromUnicode + = converterData->currentDeltaToUnicode + = converterData->defDeltaToUnicode = (uint16_t)(lookupInitialData[pArgs->options & UCNV_OPTIONS_VERSION_MASK].uniLang * DELTA); + + converterData->currentMaskFromUnicode + = converterData->currentMaskToUnicode + = converterData->defMaskToUnicode = lookupInitialData[pArgs->options & UCNV_OPTIONS_VERSION_MASK].maskEnum; + + converterData->isFirstBuffer=TRUE; + (void)uprv_strcpy(converterData->name, ISCII_CNV_PREFIX); + len = (int32_t)uprv_strlen(converterData->name); + converterData->name[len]= (char)((pArgs->options & UCNV_OPTIONS_VERSION_MASK) + '0'); + converterData->name[len+1]=0; + + converterData->prevToUnicodeStatus = 0x0000; + } else { + uprv_free(cnv->extraInfo); + cnv->extraInfo = NULL; + *errorCode = U_ILLEGAL_ARGUMENT_ERROR; + } + + } else { + *errorCode =U_MEMORY_ALLOCATION_ERROR; + } +} + +static void U_CALLCONV +_ISCIIClose(UConverter *cnv) { + if (cnv->extraInfo!=NULL) { + if (!cnv->isExtraLocal) { + uprv_free(cnv->extraInfo); + } + cnv->extraInfo=NULL; + } +} + +static const char* U_CALLCONV +_ISCIIgetName(const UConverter* cnv) { + if (cnv->extraInfo) { + UConverterDataISCII* myData= (UConverterDataISCII*)cnv->extraInfo; + return myData->name; + } + return NULL; +} + +static void U_CALLCONV +_ISCIIReset(UConverter *cnv, UConverterResetChoice choice) { + UConverterDataISCII* data =(UConverterDataISCII *) (cnv->extraInfo); + if (choice<=UCNV_RESET_TO_UNICODE) { + cnv->toUnicodeStatus = missingCharMarker; + cnv->mode=0; + data->currentDeltaToUnicode=data->defDeltaToUnicode; + data->currentMaskToUnicode = data->defMaskToUnicode; + data->contextCharToUnicode=NO_CHAR_MARKER; + data->prevToUnicodeStatus = 0x0000; + } + if (choice!=UCNV_RESET_TO_UNICODE) { + cnv->fromUChar32=0x0000; + data->contextCharFromUnicode=0x00; + data->currentMaskFromUnicode=data->defMaskToUnicode; + data->currentDeltaFromUnicode=data->defDeltaToUnicode; + data->isFirstBuffer=TRUE; + data->resetToDefaultToUnicode=FALSE; + } +} + +/** + * The values in validity table are indexed by the lower bits of Unicode + * range 0x0900 - 0x09ff. The values have a structure like: + * --------------------------------------------------------------- + * | DEV | PNJ | GJR | ORI | BNG | TLG | MLM | TML | + * | | | | | ASM | KND | | | + * --------------------------------------------------------------- + * If a code point is valid in a particular script + * then that bit is turned on + * + * Unicode does not distinguish between Bengali and Assamese so we use 1 bit for + * to represent these languages + * + * Telugu and Kannada have same codepoints except for Vocallic_RR which we special case + * and combine and use 1 bit to represent these languages. + * + * TODO: It is probably easier to understand and maintain to change this + * to use uint16_t and give each of the 9 Unicode/script blocks its own bit. + */ + +static const uint8_t validityTable[128] = { +/* This state table is tool generated please do not edit unless you know exactly what you are doing */ +/* Note: This table was edited to mirror the Windows XP implementation */ +/*ISCII:Valid:Unicode */ +/*0xa0 : 0x00: 0x900 */ ZERO + ZERO + ZERO + ZERO + ZERO + ZERO + ZERO + ZERO , +/*0xa1 : 0xb8: 0x901 */ DEV_MASK + PNJ_MASK + GJR_MASK + ORI_MASK + BNG_MASK + ZERO + ZERO + ZERO , +/*0xa2 : 0xfe: 0x902 */ DEV_MASK + PNJ_MASK + GJR_MASK + ORI_MASK + BNG_MASK + KND_MASK + MLM_MASK + TML_MASK , +/*0xa3 : 0xbf: 0x903 */ DEV_MASK + PNJ_MASK + GJR_MASK + ORI_MASK + BNG_MASK + KND_MASK + MLM_MASK + TML_MASK , +/*0x00 : 0x00: 0x904 */ DEV_MASK + ZERO + ZERO + ZERO + ZERO + ZERO + ZERO + ZERO , +/*0xa4 : 0xff: 0x905 */ DEV_MASK + PNJ_MASK + GJR_MASK + ORI_MASK + BNG_MASK + KND_MASK + MLM_MASK + TML_MASK , +/*0xa5 : 0xff: 0x906 */ DEV_MASK + PNJ_MASK + GJR_MASK + ORI_MASK + BNG_MASK + KND_MASK + MLM_MASK + TML_MASK , +/*0xa6 : 0xff: 0x907 */ DEV_MASK + PNJ_MASK + GJR_MASK + ORI_MASK + BNG_MASK + KND_MASK + MLM_MASK + TML_MASK , +/*0xa7 : 0xff: 0x908 */ DEV_MASK + PNJ_MASK + GJR_MASK + ORI_MASK + BNG_MASK + KND_MASK + MLM_MASK + TML_MASK , +/*0xa8 : 0xff: 0x909 */ DEV_MASK + PNJ_MASK + GJR_MASK + ORI_MASK + BNG_MASK + KND_MASK + MLM_MASK + TML_MASK , +/*0xa9 : 0xff: 0x90a */ DEV_MASK + PNJ_MASK + GJR_MASK + ORI_MASK + BNG_MASK + KND_MASK + MLM_MASK + TML_MASK , +/*0xaa : 0xfe: 0x90b */ DEV_MASK + ZERO + GJR_MASK + ORI_MASK + BNG_MASK + KND_MASK + MLM_MASK + ZERO , +/*0x00 : 0x00: 0x90c */ DEV_MASK + ZERO + ZERO + ORI_MASK + BNG_MASK + KND_MASK + MLM_MASK + ZERO , +/*0xae : 0x80: 0x90d */ DEV_MASK + ZERO + GJR_MASK + ZERO + ZERO + ZERO + ZERO + ZERO , +/*0xab : 0x87: 0x90e */ DEV_MASK + ZERO + ZERO + ZERO + ZERO + KND_MASK + MLM_MASK + TML_MASK , +/*0xac : 0xff: 0x90f */ DEV_MASK + PNJ_MASK + GJR_MASK + ORI_MASK + BNG_MASK + KND_MASK + MLM_MASK + TML_MASK , +/*0xad : 0xff: 0x910 */ DEV_MASK + PNJ_MASK + GJR_MASK + ORI_MASK + BNG_MASK + KND_MASK + MLM_MASK + TML_MASK , +/*0xb2 : 0x80: 0x911 */ DEV_MASK + ZERO + GJR_MASK + ZERO + ZERO + ZERO + ZERO + ZERO , +/*0xaf : 0x87: 0x912 */ DEV_MASK + ZERO + ZERO + ZERO + ZERO + KND_MASK + MLM_MASK + TML_MASK , +/*0xb0 : 0xff: 0x913 */ DEV_MASK + PNJ_MASK + GJR_MASK + ORI_MASK + BNG_MASK + KND_MASK + MLM_MASK + TML_MASK , +/*0xb1 : 0xff: 0x914 */ DEV_MASK + PNJ_MASK + GJR_MASK + ORI_MASK + BNG_MASK + KND_MASK + MLM_MASK + TML_MASK , +/*0xb3 : 0xff: 0x915 */ DEV_MASK + PNJ_MASK + GJR_MASK + ORI_MASK + BNG_MASK + KND_MASK + MLM_MASK + TML_MASK , +/*0xb4 : 0xfe: 0x916 */ DEV_MASK + PNJ_MASK + GJR_MASK + ORI_MASK + BNG_MASK + KND_MASK + MLM_MASK + ZERO , +/*0xb5 : 0xfe: 0x917 */ DEV_MASK + PNJ_MASK + GJR_MASK + ORI_MASK + BNG_MASK + KND_MASK + MLM_MASK + ZERO , +/*0xb6 : 0xfe: 0x918 */ DEV_MASK + PNJ_MASK + GJR_MASK + ORI_MASK + BNG_MASK + KND_MASK + MLM_MASK + ZERO , +/*0xb7 : 0xff: 0x919 */ DEV_MASK + PNJ_MASK + GJR_MASK + ORI_MASK + BNG_MASK + KND_MASK + MLM_MASK + TML_MASK , +/*0xb8 : 0xff: 0x91a */ DEV_MASK + PNJ_MASK + GJR_MASK + ORI_MASK + BNG_MASK + KND_MASK + MLM_MASK + TML_MASK , +/*0xb9 : 0xfe: 0x91b */ DEV_MASK + PNJ_MASK + GJR_MASK + ORI_MASK + BNG_MASK + KND_MASK + MLM_MASK + ZERO , +/*0xba : 0xff: 0x91c */ DEV_MASK + PNJ_MASK + GJR_MASK + ORI_MASK + BNG_MASK + KND_MASK + MLM_MASK + TML_MASK , +/*0xbb : 0xfe: 0x91d */ DEV_MASK + PNJ_MASK + GJR_MASK + ORI_MASK + BNG_MASK + KND_MASK + MLM_MASK + ZERO , +/*0xbc : 0xff: 0x91e */ DEV_MASK + PNJ_MASK + GJR_MASK + ORI_MASK + BNG_MASK + KND_MASK + MLM_MASK + TML_MASK , +/*0xbd : 0xff: 0x91f */ DEV_MASK + PNJ_MASK + GJR_MASK + ORI_MASK + BNG_MASK + KND_MASK + MLM_MASK + TML_MASK , +/*0xbe : 0xfe: 0x920 */ DEV_MASK + PNJ_MASK + GJR_MASK + ORI_MASK + BNG_MASK + KND_MASK + MLM_MASK + ZERO , +/*0xbf : 0xfe: 0x921 */ DEV_MASK + PNJ_MASK + GJR_MASK + ORI_MASK + BNG_MASK + KND_MASK + MLM_MASK + ZERO , +/*0xc0 : 0xfe: 0x922 */ DEV_MASK + PNJ_MASK + GJR_MASK + ORI_MASK + BNG_MASK + KND_MASK + MLM_MASK + ZERO , +/*0xc1 : 0xff: 0x923 */ DEV_MASK + PNJ_MASK + GJR_MASK + ORI_MASK + BNG_MASK + KND_MASK + MLM_MASK + TML_MASK , +/*0xc2 : 0xff: 0x924 */ DEV_MASK + PNJ_MASK + GJR_MASK + ORI_MASK + BNG_MASK + KND_MASK + MLM_MASK + TML_MASK , +/*0xc3 : 0xfe: 0x925 */ DEV_MASK + PNJ_MASK + GJR_MASK + ORI_MASK + BNG_MASK + KND_MASK + MLM_MASK + ZERO , +/*0xc4 : 0xfe: 0x926 */ DEV_MASK + PNJ_MASK + GJR_MASK + ORI_MASK + BNG_MASK + KND_MASK + MLM_MASK + ZERO , +/*0xc5 : 0xfe: 0x927 */ DEV_MASK + PNJ_MASK + GJR_MASK + ORI_MASK + BNG_MASK + KND_MASK + MLM_MASK + ZERO , +/*0xc6 : 0xff: 0x928 */ DEV_MASK + PNJ_MASK + GJR_MASK + ORI_MASK + BNG_MASK + KND_MASK + MLM_MASK + TML_MASK , +/*0xc7 : 0x81: 0x929 */ DEV_MASK + ZERO + ZERO + ZERO + ZERO + ZERO + ZERO + TML_MASK , +/*0xc8 : 0xff: 0x92a */ DEV_MASK + PNJ_MASK + GJR_MASK + ORI_MASK + BNG_MASK + KND_MASK + MLM_MASK + TML_MASK , +/*0xc9 : 0xfe: 0x92b */ DEV_MASK + PNJ_MASK + GJR_MASK + ORI_MASK + BNG_MASK + KND_MASK + MLM_MASK + ZERO , +/*0xca : 0xfe: 0x92c */ DEV_MASK + PNJ_MASK + GJR_MASK + ORI_MASK + BNG_MASK + KND_MASK + MLM_MASK + ZERO , +/*0xcb : 0xfe: 0x92d */ DEV_MASK + PNJ_MASK + GJR_MASK + ORI_MASK + BNG_MASK + KND_MASK + MLM_MASK + ZERO , +/*0xcc : 0xfe: 0x92e */ DEV_MASK + PNJ_MASK + GJR_MASK + ORI_MASK + BNG_MASK + KND_MASK + MLM_MASK + TML_MASK , +/*0xcd : 0xff: 0x92f */ DEV_MASK + PNJ_MASK + GJR_MASK + ORI_MASK + BNG_MASK + KND_MASK + MLM_MASK + TML_MASK , +/*0xcf : 0xff: 0x930 */ DEV_MASK + PNJ_MASK + GJR_MASK + ORI_MASK + BNG_MASK + KND_MASK + MLM_MASK + TML_MASK , +/*0xd0 : 0x87: 0x931 */ DEV_MASK + ZERO + ZERO + ZERO + ZERO + ZERO + MLM_MASK + TML_MASK , +/*0xd1 : 0xff: 0x932 */ DEV_MASK + PNJ_MASK + GJR_MASK + ORI_MASK + BNG_MASK + KND_MASK + MLM_MASK + TML_MASK , +/*0xd2 : 0xb7: 0x933 */ DEV_MASK + PNJ_MASK + GJR_MASK + ORI_MASK + ZERO + KND_MASK + MLM_MASK + TML_MASK , +/*0xd3 : 0x83: 0x934 */ DEV_MASK + ZERO + ZERO + ZERO + ZERO + ZERO + MLM_MASK + TML_MASK , +/*0xd4 : 0xff: 0x935 */ DEV_MASK + PNJ_MASK + GJR_MASK + ORI_MASK + ZERO + KND_MASK + MLM_MASK + TML_MASK , +/*0xd5 : 0xfe: 0x936 */ DEV_MASK + PNJ_MASK + GJR_MASK + ORI_MASK + BNG_MASK + KND_MASK + MLM_MASK + ZERO , +/*0xd6 : 0xbf: 0x937 */ DEV_MASK + ZERO + GJR_MASK + ORI_MASK + BNG_MASK + KND_MASK + MLM_MASK + TML_MASK , +/*0xd7 : 0xff: 0x938 */ DEV_MASK + PNJ_MASK + GJR_MASK + ORI_MASK + BNG_MASK + KND_MASK + MLM_MASK + TML_MASK , +/*0xd8 : 0xff: 0x939 */ DEV_MASK + PNJ_MASK + GJR_MASK + ORI_MASK + BNG_MASK + KND_MASK + MLM_MASK + TML_MASK , +/*0x00 : 0x00: 0x93A */ ZERO + ZERO + ZERO + ZERO + ZERO + ZERO + ZERO + ZERO , +/*0x00 : 0x00: 0x93B */ ZERO + ZERO + ZERO + ZERO + ZERO + ZERO + ZERO + ZERO , +/*0xe9 : 0xda: 0x93c */ DEV_MASK + PNJ_MASK + ZERO + ORI_MASK + BNG_MASK + ZERO + ZERO + ZERO , +/*0x00 : 0x00: 0x93d */ DEV_MASK + ZERO + ZERO + ZERO + ZERO + ZERO + ZERO + ZERO , +/*0xda : 0xff: 0x93e */ DEV_MASK + PNJ_MASK + GJR_MASK + ORI_MASK + BNG_MASK + KND_MASK + MLM_MASK + TML_MASK , +/*0xdb : 0xff: 0x93f */ DEV_MASK + PNJ_MASK + GJR_MASK + ORI_MASK + BNG_MASK + KND_MASK + MLM_MASK + TML_MASK , +/*0xdc : 0xff: 0x940 */ DEV_MASK + PNJ_MASK + GJR_MASK + ORI_MASK + BNG_MASK + KND_MASK + MLM_MASK + TML_MASK , +/*0xdd : 0xff: 0x941 */ DEV_MASK + PNJ_MASK + GJR_MASK + ORI_MASK + BNG_MASK + KND_MASK + MLM_MASK + TML_MASK , +/*0xde : 0xff: 0x942 */ DEV_MASK + PNJ_MASK + GJR_MASK + ORI_MASK + BNG_MASK + KND_MASK + MLM_MASK + TML_MASK , +/*0xdf : 0xbe: 0x943 */ DEV_MASK + ZERO + GJR_MASK + ORI_MASK + BNG_MASK + KND_MASK + MLM_MASK + ZERO , +/*0x00 : 0x00: 0x944 */ DEV_MASK + ZERO + GJR_MASK + ZERO + BNG_MASK + KND_MASK + ZERO + ZERO , +/*0xe3 : 0x80: 0x945 */ DEV_MASK + ZERO + GJR_MASK + ZERO + ZERO + ZERO + ZERO + ZERO , +/*0xe0 : 0x87: 0x946 */ DEV_MASK + ZERO + ZERO + ZERO + ZERO + KND_MASK + MLM_MASK + TML_MASK , +/*0xe1 : 0xff: 0x947 */ DEV_MASK + PNJ_MASK + GJR_MASK + ORI_MASK + BNG_MASK + KND_MASK + MLM_MASK + TML_MASK , +/*0xe2 : 0xff: 0x948 */ DEV_MASK + PNJ_MASK + GJR_MASK + ORI_MASK + BNG_MASK + KND_MASK + MLM_MASK + TML_MASK , +/*0xe7 : 0x80: 0x949 */ DEV_MASK + ZERO + GJR_MASK + ZERO + ZERO + ZERO + ZERO + ZERO , +/*0xe4 : 0x87: 0x94a */ DEV_MASK + ZERO + ZERO + ZERO + ZERO + KND_MASK + MLM_MASK + TML_MASK , +/*0xe5 : 0xff: 0x94b */ DEV_MASK + PNJ_MASK + GJR_MASK + ORI_MASK + BNG_MASK + KND_MASK + MLM_MASK + TML_MASK , +/*0xe6 : 0xff: 0x94c */ DEV_MASK + PNJ_MASK + GJR_MASK + ORI_MASK + BNG_MASK + KND_MASK + MLM_MASK + TML_MASK , +/*0xe8 : 0xff: 0x94d */ DEV_MASK + PNJ_MASK + GJR_MASK + ORI_MASK + BNG_MASK + KND_MASK + MLM_MASK + TML_MASK , +/*0xec : 0x00: 0x94e */ ZERO + ZERO + ZERO + ZERO + ZERO + ZERO + ZERO + ZERO , +/*0xed : 0x00: 0x94f */ ZERO + ZERO + ZERO + ZERO + ZERO + ZERO + ZERO + ZERO , +/*0x00 : 0x00: 0x950 */ DEV_MASK + ZERO + GJR_MASK + ZERO + ZERO + ZERO + ZERO + ZERO , +/*0x00 : 0x00: 0x951 */ DEV_MASK + ZERO + ZERO + ZERO + ZERO + ZERO + ZERO + ZERO , +/*0x00 : 0x00: 0x952 */ DEV_MASK + ZERO + ZERO + ZERO + ZERO + ZERO + ZERO + ZERO , +/*0x00 : 0x00: 0x953 */ DEV_MASK + ZERO + ZERO + ZERO + ZERO + ZERO + ZERO + ZERO , +/*0x00 : 0x00: 0x954 */ DEV_MASK + ZERO + ZERO + ZERO + ZERO + ZERO + ZERO + ZERO , +/*0x00 : 0x00: 0x955 */ ZERO + ZERO + ZERO + ZERO + ZERO + KND_MASK + ZERO + ZERO , +/*0x00 : 0x00: 0x956 */ ZERO + ZERO + ZERO + ORI_MASK + ZERO + KND_MASK + ZERO + ZERO , +/*0x00 : 0x00: 0x957 */ ZERO + ZERO + ZERO + ORI_MASK + BNG_MASK + ZERO + MLM_MASK + ZERO , +/*0x00 : 0x00: 0x958 */ DEV_MASK + ZERO + ZERO + ZERO + ZERO + ZERO + ZERO + ZERO , +/*0x00 : 0x00: 0x959 */ DEV_MASK + PNJ_MASK + ZERO + ZERO + ZERO + ZERO + ZERO + ZERO , +/*0x00 : 0x00: 0x95a */ DEV_MASK + PNJ_MASK + ZERO + ZERO + ZERO + ZERO + ZERO + ZERO , +/*0x00 : 0x00: 0x95b */ DEV_MASK + PNJ_MASK + ZERO + ZERO + ZERO + ZERO + ZERO + ZERO , +/*0x00 : 0x00: 0x95c */ DEV_MASK + PNJ_MASK + ZERO + ZERO + BNG_MASK + ZERO + ZERO + ZERO , +/*0x00 : 0x00: 0x95d */ DEV_MASK + ZERO + ZERO + ORI_MASK + BNG_MASK + ZERO + ZERO + ZERO , +/*0x00 : 0x00: 0x95e */ DEV_MASK + PNJ_MASK + ZERO + ZERO + ZERO + ZERO + ZERO + ZERO , +/*0xce : 0x98: 0x95f */ DEV_MASK + ZERO + ZERO + ORI_MASK + BNG_MASK + ZERO + ZERO + ZERO , +/*0x00 : 0x00: 0x960 */ DEV_MASK + ZERO + GJR_MASK + ORI_MASK + BNG_MASK + KND_MASK + MLM_MASK + ZERO , +/*0x00 : 0x00: 0x961 */ DEV_MASK + ZERO + ZERO + ORI_MASK + BNG_MASK + KND_MASK + MLM_MASK + ZERO , +/*0x00 : 0x00: 0x962 */ DEV_MASK + ZERO + ZERO + ZERO + BNG_MASK + ZERO + ZERO + ZERO , +/*0x00 : 0x00: 0x963 */ DEV_MASK + ZERO + ZERO + ZERO + BNG_MASK + ZERO + ZERO + ZERO , +/*0xea : 0xf8: 0x964 */ DEV_MASK + ZERO + ZERO + ZERO + ZERO + ZERO + ZERO + ZERO , +/*0xeaea : 0x00: 0x965*/ DEV_MASK + ZERO + ZERO + ZERO + ZERO + ZERO + ZERO + ZERO , +/*0xf1 : 0xff: 0x966 */ DEV_MASK + PNJ_MASK + GJR_MASK + ORI_MASK + BNG_MASK + KND_MASK + MLM_MASK + TML_MASK , +/*0xf2 : 0xff: 0x967 */ DEV_MASK + PNJ_MASK + GJR_MASK + ORI_MASK + BNG_MASK + KND_MASK + MLM_MASK + TML_MASK , +/*0xf3 : 0xff: 0x968 */ DEV_MASK + PNJ_MASK + GJR_MASK + ORI_MASK + BNG_MASK + KND_MASK + MLM_MASK + TML_MASK , +/*0xf4 : 0xff: 0x969 */ DEV_MASK + PNJ_MASK + GJR_MASK + ORI_MASK + BNG_MASK + KND_MASK + MLM_MASK + TML_MASK , +/*0xf5 : 0xff: 0x96a */ DEV_MASK + PNJ_MASK + GJR_MASK + ORI_MASK + BNG_MASK + KND_MASK + MLM_MASK + TML_MASK , +/*0xf6 : 0xff: 0x96b */ DEV_MASK + PNJ_MASK + GJR_MASK + ORI_MASK + BNG_MASK + KND_MASK + MLM_MASK + TML_MASK , +/*0xf7 : 0xff: 0x96c */ DEV_MASK + PNJ_MASK + GJR_MASK + ORI_MASK + BNG_MASK + KND_MASK + MLM_MASK + TML_MASK , +/*0xf8 : 0xff: 0x96d */ DEV_MASK + PNJ_MASK + GJR_MASK + ORI_MASK + BNG_MASK + KND_MASK + MLM_MASK + TML_MASK , +/*0xf9 : 0xff: 0x96e */ DEV_MASK + PNJ_MASK + GJR_MASK + ORI_MASK + BNG_MASK + KND_MASK + MLM_MASK + TML_MASK , +/*0xfa : 0xff: 0x96f */ DEV_MASK + PNJ_MASK + GJR_MASK + ORI_MASK + BNG_MASK + KND_MASK + MLM_MASK + TML_MASK , +/*0x00 : 0x80: 0x970 */ DEV_MASK + PNJ_MASK + ZERO + ZERO + ZERO + ZERO + ZERO + ZERO , +/* + * The length of the array is 128 to provide values for 0x900..0x97f. + * The last 15 entries for 0x971..0x97f of the validity table are all zero + * because no Indic script uses such Unicode code points. + */ +/*0x00 : 0x00: 0x9yz */ ZERO + ZERO + ZERO + ZERO + ZERO + ZERO + ZERO + ZERO +}; + +static const uint16_t fromUnicodeTable[128]={ + 0x00a0 ,/* 0x0900 */ + 0x00a1 ,/* 0x0901 */ + 0x00a2 ,/* 0x0902 */ + 0x00a3 ,/* 0x0903 */ + 0xa4e0 ,/* 0x0904 */ + 0x00a4 ,/* 0x0905 */ + 0x00a5 ,/* 0x0906 */ + 0x00a6 ,/* 0x0907 */ + 0x00a7 ,/* 0x0908 */ + 0x00a8 ,/* 0x0909 */ + 0x00a9 ,/* 0x090a */ + 0x00aa ,/* 0x090b */ + 0xA6E9 ,/* 0x090c */ + 0x00ae ,/* 0x090d */ + 0x00ab ,/* 0x090e */ + 0x00ac ,/* 0x090f */ + 0x00ad ,/* 0x0910 */ + 0x00b2 ,/* 0x0911 */ + 0x00af ,/* 0x0912 */ + 0x00b0 ,/* 0x0913 */ + 0x00b1 ,/* 0x0914 */ + 0x00b3 ,/* 0x0915 */ + 0x00b4 ,/* 0x0916 */ + 0x00b5 ,/* 0x0917 */ + 0x00b6 ,/* 0x0918 */ + 0x00b7 ,/* 0x0919 */ + 0x00b8 ,/* 0x091a */ + 0x00b9 ,/* 0x091b */ + 0x00ba ,/* 0x091c */ + 0x00bb ,/* 0x091d */ + 0x00bc ,/* 0x091e */ + 0x00bd ,/* 0x091f */ + 0x00be ,/* 0x0920 */ + 0x00bf ,/* 0x0921 */ + 0x00c0 ,/* 0x0922 */ + 0x00c1 ,/* 0x0923 */ + 0x00c2 ,/* 0x0924 */ + 0x00c3 ,/* 0x0925 */ + 0x00c4 ,/* 0x0926 */ + 0x00c5 ,/* 0x0927 */ + 0x00c6 ,/* 0x0928 */ + 0x00c7 ,/* 0x0929 */ + 0x00c8 ,/* 0x092a */ + 0x00c9 ,/* 0x092b */ + 0x00ca ,/* 0x092c */ + 0x00cb ,/* 0x092d */ + 0x00cc ,/* 0x092e */ + 0x00cd ,/* 0x092f */ + 0x00cf ,/* 0x0930 */ + 0x00d0 ,/* 0x0931 */ + 0x00d1 ,/* 0x0932 */ + 0x00d2 ,/* 0x0933 */ + 0x00d3 ,/* 0x0934 */ + 0x00d4 ,/* 0x0935 */ + 0x00d5 ,/* 0x0936 */ + 0x00d6 ,/* 0x0937 */ + 0x00d7 ,/* 0x0938 */ + 0x00d8 ,/* 0x0939 */ + 0xFFFF ,/* 0x093A */ + 0xFFFF ,/* 0x093B */ + 0x00e9 ,/* 0x093c */ + 0xEAE9 ,/* 0x093d */ + 0x00da ,/* 0x093e */ + 0x00db ,/* 0x093f */ + 0x00dc ,/* 0x0940 */ + 0x00dd ,/* 0x0941 */ + 0x00de ,/* 0x0942 */ + 0x00df ,/* 0x0943 */ + 0xDFE9 ,/* 0x0944 */ + 0x00e3 ,/* 0x0945 */ + 0x00e0 ,/* 0x0946 */ + 0x00e1 ,/* 0x0947 */ + 0x00e2 ,/* 0x0948 */ + 0x00e7 ,/* 0x0949 */ + 0x00e4 ,/* 0x094a */ + 0x00e5 ,/* 0x094b */ + 0x00e6 ,/* 0x094c */ + 0x00e8 ,/* 0x094d */ + 0x00ec ,/* 0x094e */ + 0x00ed ,/* 0x094f */ + 0xA1E9 ,/* 0x0950 */ /* OM Symbol */ + 0xFFFF ,/* 0x0951 */ + 0xF0B8 ,/* 0x0952 */ + 0xFFFF ,/* 0x0953 */ + 0xFFFF ,/* 0x0954 */ + 0xFFFF ,/* 0x0955 */ + 0xFFFF ,/* 0x0956 */ + 0xFFFF ,/* 0x0957 */ + 0xb3e9 ,/* 0x0958 */ + 0xb4e9 ,/* 0x0959 */ + 0xb5e9 ,/* 0x095a */ + 0xbae9 ,/* 0x095b */ + 0xbfe9 ,/* 0x095c */ + 0xC0E9 ,/* 0x095d */ + 0xc9e9 ,/* 0x095e */ + 0x00ce ,/* 0x095f */ + 0xAAe9 ,/* 0x0960 */ + 0xA7E9 ,/* 0x0961 */ + 0xDBE9 ,/* 0x0962 */ + 0xDCE9 ,/* 0x0963 */ + 0x00ea ,/* 0x0964 */ + 0xeaea ,/* 0x0965 */ + 0x00f1 ,/* 0x0966 */ + 0x00f2 ,/* 0x0967 */ + 0x00f3 ,/* 0x0968 */ + 0x00f4 ,/* 0x0969 */ + 0x00f5 ,/* 0x096a */ + 0x00f6 ,/* 0x096b */ + 0x00f7 ,/* 0x096c */ + 0x00f8 ,/* 0x096d */ + 0x00f9 ,/* 0x096e */ + 0x00fa ,/* 0x096f */ + 0xF0BF ,/* 0x0970 */ + 0xFFFF ,/* 0x0971 */ + 0xFFFF ,/* 0x0972 */ + 0xFFFF ,/* 0x0973 */ + 0xFFFF ,/* 0x0974 */ + 0xFFFF ,/* 0x0975 */ + 0xFFFF ,/* 0x0976 */ + 0xFFFF ,/* 0x0977 */ + 0xFFFF ,/* 0x0978 */ + 0xFFFF ,/* 0x0979 */ + 0xFFFF ,/* 0x097a */ + 0xFFFF ,/* 0x097b */ + 0xFFFF ,/* 0x097c */ + 0xFFFF ,/* 0x097d */ + 0xFFFF ,/* 0x097e */ + 0xFFFF ,/* 0x097f */ +}; +static const uint16_t toUnicodeTable[256]={ + 0x0000,/* 0x00 */ + 0x0001,/* 0x01 */ + 0x0002,/* 0x02 */ + 0x0003,/* 0x03 */ + 0x0004,/* 0x04 */ + 0x0005,/* 0x05 */ + 0x0006,/* 0x06 */ + 0x0007,/* 0x07 */ + 0x0008,/* 0x08 */ + 0x0009,/* 0x09 */ + 0x000a,/* 0x0a */ + 0x000b,/* 0x0b */ + 0x000c,/* 0x0c */ + 0x000d,/* 0x0d */ + 0x000e,/* 0x0e */ + 0x000f,/* 0x0f */ + 0x0010,/* 0x10 */ + 0x0011,/* 0x11 */ + 0x0012,/* 0x12 */ + 0x0013,/* 0x13 */ + 0x0014,/* 0x14 */ + 0x0015,/* 0x15 */ + 0x0016,/* 0x16 */ + 0x0017,/* 0x17 */ + 0x0018,/* 0x18 */ + 0x0019,/* 0x19 */ + 0x001a,/* 0x1a */ + 0x001b,/* 0x1b */ + 0x001c,/* 0x1c */ + 0x001d,/* 0x1d */ + 0x001e,/* 0x1e */ + 0x001f,/* 0x1f */ + 0x0020,/* 0x20 */ + 0x0021,/* 0x21 */ + 0x0022,/* 0x22 */ + 0x0023,/* 0x23 */ + 0x0024,/* 0x24 */ + 0x0025,/* 0x25 */ + 0x0026,/* 0x26 */ + 0x0027,/* 0x27 */ + 0x0028,/* 0x28 */ + 0x0029,/* 0x29 */ + 0x002a,/* 0x2a */ + 0x002b,/* 0x2b */ + 0x002c,/* 0x2c */ + 0x002d,/* 0x2d */ + 0x002e,/* 0x2e */ + 0x002f,/* 0x2f */ + 0x0030,/* 0x30 */ + 0x0031,/* 0x31 */ + 0x0032,/* 0x32 */ + 0x0033,/* 0x33 */ + 0x0034,/* 0x34 */ + 0x0035,/* 0x35 */ + 0x0036,/* 0x36 */ + 0x0037,/* 0x37 */ + 0x0038,/* 0x38 */ + 0x0039,/* 0x39 */ + 0x003A,/* 0x3A */ + 0x003B,/* 0x3B */ + 0x003c,/* 0x3c */ + 0x003d,/* 0x3d */ + 0x003e,/* 0x3e */ + 0x003f,/* 0x3f */ + 0x0040,/* 0x40 */ + 0x0041,/* 0x41 */ + 0x0042,/* 0x42 */ + 0x0043,/* 0x43 */ + 0x0044,/* 0x44 */ + 0x0045,/* 0x45 */ + 0x0046,/* 0x46 */ + 0x0047,/* 0x47 */ + 0x0048,/* 0x48 */ + 0x0049,/* 0x49 */ + 0x004a,/* 0x4a */ + 0x004b,/* 0x4b */ + 0x004c,/* 0x4c */ + 0x004d,/* 0x4d */ + 0x004e,/* 0x4e */ + 0x004f,/* 0x4f */ + 0x0050,/* 0x50 */ + 0x0051,/* 0x51 */ + 0x0052,/* 0x52 */ + 0x0053,/* 0x53 */ + 0x0054,/* 0x54 */ + 0x0055,/* 0x55 */ + 0x0056,/* 0x56 */ + 0x0057,/* 0x57 */ + 0x0058,/* 0x58 */ + 0x0059,/* 0x59 */ + 0x005a,/* 0x5a */ + 0x005b,/* 0x5b */ + 0x005c,/* 0x5c */ + 0x005d,/* 0x5d */ + 0x005e,/* 0x5e */ + 0x005f,/* 0x5f */ + 0x0060,/* 0x60 */ + 0x0061,/* 0x61 */ + 0x0062,/* 0x62 */ + 0x0063,/* 0x63 */ + 0x0064,/* 0x64 */ + 0x0065,/* 0x65 */ + 0x0066,/* 0x66 */ + 0x0067,/* 0x67 */ + 0x0068,/* 0x68 */ + 0x0069,/* 0x69 */ + 0x006a,/* 0x6a */ + 0x006b,/* 0x6b */ + 0x006c,/* 0x6c */ + 0x006d,/* 0x6d */ + 0x006e,/* 0x6e */ + 0x006f,/* 0x6f */ + 0x0070,/* 0x70 */ + 0x0071,/* 0x71 */ + 0x0072,/* 0x72 */ + 0x0073,/* 0x73 */ + 0x0074,/* 0x74 */ + 0x0075,/* 0x75 */ + 0x0076,/* 0x76 */ + 0x0077,/* 0x77 */ + 0x0078,/* 0x78 */ + 0x0079,/* 0x79 */ + 0x007a,/* 0x7a */ + 0x007b,/* 0x7b */ + 0x007c,/* 0x7c */ + 0x007d,/* 0x7d */ + 0x007e,/* 0x7e */ + 0x007f,/* 0x7f */ + 0x0080,/* 0x80 */ + 0x0081,/* 0x81 */ + 0x0082,/* 0x82 */ + 0x0083,/* 0x83 */ + 0x0084,/* 0x84 */ + 0x0085,/* 0x85 */ + 0x0086,/* 0x86 */ + 0x0087,/* 0x87 */ + 0x0088,/* 0x88 */ + 0x0089,/* 0x89 */ + 0x008a,/* 0x8a */ + 0x008b,/* 0x8b */ + 0x008c,/* 0x8c */ + 0x008d,/* 0x8d */ + 0x008e,/* 0x8e */ + 0x008f,/* 0x8f */ + 0x0090,/* 0x90 */ + 0x0091,/* 0x91 */ + 0x0092,/* 0x92 */ + 0x0093,/* 0x93 */ + 0x0094,/* 0x94 */ + 0x0095,/* 0x95 */ + 0x0096,/* 0x96 */ + 0x0097,/* 0x97 */ + 0x0098,/* 0x98 */ + 0x0099,/* 0x99 */ + 0x009a,/* 0x9a */ + 0x009b,/* 0x9b */ + 0x009c,/* 0x9c */ + 0x009d,/* 0x9d */ + 0x009e,/* 0x9e */ + 0x009f,/* 0x9f */ + 0x00A0,/* 0xa0 */ + 0x0901,/* 0xa1 */ + 0x0902,/* 0xa2 */ + 0x0903,/* 0xa3 */ + 0x0905,/* 0xa4 */ + 0x0906,/* 0xa5 */ + 0x0907,/* 0xa6 */ + 0x0908,/* 0xa7 */ + 0x0909,/* 0xa8 */ + 0x090a,/* 0xa9 */ + 0x090b,/* 0xaa */ + 0x090e,/* 0xab */ + 0x090f,/* 0xac */ + 0x0910,/* 0xad */ + 0x090d,/* 0xae */ + 0x0912,/* 0xaf */ + 0x0913,/* 0xb0 */ + 0x0914,/* 0xb1 */ + 0x0911,/* 0xb2 */ + 0x0915,/* 0xb3 */ + 0x0916,/* 0xb4 */ + 0x0917,/* 0xb5 */ + 0x0918,/* 0xb6 */ + 0x0919,/* 0xb7 */ + 0x091a,/* 0xb8 */ + 0x091b,/* 0xb9 */ + 0x091c,/* 0xba */ + 0x091d,/* 0xbb */ + 0x091e,/* 0xbc */ + 0x091f,/* 0xbd */ + 0x0920,/* 0xbe */ + 0x0921,/* 0xbf */ + 0x0922,/* 0xc0 */ + 0x0923,/* 0xc1 */ + 0x0924,/* 0xc2 */ + 0x0925,/* 0xc3 */ + 0x0926,/* 0xc4 */ + 0x0927,/* 0xc5 */ + 0x0928,/* 0xc6 */ + 0x0929,/* 0xc7 */ + 0x092a,/* 0xc8 */ + 0x092b,/* 0xc9 */ + 0x092c,/* 0xca */ + 0x092d,/* 0xcb */ + 0x092e,/* 0xcc */ + 0x092f,/* 0xcd */ + 0x095f,/* 0xce */ + 0x0930,/* 0xcf */ + 0x0931,/* 0xd0 */ + 0x0932,/* 0xd1 */ + 0x0933,/* 0xd2 */ + 0x0934,/* 0xd3 */ + 0x0935,/* 0xd4 */ + 0x0936,/* 0xd5 */ + 0x0937,/* 0xd6 */ + 0x0938,/* 0xd7 */ + 0x0939,/* 0xd8 */ + 0x200D,/* 0xd9 */ + 0x093e,/* 0xda */ + 0x093f,/* 0xdb */ + 0x0940,/* 0xdc */ + 0x0941,/* 0xdd */ + 0x0942,/* 0xde */ + 0x0943,/* 0xdf */ + 0x0946,/* 0xe0 */ + 0x0947,/* 0xe1 */ + 0x0948,/* 0xe2 */ + 0x0945,/* 0xe3 */ + 0x094a,/* 0xe4 */ + 0x094b,/* 0xe5 */ + 0x094c,/* 0xe6 */ + 0x0949,/* 0xe7 */ + 0x094d,/* 0xe8 */ + 0x093c,/* 0xe9 */ + 0x0964,/* 0xea */ + 0xFFFF,/* 0xeb */ + 0xFFFF,/* 0xec */ + 0xFFFF,/* 0xed */ + 0xFFFF,/* 0xee */ + 0xFFFF,/* 0xef */ + 0xFFFF,/* 0xf0 */ + 0x0966,/* 0xf1 */ + 0x0967,/* 0xf2 */ + 0x0968,/* 0xf3 */ + 0x0969,/* 0xf4 */ + 0x096a,/* 0xf5 */ + 0x096b,/* 0xf6 */ + 0x096c,/* 0xf7 */ + 0x096d,/* 0xf8 */ + 0x096e,/* 0xf9 */ + 0x096f,/* 0xfa */ + 0xFFFF,/* 0xfb */ + 0xFFFF,/* 0xfc */ + 0xFFFF,/* 0xfd */ + 0xFFFF,/* 0xfe */ + 0xFFFF /* 0xff */ +}; + +static const uint16_t vowelSignESpecialCases[][2]={ + { 2 /*length of array*/ , 0 }, + { 0xA4 , 0x0904 }, +}; + +static const uint16_t nuktaSpecialCases[][2]={ + { 16 /*length of array*/ , 0 }, + { 0xA6 , 0x090c }, + { 0xEA , 0x093D }, + { 0xDF , 0x0944 }, + { 0xA1 , 0x0950 }, + { 0xb3 , 0x0958 }, + { 0xb4 , 0x0959 }, + { 0xb5 , 0x095a }, + { 0xba , 0x095b }, + { 0xbf , 0x095c }, + { 0xC0 , 0x095d }, + { 0xc9 , 0x095e }, + { 0xAA , 0x0960 }, + { 0xA7 , 0x0961 }, + { 0xDB , 0x0962 }, + { 0xDC , 0x0963 }, +}; + + +#define WRITE_TO_TARGET_FROM_U(args,offsets,source,target,targetLimit,targetByteUnit,err){ \ + int32_t offset = (int32_t)(source - args->source-1); \ + /* write the targetUniChar to target */ \ + if(target < targetLimit){ \ + if(targetByteUnit <= 0xFF){ \ + *(target)++ = (uint8_t)(targetByteUnit); \ + if(offsets){ \ + *(offsets++) = offset; \ + } \ + }else{ \ + if (targetByteUnit > 0xFFFF) { \ + *(target)++ = (uint8_t)(targetByteUnit>>16); \ + if (offsets) { \ + --offset; \ + *(offsets++) = offset; \ + } \ + } \ + if (!(target < targetLimit)) { \ + args->converter->charErrorBuffer[args->converter->charErrorBufferLength++] = \ + (uint8_t)(targetByteUnit >> 8); \ + args->converter->charErrorBuffer[args->converter->charErrorBufferLength++] = \ + (uint8_t)targetByteUnit; \ + *err = U_BUFFER_OVERFLOW_ERROR; \ + } else { \ + *(target)++ = (uint8_t)(targetByteUnit>>8); \ + if(offsets){ \ + *(offsets++) = offset; \ + } \ + if(target < targetLimit){ \ + *(target)++ = (uint8_t) targetByteUnit; \ + if(offsets){ \ + *(offsets++) = offset ; \ + } \ + }else{ \ + args->converter->charErrorBuffer[args->converter->charErrorBufferLength++] =\ + (uint8_t) (targetByteUnit); \ + *err = U_BUFFER_OVERFLOW_ERROR; \ + } \ + } \ + } \ + }else{ \ + if (targetByteUnit & 0xFF0000) { \ + args->converter->charErrorBuffer[args->converter->charErrorBufferLength++] = \ + (uint8_t) (targetByteUnit >>16); \ + } \ + if(targetByteUnit & 0xFF00){ \ + args->converter->charErrorBuffer[args->converter->charErrorBufferLength++] = \ + (uint8_t) (targetByteUnit >>8); \ + } \ + args->converter->charErrorBuffer[args->converter->charErrorBufferLength++] = \ + (uint8_t) (targetByteUnit); \ + *err = U_BUFFER_OVERFLOW_ERROR; \ + } \ +} + +/* Rules: + * Explicit Halant : + * + + * Soft Halant : + * + + */ +static void U_CALLCONV +UConverter_fromUnicode_ISCII_OFFSETS_LOGIC( + UConverterFromUnicodeArgs * args, UErrorCode * err) { + const UChar *source = args->source; + const UChar *sourceLimit = args->sourceLimit; + unsigned char *target = (unsigned char *) args->target; + unsigned char *targetLimit = (unsigned char *) args->targetLimit; + int32_t* offsets = args->offsets; + uint32_t targetByteUnit = 0x0000; + UChar32 sourceChar = 0x0000; + UChar32 tempContextFromUnicode = 0x0000; /* For special handling of the Gurmukhi script. */ + UConverterDataISCII *converterData; + uint16_t newDelta=0; + uint16_t range = 0; + UBool deltaChanged = FALSE; + + if ((args->converter == NULL) || (args->targetLimit < args->target) || (args->sourceLimit < args->source)) { + *err = U_ILLEGAL_ARGUMENT_ERROR; + return; + } + /* initialize data */ + converterData=(UConverterDataISCII*)args->converter->extraInfo; + newDelta=converterData->currentDeltaFromUnicode; + range = (uint16_t)(newDelta/DELTA); + + if ((sourceChar = args->converter->fromUChar32)!=0) { + goto getTrail; + } + + /*writing the char to the output stream */ + while (source < sourceLimit) { + /* Write the language code following LF only if LF is not the last character. */ + if (args->converter->fromUnicodeStatus == LF) { + targetByteUnit = ATR<<8; + targetByteUnit += (uint8_t) lookupInitialData[range].isciiLang; + args->converter->fromUnicodeStatus = 0x0000; + /* now append ATR and language code */ + WRITE_TO_TARGET_FROM_U(args,offsets,source,target,targetLimit,targetByteUnit,err); + if (U_FAILURE(*err)) { + break; + } + } + + sourceChar = *source++; + tempContextFromUnicode = converterData->contextCharFromUnicode; + + targetByteUnit = missingCharMarker; + + /*check if input is in ASCII and C0 control codes range*/ + if (sourceChar <= ASCII_END) { + args->converter->fromUnicodeStatus = sourceChar; + WRITE_TO_TARGET_FROM_U(args,offsets,source,target,targetLimit,sourceChar,err); + if (U_FAILURE(*err)) { + break; + } + continue; + } + switch (sourceChar) { + case ZWNJ: + /* contextChar has HALANT */ + if (converterData->contextCharFromUnicode) { + converterData->contextCharFromUnicode = 0x00; + targetByteUnit = ISCII_HALANT; + } else { + /* consume ZWNJ and continue */ + converterData->contextCharFromUnicode = 0x00; + continue; + } + break; + case ZWJ: + /* contextChar has HALANT */ + if (converterData->contextCharFromUnicode) { + targetByteUnit = ISCII_NUKTA; + } else { + targetByteUnit =ISCII_INV; + } + converterData->contextCharFromUnicode = 0x00; + break; + default: + /* is the sourceChar in the INDIC_RANGE? */ + if ((uint16_t)(INDIC_BLOCK_END-sourceChar) <= INDIC_RANGE) { + /* Danda and Double Danda are valid in Northern scripts.. since Unicode + * does not include these codepoints in all Northern scrips we need to + * filter them out + */ + if (sourceChar!= DANDA && sourceChar != DOUBLE_DANDA) { + /* find out to which block the souceChar belongs*/ + range =(uint16_t)((sourceChar-INDIC_BLOCK_BEGIN)/DELTA); + newDelta =(uint16_t)(range*DELTA); + + /* Now are we in the same block as the previous? */ + if (newDelta!= converterData->currentDeltaFromUnicode || converterData->isFirstBuffer) { + converterData->currentDeltaFromUnicode = newDelta; + converterData->currentMaskFromUnicode = lookupInitialData[range].maskEnum; + deltaChanged =TRUE; + converterData->isFirstBuffer=FALSE; + } + + if (converterData->currentDeltaFromUnicode == PNJ_DELTA) { + if (sourceChar == PNJ_TIPPI) { + /* Make sure Tippi is converterd to Bindi. */ + sourceChar = PNJ_BINDI; + } else if (sourceChar == PNJ_ADHAK) { + /* This is for consonant cluster handling. */ + converterData->contextCharFromUnicode = PNJ_ADHAK; + } + + } + /* Normalize all Indic codepoints to Devanagari and map them to ISCII */ + /* now subtract the new delta from sourceChar*/ + sourceChar -= converterData->currentDeltaFromUnicode; + } + + /* get the target byte unit */ + targetByteUnit=fromUnicodeTable[(uint8_t)sourceChar]; + + /* is the code point valid in current script? */ + if ((validityTable[(uint8_t)sourceChar] & converterData->currentMaskFromUnicode)==0) { + /* Vocallic RR is assigned in ISCII Telugu and Unicode */ + if (converterData->currentDeltaFromUnicode!=(TELUGU_DELTA) || sourceChar!=VOCALLIC_RR) { + targetByteUnit=missingCharMarker; + } + } + + if (deltaChanged) { + /* we are in a script block which is different than + * previous sourceChar's script block write ATR and language codes + */ + uint32_t temp=0; + temp =(uint16_t)(ATR<<8); + temp += (uint16_t)((uint8_t) lookupInitialData[range].isciiLang); + /* reset */ + deltaChanged=FALSE; + /* now append ATR and language code */ + WRITE_TO_TARGET_FROM_U(args,offsets,source,target,targetLimit,temp,err); + if (U_FAILURE(*err)) { + break; + } + } + + if (converterData->currentDeltaFromUnicode == PNJ_DELTA && (sourceChar + PNJ_DELTA) == PNJ_ADHAK) { + continue; + } + } + /* reset context char */ + converterData->contextCharFromUnicode = 0x00; + break; + } + if (converterData->currentDeltaFromUnicode == PNJ_DELTA && tempContextFromUnicode == PNJ_ADHAK && isPNJConsonant((sourceChar + PNJ_DELTA))) { + /* If the previous codepoint is Adhak and the current codepoint is a consonant, the targetByteUnit should be C + Halant + C. */ + /* reset context char */ + converterData->contextCharFromUnicode = 0x0000; + targetByteUnit = targetByteUnit << 16 | ISCII_HALANT << 8 | targetByteUnit; + /* write targetByteUnit to target */ + WRITE_TO_TARGET_FROM_U(args, offsets, source, target, targetLimit, targetByteUnit,err); + if (U_FAILURE(*err)) { + break; + } + } else if (targetByteUnit != missingCharMarker) { + if (targetByteUnit==ISCII_HALANT) { + converterData->contextCharFromUnicode = (UChar)targetByteUnit; + } + /* write targetByteUnit to target*/ + WRITE_TO_TARGET_FROM_U(args,offsets,source,target,targetLimit,targetByteUnit,err); + if (U_FAILURE(*err)) { + break; + } + } else { + /* oops.. the code point is unassigned */ + /*check if the char is a First surrogate*/ + if (U16_IS_SURROGATE(sourceChar)) { + if (U16_IS_SURROGATE_LEAD(sourceChar)) { +getTrail: + /*look ahead to find the trail surrogate*/ + if (source < sourceLimit) { + /* test the following code unit */ + UChar trail= (*source); + if (U16_IS_TRAIL(trail)) { + source++; + sourceChar=U16_GET_SUPPLEMENTARY(sourceChar, trail); + *err =U_INVALID_CHAR_FOUND; + /* convert this surrogate code point */ + /* exit this condition tree */ + } else { + /* this is an unmatched lead code unit (1st surrogate) */ + /* callback(illegal) */ + *err=U_ILLEGAL_CHAR_FOUND; + } + } else { + /* no more input */ + *err = U_ZERO_ERROR; + } + } else { + /* this is an unmatched trail code unit (2nd surrogate) */ + /* callback(illegal) */ + *err=U_ILLEGAL_CHAR_FOUND; + } + } else { + /* callback(unassigned) for a BMP code point */ + *err = U_INVALID_CHAR_FOUND; + } + + args->converter->fromUChar32=sourceChar; + break; + } + }/* end while(mySourceIndexsource = source; + args->target = (char*)target; +} + +static const uint16_t lookupTable[][2]={ + { ZERO, ZERO }, /*DEFALT*/ + { ZERO, ZERO }, /*ROMAN*/ + { DEVANAGARI, DEV_MASK }, + { BENGALI, BNG_MASK }, + { TAMIL, TML_MASK }, + { TELUGU, KND_MASK }, + { BENGALI, BNG_MASK }, + { ORIYA, ORI_MASK }, + { KANNADA, KND_MASK }, + { MALAYALAM, MLM_MASK }, + { GUJARATI, GJR_MASK }, + { GURMUKHI, PNJ_MASK } +}; + +#define WRITE_TO_TARGET_TO_U(args,source,target,offsets,offset,targetUniChar,delta, err){\ + /* add offset to current Indic Block */ \ + if(targetUniChar>ASCII_END && \ + targetUniChar != ZWJ && \ + targetUniChar != ZWNJ && \ + targetUniChar != DANDA && \ + targetUniChar != DOUBLE_DANDA){ \ + \ + targetUniChar+=(uint16_t)(delta); \ + } \ + /* now write the targetUniChar */ \ + if(targettargetLimit){ \ + *(target)++ = (UChar)targetUniChar; \ + if(offsets){ \ + *(offsets)++ = (int32_t)(offset); \ + } \ + }else{ \ + args->converter->UCharErrorBuffer[args->converter->UCharErrorBufferLength++] = \ + (UChar)targetUniChar; \ + *err = U_BUFFER_OVERFLOW_ERROR; \ + } \ +} + +#define GET_MAPPING(sourceChar,targetUniChar,data){ \ + targetUniChar = toUnicodeTable[(sourceChar)] ; \ + /* is the code point valid in current script? */ \ + if(sourceChar> ASCII_END && \ + (validityTable[(targetUniChar & 0x7F)] & data->currentMaskToUnicode)==0){ \ + /* Vocallic RR is assigne in ISCII Telugu and Unicode */ \ + if(data->currentDeltaToUnicode!=(TELUGU_DELTA) || \ + targetUniChar!=VOCALLIC_RR){ \ + targetUniChar=missingCharMarker; \ + } \ + } \ +} + +/*********** + * Rules for ISCII to Unicode converter + * ISCII is stateful encoding. To convert ISCII bytes to Unicode, + * which has both precomposed and decomposed forms characters + * pre-context and post-context need to be considered. + * + * Post context + * i) ATR : Attribute code is used to declare the font and script switching. + * Currently we only switch scripts and font codes consumed without generating an error + * ii) EXT : Extention code is used to declare switching to Sanskrit and for obscure, + * obsolete characters + * Pre context + * i) Halant: if preceeded by a halant then it is a explicit halant + * ii) Nukta : + * a) if preceeded by a halant then it is a soft halant + * b) if preceeded by specific consonants and the ligatures have pre-composed + * characters in Unicode then convert to pre-composed characters + * iii) Danda: If Danda is preceeded by a Danda then convert to Double Danda + * + */ + +static void U_CALLCONV +UConverter_toUnicode_ISCII_OFFSETS_LOGIC(UConverterToUnicodeArgs *args, UErrorCode* err) { + const char *source = ( char *) args->source; + UChar *target = args->target; + const char *sourceLimit = args->sourceLimit; + const UChar* targetLimit = args->targetLimit; + uint32_t targetUniChar = 0x0000; + uint8_t sourceChar = 0x0000; + UConverterDataISCII* data; + UChar32* toUnicodeStatus=NULL; + UChar32 tempTargetUniChar = 0x0000; + UChar* contextCharToUnicode= NULL; + UBool found; + int i; + int offset = 0; + + if ((args->converter == NULL) || (target < args->target) || (source < args->source)) { + *err = U_ILLEGAL_ARGUMENT_ERROR; + return; + } + + data = (UConverterDataISCII*)(args->converter->extraInfo); + contextCharToUnicode = &data->contextCharToUnicode; /* contains previous ISCII codepoint visited */ + toUnicodeStatus = (UChar32*)&args->converter->toUnicodeStatus;/* contains the mapping to Unicode of the above codepoint*/ + + while (U_SUCCESS(*err) && sourcecurrentDeltaToUnicode = (uint16_t)(lookupTable[sourceChar & 0x0F][0] * DELTA); + data->currentMaskToUnicode = (MaskEnum)lookupTable[sourceChar & 0x0F][1]; + } else if (sourceChar==DEF) { + /* switch back to default */ + data->currentDeltaToUnicode = data->defDeltaToUnicode; + data->currentMaskToUnicode = data->defMaskToUnicode; + } else { + if ((sourceChar >= 0x21 && sourceChar <= 0x3F)) { + /* these are display codes consume and continue */ + } else { + *err =U_ILLEGAL_CHAR_FOUND; + /* reset */ + *contextCharToUnicode=NO_CHAR_MARKER; + goto CALLBACK; + } + } + + /* reset */ + *contextCharToUnicode=NO_CHAR_MARKER; + + continue; + + } else if (*contextCharToUnicode==EXT) { + /* check if sourceChar is in 0xA1-0xEE range */ + if ((uint8_t) (EXT_RANGE_END - sourceChar) <= (EXT_RANGE_END - EXT_RANGE_BEGIN)) { + /* We currently support only Anudatta and Devanagari abbreviation sign */ + if (sourceChar==0xBF || sourceChar == 0xB8) { + targetUniChar = (sourceChar==0xBF) ? DEV_ABBR_SIGN : DEV_ANUDATTA; + + /* find out if the mapping is valid in this state */ + if (validityTable[(uint8_t)targetUniChar] & data->currentMaskToUnicode) { + *contextCharToUnicode= NO_CHAR_MARKER; + + /* Write the previous toUnicodeStatus, this was delayed to handle consonant clustering for Gurmukhi script. */ + if (data->prevToUnicodeStatus) { + WRITE_TO_TARGET_TO_U(args,source,target,args->offsets,(source-args->source -1),data->prevToUnicodeStatus,0,err); + data->prevToUnicodeStatus = 0x0000; + } + /* write to target */ + WRITE_TO_TARGET_TO_U(args,source,target,args->offsets,(source-args->source -2),targetUniChar,data->currentDeltaToUnicode,err); + + continue; + } + } + /* byte unit is unassigned */ + targetUniChar = missingCharMarker; + *err= U_INVALID_CHAR_FOUND; + } else { + /* only 0xA1 - 0xEE are legal after EXT char */ + *contextCharToUnicode= NO_CHAR_MARKER; + *err = U_ILLEGAL_CHAR_FOUND; + } + goto CALLBACK; + } else if (*contextCharToUnicode==ISCII_INV) { + if (sourceChar==ISCII_HALANT) { + targetUniChar = 0x0020; /* replace with space accoding to Indic FAQ */ + } else { + targetUniChar = ZWJ; + } + + /* Write the previous toUnicodeStatus, this was delayed to handle consonant clustering for Gurmukhi script. */ + if (data->prevToUnicodeStatus) { + WRITE_TO_TARGET_TO_U(args,source,target,args->offsets,(source-args->source -1),data->prevToUnicodeStatus,0,err); + data->prevToUnicodeStatus = 0x0000; + } + /* write to target */ + WRITE_TO_TARGET_TO_U(args,source,target,args->offsets,(source-args->source -2),targetUniChar,data->currentDeltaToUnicode,err); + /* reset */ + *contextCharToUnicode=NO_CHAR_MARKER; + } + + /* look at the pre-context and perform special processing */ + switch (sourceChar) { + case ISCII_INV: + case EXT: + case ATR: + *contextCharToUnicode = (UChar)sourceChar; + + if (*toUnicodeStatus != missingCharMarker) { + /* Write the previous toUnicodeStatus, this was delayed to handle consonant clustering for Gurmukhi script. */ + if (data->prevToUnicodeStatus) { + WRITE_TO_TARGET_TO_U(args,source,target,args->offsets,(source-args->source -1),data->prevToUnicodeStatus,0,err); + data->prevToUnicodeStatus = 0x0000; + } + WRITE_TO_TARGET_TO_U(args,source,target,args->offsets,(source-args->source -2),*toUnicodeStatus,data->currentDeltaToUnicode,err); + *toUnicodeStatus = missingCharMarker; + } + continue; + case ISCII_DANDA: + /* handle double danda*/ + if (*contextCharToUnicode== ISCII_DANDA) { + targetUniChar = DOUBLE_DANDA; + /* clear the context */ + *contextCharToUnicode = NO_CHAR_MARKER; + *toUnicodeStatus = missingCharMarker; + } else { + GET_MAPPING(sourceChar,targetUniChar,data); + *contextCharToUnicode = sourceChar; + } + break; + case ISCII_HALANT: + /* handle explicit halant */ + if (*contextCharToUnicode == ISCII_HALANT) { + targetUniChar = ZWNJ; + /* clear the context */ + *contextCharToUnicode = NO_CHAR_MARKER; + } else { + GET_MAPPING(sourceChar,targetUniChar,data); + *contextCharToUnicode = sourceChar; + } + break; + case 0x0A: + case 0x0D: + data->resetToDefaultToUnicode = TRUE; + GET_MAPPING(sourceChar,targetUniChar,data) + ; + *contextCharToUnicode = sourceChar; + break; + + case ISCII_VOWEL_SIGN_E: + i=1; + found=FALSE; + for (; icurrentMaskToUnicode) { + /*targetUniChar += data->currentDeltaToUnicode ;*/ + *contextCharToUnicode= NO_CHAR_MARKER; + *toUnicodeStatus = missingCharMarker; + break; + } + } + GET_MAPPING(sourceChar,targetUniChar,data); + *contextCharToUnicode = sourceChar; + break; + + case ISCII_NUKTA: + /* handle soft halant */ + if (*contextCharToUnicode == ISCII_HALANT) { + targetUniChar = ZWJ; + /* clear the context */ + *contextCharToUnicode = NO_CHAR_MARKER; + break; + } else if (data->currentDeltaToUnicode == PNJ_DELTA && data->contextCharToUnicode == 0xc0) { + /* Write the previous toUnicodeStatus, this was delayed to handle consonant clustering for Gurmukhi script. */ + if (data->prevToUnicodeStatus) { + WRITE_TO_TARGET_TO_U(args,source,target,args->offsets,(source-args->source -1),data->prevToUnicodeStatus,0,err); + data->prevToUnicodeStatus = 0x0000; + } + /* We got here because ISCII_NUKTA was preceded by 0xc0 and we are converting Gurmukhi. + * In that case we must convert (0xc0 0xe9) to (\u0a5c\u0a4d\u0a39). + */ + targetUniChar = PNJ_RRA; + WRITE_TO_TARGET_TO_U(args, source, target, args->offsets, (source-args->source)-2, targetUniChar, 0, err); + if (U_SUCCESS(*err)) { + targetUniChar = PNJ_SIGN_VIRAMA; + WRITE_TO_TARGET_TO_U(args, source, target, args->offsets, (source-args->source)-2, targetUniChar, 0, err); + if (U_SUCCESS(*err)) { + targetUniChar = PNJ_HA; + WRITE_TO_TARGET_TO_U(args, source, target, args->offsets, (source-args->source)-2, targetUniChar, 0, err); + } else { + args->converter->UCharErrorBuffer[args->converter->UCharErrorBufferLength++]= PNJ_HA; + } + } else { + args->converter->UCharErrorBuffer[args->converter->UCharErrorBufferLength++]= PNJ_SIGN_VIRAMA; + args->converter->UCharErrorBuffer[args->converter->UCharErrorBufferLength++]= PNJ_HA; + } + *toUnicodeStatus = missingCharMarker; + data->contextCharToUnicode = NO_CHAR_MARKER; + continue; + } else { + /* try to handle + ISCII_NUKTA special mappings */ + i=1; + found =FALSE; + for (; icurrentMaskToUnicode) { + /*targetUniChar += data->currentDeltaToUnicode ;*/ + *contextCharToUnicode= NO_CHAR_MARKER; + *toUnicodeStatus = missingCharMarker; + if (data->currentDeltaToUnicode == PNJ_DELTA) { + /* Write the previous toUnicodeStatus, this was delayed to handle consonant clustering for Gurmukhi script. */ + if (data->prevToUnicodeStatus) { + WRITE_TO_TARGET_TO_U(args,source,target,args->offsets,(source-args->source -1),data->prevToUnicodeStatus,0,err); + data->prevToUnicodeStatus = 0x0000; + } + WRITE_TO_TARGET_TO_U(args,source,target,args->offsets,(source-args->source -2),targetUniChar,data->currentDeltaToUnicode,err); + continue; + } + break; + } + /* else fall through to default */ + } + /* else fall through to default */ + U_FALLTHROUGH; + } + default:GET_MAPPING(sourceChar,targetUniChar,data) + ; + *contextCharToUnicode = sourceChar; + break; + } + + if (*toUnicodeStatus != missingCharMarker) { + /* Check to make sure that consonant clusters are handled correct for Gurmukhi script. */ + if (data->currentDeltaToUnicode == PNJ_DELTA && data->prevToUnicodeStatus != 0 && isPNJConsonant(data->prevToUnicodeStatus) && + (*toUnicodeStatus + PNJ_DELTA) == PNJ_SIGN_VIRAMA && ((UChar32)(targetUniChar + PNJ_DELTA) == data->prevToUnicodeStatus)) { + /* Consonant clusters C + HALANT + C should be encoded as ADHAK + C */ + offset = (int)(source-args->source - 3); + tempTargetUniChar = PNJ_ADHAK; /* This is necessary to avoid some compiler warnings. */ + WRITE_TO_TARGET_TO_U(args,source,target,args->offsets,offset,tempTargetUniChar,0,err); + WRITE_TO_TARGET_TO_U(args,source,target,args->offsets,offset,data->prevToUnicodeStatus,0,err); + data->prevToUnicodeStatus = 0x0000; /* reset the previous unicode code point */ + *toUnicodeStatus = missingCharMarker; + continue; + } else { + /* Write the previous toUnicodeStatus, this was delayed to handle consonant clustering for Gurmukhi script. */ + if (data->prevToUnicodeStatus) { + WRITE_TO_TARGET_TO_U(args,source,target,args->offsets,(source-args->source -1),data->prevToUnicodeStatus,0,err); + data->prevToUnicodeStatus = 0x0000; + } + /* Check to make sure that Bindi and Tippi are handled correctly for Gurmukhi script. + * If 0xA2 is preceded by a codepoint in the PNJ_BINDI_TIPPI_SET then the target codepoint should be Tippi instead of Bindi. + */ + if (data->currentDeltaToUnicode == PNJ_DELTA && (targetUniChar + PNJ_DELTA) == PNJ_BINDI && isPNJBindiTippi((*toUnicodeStatus + PNJ_DELTA))) { + targetUniChar = PNJ_TIPPI - PNJ_DELTA; + WRITE_TO_TARGET_TO_U(args,source,target,args->offsets,(source-args->source -2),*toUnicodeStatus,PNJ_DELTA,err); + } else if (data->currentDeltaToUnicode == PNJ_DELTA && (targetUniChar + PNJ_DELTA) == PNJ_SIGN_VIRAMA && isPNJConsonant((*toUnicodeStatus + PNJ_DELTA))) { + /* Store the current toUnicodeStatus code point for later handling of consonant cluster in Gurmukhi. */ + data->prevToUnicodeStatus = *toUnicodeStatus + PNJ_DELTA; + } else { + /* write the previously mapped codepoint */ + WRITE_TO_TARGET_TO_U(args,source,target,args->offsets,(source-args->source -2),*toUnicodeStatus,data->currentDeltaToUnicode,err); + } + } + *toUnicodeStatus = missingCharMarker; + } + + if (targetUniChar != missingCharMarker) { + /* now save the targetUniChar for delayed write */ + *toUnicodeStatus = (UChar) targetUniChar; + if (data->resetToDefaultToUnicode==TRUE) { + data->currentDeltaToUnicode = data->defDeltaToUnicode; + data->currentMaskToUnicode = data->defMaskToUnicode; + data->resetToDefaultToUnicode=FALSE; + } + } else { + + /* we reach here only if targetUniChar == missingCharMarker + * so assign codes to reason and err + */ + *err = U_INVALID_CHAR_FOUND; +CALLBACK: + args->converter->toUBytes[0] = (uint8_t) sourceChar; + args->converter->toULength = 1; + break; + } + + } else { + *err =U_BUFFER_OVERFLOW_ERROR; + break; + } + } + + if (U_SUCCESS(*err) && args->flush && source == sourceLimit) { + /* end of the input stream */ + UConverter *cnv = args->converter; + + if (*contextCharToUnicode==ATR || *contextCharToUnicode==EXT || *contextCharToUnicode==ISCII_INV) { + /* set toUBytes[] */ + cnv->toUBytes[0] = (uint8_t)*contextCharToUnicode; + cnv->toULength = 1; + + /* avoid looping on truncated sequences */ + *contextCharToUnicode = NO_CHAR_MARKER; + } else { + cnv->toULength = 0; + } + + if (*toUnicodeStatus != missingCharMarker) { + /* output a remaining target character */ + WRITE_TO_TARGET_TO_U(args,source,target,args->offsets,(source - args->source -1),*toUnicodeStatus,data->currentDeltaToUnicode,err); + *toUnicodeStatus = missingCharMarker; + } + } + + args->target = target; + args->source = source; +} + +/* structure for SafeClone calculations */ +struct cloneISCIIStruct { + UConverter cnv; + UConverterDataISCII mydata; +}; + +static UConverter * U_CALLCONV +_ISCII_SafeClone(const UConverter *cnv, + void *stackBuffer, + int32_t *pBufferSize, + UErrorCode *status) +{ + struct cloneISCIIStruct * localClone; + int32_t bufferSizeNeeded = sizeof(struct cloneISCIIStruct); + + if (U_FAILURE(*status)) { + return 0; + } + + if (*pBufferSize == 0) { /* 'preflighting' request - set needed size into *pBufferSize */ + *pBufferSize = bufferSizeNeeded; + return 0; + } + + localClone = (struct cloneISCIIStruct *)stackBuffer; + /* ucnv.c/ucnv_safeClone() copied the main UConverter already */ + + uprv_memcpy(&localClone->mydata, cnv->extraInfo, sizeof(UConverterDataISCII)); + localClone->cnv.extraInfo = &localClone->mydata; + localClone->cnv.isExtraLocal = TRUE; + + return &localClone->cnv; +} + +static void U_CALLCONV +_ISCIIGetUnicodeSet(const UConverter *cnv, + const USetAdder *sa, + UConverterUnicodeSet which, + UErrorCode *pErrorCode) +{ + (void)cnv; + (void)which; + (void)pErrorCode; + int32_t idx, script; + uint8_t mask; + + /* Since all ISCII versions allow switching to other ISCII + scripts, we add all roundtrippable characters to this set. */ + sa->addRange(sa->set, 0, ASCII_END); + for (script = DEVANAGARI; script <= MALAYALAM; script++) { + mask = (uint8_t)(lookupInitialData[script].maskEnum); + for (idx = 0; idx < DELTA; idx++) { + /* added check for TELUGU character */ + if ((validityTable[idx] & mask) || (script==TELUGU && idx==0x31)) { + sa->add(sa->set, idx + (script * DELTA) + INDIC_BLOCK_BEGIN); + } + } + } + sa->add(sa->set, DANDA); + sa->add(sa->set, DOUBLE_DANDA); + sa->add(sa->set, ZWNJ); + sa->add(sa->set, ZWJ); +} +U_CDECL_END +static const UConverterImpl _ISCIIImpl={ + + UCNV_ISCII, + + NULL, + NULL, + + _ISCIIOpen, + _ISCIIClose, + _ISCIIReset, + + UConverter_toUnicode_ISCII_OFFSETS_LOGIC, + UConverter_toUnicode_ISCII_OFFSETS_LOGIC, + UConverter_fromUnicode_ISCII_OFFSETS_LOGIC, + UConverter_fromUnicode_ISCII_OFFSETS_LOGIC, + NULL, + + NULL, + _ISCIIgetName, + NULL, + _ISCII_SafeClone, + _ISCIIGetUnicodeSet, + NULL, + NULL +}; + +static const UConverterStaticData _ISCIIStaticData={ + sizeof(UConverterStaticData), + "ISCII", + 0, + UCNV_IBM, + UCNV_ISCII, + 1, + 4, + { 0x1a, 0, 0, 0 }, + 0x1, + FALSE, + FALSE, + 0x0, + 0x0, + { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 }, /* reserved */ + +}; + +const UConverterSharedData _ISCIIData= + UCNV_IMMUTABLE_SHARED_DATA_INITIALIZER(&_ISCIIStaticData, &_ISCIIImpl); + +#endif /* #if !UCONFIG_NO_LEGACY_CONVERSION */ diff --git a/Build/source/libs/icu/icu-src/source/common/ucnvlat1.c b/Build/source/libs/icu/icu-src/source/common/ucnvlat1.c deleted file mode 100644 index f17777f066c..00000000000 --- a/Build/source/libs/icu/icu-src/source/common/ucnvlat1.c +++ /dev/null @@ -1,740 +0,0 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. -// License & terms of use: http://www.unicode.org/copyright.html -/* -********************************************************************** -* Copyright (C) 2000-2015, International Business Machines -* Corporation and others. All Rights Reserved. -********************************************************************** -* file name: ucnvlat1.cpp -* encoding: US-ASCII -* tab size: 8 (not used) -* indentation:4 -* -* created on: 2000feb07 -* created by: Markus W. Scherer -*/ - -#include "unicode/utypes.h" - -#if !UCONFIG_NO_CONVERSION - -#include "unicode/ucnv.h" -#include "unicode/uset.h" -#include "unicode/utf8.h" -#include "ucnv_bld.h" -#include "ucnv_cnv.h" - -/* control optimizations according to the platform */ -#define LATIN1_UNROLL_FROM_UNICODE 1 - -/* ISO 8859-1 --------------------------------------------------------------- */ - -/* This is a table-less and callback-less version of ucnv_MBCSSingleToBMPWithOffsets(). */ -static void -_Latin1ToUnicodeWithOffsets(UConverterToUnicodeArgs *pArgs, - UErrorCode *pErrorCode) { - const uint8_t *source; - UChar *target; - int32_t targetCapacity, length; - int32_t *offsets; - - int32_t sourceIndex; - - /* set up the local pointers */ - source=(const uint8_t *)pArgs->source; - target=pArgs->target; - targetCapacity=(int32_t)(pArgs->targetLimit-pArgs->target); - offsets=pArgs->offsets; - - sourceIndex=0; - - /* - * since the conversion here is 1:1 UChar:uint8_t, we need only one counter - * for the minimum of the sourceLength and targetCapacity - */ - length=(int32_t)((const uint8_t *)pArgs->sourceLimit-source); - if(length<=targetCapacity) { - targetCapacity=length; - } else { - /* target will be full */ - *pErrorCode=U_BUFFER_OVERFLOW_ERROR; - length=targetCapacity; - } - - if(targetCapacity>=8) { - /* This loop is unrolled for speed and improved pipelining. */ - int32_t count, loops; - - loops=count=targetCapacity>>3; - length=targetCapacity&=0x7; - do { - target[0]=source[0]; - target[1]=source[1]; - target[2]=source[2]; - target[3]=source[3]; - target[4]=source[4]; - target[5]=source[5]; - target[6]=source[6]; - target[7]=source[7]; - target+=8; - source+=8; - } while(--count>0); - - if(offsets!=NULL) { - do { - offsets[0]=sourceIndex++; - offsets[1]=sourceIndex++; - offsets[2]=sourceIndex++; - offsets[3]=sourceIndex++; - offsets[4]=sourceIndex++; - offsets[5]=sourceIndex++; - offsets[6]=sourceIndex++; - offsets[7]=sourceIndex++; - offsets+=8; - } while(--loops>0); - } - } - - /* conversion loop */ - while(targetCapacity>0) { - *target++=*source++; - --targetCapacity; - } - - /* write back the updated pointers */ - pArgs->source=(const char *)source; - pArgs->target=target; - - /* set offsets */ - if(offsets!=NULL) { - while(length>0) { - *offsets++=sourceIndex++; - --length; - } - pArgs->offsets=offsets; - } -} - -/* This is a table-less and callback-less version of ucnv_MBCSSingleGetNextUChar(). */ -static UChar32 -_Latin1GetNextUChar(UConverterToUnicodeArgs *pArgs, - UErrorCode *pErrorCode) { - const uint8_t *source=(const uint8_t *)pArgs->source; - if(source<(const uint8_t *)pArgs->sourceLimit) { - pArgs->source=(const char *)(source+1); - return *source; - } - - /* no output because of empty input */ - *pErrorCode=U_INDEX_OUTOFBOUNDS_ERROR; - return 0xffff; -} - -/* This is a table-less version of ucnv_MBCSSingleFromBMPWithOffsets(). */ -static void -_Latin1FromUnicodeWithOffsets(UConverterFromUnicodeArgs *pArgs, - UErrorCode *pErrorCode) { - UConverter *cnv; - const UChar *source, *sourceLimit; - uint8_t *target, *oldTarget; - int32_t targetCapacity, length; - int32_t *offsets; - - UChar32 cp; - UChar c, max; - - int32_t sourceIndex; - - /* set up the local pointers */ - cnv=pArgs->converter; - source=pArgs->source; - sourceLimit=pArgs->sourceLimit; - target=oldTarget=(uint8_t *)pArgs->target; - targetCapacity=(int32_t)(pArgs->targetLimit-pArgs->target); - offsets=pArgs->offsets; - - if(cnv->sharedData==&_Latin1Data) { - max=0xff; /* Latin-1 */ - } else { - max=0x7f; /* US-ASCII */ - } - - /* get the converter state from UConverter */ - cp=cnv->fromUChar32; - - /* sourceIndex=-1 if the current character began in the previous buffer */ - sourceIndex= cp==0 ? 0 : -1; - - /* - * since the conversion here is 1:1 UChar:uint8_t, we need only one counter - * for the minimum of the sourceLength and targetCapacity - */ - length=(int32_t)(sourceLimit-source); - if(length0) { - goto getTrail; - } - -#if LATIN1_UNROLL_FROM_UNICODE - /* unroll the loop with the most common case */ - if(targetCapacity>=16) { - int32_t count, loops; - UChar u, oredChars; - - loops=count=targetCapacity>>4; - do { - oredChars=u=*source++; - *target++=(uint8_t)u; - oredChars|=u=*source++; - *target++=(uint8_t)u; - oredChars|=u=*source++; - *target++=(uint8_t)u; - oredChars|=u=*source++; - *target++=(uint8_t)u; - oredChars|=u=*source++; - *target++=(uint8_t)u; - oredChars|=u=*source++; - *target++=(uint8_t)u; - oredChars|=u=*source++; - *target++=(uint8_t)u; - oredChars|=u=*source++; - *target++=(uint8_t)u; - oredChars|=u=*source++; - *target++=(uint8_t)u; - oredChars|=u=*source++; - *target++=(uint8_t)u; - oredChars|=u=*source++; - *target++=(uint8_t)u; - oredChars|=u=*source++; - *target++=(uint8_t)u; - oredChars|=u=*source++; - *target++=(uint8_t)u; - oredChars|=u=*source++; - *target++=(uint8_t)u; - oredChars|=u=*source++; - *target++=(uint8_t)u; - oredChars|=u=*source++; - *target++=(uint8_t)u; - - /* were all 16 entries really valid? */ - if(oredChars>max) { - /* no, return to the first of these 16 */ - source-=16; - target-=16; - break; - } - } while(--count>0); - count=loops-count; - targetCapacity-=16*count; - - if(offsets!=NULL) { - oldTarget+=16*count; - while(count>0) { - *offsets++=sourceIndex++; - *offsets++=sourceIndex++; - *offsets++=sourceIndex++; - *offsets++=sourceIndex++; - *offsets++=sourceIndex++; - *offsets++=sourceIndex++; - *offsets++=sourceIndex++; - *offsets++=sourceIndex++; - *offsets++=sourceIndex++; - *offsets++=sourceIndex++; - *offsets++=sourceIndex++; - *offsets++=sourceIndex++; - *offsets++=sourceIndex++; - *offsets++=sourceIndex++; - *offsets++=sourceIndex++; - *offsets++=sourceIndex++; - --count; - } - } - } -#endif - - /* conversion loop */ - c=0; - while(targetCapacity>0 && (c=*source++)<=max) { - /* convert the Unicode code point */ - *target++=(uint8_t)c; - --targetCapacity; - } - - if(c>max) { - cp=c; - if(!U_IS_SURROGATE(cp)) { - /* callback(unassigned) */ - } else if(U_IS_SURROGATE_LEAD(cp)) { -getTrail: - if(sourcefromUChar32=cp; - goto noMoreInput; - } - } else { - /* this is an unmatched trail code unit (2nd surrogate) */ - /* callback(illegal) */ - } - - *pErrorCode= U_IS_SURROGATE(cp) ? U_ILLEGAL_CHAR_FOUND : U_INVALID_CHAR_FOUND; - cnv->fromUChar32=cp; - } -noMoreInput: - - /* set offsets since the start */ - if(offsets!=NULL) { - size_t count=target-oldTarget; - while(count>0) { - *offsets++=sourceIndex++; - --count; - } - } - - if(U_SUCCESS(*pErrorCode) && source=(uint8_t *)pArgs->targetLimit) { - /* target is full */ - *pErrorCode=U_BUFFER_OVERFLOW_ERROR; - } - - /* write back the updated pointers */ - pArgs->source=source; - pArgs->target=(char *)target; - pArgs->offsets=offsets; -} - -/* Convert UTF-8 to Latin-1. Adapted from ucnv_SBCSFromUTF8(). */ -static void -ucnv_Latin1FromUTF8(UConverterFromUnicodeArgs *pFromUArgs, - UConverterToUnicodeArgs *pToUArgs, - UErrorCode *pErrorCode) { - UConverter *utf8; - const uint8_t *source, *sourceLimit; - uint8_t *target; - int32_t targetCapacity; - - UChar32 c; - uint8_t b, t1; - - /* set up the local pointers */ - utf8=pToUArgs->converter; - source=(uint8_t *)pToUArgs->source; - sourceLimit=(uint8_t *)pToUArgs->sourceLimit; - target=(uint8_t *)pFromUArgs->target; - targetCapacity=(int32_t)(pFromUArgs->targetLimit-pFromUArgs->target); - - /* get the converter state from the UTF-8 UConverter */ - c=(UChar32)utf8->toUnicodeStatus; - if(c!=0 && source=0xc2 && c<=0xc3 && (t1=(uint8_t)(*source-0x80)) <= 0x3f) { - ++source; - *target++=(uint8_t)(((c&3)<<6)|t1); - --targetCapacity; - - utf8->toUnicodeStatus=0; - utf8->toULength=0; - } else { - /* complicated, illegal or unmappable input: fall back to the pivoting implementation */ - *pErrorCode=U_USING_DEFAULT_WARNING; - return; - } - } - - /* - * Make sure that the last byte sequence before sourceLimit is complete - * or runs into a lead byte. - * In the conversion loop compare source with sourceLimit only once - * per multi-byte character. - * For Latin-1, adjust sourceLimit only for 1 trail byte because - * the conversion loop handles at most 2-byte sequences. - */ - if(source0) { - b=*source++; - if((int8_t)b>=0) { - /* convert ASCII */ - *target++=(uint8_t)b; - --targetCapacity; - } else if( /* handle U+0080..U+00FF inline */ - b>=0xc2 && b<=0xc3 && - (t1=(uint8_t)(*source-0x80)) <= 0x3f - ) { - ++source; - *target++=(uint8_t)(((b&3)<<6)|t1); - --targetCapacity; - } else { - /* complicated, illegal or unmappable input: fall back to the pivoting implementation */ - pToUArgs->source=(char *)(source-1); - pFromUArgs->target=(char *)target; - *pErrorCode=U_USING_DEFAULT_WARNING; - return; - } - } else { - /* target is full */ - *pErrorCode=U_BUFFER_OVERFLOW_ERROR; - break; - } - } - - /* - * The sourceLimit may have been adjusted before the conversion loop - * to stop before a truncated sequence. - * If so, then collect the truncated sequence now. - * For Latin-1, there is at most exactly one lead byte because of the - * smaller sourceLimit adjustment logic. - */ - if(U_SUCCESS(*pErrorCode) && source<(sourceLimit=(uint8_t *)pToUArgs->sourceLimit)) { - utf8->toUnicodeStatus=utf8->toUBytes[0]=b=*source++; - utf8->toULength=1; - utf8->mode=U8_COUNT_TRAIL_BYTES(b)+1; - } - - /* write back the updated pointers */ - pToUArgs->source=(char *)source; - pFromUArgs->target=(char *)target; -} - -static void -_Latin1GetUnicodeSet(const UConverter *cnv, - const USetAdder *sa, - UConverterUnicodeSet which, - UErrorCode *pErrorCode) { - sa->addRange(sa->set, 0, 0xff); -} - -static const UConverterImpl _Latin1Impl={ - UCNV_LATIN_1, - - NULL, - NULL, - - NULL, - NULL, - NULL, - - _Latin1ToUnicodeWithOffsets, - _Latin1ToUnicodeWithOffsets, - _Latin1FromUnicodeWithOffsets, - _Latin1FromUnicodeWithOffsets, - _Latin1GetNextUChar, - - NULL, - NULL, - NULL, - NULL, - _Latin1GetUnicodeSet, - - NULL, - ucnv_Latin1FromUTF8 -}; - -static const UConverterStaticData _Latin1StaticData={ - sizeof(UConverterStaticData), - "ISO-8859-1", - 819, UCNV_IBM, UCNV_LATIN_1, 1, 1, - { 0x1a, 0, 0, 0 }, 1, FALSE, FALSE, - 0, - 0, - { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 } /* reserved */ -}; - -const UConverterSharedData _Latin1Data= - UCNV_IMMUTABLE_SHARED_DATA_INITIALIZER(&_Latin1StaticData, &_Latin1Impl); - -/* US-ASCII ----------------------------------------------------------------- */ - -/* This is a table-less version of ucnv_MBCSSingleToBMPWithOffsets(). */ -static void -_ASCIIToUnicodeWithOffsets(UConverterToUnicodeArgs *pArgs, - UErrorCode *pErrorCode) { - const uint8_t *source, *sourceLimit; - UChar *target, *oldTarget; - int32_t targetCapacity, length; - int32_t *offsets; - - int32_t sourceIndex; - - uint8_t c; - - /* set up the local pointers */ - source=(const uint8_t *)pArgs->source; - sourceLimit=(const uint8_t *)pArgs->sourceLimit; - target=oldTarget=pArgs->target; - targetCapacity=(int32_t)(pArgs->targetLimit-pArgs->target); - offsets=pArgs->offsets; - - /* sourceIndex=-1 if the current character began in the previous buffer */ - sourceIndex=0; - - /* - * since the conversion here is 1:1 UChar:uint8_t, we need only one counter - * for the minimum of the sourceLength and targetCapacity - */ - length=(int32_t)(sourceLimit-source); - if(length=8) { - /* This loop is unrolled for speed and improved pipelining. */ - int32_t count, loops; - UChar oredChars; - - loops=count=targetCapacity>>3; - do { - oredChars=target[0]=source[0]; - oredChars|=target[1]=source[1]; - oredChars|=target[2]=source[2]; - oredChars|=target[3]=source[3]; - oredChars|=target[4]=source[4]; - oredChars|=target[5]=source[5]; - oredChars|=target[6]=source[6]; - oredChars|=target[7]=source[7]; - - /* were all 16 entries really valid? */ - if(oredChars>0x7f) { - /* no, return to the first of these 16 */ - break; - } - source+=8; - target+=8; - } while(--count>0); - count=loops-count; - targetCapacity-=count*8; - - if(offsets!=NULL) { - oldTarget+=count*8; - while(count>0) { - offsets[0]=sourceIndex++; - offsets[1]=sourceIndex++; - offsets[2]=sourceIndex++; - offsets[3]=sourceIndex++; - offsets[4]=sourceIndex++; - offsets[5]=sourceIndex++; - offsets[6]=sourceIndex++; - offsets[7]=sourceIndex++; - offsets+=8; - --count; - } - } - } - - /* conversion loop */ - c=0; - while(targetCapacity>0 && (c=*source++)<=0x7f) { - *target++=c; - --targetCapacity; - } - - if(c>0x7f) { - /* callback(illegal); copy the current bytes to toUBytes[] */ - UConverter *cnv=pArgs->converter; - cnv->toUBytes[0]=c; - cnv->toULength=1; - *pErrorCode=U_ILLEGAL_CHAR_FOUND; - } else if(source=pArgs->targetLimit) { - /* target is full */ - *pErrorCode=U_BUFFER_OVERFLOW_ERROR; - } - - /* set offsets since the start */ - if(offsets!=NULL) { - size_t count=target-oldTarget; - while(count>0) { - *offsets++=sourceIndex++; - --count; - } - } - - /* write back the updated pointers */ - pArgs->source=(const char *)source; - pArgs->target=target; - pArgs->offsets=offsets; -} - -/* This is a table-less version of ucnv_MBCSSingleGetNextUChar(). */ -static UChar32 -_ASCIIGetNextUChar(UConverterToUnicodeArgs *pArgs, - UErrorCode *pErrorCode) { - const uint8_t *source; - uint8_t b; - - source=(const uint8_t *)pArgs->source; - if(source<(const uint8_t *)pArgs->sourceLimit) { - b=*source++; - pArgs->source=(const char *)source; - if(b<=0x7f) { - return b; - } else { - UConverter *cnv=pArgs->converter; - cnv->toUBytes[0]=b; - cnv->toULength=1; - *pErrorCode=U_ILLEGAL_CHAR_FOUND; - return 0xffff; - } - } - - /* no output because of empty input */ - *pErrorCode=U_INDEX_OUTOFBOUNDS_ERROR; - return 0xffff; -} - -/* "Convert" UTF-8 to US-ASCII: Validate and copy. */ -static void -ucnv_ASCIIFromUTF8(UConverterFromUnicodeArgs *pFromUArgs, - UConverterToUnicodeArgs *pToUArgs, - UErrorCode *pErrorCode) { - const uint8_t *source, *sourceLimit; - uint8_t *target; - int32_t targetCapacity, length; - - uint8_t c; - - if(pToUArgs->converter->toUnicodeStatus!=0) { - /* no handling of partial UTF-8 characters here, fall back to pivoting */ - *pErrorCode=U_USING_DEFAULT_WARNING; - return; - } - - /* set up the local pointers */ - source=(const uint8_t *)pToUArgs->source; - sourceLimit=(const uint8_t *)pToUArgs->sourceLimit; - target=(uint8_t *)pFromUArgs->target; - targetCapacity=(int32_t)(pFromUArgs->targetLimit-pFromUArgs->target); - - /* - * since the conversion here is 1:1 uint8_t:uint8_t, we need only one counter - * for the minimum of the sourceLength and targetCapacity - */ - length=(int32_t)(sourceLimit-source); - if(length=16) { - int32_t count, loops; - uint8_t oredChars; - - loops=count=targetCapacity>>4; - do { - oredChars=*target++=*source++; - oredChars|=*target++=*source++; - oredChars|=*target++=*source++; - oredChars|=*target++=*source++; - oredChars|=*target++=*source++; - oredChars|=*target++=*source++; - oredChars|=*target++=*source++; - oredChars|=*target++=*source++; - oredChars|=*target++=*source++; - oredChars|=*target++=*source++; - oredChars|=*target++=*source++; - oredChars|=*target++=*source++; - oredChars|=*target++=*source++; - oredChars|=*target++=*source++; - oredChars|=*target++=*source++; - oredChars|=*target++=*source++; - - /* were all 16 entries really valid? */ - if(oredChars>0x7f) { - /* no, return to the first of these 16 */ - source-=16; - target-=16; - break; - } - } while(--count>0); - count=loops-count; - targetCapacity-=16*count; - } - - /* conversion loop */ - c=0; - while(targetCapacity>0 && (c=*source)<=0x7f) { - ++source; - *target++=c; - --targetCapacity; - } - - if(c>0x7f) { - /* non-ASCII character, handle in standard converter */ - *pErrorCode=U_USING_DEFAULT_WARNING; - } else if(source=(const uint8_t *)pFromUArgs->targetLimit) { - /* target is full */ - *pErrorCode=U_BUFFER_OVERFLOW_ERROR; - } - - /* write back the updated pointers */ - pToUArgs->source=(const char *)source; - pFromUArgs->target=(char *)target; -} - -static void -_ASCIIGetUnicodeSet(const UConverter *cnv, - const USetAdder *sa, - UConverterUnicodeSet which, - UErrorCode *pErrorCode) { - sa->addRange(sa->set, 0, 0x7f); -} - -static const UConverterImpl _ASCIIImpl={ - UCNV_US_ASCII, - - NULL, - NULL, - - NULL, - NULL, - NULL, - - _ASCIIToUnicodeWithOffsets, - _ASCIIToUnicodeWithOffsets, - _Latin1FromUnicodeWithOffsets, - _Latin1FromUnicodeWithOffsets, - _ASCIIGetNextUChar, - - NULL, - NULL, - NULL, - NULL, - _ASCIIGetUnicodeSet, - - NULL, - ucnv_ASCIIFromUTF8 -}; - -static const UConverterStaticData _ASCIIStaticData={ - sizeof(UConverterStaticData), - "US-ASCII", - 367, UCNV_IBM, UCNV_US_ASCII, 1, 1, - { 0x1a, 0, 0, 0 }, 1, FALSE, FALSE, - 0, - 0, - { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 } /* reserved */ -}; - -const UConverterSharedData _ASCIIData= - UCNV_IMMUTABLE_SHARED_DATA_INITIALIZER(&_ASCIIStaticData, &_ASCIIImpl); - -#endif diff --git a/Build/source/libs/icu/icu-src/source/common/ucnvlat1.cpp b/Build/source/libs/icu/icu-src/source/common/ucnvlat1.cpp new file mode 100644 index 00000000000..23e918afe7a --- /dev/null +++ b/Build/source/libs/icu/icu-src/source/common/ucnvlat1.cpp @@ -0,0 +1,752 @@ +// © 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html +/* +********************************************************************** +* Copyright (C) 2000-2015, International Business Machines +* Corporation and others. All Rights Reserved. +********************************************************************** +* file name: ucnvlat1.cpp +* encoding: UTF-8 +* tab size: 8 (not used) +* indentation:4 +* +* created on: 2000feb07 +* created by: Markus W. Scherer +*/ + +#include "unicode/utypes.h" + +#if !UCONFIG_NO_CONVERSION + +#include "unicode/ucnv.h" +#include "unicode/uset.h" +#include "unicode/utf8.h" +#include "ucnv_bld.h" +#include "ucnv_cnv.h" +#include "ustr_imp.h" + +/* control optimizations according to the platform */ +#define LATIN1_UNROLL_FROM_UNICODE 1 + +/* ISO 8859-1 --------------------------------------------------------------- */ + +/* This is a table-less and callback-less version of ucnv_MBCSSingleToBMPWithOffsets(). */ +U_CDECL_BEGIN +static void U_CALLCONV +_Latin1ToUnicodeWithOffsets(UConverterToUnicodeArgs *pArgs, + UErrorCode *pErrorCode) { + const uint8_t *source; + UChar *target; + int32_t targetCapacity, length; + int32_t *offsets; + + int32_t sourceIndex; + + /* set up the local pointers */ + source=(const uint8_t *)pArgs->source; + target=pArgs->target; + targetCapacity=(int32_t)(pArgs->targetLimit-pArgs->target); + offsets=pArgs->offsets; + + sourceIndex=0; + + /* + * since the conversion here is 1:1 UChar:uint8_t, we need only one counter + * for the minimum of the sourceLength and targetCapacity + */ + length=(int32_t)((const uint8_t *)pArgs->sourceLimit-source); + if(length<=targetCapacity) { + targetCapacity=length; + } else { + /* target will be full */ + *pErrorCode=U_BUFFER_OVERFLOW_ERROR; + length=targetCapacity; + } + + if(targetCapacity>=8) { + /* This loop is unrolled for speed and improved pipelining. */ + int32_t count, loops; + + loops=count=targetCapacity>>3; + length=targetCapacity&=0x7; + do { + target[0]=source[0]; + target[1]=source[1]; + target[2]=source[2]; + target[3]=source[3]; + target[4]=source[4]; + target[5]=source[5]; + target[6]=source[6]; + target[7]=source[7]; + target+=8; + source+=8; + } while(--count>0); + + if(offsets!=NULL) { + do { + offsets[0]=sourceIndex++; + offsets[1]=sourceIndex++; + offsets[2]=sourceIndex++; + offsets[3]=sourceIndex++; + offsets[4]=sourceIndex++; + offsets[5]=sourceIndex++; + offsets[6]=sourceIndex++; + offsets[7]=sourceIndex++; + offsets+=8; + } while(--loops>0); + } + } + + /* conversion loop */ + while(targetCapacity>0) { + *target++=*source++; + --targetCapacity; + } + + /* write back the updated pointers */ + pArgs->source=(const char *)source; + pArgs->target=target; + + /* set offsets */ + if(offsets!=NULL) { + while(length>0) { + *offsets++=sourceIndex++; + --length; + } + pArgs->offsets=offsets; + } +} + +/* This is a table-less and callback-less version of ucnv_MBCSSingleGetNextUChar(). */ +static UChar32 U_CALLCONV +_Latin1GetNextUChar(UConverterToUnicodeArgs *pArgs, + UErrorCode *pErrorCode) { + const uint8_t *source=(const uint8_t *)pArgs->source; + if(source<(const uint8_t *)pArgs->sourceLimit) { + pArgs->source=(const char *)(source+1); + return *source; + } + + /* no output because of empty input */ + *pErrorCode=U_INDEX_OUTOFBOUNDS_ERROR; + return 0xffff; +} + +/* This is a table-less version of ucnv_MBCSSingleFromBMPWithOffsets(). */ +static void U_CALLCONV +_Latin1FromUnicodeWithOffsets(UConverterFromUnicodeArgs *pArgs, + UErrorCode *pErrorCode) { + UConverter *cnv; + const UChar *source, *sourceLimit; + uint8_t *target, *oldTarget; + int32_t targetCapacity, length; + int32_t *offsets; + + UChar32 cp; + UChar c, max; + + int32_t sourceIndex; + + /* set up the local pointers */ + cnv=pArgs->converter; + source=pArgs->source; + sourceLimit=pArgs->sourceLimit; + target=oldTarget=(uint8_t *)pArgs->target; + targetCapacity=(int32_t)(pArgs->targetLimit-pArgs->target); + offsets=pArgs->offsets; + + if(cnv->sharedData==&_Latin1Data) { + max=0xff; /* Latin-1 */ + } else { + max=0x7f; /* US-ASCII */ + } + + /* get the converter state from UConverter */ + cp=cnv->fromUChar32; + + /* sourceIndex=-1 if the current character began in the previous buffer */ + sourceIndex= cp==0 ? 0 : -1; + + /* + * since the conversion here is 1:1 UChar:uint8_t, we need only one counter + * for the minimum of the sourceLength and targetCapacity + */ + length=(int32_t)(sourceLimit-source); + if(length0) { + goto getTrail; + } + +#if LATIN1_UNROLL_FROM_UNICODE + /* unroll the loop with the most common case */ + if(targetCapacity>=16) { + int32_t count, loops; + UChar u, oredChars; + + loops=count=targetCapacity>>4; + do { + oredChars=u=*source++; + *target++=(uint8_t)u; + oredChars|=u=*source++; + *target++=(uint8_t)u; + oredChars|=u=*source++; + *target++=(uint8_t)u; + oredChars|=u=*source++; + *target++=(uint8_t)u; + oredChars|=u=*source++; + *target++=(uint8_t)u; + oredChars|=u=*source++; + *target++=(uint8_t)u; + oredChars|=u=*source++; + *target++=(uint8_t)u; + oredChars|=u=*source++; + *target++=(uint8_t)u; + oredChars|=u=*source++; + *target++=(uint8_t)u; + oredChars|=u=*source++; + *target++=(uint8_t)u; + oredChars|=u=*source++; + *target++=(uint8_t)u; + oredChars|=u=*source++; + *target++=(uint8_t)u; + oredChars|=u=*source++; + *target++=(uint8_t)u; + oredChars|=u=*source++; + *target++=(uint8_t)u; + oredChars|=u=*source++; + *target++=(uint8_t)u; + oredChars|=u=*source++; + *target++=(uint8_t)u; + + /* were all 16 entries really valid? */ + if(oredChars>max) { + /* no, return to the first of these 16 */ + source-=16; + target-=16; + break; + } + } while(--count>0); + count=loops-count; + targetCapacity-=16*count; + + if(offsets!=NULL) { + oldTarget+=16*count; + while(count>0) { + *offsets++=sourceIndex++; + *offsets++=sourceIndex++; + *offsets++=sourceIndex++; + *offsets++=sourceIndex++; + *offsets++=sourceIndex++; + *offsets++=sourceIndex++; + *offsets++=sourceIndex++; + *offsets++=sourceIndex++; + *offsets++=sourceIndex++; + *offsets++=sourceIndex++; + *offsets++=sourceIndex++; + *offsets++=sourceIndex++; + *offsets++=sourceIndex++; + *offsets++=sourceIndex++; + *offsets++=sourceIndex++; + *offsets++=sourceIndex++; + --count; + } + } + } +#endif + + /* conversion loop */ + c=0; + while(targetCapacity>0 && (c=*source++)<=max) { + /* convert the Unicode code point */ + *target++=(uint8_t)c; + --targetCapacity; + } + + if(c>max) { + cp=c; + if(!U_IS_SURROGATE(cp)) { + /* callback(unassigned) */ + } else if(U_IS_SURROGATE_LEAD(cp)) { +getTrail: + if(sourcefromUChar32=cp; + goto noMoreInput; + } + } else { + /* this is an unmatched trail code unit (2nd surrogate) */ + /* callback(illegal) */ + } + + *pErrorCode= U_IS_SURROGATE(cp) ? U_ILLEGAL_CHAR_FOUND : U_INVALID_CHAR_FOUND; + cnv->fromUChar32=cp; + } +noMoreInput: + + /* set offsets since the start */ + if(offsets!=NULL) { + size_t count=target-oldTarget; + while(count>0) { + *offsets++=sourceIndex++; + --count; + } + } + + if(U_SUCCESS(*pErrorCode) && source=(uint8_t *)pArgs->targetLimit) { + /* target is full */ + *pErrorCode=U_BUFFER_OVERFLOW_ERROR; + } + + /* write back the updated pointers */ + pArgs->source=source; + pArgs->target=(char *)target; + pArgs->offsets=offsets; +} + +/* Convert UTF-8 to Latin-1. Adapted from ucnv_SBCSFromUTF8(). */ +static void U_CALLCONV +ucnv_Latin1FromUTF8(UConverterFromUnicodeArgs *pFromUArgs, + UConverterToUnicodeArgs *pToUArgs, + UErrorCode *pErrorCode) { + UConverter *utf8; + const uint8_t *source, *sourceLimit; + uint8_t *target; + int32_t targetCapacity; + + UChar32 c; + uint8_t b, t1; + + /* set up the local pointers */ + utf8=pToUArgs->converter; + source=(uint8_t *)pToUArgs->source; + sourceLimit=(uint8_t *)pToUArgs->sourceLimit; + target=(uint8_t *)pFromUArgs->target; + targetCapacity=(int32_t)(pFromUArgs->targetLimit-pFromUArgs->target); + + /* get the converter state from the UTF-8 UConverter */ + c=(UChar32)utf8->toUnicodeStatus; + if(c!=0 && source=0xc2 && c<=0xc3 && (t1=(uint8_t)(*source-0x80)) <= 0x3f) { + ++source; + *target++=(uint8_t)(((c&3)<<6)|t1); + --targetCapacity; + + utf8->toUnicodeStatus=0; + utf8->toULength=0; + } else { + /* complicated, illegal or unmappable input: fall back to the pivoting implementation */ + *pErrorCode=U_USING_DEFAULT_WARNING; + return; + } + } + + /* + * Make sure that the last byte sequence before sourceLimit is complete + * or runs into a lead byte. + * In the conversion loop compare source with sourceLimit only once + * per multi-byte character. + * For Latin-1, adjust sourceLimit only for 1 trail byte because + * the conversion loop handles at most 2-byte sequences. + */ + if(source0) { + b=*source++; + if(U8_IS_SINGLE(b)) { + /* convert ASCII */ + *target++=(uint8_t)b; + --targetCapacity; + } else if( /* handle U+0080..U+00FF inline */ + b>=0xc2 && b<=0xc3 && + (t1=(uint8_t)(*source-0x80)) <= 0x3f + ) { + ++source; + *target++=(uint8_t)(((b&3)<<6)|t1); + --targetCapacity; + } else { + /* complicated, illegal or unmappable input: fall back to the pivoting implementation */ + pToUArgs->source=(char *)(source-1); + pFromUArgs->target=(char *)target; + *pErrorCode=U_USING_DEFAULT_WARNING; + return; + } + } else { + /* target is full */ + *pErrorCode=U_BUFFER_OVERFLOW_ERROR; + break; + } + } + + /* + * The sourceLimit may have been adjusted before the conversion loop + * to stop before a truncated sequence. + * If so, then collect the truncated sequence now. + * For Latin-1, there is at most exactly one lead byte because of the + * smaller sourceLimit adjustment logic. + */ + if(U_SUCCESS(*pErrorCode) && source<(sourceLimit=(uint8_t *)pToUArgs->sourceLimit)) { + utf8->toUnicodeStatus=utf8->toUBytes[0]=b=*source++; + utf8->toULength=1; + utf8->mode=U8_COUNT_BYTES(b); + } + + /* write back the updated pointers */ + pToUArgs->source=(char *)source; + pFromUArgs->target=(char *)target; +} + +static void U_CALLCONV +_Latin1GetUnicodeSet(const UConverter *cnv, + const USetAdder *sa, + UConverterUnicodeSet which, + UErrorCode *pErrorCode) { + (void)cnv; + (void)which; + (void)pErrorCode; + sa->addRange(sa->set, 0, 0xff); +} +U_CDECL_END + + +static const UConverterImpl _Latin1Impl={ + UCNV_LATIN_1, + + NULL, + NULL, + + NULL, + NULL, + NULL, + + _Latin1ToUnicodeWithOffsets, + _Latin1ToUnicodeWithOffsets, + _Latin1FromUnicodeWithOffsets, + _Latin1FromUnicodeWithOffsets, + _Latin1GetNextUChar, + + NULL, + NULL, + NULL, + NULL, + _Latin1GetUnicodeSet, + + NULL, + ucnv_Latin1FromUTF8 +}; + +static const UConverterStaticData _Latin1StaticData={ + sizeof(UConverterStaticData), + "ISO-8859-1", + 819, UCNV_IBM, UCNV_LATIN_1, 1, 1, + { 0x1a, 0, 0, 0 }, 1, FALSE, FALSE, + 0, + 0, + { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 } /* reserved */ +}; + +const UConverterSharedData _Latin1Data= + UCNV_IMMUTABLE_SHARED_DATA_INITIALIZER(&_Latin1StaticData, &_Latin1Impl); + +/* US-ASCII ----------------------------------------------------------------- */ + +U_CDECL_BEGIN +/* This is a table-less version of ucnv_MBCSSingleToBMPWithOffsets(). */ +static void U_CALLCONV +_ASCIIToUnicodeWithOffsets(UConverterToUnicodeArgs *pArgs, + UErrorCode *pErrorCode) { + const uint8_t *source, *sourceLimit; + UChar *target, *oldTarget; + int32_t targetCapacity, length; + int32_t *offsets; + + int32_t sourceIndex; + + uint8_t c; + + /* set up the local pointers */ + source=(const uint8_t *)pArgs->source; + sourceLimit=(const uint8_t *)pArgs->sourceLimit; + target=oldTarget=pArgs->target; + targetCapacity=(int32_t)(pArgs->targetLimit-pArgs->target); + offsets=pArgs->offsets; + + /* sourceIndex=-1 if the current character began in the previous buffer */ + sourceIndex=0; + + /* + * since the conversion here is 1:1 UChar:uint8_t, we need only one counter + * for the minimum of the sourceLength and targetCapacity + */ + length=(int32_t)(sourceLimit-source); + if(length=8) { + /* This loop is unrolled for speed and improved pipelining. */ + int32_t count, loops; + UChar oredChars; + + loops=count=targetCapacity>>3; + do { + oredChars=target[0]=source[0]; + oredChars|=target[1]=source[1]; + oredChars|=target[2]=source[2]; + oredChars|=target[3]=source[3]; + oredChars|=target[4]=source[4]; + oredChars|=target[5]=source[5]; + oredChars|=target[6]=source[6]; + oredChars|=target[7]=source[7]; + + /* were all 16 entries really valid? */ + if(oredChars>0x7f) { + /* no, return to the first of these 16 */ + break; + } + source+=8; + target+=8; + } while(--count>0); + count=loops-count; + targetCapacity-=count*8; + + if(offsets!=NULL) { + oldTarget+=count*8; + while(count>0) { + offsets[0]=sourceIndex++; + offsets[1]=sourceIndex++; + offsets[2]=sourceIndex++; + offsets[3]=sourceIndex++; + offsets[4]=sourceIndex++; + offsets[5]=sourceIndex++; + offsets[6]=sourceIndex++; + offsets[7]=sourceIndex++; + offsets+=8; + --count; + } + } + } + + /* conversion loop */ + c=0; + while(targetCapacity>0 && (c=*source++)<=0x7f) { + *target++=c; + --targetCapacity; + } + + if(c>0x7f) { + /* callback(illegal); copy the current bytes to toUBytes[] */ + UConverter *cnv=pArgs->converter; + cnv->toUBytes[0]=c; + cnv->toULength=1; + *pErrorCode=U_ILLEGAL_CHAR_FOUND; + } else if(source=pArgs->targetLimit) { + /* target is full */ + *pErrorCode=U_BUFFER_OVERFLOW_ERROR; + } + + /* set offsets since the start */ + if(offsets!=NULL) { + size_t count=target-oldTarget; + while(count>0) { + *offsets++=sourceIndex++; + --count; + } + } + + /* write back the updated pointers */ + pArgs->source=(const char *)source; + pArgs->target=target; + pArgs->offsets=offsets; +} + +/* This is a table-less version of ucnv_MBCSSingleGetNextUChar(). */ +static UChar32 U_CALLCONV +_ASCIIGetNextUChar(UConverterToUnicodeArgs *pArgs, + UErrorCode *pErrorCode) { + const uint8_t *source; + uint8_t b; + + source=(const uint8_t *)pArgs->source; + if(source<(const uint8_t *)pArgs->sourceLimit) { + b=*source++; + pArgs->source=(const char *)source; + if(b<=0x7f) { + return b; + } else { + UConverter *cnv=pArgs->converter; + cnv->toUBytes[0]=b; + cnv->toULength=1; + *pErrorCode=U_ILLEGAL_CHAR_FOUND; + return 0xffff; + } + } + + /* no output because of empty input */ + *pErrorCode=U_INDEX_OUTOFBOUNDS_ERROR; + return 0xffff; +} + +/* "Convert" UTF-8 to US-ASCII: Validate and copy. */ +static void U_CALLCONV +ucnv_ASCIIFromUTF8(UConverterFromUnicodeArgs *pFromUArgs, + UConverterToUnicodeArgs *pToUArgs, + UErrorCode *pErrorCode) { + const uint8_t *source, *sourceLimit; + uint8_t *target; + int32_t targetCapacity, length; + + uint8_t c; + + if(pToUArgs->converter->toUnicodeStatus!=0) { + /* no handling of partial UTF-8 characters here, fall back to pivoting */ + *pErrorCode=U_USING_DEFAULT_WARNING; + return; + } + + /* set up the local pointers */ + source=(const uint8_t *)pToUArgs->source; + sourceLimit=(const uint8_t *)pToUArgs->sourceLimit; + target=(uint8_t *)pFromUArgs->target; + targetCapacity=(int32_t)(pFromUArgs->targetLimit-pFromUArgs->target); + + /* + * since the conversion here is 1:1 uint8_t:uint8_t, we need only one counter + * for the minimum of the sourceLength and targetCapacity + */ + length=(int32_t)(sourceLimit-source); + if(length=16) { + int32_t count, loops; + uint8_t oredChars; + + loops=count=targetCapacity>>4; + do { + oredChars=*target++=*source++; + oredChars|=*target++=*source++; + oredChars|=*target++=*source++; + oredChars|=*target++=*source++; + oredChars|=*target++=*source++; + oredChars|=*target++=*source++; + oredChars|=*target++=*source++; + oredChars|=*target++=*source++; + oredChars|=*target++=*source++; + oredChars|=*target++=*source++; + oredChars|=*target++=*source++; + oredChars|=*target++=*source++; + oredChars|=*target++=*source++; + oredChars|=*target++=*source++; + oredChars|=*target++=*source++; + oredChars|=*target++=*source++; + + /* were all 16 entries really valid? */ + if(oredChars>0x7f) { + /* no, return to the first of these 16 */ + source-=16; + target-=16; + break; + } + } while(--count>0); + count=loops-count; + targetCapacity-=16*count; + } + + /* conversion loop */ + c=0; + while(targetCapacity>0 && (c=*source)<=0x7f) { + ++source; + *target++=c; + --targetCapacity; + } + + if(c>0x7f) { + /* non-ASCII character, handle in standard converter */ + *pErrorCode=U_USING_DEFAULT_WARNING; + } else if(source=(const uint8_t *)pFromUArgs->targetLimit) { + /* target is full */ + *pErrorCode=U_BUFFER_OVERFLOW_ERROR; + } + + /* write back the updated pointers */ + pToUArgs->source=(const char *)source; + pFromUArgs->target=(char *)target; +} + +static void U_CALLCONV +_ASCIIGetUnicodeSet(const UConverter *cnv, + const USetAdder *sa, + UConverterUnicodeSet which, + UErrorCode *pErrorCode) { + (void)cnv; + (void)which; + (void)pErrorCode; + sa->addRange(sa->set, 0, 0x7f); +} +U_CDECL_END + +static const UConverterImpl _ASCIIImpl={ + UCNV_US_ASCII, + + NULL, + NULL, + + NULL, + NULL, + NULL, + + _ASCIIToUnicodeWithOffsets, + _ASCIIToUnicodeWithOffsets, + _Latin1FromUnicodeWithOffsets, + _Latin1FromUnicodeWithOffsets, + _ASCIIGetNextUChar, + + NULL, + NULL, + NULL, + NULL, + _ASCIIGetUnicodeSet, + + NULL, + ucnv_ASCIIFromUTF8 +}; + +static const UConverterStaticData _ASCIIStaticData={ + sizeof(UConverterStaticData), + "US-ASCII", + 367, UCNV_IBM, UCNV_US_ASCII, 1, 1, + { 0x1a, 0, 0, 0 }, 1, FALSE, FALSE, + 0, + 0, + { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 } /* reserved */ +}; + +const UConverterSharedData _ASCIIData= + UCNV_IMMUTABLE_SHARED_DATA_INITIALIZER(&_ASCIIStaticData, &_ASCIIImpl); + +#endif diff --git a/Build/source/libs/icu/icu-src/source/common/ucnvmbcs.cpp b/Build/source/libs/icu/icu-src/source/common/ucnvmbcs.cpp index ffbb9af7c46..4b36cc605b1 100644 --- a/Build/source/libs/icu/icu-src/source/common/ucnvmbcs.cpp +++ b/Build/source/libs/icu/icu-src/source/common/ucnvmbcs.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ****************************************************************************** @@ -8,7 +8,7 @@ * ****************************************************************************** * file name: ucnvmbcs.cpp -* encoding: US-ASCII +* encoding: UTF-8 * tab size: 8 (not used) * indentation:4 * @@ -59,6 +59,7 @@ #include "cmemory.h" #include "cstring.h" #include "umutex.h" +#include "ustr_imp.h" /* control optimizations according to the platform */ #define MBCS_UNROLL_SINGLE_TO_BMP 1 @@ -5011,13 +5012,9 @@ ucnv_MBCSSingleFromUChar32(UConverterSharedData *sharedData, /* MBCS-from-UTF-8 conversion functions ------------------------------------- */ -/* minimum code point values for n-byte UTF-8 sequences, n=0..4 */ -static const UChar32 -utf8_minLegal[5]={ 0, 0, 0x80, 0x800, 0x10000 }; - /* offsets for n-byte UTF-8 sequences that were calculated with ((lead<<6)+trail)<<6+trail... */ static const UChar32 -utf8_offsets[7]={ 0, 0, 0x3080, 0xE2080, 0x3C82080 }; +utf8_offsets[5]={ 0, 0, 0x3080, 0xE2080, 0x3C82080 }; static void U_CALLCONV ucnv_SBCSFromUTF8(UConverterFromUnicodeArgs *pFromUArgs, @@ -5037,7 +5034,7 @@ ucnv_SBCSFromUTF8(UConverterFromUnicodeArgs *pFromUArgs, uint8_t b, t1, t2; uint32_t asciiRoundtrips; - uint16_t value, minValue; + uint16_t value, minValue = 0; UBool hasSupplementary; /* set up the local pointers */ @@ -5075,28 +5072,27 @@ ucnv_SBCSFromUTF8(UConverterFromUnicodeArgs *pFromUArgs, toULength=oldToULength=toULimit=0; } - /* - * Make sure that the last byte sequence before sourceLimit is complete - * or runs into a lead byte. - * Do not go back into the bytes that will be read for finishing a partial - * sequence from the previous buffer. - * In the conversion loop compare source with sourceLimit only once - * per multi-byte character. - */ + // The conversion loop checks source0) { + uint8_t b1=*(sourceLimit-1); + if(U8_IS_SINGLE(b1)) { + // common ASCII character + } else if(U8_IS_TRAIL(b1) && length>=2) { + uint8_t b2=*(sourceLimit-2); + if(0xe0<=b2 && b2<0xf0 && U8_IS_VALID_LEAD3_AND_T1(b2, b1)) { + // truncated 3-byte sequence + sourceLimit-=2; } - break; + } else if(0xc2<=b1 && b1<0xf0) { + // truncated 2- or 3-byte sequence + --sourceLimit; } } } @@ -5130,7 +5126,7 @@ ucnv_SBCSFromUTF8(UConverterFromUnicodeArgs *pFromUArgs, while(source0) { b=*source++; - if((int8_t)b>=0) { + if(U8_IS_SINGLE(b)) { /* convert ASCII */ if(IS_ASCII_ROUNDTRIP(b, asciiRoundtrips)) { *target++=(uint8_t)b; @@ -5185,7 +5181,7 @@ ucnv_SBCSFromUTF8(UConverterFromUnicodeArgs *pFromUArgs, /* handle "complicated" and error cases, and continuing partial characters */ oldToULength=0; toULength=1; - toULimit=U8_COUNT_TRAIL_BYTES(b)+1; + toULimit=U8_COUNT_BYTES_NON_ASCII(b); c=b; moreBytes: while(toULengthsourceLimit) { b=*source; - if(U8_IS_TRAIL(b)) { + if(icu::UTF8::isValidTrail(c, b, toULength, toULimit)) { ++source; ++toULength; c=(c<<6)+b; @@ -5220,22 +5216,18 @@ moreBytes: } } - if( toULength==toULimit && /* consumed all trail bytes */ - (toULength==3 || toULength==2) && /* BMP */ - (c-=utf8_offsets[toULength])>=utf8_minLegal[toULength] && - (c<=0xd7ff || 0xe000<=c) /* not a surrogate */ - ) { - value=MBCS_SINGLE_RESULT_FROM_U(table, results, c); - } else if( - toULength==toULimit && toULength==4 && - (0x10000<=(c-=utf8_offsets[4]) && c<=0x10ffff) - ) { - /* supplementary code point */ - if(!hasSupplementary) { - /* BMP-only codepages are stored without stage 1 entries for supplementary code points */ - value=0; - } else { + if(toULength==toULimit) { + c-=utf8_offsets[toULength]; + if(toULength<=3) { /* BMP */ value=MBCS_SINGLE_RESULT_FROM_U(table, results, c); + } else { + /* supplementary code point */ + if(!hasSupplementary) { + /* BMP-only codepages are stored without stage 1 entries for supplementary code points */ + value=0; + } else { + value=MBCS_SINGLE_RESULT_FROM_U(table, results, c); + } } } else { /* error handling: illegal UTF-8 byte sequence */ @@ -5310,7 +5302,7 @@ moreBytes: source<(sourceLimit=(uint8_t *)pToUArgs->sourceLimit)) { c=utf8->toUBytes[0]=b=*source++; toULength=1; - toULimit=U8_COUNT_TRAIL_BYTES(b)+1; + toULimit=U8_COUNT_BYTES(b); while(sourcetoUBytes[toULength++]=b=*source++; c=(c<<6)+b; @@ -5344,7 +5336,7 @@ ucnv_DBCSFromUTF8(UConverterFromUnicodeArgs *pFromUArgs, uint32_t stage2Entry; uint32_t asciiRoundtrips; - uint16_t value; + uint16_t value = 0; UBool hasSupplementary; /* set up the local pointers */ @@ -5375,28 +5367,27 @@ ucnv_DBCSFromUTF8(UConverterFromUnicodeArgs *pFromUArgs, toULength=oldToULength=toULimit=0; } - /* - * Make sure that the last byte sequence before sourceLimit is complete - * or runs into a lead byte. - * Do not go back into the bytes that will be read for finishing a partial - * sequence from the previous buffer. - * In the conversion loop compare source with sourceLimit only once - * per multi-byte character. - */ + // The conversion loop checks source0) { + uint8_t b1=*(sourceLimit-1); + if(U8_IS_SINGLE(b1)) { + // common ASCII character + } else if(U8_IS_TRAIL(b1) && length>=2) { + uint8_t b2=*(sourceLimit-2); + if(0xe0<=b2 && b2<0xf0 && U8_IS_VALID_LEAD3_AND_T1(b2, b1)) { + // truncated 3-byte sequence + sourceLimit-=2; } - break; + } else if(0xc2<=b1 && b1<0xf0) { + // truncated 2- or 3-byte sequence + --sourceLimit; } } } @@ -5412,7 +5403,7 @@ ucnv_DBCSFromUTF8(UConverterFromUnicodeArgs *pFromUArgs, while(source0) { b=*source++; - if((int8_t)b>=0) { + if(U8_IS_SINGLE(b)) { /* convert ASCII */ if(IS_ASCII_ROUNDTRIP(b, asciiRoundtrips)) { *target++=b; @@ -5426,13 +5417,13 @@ ucnv_DBCSFromUTF8(UConverterFromUnicodeArgs *pFromUArgs, } } } else { - if(b>0xe0) { - if( /* handle U+1000..U+D7FF inline */ - (((t1=(uint8_t)(source[0]-0x80), b<0xed) && (t1 <= 0x3f)) || - (b==0xed && (t1 <= 0x1f))) && + if(b>=0xe0) { + if( /* handle U+0800..U+D7FF inline */ + b<=0xed && // do not assume maxFastUChar>0xd7ff + U8_IS_VALID_LEAD3_AND_T1(b, t1=source[0]) && (t2=(uint8_t)(source[1]-0x80)) <= 0x3f ) { - c=((b&0xf)<<6)|t1; + c=((b&0xf)<<6)|(t1&0x3f); source+=2; value=DBCS_RESULT_FROM_UTF8(mbcsIndex, results, c, t2); if(value==0) { @@ -5442,7 +5433,7 @@ ucnv_DBCSFromUTF8(UConverterFromUnicodeArgs *pFromUArgs, } else { c=-1; } - } else if(b<0xe0) { + } else { if( /* handle U+0080..U+07FF inline */ b>=0xc2 && (t1=(uint8_t)(*source-0x80)) <= 0x3f @@ -5457,15 +5448,13 @@ ucnv_DBCSFromUTF8(UConverterFromUnicodeArgs *pFromUArgs, } else { c=-1; } - } else { - c=-1; } if(c<0) { /* handle "complicated" and error cases, and continuing partial characters */ oldToULength=0; toULength=1; - toULimit=U8_COUNT_TRAIL_BYTES(b)+1; + toULimit=U8_COUNT_BYTES_NON_ASCII(b); c=b; moreBytes: while(toULengthsourceLimit) { b=*source; - if(U8_IS_TRAIL(b)) { + if(icu::UTF8::isValidTrail(c, b, toULength, toULimit)) { ++source; ++toULength; c=(c<<6)+b; @@ -5500,22 +5489,18 @@ moreBytes: } } - if( toULength==toULimit && /* consumed all trail bytes */ - (toULength==3 || toULength==2) && /* BMP */ - (c-=utf8_offsets[toULength])>=utf8_minLegal[toULength] && - (c<=0xd7ff || 0xe000<=c) /* not a surrogate */ - ) { - stage2Entry=MBCS_STAGE_2_FROM_U(table, c); - } else if( - toULength==toULimit && toULength==4 && - (0x10000<=(c-=utf8_offsets[4]) && c<=0x10ffff) - ) { - /* supplementary code point */ - if(!hasSupplementary) { - /* BMP-only codepages are stored without stage 1 entries for supplementary code points */ - stage2Entry=0; - } else { + if(toULength==toULimit) { + c-=utf8_offsets[toULength]; + if(toULength<=3) { /* BMP */ stage2Entry=MBCS_STAGE_2_FROM_U(table, c); + } else { + /* supplementary code point */ + if(!hasSupplementary) { + /* BMP-only codepages are stored without stage 1 entries for supplementary code points */ + stage2Entry=0; + } else { + stage2Entry=MBCS_STAGE_2_FROM_U(table, c); + } } } else { /* error handling: illegal UTF-8 byte sequence */ @@ -5620,7 +5605,7 @@ unassigned: source<(sourceLimit=(uint8_t *)pToUArgs->sourceLimit)) { c=utf8->toUBytes[0]=b=*source++; toULength=1; - toULimit=U8_COUNT_TRAIL_BYTES(b)+1; + toULimit=U8_COUNT_BYTES(b); while(sourcetoUBytes[toULength++]=b=*source++; c=(c<<6)+b; diff --git a/Build/source/libs/icu/icu-src/source/common/ucnvmbcs.h b/Build/source/libs/icu/icu-src/source/common/ucnvmbcs.h index 5bbbae7a890..209cdc532d4 100644 --- a/Build/source/libs/icu/icu-src/source/common/ucnvmbcs.h +++ b/Build/source/libs/icu/icu-src/source/common/ucnvmbcs.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ****************************************************************************** @@ -8,7 +8,7 @@ * ****************************************************************************** * file name: ucnvmbcs.h -* encoding: US-ASCII +* encoding: UTF-8 * tab size: 8 (not used) * indentation:4 * diff --git a/Build/source/libs/icu/icu-src/source/common/ucnvscsu.c b/Build/source/libs/icu/icu-src/source/common/ucnvscsu.c deleted file mode 100644 index 9849cdebbbb..00000000000 --- a/Build/source/libs/icu/icu-src/source/common/ucnvscsu.c +++ /dev/null @@ -1,2043 +0,0 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. -// License & terms of use: http://www.unicode.org/copyright.html -/* -****************************************************************************** -* -* Copyright (C) 2000-2016, International Business Machines -* Corporation and others. All Rights Reserved. -* -****************************************************************************** -* file name: ucnvscsu.c -* encoding: US-ASCII -* tab size: 8 (not used) -* indentation:4 -* -* created on: 2000nov18 -* created by: Markus W. Scherer -* -* This is an implementation of the Standard Compression Scheme for Unicode -* as defined in http://www.unicode.org/unicode/reports/tr6/ . -* Reserved commands and window settings are treated as illegal sequences and -* will result in callback calls. -*/ - -#include "unicode/utypes.h" - -#if !UCONFIG_NO_CONVERSION && !UCONFIG_ONLY_HTML_CONVERSION - -#include "unicode/ucnv.h" -#include "unicode/ucnv_cb.h" -#include "unicode/utf16.h" -#include "ucnv_bld.h" -#include "ucnv_cnv.h" -#include "cmemory.h" - -/* SCSU definitions --------------------------------------------------------- */ - -/* SCSU command byte values */ -enum { - SQ0=0x01, /* Quote from window pair 0 */ - SQ7=0x08, /* Quote from window pair 7 */ - SDX=0x0B, /* Define a window as extended */ - Srs=0x0C, /* reserved */ - SQU=0x0E, /* Quote a single Unicode character */ - SCU=0x0F, /* Change to Unicode mode */ - SC0=0x10, /* Select window 0 */ - SC7=0x17, /* Select window 7 */ - SD0=0x18, /* Define and select window 0 */ - SD7=0x1F, /* Define and select window 7 */ - - UC0=0xE0, /* Select window 0 */ - UC7=0xE7, /* Select window 7 */ - UD0=0xE8, /* Define and select window 0 */ - UD7=0xEF, /* Define and select window 7 */ - UQU=0xF0, /* Quote a single Unicode character */ - UDX=0xF1, /* Define a Window as extended */ - Urs=0xF2 /* reserved */ -}; - -enum { - /* - * Unicode code points from 3400 to E000 are not adressible by - * dynamic window, since in these areas no short run alphabets are - * found. Therefore add gapOffset to all values from gapThreshold. - */ - gapThreshold=0x68, - gapOffset=0xAC00, - - /* values between reservedStart and fixedThreshold are reserved */ - reservedStart=0xA8, - - /* use table of predefined fixed offsets for values from fixedThreshold */ - fixedThreshold=0xF9 -}; - -/* constant offsets for the 8 static windows */ -static const uint32_t staticOffsets[8]={ - 0x0000, /* ASCII for quoted tags */ - 0x0080, /* Latin - 1 Supplement (for access to punctuation) */ - 0x0100, /* Latin Extended-A */ - 0x0300, /* Combining Diacritical Marks */ - 0x2000, /* General Punctuation */ - 0x2080, /* Currency Symbols */ - 0x2100, /* Letterlike Symbols and Number Forms */ - 0x3000 /* CJK Symbols and punctuation */ -}; - -/* initial offsets for the 8 dynamic (sliding) windows */ -static const uint32_t initialDynamicOffsets[8]={ - 0x0080, /* Latin-1 */ - 0x00C0, /* Latin Extended A */ - 0x0400, /* Cyrillic */ - 0x0600, /* Arabic */ - 0x0900, /* Devanagari */ - 0x3040, /* Hiragana */ - 0x30A0, /* Katakana */ - 0xFF00 /* Fullwidth ASCII */ -}; - -/* Table of fixed predefined Offsets */ -static const uint32_t fixedOffsets[]={ - /* 0xF9 */ 0x00C0, /* Latin-1 Letters + half of Latin Extended A */ - /* 0xFA */ 0x0250, /* IPA extensions */ - /* 0xFB */ 0x0370, /* Greek */ - /* 0xFC */ 0x0530, /* Armenian */ - /* 0xFD */ 0x3040, /* Hiragana */ - /* 0xFE */ 0x30A0, /* Katakana */ - /* 0xFF */ 0xFF60 /* Halfwidth Katakana */ -}; - -/* state values */ -enum { - readCommand, - quotePairOne, - quotePairTwo, - quoteOne, - definePairOne, - definePairTwo, - defineOne -}; - -typedef struct SCSUData { - /* dynamic window offsets, intitialize to default values from initialDynamicOffsets */ - uint32_t toUDynamicOffsets[8]; - uint32_t fromUDynamicOffsets[8]; - - /* state machine state - toUnicode */ - UBool toUIsSingleByteMode; - uint8_t toUState; - int8_t toUQuoteWindow, toUDynamicWindow; - uint8_t toUByteOne; - uint8_t toUPadding[3]; - - /* state machine state - fromUnicode */ - UBool fromUIsSingleByteMode; - int8_t fromUDynamicWindow; - - /* - * windowUse[] keeps track of the use of the dynamic windows: - * At nextWindowUseIndex there is the least recently used window, - * and the following windows (in a wrapping manner) are more and more - * recently used. - * At nextWindowUseIndex-1 there is the most recently used window. - */ - uint8_t locale; - int8_t nextWindowUseIndex; - int8_t windowUse[8]; -} SCSUData; - -static const int8_t initialWindowUse[8]={ 7, 0, 3, 2, 4, 5, 6, 1 }; -static const int8_t initialWindowUse_ja[8]={ 3, 2, 4, 1, 0, 7, 5, 6 }; - -enum { - lGeneric, l_ja -}; - -/* SCSU setup functions ----------------------------------------------------- */ - -static void -_SCSUReset(UConverter *cnv, UConverterResetChoice choice) { - SCSUData *scsu=(SCSUData *)cnv->extraInfo; - - if(choice<=UCNV_RESET_TO_UNICODE) { - /* reset toUnicode */ - uprv_memcpy(scsu->toUDynamicOffsets, initialDynamicOffsets, 32); - - scsu->toUIsSingleByteMode=TRUE; - scsu->toUState=readCommand; - scsu->toUQuoteWindow=scsu->toUDynamicWindow=0; - scsu->toUByteOne=0; - - cnv->toULength=0; - } - if(choice!=UCNV_RESET_TO_UNICODE) { - /* reset fromUnicode */ - uprv_memcpy(scsu->fromUDynamicOffsets, initialDynamicOffsets, 32); - - scsu->fromUIsSingleByteMode=TRUE; - scsu->fromUDynamicWindow=0; - - scsu->nextWindowUseIndex=0; - switch(scsu->locale) { - case l_ja: - uprv_memcpy(scsu->windowUse, initialWindowUse_ja, 8); - break; - default: - uprv_memcpy(scsu->windowUse, initialWindowUse, 8); - break; - } - - cnv->fromUChar32=0; - } -} - -static void -_SCSUOpen(UConverter *cnv, - UConverterLoadArgs *pArgs, - UErrorCode *pErrorCode) { - const char *locale=pArgs->locale; - if(pArgs->onlyTestIsLoadable) { - return; - } - cnv->extraInfo=uprv_malloc(sizeof(SCSUData)); - if(cnv->extraInfo!=NULL) { - if(locale!=NULL && locale[0]=='j' && locale[1]=='a' && (locale[2]==0 || locale[2]=='_')) { - ((SCSUData *)cnv->extraInfo)->locale=l_ja; - } else { - ((SCSUData *)cnv->extraInfo)->locale=lGeneric; - } - _SCSUReset(cnv, UCNV_RESET_BOTH); - } else { - *pErrorCode=U_MEMORY_ALLOCATION_ERROR; - } - - /* Set the substitution character U+fffd as a Unicode string. */ - cnv->subUChars[0]=0xfffd; - cnv->subCharLen=-1; -} - -static void -_SCSUClose(UConverter *cnv) { - if(cnv->extraInfo!=NULL) { - if(!cnv->isExtraLocal) { - uprv_free(cnv->extraInfo); - } - cnv->extraInfo=NULL; - } -} - -/* SCSU-to-Unicode conversion functions ------------------------------------- */ - -static void -_SCSUToUnicodeWithOffsets(UConverterToUnicodeArgs *pArgs, - UErrorCode *pErrorCode) { - UConverter *cnv; - SCSUData *scsu; - const uint8_t *source, *sourceLimit; - UChar *target; - const UChar *targetLimit; - int32_t *offsets; - UBool isSingleByteMode; - uint8_t state, byteOne; - int8_t quoteWindow, dynamicWindow; - - int32_t sourceIndex, nextSourceIndex; - - uint8_t b; - - /* set up the local pointers */ - cnv=pArgs->converter; - scsu=(SCSUData *)cnv->extraInfo; - - source=(const uint8_t *)pArgs->source; - sourceLimit=(const uint8_t *)pArgs->sourceLimit; - target=pArgs->target; - targetLimit=pArgs->targetLimit; - offsets=pArgs->offsets; - - /* get the state machine state */ - isSingleByteMode=scsu->toUIsSingleByteMode; - state=scsu->toUState; - quoteWindow=scsu->toUQuoteWindow; - dynamicWindow=scsu->toUDynamicWindow; - byteOne=scsu->toUByteOne; - - /* sourceIndex=-1 if the current character began in the previous buffer */ - sourceIndex=state==readCommand ? 0 : -1; - nextSourceIndex=0; - - /* - * conversion "loop" - * - * For performance, this is not a normal C loop. - * Instead, there are two code blocks for the two SCSU modes. - * The function branches to either one, and a change of the mode is done with a goto to - * the other branch. - * - * Each branch has two conventional loops: - * - a fast-path loop for the most common codes in the mode - * - a loop for all other codes in the mode - * When the fast-path runs into a code that it cannot handle, its loop ends and it - * runs into the following loop to handle the other codes. - * The end of the input or output buffer is also handled by the slower loop. - * The slow loop jumps (goto) to the fast-path loop again as soon as possible. - * - * The callback handling is done by returning with an error code. - * The conversion framework actually calls the callback function. - */ - if(isSingleByteMode) { - /* fast path for single-byte mode */ - if(state==readCommand) { -fastSingle: - while(source=0x20) { - ++source; - ++nextSourceIndex; - if(b<=0x7f) { - /* write US-ASCII graphic character or DEL */ - *target++=(UChar)b; - if(offsets!=NULL) { - *offsets++=sourceIndex; - } - } else { - /* write from dynamic window */ - uint32_t c=scsu->toUDynamicOffsets[dynamicWindow]+(b&0x7f); - if(c<=0xffff) { - *target++=(UChar)c; - if(offsets!=NULL) { - *offsets++=sourceIndex; - } - } else { - /* output surrogate pair */ - *target++=(UChar)(0xd7c0+(c>>10)); - if(targetUCharErrorBuffer[0]=(UChar)(0xdc00|(c&0x3ff)); - cnv->UCharErrorBufferLength=1; - *pErrorCode=U_BUFFER_OVERFLOW_ERROR; - goto endloop; - } - } - } - sourceIndex=nextSourceIndex; - } - } - - /* normal state machine for single-byte mode, minus handling for what fastSingle covers */ -singleByteMode: - while(source=targetLimit) { - /* target is full */ - *pErrorCode=U_BUFFER_OVERFLOW_ERROR; - break; - } - b=*source++; - ++nextSourceIndex; - switch(state) { - case readCommand: - /* redundant conditions are commented out */ - /* here: b<0x20 because otherwise we would be in fastSingle */ - if((1UL<toUBytes[0]=b; - cnv->toULength=1; - goto endloop; - } - - /* store the first byte of a multibyte sequence in toUBytes[] */ - cnv->toUBytes[0]=b; - cnv->toULength=1; - break; - case quotePairOne: - byteOne=b; - cnv->toUBytes[1]=b; - cnv->toULength=2; - state=quotePairTwo; - break; - case quotePairTwo: - *target++=(UChar)((byteOne<<8)|b); - if(offsets!=NULL) { - *offsets++=sourceIndex; - } - sourceIndex=nextSourceIndex; - state=readCommand; - goto fastSingle; - case quoteOne: - if(b<0x80) { - /* all static offsets are in the BMP */ - *target++=(UChar)(staticOffsets[quoteWindow]+b); - if(offsets!=NULL) { - *offsets++=sourceIndex; - } - } else { - /* write from dynamic window */ - uint32_t c=scsu->toUDynamicOffsets[quoteWindow]+(b&0x7f); - if(c<=0xffff) { - *target++=(UChar)c; - if(offsets!=NULL) { - *offsets++=sourceIndex; - } - } else { - /* output surrogate pair */ - *target++=(UChar)(0xd7c0+(c>>10)); - if(targetUCharErrorBuffer[0]=(UChar)(0xdc00|(c&0x3ff)); - cnv->UCharErrorBufferLength=1; - *pErrorCode=U_BUFFER_OVERFLOW_ERROR; - goto endloop; - } - } - } - sourceIndex=nextSourceIndex; - state=readCommand; - goto fastSingle; - case definePairOne: - dynamicWindow=(int8_t)((b>>5)&7); - byteOne=(uint8_t)(b&0x1f); - cnv->toUBytes[1]=b; - cnv->toULength=2; - state=definePairTwo; - break; - case definePairTwo: - scsu->toUDynamicOffsets[dynamicWindow]=0x10000+(byteOne<<15UL | b<<7UL); - sourceIndex=nextSourceIndex; - state=readCommand; - goto fastSingle; - case defineOne: - if(b==0) { - /* callback(illegal): Reserved window offset value 0 */ - cnv->toUBytes[1]=b; - cnv->toULength=2; - goto endloop; - } else if(btoUDynamicOffsets[dynamicWindow]=b<<7UL; - } else if((uint8_t)(b-gapThreshold)<(reservedStart-gapThreshold)) { - scsu->toUDynamicOffsets[dynamicWindow]=(b<<7UL)+gapOffset; - } else if(b>=fixedThreshold) { - scsu->toUDynamicOffsets[dynamicWindow]=fixedOffsets[b-fixedThreshold]; - } else { - /* callback(illegal): Reserved window offset value 0xa8..0xf8 */ - cnv->toUBytes[1]=b; - cnv->toULength=2; - goto endloop; - } - sourceIndex=nextSourceIndex; - state=readCommand; - goto fastSingle; - } - } - } else { - /* fast path for Unicode mode */ - if(state==readCommand) { -fastUnicode: - while(source+1(Urs-UC0)) { - *target++=(UChar)((b<<8)|source[1]); - if(offsets!=NULL) { - *offsets++=sourceIndex; - } - sourceIndex=nextSourceIndex; - nextSourceIndex+=2; - source+=2; - } - } - - /* normal state machine for Unicode mode */ -/* unicodeByteMode: */ - while(source=targetLimit) { - /* target is full */ - *pErrorCode=U_BUFFER_OVERFLOW_ERROR; - break; - } - b=*source++; - ++nextSourceIndex; - switch(state) { - case readCommand: - if((uint8_t)(b-UC0)>(Urs-UC0)) { - byteOne=b; - cnv->toUBytes[0]=b; - cnv->toULength=1; - state=quotePairTwo; - } else if(/* UC0<=b && */ b<=UC7) { - dynamicWindow=(int8_t)(b-UC0); - sourceIndex=nextSourceIndex; - isSingleByteMode=TRUE; - goto fastSingle; - } else if(/* UD0<=b && */ b<=UD7) { - dynamicWindow=(int8_t)(b-UD0); - isSingleByteMode=TRUE; - cnv->toUBytes[0]=b; - cnv->toULength=1; - state=defineOne; - goto singleByteMode; - } else if(b==UDX) { - isSingleByteMode=TRUE; - cnv->toUBytes[0]=b; - cnv->toULength=1; - state=definePairOne; - goto singleByteMode; - } else if(b==UQU) { - cnv->toUBytes[0]=b; - cnv->toULength=1; - state=quotePairOne; - } else /* Urs */ { - /* callback(illegal) */ - *pErrorCode=U_ILLEGAL_CHAR_FOUND; - cnv->toUBytes[0]=b; - cnv->toULength=1; - goto endloop; - } - break; - case quotePairOne: - byteOne=b; - cnv->toUBytes[1]=b; - cnv->toULength=2; - state=quotePairTwo; - break; - case quotePairTwo: - *target++=(UChar)((byteOne<<8)|b); - if(offsets!=NULL) { - *offsets++=sourceIndex; - } - sourceIndex=nextSourceIndex; - state=readCommand; - goto fastUnicode; - } - } - } -endloop: - - /* set the converter state back into UConverter */ - if(U_FAILURE(*pErrorCode) && *pErrorCode!=U_BUFFER_OVERFLOW_ERROR) { - /* reset to deal with the next character */ - state=readCommand; - } else if(state==readCommand) { - /* not in a multi-byte sequence, reset toULength */ - cnv->toULength=0; - } - scsu->toUIsSingleByteMode=isSingleByteMode; - scsu->toUState=state; - scsu->toUQuoteWindow=quoteWindow; - scsu->toUDynamicWindow=dynamicWindow; - scsu->toUByteOne=byteOne; - - /* write back the updated pointers */ - pArgs->source=(const char *)source; - pArgs->target=target; - pArgs->offsets=offsets; - return; -} - -/* - * Identical to _SCSUToUnicodeWithOffsets but without offset handling. - * If a change is made in the original function, then either - * change this function the same way or - * re-copy the original function and remove the variables - * offsets, sourceIndex, and nextSourceIndex. - */ -static void -_SCSUToUnicode(UConverterToUnicodeArgs *pArgs, - UErrorCode *pErrorCode) { - UConverter *cnv; - SCSUData *scsu; - const uint8_t *source, *sourceLimit; - UChar *target; - const UChar *targetLimit; - UBool isSingleByteMode; - uint8_t state, byteOne; - int8_t quoteWindow, dynamicWindow; - - uint8_t b; - - /* set up the local pointers */ - cnv=pArgs->converter; - scsu=(SCSUData *)cnv->extraInfo; - - source=(const uint8_t *)pArgs->source; - sourceLimit=(const uint8_t *)pArgs->sourceLimit; - target=pArgs->target; - targetLimit=pArgs->targetLimit; - - /* get the state machine state */ - isSingleByteMode=scsu->toUIsSingleByteMode; - state=scsu->toUState; - quoteWindow=scsu->toUQuoteWindow; - dynamicWindow=scsu->toUDynamicWindow; - byteOne=scsu->toUByteOne; - - /* - * conversion "loop" - * - * For performance, this is not a normal C loop. - * Instead, there are two code blocks for the two SCSU modes. - * The function branches to either one, and a change of the mode is done with a goto to - * the other branch. - * - * Each branch has two conventional loops: - * - a fast-path loop for the most common codes in the mode - * - a loop for all other codes in the mode - * When the fast-path runs into a code that it cannot handle, its loop ends and it - * runs into the following loop to handle the other codes. - * The end of the input or output buffer is also handled by the slower loop. - * The slow loop jumps (goto) to the fast-path loop again as soon as possible. - * - * The callback handling is done by returning with an error code. - * The conversion framework actually calls the callback function. - */ - if(isSingleByteMode) { - /* fast path for single-byte mode */ - if(state==readCommand) { -fastSingle: - while(source=0x20) { - ++source; - if(b<=0x7f) { - /* write US-ASCII graphic character or DEL */ - *target++=(UChar)b; - } else { - /* write from dynamic window */ - uint32_t c=scsu->toUDynamicOffsets[dynamicWindow]+(b&0x7f); - if(c<=0xffff) { - *target++=(UChar)c; - } else { - /* output surrogate pair */ - *target++=(UChar)(0xd7c0+(c>>10)); - if(targetUCharErrorBuffer[0]=(UChar)(0xdc00|(c&0x3ff)); - cnv->UCharErrorBufferLength=1; - *pErrorCode=U_BUFFER_OVERFLOW_ERROR; - goto endloop; - } - } - } - } - } - - /* normal state machine for single-byte mode, minus handling for what fastSingle covers */ -singleByteMode: - while(source=targetLimit) { - /* target is full */ - *pErrorCode=U_BUFFER_OVERFLOW_ERROR; - break; - } - b=*source++; - switch(state) { - case readCommand: - /* redundant conditions are commented out */ - /* here: b<0x20 because otherwise we would be in fastSingle */ - if((1UL<toUBytes[0]=b; - cnv->toULength=1; - goto endloop; - } - - /* store the first byte of a multibyte sequence in toUBytes[] */ - cnv->toUBytes[0]=b; - cnv->toULength=1; - break; - case quotePairOne: - byteOne=b; - cnv->toUBytes[1]=b; - cnv->toULength=2; - state=quotePairTwo; - break; - case quotePairTwo: - *target++=(UChar)((byteOne<<8)|b); - state=readCommand; - goto fastSingle; - case quoteOne: - if(b<0x80) { - /* all static offsets are in the BMP */ - *target++=(UChar)(staticOffsets[quoteWindow]+b); - } else { - /* write from dynamic window */ - uint32_t c=scsu->toUDynamicOffsets[quoteWindow]+(b&0x7f); - if(c<=0xffff) { - *target++=(UChar)c; - } else { - /* output surrogate pair */ - *target++=(UChar)(0xd7c0+(c>>10)); - if(targetUCharErrorBuffer[0]=(UChar)(0xdc00|(c&0x3ff)); - cnv->UCharErrorBufferLength=1; - *pErrorCode=U_BUFFER_OVERFLOW_ERROR; - goto endloop; - } - } - } - state=readCommand; - goto fastSingle; - case definePairOne: - dynamicWindow=(int8_t)((b>>5)&7); - byteOne=(uint8_t)(b&0x1f); - cnv->toUBytes[1]=b; - cnv->toULength=2; - state=definePairTwo; - break; - case definePairTwo: - scsu->toUDynamicOffsets[dynamicWindow]=0x10000+(byteOne<<15UL | b<<7UL); - state=readCommand; - goto fastSingle; - case defineOne: - if(b==0) { - /* callback(illegal): Reserved window offset value 0 */ - cnv->toUBytes[1]=b; - cnv->toULength=2; - goto endloop; - } else if(btoUDynamicOffsets[dynamicWindow]=b<<7UL; - } else if((uint8_t)(b-gapThreshold)<(reservedStart-gapThreshold)) { - scsu->toUDynamicOffsets[dynamicWindow]=(b<<7UL)+gapOffset; - } else if(b>=fixedThreshold) { - scsu->toUDynamicOffsets[dynamicWindow]=fixedOffsets[b-fixedThreshold]; - } else { - /* callback(illegal): Reserved window offset value 0xa8..0xf8 */ - cnv->toUBytes[1]=b; - cnv->toULength=2; - goto endloop; - } - state=readCommand; - goto fastSingle; - } - } - } else { - /* fast path for Unicode mode */ - if(state==readCommand) { -fastUnicode: - while(source+1(Urs-UC0)) { - *target++=(UChar)((b<<8)|source[1]); - source+=2; - } - } - - /* normal state machine for Unicode mode */ -/* unicodeByteMode: */ - while(source=targetLimit) { - /* target is full */ - *pErrorCode=U_BUFFER_OVERFLOW_ERROR; - break; - } - b=*source++; - switch(state) { - case readCommand: - if((uint8_t)(b-UC0)>(Urs-UC0)) { - byteOne=b; - cnv->toUBytes[0]=b; - cnv->toULength=1; - state=quotePairTwo; - } else if(/* UC0<=b && */ b<=UC7) { - dynamicWindow=(int8_t)(b-UC0); - isSingleByteMode=TRUE; - goto fastSingle; - } else if(/* UD0<=b && */ b<=UD7) { - dynamicWindow=(int8_t)(b-UD0); - isSingleByteMode=TRUE; - cnv->toUBytes[0]=b; - cnv->toULength=1; - state=defineOne; - goto singleByteMode; - } else if(b==UDX) { - isSingleByteMode=TRUE; - cnv->toUBytes[0]=b; - cnv->toULength=1; - state=definePairOne; - goto singleByteMode; - } else if(b==UQU) { - cnv->toUBytes[0]=b; - cnv->toULength=1; - state=quotePairOne; - } else /* Urs */ { - /* callback(illegal) */ - *pErrorCode=U_ILLEGAL_CHAR_FOUND; - cnv->toUBytes[0]=b; - cnv->toULength=1; - goto endloop; - } - break; - case quotePairOne: - byteOne=b; - cnv->toUBytes[1]=b; - cnv->toULength=2; - state=quotePairTwo; - break; - case quotePairTwo: - *target++=(UChar)((byteOne<<8)|b); - state=readCommand; - goto fastUnicode; - } - } - } -endloop: - - /* set the converter state back into UConverter */ - if(U_FAILURE(*pErrorCode) && *pErrorCode!=U_BUFFER_OVERFLOW_ERROR) { - /* reset to deal with the next character */ - state=readCommand; - } else if(state==readCommand) { - /* not in a multi-byte sequence, reset toULength */ - cnv->toULength=0; - } - scsu->toUIsSingleByteMode=isSingleByteMode; - scsu->toUState=state; - scsu->toUQuoteWindow=quoteWindow; - scsu->toUDynamicWindow=dynamicWindow; - scsu->toUByteOne=byteOne; - - /* write back the updated pointers */ - pArgs->source=(const char *)source; - pArgs->target=target; - return; -} - -/* SCSU-from-Unicode conversion functions ----------------------------------- */ - -/* - * This SCSU Encoder is fairly simple but uses all SCSU commands to achieve - * reasonable results. The lookahead is minimal. - * Many cases are simple: - * A character fits directly into the current mode, a dynamic or static window, - * or is not compressible. These cases are tested first. - * Real compression heuristics are applied to the rest, in code branches for - * single/Unicode mode and BMP/supplementary code points. - * The heuristics used here are extremely simple. - */ - -/* get the number of the window that this character is in, or -1 */ -static int8_t -getWindow(const uint32_t offsets[8], uint32_t c) { - int i; - for(i=0; i<8; ++i) { - if((uint32_t)(c-offsets[i])<=0x7f) { - return (int8_t)(i); - } - } - return -1; -} - -/* is the character in the dynamic window starting at the offset, or in the direct-encoded range? */ -static UBool -isInOffsetWindowOrDirect(uint32_t offset, uint32_t c) { - return (UBool)(c<=offset+0x7f && - (c>=offset || (c<=0x7f && - (c>=0x20 || (1UL<windowUse[scsu->nextWindowUseIndex]; - if(++scsu->nextWindowUseIndex==8) { - scsu->nextWindowUseIndex=0; - } - return window; -} - -/* - * useDynamicWindow() adjusts - * windowUse[] and nextWindowUseIndex for the algorithm to choose - * the next dynamic window to be defined; - * a subclass may override it and provide its own algorithm. - */ -static void -useDynamicWindow(SCSUData *scsu, int8_t window) { - /* - * move the existing window, which just became the most recently used one, - * up in windowUse[] to nextWindowUseIndex-1 - */ - - /* first, find the index of the window - backwards to favor the more recently used windows */ - int i, j; - - i=scsu->nextWindowUseIndex; - do { - if(--i<0) { - i=7; - } - } while(scsu->windowUse[i]!=window); - - /* now copy each windowUse[i+1] to [i] */ - j=i+1; - if(j==8) { - j=0; - } - while(j!=scsu->nextWindowUseIndex) { - scsu->windowUse[i]=scsu->windowUse[j]; - i=j; - if(++j==8) { j=0; } - } - - /* finally, set the window into the most recently used index */ - scsu->windowUse[i]=window; -} - -/* - * calculate the offset and the code for a dynamic window that contains the character - * takes fixed offsets into account - * the offset of the window is stored in the offset variable, - * the code is returned - * - * return offset code: -1 none <=0xff code for SDn/UDn else code for SDX/UDX, subtract 0x200 to get the true code - */ -static int -getDynamicOffset(uint32_t c, uint32_t *pOffset) { - int i; - - for(i=0; i<7; ++i) { - if((uint32_t)(c-fixedOffsets[i])<=0x7f) { - *pOffset=fixedOffsets[i]; - return 0xf9+i; - } - } - - if(c<0x80) { - /* No dynamic window for US-ASCII. */ - return -1; - } else if(c<0x3400 || - (uint32_t)(c-0x10000)<(0x14000-0x10000) || - (uint32_t)(c-0x1d000)<=(0x1ffff-0x1d000) - ) { - /* This character is in a code range for a "small", i.e., reasonably windowable, script. */ - *pOffset=c&0x7fffff80; - return (int)(c>>7); - } else if(0xe000<=c && c!=0xfeff && c<0xfff0) { - /* For these characters we need to take the gapOffset into account. */ - *pOffset=c&0x7fffff80; - return (int)((c-gapOffset)>>7); - } else { - return -1; - } -} - -/* - * Idea for compression: - * - save SCSUData and other state before really starting work - * - at endloop, see if compression could be better with just unicode mode - * - don't do this if a callback has been called - * - if unicode mode would be smaller, then override the results with it - may need SCU at the beginning - * - different buffer handling! - * - * Drawback or need for corrective handling: - * it is desirable to encode U+feff as SQU fe ff for the SCSU signature, and - * it is desirable to start a document in US-ASCII/Latin-1 for as long as possible - * not only for compression but also for HTML/XML documents with following charset/encoding announcers. - * - * How to achieve both? - * - Only replace the result after an SDX or SCU? - */ - -static void -_SCSUFromUnicodeWithOffsets(UConverterFromUnicodeArgs *pArgs, - UErrorCode *pErrorCode) { - UConverter *cnv; - SCSUData *scsu; - const UChar *source, *sourceLimit; - uint8_t *target; - int32_t targetCapacity; - int32_t *offsets; - - UBool isSingleByteMode; - uint8_t dynamicWindow; - uint32_t currentOffset; - - uint32_t c, delta; - - int32_t sourceIndex, nextSourceIndex; - - int32_t length; - - /* variables for compression heuristics */ - uint32_t offset; - UChar lead, trail; - int code; - int8_t window; - - /* set up the local pointers */ - cnv=pArgs->converter; - scsu=(SCSUData *)cnv->extraInfo; - - /* set up the local pointers */ - source=pArgs->source; - sourceLimit=pArgs->sourceLimit; - target=(uint8_t *)pArgs->target; - targetCapacity=(int32_t)(pArgs->targetLimit-pArgs->target); - offsets=pArgs->offsets; - - /* get the state machine state */ - isSingleByteMode=scsu->fromUIsSingleByteMode; - dynamicWindow=scsu->fromUDynamicWindow; - currentOffset=scsu->fromUDynamicOffsets[dynamicWindow]; - - c=cnv->fromUChar32; - - /* sourceIndex=-1 if the current character began in the previous buffer */ - sourceIndex= c==0 ? 0 : -1; - nextSourceIndex=0; - - /* similar conversion "loop" as in toUnicode */ -loop: - if(isSingleByteMode) { - if(c!=0 && targetCapacity>0) { - goto getTrailSingle; - } - - /* state machine for single-byte mode */ -/* singleByteMode: */ - while(sourcefromUDynamicOffsets, c))>=0) { - /* there is a dynamic window that contains this character, change to it */ - dynamicWindow=window; - currentOffset=scsu->fromUDynamicOffsets[dynamicWindow]; - useDynamicWindow(scsu, dynamicWindow); - c=((uint32_t)(SC0+dynamicWindow)<<8)|(c-currentOffset)|0x80; - length=2; - goto outputBytes; - } else if((code=getDynamicOffset(c, &offset))>=0) { - /* might check if there are more characters in this window to come */ - /* define an extended window with this character */ - code-=0x200; - dynamicWindow=getNextDynamicWindow(scsu); - currentOffset=scsu->fromUDynamicOffsets[dynamicWindow]=offset; - useDynamicWindow(scsu, dynamicWindow); - c=((uint32_t)SDX<<24)|((uint32_t)dynamicWindow<<21)|((uint32_t)code<<8)|(c-currentOffset)|0x80; - length=4; - goto outputBytes; - } else { - /* change to Unicode mode and output this (lead, trail) pair */ - isSingleByteMode=FALSE; - *target++=(uint8_t)SCU; - if(offsets!=NULL) { - *offsets++=sourceIndex; - } - --targetCapacity; - c=((uint32_t)lead<<16)|trail; - length=4; - goto outputBytes; - } - } else if(c<0xa0) { - /* quote C1 control character */ - c=(c&0x7f)|(SQ0+1)<<8; /* SQ0+1==SQ1 */ - length=2; - goto outputBytes; - } else if(c==0xfeff || c>=0xfff0) { - /* quote signature character=byte order mark and specials */ - c|=SQU<<16; - length=3; - goto outputBytes; - } else { - /* compress all other BMP characters */ - if((window=getWindow(scsu->fromUDynamicOffsets, c))>=0) { - /* there is a window defined that contains this character - switch to it or quote from it? */ - if(source>=sourceLimit || isInOffsetWindowOrDirect(scsu->fromUDynamicOffsets[window], *source)) { - /* change to dynamic window */ - dynamicWindow=window; - currentOffset=scsu->fromUDynamicOffsets[dynamicWindow]; - useDynamicWindow(scsu, dynamicWindow); - c=((uint32_t)(SC0+dynamicWindow)<<8)|(c-currentOffset)|0x80; - length=2; - goto outputBytes; - } else { - /* quote from dynamic window */ - c=((uint32_t)(SQ0+window)<<8)|(c-scsu->fromUDynamicOffsets[window])|0x80; - length=2; - goto outputBytes; - } - } else if((window=getWindow(staticOffsets, c))>=0) { - /* quote from static window */ - c=((uint32_t)(SQ0+window)<<8)|(c-staticOffsets[window]); - length=2; - goto outputBytes; - } else if((code=getDynamicOffset(c, &offset))>=0) { - /* define a dynamic window with this character */ - dynamicWindow=getNextDynamicWindow(scsu); - currentOffset=scsu->fromUDynamicOffsets[dynamicWindow]=offset; - useDynamicWindow(scsu, dynamicWindow); - c=((uint32_t)(SD0+dynamicWindow)<<16)|((uint32_t)code<<8)|(c-currentOffset)|0x80; - length=3; - goto outputBytes; - } else if((uint32_t)(c-0x3400)<(0xd800-0x3400) && - (source>=sourceLimit || (uint32_t)(*source-0x3400)<(0xd800-0x3400)) - ) { - /* - * this character is not compressible (a BMP ideograph or similar); - * switch to Unicode mode if this is the last character in the block - * or there is at least one more ideograph following immediately - */ - isSingleByteMode=FALSE; - c|=SCU<<16; - length=3; - goto outputBytes; - } else { - /* quote Unicode */ - c|=SQU<<16; - length=3; - goto outputBytes; - } - } - - /* normal end of conversion: prepare for a new character */ - c=0; - sourceIndex=nextSourceIndex; - } - } else { - if(c!=0 && targetCapacity>0) { - goto getTrailUnicode; - } - - /* state machine for Unicode mode */ -/* unicodeByteMode: */ - while(source=2) { - *target++=(uint8_t)(c>>8); - *target++=(uint8_t)c; - if(offsets!=NULL) { - *offsets++=sourceIndex; - *offsets++=sourceIndex; - } - targetCapacity-=2; - } else { - length=2; - goto outputBytes; - } - } else if((uint32_t)(c-0x3400)>=(0xf300-0x3400) /* c<0x3400 || c>=0xf300 */) { - /* compress BMP character if the following one is not an uncompressible ideograph */ - if(!(sourcefromUDynamicOffsets, c))>=0) { - /* there is a dynamic window that contains this character, change to it */ - isSingleByteMode=TRUE; - dynamicWindow=window; - currentOffset=scsu->fromUDynamicOffsets[dynamicWindow]; - useDynamicWindow(scsu, dynamicWindow); - c=((uint32_t)(UC0+dynamicWindow)<<8)|(c-currentOffset)|0x80; - length=2; - goto outputBytes; - } else if((code=getDynamicOffset(c, &offset))>=0) { - /* define a dynamic window with this character */ - isSingleByteMode=TRUE; - dynamicWindow=getNextDynamicWindow(scsu); - currentOffset=scsu->fromUDynamicOffsets[dynamicWindow]=offset; - useDynamicWindow(scsu, dynamicWindow); - c=((uint32_t)(UD0+dynamicWindow)<<16)|((uint32_t)code<<8)|(c-currentOffset)|0x80; - length=3; - goto outputBytes; - } - } - - /* don't know how to compress this character, just write it directly */ - length=2; - goto outputBytes; - } else if(c<0xe000) { - /* c is a surrogate */ - if(U16_IS_SURROGATE_LEAD(c)) { -getTrailUnicode: - lead=(UChar)c; - if(sourcefromUDynamicOffsets, c))>=0 && - !(sourcefromUDynamicOffsets[dynamicWindow]; - useDynamicWindow(scsu, dynamicWindow); - c=((uint32_t)(UC0+dynamicWindow)<<8)|(c-currentOffset)|0x80; - length=2; - goto outputBytes; - } else if(source=0 - ) { - /* two supplementary characters in (probably) the same window - define an extended one */ - isSingleByteMode=TRUE; - code-=0x200; - dynamicWindow=getNextDynamicWindow(scsu); - currentOffset=scsu->fromUDynamicOffsets[dynamicWindow]=offset; - useDynamicWindow(scsu, dynamicWindow); - c=((uint32_t)UDX<<24)|((uint32_t)dynamicWindow<<21)|((uint32_t)code<<8)|(c-currentOffset)|0x80; - length=4; - goto outputBytes; - } else { - /* don't know how to compress this character, just write it directly */ - c=((uint32_t)lead<<16)|trail; - length=4; - goto outputBytes; - } - } else /* 0xe000<=c<0xf300 */ { - /* quote to avoid SCSU tags */ - c|=UQU<<16; - length=3; - goto outputBytes; - } - - /* normal end of conversion: prepare for a new character */ - c=0; - sourceIndex=nextSourceIndex; - } - } -endloop: - - /* set the converter state back into UConverter */ - scsu->fromUIsSingleByteMode=isSingleByteMode; - scsu->fromUDynamicWindow=dynamicWindow; - - cnv->fromUChar32=c; - - /* write back the updated pointers */ - pArgs->source=source; - pArgs->target=(char *)target; - pArgs->offsets=offsets; - return; - -outputBytes: - /* write the output character bytes from c and length [code copied from ucnvmbcs.c] */ - /* from the first if in the loop we know that targetCapacity>0 */ - if(length<=targetCapacity) { - if(offsets==NULL) { - switch(length) { - /* each branch falls through to the next one */ - case 4: - *target++=(uint8_t)(c>>24); - U_FALLTHROUGH; - case 3: - *target++=(uint8_t)(c>>16); - U_FALLTHROUGH; - case 2: - *target++=(uint8_t)(c>>8); - U_FALLTHROUGH; - case 1: - *target++=(uint8_t)c; - U_FALLTHROUGH; - default: - /* will never occur */ - break; - } - } else { - switch(length) { - /* each branch falls through to the next one */ - case 4: - *target++=(uint8_t)(c>>24); - *offsets++=sourceIndex; - U_FALLTHROUGH; - case 3: - *target++=(uint8_t)(c>>16); - *offsets++=sourceIndex; - U_FALLTHROUGH; - case 2: - *target++=(uint8_t)(c>>8); - *offsets++=sourceIndex; - U_FALLTHROUGH; - case 1: - *target++=(uint8_t)c; - *offsets++=sourceIndex; - U_FALLTHROUGH; - default: - /* will never occur */ - break; - } - } - targetCapacity-=length; - - /* normal end of conversion: prepare for a new character */ - c=0; - sourceIndex=nextSourceIndex; - goto loop; - } else { - uint8_t *p; - - /* - * We actually do this backwards here: - * In order to save an intermediate variable, we output - * first to the overflow buffer what does not fit into the - * regular target. - */ - /* we know that 0<=targetCapacitycharErrorBuffer; - switch(length) { - /* each branch falls through to the next one */ - case 4: - *p++=(uint8_t)(c>>24); - U_FALLTHROUGH; - case 3: - *p++=(uint8_t)(c>>16); - U_FALLTHROUGH; - case 2: - *p++=(uint8_t)(c>>8); - U_FALLTHROUGH; - case 1: - *p=(uint8_t)c; - U_FALLTHROUGH; - default: - /* will never occur */ - break; - } - cnv->charErrorBufferLength=(int8_t)length; - - /* now output what fits into the regular target */ - c>>=8*length; /* length was reduced by targetCapacity */ - switch(targetCapacity) { - /* each branch falls through to the next one */ - case 3: - *target++=(uint8_t)(c>>16); - if(offsets!=NULL) { - *offsets++=sourceIndex; - } - U_FALLTHROUGH; - case 2: - *target++=(uint8_t)(c>>8); - if(offsets!=NULL) { - *offsets++=sourceIndex; - } - U_FALLTHROUGH; - case 1: - *target++=(uint8_t)c; - if(offsets!=NULL) { - *offsets++=sourceIndex; - } - U_FALLTHROUGH; - default: - break; - } - - /* target overflow */ - targetCapacity=0; - *pErrorCode=U_BUFFER_OVERFLOW_ERROR; - c=0; - goto endloop; - } -} - -/* - * Identical to _SCSUFromUnicodeWithOffsets but without offset handling. - * If a change is made in the original function, then either - * change this function the same way or - * re-copy the original function and remove the variables - * offsets, sourceIndex, and nextSourceIndex. - */ -static void -_SCSUFromUnicode(UConverterFromUnicodeArgs *pArgs, - UErrorCode *pErrorCode) { - UConverter *cnv; - SCSUData *scsu; - const UChar *source, *sourceLimit; - uint8_t *target; - int32_t targetCapacity; - - UBool isSingleByteMode; - uint8_t dynamicWindow; - uint32_t currentOffset; - - uint32_t c, delta; - - int32_t length; - - /* variables for compression heuristics */ - uint32_t offset; - UChar lead, trail; - int code; - int8_t window; - - /* set up the local pointers */ - cnv=pArgs->converter; - scsu=(SCSUData *)cnv->extraInfo; - - /* set up the local pointers */ - source=pArgs->source; - sourceLimit=pArgs->sourceLimit; - target=(uint8_t *)pArgs->target; - targetCapacity=(int32_t)(pArgs->targetLimit-pArgs->target); - - /* get the state machine state */ - isSingleByteMode=scsu->fromUIsSingleByteMode; - dynamicWindow=scsu->fromUDynamicWindow; - currentOffset=scsu->fromUDynamicOffsets[dynamicWindow]; - - c=cnv->fromUChar32; - - /* similar conversion "loop" as in toUnicode */ -loop: - if(isSingleByteMode) { - if(c!=0 && targetCapacity>0) { - goto getTrailSingle; - } - - /* state machine for single-byte mode */ -/* singleByteMode: */ - while(sourcefromUDynamicOffsets, c))>=0) { - /* there is a dynamic window that contains this character, change to it */ - dynamicWindow=window; - currentOffset=scsu->fromUDynamicOffsets[dynamicWindow]; - useDynamicWindow(scsu, dynamicWindow); - c=((uint32_t)(SC0+dynamicWindow)<<8)|(c-currentOffset)|0x80; - length=2; - goto outputBytes; - } else if((code=getDynamicOffset(c, &offset))>=0) { - /* might check if there are more characters in this window to come */ - /* define an extended window with this character */ - code-=0x200; - dynamicWindow=getNextDynamicWindow(scsu); - currentOffset=scsu->fromUDynamicOffsets[dynamicWindow]=offset; - useDynamicWindow(scsu, dynamicWindow); - c=((uint32_t)SDX<<24)|((uint32_t)dynamicWindow<<21)|((uint32_t)code<<8)|(c-currentOffset)|0x80; - length=4; - goto outputBytes; - } else { - /* change to Unicode mode and output this (lead, trail) pair */ - isSingleByteMode=FALSE; - *target++=(uint8_t)SCU; - --targetCapacity; - c=((uint32_t)lead<<16)|trail; - length=4; - goto outputBytes; - } - } else if(c<0xa0) { - /* quote C1 control character */ - c=(c&0x7f)|(SQ0+1)<<8; /* SQ0+1==SQ1 */ - length=2; - goto outputBytes; - } else if(c==0xfeff || c>=0xfff0) { - /* quote signature character=byte order mark and specials */ - c|=SQU<<16; - length=3; - goto outputBytes; - } else { - /* compress all other BMP characters */ - if((window=getWindow(scsu->fromUDynamicOffsets, c))>=0) { - /* there is a window defined that contains this character - switch to it or quote from it? */ - if(source>=sourceLimit || isInOffsetWindowOrDirect(scsu->fromUDynamicOffsets[window], *source)) { - /* change to dynamic window */ - dynamicWindow=window; - currentOffset=scsu->fromUDynamicOffsets[dynamicWindow]; - useDynamicWindow(scsu, dynamicWindow); - c=((uint32_t)(SC0+dynamicWindow)<<8)|(c-currentOffset)|0x80; - length=2; - goto outputBytes; - } else { - /* quote from dynamic window */ - c=((uint32_t)(SQ0+window)<<8)|(c-scsu->fromUDynamicOffsets[window])|0x80; - length=2; - goto outputBytes; - } - } else if((window=getWindow(staticOffsets, c))>=0) { - /* quote from static window */ - c=((uint32_t)(SQ0+window)<<8)|(c-staticOffsets[window]); - length=2; - goto outputBytes; - } else if((code=getDynamicOffset(c, &offset))>=0) { - /* define a dynamic window with this character */ - dynamicWindow=getNextDynamicWindow(scsu); - currentOffset=scsu->fromUDynamicOffsets[dynamicWindow]=offset; - useDynamicWindow(scsu, dynamicWindow); - c=((uint32_t)(SD0+dynamicWindow)<<16)|((uint32_t)code<<8)|(c-currentOffset)|0x80; - length=3; - goto outputBytes; - } else if((uint32_t)(c-0x3400)<(0xd800-0x3400) && - (source>=sourceLimit || (uint32_t)(*source-0x3400)<(0xd800-0x3400)) - ) { - /* - * this character is not compressible (a BMP ideograph or similar); - * switch to Unicode mode if this is the last character in the block - * or there is at least one more ideograph following immediately - */ - isSingleByteMode=FALSE; - c|=SCU<<16; - length=3; - goto outputBytes; - } else { - /* quote Unicode */ - c|=SQU<<16; - length=3; - goto outputBytes; - } - } - - /* normal end of conversion: prepare for a new character */ - c=0; - } - } else { - if(c!=0 && targetCapacity>0) { - goto getTrailUnicode; - } - - /* state machine for Unicode mode */ -/* unicodeByteMode: */ - while(source=2) { - *target++=(uint8_t)(c>>8); - *target++=(uint8_t)c; - targetCapacity-=2; - } else { - length=2; - goto outputBytes; - } - } else if((uint32_t)(c-0x3400)>=(0xf300-0x3400) /* c<0x3400 || c>=0xf300 */) { - /* compress BMP character if the following one is not an uncompressible ideograph */ - if(!(sourcefromUDynamicOffsets, c))>=0) { - /* there is a dynamic window that contains this character, change to it */ - isSingleByteMode=TRUE; - dynamicWindow=window; - currentOffset=scsu->fromUDynamicOffsets[dynamicWindow]; - useDynamicWindow(scsu, dynamicWindow); - c=((uint32_t)(UC0+dynamicWindow)<<8)|(c-currentOffset)|0x80; - length=2; - goto outputBytes; - } else if((code=getDynamicOffset(c, &offset))>=0) { - /* define a dynamic window with this character */ - isSingleByteMode=TRUE; - dynamicWindow=getNextDynamicWindow(scsu); - currentOffset=scsu->fromUDynamicOffsets[dynamicWindow]=offset; - useDynamicWindow(scsu, dynamicWindow); - c=((uint32_t)(UD0+dynamicWindow)<<16)|((uint32_t)code<<8)|(c-currentOffset)|0x80; - length=3; - goto outputBytes; - } - } - - /* don't know how to compress this character, just write it directly */ - length=2; - goto outputBytes; - } else if(c<0xe000) { - /* c is a surrogate */ - if(U16_IS_SURROGATE_LEAD(c)) { -getTrailUnicode: - lead=(UChar)c; - if(sourcefromUDynamicOffsets, c))>=0 && - !(sourcefromUDynamicOffsets[dynamicWindow]; - useDynamicWindow(scsu, dynamicWindow); - c=((uint32_t)(UC0+dynamicWindow)<<8)|(c-currentOffset)|0x80; - length=2; - goto outputBytes; - } else if(source=0 - ) { - /* two supplementary characters in (probably) the same window - define an extended one */ - isSingleByteMode=TRUE; - code-=0x200; - dynamicWindow=getNextDynamicWindow(scsu); - currentOffset=scsu->fromUDynamicOffsets[dynamicWindow]=offset; - useDynamicWindow(scsu, dynamicWindow); - c=((uint32_t)UDX<<24)|((uint32_t)dynamicWindow<<21)|((uint32_t)code<<8)|(c-currentOffset)|0x80; - length=4; - goto outputBytes; - } else { - /* don't know how to compress this character, just write it directly */ - c=((uint32_t)lead<<16)|trail; - length=4; - goto outputBytes; - } - } else /* 0xe000<=c<0xf300 */ { - /* quote to avoid SCSU tags */ - c|=UQU<<16; - length=3; - goto outputBytes; - } - - /* normal end of conversion: prepare for a new character */ - c=0; - } - } -endloop: - - /* set the converter state back into UConverter */ - scsu->fromUIsSingleByteMode=isSingleByteMode; - scsu->fromUDynamicWindow=dynamicWindow; - - cnv->fromUChar32=c; - - /* write back the updated pointers */ - pArgs->source=source; - pArgs->target=(char *)target; - return; - -outputBytes: - /* write the output character bytes from c and length [code copied from ucnvmbcs.c] */ - /* from the first if in the loop we know that targetCapacity>0 */ - if(length<=targetCapacity) { - switch(length) { - /* each branch falls through to the next one */ - case 4: - *target++=(uint8_t)(c>>24); - U_FALLTHROUGH; - case 3: - *target++=(uint8_t)(c>>16); - U_FALLTHROUGH; - case 2: - *target++=(uint8_t)(c>>8); - U_FALLTHROUGH; - case 1: - *target++=(uint8_t)c; - U_FALLTHROUGH; - default: - /* will never occur */ - break; - } - targetCapacity-=length; - - /* normal end of conversion: prepare for a new character */ - c=0; - goto loop; - } else { - uint8_t *p; - - /* - * We actually do this backwards here: - * In order to save an intermediate variable, we output - * first to the overflow buffer what does not fit into the - * regular target. - */ - /* we know that 0<=targetCapacitycharErrorBuffer; - switch(length) { - /* each branch falls through to the next one */ - case 4: - *p++=(uint8_t)(c>>24); - U_FALLTHROUGH; - case 3: - *p++=(uint8_t)(c>>16); - U_FALLTHROUGH; - case 2: - *p++=(uint8_t)(c>>8); - U_FALLTHROUGH; - case 1: - *p=(uint8_t)c; - U_FALLTHROUGH; - default: - /* will never occur */ - break; - } - cnv->charErrorBufferLength=(int8_t)length; - - /* now output what fits into the regular target */ - c>>=8*length; /* length was reduced by targetCapacity */ - switch(targetCapacity) { - /* each branch falls through to the next one */ - case 3: - *target++=(uint8_t)(c>>16); - U_FALLTHROUGH; - case 2: - *target++=(uint8_t)(c>>8); - U_FALLTHROUGH; - case 1: - *target++=(uint8_t)c; - U_FALLTHROUGH; - default: - break; - } - - /* target overflow */ - targetCapacity=0; - *pErrorCode=U_BUFFER_OVERFLOW_ERROR; - c=0; - goto endloop; - } -} - -/* miscellaneous ------------------------------------------------------------ */ - -static const char * -_SCSUGetName(const UConverter *cnv) { - SCSUData *scsu=(SCSUData *)cnv->extraInfo; - - switch(scsu->locale) { - case l_ja: - return "SCSU,locale=ja"; - default: - return "SCSU"; - } -} - -/* structure for SafeClone calculations */ -struct cloneSCSUStruct -{ - UConverter cnv; - SCSUData mydata; -}; - -static UConverter * -_SCSUSafeClone(const UConverter *cnv, - void *stackBuffer, - int32_t *pBufferSize, - UErrorCode *status) -{ - struct cloneSCSUStruct * localClone; - int32_t bufferSizeNeeded = sizeof(struct cloneSCSUStruct); - - if (U_FAILURE(*status)){ - return 0; - } - - if (*pBufferSize == 0){ /* 'preflighting' request - set needed size into *pBufferSize */ - *pBufferSize = bufferSizeNeeded; - return 0; - } - - localClone = (struct cloneSCSUStruct *)stackBuffer; - /* ucnv.c/ucnv_safeClone() copied the main UConverter already */ - - uprv_memcpy(&localClone->mydata, cnv->extraInfo, sizeof(SCSUData)); - localClone->cnv.extraInfo = &localClone->mydata; - localClone->cnv.isExtraLocal = TRUE; - - return &localClone->cnv; -} - - -static const UConverterImpl _SCSUImpl={ - UCNV_SCSU, - - NULL, - NULL, - - _SCSUOpen, - _SCSUClose, - _SCSUReset, - - _SCSUToUnicode, - _SCSUToUnicodeWithOffsets, - _SCSUFromUnicode, - _SCSUFromUnicodeWithOffsets, - NULL, - - NULL, - _SCSUGetName, - NULL, - _SCSUSafeClone, - ucnv_getCompleteUnicodeSet -}; - -static const UConverterStaticData _SCSUStaticData={ - sizeof(UConverterStaticData), - "SCSU", - 1212, /* CCSID for SCSU */ - UCNV_IBM, UCNV_SCSU, - 1, 3, /* one UChar generates at least 1 byte and at most 3 bytes */ - /* - * The subchar here is ignored because _SCSUOpen() sets U+fffd as a Unicode - * substitution string. - */ - { 0x0e, 0xff, 0xfd, 0 }, 3, - FALSE, FALSE, - 0, - 0, - { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 } /* reserved */ -}; - -const UConverterSharedData _SCSUData= - UCNV_IMMUTABLE_SHARED_DATA_INITIALIZER(&_SCSUStaticData, &_SCSUImpl); - -#endif diff --git a/Build/source/libs/icu/icu-src/source/common/ucnvscsu.cpp b/Build/source/libs/icu/icu-src/source/common/ucnvscsu.cpp new file mode 100644 index 00000000000..74b5722b975 --- /dev/null +++ b/Build/source/libs/icu/icu-src/source/common/ucnvscsu.cpp @@ -0,0 +1,2045 @@ +// © 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html +/* +****************************************************************************** +* +* Copyright (C) 2000-2016, International Business Machines +* Corporation and others. All Rights Reserved. +* +****************************************************************************** +* file name: ucnvscsu.c +* encoding: UTF-8 +* tab size: 8 (not used) +* indentation:4 +* +* created on: 2000nov18 +* created by: Markus W. Scherer +* +* This is an implementation of the Standard Compression Scheme for Unicode +* as defined in http://www.unicode.org/unicode/reports/tr6/ . +* Reserved commands and window settings are treated as illegal sequences and +* will result in callback calls. +*/ + +#include "unicode/utypes.h" + +#if !UCONFIG_NO_CONVERSION && !UCONFIG_ONLY_HTML_CONVERSION + +#include "unicode/ucnv.h" +#include "unicode/ucnv_cb.h" +#include "unicode/utf16.h" +#include "ucnv_bld.h" +#include "ucnv_cnv.h" +#include "cmemory.h" + +/* SCSU definitions --------------------------------------------------------- */ + +/* SCSU command byte values */ +enum { + SQ0=0x01, /* Quote from window pair 0 */ + SQ7=0x08, /* Quote from window pair 7 */ + SDX=0x0B, /* Define a window as extended */ + Srs=0x0C, /* reserved */ + SQU=0x0E, /* Quote a single Unicode character */ + SCU=0x0F, /* Change to Unicode mode */ + SC0=0x10, /* Select window 0 */ + SC7=0x17, /* Select window 7 */ + SD0=0x18, /* Define and select window 0 */ + SD7=0x1F, /* Define and select window 7 */ + + UC0=0xE0, /* Select window 0 */ + UC7=0xE7, /* Select window 7 */ + UD0=0xE8, /* Define and select window 0 */ + UD7=0xEF, /* Define and select window 7 */ + UQU=0xF0, /* Quote a single Unicode character */ + UDX=0xF1, /* Define a Window as extended */ + Urs=0xF2 /* reserved */ +}; + +enum { + /* + * Unicode code points from 3400 to E000 are not adressible by + * dynamic window, since in these areas no short run alphabets are + * found. Therefore add gapOffset to all values from gapThreshold. + */ + gapThreshold=0x68, + gapOffset=0xAC00, + + /* values between reservedStart and fixedThreshold are reserved */ + reservedStart=0xA8, + + /* use table of predefined fixed offsets for values from fixedThreshold */ + fixedThreshold=0xF9 +}; + +/* constant offsets for the 8 static windows */ +static const uint32_t staticOffsets[8]={ + 0x0000, /* ASCII for quoted tags */ + 0x0080, /* Latin - 1 Supplement (for access to punctuation) */ + 0x0100, /* Latin Extended-A */ + 0x0300, /* Combining Diacritical Marks */ + 0x2000, /* General Punctuation */ + 0x2080, /* Currency Symbols */ + 0x2100, /* Letterlike Symbols and Number Forms */ + 0x3000 /* CJK Symbols and punctuation */ +}; + +/* initial offsets for the 8 dynamic (sliding) windows */ +static const uint32_t initialDynamicOffsets[8]={ + 0x0080, /* Latin-1 */ + 0x00C0, /* Latin Extended A */ + 0x0400, /* Cyrillic */ + 0x0600, /* Arabic */ + 0x0900, /* Devanagari */ + 0x3040, /* Hiragana */ + 0x30A0, /* Katakana */ + 0xFF00 /* Fullwidth ASCII */ +}; + +/* Table of fixed predefined Offsets */ +static const uint32_t fixedOffsets[]={ + /* 0xF9 */ 0x00C0, /* Latin-1 Letters + half of Latin Extended A */ + /* 0xFA */ 0x0250, /* IPA extensions */ + /* 0xFB */ 0x0370, /* Greek */ + /* 0xFC */ 0x0530, /* Armenian */ + /* 0xFD */ 0x3040, /* Hiragana */ + /* 0xFE */ 0x30A0, /* Katakana */ + /* 0xFF */ 0xFF60 /* Halfwidth Katakana */ +}; + +/* state values */ +enum { + readCommand, + quotePairOne, + quotePairTwo, + quoteOne, + definePairOne, + definePairTwo, + defineOne +}; + +typedef struct SCSUData { + /* dynamic window offsets, intitialize to default values from initialDynamicOffsets */ + uint32_t toUDynamicOffsets[8]; + uint32_t fromUDynamicOffsets[8]; + + /* state machine state - toUnicode */ + UBool toUIsSingleByteMode; + uint8_t toUState; + int8_t toUQuoteWindow, toUDynamicWindow; + uint8_t toUByteOne; + uint8_t toUPadding[3]; + + /* state machine state - fromUnicode */ + UBool fromUIsSingleByteMode; + int8_t fromUDynamicWindow; + + /* + * windowUse[] keeps track of the use of the dynamic windows: + * At nextWindowUseIndex there is the least recently used window, + * and the following windows (in a wrapping manner) are more and more + * recently used. + * At nextWindowUseIndex-1 there is the most recently used window. + */ + uint8_t locale; + int8_t nextWindowUseIndex; + int8_t windowUse[8]; +} SCSUData; + +static const int8_t initialWindowUse[8]={ 7, 0, 3, 2, 4, 5, 6, 1 }; +static const int8_t initialWindowUse_ja[8]={ 3, 2, 4, 1, 0, 7, 5, 6 }; + +enum { + lGeneric, l_ja +}; + +/* SCSU setup functions ----------------------------------------------------- */ +U_CDECL_BEGIN +static void U_CALLCONV +_SCSUReset(UConverter *cnv, UConverterResetChoice choice) { + SCSUData *scsu=(SCSUData *)cnv->extraInfo; + + if(choice<=UCNV_RESET_TO_UNICODE) { + /* reset toUnicode */ + uprv_memcpy(scsu->toUDynamicOffsets, initialDynamicOffsets, 32); + + scsu->toUIsSingleByteMode=TRUE; + scsu->toUState=readCommand; + scsu->toUQuoteWindow=scsu->toUDynamicWindow=0; + scsu->toUByteOne=0; + + cnv->toULength=0; + } + if(choice!=UCNV_RESET_TO_UNICODE) { + /* reset fromUnicode */ + uprv_memcpy(scsu->fromUDynamicOffsets, initialDynamicOffsets, 32); + + scsu->fromUIsSingleByteMode=TRUE; + scsu->fromUDynamicWindow=0; + + scsu->nextWindowUseIndex=0; + switch(scsu->locale) { + case l_ja: + uprv_memcpy(scsu->windowUse, initialWindowUse_ja, 8); + break; + default: + uprv_memcpy(scsu->windowUse, initialWindowUse, 8); + break; + } + + cnv->fromUChar32=0; + } +} + +static void U_CALLCONV +_SCSUOpen(UConverter *cnv, + UConverterLoadArgs *pArgs, + UErrorCode *pErrorCode) { + const char *locale=pArgs->locale; + if(pArgs->onlyTestIsLoadable) { + return; + } + cnv->extraInfo=uprv_malloc(sizeof(SCSUData)); + if(cnv->extraInfo!=NULL) { + if(locale!=NULL && locale[0]=='j' && locale[1]=='a' && (locale[2]==0 || locale[2]=='_')) { + ((SCSUData *)cnv->extraInfo)->locale=l_ja; + } else { + ((SCSUData *)cnv->extraInfo)->locale=lGeneric; + } + _SCSUReset(cnv, UCNV_RESET_BOTH); + } else { + *pErrorCode=U_MEMORY_ALLOCATION_ERROR; + } + + /* Set the substitution character U+fffd as a Unicode string. */ + cnv->subUChars[0]=0xfffd; + cnv->subCharLen=-1; +} + +static void U_CALLCONV +_SCSUClose(UConverter *cnv) { + if(cnv->extraInfo!=NULL) { + if(!cnv->isExtraLocal) { + uprv_free(cnv->extraInfo); + } + cnv->extraInfo=NULL; + } +} + +/* SCSU-to-Unicode conversion functions ------------------------------------- */ + +static void U_CALLCONV +_SCSUToUnicodeWithOffsets(UConverterToUnicodeArgs *pArgs, + UErrorCode *pErrorCode) { + UConverter *cnv; + SCSUData *scsu; + const uint8_t *source, *sourceLimit; + UChar *target; + const UChar *targetLimit; + int32_t *offsets; + UBool isSingleByteMode; + uint8_t state, byteOne; + int8_t quoteWindow, dynamicWindow; + + int32_t sourceIndex, nextSourceIndex; + + uint8_t b; + + /* set up the local pointers */ + cnv=pArgs->converter; + scsu=(SCSUData *)cnv->extraInfo; + + source=(const uint8_t *)pArgs->source; + sourceLimit=(const uint8_t *)pArgs->sourceLimit; + target=pArgs->target; + targetLimit=pArgs->targetLimit; + offsets=pArgs->offsets; + + /* get the state machine state */ + isSingleByteMode=scsu->toUIsSingleByteMode; + state=scsu->toUState; + quoteWindow=scsu->toUQuoteWindow; + dynamicWindow=scsu->toUDynamicWindow; + byteOne=scsu->toUByteOne; + + /* sourceIndex=-1 if the current character began in the previous buffer */ + sourceIndex=state==readCommand ? 0 : -1; + nextSourceIndex=0; + + /* + * conversion "loop" + * + * For performance, this is not a normal C loop. + * Instead, there are two code blocks for the two SCSU modes. + * The function branches to either one, and a change of the mode is done with a goto to + * the other branch. + * + * Each branch has two conventional loops: + * - a fast-path loop for the most common codes in the mode + * - a loop for all other codes in the mode + * When the fast-path runs into a code that it cannot handle, its loop ends and it + * runs into the following loop to handle the other codes. + * The end of the input or output buffer is also handled by the slower loop. + * The slow loop jumps (goto) to the fast-path loop again as soon as possible. + * + * The callback handling is done by returning with an error code. + * The conversion framework actually calls the callback function. + */ + if(isSingleByteMode) { + /* fast path for single-byte mode */ + if(state==readCommand) { +fastSingle: + while(source=0x20) { + ++source; + ++nextSourceIndex; + if(b<=0x7f) { + /* write US-ASCII graphic character or DEL */ + *target++=(UChar)b; + if(offsets!=NULL) { + *offsets++=sourceIndex; + } + } else { + /* write from dynamic window */ + uint32_t c=scsu->toUDynamicOffsets[dynamicWindow]+(b&0x7f); + if(c<=0xffff) { + *target++=(UChar)c; + if(offsets!=NULL) { + *offsets++=sourceIndex; + } + } else { + /* output surrogate pair */ + *target++=(UChar)(0xd7c0+(c>>10)); + if(targetUCharErrorBuffer[0]=(UChar)(0xdc00|(c&0x3ff)); + cnv->UCharErrorBufferLength=1; + *pErrorCode=U_BUFFER_OVERFLOW_ERROR; + goto endloop; + } + } + } + sourceIndex=nextSourceIndex; + } + } + + /* normal state machine for single-byte mode, minus handling for what fastSingle covers */ +singleByteMode: + while(source=targetLimit) { + /* target is full */ + *pErrorCode=U_BUFFER_OVERFLOW_ERROR; + break; + } + b=*source++; + ++nextSourceIndex; + switch(state) { + case readCommand: + /* redundant conditions are commented out */ + /* here: b<0x20 because otherwise we would be in fastSingle */ + if((1UL<toUBytes[0]=b; + cnv->toULength=1; + goto endloop; + } + + /* store the first byte of a multibyte sequence in toUBytes[] */ + cnv->toUBytes[0]=b; + cnv->toULength=1; + break; + case quotePairOne: + byteOne=b; + cnv->toUBytes[1]=b; + cnv->toULength=2; + state=quotePairTwo; + break; + case quotePairTwo: + *target++=(UChar)((byteOne<<8)|b); + if(offsets!=NULL) { + *offsets++=sourceIndex; + } + sourceIndex=nextSourceIndex; + state=readCommand; + goto fastSingle; + case quoteOne: + if(b<0x80) { + /* all static offsets are in the BMP */ + *target++=(UChar)(staticOffsets[quoteWindow]+b); + if(offsets!=NULL) { + *offsets++=sourceIndex; + } + } else { + /* write from dynamic window */ + uint32_t c=scsu->toUDynamicOffsets[quoteWindow]+(b&0x7f); + if(c<=0xffff) { + *target++=(UChar)c; + if(offsets!=NULL) { + *offsets++=sourceIndex; + } + } else { + /* output surrogate pair */ + *target++=(UChar)(0xd7c0+(c>>10)); + if(targetUCharErrorBuffer[0]=(UChar)(0xdc00|(c&0x3ff)); + cnv->UCharErrorBufferLength=1; + *pErrorCode=U_BUFFER_OVERFLOW_ERROR; + goto endloop; + } + } + } + sourceIndex=nextSourceIndex; + state=readCommand; + goto fastSingle; + case definePairOne: + dynamicWindow=(int8_t)((b>>5)&7); + byteOne=(uint8_t)(b&0x1f); + cnv->toUBytes[1]=b; + cnv->toULength=2; + state=definePairTwo; + break; + case definePairTwo: + scsu->toUDynamicOffsets[dynamicWindow]=0x10000+(byteOne<<15UL | b<<7UL); + sourceIndex=nextSourceIndex; + state=readCommand; + goto fastSingle; + case defineOne: + if(b==0) { + /* callback(illegal): Reserved window offset value 0 */ + cnv->toUBytes[1]=b; + cnv->toULength=2; + goto endloop; + } else if(btoUDynamicOffsets[dynamicWindow]=b<<7UL; + } else if((uint8_t)(b-gapThreshold)<(reservedStart-gapThreshold)) { + scsu->toUDynamicOffsets[dynamicWindow]=(b<<7UL)+gapOffset; + } else if(b>=fixedThreshold) { + scsu->toUDynamicOffsets[dynamicWindow]=fixedOffsets[b-fixedThreshold]; + } else { + /* callback(illegal): Reserved window offset value 0xa8..0xf8 */ + cnv->toUBytes[1]=b; + cnv->toULength=2; + goto endloop; + } + sourceIndex=nextSourceIndex; + state=readCommand; + goto fastSingle; + } + } + } else { + /* fast path for Unicode mode */ + if(state==readCommand) { +fastUnicode: + while(source+1(Urs-UC0)) { + *target++=(UChar)((b<<8)|source[1]); + if(offsets!=NULL) { + *offsets++=sourceIndex; + } + sourceIndex=nextSourceIndex; + nextSourceIndex+=2; + source+=2; + } + } + + /* normal state machine for Unicode mode */ +/* unicodeByteMode: */ + while(source=targetLimit) { + /* target is full */ + *pErrorCode=U_BUFFER_OVERFLOW_ERROR; + break; + } + b=*source++; + ++nextSourceIndex; + switch(state) { + case readCommand: + if((uint8_t)(b-UC0)>(Urs-UC0)) { + byteOne=b; + cnv->toUBytes[0]=b; + cnv->toULength=1; + state=quotePairTwo; + } else if(/* UC0<=b && */ b<=UC7) { + dynamicWindow=(int8_t)(b-UC0); + sourceIndex=nextSourceIndex; + isSingleByteMode=TRUE; + goto fastSingle; + } else if(/* UD0<=b && */ b<=UD7) { + dynamicWindow=(int8_t)(b-UD0); + isSingleByteMode=TRUE; + cnv->toUBytes[0]=b; + cnv->toULength=1; + state=defineOne; + goto singleByteMode; + } else if(b==UDX) { + isSingleByteMode=TRUE; + cnv->toUBytes[0]=b; + cnv->toULength=1; + state=definePairOne; + goto singleByteMode; + } else if(b==UQU) { + cnv->toUBytes[0]=b; + cnv->toULength=1; + state=quotePairOne; + } else /* Urs */ { + /* callback(illegal) */ + *pErrorCode=U_ILLEGAL_CHAR_FOUND; + cnv->toUBytes[0]=b; + cnv->toULength=1; + goto endloop; + } + break; + case quotePairOne: + byteOne=b; + cnv->toUBytes[1]=b; + cnv->toULength=2; + state=quotePairTwo; + break; + case quotePairTwo: + *target++=(UChar)((byteOne<<8)|b); + if(offsets!=NULL) { + *offsets++=sourceIndex; + } + sourceIndex=nextSourceIndex; + state=readCommand; + goto fastUnicode; + } + } + } +endloop: + + /* set the converter state back into UConverter */ + if(U_FAILURE(*pErrorCode) && *pErrorCode!=U_BUFFER_OVERFLOW_ERROR) { + /* reset to deal with the next character */ + state=readCommand; + } else if(state==readCommand) { + /* not in a multi-byte sequence, reset toULength */ + cnv->toULength=0; + } + scsu->toUIsSingleByteMode=isSingleByteMode; + scsu->toUState=state; + scsu->toUQuoteWindow=quoteWindow; + scsu->toUDynamicWindow=dynamicWindow; + scsu->toUByteOne=byteOne; + + /* write back the updated pointers */ + pArgs->source=(const char *)source; + pArgs->target=target; + pArgs->offsets=offsets; + return; +} + +/* + * Identical to _SCSUToUnicodeWithOffsets but without offset handling. + * If a change is made in the original function, then either + * change this function the same way or + * re-copy the original function and remove the variables + * offsets, sourceIndex, and nextSourceIndex. + */ +static void U_CALLCONV +_SCSUToUnicode(UConverterToUnicodeArgs *pArgs, + UErrorCode *pErrorCode) { + UConverter *cnv; + SCSUData *scsu; + const uint8_t *source, *sourceLimit; + UChar *target; + const UChar *targetLimit; + UBool isSingleByteMode; + uint8_t state, byteOne; + int8_t quoteWindow, dynamicWindow; + + uint8_t b; + + /* set up the local pointers */ + cnv=pArgs->converter; + scsu=(SCSUData *)cnv->extraInfo; + + source=(const uint8_t *)pArgs->source; + sourceLimit=(const uint8_t *)pArgs->sourceLimit; + target=pArgs->target; + targetLimit=pArgs->targetLimit; + + /* get the state machine state */ + isSingleByteMode=scsu->toUIsSingleByteMode; + state=scsu->toUState; + quoteWindow=scsu->toUQuoteWindow; + dynamicWindow=scsu->toUDynamicWindow; + byteOne=scsu->toUByteOne; + + /* + * conversion "loop" + * + * For performance, this is not a normal C loop. + * Instead, there are two code blocks for the two SCSU modes. + * The function branches to either one, and a change of the mode is done with a goto to + * the other branch. + * + * Each branch has two conventional loops: + * - a fast-path loop for the most common codes in the mode + * - a loop for all other codes in the mode + * When the fast-path runs into a code that it cannot handle, its loop ends and it + * runs into the following loop to handle the other codes. + * The end of the input or output buffer is also handled by the slower loop. + * The slow loop jumps (goto) to the fast-path loop again as soon as possible. + * + * The callback handling is done by returning with an error code. + * The conversion framework actually calls the callback function. + */ + if(isSingleByteMode) { + /* fast path for single-byte mode */ + if(state==readCommand) { +fastSingle: + while(source=0x20) { + ++source; + if(b<=0x7f) { + /* write US-ASCII graphic character or DEL */ + *target++=(UChar)b; + } else { + /* write from dynamic window */ + uint32_t c=scsu->toUDynamicOffsets[dynamicWindow]+(b&0x7f); + if(c<=0xffff) { + *target++=(UChar)c; + } else { + /* output surrogate pair */ + *target++=(UChar)(0xd7c0+(c>>10)); + if(targetUCharErrorBuffer[0]=(UChar)(0xdc00|(c&0x3ff)); + cnv->UCharErrorBufferLength=1; + *pErrorCode=U_BUFFER_OVERFLOW_ERROR; + goto endloop; + } + } + } + } + } + + /* normal state machine for single-byte mode, minus handling for what fastSingle covers */ +singleByteMode: + while(source=targetLimit) { + /* target is full */ + *pErrorCode=U_BUFFER_OVERFLOW_ERROR; + break; + } + b=*source++; + switch(state) { + case readCommand: + /* redundant conditions are commented out */ + /* here: b<0x20 because otherwise we would be in fastSingle */ + if((1UL<toUBytes[0]=b; + cnv->toULength=1; + goto endloop; + } + + /* store the first byte of a multibyte sequence in toUBytes[] */ + cnv->toUBytes[0]=b; + cnv->toULength=1; + break; + case quotePairOne: + byteOne=b; + cnv->toUBytes[1]=b; + cnv->toULength=2; + state=quotePairTwo; + break; + case quotePairTwo: + *target++=(UChar)((byteOne<<8)|b); + state=readCommand; + goto fastSingle; + case quoteOne: + if(b<0x80) { + /* all static offsets are in the BMP */ + *target++=(UChar)(staticOffsets[quoteWindow]+b); + } else { + /* write from dynamic window */ + uint32_t c=scsu->toUDynamicOffsets[quoteWindow]+(b&0x7f); + if(c<=0xffff) { + *target++=(UChar)c; + } else { + /* output surrogate pair */ + *target++=(UChar)(0xd7c0+(c>>10)); + if(targetUCharErrorBuffer[0]=(UChar)(0xdc00|(c&0x3ff)); + cnv->UCharErrorBufferLength=1; + *pErrorCode=U_BUFFER_OVERFLOW_ERROR; + goto endloop; + } + } + } + state=readCommand; + goto fastSingle; + case definePairOne: + dynamicWindow=(int8_t)((b>>5)&7); + byteOne=(uint8_t)(b&0x1f); + cnv->toUBytes[1]=b; + cnv->toULength=2; + state=definePairTwo; + break; + case definePairTwo: + scsu->toUDynamicOffsets[dynamicWindow]=0x10000+(byteOne<<15UL | b<<7UL); + state=readCommand; + goto fastSingle; + case defineOne: + if(b==0) { + /* callback(illegal): Reserved window offset value 0 */ + cnv->toUBytes[1]=b; + cnv->toULength=2; + goto endloop; + } else if(btoUDynamicOffsets[dynamicWindow]=b<<7UL; + } else if((uint8_t)(b-gapThreshold)<(reservedStart-gapThreshold)) { + scsu->toUDynamicOffsets[dynamicWindow]=(b<<7UL)+gapOffset; + } else if(b>=fixedThreshold) { + scsu->toUDynamicOffsets[dynamicWindow]=fixedOffsets[b-fixedThreshold]; + } else { + /* callback(illegal): Reserved window offset value 0xa8..0xf8 */ + cnv->toUBytes[1]=b; + cnv->toULength=2; + goto endloop; + } + state=readCommand; + goto fastSingle; + } + } + } else { + /* fast path for Unicode mode */ + if(state==readCommand) { +fastUnicode: + while(source+1(Urs-UC0)) { + *target++=(UChar)((b<<8)|source[1]); + source+=2; + } + } + + /* normal state machine for Unicode mode */ +/* unicodeByteMode: */ + while(source=targetLimit) { + /* target is full */ + *pErrorCode=U_BUFFER_OVERFLOW_ERROR; + break; + } + b=*source++; + switch(state) { + case readCommand: + if((uint8_t)(b-UC0)>(Urs-UC0)) { + byteOne=b; + cnv->toUBytes[0]=b; + cnv->toULength=1; + state=quotePairTwo; + } else if(/* UC0<=b && */ b<=UC7) { + dynamicWindow=(int8_t)(b-UC0); + isSingleByteMode=TRUE; + goto fastSingle; + } else if(/* UD0<=b && */ b<=UD7) { + dynamicWindow=(int8_t)(b-UD0); + isSingleByteMode=TRUE; + cnv->toUBytes[0]=b; + cnv->toULength=1; + state=defineOne; + goto singleByteMode; + } else if(b==UDX) { + isSingleByteMode=TRUE; + cnv->toUBytes[0]=b; + cnv->toULength=1; + state=definePairOne; + goto singleByteMode; + } else if(b==UQU) { + cnv->toUBytes[0]=b; + cnv->toULength=1; + state=quotePairOne; + } else /* Urs */ { + /* callback(illegal) */ + *pErrorCode=U_ILLEGAL_CHAR_FOUND; + cnv->toUBytes[0]=b; + cnv->toULength=1; + goto endloop; + } + break; + case quotePairOne: + byteOne=b; + cnv->toUBytes[1]=b; + cnv->toULength=2; + state=quotePairTwo; + break; + case quotePairTwo: + *target++=(UChar)((byteOne<<8)|b); + state=readCommand; + goto fastUnicode; + } + } + } +endloop: + + /* set the converter state back into UConverter */ + if(U_FAILURE(*pErrorCode) && *pErrorCode!=U_BUFFER_OVERFLOW_ERROR) { + /* reset to deal with the next character */ + state=readCommand; + } else if(state==readCommand) { + /* not in a multi-byte sequence, reset toULength */ + cnv->toULength=0; + } + scsu->toUIsSingleByteMode=isSingleByteMode; + scsu->toUState=state; + scsu->toUQuoteWindow=quoteWindow; + scsu->toUDynamicWindow=dynamicWindow; + scsu->toUByteOne=byteOne; + + /* write back the updated pointers */ + pArgs->source=(const char *)source; + pArgs->target=target; + return; +} +U_CDECL_END +/* SCSU-from-Unicode conversion functions ----------------------------------- */ + +/* + * This SCSU Encoder is fairly simple but uses all SCSU commands to achieve + * reasonable results. The lookahead is minimal. + * Many cases are simple: + * A character fits directly into the current mode, a dynamic or static window, + * or is not compressible. These cases are tested first. + * Real compression heuristics are applied to the rest, in code branches for + * single/Unicode mode and BMP/supplementary code points. + * The heuristics used here are extremely simple. + */ + +/* get the number of the window that this character is in, or -1 */ +static int8_t +getWindow(const uint32_t offsets[8], uint32_t c) { + int i; + for(i=0; i<8; ++i) { + if((uint32_t)(c-offsets[i])<=0x7f) { + return (int8_t)(i); + } + } + return -1; +} + +/* is the character in the dynamic window starting at the offset, or in the direct-encoded range? */ +static UBool +isInOffsetWindowOrDirect(uint32_t offset, uint32_t c) { + return (UBool)(c<=offset+0x7f && + (c>=offset || (c<=0x7f && + (c>=0x20 || (1UL<windowUse[scsu->nextWindowUseIndex]; + if(++scsu->nextWindowUseIndex==8) { + scsu->nextWindowUseIndex=0; + } + return window; +} + +/* + * useDynamicWindow() adjusts + * windowUse[] and nextWindowUseIndex for the algorithm to choose + * the next dynamic window to be defined; + * a subclass may override it and provide its own algorithm. + */ +static void +useDynamicWindow(SCSUData *scsu, int8_t window) { + /* + * move the existing window, which just became the most recently used one, + * up in windowUse[] to nextWindowUseIndex-1 + */ + + /* first, find the index of the window - backwards to favor the more recently used windows */ + int i, j; + + i=scsu->nextWindowUseIndex; + do { + if(--i<0) { + i=7; + } + } while(scsu->windowUse[i]!=window); + + /* now copy each windowUse[i+1] to [i] */ + j=i+1; + if(j==8) { + j=0; + } + while(j!=scsu->nextWindowUseIndex) { + scsu->windowUse[i]=scsu->windowUse[j]; + i=j; + if(++j==8) { j=0; } + } + + /* finally, set the window into the most recently used index */ + scsu->windowUse[i]=window; +} + +/* + * calculate the offset and the code for a dynamic window that contains the character + * takes fixed offsets into account + * the offset of the window is stored in the offset variable, + * the code is returned + * + * return offset code: -1 none <=0xff code for SDn/UDn else code for SDX/UDX, subtract 0x200 to get the true code + */ +static int +getDynamicOffset(uint32_t c, uint32_t *pOffset) { + int i; + + for(i=0; i<7; ++i) { + if((uint32_t)(c-fixedOffsets[i])<=0x7f) { + *pOffset=fixedOffsets[i]; + return 0xf9+i; + } + } + + if(c<0x80) { + /* No dynamic window for US-ASCII. */ + return -1; + } else if(c<0x3400 || + (uint32_t)(c-0x10000)<(0x14000-0x10000) || + (uint32_t)(c-0x1d000)<=(0x1ffff-0x1d000) + ) { + /* This character is in a code range for a "small", i.e., reasonably windowable, script. */ + *pOffset=c&0x7fffff80; + return (int)(c>>7); + } else if(0xe000<=c && c!=0xfeff && c<0xfff0) { + /* For these characters we need to take the gapOffset into account. */ + *pOffset=c&0x7fffff80; + return (int)((c-gapOffset)>>7); + } else { + return -1; + } +} +U_CDECL_BEGIN +/* + * Idea for compression: + * - save SCSUData and other state before really starting work + * - at endloop, see if compression could be better with just unicode mode + * - don't do this if a callback has been called + * - if unicode mode would be smaller, then override the results with it - may need SCU at the beginning + * - different buffer handling! + * + * Drawback or need for corrective handling: + * it is desirable to encode U+feff as SQU fe ff for the SCSU signature, and + * it is desirable to start a document in US-ASCII/Latin-1 for as long as possible + * not only for compression but also for HTML/XML documents with following charset/encoding announcers. + * + * How to achieve both? + * - Only replace the result after an SDX or SCU? + */ + +static void U_CALLCONV +_SCSUFromUnicodeWithOffsets(UConverterFromUnicodeArgs *pArgs, + UErrorCode *pErrorCode) { + UConverter *cnv; + SCSUData *scsu; + const UChar *source, *sourceLimit; + uint8_t *target; + int32_t targetCapacity; + int32_t *offsets; + + UBool isSingleByteMode; + uint8_t dynamicWindow; + uint32_t currentOffset; + + uint32_t c, delta; + + int32_t sourceIndex, nextSourceIndex; + + int32_t length; + + /* variables for compression heuristics */ + uint32_t offset; + UChar lead, trail; + int code; + int8_t window; + + /* set up the local pointers */ + cnv=pArgs->converter; + scsu=(SCSUData *)cnv->extraInfo; + + /* set up the local pointers */ + source=pArgs->source; + sourceLimit=pArgs->sourceLimit; + target=(uint8_t *)pArgs->target; + targetCapacity=(int32_t)(pArgs->targetLimit-pArgs->target); + offsets=pArgs->offsets; + + /* get the state machine state */ + isSingleByteMode=scsu->fromUIsSingleByteMode; + dynamicWindow=scsu->fromUDynamicWindow; + currentOffset=scsu->fromUDynamicOffsets[dynamicWindow]; + + c=cnv->fromUChar32; + + /* sourceIndex=-1 if the current character began in the previous buffer */ + sourceIndex= c==0 ? 0 : -1; + nextSourceIndex=0; + + /* similar conversion "loop" as in toUnicode */ +loop: + if(isSingleByteMode) { + if(c!=0 && targetCapacity>0) { + goto getTrailSingle; + } + + /* state machine for single-byte mode */ +/* singleByteMode: */ + while(sourcefromUDynamicOffsets, c))>=0) { + /* there is a dynamic window that contains this character, change to it */ + dynamicWindow=window; + currentOffset=scsu->fromUDynamicOffsets[dynamicWindow]; + useDynamicWindow(scsu, dynamicWindow); + c=((uint32_t)(SC0+dynamicWindow)<<8)|(c-currentOffset)|0x80; + length=2; + goto outputBytes; + } else if((code=getDynamicOffset(c, &offset))>=0) { + /* might check if there are more characters in this window to come */ + /* define an extended window with this character */ + code-=0x200; + dynamicWindow=getNextDynamicWindow(scsu); + currentOffset=scsu->fromUDynamicOffsets[dynamicWindow]=offset; + useDynamicWindow(scsu, dynamicWindow); + c=((uint32_t)SDX<<24)|((uint32_t)dynamicWindow<<21)|((uint32_t)code<<8)|(c-currentOffset)|0x80; + length=4; + goto outputBytes; + } else { + /* change to Unicode mode and output this (lead, trail) pair */ + isSingleByteMode=FALSE; + *target++=(uint8_t)SCU; + if(offsets!=NULL) { + *offsets++=sourceIndex; + } + --targetCapacity; + c=((uint32_t)lead<<16)|trail; + length=4; + goto outputBytes; + } + } else if(c<0xa0) { + /* quote C1 control character */ + c=(c&0x7f)|(SQ0+1)<<8; /* SQ0+1==SQ1 */ + length=2; + goto outputBytes; + } else if(c==0xfeff || c>=0xfff0) { + /* quote signature character=byte order mark and specials */ + c|=SQU<<16; + length=3; + goto outputBytes; + } else { + /* compress all other BMP characters */ + if((window=getWindow(scsu->fromUDynamicOffsets, c))>=0) { + /* there is a window defined that contains this character - switch to it or quote from it? */ + if(source>=sourceLimit || isInOffsetWindowOrDirect(scsu->fromUDynamicOffsets[window], *source)) { + /* change to dynamic window */ + dynamicWindow=window; + currentOffset=scsu->fromUDynamicOffsets[dynamicWindow]; + useDynamicWindow(scsu, dynamicWindow); + c=((uint32_t)(SC0+dynamicWindow)<<8)|(c-currentOffset)|0x80; + length=2; + goto outputBytes; + } else { + /* quote from dynamic window */ + c=((uint32_t)(SQ0+window)<<8)|(c-scsu->fromUDynamicOffsets[window])|0x80; + length=2; + goto outputBytes; + } + } else if((window=getWindow(staticOffsets, c))>=0) { + /* quote from static window */ + c=((uint32_t)(SQ0+window)<<8)|(c-staticOffsets[window]); + length=2; + goto outputBytes; + } else if((code=getDynamicOffset(c, &offset))>=0) { + /* define a dynamic window with this character */ + dynamicWindow=getNextDynamicWindow(scsu); + currentOffset=scsu->fromUDynamicOffsets[dynamicWindow]=offset; + useDynamicWindow(scsu, dynamicWindow); + c=((uint32_t)(SD0+dynamicWindow)<<16)|((uint32_t)code<<8)|(c-currentOffset)|0x80; + length=3; + goto outputBytes; + } else if((uint32_t)(c-0x3400)<(0xd800-0x3400) && + (source>=sourceLimit || (uint32_t)(*source-0x3400)<(0xd800-0x3400)) + ) { + /* + * this character is not compressible (a BMP ideograph or similar); + * switch to Unicode mode if this is the last character in the block + * or there is at least one more ideograph following immediately + */ + isSingleByteMode=FALSE; + c|=SCU<<16; + length=3; + goto outputBytes; + } else { + /* quote Unicode */ + c|=SQU<<16; + length=3; + goto outputBytes; + } + } + + /* normal end of conversion: prepare for a new character */ + c=0; + sourceIndex=nextSourceIndex; + } + } else { + if(c!=0 && targetCapacity>0) { + goto getTrailUnicode; + } + + /* state machine for Unicode mode */ +/* unicodeByteMode: */ + while(source=2) { + *target++=(uint8_t)(c>>8); + *target++=(uint8_t)c; + if(offsets!=NULL) { + *offsets++=sourceIndex; + *offsets++=sourceIndex; + } + targetCapacity-=2; + } else { + length=2; + goto outputBytes; + } + } else if((uint32_t)(c-0x3400)>=(0xf300-0x3400) /* c<0x3400 || c>=0xf300 */) { + /* compress BMP character if the following one is not an uncompressible ideograph */ + if(!(sourcefromUDynamicOffsets, c))>=0) { + /* there is a dynamic window that contains this character, change to it */ + isSingleByteMode=TRUE; + dynamicWindow=window; + currentOffset=scsu->fromUDynamicOffsets[dynamicWindow]; + useDynamicWindow(scsu, dynamicWindow); + c=((uint32_t)(UC0+dynamicWindow)<<8)|(c-currentOffset)|0x80; + length=2; + goto outputBytes; + } else if((code=getDynamicOffset(c, &offset))>=0) { + /* define a dynamic window with this character */ + isSingleByteMode=TRUE; + dynamicWindow=getNextDynamicWindow(scsu); + currentOffset=scsu->fromUDynamicOffsets[dynamicWindow]=offset; + useDynamicWindow(scsu, dynamicWindow); + c=((uint32_t)(UD0+dynamicWindow)<<16)|((uint32_t)code<<8)|(c-currentOffset)|0x80; + length=3; + goto outputBytes; + } + } + + /* don't know how to compress this character, just write it directly */ + length=2; + goto outputBytes; + } else if(c<0xe000) { + /* c is a surrogate */ + if(U16_IS_SURROGATE_LEAD(c)) { +getTrailUnicode: + lead=(UChar)c; + if(sourcefromUDynamicOffsets, c))>=0 && + !(sourcefromUDynamicOffsets[dynamicWindow]; + useDynamicWindow(scsu, dynamicWindow); + c=((uint32_t)(UC0+dynamicWindow)<<8)|(c-currentOffset)|0x80; + length=2; + goto outputBytes; + } else if(source=0 + ) { + /* two supplementary characters in (probably) the same window - define an extended one */ + isSingleByteMode=TRUE; + code-=0x200; + dynamicWindow=getNextDynamicWindow(scsu); + currentOffset=scsu->fromUDynamicOffsets[dynamicWindow]=offset; + useDynamicWindow(scsu, dynamicWindow); + c=((uint32_t)UDX<<24)|((uint32_t)dynamicWindow<<21)|((uint32_t)code<<8)|(c-currentOffset)|0x80; + length=4; + goto outputBytes; + } else { + /* don't know how to compress this character, just write it directly */ + c=((uint32_t)lead<<16)|trail; + length=4; + goto outputBytes; + } + } else /* 0xe000<=c<0xf300 */ { + /* quote to avoid SCSU tags */ + c|=UQU<<16; + length=3; + goto outputBytes; + } + + /* normal end of conversion: prepare for a new character */ + c=0; + sourceIndex=nextSourceIndex; + } + } +endloop: + + /* set the converter state back into UConverter */ + scsu->fromUIsSingleByteMode=isSingleByteMode; + scsu->fromUDynamicWindow=dynamicWindow; + + cnv->fromUChar32=c; + + /* write back the updated pointers */ + pArgs->source=source; + pArgs->target=(char *)target; + pArgs->offsets=offsets; + return; + +outputBytes: + /* write the output character bytes from c and length [code copied from ucnvmbcs.c] */ + /* from the first if in the loop we know that targetCapacity>0 */ + if(length<=targetCapacity) { + if(offsets==NULL) { + switch(length) { + /* each branch falls through to the next one */ + case 4: + *target++=(uint8_t)(c>>24); + U_FALLTHROUGH; + case 3: + *target++=(uint8_t)(c>>16); + U_FALLTHROUGH; + case 2: + *target++=(uint8_t)(c>>8); + U_FALLTHROUGH; + case 1: + *target++=(uint8_t)c; + U_FALLTHROUGH; + default: + /* will never occur */ + break; + } + } else { + switch(length) { + /* each branch falls through to the next one */ + case 4: + *target++=(uint8_t)(c>>24); + *offsets++=sourceIndex; + U_FALLTHROUGH; + case 3: + *target++=(uint8_t)(c>>16); + *offsets++=sourceIndex; + U_FALLTHROUGH; + case 2: + *target++=(uint8_t)(c>>8); + *offsets++=sourceIndex; + U_FALLTHROUGH; + case 1: + *target++=(uint8_t)c; + *offsets++=sourceIndex; + U_FALLTHROUGH; + default: + /* will never occur */ + break; + } + } + targetCapacity-=length; + + /* normal end of conversion: prepare for a new character */ + c=0; + sourceIndex=nextSourceIndex; + goto loop; + } else { + uint8_t *p; + + /* + * We actually do this backwards here: + * In order to save an intermediate variable, we output + * first to the overflow buffer what does not fit into the + * regular target. + */ + /* we know that 0<=targetCapacitycharErrorBuffer; + switch(length) { + /* each branch falls through to the next one */ + case 4: + *p++=(uint8_t)(c>>24); + U_FALLTHROUGH; + case 3: + *p++=(uint8_t)(c>>16); + U_FALLTHROUGH; + case 2: + *p++=(uint8_t)(c>>8); + U_FALLTHROUGH; + case 1: + *p=(uint8_t)c; + U_FALLTHROUGH; + default: + /* will never occur */ + break; + } + cnv->charErrorBufferLength=(int8_t)length; + + /* now output what fits into the regular target */ + c>>=8*length; /* length was reduced by targetCapacity */ + switch(targetCapacity) { + /* each branch falls through to the next one */ + case 3: + *target++=(uint8_t)(c>>16); + if(offsets!=NULL) { + *offsets++=sourceIndex; + } + U_FALLTHROUGH; + case 2: + *target++=(uint8_t)(c>>8); + if(offsets!=NULL) { + *offsets++=sourceIndex; + } + U_FALLTHROUGH; + case 1: + *target++=(uint8_t)c; + if(offsets!=NULL) { + *offsets++=sourceIndex; + } + U_FALLTHROUGH; + default: + break; + } + + /* target overflow */ + targetCapacity=0; + *pErrorCode=U_BUFFER_OVERFLOW_ERROR; + c=0; + goto endloop; + } +} + +/* + * Identical to _SCSUFromUnicodeWithOffsets but without offset handling. + * If a change is made in the original function, then either + * change this function the same way or + * re-copy the original function and remove the variables + * offsets, sourceIndex, and nextSourceIndex. + */ +static void U_CALLCONV +_SCSUFromUnicode(UConverterFromUnicodeArgs *pArgs, + UErrorCode *pErrorCode) { + UConverter *cnv; + SCSUData *scsu; + const UChar *source, *sourceLimit; + uint8_t *target; + int32_t targetCapacity; + + UBool isSingleByteMode; + uint8_t dynamicWindow; + uint32_t currentOffset; + + uint32_t c, delta; + + int32_t length; + + /* variables for compression heuristics */ + uint32_t offset; + UChar lead, trail; + int code; + int8_t window; + + /* set up the local pointers */ + cnv=pArgs->converter; + scsu=(SCSUData *)cnv->extraInfo; + + /* set up the local pointers */ + source=pArgs->source; + sourceLimit=pArgs->sourceLimit; + target=(uint8_t *)pArgs->target; + targetCapacity=(int32_t)(pArgs->targetLimit-pArgs->target); + + /* get the state machine state */ + isSingleByteMode=scsu->fromUIsSingleByteMode; + dynamicWindow=scsu->fromUDynamicWindow; + currentOffset=scsu->fromUDynamicOffsets[dynamicWindow]; + + c=cnv->fromUChar32; + + /* similar conversion "loop" as in toUnicode */ +loop: + if(isSingleByteMode) { + if(c!=0 && targetCapacity>0) { + goto getTrailSingle; + } + + /* state machine for single-byte mode */ +/* singleByteMode: */ + while(sourcefromUDynamicOffsets, c))>=0) { + /* there is a dynamic window that contains this character, change to it */ + dynamicWindow=window; + currentOffset=scsu->fromUDynamicOffsets[dynamicWindow]; + useDynamicWindow(scsu, dynamicWindow); + c=((uint32_t)(SC0+dynamicWindow)<<8)|(c-currentOffset)|0x80; + length=2; + goto outputBytes; + } else if((code=getDynamicOffset(c, &offset))>=0) { + /* might check if there are more characters in this window to come */ + /* define an extended window with this character */ + code-=0x200; + dynamicWindow=getNextDynamicWindow(scsu); + currentOffset=scsu->fromUDynamicOffsets[dynamicWindow]=offset; + useDynamicWindow(scsu, dynamicWindow); + c=((uint32_t)SDX<<24)|((uint32_t)dynamicWindow<<21)|((uint32_t)code<<8)|(c-currentOffset)|0x80; + length=4; + goto outputBytes; + } else { + /* change to Unicode mode and output this (lead, trail) pair */ + isSingleByteMode=FALSE; + *target++=(uint8_t)SCU; + --targetCapacity; + c=((uint32_t)lead<<16)|trail; + length=4; + goto outputBytes; + } + } else if(c<0xa0) { + /* quote C1 control character */ + c=(c&0x7f)|(SQ0+1)<<8; /* SQ0+1==SQ1 */ + length=2; + goto outputBytes; + } else if(c==0xfeff || c>=0xfff0) { + /* quote signature character=byte order mark and specials */ + c|=SQU<<16; + length=3; + goto outputBytes; + } else { + /* compress all other BMP characters */ + if((window=getWindow(scsu->fromUDynamicOffsets, c))>=0) { + /* there is a window defined that contains this character - switch to it or quote from it? */ + if(source>=sourceLimit || isInOffsetWindowOrDirect(scsu->fromUDynamicOffsets[window], *source)) { + /* change to dynamic window */ + dynamicWindow=window; + currentOffset=scsu->fromUDynamicOffsets[dynamicWindow]; + useDynamicWindow(scsu, dynamicWindow); + c=((uint32_t)(SC0+dynamicWindow)<<8)|(c-currentOffset)|0x80; + length=2; + goto outputBytes; + } else { + /* quote from dynamic window */ + c=((uint32_t)(SQ0+window)<<8)|(c-scsu->fromUDynamicOffsets[window])|0x80; + length=2; + goto outputBytes; + } + } else if((window=getWindow(staticOffsets, c))>=0) { + /* quote from static window */ + c=((uint32_t)(SQ0+window)<<8)|(c-staticOffsets[window]); + length=2; + goto outputBytes; + } else if((code=getDynamicOffset(c, &offset))>=0) { + /* define a dynamic window with this character */ + dynamicWindow=getNextDynamicWindow(scsu); + currentOffset=scsu->fromUDynamicOffsets[dynamicWindow]=offset; + useDynamicWindow(scsu, dynamicWindow); + c=((uint32_t)(SD0+dynamicWindow)<<16)|((uint32_t)code<<8)|(c-currentOffset)|0x80; + length=3; + goto outputBytes; + } else if((uint32_t)(c-0x3400)<(0xd800-0x3400) && + (source>=sourceLimit || (uint32_t)(*source-0x3400)<(0xd800-0x3400)) + ) { + /* + * this character is not compressible (a BMP ideograph or similar); + * switch to Unicode mode if this is the last character in the block + * or there is at least one more ideograph following immediately + */ + isSingleByteMode=FALSE; + c|=SCU<<16; + length=3; + goto outputBytes; + } else { + /* quote Unicode */ + c|=SQU<<16; + length=3; + goto outputBytes; + } + } + + /* normal end of conversion: prepare for a new character */ + c=0; + } + } else { + if(c!=0 && targetCapacity>0) { + goto getTrailUnicode; + } + + /* state machine for Unicode mode */ +/* unicodeByteMode: */ + while(source=2) { + *target++=(uint8_t)(c>>8); + *target++=(uint8_t)c; + targetCapacity-=2; + } else { + length=2; + goto outputBytes; + } + } else if((uint32_t)(c-0x3400)>=(0xf300-0x3400) /* c<0x3400 || c>=0xf300 */) { + /* compress BMP character if the following one is not an uncompressible ideograph */ + if(!(sourcefromUDynamicOffsets, c))>=0) { + /* there is a dynamic window that contains this character, change to it */ + isSingleByteMode=TRUE; + dynamicWindow=window; + currentOffset=scsu->fromUDynamicOffsets[dynamicWindow]; + useDynamicWindow(scsu, dynamicWindow); + c=((uint32_t)(UC0+dynamicWindow)<<8)|(c-currentOffset)|0x80; + length=2; + goto outputBytes; + } else if((code=getDynamicOffset(c, &offset))>=0) { + /* define a dynamic window with this character */ + isSingleByteMode=TRUE; + dynamicWindow=getNextDynamicWindow(scsu); + currentOffset=scsu->fromUDynamicOffsets[dynamicWindow]=offset; + useDynamicWindow(scsu, dynamicWindow); + c=((uint32_t)(UD0+dynamicWindow)<<16)|((uint32_t)code<<8)|(c-currentOffset)|0x80; + length=3; + goto outputBytes; + } + } + + /* don't know how to compress this character, just write it directly */ + length=2; + goto outputBytes; + } else if(c<0xe000) { + /* c is a surrogate */ + if(U16_IS_SURROGATE_LEAD(c)) { +getTrailUnicode: + lead=(UChar)c; + if(sourcefromUDynamicOffsets, c))>=0 && + !(sourcefromUDynamicOffsets[dynamicWindow]; + useDynamicWindow(scsu, dynamicWindow); + c=((uint32_t)(UC0+dynamicWindow)<<8)|(c-currentOffset)|0x80; + length=2; + goto outputBytes; + } else if(source=0 + ) { + /* two supplementary characters in (probably) the same window - define an extended one */ + isSingleByteMode=TRUE; + code-=0x200; + dynamicWindow=getNextDynamicWindow(scsu); + currentOffset=scsu->fromUDynamicOffsets[dynamicWindow]=offset; + useDynamicWindow(scsu, dynamicWindow); + c=((uint32_t)UDX<<24)|((uint32_t)dynamicWindow<<21)|((uint32_t)code<<8)|(c-currentOffset)|0x80; + length=4; + goto outputBytes; + } else { + /* don't know how to compress this character, just write it directly */ + c=((uint32_t)lead<<16)|trail; + length=4; + goto outputBytes; + } + } else /* 0xe000<=c<0xf300 */ { + /* quote to avoid SCSU tags */ + c|=UQU<<16; + length=3; + goto outputBytes; + } + + /* normal end of conversion: prepare for a new character */ + c=0; + } + } +endloop: + + /* set the converter state back into UConverter */ + scsu->fromUIsSingleByteMode=isSingleByteMode; + scsu->fromUDynamicWindow=dynamicWindow; + + cnv->fromUChar32=c; + + /* write back the updated pointers */ + pArgs->source=source; + pArgs->target=(char *)target; + return; + +outputBytes: + /* write the output character bytes from c and length [code copied from ucnvmbcs.c] */ + /* from the first if in the loop we know that targetCapacity>0 */ + if(length<=targetCapacity) { + switch(length) { + /* each branch falls through to the next one */ + case 4: + *target++=(uint8_t)(c>>24); + U_FALLTHROUGH; + case 3: + *target++=(uint8_t)(c>>16); + U_FALLTHROUGH; + case 2: + *target++=(uint8_t)(c>>8); + U_FALLTHROUGH; + case 1: + *target++=(uint8_t)c; + U_FALLTHROUGH; + default: + /* will never occur */ + break; + } + targetCapacity-=length; + + /* normal end of conversion: prepare for a new character */ + c=0; + goto loop; + } else { + uint8_t *p; + + /* + * We actually do this backwards here: + * In order to save an intermediate variable, we output + * first to the overflow buffer what does not fit into the + * regular target. + */ + /* we know that 0<=targetCapacitycharErrorBuffer; + switch(length) { + /* each branch falls through to the next one */ + case 4: + *p++=(uint8_t)(c>>24); + U_FALLTHROUGH; + case 3: + *p++=(uint8_t)(c>>16); + U_FALLTHROUGH; + case 2: + *p++=(uint8_t)(c>>8); + U_FALLTHROUGH; + case 1: + *p=(uint8_t)c; + U_FALLTHROUGH; + default: + /* will never occur */ + break; + } + cnv->charErrorBufferLength=(int8_t)length; + + /* now output what fits into the regular target */ + c>>=8*length; /* length was reduced by targetCapacity */ + switch(targetCapacity) { + /* each branch falls through to the next one */ + case 3: + *target++=(uint8_t)(c>>16); + U_FALLTHROUGH; + case 2: + *target++=(uint8_t)(c>>8); + U_FALLTHROUGH; + case 1: + *target++=(uint8_t)c; + U_FALLTHROUGH; + default: + break; + } + + /* target overflow */ + targetCapacity=0; + *pErrorCode=U_BUFFER_OVERFLOW_ERROR; + c=0; + goto endloop; + } +} + +/* miscellaneous ------------------------------------------------------------ */ + +static const char * U_CALLCONV +_SCSUGetName(const UConverter *cnv) { + SCSUData *scsu=(SCSUData *)cnv->extraInfo; + + switch(scsu->locale) { + case l_ja: + return "SCSU,locale=ja"; + default: + return "SCSU"; + } +} + +/* structure for SafeClone calculations */ +struct cloneSCSUStruct +{ + UConverter cnv; + SCSUData mydata; +}; + +static UConverter * U_CALLCONV +_SCSUSafeClone(const UConverter *cnv, + void *stackBuffer, + int32_t *pBufferSize, + UErrorCode *status) +{ + struct cloneSCSUStruct * localClone; + int32_t bufferSizeNeeded = sizeof(struct cloneSCSUStruct); + + if (U_FAILURE(*status)){ + return 0; + } + + if (*pBufferSize == 0){ /* 'preflighting' request - set needed size into *pBufferSize */ + *pBufferSize = bufferSizeNeeded; + return 0; + } + + localClone = (struct cloneSCSUStruct *)stackBuffer; + /* ucnv.c/ucnv_safeClone() copied the main UConverter already */ + + uprv_memcpy(&localClone->mydata, cnv->extraInfo, sizeof(SCSUData)); + localClone->cnv.extraInfo = &localClone->mydata; + localClone->cnv.isExtraLocal = TRUE; + + return &localClone->cnv; +} +U_CDECL_END + +static const UConverterImpl _SCSUImpl={ + UCNV_SCSU, + + NULL, + NULL, + + _SCSUOpen, + _SCSUClose, + _SCSUReset, + + _SCSUToUnicode, + _SCSUToUnicodeWithOffsets, + _SCSUFromUnicode, + _SCSUFromUnicodeWithOffsets, + NULL, + + NULL, + _SCSUGetName, + NULL, + _SCSUSafeClone, + ucnv_getCompleteUnicodeSet, + NULL, + NULL +}; + +static const UConverterStaticData _SCSUStaticData={ + sizeof(UConverterStaticData), + "SCSU", + 1212, /* CCSID for SCSU */ + UCNV_IBM, UCNV_SCSU, + 1, 3, /* one UChar generates at least 1 byte and at most 3 bytes */ + /* + * The subchar here is ignored because _SCSUOpen() sets U+fffd as a Unicode + * substitution string. + */ + { 0x0e, 0xff, 0xfd, 0 }, 3, + FALSE, FALSE, + 0, + 0, + { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 } /* reserved */ +}; + +const UConverterSharedData _SCSUData= + UCNV_IMMUTABLE_SHARED_DATA_INITIALIZER(&_SCSUStaticData, &_SCSUImpl); + +#endif diff --git a/Build/source/libs/icu/icu-src/source/common/ucnvsel.cpp b/Build/source/libs/icu/icu-src/source/common/ucnvsel.cpp index 573e8b061d6..ba062b35cec 100644 --- a/Build/source/libs/icu/icu-src/source/common/ucnvsel.cpp +++ b/Build/source/libs/icu/icu-src/source/common/ucnvsel.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* diff --git a/Build/source/libs/icu/icu-src/source/common/ucol_data.h b/Build/source/libs/icu/icu-src/source/common/ucol_data.h index cdd328eccab..83f54abba13 100644 --- a/Build/source/libs/icu/icu-src/source/common/ucol_data.h +++ b/Build/source/libs/icu/icu-src/source/common/ucol_data.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* @@ -6,7 +6,7 @@ * Corporation and others. All Rights Reserved. ******************************************************************************* * file name: ucol_data.h -* encoding: US-ASCII +* encoding: UTF-8 * tab size: 8 (not used) * indentation:4 * diff --git a/Build/source/libs/icu/icu-src/source/common/ucol_swp.cpp b/Build/source/libs/icu/icu-src/source/common/ucol_swp.cpp index 151800d151d..1822705d378 100644 --- a/Build/source/libs/icu/icu-src/source/common/ucol_swp.cpp +++ b/Build/source/libs/icu/icu-src/source/common/ucol_swp.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* @@ -8,7 +8,7 @@ * ******************************************************************************* * file name: ucol_swp.cpp -* encoding: US-ASCII +* encoding: UTF-8 * tab size: 8 (not used) * indentation:4 * diff --git a/Build/source/libs/icu/icu-src/source/common/ucol_swp.h b/Build/source/libs/icu/icu-src/source/common/ucol_swp.h index 422436dd307..fd8be9aa54f 100644 --- a/Build/source/libs/icu/icu-src/source/common/ucol_swp.h +++ b/Build/source/libs/icu/icu-src/source/common/ucol_swp.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* @@ -8,7 +8,7 @@ * ******************************************************************************* * file name: ucol_swp.h -* encoding: US-ASCII +* encoding: UTF-8 * tab size: 8 (not used) * indentation:4 * diff --git a/Build/source/libs/icu/icu-src/source/common/ucurr.cpp b/Build/source/libs/icu/icu-src/source/common/ucurr.cpp index db381733e66..a772da9a299 100644 --- a/Build/source/libs/icu/icu-src/source/common/ucurr.cpp +++ b/Build/source/libs/icu/icu-src/source/common/ucurr.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** @@ -25,6 +25,7 @@ #include "uenumimp.h" #include "uhash.h" #include "hash.h" +#include "uinvchar.h" #include "uresimp.h" #include "ulist.h" #include "ureslocs.h" @@ -545,93 +546,97 @@ U_CAPI int32_t U_EXPORT2 ucurr_forLocale(const char* locale, UChar* buff, int32_t buffCapacity, - UErrorCode* ec) -{ - int32_t resLen = 0; - const UChar* s = NULL; - if (ec != NULL && U_SUCCESS(*ec)) { - if ((buff && buffCapacity) || !buffCapacity) { - UErrorCode localStatus = U_ZERO_ERROR; - char id[ULOC_FULLNAME_CAPACITY]; - if ((resLen = uloc_getKeywordValue(locale, "currency", id, ULOC_FULLNAME_CAPACITY, &localStatus))) { - // there is a currency keyword. Try to see if it's valid - if(buffCapacity > resLen) { - /* Normalize the currency keyword value to upper case. */ - T_CString_toUpperCase(id); - u_charsToUChars(id, buff, resLen); - } - } else { - // get country or country_variant in `id' - uint32_t variantType = idForLocale(locale, id, sizeof(id), ec); + UErrorCode* ec) { + if (U_FAILURE(*ec)) { return 0; } + if (buffCapacity < 0 || (buff == nullptr && buffCapacity > 0)) { + *ec = U_ILLEGAL_ARGUMENT_ERROR; + return 0; + } - if (U_FAILURE(*ec)) { - return 0; - } + char currency[4]; // ISO currency codes are alpha3 codes. + UErrorCode localStatus = U_ZERO_ERROR; + int32_t resLen = uloc_getKeywordValue(locale, "currency", + currency, UPRV_LENGTHOF(currency), &localStatus); + if (U_SUCCESS(localStatus) && resLen == 3 && uprv_isInvariantString(currency, resLen)) { + if (resLen < buffCapacity) { + T_CString_toUpperCase(currency); + u_charsToUChars(currency, buff, resLen); + } + return u_terminateUChars(buff, buffCapacity, resLen, ec); + } + + // get country or country_variant in `id' + char id[ULOC_FULLNAME_CAPACITY]; + uint32_t variantType = idForLocale(locale, id, UPRV_LENGTHOF(id), ec); + if (U_FAILURE(*ec)) { + return 0; + } #if !UCONFIG_NO_SERVICE - const UChar* result = CReg::get(id); - if (result) { - if(buffCapacity > u_strlen(result)) { - u_strcpy(buff, result); - } - return u_strlen(result); - } + const UChar* result = CReg::get(id); + if (result) { + if(buffCapacity > u_strlen(result)) { + u_strcpy(buff, result); + } + resLen = u_strlen(result); + return u_terminateUChars(buff, buffCapacity, resLen, ec); + } #endif - // Remove variants, which is only needed for registration. - char *idDelim = strchr(id, VAR_DELIM); - if (idDelim) { - idDelim[0] = 0; - } + // Remove variants, which is only needed for registration. + char *idDelim = uprv_strchr(id, VAR_DELIM); + if (idDelim) { + idDelim[0] = 0; + } - // Look up the CurrencyMap element in the root bundle. - UResourceBundle *rb = ures_openDirect(U_ICUDATA_CURR, CURRENCY_DATA, &localStatus); - UResourceBundle *cm = ures_getByKey(rb, CURRENCY_MAP, rb, &localStatus); - UResourceBundle *countryArray = ures_getByKey(rb, id, cm, &localStatus); - UResourceBundle *currencyReq = ures_getByIndex(countryArray, 0, NULL, &localStatus); + const UChar* s = NULL; // Currency code from data file. + if (id[0] == 0) { + // No point looking in the data for an empty string. + // This is what we would get. + localStatus = U_MISSING_RESOURCE_ERROR; + } else { + // Look up the CurrencyMap element in the root bundle. + localStatus = U_ZERO_ERROR; + UResourceBundle *rb = ures_openDirect(U_ICUDATA_CURR, CURRENCY_DATA, &localStatus); + UResourceBundle *cm = ures_getByKey(rb, CURRENCY_MAP, rb, &localStatus); + UResourceBundle *countryArray = ures_getByKey(rb, id, cm, &localStatus); + UResourceBundle *currencyReq = ures_getByIndex(countryArray, 0, NULL, &localStatus); + s = ures_getStringByKey(currencyReq, "id", &resLen, &localStatus); + + // Get the second item when PREEURO is requested, and this is a known Euro country. + // If the requested variant is PREEURO, and this isn't a Euro country, + // assume that the country changed over to the Euro in the future. + // This is probably an old version of ICU that hasn't been updated yet. + // The latest currency is probably correct. + if (U_SUCCESS(localStatus)) { + if ((variantType & VARIANT_IS_PREEURO) && u_strcmp(s, EUR_STR) == 0) { + currencyReq = ures_getByIndex(countryArray, 1, currencyReq, &localStatus); s = ures_getStringByKey(currencyReq, "id", &resLen, &localStatus); - - /* - Get the second item when PREEURO is requested, and this is a known Euro country. - If the requested variant is PREEURO, and this isn't a Euro country, assume - that the country changed over to the Euro in the future. This is probably - an old version of ICU that hasn't been updated yet. The latest currency is - probably correct. - */ - if (U_SUCCESS(localStatus)) { - if ((variantType & VARIANT_IS_PREEURO) && u_strcmp(s, EUR_STR) == 0) { - currencyReq = ures_getByIndex(countryArray, 1, currencyReq, &localStatus); - s = ures_getStringByKey(currencyReq, "id", &resLen, &localStatus); - } - else if ((variantType & VARIANT_IS_EURO)) { - s = EUR_STR; - } - } - ures_close(countryArray); - ures_close(currencyReq); - - if ((U_FAILURE(localStatus)) && strchr(id, '_') != 0) - { - // We don't know about it. Check to see if we support the variant. - uloc_getParent(locale, id, sizeof(id), ec); - *ec = U_USING_FALLBACK_WARNING; - return ucurr_forLocale(id, buff, buffCapacity, ec); - } - else if (*ec == U_ZERO_ERROR || localStatus != U_ZERO_ERROR) { - // There is nothing to fallback to. Report the failure/warning if possible. - *ec = localStatus; - } - if (U_SUCCESS(*ec)) { - if(buffCapacity > resLen) { - u_strcpy(buff, s); - } - } + } else if ((variantType & VARIANT_IS_EURO)) { + s = EUR_STR; } - return u_terminateUChars(buff, buffCapacity, resLen, ec); - } else { - *ec = U_ILLEGAL_ARGUMENT_ERROR; } + ures_close(currencyReq); + ures_close(countryArray); } - return resLen; + + if ((U_FAILURE(localStatus)) && strchr(id, '_') != 0) { + // We don't know about it. Check to see if we support the variant. + uloc_getParent(locale, id, UPRV_LENGTHOF(id), ec); + *ec = U_USING_FALLBACK_WARNING; + // TODO: Loop over the shortened id rather than recursing and + // looking again for a currency keyword. + return ucurr_forLocale(id, buff, buffCapacity, ec); + } + if (*ec == U_ZERO_ERROR || localStatus != U_ZERO_ERROR) { + // There is nothing to fallback to. Report the failure/warning if possible. + *ec = localStatus; + } + if (U_SUCCESS(*ec)) { + if(buffCapacity > resLen) { + u_strcpy(buff, s); + } + } + return u_terminateUChars(buff, buffCapacity, resLen, ec); } // end registration @@ -648,7 +653,16 @@ static UBool fallback(char *loc) { return FALSE; } UErrorCode status = U_ZERO_ERROR; - uloc_getParent(loc, loc, (int32_t)uprv_strlen(loc), &status); + if (uprv_strcmp(loc, "en_GB") == 0) { + // HACK: See #13368. We need "en_GB" to fall back to "en_001" instead of "en" + // in order to consume the correct data strings. This hack will be removed + // when proper data sink loading is implemented here. + // NOTE: "001" adds 1 char over "GB". However, both call sites allocate + // arrays with length ULOC_FULLNAME_CAPACITY (plenty of room for en_001). + uprv_strcpy(loc + 3, "001"); + } else { + uloc_getParent(loc, loc, (int32_t)uprv_strlen(loc), &status); + } /* char *i = uprv_strrchr(loc, '_'); if (i == NULL) { @@ -1030,7 +1044,8 @@ collectCurrencyNames(const char* locale, const UnicodeString *symbol; while ((symbol = iter.next()) != NULL) { (*currencySymbols)[*total_currency_symbol_count].IsoCode = iso; - (*currencySymbols)[*total_currency_symbol_count].currencyName = (UChar*) symbol->getBuffer(); + (*currencySymbols)[*total_currency_symbol_count].currencyName = + const_cast(symbol->getBuffer()); (*currencySymbols)[*total_currency_symbol_count].flag = 0; (*currencySymbols)[(*total_currency_symbol_count)++].currencyNameLen = symbol->length(); } @@ -2215,6 +2230,7 @@ ucurr_countCurrencies(const char* locale, UErrorCode localStatus = U_ZERO_ERROR; char id[ULOC_FULLNAME_CAPACITY]; uloc_getKeywordValue(locale, "currency", id, ULOC_FULLNAME_CAPACITY, &localStatus); + // get country or country_variant in `id' /*uint32_t variantType =*/ idForLocale(locale, id, sizeof(id), ec); diff --git a/Build/source/libs/icu/icu-src/source/common/ucurrimp.h b/Build/source/libs/icu/icu-src/source/common/ucurrimp.h index b35d6f47c62..6e468fd4c94 100644 --- a/Build/source/libs/icu/icu-src/source/common/ucurrimp.h +++ b/Build/source/libs/icu/icu-src/source/common/ucurrimp.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** diff --git a/Build/source/libs/icu/icu-src/source/common/udata.cpp b/Build/source/libs/icu/icu-src/source/common/udata.cpp index ec72a0ce2c7..3cb8863f6c3 100644 --- a/Build/source/libs/icu/icu-src/source/common/udata.cpp +++ b/Build/source/libs/icu/icu-src/source/common/udata.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ****************************************************************************** @@ -8,7 +8,7 @@ * ****************************************************************************** * file name: udata.cpp -* encoding: US-ASCII +* encoding: UTF-8 * tab size: 8 (not used) * indentation:4 * @@ -110,8 +110,12 @@ static u_atomic_int32_t gHaveTriedToLoadCommonData = ATOMIC_INT32_T_INITIALIZER( static UHashtable *gCommonDataCache = NULL; /* Global hash table of opened ICU data files. */ static icu::UInitOnce gCommonDataCacheInitOnce = U_INITONCE_INITIALIZER; +#if U_PLATFORM_HAS_WINUWP_API == 0 static UDataFileAccess gDataFileAccess = UDATA_DEFAULT_ACCESS; // Access not synchronized. // Modifying is documented as thread-unsafe. +#else +static UDataFileAccess gDataFileAccess = UDATA_NO_FILES; // Windows UWP looks in one spot explicitly +#endif static UBool U_CALLCONV udata_cleanup(void) @@ -202,6 +206,8 @@ setCommonICUData(UDataMemory *pData, /* The new common data. Belongs to ca return didUpdate; } +#if U_PLATFORM_HAS_WINUWP_API == 0 + static UBool setCommonICUDataPointer(const void *pData, UBool /*warn*/, UErrorCode *pErrorCode) { UDataMemory tData; @@ -211,6 +217,8 @@ setCommonICUDataPointer(const void *pData, UBool /*warn*/, UErrorCode *pErrorCod return setCommonICUData(&tData, FALSE, pErrorCode); } +#endif + static const char * findBasename(const char *path) { const char *basename=uprv_strrchr(path, U_FILE_SEP_CHAR); @@ -619,12 +627,14 @@ U_NAMESPACE_END /*----------------------------------------------------------------------* * * - * Add a static reference to the common data library * + * Add a static reference to the common data library * * Unless overridden by an explicit udata_setCommonData, this will be * * our common data. * * * *----------------------------------------------------------------------*/ +#if U_PLATFORM_HAS_WINUWP_API == 0 // Windows UWP Platform does not support dll icu data at this time extern "C" const DataHeader U_DATA_API U_ICUDATA_ENTRY_POINT; +#endif /* * This would be a good place for weak-linkage declarations of @@ -672,6 +682,7 @@ openCommonData(const char *path, /* Path from OpenChoice? */ if(gCommonICUDataArray[commonDataIndex] != NULL) { return gCommonICUDataArray[commonDataIndex]; } +#if U_PLATFORM_HAS_WINUWP_API == 0 // Windows UWP Platform does not support dll icu data at this time int32_t i; for(i = 0; i < commonDataIndex; ++i) { if(gCommonICUDataArray[i]->pHeader == &U_ICUDATA_ENTRY_POINT) { @@ -679,6 +690,7 @@ openCommonData(const char *path, /* Path from OpenChoice? */ return NULL; } } +#endif } /* Add the linked-in data to the list. */ @@ -694,11 +706,13 @@ openCommonData(const char *path, /* Path from OpenChoice? */ setCommonICUDataPointer(uprv_getICUData_conversion(), FALSE, pErrorCode); } */ +#if U_PLATFORM_HAS_WINUWP_API == 0 // Windows UWP Platform does not support dll icu data at this time setCommonICUDataPointer(&U_ICUDATA_ENTRY_POINT, FALSE, pErrorCode); { Mutex lock; return gCommonICUDataArray[commonDataIndex]; } +#endif } @@ -972,7 +986,7 @@ static UDataMemory *doLoadFromIndividualFiles(const char *pkgName, /* init path iterator for individual files */ UDataPathIterator iter(dataPath, pkgName, path, tocEntryPathSuffix, FALSE, pErrorCode); - while((pathBuffer = iter.next(pErrorCode))) + while((pathBuffer = iter.next(pErrorCode)) != NULL) { #ifdef UDATA_DEBUG fprintf(stderr, "UDATA: trying individual file %s\n", pathBuffer); @@ -1155,7 +1169,7 @@ doOpenChoice(const char *path, const char *type, const char *name, if(uprv_strchr(path,U_FILE_ALT_SEP_CHAR) != NULL) { altSepPath.append(path, *pErrorCode); char *p; - while((p=uprv_strchr(altSepPath.data(), U_FILE_ALT_SEP_CHAR))) { + while ((p = uprv_strchr(altSepPath.data(), U_FILE_ALT_SEP_CHAR)) != NULL) { *p = U_FILE_SEP_CHAR; } #if defined (UDATA_DEBUG) @@ -1245,9 +1259,14 @@ doOpenChoice(const char *path, const char *type, const char *name, fprintf(stderr, " tocEntryPath = %s\n", tocEntryName.data()); #endif +#if U_PLATFORM_HAS_WINUWP_API == 0 // Windows UWP Platform does not support dll icu data at this time if(path == NULL) { path = COMMON_DATA_NAME; /* "icudt26e" */ } +#else + // Windows UWP expects only a single data file. + path = COMMON_DATA_NAME; /* "icudt26e" */ +#endif /************************ Begin loop looking for ind. files ***************/ #ifdef UDATA_DEBUG diff --git a/Build/source/libs/icu/icu-src/source/common/udatamem.c b/Build/source/libs/icu/icu-src/source/common/udatamem.c deleted file mode 100644 index daa919373b7..00000000000 --- a/Build/source/libs/icu/icu-src/source/common/udatamem.c +++ /dev/null @@ -1,161 +0,0 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. -// License & terms of use: http://www.unicode.org/copyright.html -/* -****************************************************************************** -* -* Copyright (C) 1999-2011, International Business Machines -* Corporation and others. All Rights Reserved. -* -******************************************************************************/ - - -/*---------------------------------------------------------------------------------- - * - * UDataMemory A class-like struct that serves as a handle to a piece of memory - * that contains some ICU data (resource, converters, whatever.) - * - * When an application opens ICU data (with udata_open, for example, - * a UDataMemory * is returned. - * - *----------------------------------------------------------------------------------*/ - -#include "unicode/utypes.h" -#include "cmemory.h" -#include "unicode/udata.h" - -#include "udatamem.h" - -U_CFUNC void UDataMemory_init(UDataMemory *This) { - uprv_memset(This, 0, sizeof(UDataMemory)); - This->length=-1; -} - - -U_CFUNC void UDatamemory_assign(UDataMemory *dest, UDataMemory *source) { - /* UDataMemory Assignment. Destination UDataMemory must be initialized first. */ - UBool mallocedFlag = dest->heapAllocated; - uprv_memcpy(dest, source, sizeof(UDataMemory)); - dest->heapAllocated = mallocedFlag; -} - -U_CFUNC UDataMemory *UDataMemory_createNewInstance(UErrorCode *pErr) { - UDataMemory *This; - - if (U_FAILURE(*pErr)) { - return NULL; - } - This = uprv_malloc(sizeof(UDataMemory)); - if (This == NULL) { - *pErr = U_MEMORY_ALLOCATION_ERROR; } - else { - UDataMemory_init(This); - This->heapAllocated = TRUE; - } - return This; -} - - -U_CFUNC const DataHeader * -UDataMemory_normalizeDataPointer(const void *p) { - /* allow the data to be optionally prepended with an alignment-forcing double value */ - const DataHeader *pdh = (const DataHeader *)p; - if(pdh==NULL || (pdh->dataHeader.magic1==0xda && pdh->dataHeader.magic2==0x27)) { - return pdh; - } else { -#if U_PLATFORM == U_PF_OS400 - /* - TODO: Fix this once the compiler implements this feature. Keep in sync with genccode.c - - This is here because this platform can't currently put - const data into the read-only pages of an object or - shared library (service program). Only strings are allowed in read-only - pages, so we use char * strings to store the data. - - In order to prevent the beginning of the data from ever matching the - magic numbers we must skip the initial double. - [grhoten 4/24/2003] - */ - return (const DataHeader *)*((const void **)p+1); -#else - return (const DataHeader *)((const double *)p+1); -#endif - } -} - - -U_CFUNC void UDataMemory_setData (UDataMemory *This, const void *dataAddr) { - This->pHeader = UDataMemory_normalizeDataPointer(dataAddr); -} - - -U_CAPI void U_EXPORT2 -udata_close(UDataMemory *pData) { - if(pData!=NULL) { - uprv_unmapFile(pData); - if(pData->heapAllocated ) { - uprv_free(pData); - } else { - UDataMemory_init(pData); - } - } -} - -U_CAPI const void * U_EXPORT2 -udata_getMemory(UDataMemory *pData) { - if(pData!=NULL && pData->pHeader!=NULL) { - return (char *)(pData->pHeader)+udata_getHeaderSize(pData->pHeader); - } else { - return NULL; - } -} - -/** - * Get the length of the data item if possible. - * The length may be up to 15 bytes larger than the actual data. - * - * TODO Consider making this function public. - * It would have to return the actual length in more cases. - * For example, the length of the last item in a .dat package could be - * computed from the size of the whole .dat package minus the offset of the - * last item. - * The size of a file that was directly memory-mapped could be determined - * using some system API. - * - * In order to get perfect values for all data items, we may have to add a - * length field to UDataInfo, but that complicates data generation - * and may be overkill. - * - * @param pData The data item. - * @return the length of the data item, or -1 if not known - * @internal Currently used only in cintltst/udatatst.c - */ -U_CAPI int32_t U_EXPORT2 -udata_getLength(const UDataMemory *pData) { - if(pData!=NULL && pData->pHeader!=NULL && pData->length>=0) { - /* - * subtract the header size, - * return only the size of the actual data starting at udata_getMemory() - */ - return pData->length-udata_getHeaderSize(pData->pHeader); - } else { - return -1; - } -} - -/** - * Get the memory including the data header. - * Used in cintltst/udatatst.c - * @internal - */ -U_CAPI const void * U_EXPORT2 -udata_getRawMemory(const UDataMemory *pData) { - if(pData!=NULL && pData->pHeader!=NULL) { - return pData->pHeader; - } else { - return NULL; - } -} - -U_CFUNC UBool UDataMemory_isLoaded(const UDataMemory *This) { - return This->pHeader != NULL; -} diff --git a/Build/source/libs/icu/icu-src/source/common/udatamem.cpp b/Build/source/libs/icu/icu-src/source/common/udatamem.cpp new file mode 100644 index 00000000000..6bf7c01235c --- /dev/null +++ b/Build/source/libs/icu/icu-src/source/common/udatamem.cpp @@ -0,0 +1,161 @@ +// © 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html +/* +****************************************************************************** +* +* Copyright (C) 1999-2011, International Business Machines +* Corporation and others. All Rights Reserved. +* +******************************************************************************/ + + +/*---------------------------------------------------------------------------------- + * + * UDataMemory A class-like struct that serves as a handle to a piece of memory + * that contains some ICU data (resource, converters, whatever.) + * + * When an application opens ICU data (with udata_open, for example, + * a UDataMemory * is returned. + * + *----------------------------------------------------------------------------------*/ + +#include "unicode/utypes.h" +#include "cmemory.h" +#include "unicode/udata.h" + +#include "udatamem.h" + +U_CFUNC void UDataMemory_init(UDataMemory *This) { + uprv_memset(This, 0, sizeof(UDataMemory)); + This->length=-1; +} + + +U_CFUNC void UDatamemory_assign(UDataMemory *dest, UDataMemory *source) { + /* UDataMemory Assignment. Destination UDataMemory must be initialized first. */ + UBool mallocedFlag = dest->heapAllocated; + uprv_memcpy(dest, source, sizeof(UDataMemory)); + dest->heapAllocated = mallocedFlag; +} + +U_CFUNC UDataMemory *UDataMemory_createNewInstance(UErrorCode *pErr) { + UDataMemory *This; + + if (U_FAILURE(*pErr)) { + return NULL; + } + This = (UDataMemory *)uprv_malloc(sizeof(UDataMemory)); + if (This == NULL) { + *pErr = U_MEMORY_ALLOCATION_ERROR; } + else { + UDataMemory_init(This); + This->heapAllocated = TRUE; + } + return This; +} + + +U_CFUNC const DataHeader * +UDataMemory_normalizeDataPointer(const void *p) { + /* allow the data to be optionally prepended with an alignment-forcing double value */ + const DataHeader *pdh = (const DataHeader *)p; + if(pdh==NULL || (pdh->dataHeader.magic1==0xda && pdh->dataHeader.magic2==0x27)) { + return pdh; + } else { +#if U_PLATFORM == U_PF_OS400 + /* + TODO: Fix this once the compiler implements this feature. Keep in sync with genccode.c + + This is here because this platform can't currently put + const data into the read-only pages of an object or + shared library (service program). Only strings are allowed in read-only + pages, so we use char * strings to store the data. + + In order to prevent the beginning of the data from ever matching the + magic numbers we must skip the initial double. + [grhoten 4/24/2003] + */ + return (const DataHeader *)*((const void **)p+1); +#else + return (const DataHeader *)((const double *)p+1); +#endif + } +} + + +U_CFUNC void UDataMemory_setData (UDataMemory *This, const void *dataAddr) { + This->pHeader = UDataMemory_normalizeDataPointer(dataAddr); +} + + +U_CAPI void U_EXPORT2 +udata_close(UDataMemory *pData) { + if(pData!=NULL) { + uprv_unmapFile(pData); + if(pData->heapAllocated ) { + uprv_free(pData); + } else { + UDataMemory_init(pData); + } + } +} + +U_CAPI const void * U_EXPORT2 +udata_getMemory(UDataMemory *pData) { + if(pData!=NULL && pData->pHeader!=NULL) { + return (char *)(pData->pHeader)+udata_getHeaderSize(pData->pHeader); + } else { + return NULL; + } +} + +/** + * Get the length of the data item if possible. + * The length may be up to 15 bytes larger than the actual data. + * + * TODO Consider making this function public. + * It would have to return the actual length in more cases. + * For example, the length of the last item in a .dat package could be + * computed from the size of the whole .dat package minus the offset of the + * last item. + * The size of a file that was directly memory-mapped could be determined + * using some system API. + * + * In order to get perfect values for all data items, we may have to add a + * length field to UDataInfo, but that complicates data generation + * and may be overkill. + * + * @param pData The data item. + * @return the length of the data item, or -1 if not known + * @internal Currently used only in cintltst/udatatst.c + */ +U_CAPI int32_t U_EXPORT2 +udata_getLength(const UDataMemory *pData) { + if(pData!=NULL && pData->pHeader!=NULL && pData->length>=0) { + /* + * subtract the header size, + * return only the size of the actual data starting at udata_getMemory() + */ + return pData->length-udata_getHeaderSize(pData->pHeader); + } else { + return -1; + } +} + +/** + * Get the memory including the data header. + * Used in cintltst/udatatst.c + * @internal + */ +U_CAPI const void * U_EXPORT2 +udata_getRawMemory(const UDataMemory *pData) { + if(pData!=NULL && pData->pHeader!=NULL) { + return pData->pHeader; + } else { + return NULL; + } +} + +U_CFUNC UBool UDataMemory_isLoaded(const UDataMemory *This) { + return This->pHeader != NULL; +} diff --git a/Build/source/libs/icu/icu-src/source/common/udatamem.h b/Build/source/libs/icu/icu-src/source/common/udatamem.h index 385a77722cc..a05dd697568 100644 --- a/Build/source/libs/icu/icu-src/source/common/udatamem.h +++ b/Build/source/libs/icu/icu-src/source/common/udatamem.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ****************************************************************************** diff --git a/Build/source/libs/icu/icu-src/source/common/udataswp.c b/Build/source/libs/icu/icu-src/source/common/udataswp.c deleted file mode 100644 index f47ac1f5e06..00000000000 --- a/Build/source/libs/icu/icu-src/source/common/udataswp.c +++ /dev/null @@ -1,473 +0,0 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. -// License & terms of use: http://www.unicode.org/copyright.html -/* -******************************************************************************* -* -* Copyright (C) 2003-2014, International Business Machines -* Corporation and others. All Rights Reserved. -* -******************************************************************************* -* file name: udataswp.c -* encoding: US-ASCII -* tab size: 8 (not used) -* indentation:4 -* -* created on: 2003jun05 -* created by: Markus W. Scherer -* -* Definitions for ICU data transformations for different platforms, -* changing between big- and little-endian data and/or between -* charset families (ASCII<->EBCDIC). -*/ - -#include -#include "unicode/utypes.h" -#include "unicode/udata.h" /* UDataInfo */ -#include "ucmndata.h" /* DataHeader */ -#include "cmemory.h" -#include "udataswp.h" - -/* swapping primitives ------------------------------------------------------ */ - -static int32_t U_CALLCONV -uprv_swapArray16(const UDataSwapper *ds, - const void *inData, int32_t length, void *outData, - UErrorCode *pErrorCode) { - const uint16_t *p; - uint16_t *q; - int32_t count; - uint16_t x; - - if(pErrorCode==NULL || U_FAILURE(*pErrorCode)) { - return 0; - } - if(ds==NULL || inData==NULL || length<0 || (length&1)!=0 || outData==NULL) { - *pErrorCode=U_ILLEGAL_ARGUMENT_ERROR; - return 0; - } - - /* setup and swapping */ - p=(const uint16_t *)inData; - q=(uint16_t *)outData; - count=length/2; - while(count>0) { - x=*p++; - *q++=(uint16_t)((x<<8)|(x>>8)); - --count; - } - - return length; -} - -static int32_t U_CALLCONV -uprv_copyArray16(const UDataSwapper *ds, - const void *inData, int32_t length, void *outData, - UErrorCode *pErrorCode) { - if(pErrorCode==NULL || U_FAILURE(*pErrorCode)) { - return 0; - } - if(ds==NULL || inData==NULL || length<0 || (length&1)!=0 || outData==NULL) { - *pErrorCode=U_ILLEGAL_ARGUMENT_ERROR; - return 0; - } - - if(length>0 && inData!=outData) { - uprv_memcpy(outData, inData, length); - } - return length; -} - -static int32_t U_CALLCONV -uprv_swapArray32(const UDataSwapper *ds, - const void *inData, int32_t length, void *outData, - UErrorCode *pErrorCode) { - const uint32_t *p; - uint32_t *q; - int32_t count; - uint32_t x; - - if(pErrorCode==NULL || U_FAILURE(*pErrorCode)) { - return 0; - } - if(ds==NULL || inData==NULL || length<0 || (length&3)!=0 || outData==NULL) { - *pErrorCode=U_ILLEGAL_ARGUMENT_ERROR; - return 0; - } - - /* setup and swapping */ - p=(const uint32_t *)inData; - q=(uint32_t *)outData; - count=length/4; - while(count>0) { - x=*p++; - *q++=(uint32_t)((x<<24)|((x<<8)&0xff0000)|((x>>8)&0xff00)|(x>>24)); - --count; - } - - return length; -} - -static int32_t U_CALLCONV -uprv_copyArray32(const UDataSwapper *ds, - const void *inData, int32_t length, void *outData, - UErrorCode *pErrorCode) { - if(pErrorCode==NULL || U_FAILURE(*pErrorCode)) { - return 0; - } - if(ds==NULL || inData==NULL || length<0 || (length&3)!=0 || outData==NULL) { - *pErrorCode=U_ILLEGAL_ARGUMENT_ERROR; - return 0; - } - - if(length>0 && inData!=outData) { - uprv_memcpy(outData, inData, length); - } - return length; -} - -static int32_t U_CALLCONV -uprv_swapArray64(const UDataSwapper *ds, - const void *inData, int32_t length, void *outData, - UErrorCode *pErrorCode) { - const uint64_t *p; - uint64_t *q; - int32_t count; - - if(pErrorCode==NULL || U_FAILURE(*pErrorCode)) { - return 0; - } - if(ds==NULL || inData==NULL || length<0 || (length&7)!=0 || outData==NULL) { - *pErrorCode=U_ILLEGAL_ARGUMENT_ERROR; - return 0; - } - - /* setup and swapping */ - p=(const uint64_t *)inData; - q=(uint64_t *)outData; - count=length/8; - while(count>0) { - uint64_t x=*p++; - x=(x<<56)|((x&0xff00)<<40)|((x&0xff0000)<<24)|((x&0xff000000)<<8)| - ((x>>8)&0xff000000)|((x>>24)&0xff0000)|((x>>40)&0xff00)|(x>>56); - *q++=x; - --count; - } - - return length; -} - -static int32_t U_CALLCONV -uprv_copyArray64(const UDataSwapper *ds, - const void *inData, int32_t length, void *outData, - UErrorCode *pErrorCode) { - if(pErrorCode==NULL || U_FAILURE(*pErrorCode)) { - return 0; - } - if(ds==NULL || inData==NULL || length<0 || (length&7)!=0 || outData==NULL) { - *pErrorCode=U_ILLEGAL_ARGUMENT_ERROR; - return 0; - } - - if(length>0 && inData!=outData) { - uprv_memcpy(outData, inData, length); - } - return length; -} - -static uint16_t U_CALLCONV -uprv_readSwapUInt16(uint16_t x) { - return (uint16_t)((x<<8)|(x>>8)); -} - -static uint16_t U_CALLCONV -uprv_readDirectUInt16(uint16_t x) { - return x; -} - -static uint32_t U_CALLCONV -uprv_readSwapUInt32(uint32_t x) { - return (uint32_t)((x<<24)|((x<<8)&0xff0000)|((x>>8)&0xff00)|(x>>24)); -} - -static uint32_t U_CALLCONV -uprv_readDirectUInt32(uint32_t x) { - return x; -} - -static void U_CALLCONV -uprv_writeSwapUInt16(uint16_t *p, uint16_t x) { - *p=(uint16_t)((x<<8)|(x>>8)); -} - -static void U_CALLCONV -uprv_writeDirectUInt16(uint16_t *p, uint16_t x) { - *p=x; -} - -static void U_CALLCONV -uprv_writeSwapUInt32(uint32_t *p, uint32_t x) { - *p=(uint32_t)((x<<24)|((x<<8)&0xff0000)|((x>>8)&0xff00)|(x>>24)); -} - -static void U_CALLCONV -uprv_writeDirectUInt32(uint32_t *p, uint32_t x) { - *p=x; -} - -U_CAPI int16_t U_EXPORT2 -udata_readInt16(const UDataSwapper *ds, int16_t x) { - return (int16_t)ds->readUInt16((uint16_t)x); -} - -U_CAPI int32_t U_EXPORT2 -udata_readInt32(const UDataSwapper *ds, int32_t x) { - return (int32_t)ds->readUInt32((uint32_t)x); -} - -/** - * Swap a block of invariant, NUL-terminated strings, but not padding - * bytes after the last string. - * @internal - */ -U_CAPI int32_t U_EXPORT2 -udata_swapInvStringBlock(const UDataSwapper *ds, - const void *inData, int32_t length, void *outData, - UErrorCode *pErrorCode) { - const char *inChars; - int32_t stringsLength; - - if(pErrorCode==NULL || U_FAILURE(*pErrorCode)) { - return 0; - } - if(ds==NULL || inData==NULL || length<0 || (length>0 && outData==NULL)) { - *pErrorCode=U_ILLEGAL_ARGUMENT_ERROR; - return 0; - } - - /* reduce the strings length to not include bytes after the last NUL */ - inChars=(const char *)inData; - stringsLength=length; - while(stringsLength>0 && inChars[stringsLength-1]!=0) { - --stringsLength; - } - - /* swap up to the last NUL */ - ds->swapInvChars(ds, inData, stringsLength, outData, pErrorCode); - - /* copy the bytes after the last NUL */ - if(inData!=outData && length>stringsLength) { - uprv_memcpy((char *)outData+stringsLength, inChars+stringsLength, length-stringsLength); - } - - /* return the length including padding bytes */ - if(U_SUCCESS(*pErrorCode)) { - return length; - } else { - return 0; - } -} - -U_CAPI void U_EXPORT2 -udata_printError(const UDataSwapper *ds, - const char *fmt, - ...) { - va_list args; - - if(ds->printError!=NULL) { - va_start(args, fmt); - ds->printError(ds->printErrorContext, fmt, args); - va_end(args); - } -} - -/* swap a data header ------------------------------------------------------- */ - -U_CAPI int32_t U_EXPORT2 -udata_swapDataHeader(const UDataSwapper *ds, - const void *inData, int32_t length, void *outData, - UErrorCode *pErrorCode) { - const DataHeader *pHeader; - uint16_t headerSize, infoSize; - - /* argument checking */ - if(pErrorCode==NULL || U_FAILURE(*pErrorCode)) { - return 0; - } - if(ds==NULL || inData==NULL || length<-1 || (length>0 && outData==NULL)) { - *pErrorCode=U_ILLEGAL_ARGUMENT_ERROR; - return 0; - } - - /* check minimum length and magic bytes */ - pHeader=(const DataHeader *)inData; - if( (length>=0 && length<(int32_t)sizeof(DataHeader)) || - pHeader->dataHeader.magic1!=0xda || - pHeader->dataHeader.magic2!=0x27 || - pHeader->info.sizeofUChar!=2 - ) { - udata_printError(ds, "udata_swapDataHeader(): initial bytes do not look like ICU data\n"); - *pErrorCode=U_UNSUPPORTED_ERROR; - return 0; - } - - headerSize=ds->readUInt16(pHeader->dataHeader.headerSize); - infoSize=ds->readUInt16(pHeader->info.size); - - if( headerSizedataHeader)+infoSize) || - (length>=0 && length0) { - DataHeader *outHeader; - const char *s; - int32_t maxLength; - - /* Most of the fields are just bytes and need no swapping. */ - if(inData!=outData) { - uprv_memcpy(outData, inData, headerSize); - } - outHeader=(DataHeader *)outData; - - outHeader->info.isBigEndian = ds->outIsBigEndian; - outHeader->info.charsetFamily = ds->outCharset; - - /* swap headerSize */ - ds->swapArray16(ds, &pHeader->dataHeader.headerSize, 2, &outHeader->dataHeader.headerSize, pErrorCode); - - /* swap UDataInfo size and reservedWord */ - ds->swapArray16(ds, &pHeader->info.size, 4, &outHeader->info.size, pErrorCode); - - /* swap copyright statement after the UDataInfo */ - infoSize+=sizeof(pHeader->dataHeader); - s=(const char *)inData+infoSize; - maxLength=headerSize-infoSize; - /* get the length of the string */ - for(length=0; lengthswapInvChars(ds, s, length, (char *)outData+infoSize, pErrorCode); - } - - return headerSize; -} - -/* API functions ------------------------------------------------------------ */ - -U_CAPI UDataSwapper * U_EXPORT2 -udata_openSwapper(UBool inIsBigEndian, uint8_t inCharset, - UBool outIsBigEndian, uint8_t outCharset, - UErrorCode *pErrorCode) { - UDataSwapper *swapper; - - if(pErrorCode==NULL || U_FAILURE(*pErrorCode)) { - return NULL; - } - if(inCharset>U_EBCDIC_FAMILY || outCharset>U_EBCDIC_FAMILY) { - *pErrorCode=U_ILLEGAL_ARGUMENT_ERROR; - return NULL; - } - - /* allocate the swapper */ - swapper=uprv_malloc(sizeof(UDataSwapper)); - if(swapper==NULL) { - *pErrorCode=U_MEMORY_ALLOCATION_ERROR; - return NULL; - } - uprv_memset(swapper, 0, sizeof(UDataSwapper)); - - /* set values and functions pointers according to in/out parameters */ - swapper->inIsBigEndian=inIsBigEndian; - swapper->inCharset=inCharset; - swapper->outIsBigEndian=outIsBigEndian; - swapper->outCharset=outCharset; - - swapper->readUInt16= inIsBigEndian==U_IS_BIG_ENDIAN ? uprv_readDirectUInt16 : uprv_readSwapUInt16; - swapper->readUInt32= inIsBigEndian==U_IS_BIG_ENDIAN ? uprv_readDirectUInt32 : uprv_readSwapUInt32; - - swapper->writeUInt16= outIsBigEndian==U_IS_BIG_ENDIAN ? uprv_writeDirectUInt16 : uprv_writeSwapUInt16; - swapper->writeUInt32= outIsBigEndian==U_IS_BIG_ENDIAN ? uprv_writeDirectUInt32 : uprv_writeSwapUInt32; - - swapper->compareInvChars= outCharset==U_ASCII_FAMILY ? uprv_compareInvAscii : uprv_compareInvEbcdic; - - if(inIsBigEndian==outIsBigEndian) { - swapper->swapArray16=uprv_copyArray16; - swapper->swapArray32=uprv_copyArray32; - swapper->swapArray64=uprv_copyArray64; - } else { - swapper->swapArray16=uprv_swapArray16; - swapper->swapArray32=uprv_swapArray32; - swapper->swapArray64=uprv_swapArray64; - } - - if(inCharset==U_ASCII_FAMILY) { - swapper->swapInvChars= outCharset==U_ASCII_FAMILY ? uprv_copyAscii : uprv_ebcdicFromAscii; - } else /* U_EBCDIC_FAMILY */ { - swapper->swapInvChars= outCharset==U_EBCDIC_FAMILY ? uprv_copyEbcdic : uprv_asciiFromEbcdic; - } - - return swapper; -} - -U_CAPI UDataSwapper * U_EXPORT2 -udata_openSwapperForInputData(const void *data, int32_t length, - UBool outIsBigEndian, uint8_t outCharset, - UErrorCode *pErrorCode) { - const DataHeader *pHeader; - uint16_t headerSize, infoSize; - UBool inIsBigEndian; - int8_t inCharset; - - if(pErrorCode==NULL || U_FAILURE(*pErrorCode)) { - return NULL; - } - if( data==NULL || - (length>=0 && length<(int32_t)sizeof(DataHeader)) || - outCharset>U_EBCDIC_FAMILY - ) { - *pErrorCode=U_ILLEGAL_ARGUMENT_ERROR; - return NULL; - } - - pHeader=(const DataHeader *)data; - if( (length>=0 && lengthdataHeader.magic1!=0xda || - pHeader->dataHeader.magic2!=0x27 || - pHeader->info.sizeofUChar!=2 - ) { - *pErrorCode=U_UNSUPPORTED_ERROR; - return 0; - } - - inIsBigEndian=(UBool)pHeader->info.isBigEndian; - inCharset=pHeader->info.charsetFamily; - - if(inIsBigEndian==U_IS_BIG_ENDIAN) { - headerSize=pHeader->dataHeader.headerSize; - infoSize=pHeader->info.size; - } else { - headerSize=uprv_readSwapUInt16(pHeader->dataHeader.headerSize); - infoSize=uprv_readSwapUInt16(pHeader->info.size); - } - - if( headerSizedataHeader)+infoSize) || - (length>=0 && lengthEBCDIC). +*/ + +#include +#include "unicode/utypes.h" +#include "unicode/udata.h" /* UDataInfo */ +#include "ucmndata.h" /* DataHeader */ +#include "cmemory.h" +#include "udataswp.h" + +/* swapping primitives ------------------------------------------------------ */ + +static int32_t U_CALLCONV +uprv_swapArray16(const UDataSwapper *ds, + const void *inData, int32_t length, void *outData, + UErrorCode *pErrorCode) { + const uint16_t *p; + uint16_t *q; + int32_t count; + uint16_t x; + + if(pErrorCode==NULL || U_FAILURE(*pErrorCode)) { + return 0; + } + if(ds==NULL || inData==NULL || length<0 || (length&1)!=0 || outData==NULL) { + *pErrorCode=U_ILLEGAL_ARGUMENT_ERROR; + return 0; + } + + /* setup and swapping */ + p=(const uint16_t *)inData; + q=(uint16_t *)outData; + count=length/2; + while(count>0) { + x=*p++; + *q++=(uint16_t)((x<<8)|(x>>8)); + --count; + } + + return length; +} + +static int32_t U_CALLCONV +uprv_copyArray16(const UDataSwapper *ds, + const void *inData, int32_t length, void *outData, + UErrorCode *pErrorCode) { + if(pErrorCode==NULL || U_FAILURE(*pErrorCode)) { + return 0; + } + if(ds==NULL || inData==NULL || length<0 || (length&1)!=0 || outData==NULL) { + *pErrorCode=U_ILLEGAL_ARGUMENT_ERROR; + return 0; + } + + if(length>0 && inData!=outData) { + uprv_memcpy(outData, inData, length); + } + return length; +} + +static int32_t U_CALLCONV +uprv_swapArray32(const UDataSwapper *ds, + const void *inData, int32_t length, void *outData, + UErrorCode *pErrorCode) { + const uint32_t *p; + uint32_t *q; + int32_t count; + uint32_t x; + + if(pErrorCode==NULL || U_FAILURE(*pErrorCode)) { + return 0; + } + if(ds==NULL || inData==NULL || length<0 || (length&3)!=0 || outData==NULL) { + *pErrorCode=U_ILLEGAL_ARGUMENT_ERROR; + return 0; + } + + /* setup and swapping */ + p=(const uint32_t *)inData; + q=(uint32_t *)outData; + count=length/4; + while(count>0) { + x=*p++; + *q++=(uint32_t)((x<<24)|((x<<8)&0xff0000)|((x>>8)&0xff00)|(x>>24)); + --count; + } + + return length; +} + +static int32_t U_CALLCONV +uprv_copyArray32(const UDataSwapper *ds, + const void *inData, int32_t length, void *outData, + UErrorCode *pErrorCode) { + if(pErrorCode==NULL || U_FAILURE(*pErrorCode)) { + return 0; + } + if(ds==NULL || inData==NULL || length<0 || (length&3)!=0 || outData==NULL) { + *pErrorCode=U_ILLEGAL_ARGUMENT_ERROR; + return 0; + } + + if(length>0 && inData!=outData) { + uprv_memcpy(outData, inData, length); + } + return length; +} + +static int32_t U_CALLCONV +uprv_swapArray64(const UDataSwapper *ds, + const void *inData, int32_t length, void *outData, + UErrorCode *pErrorCode) { + const uint64_t *p; + uint64_t *q; + int32_t count; + + if(pErrorCode==NULL || U_FAILURE(*pErrorCode)) { + return 0; + } + if(ds==NULL || inData==NULL || length<0 || (length&7)!=0 || outData==NULL) { + *pErrorCode=U_ILLEGAL_ARGUMENT_ERROR; + return 0; + } + + /* setup and swapping */ + p=(const uint64_t *)inData; + q=(uint64_t *)outData; + count=length/8; + while(count>0) { + uint64_t x=*p++; + x=(x<<56)|((x&0xff00)<<40)|((x&0xff0000)<<24)|((x&0xff000000)<<8)| + ((x>>8)&0xff000000)|((x>>24)&0xff0000)|((x>>40)&0xff00)|(x>>56); + *q++=x; + --count; + } + + return length; +} + +static int32_t U_CALLCONV +uprv_copyArray64(const UDataSwapper *ds, + const void *inData, int32_t length, void *outData, + UErrorCode *pErrorCode) { + if(pErrorCode==NULL || U_FAILURE(*pErrorCode)) { + return 0; + } + if(ds==NULL || inData==NULL || length<0 || (length&7)!=0 || outData==NULL) { + *pErrorCode=U_ILLEGAL_ARGUMENT_ERROR; + return 0; + } + + if(length>0 && inData!=outData) { + uprv_memcpy(outData, inData, length); + } + return length; +} + +static uint16_t U_CALLCONV +uprv_readSwapUInt16(uint16_t x) { + return (uint16_t)((x<<8)|(x>>8)); +} + +static uint16_t U_CALLCONV +uprv_readDirectUInt16(uint16_t x) { + return x; +} + +static uint32_t U_CALLCONV +uprv_readSwapUInt32(uint32_t x) { + return (uint32_t)((x<<24)|((x<<8)&0xff0000)|((x>>8)&0xff00)|(x>>24)); +} + +static uint32_t U_CALLCONV +uprv_readDirectUInt32(uint32_t x) { + return x; +} + +static void U_CALLCONV +uprv_writeSwapUInt16(uint16_t *p, uint16_t x) { + *p=(uint16_t)((x<<8)|(x>>8)); +} + +static void U_CALLCONV +uprv_writeDirectUInt16(uint16_t *p, uint16_t x) { + *p=x; +} + +static void U_CALLCONV +uprv_writeSwapUInt32(uint32_t *p, uint32_t x) { + *p=(uint32_t)((x<<24)|((x<<8)&0xff0000)|((x>>8)&0xff00)|(x>>24)); +} + +static void U_CALLCONV +uprv_writeDirectUInt32(uint32_t *p, uint32_t x) { + *p=x; +} + +U_CAPI int16_t U_EXPORT2 +udata_readInt16(const UDataSwapper *ds, int16_t x) { + return (int16_t)ds->readUInt16((uint16_t)x); +} + +U_CAPI int32_t U_EXPORT2 +udata_readInt32(const UDataSwapper *ds, int32_t x) { + return (int32_t)ds->readUInt32((uint32_t)x); +} + +/** + * Swap a block of invariant, NUL-terminated strings, but not padding + * bytes after the last string. + * @internal + */ +U_CAPI int32_t U_EXPORT2 +udata_swapInvStringBlock(const UDataSwapper *ds, + const void *inData, int32_t length, void *outData, + UErrorCode *pErrorCode) { + const char *inChars; + int32_t stringsLength; + + if(pErrorCode==NULL || U_FAILURE(*pErrorCode)) { + return 0; + } + if(ds==NULL || inData==NULL || length<0 || (length>0 && outData==NULL)) { + *pErrorCode=U_ILLEGAL_ARGUMENT_ERROR; + return 0; + } + + /* reduce the strings length to not include bytes after the last NUL */ + inChars=(const char *)inData; + stringsLength=length; + while(stringsLength>0 && inChars[stringsLength-1]!=0) { + --stringsLength; + } + + /* swap up to the last NUL */ + ds->swapInvChars(ds, inData, stringsLength, outData, pErrorCode); + + /* copy the bytes after the last NUL */ + if(inData!=outData && length>stringsLength) { + uprv_memcpy((char *)outData+stringsLength, inChars+stringsLength, length-stringsLength); + } + + /* return the length including padding bytes */ + if(U_SUCCESS(*pErrorCode)) { + return length; + } else { + return 0; + } +} + +U_CAPI void U_EXPORT2 +udata_printError(const UDataSwapper *ds, + const char *fmt, + ...) { + va_list args; + + if(ds->printError!=NULL) { + va_start(args, fmt); + ds->printError(ds->printErrorContext, fmt, args); + va_end(args); + } +} + +/* swap a data header ------------------------------------------------------- */ + +U_CAPI int32_t U_EXPORT2 +udata_swapDataHeader(const UDataSwapper *ds, + const void *inData, int32_t length, void *outData, + UErrorCode *pErrorCode) { + const DataHeader *pHeader; + uint16_t headerSize, infoSize; + + /* argument checking */ + if(pErrorCode==NULL || U_FAILURE(*pErrorCode)) { + return 0; + } + if(ds==NULL || inData==NULL || length<-1 || (length>0 && outData==NULL)) { + *pErrorCode=U_ILLEGAL_ARGUMENT_ERROR; + return 0; + } + + /* check minimum length and magic bytes */ + pHeader=(const DataHeader *)inData; + if( (length>=0 && length<(int32_t)sizeof(DataHeader)) || + pHeader->dataHeader.magic1!=0xda || + pHeader->dataHeader.magic2!=0x27 || + pHeader->info.sizeofUChar!=2 + ) { + udata_printError(ds, "udata_swapDataHeader(): initial bytes do not look like ICU data\n"); + *pErrorCode=U_UNSUPPORTED_ERROR; + return 0; + } + + headerSize=ds->readUInt16(pHeader->dataHeader.headerSize); + infoSize=ds->readUInt16(pHeader->info.size); + + if( headerSizedataHeader)+infoSize) || + (length>=0 && length0) { + DataHeader *outHeader; + const char *s; + int32_t maxLength; + + /* Most of the fields are just bytes and need no swapping. */ + if(inData!=outData) { + uprv_memcpy(outData, inData, headerSize); + } + outHeader=(DataHeader *)outData; + + outHeader->info.isBigEndian = ds->outIsBigEndian; + outHeader->info.charsetFamily = ds->outCharset; + + /* swap headerSize */ + ds->swapArray16(ds, &pHeader->dataHeader.headerSize, 2, &outHeader->dataHeader.headerSize, pErrorCode); + + /* swap UDataInfo size and reservedWord */ + ds->swapArray16(ds, &pHeader->info.size, 4, &outHeader->info.size, pErrorCode); + + /* swap copyright statement after the UDataInfo */ + infoSize+=sizeof(pHeader->dataHeader); + s=(const char *)inData+infoSize; + maxLength=headerSize-infoSize; + /* get the length of the string */ + for(length=0; lengthswapInvChars(ds, s, length, (char *)outData+infoSize, pErrorCode); + } + + return headerSize; +} + +/* API functions ------------------------------------------------------------ */ + +U_CAPI UDataSwapper * U_EXPORT2 +udata_openSwapper(UBool inIsBigEndian, uint8_t inCharset, + UBool outIsBigEndian, uint8_t outCharset, + UErrorCode *pErrorCode) { + UDataSwapper *swapper; + + if(pErrorCode==NULL || U_FAILURE(*pErrorCode)) { + return NULL; + } + if(inCharset>U_EBCDIC_FAMILY || outCharset>U_EBCDIC_FAMILY) { + *pErrorCode=U_ILLEGAL_ARGUMENT_ERROR; + return NULL; + } + + /* allocate the swapper */ + swapper=(UDataSwapper *)uprv_malloc(sizeof(UDataSwapper)); + if(swapper==NULL) { + *pErrorCode=U_MEMORY_ALLOCATION_ERROR; + return NULL; + } + uprv_memset(swapper, 0, sizeof(UDataSwapper)); + + /* set values and functions pointers according to in/out parameters */ + swapper->inIsBigEndian=inIsBigEndian; + swapper->inCharset=inCharset; + swapper->outIsBigEndian=outIsBigEndian; + swapper->outCharset=outCharset; + + swapper->readUInt16= inIsBigEndian==U_IS_BIG_ENDIAN ? uprv_readDirectUInt16 : uprv_readSwapUInt16; + swapper->readUInt32= inIsBigEndian==U_IS_BIG_ENDIAN ? uprv_readDirectUInt32 : uprv_readSwapUInt32; + + swapper->writeUInt16= outIsBigEndian==U_IS_BIG_ENDIAN ? uprv_writeDirectUInt16 : uprv_writeSwapUInt16; + swapper->writeUInt32= outIsBigEndian==U_IS_BIG_ENDIAN ? uprv_writeDirectUInt32 : uprv_writeSwapUInt32; + + swapper->compareInvChars= outCharset==U_ASCII_FAMILY ? uprv_compareInvAscii : uprv_compareInvEbcdic; + + if(inIsBigEndian==outIsBigEndian) { + swapper->swapArray16=uprv_copyArray16; + swapper->swapArray32=uprv_copyArray32; + swapper->swapArray64=uprv_copyArray64; + } else { + swapper->swapArray16=uprv_swapArray16; + swapper->swapArray32=uprv_swapArray32; + swapper->swapArray64=uprv_swapArray64; + } + + if(inCharset==U_ASCII_FAMILY) { + swapper->swapInvChars= outCharset==U_ASCII_FAMILY ? uprv_copyAscii : uprv_ebcdicFromAscii; + } else /* U_EBCDIC_FAMILY */ { + swapper->swapInvChars= outCharset==U_EBCDIC_FAMILY ? uprv_copyEbcdic : uprv_asciiFromEbcdic; + } + + return swapper; +} + +U_CAPI UDataSwapper * U_EXPORT2 +udata_openSwapperForInputData(const void *data, int32_t length, + UBool outIsBigEndian, uint8_t outCharset, + UErrorCode *pErrorCode) { + const DataHeader *pHeader; + uint16_t headerSize, infoSize; + UBool inIsBigEndian; + int8_t inCharset; + + if(pErrorCode==NULL || U_FAILURE(*pErrorCode)) { + return NULL; + } + if( data==NULL || + (length>=0 && length<(int32_t)sizeof(DataHeader)) || + outCharset>U_EBCDIC_FAMILY + ) { + *pErrorCode=U_ILLEGAL_ARGUMENT_ERROR; + return NULL; + } + + pHeader=(const DataHeader *)data; + if( (length>=0 && length<(int32_t)sizeof(DataHeader)) || + pHeader->dataHeader.magic1!=0xda || + pHeader->dataHeader.magic2!=0x27 || + pHeader->info.sizeofUChar!=2 + ) { + *pErrorCode=U_UNSUPPORTED_ERROR; + return 0; + } + + inIsBigEndian=(UBool)pHeader->info.isBigEndian; + inCharset=pHeader->info.charsetFamily; + + if(inIsBigEndian==U_IS_BIG_ENDIAN) { + headerSize=pHeader->dataHeader.headerSize; + infoSize=pHeader->info.size; + } else { + headerSize=uprv_readSwapUInt16(pHeader->dataHeader.headerSize); + infoSize=uprv_readSwapUInt16(pHeader->info.size); + } + + if( headerSizedataHeader)+infoSize) || + (length>=0 && lengthbaseContext != NULL) { - if (((_UEnumBuffer*) en->baseContext)->len < capacity) { - capacity += PAD; - en->baseContext = uprv_realloc(en->baseContext, - sizeof(int32_t) + capacity); - if (en->baseContext == NULL) { - return NULL; - } - ((_UEnumBuffer*) en->baseContext)->len = capacity; - } - } else { - capacity += PAD; - en->baseContext = uprv_malloc(sizeof(int32_t) + capacity); - if (en->baseContext == NULL) { - return NULL; - } - ((_UEnumBuffer*) en->baseContext)->len = capacity; - } - - return (void*) & ((_UEnumBuffer*) en->baseContext)->data; -} - -U_CAPI void U_EXPORT2 -uenum_close(UEnumeration* en) -{ - if (en) { - if (en->close != NULL) { - if (en->baseContext) { - uprv_free(en->baseContext); - } - en->close(en); - } else { /* this seems dangerous, but we better kill the object */ - uprv_free(en); - } - } -} - -U_CAPI int32_t U_EXPORT2 -uenum_count(UEnumeration* en, UErrorCode* status) -{ - if (!en || U_FAILURE(*status)) { - return -1; - } - if (en->count != NULL) { - return en->count(en, status); - } else { - *status = U_UNSUPPORTED_ERROR; - return -1; - } -} - -/* Don't call this directly. Only uenum_unext should be calling this. */ -U_CAPI const UChar* U_EXPORT2 -uenum_unextDefault(UEnumeration* en, - int32_t* resultLength, - UErrorCode* status) -{ - UChar *ustr = NULL; - int32_t len = 0; - if (en->next != NULL) { - const char *cstr = en->next(en, &len, status); - if (cstr != NULL) { - ustr = (UChar*) _getBuffer(en, (len+1) * sizeof(UChar)); - if (ustr == NULL) { - *status = U_MEMORY_ALLOCATION_ERROR; - } else { - u_charsToUChars(cstr, ustr, len+1); - } - } - } else { - *status = U_UNSUPPORTED_ERROR; - } - if (resultLength) { - *resultLength = len; - } - return ustr; -} - -/* Don't call this directly. Only uenum_next should be calling this. */ -U_CAPI const char* U_EXPORT2 -uenum_nextDefault(UEnumeration* en, - int32_t* resultLength, - UErrorCode* status) -{ - if (en->uNext != NULL) { - char *tempCharVal; - const UChar *tempUCharVal = en->uNext(en, resultLength, status); - if (tempUCharVal == NULL) { - return NULL; - } - tempCharVal = (char*) - _getBuffer(en, (*resultLength+1) * sizeof(char)); - if (!tempCharVal) { - *status = U_MEMORY_ALLOCATION_ERROR; - return NULL; - } - u_UCharsToChars(tempUCharVal, tempCharVal, *resultLength + 1); - return tempCharVal; - } else { - *status = U_UNSUPPORTED_ERROR; - return NULL; - } -} - -U_CAPI const UChar* U_EXPORT2 -uenum_unext(UEnumeration* en, - int32_t* resultLength, - UErrorCode* status) -{ - if (!en || U_FAILURE(*status)) { - return NULL; - } - if (en->uNext != NULL) { - return en->uNext(en, resultLength, status); - } else { - *status = U_UNSUPPORTED_ERROR; - return NULL; - } -} - -U_CAPI const char* U_EXPORT2 -uenum_next(UEnumeration* en, - int32_t* resultLength, - UErrorCode* status) -{ - if (!en || U_FAILURE(*status)) { - return NULL; - } - if (en->next != NULL) { - if (resultLength != NULL) { - return en->next(en, resultLength, status); - } - else { - int32_t dummyLength=0; - return en->next(en, &dummyLength, status); - } - } else { - *status = U_UNSUPPORTED_ERROR; - return NULL; - } -} - -U_CAPI void U_EXPORT2 -uenum_reset(UEnumeration* en, UErrorCode* status) -{ - if (!en || U_FAILURE(*status)) { - return; - } - if (en->reset != NULL) { - en->reset(en, status); - } else { - *status = U_UNSUPPORTED_ERROR; - } -} diff --git a/Build/source/libs/icu/icu-src/source/common/uenum.cpp b/Build/source/libs/icu/icu-src/source/common/uenum.cpp new file mode 100644 index 00000000000..11d895ebcd7 --- /dev/null +++ b/Build/source/libs/icu/icu-src/source/common/uenum.cpp @@ -0,0 +1,189 @@ +// © 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html +/* +******************************************************************************* +* +* Copyright (C) 2002-2012, International Business Machines +* Corporation and others. All Rights Reserved. +* +******************************************************************************* +* file name: uenum.c +* encoding: UTF-8 +* tab size: 8 (not used) +* indentation:2 +* +* created on: 2002jul08 +* created by: Vladimir Weinstein +*/ + +#include "unicode/putil.h" +#include "uenumimp.h" +#include "cmemory.h" + +/* Layout of the baseContext buffer. */ +typedef struct { + int32_t len; /* number of bytes available starting at 'data' */ + char data; /* actual data starts here */ +} _UEnumBuffer; + +/* Extra bytes to allocate in the baseContext buffer. */ +static const int32_t PAD = 8; + +/* Return a pointer to the baseContext buffer, possibly allocating + or reallocating it if at least 'capacity' bytes are not available. */ +static void* _getBuffer(UEnumeration* en, int32_t capacity) { + + if (en->baseContext != NULL) { + if (((_UEnumBuffer*) en->baseContext)->len < capacity) { + capacity += PAD; + en->baseContext = uprv_realloc(en->baseContext, + sizeof(int32_t) + capacity); + if (en->baseContext == NULL) { + return NULL; + } + ((_UEnumBuffer*) en->baseContext)->len = capacity; + } + } else { + capacity += PAD; + en->baseContext = uprv_malloc(sizeof(int32_t) + capacity); + if (en->baseContext == NULL) { + return NULL; + } + ((_UEnumBuffer*) en->baseContext)->len = capacity; + } + + return (void*) & ((_UEnumBuffer*) en->baseContext)->data; +} + +U_CAPI void U_EXPORT2 +uenum_close(UEnumeration* en) +{ + if (en) { + if (en->close != NULL) { + if (en->baseContext) { + uprv_free(en->baseContext); + } + en->close(en); + } else { /* this seems dangerous, but we better kill the object */ + uprv_free(en); + } + } +} + +U_CAPI int32_t U_EXPORT2 +uenum_count(UEnumeration* en, UErrorCode* status) +{ + if (!en || U_FAILURE(*status)) { + return -1; + } + if (en->count != NULL) { + return en->count(en, status); + } else { + *status = U_UNSUPPORTED_ERROR; + return -1; + } +} + +/* Don't call this directly. Only uenum_unext should be calling this. */ +U_CAPI const UChar* U_EXPORT2 +uenum_unextDefault(UEnumeration* en, + int32_t* resultLength, + UErrorCode* status) +{ + UChar *ustr = NULL; + int32_t len = 0; + if (en->next != NULL) { + const char *cstr = en->next(en, &len, status); + if (cstr != NULL) { + ustr = (UChar*) _getBuffer(en, (len+1) * sizeof(UChar)); + if (ustr == NULL) { + *status = U_MEMORY_ALLOCATION_ERROR; + } else { + u_charsToUChars(cstr, ustr, len+1); + } + } + } else { + *status = U_UNSUPPORTED_ERROR; + } + if (resultLength) { + *resultLength = len; + } + return ustr; +} + +/* Don't call this directly. Only uenum_next should be calling this. */ +U_CAPI const char* U_EXPORT2 +uenum_nextDefault(UEnumeration* en, + int32_t* resultLength, + UErrorCode* status) +{ + if (en->uNext != NULL) { + char *tempCharVal; + const UChar *tempUCharVal = en->uNext(en, resultLength, status); + if (tempUCharVal == NULL) { + return NULL; + } + tempCharVal = (char*) + _getBuffer(en, (*resultLength+1) * sizeof(char)); + if (!tempCharVal) { + *status = U_MEMORY_ALLOCATION_ERROR; + return NULL; + } + u_UCharsToChars(tempUCharVal, tempCharVal, *resultLength + 1); + return tempCharVal; + } else { + *status = U_UNSUPPORTED_ERROR; + return NULL; + } +} + +U_CAPI const UChar* U_EXPORT2 +uenum_unext(UEnumeration* en, + int32_t* resultLength, + UErrorCode* status) +{ + if (!en || U_FAILURE(*status)) { + return NULL; + } + if (en->uNext != NULL) { + return en->uNext(en, resultLength, status); + } else { + *status = U_UNSUPPORTED_ERROR; + return NULL; + } +} + +U_CAPI const char* U_EXPORT2 +uenum_next(UEnumeration* en, + int32_t* resultLength, + UErrorCode* status) +{ + if (!en || U_FAILURE(*status)) { + return NULL; + } + if (en->next != NULL) { + if (resultLength != NULL) { + return en->next(en, resultLength, status); + } + else { + int32_t dummyLength=0; + return en->next(en, &dummyLength, status); + } + } else { + *status = U_UNSUPPORTED_ERROR; + return NULL; + } +} + +U_CAPI void U_EXPORT2 +uenum_reset(UEnumeration* en, UErrorCode* status) +{ + if (!en || U_FAILURE(*status)) { + return; + } + if (en->reset != NULL) { + en->reset(en, status); + } else { + *status = U_UNSUPPORTED_ERROR; + } +} diff --git a/Build/source/libs/icu/icu-src/source/common/uenumimp.h b/Build/source/libs/icu/icu-src/source/common/uenumimp.h index 5d01f01ace5..9c9df75ae04 100644 --- a/Build/source/libs/icu/icu-src/source/common/uenumimp.h +++ b/Build/source/libs/icu/icu-src/source/common/uenumimp.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* @@ -8,7 +8,7 @@ * ******************************************************************************* * file name: uenumimp.h -* encoding: US-ASCII +* encoding: UTF-8 * tab size: 8 (not used) * indentation:2 * diff --git a/Build/source/libs/icu/icu-src/source/common/uhash.c b/Build/source/libs/icu/icu-src/source/common/uhash.c deleted file mode 100644 index 282f89fe268..00000000000 --- a/Build/source/libs/icu/icu-src/source/common/uhash.c +++ /dev/null @@ -1,975 +0,0 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. -// License & terms of use: http://www.unicode.org/copyright.html -/* -****************************************************************************** -* Copyright (C) 1997-2016, International Business Machines -* Corporation and others. All Rights Reserved. -****************************************************************************** -* Date Name Description -* 03/22/00 aliu Adapted from original C++ ICU Hashtable. -* 07/06/01 aliu Modified to support int32_t keys on -* platforms with sizeof(void*) < 32. -****************************************************************************** -*/ - -#include "uhash.h" -#include "unicode/ustring.h" -#include "cstring.h" -#include "cmemory.h" -#include "uassert.h" -#include "ustr_imp.h" - -/* This hashtable is implemented as a double hash. All elements are - * stored in a single array with no secondary storage for collision - * resolution (no linked list, etc.). When there is a hash collision - * (when two unequal keys have the same hashcode) we resolve this by - * using a secondary hash. The secondary hash is an increment - * computed as a hash function (a different one) of the primary - * hashcode. This increment is added to the initial hash value to - * obtain further slots assigned to the same hash code. For this to - * work, the length of the array and the increment must be relatively - * prime. The easiest way to achieve this is to have the length of - * the array be prime, and the increment be any value from - * 1..length-1. - * - * Hashcodes are 32-bit integers. We make sure all hashcodes are - * non-negative by masking off the top bit. This has two effects: (1) - * modulo arithmetic is simplified. If we allowed negative hashcodes, - * then when we computed hashcode % length, we could get a negative - * result, which we would then have to adjust back into range. It's - * simpler to just make hashcodes non-negative. (2) It makes it easy - * to check for empty vs. occupied slots in the table. We just mark - * empty or deleted slots with a negative hashcode. - * - * The central function is _uhash_find(). This function looks for a - * slot matching the given key and hashcode. If one is found, it - * returns a pointer to that slot. If the table is full, and no match - * is found, it returns NULL -- in theory. This would make the code - * more complicated, since all callers of _uhash_find() would then - * have to check for a NULL result. To keep this from happening, we - * don't allow the table to fill. When there is only one - * empty/deleted slot left, uhash_put() will refuse to increase the - * count, and fail. This simplifies the code. In practice, one will - * seldom encounter this using default UHashtables. However, if a - * hashtable is set to a U_FIXED resize policy, or if memory is - * exhausted, then the table may fill. - * - * High and low water ratios control rehashing. They establish levels - * of fullness (from 0 to 1) outside of which the data array is - * reallocated and repopulated. Setting the low water ratio to zero - * means the table will never shrink. Setting the high water ratio to - * one means the table will never grow. The ratios should be - * coordinated with the ratio between successive elements of the - * PRIMES table, so that when the primeIndex is incremented or - * decremented during rehashing, it brings the ratio of count / length - * back into the desired range (between low and high water ratios). - */ - -/******************************************************************** - * PRIVATE Constants, Macros - ********************************************************************/ - -/* This is a list of non-consecutive primes chosen such that - * PRIMES[i+1] ~ 2*PRIMES[i]. (Currently, the ratio ranges from 1.81 - * to 2.18; the inverse ratio ranges from 0.459 to 0.552.) If this - * ratio is changed, the low and high water ratios should also be - * adjusted to suit. - * - * These prime numbers were also chosen so that they are the largest - * prime number while being less than a power of two. - */ -static const int32_t PRIMES[] = { - 13, 31, 61, 127, 251, 509, 1021, 2039, 4093, 8191, 16381, 32749, - 65521, 131071, 262139, 524287, 1048573, 2097143, 4194301, 8388593, - 16777213, 33554393, 67108859, 134217689, 268435399, 536870909, - 1073741789, 2147483647 /*, 4294967291 */ -}; - -#define PRIMES_LENGTH UPRV_LENGTHOF(PRIMES) -#define DEFAULT_PRIME_INDEX 3 - -/* These ratios are tuned to the PRIMES array such that a resize - * places the table back into the zone of non-resizing. That is, - * after a call to _uhash_rehash(), a subsequent call to - * _uhash_rehash() should do nothing (should not churn). This is only - * a potential problem with U_GROW_AND_SHRINK. - */ -static const float RESIZE_POLICY_RATIO_TABLE[6] = { - /* low, high water ratio */ - 0.0F, 0.5F, /* U_GROW: Grow on demand, do not shrink */ - 0.1F, 0.5F, /* U_GROW_AND_SHRINK: Grow and shrink on demand */ - 0.0F, 1.0F /* U_FIXED: Never change size */ -}; - -/* - Invariants for hashcode values: - - * DELETED < 0 - * EMPTY < 0 - * Real hashes >= 0 - - Hashcodes may not start out this way, but internally they are - adjusted so that they are always positive. We assume 32-bit - hashcodes; adjust these constants for other hashcode sizes. -*/ -#define HASH_DELETED ((int32_t) 0x80000000) -#define HASH_EMPTY ((int32_t) HASH_DELETED + 1) - -#define IS_EMPTY_OR_DELETED(x) ((x) < 0) - -/* This macro expects a UHashTok.pointer as its keypointer and - valuepointer parameters */ -#define HASH_DELETE_KEY_VALUE(hash, keypointer, valuepointer) \ - if (hash->keyDeleter != NULL && keypointer != NULL) { \ - (*hash->keyDeleter)(keypointer); \ - } \ - if (hash->valueDeleter != NULL && valuepointer != NULL) { \ - (*hash->valueDeleter)(valuepointer); \ - } - -/* - * Constants for hinting whether a key or value is an integer - * or a pointer. If a hint bit is zero, then the associated - * token is assumed to be an integer. - */ -#define HINT_KEY_POINTER (1) -#define HINT_VALUE_POINTER (2) - -/******************************************************************** - * PRIVATE Implementation - ********************************************************************/ - -static UHashTok -_uhash_setElement(UHashtable *hash, UHashElement* e, - int32_t hashcode, - UHashTok key, UHashTok value, int8_t hint) { - - UHashTok oldValue = e->value; - if (hash->keyDeleter != NULL && e->key.pointer != NULL && - e->key.pointer != key.pointer) { /* Avoid double deletion */ - (*hash->keyDeleter)(e->key.pointer); - } - if (hash->valueDeleter != NULL) { - if (oldValue.pointer != NULL && - oldValue.pointer != value.pointer) { /* Avoid double deletion */ - (*hash->valueDeleter)(oldValue.pointer); - } - oldValue.pointer = NULL; - } - /* Compilers should copy the UHashTok union correctly, but even if - * they do, memory heap tools (e.g. BoundsChecker) can get - * confused when a pointer is cloaked in a union and then copied. - * TO ALLEVIATE THIS, we use hints (based on what API the user is - * calling) to copy pointers when we know the user thinks - * something is a pointer. */ - if (hint & HINT_KEY_POINTER) { - e->key.pointer = key.pointer; - } else { - e->key = key; - } - if (hint & HINT_VALUE_POINTER) { - e->value.pointer = value.pointer; - } else { - e->value = value; - } - e->hashcode = hashcode; - return oldValue; -} - -/** - * Assumes that the given element is not empty or deleted. - */ -static UHashTok -_uhash_internalRemoveElement(UHashtable *hash, UHashElement* e) { - UHashTok empty; - U_ASSERT(!IS_EMPTY_OR_DELETED(e->hashcode)); - --hash->count; - empty.pointer = NULL; empty.integer = 0; - return _uhash_setElement(hash, e, HASH_DELETED, empty, empty, 0); -} - -static void -_uhash_internalSetResizePolicy(UHashtable *hash, enum UHashResizePolicy policy) { - U_ASSERT(hash != NULL); - U_ASSERT(((int32_t)policy) >= 0); - U_ASSERT(((int32_t)policy) < 3); - hash->lowWaterRatio = RESIZE_POLICY_RATIO_TABLE[policy * 2]; - hash->highWaterRatio = RESIZE_POLICY_RATIO_TABLE[policy * 2 + 1]; -} - -/** - * Allocate internal data array of a size determined by the given - * prime index. If the index is out of range it is pinned into range. - * If the allocation fails the status is set to - * U_MEMORY_ALLOCATION_ERROR and all array storage is freed. In - * either case the previous array pointer is overwritten. - * - * Caller must ensure primeIndex is in range 0..PRIME_LENGTH-1. - */ -static void -_uhash_allocate(UHashtable *hash, - int32_t primeIndex, - UErrorCode *status) { - - UHashElement *p, *limit; - UHashTok emptytok; - - if (U_FAILURE(*status)) return; - - U_ASSERT(primeIndex >= 0 && primeIndex < PRIMES_LENGTH); - - hash->primeIndex = primeIndex; - hash->length = PRIMES[primeIndex]; - - p = hash->elements = (UHashElement*) - uprv_malloc(sizeof(UHashElement) * hash->length); - - if (hash->elements == NULL) { - *status = U_MEMORY_ALLOCATION_ERROR; - return; - } - - emptytok.pointer = NULL; /* Only one of these two is needed */ - emptytok.integer = 0; /* but we don't know which one. */ - - limit = p + hash->length; - while (p < limit) { - p->key = emptytok; - p->value = emptytok; - p->hashcode = HASH_EMPTY; - ++p; - } - - hash->count = 0; - hash->lowWaterMark = (int32_t)(hash->length * hash->lowWaterRatio); - hash->highWaterMark = (int32_t)(hash->length * hash->highWaterRatio); -} - -static UHashtable* -_uhash_init(UHashtable *result, - UHashFunction *keyHash, - UKeyComparator *keyComp, - UValueComparator *valueComp, - int32_t primeIndex, - UErrorCode *status) -{ - if (U_FAILURE(*status)) return NULL; - U_ASSERT(keyHash != NULL); - U_ASSERT(keyComp != NULL); - - result->keyHasher = keyHash; - result->keyComparator = keyComp; - result->valueComparator = valueComp; - result->keyDeleter = NULL; - result->valueDeleter = NULL; - result->allocated = FALSE; - _uhash_internalSetResizePolicy(result, U_GROW); - - _uhash_allocate(result, primeIndex, status); - - if (U_FAILURE(*status)) { - return NULL; - } - - return result; -} - -static UHashtable* -_uhash_create(UHashFunction *keyHash, - UKeyComparator *keyComp, - UValueComparator *valueComp, - int32_t primeIndex, - UErrorCode *status) { - UHashtable *result; - - if (U_FAILURE(*status)) return NULL; - - result = (UHashtable*) uprv_malloc(sizeof(UHashtable)); - if (result == NULL) { - *status = U_MEMORY_ALLOCATION_ERROR; - return NULL; - } - - _uhash_init(result, keyHash, keyComp, valueComp, primeIndex, status); - result->allocated = TRUE; - - if (U_FAILURE(*status)) { - uprv_free(result); - return NULL; - } - - return result; -} - -/** - * Look for a key in the table, or if no such key exists, the first - * empty slot matching the given hashcode. Keys are compared using - * the keyComparator function. - * - * First find the start position, which is the hashcode modulo - * the length. Test it to see if it is: - * - * a. identical: First check the hash values for a quick check, - * then compare keys for equality using keyComparator. - * b. deleted - * c. empty - * - * Stop if it is identical or empty, otherwise continue by adding a - * "jump" value (moduloing by the length again to keep it within - * range) and retesting. For efficiency, there need enough empty - * values so that the searchs stop within a reasonable amount of time. - * This can be changed by changing the high/low water marks. - * - * In theory, this function can return NULL, if it is full (no empty - * or deleted slots) and if no matching key is found. In practice, we - * prevent this elsewhere (in uhash_put) by making sure the last slot - * in the table is never filled. - * - * The size of the table should be prime for this algorithm to work; - * otherwise we are not guaranteed that the jump value (the secondary - * hash) is relatively prime to the table length. - */ -static UHashElement* -_uhash_find(const UHashtable *hash, UHashTok key, - int32_t hashcode) { - - int32_t firstDeleted = -1; /* assume invalid index */ - int32_t theIndex, startIndex; - int32_t jump = 0; /* lazy evaluate */ - int32_t tableHash; - UHashElement *elements = hash->elements; - - hashcode &= 0x7FFFFFFF; /* must be positive */ - startIndex = theIndex = (hashcode ^ 0x4000000) % hash->length; - - do { - tableHash = elements[theIndex].hashcode; - if (tableHash == hashcode) { /* quick check */ - if ((*hash->keyComparator)(key, elements[theIndex].key)) { - return &(elements[theIndex]); - } - } else if (!IS_EMPTY_OR_DELETED(tableHash)) { - /* We have hit a slot which contains a key-value pair, - * but for which the hash code does not match. Keep - * looking. - */ - } else if (tableHash == HASH_EMPTY) { /* empty, end o' the line */ - break; - } else if (firstDeleted < 0) { /* remember first deleted */ - firstDeleted = theIndex; - } - if (jump == 0) { /* lazy compute jump */ - /* The jump value must be relatively prime to the table - * length. As long as the length is prime, then any value - * 1..length-1 will be relatively prime to it. - */ - jump = (hashcode % (hash->length - 1)) + 1; - } - theIndex = (theIndex + jump) % hash->length; - } while (theIndex != startIndex); - - if (firstDeleted >= 0) { - theIndex = firstDeleted; /* reset if had deleted slot */ - } else if (tableHash != HASH_EMPTY) { - /* We get to this point if the hashtable is full (no empty or - * deleted slots), and we've failed to find a match. THIS - * WILL NEVER HAPPEN as long as uhash_put() makes sure that - * count is always < length. - */ - U_ASSERT(FALSE); - return NULL; /* Never happens if uhash_put() behaves */ - } - return &(elements[theIndex]); -} - -/** - * Attempt to grow or shrink the data arrays in order to make the - * count fit between the high and low water marks. hash_put() and - * hash_remove() call this method when the count exceeds the high or - * low water marks. This method may do nothing, if memory allocation - * fails, or if the count is already in range, or if the length is - * already at the low or high limit. In any case, upon return the - * arrays will be valid. - */ -static void -_uhash_rehash(UHashtable *hash, UErrorCode *status) { - - UHashElement *old = hash->elements; - int32_t oldLength = hash->length; - int32_t newPrimeIndex = hash->primeIndex; - int32_t i; - - if (hash->count > hash->highWaterMark) { - if (++newPrimeIndex >= PRIMES_LENGTH) { - return; - } - } else if (hash->count < hash->lowWaterMark) { - if (--newPrimeIndex < 0) { - return; - } - } else { - return; - } - - _uhash_allocate(hash, newPrimeIndex, status); - - if (U_FAILURE(*status)) { - hash->elements = old; - hash->length = oldLength; - return; - } - - for (i = oldLength - 1; i >= 0; --i) { - if (!IS_EMPTY_OR_DELETED(old[i].hashcode)) { - UHashElement *e = _uhash_find(hash, old[i].key, old[i].hashcode); - U_ASSERT(e != NULL); - U_ASSERT(e->hashcode == HASH_EMPTY); - e->key = old[i].key; - e->value = old[i].value; - e->hashcode = old[i].hashcode; - ++hash->count; - } - } - - uprv_free(old); -} - -static UHashTok -_uhash_remove(UHashtable *hash, - UHashTok key) { - /* First find the position of the key in the table. If the object - * has not been removed already, remove it. If the user wanted - * keys deleted, then delete it also. We have to put a special - * hashcode in that position that means that something has been - * deleted, since when we do a find, we have to continue PAST any - * deleted values. - */ - UHashTok result; - UHashElement* e = _uhash_find(hash, key, hash->keyHasher(key)); - U_ASSERT(e != NULL); - result.pointer = NULL; - result.integer = 0; - if (!IS_EMPTY_OR_DELETED(e->hashcode)) { - result = _uhash_internalRemoveElement(hash, e); - if (hash->count < hash->lowWaterMark) { - UErrorCode status = U_ZERO_ERROR; - _uhash_rehash(hash, &status); - } - } - return result; -} - -static UHashTok -_uhash_put(UHashtable *hash, - UHashTok key, - UHashTok value, - int8_t hint, - UErrorCode *status) { - - /* Put finds the position in the table for the new value. If the - * key is already in the table, it is deleted, if there is a - * non-NULL keyDeleter. Then the key, the hash and the value are - * all put at the position in their respective arrays. - */ - int32_t hashcode; - UHashElement* e; - UHashTok emptytok; - - if (U_FAILURE(*status)) { - goto err; - } - U_ASSERT(hash != NULL); - /* Cannot always check pointer here or iSeries sees NULL every time. */ - if ((hint & HINT_VALUE_POINTER) && value.pointer == NULL) { - /* Disallow storage of NULL values, since NULL is returned by - * get() to indicate an absent key. Storing NULL == removing. - */ - return _uhash_remove(hash, key); - } - if (hash->count > hash->highWaterMark) { - _uhash_rehash(hash, status); - if (U_FAILURE(*status)) { - goto err; - } - } - - hashcode = (*hash->keyHasher)(key); - e = _uhash_find(hash, key, hashcode); - U_ASSERT(e != NULL); - - if (IS_EMPTY_OR_DELETED(e->hashcode)) { - /* Important: We must never actually fill the table up. If we - * do so, then _uhash_find() will return NULL, and we'll have - * to check for NULL after every call to _uhash_find(). To - * avoid this we make sure there is always at least one empty - * or deleted slot in the table. This only is a problem if we - * are out of memory and rehash isn't working. - */ - ++hash->count; - if (hash->count == hash->length) { - /* Don't allow count to reach length */ - --hash->count; - *status = U_MEMORY_ALLOCATION_ERROR; - goto err; - } - } - - /* We must in all cases handle storage properly. If there was an - * old key, then it must be deleted (if the deleter != NULL). - * Make hashcodes stored in table positive. - */ - return _uhash_setElement(hash, e, hashcode & 0x7FFFFFFF, key, value, hint); - - err: - /* If the deleters are non-NULL, this method adopts its key and/or - * value arguments, and we must be sure to delete the key and/or - * value in all cases, even upon failure. - */ - HASH_DELETE_KEY_VALUE(hash, key.pointer, value.pointer); - emptytok.pointer = NULL; emptytok.integer = 0; - return emptytok; -} - - -/******************************************************************** - * PUBLIC API - ********************************************************************/ - -U_CAPI UHashtable* U_EXPORT2 -uhash_open(UHashFunction *keyHash, - UKeyComparator *keyComp, - UValueComparator *valueComp, - UErrorCode *status) { - - return _uhash_create(keyHash, keyComp, valueComp, DEFAULT_PRIME_INDEX, status); -} - -U_CAPI UHashtable* U_EXPORT2 -uhash_openSize(UHashFunction *keyHash, - UKeyComparator *keyComp, - UValueComparator *valueComp, - int32_t size, - UErrorCode *status) { - - /* Find the smallest index i for which PRIMES[i] >= size. */ - int32_t i = 0; - while (i<(PRIMES_LENGTH-1) && PRIMES[i]elements != NULL) { - if (hash->keyDeleter != NULL || hash->valueDeleter != NULL) { - int32_t pos=UHASH_FIRST; - UHashElement *e; - while ((e = (UHashElement*) uhash_nextElement(hash, &pos)) != NULL) { - HASH_DELETE_KEY_VALUE(hash, e->key.pointer, e->value.pointer); - } - } - uprv_free(hash->elements); - hash->elements = NULL; - } - if (hash->allocated) { - uprv_free(hash); - } -} - -U_CAPI UHashFunction *U_EXPORT2 -uhash_setKeyHasher(UHashtable *hash, UHashFunction *fn) { - UHashFunction *result = hash->keyHasher; - hash->keyHasher = fn; - return result; -} - -U_CAPI UKeyComparator *U_EXPORT2 -uhash_setKeyComparator(UHashtable *hash, UKeyComparator *fn) { - UKeyComparator *result = hash->keyComparator; - hash->keyComparator = fn; - return result; -} -U_CAPI UValueComparator *U_EXPORT2 -uhash_setValueComparator(UHashtable *hash, UValueComparator *fn){ - UValueComparator *result = hash->valueComparator; - hash->valueComparator = fn; - return result; -} - -U_CAPI UObjectDeleter *U_EXPORT2 -uhash_setKeyDeleter(UHashtable *hash, UObjectDeleter *fn) { - UObjectDeleter *result = hash->keyDeleter; - hash->keyDeleter = fn; - return result; -} - -U_CAPI UObjectDeleter *U_EXPORT2 -uhash_setValueDeleter(UHashtable *hash, UObjectDeleter *fn) { - UObjectDeleter *result = hash->valueDeleter; - hash->valueDeleter = fn; - return result; -} - -U_CAPI void U_EXPORT2 -uhash_setResizePolicy(UHashtable *hash, enum UHashResizePolicy policy) { - UErrorCode status = U_ZERO_ERROR; - _uhash_internalSetResizePolicy(hash, policy); - hash->lowWaterMark = (int32_t)(hash->length * hash->lowWaterRatio); - hash->highWaterMark = (int32_t)(hash->length * hash->highWaterRatio); - _uhash_rehash(hash, &status); -} - -U_CAPI int32_t U_EXPORT2 -uhash_count(const UHashtable *hash) { - return hash->count; -} - -U_CAPI void* U_EXPORT2 -uhash_get(const UHashtable *hash, - const void* key) { - UHashTok keyholder; - keyholder.pointer = (void*) key; - return _uhash_find(hash, keyholder, hash->keyHasher(keyholder))->value.pointer; -} - -U_CAPI void* U_EXPORT2 -uhash_iget(const UHashtable *hash, - int32_t key) { - UHashTok keyholder; - keyholder.integer = key; - return _uhash_find(hash, keyholder, hash->keyHasher(keyholder))->value.pointer; -} - -U_CAPI int32_t U_EXPORT2 -uhash_geti(const UHashtable *hash, - const void* key) { - UHashTok keyholder; - keyholder.pointer = (void*) key; - return _uhash_find(hash, keyholder, hash->keyHasher(keyholder))->value.integer; -} - -U_CAPI int32_t U_EXPORT2 -uhash_igeti(const UHashtable *hash, - int32_t key) { - UHashTok keyholder; - keyholder.integer = key; - return _uhash_find(hash, keyholder, hash->keyHasher(keyholder))->value.integer; -} - -U_CAPI void* U_EXPORT2 -uhash_put(UHashtable *hash, - void* key, - void* value, - UErrorCode *status) { - UHashTok keyholder, valueholder; - keyholder.pointer = key; - valueholder.pointer = value; - return _uhash_put(hash, keyholder, valueholder, - HINT_KEY_POINTER | HINT_VALUE_POINTER, - status).pointer; -} - -U_CAPI void* U_EXPORT2 -uhash_iput(UHashtable *hash, - int32_t key, - void* value, - UErrorCode *status) { - UHashTok keyholder, valueholder; - keyholder.integer = key; - valueholder.pointer = value; - return _uhash_put(hash, keyholder, valueholder, - HINT_VALUE_POINTER, - status).pointer; -} - -U_CAPI int32_t U_EXPORT2 -uhash_puti(UHashtable *hash, - void* key, - int32_t value, - UErrorCode *status) { - UHashTok keyholder, valueholder; - keyholder.pointer = key; - valueholder.integer = value; - return _uhash_put(hash, keyholder, valueholder, - HINT_KEY_POINTER, - status).integer; -} - - -U_CAPI int32_t U_EXPORT2 -uhash_iputi(UHashtable *hash, - int32_t key, - int32_t value, - UErrorCode *status) { - UHashTok keyholder, valueholder; - keyholder.integer = key; - valueholder.integer = value; - return _uhash_put(hash, keyholder, valueholder, - 0, /* neither is a ptr */ - status).integer; -} - -U_CAPI void* U_EXPORT2 -uhash_remove(UHashtable *hash, - const void* key) { - UHashTok keyholder; - keyholder.pointer = (void*) key; - return _uhash_remove(hash, keyholder).pointer; -} - -U_CAPI void* U_EXPORT2 -uhash_iremove(UHashtable *hash, - int32_t key) { - UHashTok keyholder; - keyholder.integer = key; - return _uhash_remove(hash, keyholder).pointer; -} - -U_CAPI int32_t U_EXPORT2 -uhash_removei(UHashtable *hash, - const void* key) { - UHashTok keyholder; - keyholder.pointer = (void*) key; - return _uhash_remove(hash, keyholder).integer; -} - -U_CAPI int32_t U_EXPORT2 -uhash_iremovei(UHashtable *hash, - int32_t key) { - UHashTok keyholder; - keyholder.integer = key; - return _uhash_remove(hash, keyholder).integer; -} - -U_CAPI void U_EXPORT2 -uhash_removeAll(UHashtable *hash) { - int32_t pos = UHASH_FIRST; - const UHashElement *e; - U_ASSERT(hash != NULL); - if (hash->count != 0) { - while ((e = uhash_nextElement(hash, &pos)) != NULL) { - uhash_removeElement(hash, e); - } - } - U_ASSERT(hash->count == 0); -} - -U_CAPI const UHashElement* U_EXPORT2 -uhash_find(const UHashtable *hash, const void* key) { - UHashTok keyholder; - const UHashElement *e; - keyholder.pointer = (void*) key; - e = _uhash_find(hash, keyholder, hash->keyHasher(keyholder)); - return IS_EMPTY_OR_DELETED(e->hashcode) ? NULL : e; -} - -U_CAPI const UHashElement* U_EXPORT2 -uhash_nextElement(const UHashtable *hash, int32_t *pos) { - /* Walk through the array until we find an element that is not - * EMPTY and not DELETED. - */ - int32_t i; - U_ASSERT(hash != NULL); - for (i = *pos + 1; i < hash->length; ++i) { - if (!IS_EMPTY_OR_DELETED(hash->elements[i].hashcode)) { - *pos = i; - return &(hash->elements[i]); - } - } - - /* No more elements */ - return NULL; -} - -U_CAPI void* U_EXPORT2 -uhash_removeElement(UHashtable *hash, const UHashElement* e) { - U_ASSERT(hash != NULL); - U_ASSERT(e != NULL); - if (!IS_EMPTY_OR_DELETED(e->hashcode)) { - UHashElement *nce = (UHashElement *)e; - return _uhash_internalRemoveElement(hash, nce).pointer; - } - return NULL; -} - -/******************************************************************** - * UHashTok convenience - ********************************************************************/ - -/** - * Return a UHashTok for an integer. - */ -/*U_CAPI UHashTok U_EXPORT2 -uhash_toki(int32_t i) { - UHashTok tok; - tok.integer = i; - return tok; -}*/ - -/** - * Return a UHashTok for a pointer. - */ -/*U_CAPI UHashTok U_EXPORT2 -uhash_tokp(void* p) { - UHashTok tok; - tok.pointer = p; - return tok; -}*/ - -/******************************************************************** - * PUBLIC Key Hash Functions - ********************************************************************/ - -U_CAPI int32_t U_EXPORT2 -uhash_hashUChars(const UHashTok key) { - const UChar *s = (const UChar *)key.pointer; - return s == NULL ? 0 : ustr_hashUCharsN(s, u_strlen(s)); -} - -U_CAPI int32_t U_EXPORT2 -uhash_hashChars(const UHashTok key) { - const char *s = (const char *)key.pointer; - return s == NULL ? 0 : ustr_hashCharsN(s, uprv_strlen(s)); -} - -U_CAPI int32_t U_EXPORT2 -uhash_hashIChars(const UHashTok key) { - const char *s = (const char *)key.pointer; - return s == NULL ? 0 : ustr_hashICharsN(s, uprv_strlen(s)); -} - -U_CAPI UBool U_EXPORT2 -uhash_equals(const UHashtable* hash1, const UHashtable* hash2){ - int32_t count1, count2, pos, i; - - if(hash1==hash2){ - return TRUE; - } - - /* - * Make sure that we are comparing 2 valid hashes of the same type - * with valid comparison functions. - * Without valid comparison functions, a binary comparison - * of the hash values will yield random results on machines - * with 64-bit pointers and 32-bit integer hashes. - * A valueComparator is normally optional. - */ - if (hash1==NULL || hash2==NULL || - hash1->keyComparator != hash2->keyComparator || - hash1->valueComparator != hash2->valueComparator || - hash1->valueComparator == NULL) - { - /* - Normally we would return an error here about incompatible hash tables, - but we return FALSE instead. - */ - return FALSE; - } - - count1 = uhash_count(hash1); - count2 = uhash_count(hash2); - if(count1!=count2){ - return FALSE; - } - - pos=UHASH_FIRST; - for(i=0; ikey; - const UHashTok val1 = elem1->value; - /* here the keys are not compared, instead the key form hash1 is used to fetch - * value from hash2. If the hashes are equal then then both hashes should - * contain equal values for the same key! - */ - const UHashElement* elem2 = _uhash_find(hash2, key1, hash2->keyHasher(key1)); - const UHashTok val2 = elem2->value; - if(hash1->valueComparator(val1, val2)==FALSE){ - return FALSE; - } - } - return TRUE; -} - -/******************************************************************** - * PUBLIC Comparator Functions - ********************************************************************/ - -U_CAPI UBool U_EXPORT2 -uhash_compareUChars(const UHashTok key1, const UHashTok key2) { - const UChar *p1 = (const UChar*) key1.pointer; - const UChar *p2 = (const UChar*) key2.pointer; - if (p1 == p2) { - return TRUE; - } - if (p1 == NULL || p2 == NULL) { - return FALSE; - } - while (*p1 != 0 && *p1 == *p2) { - ++p1; - ++p2; - } - return (UBool)(*p1 == *p2); -} - -U_CAPI UBool U_EXPORT2 -uhash_compareChars(const UHashTok key1, const UHashTok key2) { - const char *p1 = (const char*) key1.pointer; - const char *p2 = (const char*) key2.pointer; - if (p1 == p2) { - return TRUE; - } - if (p1 == NULL || p2 == NULL) { - return FALSE; - } - while (*p1 != 0 && *p1 == *p2) { - ++p1; - ++p2; - } - return (UBool)(*p1 == *p2); -} - -U_CAPI UBool U_EXPORT2 -uhash_compareIChars(const UHashTok key1, const UHashTok key2) { - const char *p1 = (const char*) key1.pointer; - const char *p2 = (const char*) key2.pointer; - if (p1 == p2) { - return TRUE; - } - if (p1 == NULL || p2 == NULL) { - return FALSE; - } - while (*p1 != 0 && uprv_tolower(*p1) == uprv_tolower(*p2)) { - ++p1; - ++p2; - } - return (UBool)(*p1 == *p2); -} - -/******************************************************************** - * PUBLIC int32_t Support Functions - ********************************************************************/ - -U_CAPI int32_t U_EXPORT2 -uhash_hashLong(const UHashTok key) { - return key.integer; -} - -U_CAPI UBool U_EXPORT2 -uhash_compareLong(const UHashTok key1, const UHashTok key2) { - return (UBool)(key1.integer == key2.integer); -} diff --git a/Build/source/libs/icu/icu-src/source/common/uhash.cpp b/Build/source/libs/icu/icu-src/source/common/uhash.cpp new file mode 100644 index 00000000000..a80e7b8ff27 --- /dev/null +++ b/Build/source/libs/icu/icu-src/source/common/uhash.cpp @@ -0,0 +1,991 @@ +// © 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html +/* +****************************************************************************** +* Copyright (C) 1997-2016, International Business Machines +* Corporation and others. All Rights Reserved. +****************************************************************************** +* Date Name Description +* 03/22/00 aliu Adapted from original C++ ICU Hashtable. +* 07/06/01 aliu Modified to support int32_t keys on +* platforms with sizeof(void*) < 32. +****************************************************************************** +*/ + +#include "uhash.h" +#include "unicode/ustring.h" +#include "cstring.h" +#include "cmemory.h" +#include "uassert.h" +#include "ustr_imp.h" + +/* This hashtable is implemented as a double hash. All elements are + * stored in a single array with no secondary storage for collision + * resolution (no linked list, etc.). When there is a hash collision + * (when two unequal keys have the same hashcode) we resolve this by + * using a secondary hash. The secondary hash is an increment + * computed as a hash function (a different one) of the primary + * hashcode. This increment is added to the initial hash value to + * obtain further slots assigned to the same hash code. For this to + * work, the length of the array and the increment must be relatively + * prime. The easiest way to achieve this is to have the length of + * the array be prime, and the increment be any value from + * 1..length-1. + * + * Hashcodes are 32-bit integers. We make sure all hashcodes are + * non-negative by masking off the top bit. This has two effects: (1) + * modulo arithmetic is simplified. If we allowed negative hashcodes, + * then when we computed hashcode % length, we could get a negative + * result, which we would then have to adjust back into range. It's + * simpler to just make hashcodes non-negative. (2) It makes it easy + * to check for empty vs. occupied slots in the table. We just mark + * empty or deleted slots with a negative hashcode. + * + * The central function is _uhash_find(). This function looks for a + * slot matching the given key and hashcode. If one is found, it + * returns a pointer to that slot. If the table is full, and no match + * is found, it returns NULL -- in theory. This would make the code + * more complicated, since all callers of _uhash_find() would then + * have to check for a NULL result. To keep this from happening, we + * don't allow the table to fill. When there is only one + * empty/deleted slot left, uhash_put() will refuse to increase the + * count, and fail. This simplifies the code. In practice, one will + * seldom encounter this using default UHashtables. However, if a + * hashtable is set to a U_FIXED resize policy, or if memory is + * exhausted, then the table may fill. + * + * High and low water ratios control rehashing. They establish levels + * of fullness (from 0 to 1) outside of which the data array is + * reallocated and repopulated. Setting the low water ratio to zero + * means the table will never shrink. Setting the high water ratio to + * one means the table will never grow. The ratios should be + * coordinated with the ratio between successive elements of the + * PRIMES table, so that when the primeIndex is incremented or + * decremented during rehashing, it brings the ratio of count / length + * back into the desired range (between low and high water ratios). + */ + +/******************************************************************** + * PRIVATE Constants, Macros + ********************************************************************/ + +/* This is a list of non-consecutive primes chosen such that + * PRIMES[i+1] ~ 2*PRIMES[i]. (Currently, the ratio ranges from 1.81 + * to 2.18; the inverse ratio ranges from 0.459 to 0.552.) If this + * ratio is changed, the low and high water ratios should also be + * adjusted to suit. + * + * These prime numbers were also chosen so that they are the largest + * prime number while being less than a power of two. + */ +static const int32_t PRIMES[] = { + 7, 13, 31, 61, 127, 251, 509, 1021, 2039, 4093, 8191, 16381, 32749, + 65521, 131071, 262139, 524287, 1048573, 2097143, 4194301, 8388593, + 16777213, 33554393, 67108859, 134217689, 268435399, 536870909, + 1073741789, 2147483647 /*, 4294967291 */ +}; + +#define PRIMES_LENGTH UPRV_LENGTHOF(PRIMES) +#define DEFAULT_PRIME_INDEX 4 + +/* These ratios are tuned to the PRIMES array such that a resize + * places the table back into the zone of non-resizing. That is, + * after a call to _uhash_rehash(), a subsequent call to + * _uhash_rehash() should do nothing (should not churn). This is only + * a potential problem with U_GROW_AND_SHRINK. + */ +static const float RESIZE_POLICY_RATIO_TABLE[6] = { + /* low, high water ratio */ + 0.0F, 0.5F, /* U_GROW: Grow on demand, do not shrink */ + 0.1F, 0.5F, /* U_GROW_AND_SHRINK: Grow and shrink on demand */ + 0.0F, 1.0F /* U_FIXED: Never change size */ +}; + +/* + Invariants for hashcode values: + + * DELETED < 0 + * EMPTY < 0 + * Real hashes >= 0 + + Hashcodes may not start out this way, but internally they are + adjusted so that they are always positive. We assume 32-bit + hashcodes; adjust these constants for other hashcode sizes. +*/ +#define HASH_DELETED ((int32_t) 0x80000000) +#define HASH_EMPTY ((int32_t) HASH_DELETED + 1) + +#define IS_EMPTY_OR_DELETED(x) ((x) < 0) + +/* This macro expects a UHashTok.pointer as its keypointer and + valuepointer parameters */ +#define HASH_DELETE_KEY_VALUE(hash, keypointer, valuepointer) \ + if (hash->keyDeleter != NULL && keypointer != NULL) { \ + (*hash->keyDeleter)(keypointer); \ + } \ + if (hash->valueDeleter != NULL && valuepointer != NULL) { \ + (*hash->valueDeleter)(valuepointer); \ + } + +/* + * Constants for hinting whether a key or value is an integer + * or a pointer. If a hint bit is zero, then the associated + * token is assumed to be an integer. + */ +#define HINT_KEY_POINTER (1) +#define HINT_VALUE_POINTER (2) + +/******************************************************************** + * PRIVATE Implementation + ********************************************************************/ + +static UHashTok +_uhash_setElement(UHashtable *hash, UHashElement* e, + int32_t hashcode, + UHashTok key, UHashTok value, int8_t hint) { + + UHashTok oldValue = e->value; + if (hash->keyDeleter != NULL && e->key.pointer != NULL && + e->key.pointer != key.pointer) { /* Avoid double deletion */ + (*hash->keyDeleter)(e->key.pointer); + } + if (hash->valueDeleter != NULL) { + if (oldValue.pointer != NULL && + oldValue.pointer != value.pointer) { /* Avoid double deletion */ + (*hash->valueDeleter)(oldValue.pointer); + } + oldValue.pointer = NULL; + } + /* Compilers should copy the UHashTok union correctly, but even if + * they do, memory heap tools (e.g. BoundsChecker) can get + * confused when a pointer is cloaked in a union and then copied. + * TO ALLEVIATE THIS, we use hints (based on what API the user is + * calling) to copy pointers when we know the user thinks + * something is a pointer. */ + if (hint & HINT_KEY_POINTER) { + e->key.pointer = key.pointer; + } else { + e->key = key; + } + if (hint & HINT_VALUE_POINTER) { + e->value.pointer = value.pointer; + } else { + e->value = value; + } + e->hashcode = hashcode; + return oldValue; +} + +/** + * Assumes that the given element is not empty or deleted. + */ +static UHashTok +_uhash_internalRemoveElement(UHashtable *hash, UHashElement* e) { + UHashTok empty; + U_ASSERT(!IS_EMPTY_OR_DELETED(e->hashcode)); + --hash->count; + empty.pointer = NULL; empty.integer = 0; + return _uhash_setElement(hash, e, HASH_DELETED, empty, empty, 0); +} + +static void +_uhash_internalSetResizePolicy(UHashtable *hash, enum UHashResizePolicy policy) { + U_ASSERT(hash != NULL); + U_ASSERT(((int32_t)policy) >= 0); + U_ASSERT(((int32_t)policy) < 3); + hash->lowWaterRatio = RESIZE_POLICY_RATIO_TABLE[policy * 2]; + hash->highWaterRatio = RESIZE_POLICY_RATIO_TABLE[policy * 2 + 1]; +} + +/** + * Allocate internal data array of a size determined by the given + * prime index. If the index is out of range it is pinned into range. + * If the allocation fails the status is set to + * U_MEMORY_ALLOCATION_ERROR and all array storage is freed. In + * either case the previous array pointer is overwritten. + * + * Caller must ensure primeIndex is in range 0..PRIME_LENGTH-1. + */ +static void +_uhash_allocate(UHashtable *hash, + int32_t primeIndex, + UErrorCode *status) { + + UHashElement *p, *limit; + UHashTok emptytok; + + if (U_FAILURE(*status)) return; + + U_ASSERT(primeIndex >= 0 && primeIndex < PRIMES_LENGTH); + + hash->primeIndex = primeIndex; + hash->length = PRIMES[primeIndex]; + + p = hash->elements = (UHashElement*) + uprv_malloc(sizeof(UHashElement) * hash->length); + + if (hash->elements == NULL) { + *status = U_MEMORY_ALLOCATION_ERROR; + return; + } + + emptytok.pointer = NULL; /* Only one of these two is needed */ + emptytok.integer = 0; /* but we don't know which one. */ + + limit = p + hash->length; + while (p < limit) { + p->key = emptytok; + p->value = emptytok; + p->hashcode = HASH_EMPTY; + ++p; + } + + hash->count = 0; + hash->lowWaterMark = (int32_t)(hash->length * hash->lowWaterRatio); + hash->highWaterMark = (int32_t)(hash->length * hash->highWaterRatio); +} + +static UHashtable* +_uhash_init(UHashtable *result, + UHashFunction *keyHash, + UKeyComparator *keyComp, + UValueComparator *valueComp, + int32_t primeIndex, + UErrorCode *status) +{ + if (U_FAILURE(*status)) return NULL; + U_ASSERT(keyHash != NULL); + U_ASSERT(keyComp != NULL); + + result->keyHasher = keyHash; + result->keyComparator = keyComp; + result->valueComparator = valueComp; + result->keyDeleter = NULL; + result->valueDeleter = NULL; + result->allocated = FALSE; + _uhash_internalSetResizePolicy(result, U_GROW); + + _uhash_allocate(result, primeIndex, status); + + if (U_FAILURE(*status)) { + return NULL; + } + + return result; +} + +static UHashtable* +_uhash_create(UHashFunction *keyHash, + UKeyComparator *keyComp, + UValueComparator *valueComp, + int32_t primeIndex, + UErrorCode *status) { + UHashtable *result; + + if (U_FAILURE(*status)) return NULL; + + result = (UHashtable*) uprv_malloc(sizeof(UHashtable)); + if (result == NULL) { + *status = U_MEMORY_ALLOCATION_ERROR; + return NULL; + } + + _uhash_init(result, keyHash, keyComp, valueComp, primeIndex, status); + result->allocated = TRUE; + + if (U_FAILURE(*status)) { + uprv_free(result); + return NULL; + } + + return result; +} + +/** + * Look for a key in the table, or if no such key exists, the first + * empty slot matching the given hashcode. Keys are compared using + * the keyComparator function. + * + * First find the start position, which is the hashcode modulo + * the length. Test it to see if it is: + * + * a. identical: First check the hash values for a quick check, + * then compare keys for equality using keyComparator. + * b. deleted + * c. empty + * + * Stop if it is identical or empty, otherwise continue by adding a + * "jump" value (moduloing by the length again to keep it within + * range) and retesting. For efficiency, there need enough empty + * values so that the searchs stop within a reasonable amount of time. + * This can be changed by changing the high/low water marks. + * + * In theory, this function can return NULL, if it is full (no empty + * or deleted slots) and if no matching key is found. In practice, we + * prevent this elsewhere (in uhash_put) by making sure the last slot + * in the table is never filled. + * + * The size of the table should be prime for this algorithm to work; + * otherwise we are not guaranteed that the jump value (the secondary + * hash) is relatively prime to the table length. + */ +static UHashElement* +_uhash_find(const UHashtable *hash, UHashTok key, + int32_t hashcode) { + + int32_t firstDeleted = -1; /* assume invalid index */ + int32_t theIndex, startIndex; + int32_t jump = 0; /* lazy evaluate */ + int32_t tableHash; + UHashElement *elements = hash->elements; + + hashcode &= 0x7FFFFFFF; /* must be positive */ + startIndex = theIndex = (hashcode ^ 0x4000000) % hash->length; + + do { + tableHash = elements[theIndex].hashcode; + if (tableHash == hashcode) { /* quick check */ + if ((*hash->keyComparator)(key, elements[theIndex].key)) { + return &(elements[theIndex]); + } + } else if (!IS_EMPTY_OR_DELETED(tableHash)) { + /* We have hit a slot which contains a key-value pair, + * but for which the hash code does not match. Keep + * looking. + */ + } else if (tableHash == HASH_EMPTY) { /* empty, end o' the line */ + break; + } else if (firstDeleted < 0) { /* remember first deleted */ + firstDeleted = theIndex; + } + if (jump == 0) { /* lazy compute jump */ + /* The jump value must be relatively prime to the table + * length. As long as the length is prime, then any value + * 1..length-1 will be relatively prime to it. + */ + jump = (hashcode % (hash->length - 1)) + 1; + } + theIndex = (theIndex + jump) % hash->length; + } while (theIndex != startIndex); + + if (firstDeleted >= 0) { + theIndex = firstDeleted; /* reset if had deleted slot */ + } else if (tableHash != HASH_EMPTY) { + /* We get to this point if the hashtable is full (no empty or + * deleted slots), and we've failed to find a match. THIS + * WILL NEVER HAPPEN as long as uhash_put() makes sure that + * count is always < length. + */ + U_ASSERT(FALSE); + return NULL; /* Never happens if uhash_put() behaves */ + } + return &(elements[theIndex]); +} + +/** + * Attempt to grow or shrink the data arrays in order to make the + * count fit between the high and low water marks. hash_put() and + * hash_remove() call this method when the count exceeds the high or + * low water marks. This method may do nothing, if memory allocation + * fails, or if the count is already in range, or if the length is + * already at the low or high limit. In any case, upon return the + * arrays will be valid. + */ +static void +_uhash_rehash(UHashtable *hash, UErrorCode *status) { + + UHashElement *old = hash->elements; + int32_t oldLength = hash->length; + int32_t newPrimeIndex = hash->primeIndex; + int32_t i; + + if (hash->count > hash->highWaterMark) { + if (++newPrimeIndex >= PRIMES_LENGTH) { + return; + } + } else if (hash->count < hash->lowWaterMark) { + if (--newPrimeIndex < 0) { + return; + } + } else { + return; + } + + _uhash_allocate(hash, newPrimeIndex, status); + + if (U_FAILURE(*status)) { + hash->elements = old; + hash->length = oldLength; + return; + } + + for (i = oldLength - 1; i >= 0; --i) { + if (!IS_EMPTY_OR_DELETED(old[i].hashcode)) { + UHashElement *e = _uhash_find(hash, old[i].key, old[i].hashcode); + U_ASSERT(e != NULL); + U_ASSERT(e->hashcode == HASH_EMPTY); + e->key = old[i].key; + e->value = old[i].value; + e->hashcode = old[i].hashcode; + ++hash->count; + } + } + + uprv_free(old); +} + +static UHashTok +_uhash_remove(UHashtable *hash, + UHashTok key) { + /* First find the position of the key in the table. If the object + * has not been removed already, remove it. If the user wanted + * keys deleted, then delete it also. We have to put a special + * hashcode in that position that means that something has been + * deleted, since when we do a find, we have to continue PAST any + * deleted values. + */ + UHashTok result; + UHashElement* e = _uhash_find(hash, key, hash->keyHasher(key)); + U_ASSERT(e != NULL); + result.pointer = NULL; + result.integer = 0; + if (!IS_EMPTY_OR_DELETED(e->hashcode)) { + result = _uhash_internalRemoveElement(hash, e); + if (hash->count < hash->lowWaterMark) { + UErrorCode status = U_ZERO_ERROR; + _uhash_rehash(hash, &status); + } + } + return result; +} + +static UHashTok +_uhash_put(UHashtable *hash, + UHashTok key, + UHashTok value, + int8_t hint, + UErrorCode *status) { + + /* Put finds the position in the table for the new value. If the + * key is already in the table, it is deleted, if there is a + * non-NULL keyDeleter. Then the key, the hash and the value are + * all put at the position in their respective arrays. + */ + int32_t hashcode; + UHashElement* e; + UHashTok emptytok; + + if (U_FAILURE(*status)) { + goto err; + } + U_ASSERT(hash != NULL); + /* Cannot always check pointer here or iSeries sees NULL every time. */ + if ((hint & HINT_VALUE_POINTER) && value.pointer == NULL) { + /* Disallow storage of NULL values, since NULL is returned by + * get() to indicate an absent key. Storing NULL == removing. + */ + return _uhash_remove(hash, key); + } + if (hash->count > hash->highWaterMark) { + _uhash_rehash(hash, status); + if (U_FAILURE(*status)) { + goto err; + } + } + + hashcode = (*hash->keyHasher)(key); + e = _uhash_find(hash, key, hashcode); + U_ASSERT(e != NULL); + + if (IS_EMPTY_OR_DELETED(e->hashcode)) { + /* Important: We must never actually fill the table up. If we + * do so, then _uhash_find() will return NULL, and we'll have + * to check for NULL after every call to _uhash_find(). To + * avoid this we make sure there is always at least one empty + * or deleted slot in the table. This only is a problem if we + * are out of memory and rehash isn't working. + */ + ++hash->count; + if (hash->count == hash->length) { + /* Don't allow count to reach length */ + --hash->count; + *status = U_MEMORY_ALLOCATION_ERROR; + goto err; + } + } + + /* We must in all cases handle storage properly. If there was an + * old key, then it must be deleted (if the deleter != NULL). + * Make hashcodes stored in table positive. + */ + return _uhash_setElement(hash, e, hashcode & 0x7FFFFFFF, key, value, hint); + + err: + /* If the deleters are non-NULL, this method adopts its key and/or + * value arguments, and we must be sure to delete the key and/or + * value in all cases, even upon failure. + */ + HASH_DELETE_KEY_VALUE(hash, key.pointer, value.pointer); + emptytok.pointer = NULL; emptytok.integer = 0; + return emptytok; +} + + +/******************************************************************** + * PUBLIC API + ********************************************************************/ + +U_CAPI UHashtable* U_EXPORT2 +uhash_open(UHashFunction *keyHash, + UKeyComparator *keyComp, + UValueComparator *valueComp, + UErrorCode *status) { + + return _uhash_create(keyHash, keyComp, valueComp, DEFAULT_PRIME_INDEX, status); +} + +U_CAPI UHashtable* U_EXPORT2 +uhash_openSize(UHashFunction *keyHash, + UKeyComparator *keyComp, + UValueComparator *valueComp, + int32_t size, + UErrorCode *status) { + + /* Find the smallest index i for which PRIMES[i] >= size. */ + int32_t i = 0; + while (i<(PRIMES_LENGTH-1) && PRIMES[i]= size. + int32_t i = 0; + while (i<(PRIMES_LENGTH-1) && PRIMES[i]elements != NULL) { + if (hash->keyDeleter != NULL || hash->valueDeleter != NULL) { + int32_t pos=UHASH_FIRST; + UHashElement *e; + while ((e = (UHashElement*) uhash_nextElement(hash, &pos)) != NULL) { + HASH_DELETE_KEY_VALUE(hash, e->key.pointer, e->value.pointer); + } + } + uprv_free(hash->elements); + hash->elements = NULL; + } + if (hash->allocated) { + uprv_free(hash); + } +} + +U_CAPI UHashFunction *U_EXPORT2 +uhash_setKeyHasher(UHashtable *hash, UHashFunction *fn) { + UHashFunction *result = hash->keyHasher; + hash->keyHasher = fn; + return result; +} + +U_CAPI UKeyComparator *U_EXPORT2 +uhash_setKeyComparator(UHashtable *hash, UKeyComparator *fn) { + UKeyComparator *result = hash->keyComparator; + hash->keyComparator = fn; + return result; +} +U_CAPI UValueComparator *U_EXPORT2 +uhash_setValueComparator(UHashtable *hash, UValueComparator *fn){ + UValueComparator *result = hash->valueComparator; + hash->valueComparator = fn; + return result; +} + +U_CAPI UObjectDeleter *U_EXPORT2 +uhash_setKeyDeleter(UHashtable *hash, UObjectDeleter *fn) { + UObjectDeleter *result = hash->keyDeleter; + hash->keyDeleter = fn; + return result; +} + +U_CAPI UObjectDeleter *U_EXPORT2 +uhash_setValueDeleter(UHashtable *hash, UObjectDeleter *fn) { + UObjectDeleter *result = hash->valueDeleter; + hash->valueDeleter = fn; + return result; +} + +U_CAPI void U_EXPORT2 +uhash_setResizePolicy(UHashtable *hash, enum UHashResizePolicy policy) { + UErrorCode status = U_ZERO_ERROR; + _uhash_internalSetResizePolicy(hash, policy); + hash->lowWaterMark = (int32_t)(hash->length * hash->lowWaterRatio); + hash->highWaterMark = (int32_t)(hash->length * hash->highWaterRatio); + _uhash_rehash(hash, &status); +} + +U_CAPI int32_t U_EXPORT2 +uhash_count(const UHashtable *hash) { + return hash->count; +} + +U_CAPI void* U_EXPORT2 +uhash_get(const UHashtable *hash, + const void* key) { + UHashTok keyholder; + keyholder.pointer = (void*) key; + return _uhash_find(hash, keyholder, hash->keyHasher(keyholder))->value.pointer; +} + +U_CAPI void* U_EXPORT2 +uhash_iget(const UHashtable *hash, + int32_t key) { + UHashTok keyholder; + keyholder.integer = key; + return _uhash_find(hash, keyholder, hash->keyHasher(keyholder))->value.pointer; +} + +U_CAPI int32_t U_EXPORT2 +uhash_geti(const UHashtable *hash, + const void* key) { + UHashTok keyholder; + keyholder.pointer = (void*) key; + return _uhash_find(hash, keyholder, hash->keyHasher(keyholder))->value.integer; +} + +U_CAPI int32_t U_EXPORT2 +uhash_igeti(const UHashtable *hash, + int32_t key) { + UHashTok keyholder; + keyholder.integer = key; + return _uhash_find(hash, keyholder, hash->keyHasher(keyholder))->value.integer; +} + +U_CAPI void* U_EXPORT2 +uhash_put(UHashtable *hash, + void* key, + void* value, + UErrorCode *status) { + UHashTok keyholder, valueholder; + keyholder.pointer = key; + valueholder.pointer = value; + return _uhash_put(hash, keyholder, valueholder, + HINT_KEY_POINTER | HINT_VALUE_POINTER, + status).pointer; +} + +U_CAPI void* U_EXPORT2 +uhash_iput(UHashtable *hash, + int32_t key, + void* value, + UErrorCode *status) { + UHashTok keyholder, valueholder; + keyholder.integer = key; + valueholder.pointer = value; + return _uhash_put(hash, keyholder, valueholder, + HINT_VALUE_POINTER, + status).pointer; +} + +U_CAPI int32_t U_EXPORT2 +uhash_puti(UHashtable *hash, + void* key, + int32_t value, + UErrorCode *status) { + UHashTok keyholder, valueholder; + keyholder.pointer = key; + valueholder.integer = value; + return _uhash_put(hash, keyholder, valueholder, + HINT_KEY_POINTER, + status).integer; +} + + +U_CAPI int32_t U_EXPORT2 +uhash_iputi(UHashtable *hash, + int32_t key, + int32_t value, + UErrorCode *status) { + UHashTok keyholder, valueholder; + keyholder.integer = key; + valueholder.integer = value; + return _uhash_put(hash, keyholder, valueholder, + 0, /* neither is a ptr */ + status).integer; +} + +U_CAPI void* U_EXPORT2 +uhash_remove(UHashtable *hash, + const void* key) { + UHashTok keyholder; + keyholder.pointer = (void*) key; + return _uhash_remove(hash, keyholder).pointer; +} + +U_CAPI void* U_EXPORT2 +uhash_iremove(UHashtable *hash, + int32_t key) { + UHashTok keyholder; + keyholder.integer = key; + return _uhash_remove(hash, keyholder).pointer; +} + +U_CAPI int32_t U_EXPORT2 +uhash_removei(UHashtable *hash, + const void* key) { + UHashTok keyholder; + keyholder.pointer = (void*) key; + return _uhash_remove(hash, keyholder).integer; +} + +U_CAPI int32_t U_EXPORT2 +uhash_iremovei(UHashtable *hash, + int32_t key) { + UHashTok keyholder; + keyholder.integer = key; + return _uhash_remove(hash, keyholder).integer; +} + +U_CAPI void U_EXPORT2 +uhash_removeAll(UHashtable *hash) { + int32_t pos = UHASH_FIRST; + const UHashElement *e; + U_ASSERT(hash != NULL); + if (hash->count != 0) { + while ((e = uhash_nextElement(hash, &pos)) != NULL) { + uhash_removeElement(hash, e); + } + } + U_ASSERT(hash->count == 0); +} + +U_CAPI const UHashElement* U_EXPORT2 +uhash_find(const UHashtable *hash, const void* key) { + UHashTok keyholder; + const UHashElement *e; + keyholder.pointer = (void*) key; + e = _uhash_find(hash, keyholder, hash->keyHasher(keyholder)); + return IS_EMPTY_OR_DELETED(e->hashcode) ? NULL : e; +} + +U_CAPI const UHashElement* U_EXPORT2 +uhash_nextElement(const UHashtable *hash, int32_t *pos) { + /* Walk through the array until we find an element that is not + * EMPTY and not DELETED. + */ + int32_t i; + U_ASSERT(hash != NULL); + for (i = *pos + 1; i < hash->length; ++i) { + if (!IS_EMPTY_OR_DELETED(hash->elements[i].hashcode)) { + *pos = i; + return &(hash->elements[i]); + } + } + + /* No more elements */ + return NULL; +} + +U_CAPI void* U_EXPORT2 +uhash_removeElement(UHashtable *hash, const UHashElement* e) { + U_ASSERT(hash != NULL); + U_ASSERT(e != NULL); + if (!IS_EMPTY_OR_DELETED(e->hashcode)) { + UHashElement *nce = (UHashElement *)e; + return _uhash_internalRemoveElement(hash, nce).pointer; + } + return NULL; +} + +/******************************************************************** + * UHashTok convenience + ********************************************************************/ + +/** + * Return a UHashTok for an integer. + */ +/*U_CAPI UHashTok U_EXPORT2 +uhash_toki(int32_t i) { + UHashTok tok; + tok.integer = i; + return tok; +}*/ + +/** + * Return a UHashTok for a pointer. + */ +/*U_CAPI UHashTok U_EXPORT2 +uhash_tokp(void* p) { + UHashTok tok; + tok.pointer = p; + return tok; +}*/ + +/******************************************************************** + * PUBLIC Key Hash Functions + ********************************************************************/ + +U_CAPI int32_t U_EXPORT2 +uhash_hashUChars(const UHashTok key) { + const UChar *s = (const UChar *)key.pointer; + return s == NULL ? 0 : ustr_hashUCharsN(s, u_strlen(s)); +} + +U_CAPI int32_t U_EXPORT2 +uhash_hashChars(const UHashTok key) { + const char *s = (const char *)key.pointer; + return s == NULL ? 0 : static_cast(ustr_hashCharsN(s, uprv_strlen(s))); +} + +U_CAPI int32_t U_EXPORT2 +uhash_hashIChars(const UHashTok key) { + const char *s = (const char *)key.pointer; + return s == NULL ? 0 : ustr_hashICharsN(s, uprv_strlen(s)); +} + +U_CAPI UBool U_EXPORT2 +uhash_equals(const UHashtable* hash1, const UHashtable* hash2){ + int32_t count1, count2, pos, i; + + if(hash1==hash2){ + return TRUE; + } + + /* + * Make sure that we are comparing 2 valid hashes of the same type + * with valid comparison functions. + * Without valid comparison functions, a binary comparison + * of the hash values will yield random results on machines + * with 64-bit pointers and 32-bit integer hashes. + * A valueComparator is normally optional. + */ + if (hash1==NULL || hash2==NULL || + hash1->keyComparator != hash2->keyComparator || + hash1->valueComparator != hash2->valueComparator || + hash1->valueComparator == NULL) + { + /* + Normally we would return an error here about incompatible hash tables, + but we return FALSE instead. + */ + return FALSE; + } + + count1 = uhash_count(hash1); + count2 = uhash_count(hash2); + if(count1!=count2){ + return FALSE; + } + + pos=UHASH_FIRST; + for(i=0; ikey; + const UHashTok val1 = elem1->value; + /* here the keys are not compared, instead the key form hash1 is used to fetch + * value from hash2. If the hashes are equal then then both hashes should + * contain equal values for the same key! + */ + const UHashElement* elem2 = _uhash_find(hash2, key1, hash2->keyHasher(key1)); + const UHashTok val2 = elem2->value; + if(hash1->valueComparator(val1, val2)==FALSE){ + return FALSE; + } + } + return TRUE; +} + +/******************************************************************** + * PUBLIC Comparator Functions + ********************************************************************/ + +U_CAPI UBool U_EXPORT2 +uhash_compareUChars(const UHashTok key1, const UHashTok key2) { + const UChar *p1 = (const UChar*) key1.pointer; + const UChar *p2 = (const UChar*) key2.pointer; + if (p1 == p2) { + return TRUE; + } + if (p1 == NULL || p2 == NULL) { + return FALSE; + } + while (*p1 != 0 && *p1 == *p2) { + ++p1; + ++p2; + } + return (UBool)(*p1 == *p2); +} + +U_CAPI UBool U_EXPORT2 +uhash_compareChars(const UHashTok key1, const UHashTok key2) { + const char *p1 = (const char*) key1.pointer; + const char *p2 = (const char*) key2.pointer; + if (p1 == p2) { + return TRUE; + } + if (p1 == NULL || p2 == NULL) { + return FALSE; + } + while (*p1 != 0 && *p1 == *p2) { + ++p1; + ++p2; + } + return (UBool)(*p1 == *p2); +} + +U_CAPI UBool U_EXPORT2 +uhash_compareIChars(const UHashTok key1, const UHashTok key2) { + const char *p1 = (const char*) key1.pointer; + const char *p2 = (const char*) key2.pointer; + if (p1 == p2) { + return TRUE; + } + if (p1 == NULL || p2 == NULL) { + return FALSE; + } + while (*p1 != 0 && uprv_tolower(*p1) == uprv_tolower(*p2)) { + ++p1; + ++p2; + } + return (UBool)(*p1 == *p2); +} + +/******************************************************************** + * PUBLIC int32_t Support Functions + ********************************************************************/ + +U_CAPI int32_t U_EXPORT2 +uhash_hashLong(const UHashTok key) { + return key.integer; +} + +U_CAPI UBool U_EXPORT2 +uhash_compareLong(const UHashTok key1, const UHashTok key2) { + return (UBool)(key1.integer == key2.integer); +} diff --git a/Build/source/libs/icu/icu-src/source/common/uhash.h b/Build/source/libs/icu/icu-src/source/common/uhash.h index e53ce73928d..b59d2711bb2 100644 --- a/Build/source/libs/icu/icu-src/source/common/uhash.h +++ b/Build/source/libs/icu/icu-src/source/common/uhash.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ****************************************************************************** @@ -154,7 +154,7 @@ struct UHashtable { * If NULL won't do anything */ /* Size parameters */ - + int32_t count; /* The number of key-value pairs in this table. * 0 <= count <= length. In practice we * never let count == length (see code). */ @@ -162,12 +162,12 @@ struct UHashtable { * and values. Must be prime. */ /* Rehashing thresholds */ - + int32_t highWaterMark; /* If count > highWaterMark, rehash */ int32_t lowWaterMark; /* If count < lowWaterMark, rehash */ float highWaterRatio; /* 0..1; high water as a fraction of length */ float lowWaterRatio; /* 0..1; low water as a fraction of length */ - + int8_t primeIndex; /* Index into our prime table for length. * length == PRIMES[primeIndex] */ UBool allocated; /* Was this UHashtable allocated? */ @@ -190,7 +190,7 @@ U_CDECL_END * @return A pointer to a UHashtable, or 0 if an error occurred. * @see uhash_openSize */ -U_CAPI UHashtable* U_EXPORT2 +U_CAPI UHashtable* U_EXPORT2 uhash_open(UHashFunction *keyHash, UKeyComparator *keyComp, UValueComparator *valueComp, @@ -207,7 +207,7 @@ uhash_open(UHashFunction *keyHash, * @return A pointer to a UHashtable, or 0 if an error occurred. * @see uhash_open */ -U_CAPI UHashtable* U_EXPORT2 +U_CAPI UHashtable* U_EXPORT2 uhash_openSize(UHashFunction *keyHash, UKeyComparator *keyComp, UValueComparator *valueComp, @@ -224,18 +224,37 @@ uhash_openSize(UHashFunction *keyHash, * @return A pointer to a UHashtable, or 0 if an error occurred. * @see uhash_openSize */ -U_CAPI UHashtable* U_EXPORT2 +U_CAPI UHashtable* U_EXPORT2 uhash_init(UHashtable *hash, UHashFunction *keyHash, UKeyComparator *keyComp, UValueComparator *valueComp, UErrorCode *status); +/** + * Initialize an existing UHashtable. + * @param keyHash A pointer to the key hashing function. Must not be + * NULL. + * @param keyComp A pointer to the function that compares keys. Must + * not be NULL. + * @param size The initial capacity of this hash table. + * @param status A pointer to an UErrorCode to receive any errors. + * @return A pointer to a UHashtable, or 0 if an error occurred. + * @see uhash_openSize + */ +U_CAPI UHashtable* U_EXPORT2 +uhash_initSize(UHashtable *hash, + UHashFunction *keyHash, + UKeyComparator *keyComp, + UValueComparator *valueComp, + int32_t size, + UErrorCode *status); + /** * Close a UHashtable, releasing the memory used. * @param hash The UHashtable to close. If hash is NULL no operation is performed. */ -U_CAPI void U_EXPORT2 +U_CAPI void U_EXPORT2 uhash_close(UHashtable *hash); @@ -246,7 +265,7 @@ uhash_close(UHashtable *hash); * @param fn the function to be used hash keys; must not be NULL * @return the previous key hasher; non-NULL */ -U_CAPI UHashFunction *U_EXPORT2 +U_CAPI UHashFunction *U_EXPORT2 uhash_setKeyHasher(UHashtable *hash, UHashFunction *fn); /** @@ -256,7 +275,7 @@ uhash_setKeyHasher(UHashtable *hash, UHashFunction *fn); * @param fn the function to be used compare keys; must not be NULL * @return the previous key comparator; non-NULL */ -U_CAPI UKeyComparator *U_EXPORT2 +U_CAPI UKeyComparator *U_EXPORT2 uhash_setKeyComparator(UHashtable *hash, UKeyComparator *fn); /** @@ -266,7 +285,7 @@ uhash_setKeyComparator(UHashtable *hash, UKeyComparator *fn); * @param fn the function to be used compare keys; must not be NULL * @return the previous key comparator; non-NULL */ -U_CAPI UValueComparator *U_EXPORT2 +U_CAPI UValueComparator *U_EXPORT2 uhash_setValueComparator(UHashtable *hash, UValueComparator *fn); /** @@ -279,7 +298,7 @@ uhash_setValueComparator(UHashtable *hash, UValueComparator *fn); * @param fn the function to be used delete keys, or NULL * @return the previous key deleter; may be NULL */ -U_CAPI UObjectDeleter *U_EXPORT2 +U_CAPI UObjectDeleter *U_EXPORT2 uhash_setKeyDeleter(UHashtable *hash, UObjectDeleter *fn); /** @@ -292,7 +311,7 @@ uhash_setKeyDeleter(UHashtable *hash, UObjectDeleter *fn); * @param fn the function to be used delete values, or NULL * @return the previous value deleter; may be NULL */ -U_CAPI UObjectDeleter *U_EXPORT2 +U_CAPI UObjectDeleter *U_EXPORT2 uhash_setValueDeleter(UHashtable *hash, UObjectDeleter *fn); /** @@ -302,7 +321,7 @@ uhash_setValueDeleter(UHashtable *hash, UObjectDeleter *fn); * @param hash The UHashtable to set * @param policy The way the hashtable resizes itself, {U_GROW, U_GROW_AND_SHRINK, U_FIXED} */ -U_CAPI void U_EXPORT2 +U_CAPI void U_EXPORT2 uhash_setResizePolicy(UHashtable *hash, enum UHashResizePolicy policy); /** @@ -310,7 +329,7 @@ uhash_setResizePolicy(UHashtable *hash, enum UHashResizePolicy policy); * @param hash The UHashtable to query. * @return The number of key-value pairs stored in hash. */ -U_CAPI int32_t U_EXPORT2 +U_CAPI int32_t U_EXPORT2 uhash_count(const UHashtable *hash); /** @@ -326,7 +345,7 @@ uhash_count(const UHashtable *hash); * @return The previous value, or NULL if none. * @see uhash_get */ -U_CAPI void* U_EXPORT2 +U_CAPI void* U_EXPORT2 uhash_put(UHashtable *hash, void *key, void *value, @@ -344,7 +363,7 @@ uhash_put(UHashtable *hash, * @return The previous value, or NULL if none. * @see uhash_get */ -U_CAPI void* U_EXPORT2 +U_CAPI void* U_EXPORT2 uhash_iput(UHashtable *hash, int32_t key, void* value, @@ -362,7 +381,7 @@ uhash_iput(UHashtable *hash, * @return The previous value, or 0 if none. * @see uhash_get */ -U_CAPI int32_t U_EXPORT2 +U_CAPI int32_t U_EXPORT2 uhash_puti(UHashtable *hash, void* key, int32_t value, @@ -380,7 +399,7 @@ uhash_puti(UHashtable *hash, * @return The previous value, or 0 if none. * @see uhash_get */ -U_CAPI int32_t U_EXPORT2 +U_CAPI int32_t U_EXPORT2 uhash_iputi(UHashtable *hash, int32_t key, int32_t value, @@ -393,8 +412,8 @@ uhash_iputi(UHashtable *hash, * @param key A pointer key stored in a hashtable * @return The requested item, or NULL if not found. */ -U_CAPI void* U_EXPORT2 -uhash_get(const UHashtable *hash, +U_CAPI void* U_EXPORT2 +uhash_get(const UHashtable *hash, const void *key); /** @@ -404,7 +423,7 @@ uhash_get(const UHashtable *hash, * @param key An integer key stored in a hashtable * @return The requested item, or NULL if not found. */ -U_CAPI void* U_EXPORT2 +U_CAPI void* U_EXPORT2 uhash_iget(const UHashtable *hash, int32_t key); @@ -415,7 +434,7 @@ uhash_iget(const UHashtable *hash, * @param key A pointer key stored in a hashtable * @return The requested item, or 0 if not found. */ -U_CAPI int32_t U_EXPORT2 +U_CAPI int32_t U_EXPORT2 uhash_geti(const UHashtable *hash, const void* key); /** @@ -425,7 +444,7 @@ uhash_geti(const UHashtable *hash, * @param key An integer key stored in a hashtable * @return The requested item, or 0 if not found. */ -U_CAPI int32_t U_EXPORT2 +U_CAPI int32_t U_EXPORT2 uhash_igeti(const UHashtable *hash, int32_t key); @@ -435,7 +454,7 @@ uhash_igeti(const UHashtable *hash, * @param key A key stored in a hashtable * @return The item removed, or NULL if not found. */ -U_CAPI void* U_EXPORT2 +U_CAPI void* U_EXPORT2 uhash_remove(UHashtable *hash, const void *key); @@ -445,7 +464,7 @@ uhash_remove(UHashtable *hash, * @param key An integer key stored in a hashtable * @return The item removed, or NULL if not found. */ -U_CAPI void* U_EXPORT2 +U_CAPI void* U_EXPORT2 uhash_iremove(UHashtable *hash, int32_t key); @@ -455,7 +474,7 @@ uhash_iremove(UHashtable *hash, * @param key An key stored in a hashtable * @return The item removed, or 0 if not found. */ -U_CAPI int32_t U_EXPORT2 +U_CAPI int32_t U_EXPORT2 uhash_removei(UHashtable *hash, const void* key); @@ -465,7 +484,7 @@ uhash_removei(UHashtable *hash, * @param key An integer key stored in a hashtable * @return The item removed, or 0 if not found. */ -U_CAPI int32_t U_EXPORT2 +U_CAPI int32_t U_EXPORT2 uhash_iremovei(UHashtable *hash, int32_t key); @@ -473,7 +492,7 @@ uhash_iremovei(UHashtable *hash, * Remove all items from a UHashtable. * @param hash The target UHashtable. */ -U_CAPI void U_EXPORT2 +U_CAPI void U_EXPORT2 uhash_removeAll(UHashtable *hash); /** @@ -487,7 +506,7 @@ uhash_removeAll(UHashtable *hash); * @param key A key stored in a hashtable * @return a hash element, or NULL if the key is not found. */ -U_CAPI const UHashElement* U_EXPORT2 +U_CAPI const UHashElement* U_EXPORT2 uhash_find(const UHashtable *hash, const void* key); /** @@ -510,7 +529,7 @@ uhash_find(const UHashtable *hash, const void* key); * @return a hash element, or NULL if no further key-value pairs * exist in the table. */ -U_CAPI const UHashElement* U_EXPORT2 +U_CAPI const UHashElement* U_EXPORT2 uhash_nextElement(const UHashtable *hash, int32_t *pos); @@ -525,7 +544,7 @@ uhash_nextElement(const UHashtable *hash, * modified. * @return the value that was removed. */ -U_CAPI void* U_EXPORT2 +U_CAPI void* U_EXPORT2 uhash_removeElement(UHashtable *hash, const UHashElement* e); /******************************************************************** @@ -537,7 +556,7 @@ uhash_removeElement(UHashtable *hash, const UHashElement* e); * @param i The given integer * @return a UHashTok for an integer. */ -/*U_CAPI UHashTok U_EXPORT2 +/*U_CAPI UHashTok U_EXPORT2 uhash_toki(int32_t i);*/ /** @@ -545,7 +564,7 @@ uhash_toki(int32_t i);*/ * @param p The given pointer * @return a UHashTok for a pointer. */ -/*U_CAPI UHashTok U_EXPORT2 +/*U_CAPI UHashTok U_EXPORT2 uhash_tokp(void* p);*/ /******************************************************************** @@ -559,7 +578,7 @@ uhash_tokp(void* p);*/ * @param key The string (const UChar*) to hash. * @return A hash code for the key. */ -U_CAPI int32_t U_EXPORT2 +U_CAPI int32_t U_EXPORT2 uhash_hashUChars(const UHashTok key); /** @@ -569,7 +588,7 @@ uhash_hashUChars(const UHashTok key); * @param key The string (const char*) to hash. * @return A hash code for the key. */ -U_CAPI int32_t U_EXPORT2 +U_CAPI int32_t U_EXPORT2 uhash_hashChars(const UHashTok key); /** @@ -589,7 +608,7 @@ uhash_hashIChars(const UHashTok key); * @param key2 The string for comparison * @return true if key1 and key2 are equal, return false otherwise. */ -U_CAPI UBool U_EXPORT2 +U_CAPI UBool U_EXPORT2 uhash_compareUChars(const UHashTok key1, const UHashTok key2); /** @@ -599,7 +618,7 @@ uhash_compareUChars(const UHashTok key1, const UHashTok key2); * @param key2 The string for comparison * @return true if key1 and key2 are equal, return false otherwise. */ -U_CAPI UBool U_EXPORT2 +U_CAPI UBool U_EXPORT2 uhash_compareChars(const UHashTok key1, const UHashTok key2); /** @@ -609,7 +628,7 @@ uhash_compareChars(const UHashTok key1, const UHashTok key2); * @param key2 The string for comparison * @return true if key1 and key2 are equal, return false otherwise. */ -U_CAPI UBool U_EXPORT2 +U_CAPI UBool U_EXPORT2 uhash_compareIChars(const UHashTok key1, const UHashTok key2); /******************************************************************** @@ -621,7 +640,7 @@ uhash_compareIChars(const UHashTok key1, const UHashTok key2); * @param key The string (const char*) to hash. * @return A hash code for the key. */ -U_CAPI int32_t U_EXPORT2 +U_CAPI int32_t U_EXPORT2 uhash_hashUnicodeString(const UElement key); /** @@ -630,7 +649,7 @@ uhash_hashUnicodeString(const UElement key); * @param key The string (const char*) to hash. * @return A hash code for the key. */ -U_CAPI int32_t U_EXPORT2 +U_CAPI int32_t U_EXPORT2 uhash_hashCaselessUnicodeString(const UElement key); /******************************************************************** @@ -642,7 +661,7 @@ uhash_hashCaselessUnicodeString(const UElement key); * @param key The string (const char*) to hash. * @return A hash code for the key. */ -U_CAPI int32_t U_EXPORT2 +U_CAPI int32_t U_EXPORT2 uhash_hashLong(const UHashTok key); /** @@ -651,7 +670,7 @@ uhash_hashLong(const UHashTok key); * @param Key2 The integer for comparison * @return true if key1 and key2 are equal, return false otherwise */ -U_CAPI UBool U_EXPORT2 +U_CAPI UBool U_EXPORT2 uhash_compareLong(const UHashTok key1, const UHashTok key2); /******************************************************************** @@ -662,7 +681,7 @@ uhash_compareLong(const UHashTok key1, const UHashTok key2); * Deleter for Hashtable objects. * @param obj The object to be deleted */ -U_CAPI void U_EXPORT2 +U_CAPI void U_EXPORT2 uhash_deleteHashtable(void *obj); /* Use uprv_free() itself as a deleter for any key or value allocated using uprv_malloc. */ @@ -673,7 +692,7 @@ uhash_deleteHashtable(void *obj); * @param hash2 * @return true if the hashtables are equal and false if not. */ -U_CAPI UBool U_EXPORT2 +U_CAPI UBool U_EXPORT2 uhash_equals(const UHashtable* hash1, const UHashtable* hash2); diff --git a/Build/source/libs/icu/icu-src/source/common/uhash_us.cpp b/Build/source/libs/icu/icu-src/source/common/uhash_us.cpp index ac76c1b9782..ef482c27463 100644 --- a/Build/source/libs/icu/icu-src/source/common/uhash_us.cpp +++ b/Build/source/libs/icu/icu-src/source/common/uhash_us.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ****************************************************************************** diff --git a/Build/source/libs/icu/icu-src/source/common/uidna.cpp b/Build/source/libs/icu/icu-src/source/common/uidna.cpp index e01c9aea603..7cc97a93a01 100644 --- a/Build/source/libs/icu/icu-src/source/common/uidna.cpp +++ b/Build/source/libs/icu/icu-src/source/common/uidna.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* @@ -8,7 +8,7 @@ * ******************************************************************************* * file name: uidna.cpp - * encoding: US-ASCII + * encoding: UTF-8 * tab size: 8 (not used) * indentation:4 * diff --git a/Build/source/libs/icu/icu-src/source/common/uinit.cpp b/Build/source/libs/icu/icu-src/source/common/uinit.cpp index 34e82a3db41..624431be02c 100644 --- a/Build/source/libs/icu/icu-src/source/common/uinit.cpp +++ b/Build/source/libs/icu/icu-src/source/common/uinit.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ****************************************************************************** @@ -6,7 +6,7 @@ * Corporation and others. All Rights Reserved. ****************************************************************************** * file name: uinit.cpp -* encoding: US-ASCII +* encoding: UTF-8 * tab size: 8 (not used) * indentation:4 * diff --git a/Build/source/libs/icu/icu-src/source/common/uinvchar.c b/Build/source/libs/icu/icu-src/source/common/uinvchar.c deleted file mode 100644 index 79dd05143f0..00000000000 --- a/Build/source/libs/icu/icu-src/source/common/uinvchar.c +++ /dev/null @@ -1,613 +0,0 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. -// License & terms of use: http://www.unicode.org/copyright.html -/* -******************************************************************************* -* -* Copyright (C) 1999-2010, International Business Machines -* Corporation and others. All Rights Reserved. -* -******************************************************************************* -* file name: uinvchar.c -* encoding: US-ASCII -* tab size: 8 (not used) -* indentation:2 -* -* created on: 2004sep14 -* created by: Markus W. Scherer -* -* Functions for handling invariant characters, moved here from putil.c -* for better modularization. -*/ - -#include "unicode/utypes.h" -#include "unicode/ustring.h" -#include "udataswp.h" -#include "cstring.h" -#include "cmemory.h" -#include "uassert.h" -#include "uinvchar.h" - -/* invariant-character handling --------------------------------------------- */ - -/* - * These maps for ASCII to/from EBCDIC map invariant characters (see utypes.h) - * appropriately for most EBCDIC codepages. - * - * They currently also map most other ASCII graphic characters, - * appropriately for codepages 37 and 1047. - * Exceptions: The characters for []^ have different codes in 37 & 1047. - * Both versions are mapped to ASCII. - * - * ASCII 37 1047 - * [ 5B BA AD - * ] 5D BB BD - * ^ 5E B0 5F - * - * There are no mappings for variant characters from Unicode to EBCDIC. - * - * Currently, C0 control codes are also included in these maps. - * Exceptions: S/390 Open Edition swaps LF and NEL codes compared with other - * EBCDIC platforms; both codes (15 and 25) are mapped to ASCII LF (0A), - * but there is no mapping for ASCII LF back to EBCDIC. - * - * ASCII EBCDIC S/390-OE - * LF 0A 25 15 - * NEL 85 15 25 - * - * The maps below explicitly exclude the variant - * control and graphical characters that are in ASCII-based - * codepages at 0x80 and above. - * "No mapping" is expressed by mapping to a 00 byte. - * - * These tables do not establish a converter or a codepage. - */ - -static const uint8_t asciiFromEbcdic[256]={ - 0x00, 0x01, 0x02, 0x03, 0x00, 0x09, 0x00, 0x7f, 0x00, 0x00, 0x00, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, - 0x10, 0x11, 0x12, 0x13, 0x00, 0x0a, 0x08, 0x00, 0x18, 0x19, 0x00, 0x00, 0x1c, 0x1d, 0x1e, 0x1f, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x17, 0x1b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x06, 0x07, - 0x00, 0x00, 0x16, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x14, 0x15, 0x00, 0x1a, - - 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2e, 0x3c, 0x28, 0x2b, 0x7c, - 0x26, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x21, 0x24, 0x2a, 0x29, 0x3b, 0x5e, - 0x2d, 0x2f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2c, 0x25, 0x5f, 0x3e, 0x3f, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x3a, 0x23, 0x40, 0x27, 0x3d, 0x22, - - 0x00, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x7e, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7a, 0x00, 0x00, 0x00, 0x5b, 0x00, 0x00, - 0x5e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5b, 0x5d, 0x00, 0x5d, 0x00, 0x00, - - 0x7b, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x7d, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f, 0x50, 0x51, 0x52, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x5c, 0x00, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 -}; - -static const uint8_t ebcdicFromAscii[256]={ - 0x00, 0x01, 0x02, 0x03, 0x37, 0x2d, 0x2e, 0x2f, 0x16, 0x05, 0x00, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, - 0x10, 0x11, 0x12, 0x13, 0x3c, 0x3d, 0x32, 0x26, 0x18, 0x19, 0x3f, 0x27, 0x1c, 0x1d, 0x1e, 0x1f, - 0x40, 0x00, 0x7f, 0x00, 0x00, 0x6c, 0x50, 0x7d, 0x4d, 0x5d, 0x5c, 0x4e, 0x6b, 0x60, 0x4b, 0x61, - 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8, 0xf9, 0x7a, 0x5e, 0x4c, 0x7e, 0x6e, 0x6f, - - 0x00, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, 0xc8, 0xc9, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, - 0xd7, 0xd8, 0xd9, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9, 0x00, 0x00, 0x00, 0x00, 0x6d, - 0x00, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, - 0x97, 0x98, 0x99, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7, 0xa8, 0xa9, 0x00, 0x00, 0x00, 0x00, 0x07, - - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 -}; - -/* Same as asciiFromEbcdic[] except maps all letters to lowercase. */ -static const uint8_t lowercaseAsciiFromEbcdic[256]={ - 0x00, 0x01, 0x02, 0x03, 0x00, 0x09, 0x00, 0x7f, 0x00, 0x00, 0x00, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, - 0x10, 0x11, 0x12, 0x13, 0x00, 0x0a, 0x08, 0x00, 0x18, 0x19, 0x00, 0x00, 0x1c, 0x1d, 0x1e, 0x1f, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x17, 0x1b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x06, 0x07, - 0x00, 0x00, 0x16, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x14, 0x15, 0x00, 0x1a, - - 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2e, 0x3c, 0x28, 0x2b, 0x7c, - 0x26, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x21, 0x24, 0x2a, 0x29, 0x3b, 0x5e, - 0x2d, 0x2f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2c, 0x25, 0x5f, 0x3e, 0x3f, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x3a, 0x23, 0x40, 0x27, 0x3d, 0x22, - - 0x00, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x7e, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7a, 0x00, 0x00, 0x00, 0x5b, 0x00, 0x00, - 0x5e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5b, 0x5d, 0x00, 0x5d, 0x00, 0x00, - - 0x7b, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x7d, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x7c, 0x00, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 -}; - -/* - * Bit sets indicating which characters of the ASCII repertoire - * (by ASCII/Unicode code) are "invariant". - * See utypes.h for more details. - * - * As invariant are considered the characters of the ASCII repertoire except - * for the following: - * 21 '!' - * 23 '#' - * 24 '$' - * - * 40 '@' - * - * 5b '[' - * 5c '\' - * 5d ']' - * 5e '^' - * - * 60 '`' - * - * 7b '{' - * 7c '|' - * 7d '}' - * 7e '~' - */ -static const uint32_t invariantChars[4]={ - 0xfffffbff, /* 00..1f but not 0a */ - 0xffffffe5, /* 20..3f but not 21 23 24 */ - 0x87fffffe, /* 40..5f but not 40 5b..5e */ - 0x87fffffe /* 60..7f but not 60 7b..7e */ -}; - -/* - * test unsigned types (or values known to be non-negative) for invariant characters, - * tests ASCII-family character values - */ -#define UCHAR_IS_INVARIANT(c) (((c)<=0x7f) && (invariantChars[(c)>>5]&((uint32_t)1<<((c)&0x1f)))!=0) - -/* test signed types for invariant characters, adds test for positive values */ -#define SCHAR_IS_INVARIANT(c) ((0<=(c)) && UCHAR_IS_INVARIANT(c)) - -#if U_CHARSET_FAMILY==U_ASCII_FAMILY -#define CHAR_TO_UCHAR(c) c -#define UCHAR_TO_CHAR(c) c -#elif U_CHARSET_FAMILY==U_EBCDIC_FAMILY -#define CHAR_TO_UCHAR(u) asciiFromEbcdic[u] -#define UCHAR_TO_CHAR(u) ebcdicFromAscii[u] -#else -# error U_CHARSET_FAMILY is not valid -#endif - - -U_CAPI void U_EXPORT2 -u_charsToUChars(const char *cs, UChar *us, int32_t length) { - UChar u; - uint8_t c; - - /* - * Allow the entire ASCII repertoire to be mapped _to_ Unicode. - * For EBCDIC systems, this works for characters with codes from - * codepages 37 and 1047 or compatible. - */ - while(length>0) { - c=(uint8_t)(*cs++); - u=(UChar)CHAR_TO_UCHAR(c); - U_ASSERT((u!=0 || c==0)); /* only invariant chars converted? */ - *us++=u; - --length; - } -} - -U_CAPI void U_EXPORT2 -u_UCharsToChars(const UChar *us, char *cs, int32_t length) { - UChar u; - - while(length>0) { - u=*us++; - if(!UCHAR_IS_INVARIANT(u)) { - U_ASSERT(FALSE); /* Variant characters were used. These are not portable in ICU. */ - u=0; - } - *cs++=(char)UCHAR_TO_CHAR(u); - --length; - } -} - -U_CAPI UBool U_EXPORT2 -uprv_isInvariantString(const char *s, int32_t length) { - uint8_t c; - - for(;;) { - if(length<0) { - /* NUL-terminated */ - c=(uint8_t)*s++; - if(c==0) { - break; - } - } else { - /* count length */ - if(length==0) { - break; - } - --length; - c=(uint8_t)*s++; - if(c==0) { - continue; /* NUL is invariant */ - } - } - /* c!=0 now, one branch below checks c==0 for variant characters */ - - /* - * no assertions here because these functions are legitimately called - * for strings with variant characters - */ -#if U_CHARSET_FAMILY==U_ASCII_FAMILY - if(!UCHAR_IS_INVARIANT(c)) { - return FALSE; /* found a variant char */ - } -#elif U_CHARSET_FAMILY==U_EBCDIC_FAMILY - c=CHAR_TO_UCHAR(c); - if(c==0 || !UCHAR_IS_INVARIANT(c)) { - return FALSE; /* found a variant char */ - } -#else -# error U_CHARSET_FAMILY is not valid -#endif - } - return TRUE; -} - -U_CAPI UBool U_EXPORT2 -uprv_isInvariantUString(const UChar *s, int32_t length) { - UChar c; - - for(;;) { - if(length<0) { - /* NUL-terminated */ - c=*s++; - if(c==0) { - break; - } - } else { - /* count length */ - if(length==0) { - break; - } - --length; - c=*s++; - } - - /* - * no assertions here because these functions are legitimately called - * for strings with variant characters - */ - if(!UCHAR_IS_INVARIANT(c)) { - return FALSE; /* found a variant char */ - } - } - return TRUE; -} - -/* UDataSwapFn implementations used in udataswp.c ------- */ - -/* convert ASCII to EBCDIC and verify that all characters are invariant */ -U_CAPI int32_t U_EXPORT2 -uprv_ebcdicFromAscii(const UDataSwapper *ds, - const void *inData, int32_t length, void *outData, - UErrorCode *pErrorCode) { - const uint8_t *s; - uint8_t *t; - uint8_t c; - - int32_t count; - - if(pErrorCode==NULL || U_FAILURE(*pErrorCode)) { - return 0; - } - if(ds==NULL || inData==NULL || length<0 || (length>0 && outData==NULL)) { - *pErrorCode=U_ILLEGAL_ARGUMENT_ERROR; - return 0; - } - - /* setup and swapping */ - s=(const uint8_t *)inData; - t=(uint8_t *)outData; - count=length; - while(count>0) { - c=*s++; - if(!UCHAR_IS_INVARIANT(c)) { - udata_printError(ds, "uprv_ebcdicFromAscii() string[%d] contains a variant character in position %d\n", - length, length-count); - *pErrorCode=U_INVALID_CHAR_FOUND; - return 0; - } - *t++=ebcdicFromAscii[c]; - --count; - } - - return length; -} - -/* this function only checks and copies ASCII strings without conversion */ -U_CFUNC int32_t -uprv_copyAscii(const UDataSwapper *ds, - const void *inData, int32_t length, void *outData, - UErrorCode *pErrorCode) { - const uint8_t *s; - uint8_t c; - - int32_t count; - - if(pErrorCode==NULL || U_FAILURE(*pErrorCode)) { - return 0; - } - if(ds==NULL || inData==NULL || length<0 || (length>0 && outData==NULL)) { - *pErrorCode=U_ILLEGAL_ARGUMENT_ERROR; - return 0; - } - - /* setup and checking */ - s=(const uint8_t *)inData; - count=length; - while(count>0) { - c=*s++; - if(!UCHAR_IS_INVARIANT(c)) { - udata_printError(ds, "uprv_copyFromAscii() string[%d] contains a variant character in position %d\n", - length, length-count); - *pErrorCode=U_INVALID_CHAR_FOUND; - return 0; - } - --count; - } - - if(length>0 && inData!=outData) { - uprv_memcpy(outData, inData, length); - } - - return length; -} - -/* convert EBCDIC to ASCII and verify that all characters are invariant */ -U_CFUNC int32_t -uprv_asciiFromEbcdic(const UDataSwapper *ds, - const void *inData, int32_t length, void *outData, - UErrorCode *pErrorCode) { - const uint8_t *s; - uint8_t *t; - uint8_t c; - - int32_t count; - - if(pErrorCode==NULL || U_FAILURE(*pErrorCode)) { - return 0; - } - if(ds==NULL || inData==NULL || length<0 || (length>0 && outData==NULL)) { - *pErrorCode=U_ILLEGAL_ARGUMENT_ERROR; - return 0; - } - - /* setup and swapping */ - s=(const uint8_t *)inData; - t=(uint8_t *)outData; - count=length; - while(count>0) { - c=*s++; - if(c!=0 && ((c=asciiFromEbcdic[c])==0 || !UCHAR_IS_INVARIANT(c))) { - udata_printError(ds, "uprv_asciiFromEbcdic() string[%d] contains a variant character in position %d\n", - length, length-count); - *pErrorCode=U_INVALID_CHAR_FOUND; - return 0; - } - *t++=c; - --count; - } - - return length; -} - -/* this function only checks and copies EBCDIC strings without conversion */ -U_CFUNC int32_t -uprv_copyEbcdic(const UDataSwapper *ds, - const void *inData, int32_t length, void *outData, - UErrorCode *pErrorCode) { - const uint8_t *s; - uint8_t c; - - int32_t count; - - if(pErrorCode==NULL || U_FAILURE(*pErrorCode)) { - return 0; - } - if(ds==NULL || inData==NULL || length<0 || (length>0 && outData==NULL)) { - *pErrorCode=U_ILLEGAL_ARGUMENT_ERROR; - return 0; - } - - /* setup and checking */ - s=(const uint8_t *)inData; - count=length; - while(count>0) { - c=*s++; - if(c!=0 && ((c=asciiFromEbcdic[c])==0 || !UCHAR_IS_INVARIANT(c))) { - udata_printError(ds, "uprv_copyEbcdic() string[%] contains a variant character in position %d\n", - length, length-count); - *pErrorCode=U_INVALID_CHAR_FOUND; - return 0; - } - --count; - } - - if(length>0 && inData!=outData) { - uprv_memcpy(outData, inData, length); - } - - return length; -} - -/* compare invariant strings; variant characters compare less than others and unlike each other */ -U_CFUNC int32_t -uprv_compareInvAscii(const UDataSwapper *ds, - const char *outString, int32_t outLength, - const UChar *localString, int32_t localLength) { - int32_t minLength; - UChar32 c1, c2; - uint8_t c; - - if(outString==NULL || outLength<-1 || localString==NULL || localLength<-1) { - return 0; - } - - if(outLength<0) { - outLength=(int32_t)uprv_strlen(outString); - } - if(localLength<0) { - localLength=u_strlen(localString); - } - - minLength= outLength0) { - c=(uint8_t)*outString++; - if(UCHAR_IS_INVARIANT(c)) { - c1=c; - } else { - c1=-1; - } - - c2=*localString++; - if(!UCHAR_IS_INVARIANT(c2)) { - c2=-2; - } - - if((c1-=c2)!=0) { - return c1; - } - - --minLength; - } - - /* strings start with same prefix, compare lengths */ - return outLength-localLength; -} - -U_CFUNC int32_t -uprv_compareInvEbcdic(const UDataSwapper *ds, - const char *outString, int32_t outLength, - const UChar *localString, int32_t localLength) { - int32_t minLength; - UChar32 c1, c2; - uint8_t c; - - if(outString==NULL || outLength<-1 || localString==NULL || localLength<-1) { - return 0; - } - - if(outLength<0) { - outLength=(int32_t)uprv_strlen(outString); - } - if(localLength<0) { - localLength=u_strlen(localString); - } - - minLength= outLength0) { - c=(uint8_t)*outString++; - if(c==0) { - c1=0; - } else if((c1=asciiFromEbcdic[c])!=0 && UCHAR_IS_INVARIANT(c1)) { - /* c1 is set */ - } else { - c1=-1; - } - - c2=*localString++; - if(!UCHAR_IS_INVARIANT(c2)) { - c2=-2; - } - - if((c1-=c2)!=0) { - return c1; - } - - --minLength; - } - - /* strings start with same prefix, compare lengths */ - return outLength-localLength; -} - -U_CAPI int32_t U_EXPORT2 -uprv_compareInvEbcdicAsAscii(const char *s1, const char *s2) { - int32_t c1, c2; - - for(;; ++s1, ++s2) { - c1=(uint8_t)*s1; - c2=(uint8_t)*s2; - if(c1!=c2) { - if(c1!=0 && ((c1=asciiFromEbcdic[c1])==0 || !UCHAR_IS_INVARIANT(c1))) { - c1=-(int32_t)(uint8_t)*s1; - } - if(c2!=0 && ((c2=asciiFromEbcdic[c2])==0 || !UCHAR_IS_INVARIANT(c2))) { - c2=-(int32_t)(uint8_t)*s2; - } - return c1-c2; - } else if(c1==0) { - return 0; - } - } -} - -U_CAPI char U_EXPORT2 -uprv_ebcdicToLowercaseAscii(char c) { - return (char)lowercaseAsciiFromEbcdic[(uint8_t)c]; -} - -U_INTERNAL uint8_t* U_EXPORT2 -uprv_aestrncpy(uint8_t *dst, const uint8_t *src, int32_t n) -{ - uint8_t *orig_dst = dst; - - if(n==-1) { - n = uprv_strlen((const char*)src)+1; /* copy NUL */ - } - /* copy non-null */ - while(*src && n>0) { - *(dst++) = asciiFromEbcdic[*(src++)]; - n--; - } - /* pad */ - while(n>0) { - *(dst++) = 0; - n--; - } - return orig_dst; -} - -U_INTERNAL uint8_t* U_EXPORT2 -uprv_eastrncpy(uint8_t *dst, const uint8_t *src, int32_t n) -{ - uint8_t *orig_dst = dst; - - if(n==-1) { - n = uprv_strlen((const char*)src)+1; /* copy NUL */ - } - /* copy non-null */ - while(*src && n>0) { - char ch = ebcdicFromAscii[*(src++)]; - if(ch == 0) { - ch = ebcdicFromAscii[0x3f]; /* questionmark (subchar) */ - } - *(dst++) = ch; - n--; - } - /* pad */ - while(n>0) { - *(dst++) = 0; - n--; - } - return orig_dst; -} - diff --git a/Build/source/libs/icu/icu-src/source/common/uinvchar.cpp b/Build/source/libs/icu/icu-src/source/common/uinvchar.cpp new file mode 100644 index 00000000000..a0fd9dfbb1c --- /dev/null +++ b/Build/source/libs/icu/icu-src/source/common/uinvchar.cpp @@ -0,0 +1,615 @@ +// © 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html +/* +******************************************************************************* +* +* Copyright (C) 1999-2010, International Business Machines +* Corporation and others. All Rights Reserved. +* +******************************************************************************* +* file name: uinvchar.c +* encoding: UTF-8 +* tab size: 8 (not used) +* indentation:2 +* +* created on: 2004sep14 +* created by: Markus W. Scherer +* +* Functions for handling invariant characters, moved here from putil.c +* for better modularization. +*/ + +#include "unicode/utypes.h" +#include "unicode/ustring.h" +#include "udataswp.h" +#include "cstring.h" +#include "cmemory.h" +#include "uassert.h" +#include "uinvchar.h" + +/* invariant-character handling --------------------------------------------- */ + +/* + * These maps for ASCII to/from EBCDIC map invariant characters (see utypes.h) + * appropriately for most EBCDIC codepages. + * + * They currently also map most other ASCII graphic characters, + * appropriately for codepages 37 and 1047. + * Exceptions: The characters for []^ have different codes in 37 & 1047. + * Both versions are mapped to ASCII. + * + * ASCII 37 1047 + * [ 5B BA AD + * ] 5D BB BD + * ^ 5E B0 5F + * + * There are no mappings for variant characters from Unicode to EBCDIC. + * + * Currently, C0 control codes are also included in these maps. + * Exceptions: S/390 Open Edition swaps LF and NEL codes compared with other + * EBCDIC platforms; both codes (15 and 25) are mapped to ASCII LF (0A), + * but there is no mapping for ASCII LF back to EBCDIC. + * + * ASCII EBCDIC S/390-OE + * LF 0A 25 15 + * NEL 85 15 25 + * + * The maps below explicitly exclude the variant + * control and graphical characters that are in ASCII-based + * codepages at 0x80 and above. + * "No mapping" is expressed by mapping to a 00 byte. + * + * These tables do not establish a converter or a codepage. + */ + +static const uint8_t asciiFromEbcdic[256]={ + 0x00, 0x01, 0x02, 0x03, 0x00, 0x09, 0x00, 0x7f, 0x00, 0x00, 0x00, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, + 0x10, 0x11, 0x12, 0x13, 0x00, 0x0a, 0x08, 0x00, 0x18, 0x19, 0x00, 0x00, 0x1c, 0x1d, 0x1e, 0x1f, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x17, 0x1b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x06, 0x07, + 0x00, 0x00, 0x16, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x14, 0x15, 0x00, 0x1a, + + 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2e, 0x3c, 0x28, 0x2b, 0x7c, + 0x26, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x21, 0x24, 0x2a, 0x29, 0x3b, 0x5e, + 0x2d, 0x2f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2c, 0x25, 0x5f, 0x3e, 0x3f, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x3a, 0x23, 0x40, 0x27, 0x3d, 0x22, + + 0x00, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x7e, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7a, 0x00, 0x00, 0x00, 0x5b, 0x00, 0x00, + 0x5e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5b, 0x5d, 0x00, 0x5d, 0x00, 0x00, + + 0x7b, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x7d, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f, 0x50, 0x51, 0x52, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x5c, 0x00, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 +}; + +static const uint8_t ebcdicFromAscii[256]={ + 0x00, 0x01, 0x02, 0x03, 0x37, 0x2d, 0x2e, 0x2f, 0x16, 0x05, 0x00, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, + 0x10, 0x11, 0x12, 0x13, 0x3c, 0x3d, 0x32, 0x26, 0x18, 0x19, 0x3f, 0x27, 0x1c, 0x1d, 0x1e, 0x1f, + 0x40, 0x00, 0x7f, 0x00, 0x00, 0x6c, 0x50, 0x7d, 0x4d, 0x5d, 0x5c, 0x4e, 0x6b, 0x60, 0x4b, 0x61, + 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8, 0xf9, 0x7a, 0x5e, 0x4c, 0x7e, 0x6e, 0x6f, + + 0x00, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, 0xc8, 0xc9, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, + 0xd7, 0xd8, 0xd9, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9, 0x00, 0x00, 0x00, 0x00, 0x6d, + 0x00, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, + 0x97, 0x98, 0x99, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7, 0xa8, 0xa9, 0x00, 0x00, 0x00, 0x00, 0x07, + + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 +}; + +/* Same as asciiFromEbcdic[] except maps all letters to lowercase. */ +static const uint8_t lowercaseAsciiFromEbcdic[256]={ + 0x00, 0x01, 0x02, 0x03, 0x00, 0x09, 0x00, 0x7f, 0x00, 0x00, 0x00, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, + 0x10, 0x11, 0x12, 0x13, 0x00, 0x0a, 0x08, 0x00, 0x18, 0x19, 0x00, 0x00, 0x1c, 0x1d, 0x1e, 0x1f, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x17, 0x1b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x06, 0x07, + 0x00, 0x00, 0x16, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x14, 0x15, 0x00, 0x1a, + + 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2e, 0x3c, 0x28, 0x2b, 0x7c, + 0x26, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x21, 0x24, 0x2a, 0x29, 0x3b, 0x5e, + 0x2d, 0x2f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2c, 0x25, 0x5f, 0x3e, 0x3f, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x3a, 0x23, 0x40, 0x27, 0x3d, 0x22, + + 0x00, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x7e, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7a, 0x00, 0x00, 0x00, 0x5b, 0x00, 0x00, + 0x5e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5b, 0x5d, 0x00, 0x5d, 0x00, 0x00, + + 0x7b, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x7d, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x7c, 0x00, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 +}; + +/* + * Bit sets indicating which characters of the ASCII repertoire + * (by ASCII/Unicode code) are "invariant". + * See utypes.h for more details. + * + * As invariant are considered the characters of the ASCII repertoire except + * for the following: + * 21 '!' + * 23 '#' + * 24 '$' + * + * 40 '@' + * + * 5b '[' + * 5c '\' + * 5d ']' + * 5e '^' + * + * 60 '`' + * + * 7b '{' + * 7c '|' + * 7d '}' + * 7e '~' + */ +static const uint32_t invariantChars[4]={ + 0xfffffbff, /* 00..1f but not 0a */ + 0xffffffe5, /* 20..3f but not 21 23 24 */ + 0x87fffffe, /* 40..5f but not 40 5b..5e */ + 0x87fffffe /* 60..7f but not 60 7b..7e */ +}; + +/* + * test unsigned types (or values known to be non-negative) for invariant characters, + * tests ASCII-family character values + */ +#define UCHAR_IS_INVARIANT(c) (((c)<=0x7f) && (invariantChars[(c)>>5]&((uint32_t)1<<((c)&0x1f)))!=0) + +/* test signed types for invariant characters, adds test for positive values */ +#define SCHAR_IS_INVARIANT(c) ((0<=(c)) && UCHAR_IS_INVARIANT(c)) + +#if U_CHARSET_FAMILY==U_ASCII_FAMILY +#define CHAR_TO_UCHAR(c) c +#define UCHAR_TO_CHAR(c) c +#elif U_CHARSET_FAMILY==U_EBCDIC_FAMILY +#define CHAR_TO_UCHAR(u) asciiFromEbcdic[u] +#define UCHAR_TO_CHAR(u) ebcdicFromAscii[u] +#else +# error U_CHARSET_FAMILY is not valid +#endif + + +U_CAPI void U_EXPORT2 +u_charsToUChars(const char *cs, UChar *us, int32_t length) { + UChar u; + uint8_t c; + + /* + * Allow the entire ASCII repertoire to be mapped _to_ Unicode. + * For EBCDIC systems, this works for characters with codes from + * codepages 37 and 1047 or compatible. + */ + while(length>0) { + c=(uint8_t)(*cs++); + u=(UChar)CHAR_TO_UCHAR(c); + U_ASSERT((u!=0 || c==0)); /* only invariant chars converted? */ + *us++=u; + --length; + } +} + +U_CAPI void U_EXPORT2 +u_UCharsToChars(const UChar *us, char *cs, int32_t length) { + UChar u; + + while(length>0) { + u=*us++; + if(!UCHAR_IS_INVARIANT(u)) { + U_ASSERT(FALSE); /* Variant characters were used. These are not portable in ICU. */ + u=0; + } + *cs++=(char)UCHAR_TO_CHAR(u); + --length; + } +} + +U_CAPI UBool U_EXPORT2 +uprv_isInvariantString(const char *s, int32_t length) { + uint8_t c; + + for(;;) { + if(length<0) { + /* NUL-terminated */ + c=(uint8_t)*s++; + if(c==0) { + break; + } + } else { + /* count length */ + if(length==0) { + break; + } + --length; + c=(uint8_t)*s++; + if(c==0) { + continue; /* NUL is invariant */ + } + } + /* c!=0 now, one branch below checks c==0 for variant characters */ + + /* + * no assertions here because these functions are legitimately called + * for strings with variant characters + */ +#if U_CHARSET_FAMILY==U_ASCII_FAMILY + if(!UCHAR_IS_INVARIANT(c)) { + return FALSE; /* found a variant char */ + } +#elif U_CHARSET_FAMILY==U_EBCDIC_FAMILY + c=CHAR_TO_UCHAR(c); + if(c==0 || !UCHAR_IS_INVARIANT(c)) { + return FALSE; /* found a variant char */ + } +#else +# error U_CHARSET_FAMILY is not valid +#endif + } + return TRUE; +} + +U_CAPI UBool U_EXPORT2 +uprv_isInvariantUString(const UChar *s, int32_t length) { + UChar c; + + for(;;) { + if(length<0) { + /* NUL-terminated */ + c=*s++; + if(c==0) { + break; + } + } else { + /* count length */ + if(length==0) { + break; + } + --length; + c=*s++; + } + + /* + * no assertions here because these functions are legitimately called + * for strings with variant characters + */ + if(!UCHAR_IS_INVARIANT(c)) { + return FALSE; /* found a variant char */ + } + } + return TRUE; +} + +/* UDataSwapFn implementations used in udataswp.c ------- */ + +/* convert ASCII to EBCDIC and verify that all characters are invariant */ +U_CAPI int32_t U_EXPORT2 +uprv_ebcdicFromAscii(const UDataSwapper *ds, + const void *inData, int32_t length, void *outData, + UErrorCode *pErrorCode) { + const uint8_t *s; + uint8_t *t; + uint8_t c; + + int32_t count; + + if(pErrorCode==NULL || U_FAILURE(*pErrorCode)) { + return 0; + } + if(ds==NULL || inData==NULL || length<0 || (length>0 && outData==NULL)) { + *pErrorCode=U_ILLEGAL_ARGUMENT_ERROR; + return 0; + } + + /* setup and swapping */ + s=(const uint8_t *)inData; + t=(uint8_t *)outData; + count=length; + while(count>0) { + c=*s++; + if(!UCHAR_IS_INVARIANT(c)) { + udata_printError(ds, "uprv_ebcdicFromAscii() string[%d] contains a variant character in position %d\n", + length, length-count); + *pErrorCode=U_INVALID_CHAR_FOUND; + return 0; + } + *t++=ebcdicFromAscii[c]; + --count; + } + + return length; +} + +/* this function only checks and copies ASCII strings without conversion */ +U_CFUNC int32_t +uprv_copyAscii(const UDataSwapper *ds, + const void *inData, int32_t length, void *outData, + UErrorCode *pErrorCode) { + const uint8_t *s; + uint8_t c; + + int32_t count; + + if(pErrorCode==NULL || U_FAILURE(*pErrorCode)) { + return 0; + } + if(ds==NULL || inData==NULL || length<0 || (length>0 && outData==NULL)) { + *pErrorCode=U_ILLEGAL_ARGUMENT_ERROR; + return 0; + } + + /* setup and checking */ + s=(const uint8_t *)inData; + count=length; + while(count>0) { + c=*s++; + if(!UCHAR_IS_INVARIANT(c)) { + udata_printError(ds, "uprv_copyFromAscii() string[%d] contains a variant character in position %d\n", + length, length-count); + *pErrorCode=U_INVALID_CHAR_FOUND; + return 0; + } + --count; + } + + if(length>0 && inData!=outData) { + uprv_memcpy(outData, inData, length); + } + + return length; +} + +/* convert EBCDIC to ASCII and verify that all characters are invariant */ +U_CFUNC int32_t +uprv_asciiFromEbcdic(const UDataSwapper *ds, + const void *inData, int32_t length, void *outData, + UErrorCode *pErrorCode) { + const uint8_t *s; + uint8_t *t; + uint8_t c; + + int32_t count; + + if(pErrorCode==NULL || U_FAILURE(*pErrorCode)) { + return 0; + } + if(ds==NULL || inData==NULL || length<0 || (length>0 && outData==NULL)) { + *pErrorCode=U_ILLEGAL_ARGUMENT_ERROR; + return 0; + } + + /* setup and swapping */ + s=(const uint8_t *)inData; + t=(uint8_t *)outData; + count=length; + while(count>0) { + c=*s++; + if(c!=0 && ((c=asciiFromEbcdic[c])==0 || !UCHAR_IS_INVARIANT(c))) { + udata_printError(ds, "uprv_asciiFromEbcdic() string[%d] contains a variant character in position %d\n", + length, length-count); + *pErrorCode=U_INVALID_CHAR_FOUND; + return 0; + } + *t++=c; + --count; + } + + return length; +} + +/* this function only checks and copies EBCDIC strings without conversion */ +U_CFUNC int32_t +uprv_copyEbcdic(const UDataSwapper *ds, + const void *inData, int32_t length, void *outData, + UErrorCode *pErrorCode) { + const uint8_t *s; + uint8_t c; + + int32_t count; + + if(pErrorCode==NULL || U_FAILURE(*pErrorCode)) { + return 0; + } + if(ds==NULL || inData==NULL || length<0 || (length>0 && outData==NULL)) { + *pErrorCode=U_ILLEGAL_ARGUMENT_ERROR; + return 0; + } + + /* setup and checking */ + s=(const uint8_t *)inData; + count=length; + while(count>0) { + c=*s++; + if(c!=0 && ((c=asciiFromEbcdic[c])==0 || !UCHAR_IS_INVARIANT(c))) { + udata_printError(ds, "uprv_copyEbcdic() string[%] contains a variant character in position %d\n", + length, length-count); + *pErrorCode=U_INVALID_CHAR_FOUND; + return 0; + } + --count; + } + + if(length>0 && inData!=outData) { + uprv_memcpy(outData, inData, length); + } + + return length; +} + +/* compare invariant strings; variant characters compare less than others and unlike each other */ +U_CFUNC int32_t +uprv_compareInvAscii(const UDataSwapper *ds, + const char *outString, int32_t outLength, + const UChar *localString, int32_t localLength) { + (void)ds; + int32_t minLength; + UChar32 c1, c2; + uint8_t c; + + if(outString==NULL || outLength<-1 || localString==NULL || localLength<-1) { + return 0; + } + + if(outLength<0) { + outLength=(int32_t)uprv_strlen(outString); + } + if(localLength<0) { + localLength=u_strlen(localString); + } + + minLength= outLength0) { + c=(uint8_t)*outString++; + if(UCHAR_IS_INVARIANT(c)) { + c1=c; + } else { + c1=-1; + } + + c2=*localString++; + if(!UCHAR_IS_INVARIANT(c2)) { + c2=-2; + } + + if((c1-=c2)!=0) { + return c1; + } + + --minLength; + } + + /* strings start with same prefix, compare lengths */ + return outLength-localLength; +} + +U_CFUNC int32_t +uprv_compareInvEbcdic(const UDataSwapper *ds, + const char *outString, int32_t outLength, + const UChar *localString, int32_t localLength) { + (void)ds; + int32_t minLength; + UChar32 c1, c2; + uint8_t c; + + if(outString==NULL || outLength<-1 || localString==NULL || localLength<-1) { + return 0; + } + + if(outLength<0) { + outLength=(int32_t)uprv_strlen(outString); + } + if(localLength<0) { + localLength=u_strlen(localString); + } + + minLength= outLength0) { + c=(uint8_t)*outString++; + if(c==0) { + c1=0; + } else if((c1=asciiFromEbcdic[c])!=0 && UCHAR_IS_INVARIANT(c1)) { + /* c1 is set */ + } else { + c1=-1; + } + + c2=*localString++; + if(!UCHAR_IS_INVARIANT(c2)) { + c2=-2; + } + + if((c1-=c2)!=0) { + return c1; + } + + --minLength; + } + + /* strings start with same prefix, compare lengths */ + return outLength-localLength; +} + +U_CAPI int32_t U_EXPORT2 +uprv_compareInvEbcdicAsAscii(const char *s1, const char *s2) { + int32_t c1, c2; + + for(;; ++s1, ++s2) { + c1=(uint8_t)*s1; + c2=(uint8_t)*s2; + if(c1!=c2) { + if(c1!=0 && ((c1=asciiFromEbcdic[c1])==0 || !UCHAR_IS_INVARIANT(c1))) { + c1=-(int32_t)(uint8_t)*s1; + } + if(c2!=0 && ((c2=asciiFromEbcdic[c2])==0 || !UCHAR_IS_INVARIANT(c2))) { + c2=-(int32_t)(uint8_t)*s2; + } + return c1-c2; + } else if(c1==0) { + return 0; + } + } +} + +U_CAPI char U_EXPORT2 +uprv_ebcdicToLowercaseAscii(char c) { + return (char)lowercaseAsciiFromEbcdic[(uint8_t)c]; +} + +U_INTERNAL uint8_t* U_EXPORT2 +uprv_aestrncpy(uint8_t *dst, const uint8_t *src, int32_t n) +{ + uint8_t *orig_dst = dst; + + if(n==-1) { + n = static_cast(uprv_strlen((const char*)src)+1); /* copy NUL */ + } + /* copy non-null */ + while(*src && n>0) { + *(dst++) = asciiFromEbcdic[*(src++)]; + n--; + } + /* pad */ + while(n>0) { + *(dst++) = 0; + n--; + } + return orig_dst; +} + +U_INTERNAL uint8_t* U_EXPORT2 +uprv_eastrncpy(uint8_t *dst, const uint8_t *src, int32_t n) +{ + uint8_t *orig_dst = dst; + + if(n==-1) { + n = static_cast(uprv_strlen((const char*)src)+1); /* copy NUL */ + } + /* copy non-null */ + while(*src && n>0) { + char ch = ebcdicFromAscii[*(src++)]; + if(ch == 0) { + ch = ebcdicFromAscii[0x3f]; /* questionmark (subchar) */ + } + *(dst++) = ch; + n--; + } + /* pad */ + while(n>0) { + *(dst++) = 0; + n--; + } + return orig_dst; +} + diff --git a/Build/source/libs/icu/icu-src/source/common/uinvchar.h b/Build/source/libs/icu/icu-src/source/common/uinvchar.h index 19a3b2696e7..c4f9f88b9ad 100644 --- a/Build/source/libs/icu/icu-src/source/common/uinvchar.h +++ b/Build/source/libs/icu/icu-src/source/common/uinvchar.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* @@ -8,7 +8,7 @@ * ******************************************************************************* * file name: uinvchar.h -* encoding: US-ASCII +* encoding: UTF-8 * tab size: 8 (not used) * indentation:2 * @@ -64,7 +64,7 @@ uprv_isInvariantUString(const UChar *s, int32_t length); */ U_INTERNAL inline UBool U_EXPORT2 uprv_isInvariantUnicodeString(const icu::UnicodeString &s) { - return uprv_isInvariantUString(s.getBuffer(), s.length()); + return uprv_isInvariantUString(icu::toUCharPtr(s.getBuffer()), s.length()); } #endif /* __cplusplus */ diff --git a/Build/source/libs/icu/icu-src/source/common/uiter.cpp b/Build/source/libs/icu/icu-src/source/common/uiter.cpp index 26ca877814d..b9252d81c2d 100644 --- a/Build/source/libs/icu/icu-src/source/common/uiter.cpp +++ b/Build/source/libs/icu/icu-src/source/common/uiter.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* @@ -8,7 +8,7 @@ * ******************************************************************************* * file name: uiter.cpp -* encoding: US-ASCII +* encoding: UTF-8 * tab size: 8 (not used) * indentation:4 * diff --git a/Build/source/libs/icu/icu-src/source/common/ulist.c b/Build/source/libs/icu/icu-src/source/common/ulist.c deleted file mode 100644 index 7f7fdd9ca47..00000000000 --- a/Build/source/libs/icu/icu-src/source/common/ulist.c +++ /dev/null @@ -1,275 +0,0 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. -// License & terms of use: http://www.unicode.org/copyright.html -/* -****************************************************************************** -* Copyright (C) 2009-2016, International Business Machines -* Corporation and others. All Rights Reserved. -****************************************************************************** -*/ - -#include "ulist.h" -#include "cmemory.h" -#include "cstring.h" -#include "uenumimp.h" - -typedef struct UListNode UListNode; -struct UListNode { - void *data; - - UListNode *next; - UListNode *previous; - - /* When data is created with uprv_malloc, needs to be freed during deleteList function. */ - UBool forceDelete; -}; - -struct UList { - UListNode *curr; - UListNode *head; - UListNode *tail; - - int32_t size; - int32_t currentIndex; -}; - -static void ulist_addFirstItem(UList *list, UListNode *newItem); - -U_CAPI UList *U_EXPORT2 ulist_createEmptyList(UErrorCode *status) { - UList *newList = NULL; - - if (U_FAILURE(*status)) { - return NULL; - } - - newList = (UList *)uprv_malloc(sizeof(UList)); - if (newList == NULL) { - *status = U_MEMORY_ALLOCATION_ERROR; - return NULL; - } - - newList->curr = NULL; - newList->head = NULL; - newList->tail = NULL; - newList->size = 0; - newList->currentIndex = -1; - - return newList; -} - -/* - * Function called by addItemEndList or addItemBeginList when the first item is added to the list. - * This function properly sets the pointers for the first item added. - */ -static void ulist_addFirstItem(UList *list, UListNode *newItem) { - newItem->next = NULL; - newItem->previous = NULL; - list->head = newItem; - list->tail = newItem; -} - -static void ulist_removeItem(UList *list, UListNode *p) { - if (p->previous == NULL) { - // p is the list head. - list->head = p->next; - } else { - p->previous->next = p->next; - } - if (p->next == NULL) { - // p is the list tail. - list->tail = p->previous; - } else { - p->next->previous = p->previous; - } - list->curr = NULL; - list->currentIndex = 0; - --list->size; - if (p->forceDelete) { - uprv_free(p->data); - } - uprv_free(p); -} - -U_CAPI void U_EXPORT2 ulist_addItemEndList(UList *list, const void *data, UBool forceDelete, UErrorCode *status) { - UListNode *newItem = NULL; - - if (U_FAILURE(*status) || list == NULL || data == NULL) { - if (forceDelete) { - uprv_free((void *)data); - } - return; - } - - newItem = (UListNode *)uprv_malloc(sizeof(UListNode)); - if (newItem == NULL) { - if (forceDelete) { - uprv_free((void *)data); - } - *status = U_MEMORY_ALLOCATION_ERROR; - return; - } - newItem->data = (void *)(data); - newItem->forceDelete = forceDelete; - - if (list->size == 0) { - ulist_addFirstItem(list, newItem); - } else { - newItem->next = NULL; - newItem->previous = list->tail; - list->tail->next = newItem; - list->tail = newItem; - } - - list->size++; -} - -U_CAPI void U_EXPORT2 ulist_addItemBeginList(UList *list, const void *data, UBool forceDelete, UErrorCode *status) { - UListNode *newItem = NULL; - - if (U_FAILURE(*status) || list == NULL || data == NULL) { - if (forceDelete) { - uprv_free((void *)data); - } - return; - } - - newItem = (UListNode *)uprv_malloc(sizeof(UListNode)); - if (newItem == NULL) { - if (forceDelete) { - uprv_free((void *)data); - } - *status = U_MEMORY_ALLOCATION_ERROR; - return; - } - newItem->data = (void *)(data); - newItem->forceDelete = forceDelete; - - if (list->size == 0) { - ulist_addFirstItem(list, newItem); - } else { - newItem->previous = NULL; - newItem->next = list->head; - list->head->previous = newItem; - list->head = newItem; - list->currentIndex++; - } - - list->size++; -} - -U_CAPI UBool U_EXPORT2 ulist_containsString(const UList *list, const char *data, int32_t length) { - if (list != NULL) { - const UListNode *pointer; - for (pointer = list->head; pointer != NULL; pointer = pointer->next) { - if (length == uprv_strlen(pointer->data)) { - if (uprv_memcmp(data, pointer->data, length) == 0) { - return TRUE; - } - } - } - } - return FALSE; -} - -U_CAPI UBool U_EXPORT2 ulist_removeString(UList *list, const char *data) { - if (list != NULL) { - UListNode *pointer; - for (pointer = list->head; pointer != NULL; pointer = pointer->next) { - if (uprv_strcmp(data, pointer->data) == 0) { - ulist_removeItem(list, pointer); - // Remove only the first occurrence, like Java LinkedList.remove(Object). - return TRUE; - } - } - } - return FALSE; -} - -U_CAPI void *U_EXPORT2 ulist_getNext(UList *list) { - UListNode *curr = NULL; - - if (list == NULL || list->curr == NULL) { - return NULL; - } - - curr = list->curr; - list->curr = curr->next; - list->currentIndex++; - - return curr->data; -} - -U_CAPI int32_t U_EXPORT2 ulist_getListSize(const UList *list) { - if (list != NULL) { - return list->size; - } - - return -1; -} - -U_CAPI void U_EXPORT2 ulist_resetList(UList *list) { - if (list != NULL) { - list->curr = list->head; - list->currentIndex = 0; - } -} - -U_CAPI void U_EXPORT2 ulist_deleteList(UList *list) { - UListNode *listHead = NULL; - - if (list != NULL) { - listHead = list->head; - while (listHead != NULL) { - UListNode *listPointer = listHead->next; - - if (listHead->forceDelete) { - uprv_free(listHead->data); - } - - uprv_free(listHead); - listHead = listPointer; - } - uprv_free(list); - list = NULL; - } -} - -U_CAPI void U_EXPORT2 ulist_close_keyword_values_iterator(UEnumeration *en) { - if (en != NULL) { - ulist_deleteList((UList *)(en->context)); - uprv_free(en); - } -} - -U_CAPI int32_t U_EXPORT2 ulist_count_keyword_values(UEnumeration *en, UErrorCode *status) { - if (U_FAILURE(*status)) { - return -1; - } - - return ulist_getListSize((UList *)(en->context)); -} - -U_CAPI const char * U_EXPORT2 ulist_next_keyword_value(UEnumeration *en, int32_t *resultLength, UErrorCode *status) { - const char *s; - if (U_FAILURE(*status)) { - return NULL; - } - - s = (const char *)ulist_getNext((UList *)(en->context)); - if (s != NULL && resultLength != NULL) { - *resultLength = uprv_strlen(s); - } - return s; -} - -U_CAPI void U_EXPORT2 ulist_reset_keyword_values_iterator(UEnumeration *en, UErrorCode *status) { - if (U_FAILURE(*status)) { - return ; - } - - ulist_resetList((UList *)(en->context)); -} - -U_CAPI UList * U_EXPORT2 ulist_getListFromEnum(UEnumeration *en) { - return (UList *)(en->context); -} - diff --git a/Build/source/libs/icu/icu-src/source/common/ulist.cpp b/Build/source/libs/icu/icu-src/source/common/ulist.cpp new file mode 100644 index 00000000000..c5180431c31 --- /dev/null +++ b/Build/source/libs/icu/icu-src/source/common/ulist.cpp @@ -0,0 +1,270 @@ +// © 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html +/* +****************************************************************************** +* Copyright (C) 2009-2016, International Business Machines +* Corporation and others. All Rights Reserved. +****************************************************************************** +*/ + +#include "ulist.h" +#include "cmemory.h" +#include "cstring.h" +#include "uenumimp.h" + +typedef struct UListNode UListNode; +struct UListNode { + void *data; + + UListNode *next; + UListNode *previous; + + /* When data is created with uprv_malloc, needs to be freed during deleteList function. */ + UBool forceDelete; +}; + +struct UList { + UListNode *curr; + UListNode *head; + UListNode *tail; + + int32_t size; +}; + +static void ulist_addFirstItem(UList *list, UListNode *newItem); + +U_CAPI UList *U_EXPORT2 ulist_createEmptyList(UErrorCode *status) { + UList *newList = NULL; + + if (U_FAILURE(*status)) { + return NULL; + } + + newList = (UList *)uprv_malloc(sizeof(UList)); + if (newList == NULL) { + *status = U_MEMORY_ALLOCATION_ERROR; + return NULL; + } + + newList->curr = NULL; + newList->head = NULL; + newList->tail = NULL; + newList->size = 0; + + return newList; +} + +/* + * Function called by addItemEndList or addItemBeginList when the first item is added to the list. + * This function properly sets the pointers for the first item added. + */ +static void ulist_addFirstItem(UList *list, UListNode *newItem) { + newItem->next = NULL; + newItem->previous = NULL; + list->head = newItem; + list->tail = newItem; +} + +static void ulist_removeItem(UList *list, UListNode *p) { + if (p->previous == NULL) { + // p is the list head. + list->head = p->next; + } else { + p->previous->next = p->next; + } + if (p->next == NULL) { + // p is the list tail. + list->tail = p->previous; + } else { + p->next->previous = p->previous; + } + if (p == list->curr) { + list->curr = p->next; + } + --list->size; + if (p->forceDelete) { + uprv_free(p->data); + } + uprv_free(p); +} + +U_CAPI void U_EXPORT2 ulist_addItemEndList(UList *list, const void *data, UBool forceDelete, UErrorCode *status) { + UListNode *newItem = NULL; + + if (U_FAILURE(*status) || list == NULL || data == NULL) { + if (forceDelete) { + uprv_free((void *)data); + } + return; + } + + newItem = (UListNode *)uprv_malloc(sizeof(UListNode)); + if (newItem == NULL) { + if (forceDelete) { + uprv_free((void *)data); + } + *status = U_MEMORY_ALLOCATION_ERROR; + return; + } + newItem->data = (void *)(data); + newItem->forceDelete = forceDelete; + + if (list->size == 0) { + ulist_addFirstItem(list, newItem); + } else { + newItem->next = NULL; + newItem->previous = list->tail; + list->tail->next = newItem; + list->tail = newItem; + } + + list->size++; +} + +U_CAPI void U_EXPORT2 ulist_addItemBeginList(UList *list, const void *data, UBool forceDelete, UErrorCode *status) { + UListNode *newItem = NULL; + + if (U_FAILURE(*status) || list == NULL || data == NULL) { + if (forceDelete) { + uprv_free((void *)data); + } + return; + } + + newItem = (UListNode *)uprv_malloc(sizeof(UListNode)); + if (newItem == NULL) { + if (forceDelete) { + uprv_free((void *)data); + } + *status = U_MEMORY_ALLOCATION_ERROR; + return; + } + newItem->data = (void *)(data); + newItem->forceDelete = forceDelete; + + if (list->size == 0) { + ulist_addFirstItem(list, newItem); + } else { + newItem->previous = NULL; + newItem->next = list->head; + list->head->previous = newItem; + list->head = newItem; + } + + list->size++; +} + +U_CAPI UBool U_EXPORT2 ulist_containsString(const UList *list, const char *data, int32_t length) { + if (list != NULL) { + const UListNode *pointer; + for (pointer = list->head; pointer != NULL; pointer = pointer->next) { + if (length == (int32_t)uprv_strlen((const char *)pointer->data)) { + if (uprv_memcmp(data, pointer->data, length) == 0) { + return TRUE; + } + } + } + } + return FALSE; +} + +U_CAPI UBool U_EXPORT2 ulist_removeString(UList *list, const char *data) { + if (list != NULL) { + UListNode *pointer; + for (pointer = list->head; pointer != NULL; pointer = pointer->next) { + if (uprv_strcmp(data, (const char *)pointer->data) == 0) { + ulist_removeItem(list, pointer); + // Remove only the first occurrence, like Java LinkedList.remove(Object). + return TRUE; + } + } + } + return FALSE; +} + +U_CAPI void *U_EXPORT2 ulist_getNext(UList *list) { + UListNode *curr = NULL; + + if (list == NULL || list->curr == NULL) { + return NULL; + } + + curr = list->curr; + list->curr = curr->next; + + return curr->data; +} + +U_CAPI int32_t U_EXPORT2 ulist_getListSize(const UList *list) { + if (list != NULL) { + return list->size; + } + + return -1; +} + +U_CAPI void U_EXPORT2 ulist_resetList(UList *list) { + if (list != NULL) { + list->curr = list->head; + } +} + +U_CAPI void U_EXPORT2 ulist_deleteList(UList *list) { + UListNode *listHead = NULL; + + if (list != NULL) { + listHead = list->head; + while (listHead != NULL) { + UListNode *listPointer = listHead->next; + + if (listHead->forceDelete) { + uprv_free(listHead->data); + } + + uprv_free(listHead); + listHead = listPointer; + } + uprv_free(list); + list = NULL; + } +} + +U_CAPI void U_EXPORT2 ulist_close_keyword_values_iterator(UEnumeration *en) { + if (en != NULL) { + ulist_deleteList((UList *)(en->context)); + uprv_free(en); + } +} + +U_CAPI int32_t U_EXPORT2 ulist_count_keyword_values(UEnumeration *en, UErrorCode *status) { + if (U_FAILURE(*status)) { + return -1; + } + + return ulist_getListSize((UList *)(en->context)); +} + +U_CAPI const char * U_EXPORT2 ulist_next_keyword_value(UEnumeration *en, int32_t *resultLength, UErrorCode *status) { + const char *s; + if (U_FAILURE(*status)) { + return NULL; + } + + s = (const char *)ulist_getNext((UList *)(en->context)); + if (s != NULL && resultLength != NULL) { + *resultLength = static_cast(uprv_strlen(s)); + } + return s; +} + +U_CAPI void U_EXPORT2 ulist_reset_keyword_values_iterator(UEnumeration *en, UErrorCode *status) { + if (U_FAILURE(*status)) { + return ; + } + + ulist_resetList((UList *)(en->context)); +} + +U_CAPI UList * U_EXPORT2 ulist_getListFromEnum(UEnumeration *en) { + return (UList *)(en->context); +} diff --git a/Build/source/libs/icu/icu-src/source/common/ulist.h b/Build/source/libs/icu/icu-src/source/common/ulist.h index 6f292bf9dca..de58a4ad02c 100644 --- a/Build/source/libs/icu/icu-src/source/common/ulist.h +++ b/Build/source/libs/icu/icu-src/source/common/ulist.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ****************************************************************************** diff --git a/Build/source/libs/icu/icu-src/source/common/ulistformatter.cpp b/Build/source/libs/icu/icu-src/source/common/ulistformatter.cpp index 98aa50e25fb..c140c784b52 100644 --- a/Build/source/libs/icu/icu-src/source/common/ulistformatter.cpp +++ b/Build/source/libs/icu/icu-src/source/common/ulistformatter.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ***************************************************************************************** diff --git a/Build/source/libs/icu/icu-src/source/common/uloc.cpp b/Build/source/libs/icu/icu-src/source/common/uloc.cpp index 2a02b27c5ba..7a1dc723cff 100644 --- a/Build/source/libs/icu/icu-src/source/common/uloc.cpp +++ b/Build/source/libs/icu/icu-src/source/common/uloc.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** @@ -44,10 +44,11 @@ #include "uarrsort.h" #include "uenumimp.h" #include "uassert.h" +#include "charstr.h" #include /* for sprintf */ -using namespace icu; +U_NAMESPACE_USE /* ### Declarations **************************************************/ @@ -97,18 +98,19 @@ locale_getKeywords(const char *localeID, */ /* Generated using org.unicode.cldr.icu.GenerateISO639LanguageTables */ /* ISO639 table version is 20150505 */ +/* Subsequent hand addition of selected languages */ static const char * const LANGUAGES[] = { "aa", "ab", "ace", "ach", "ada", "ady", "ae", "aeb", "af", "afh", "agq", "ain", "ak", "akk", "akz", "ale", "aln", "alt", "am", "an", "ang", "anp", "ar", "arc", - "arn", "aro", "arp", "arq", "arw", "ary", "arz", "as", + "arn", "aro", "arp", "arq", "ars", "arw", "ary", "arz", "as", "asa", "ase", "ast", "av", "avk", "awa", "ay", "az", "ba", "bal", "ban", "bar", "bas", "bax", "bbc", "bbj", "be", "bej", "bem", "bew", "bez", "bfd", "bfq", "bg", "bgn", "bho", "bi", "bik", "bin", "bjn", "bkm", "bla", "bm", "bn", "bo", "bpy", "bqi", "br", "bra", "brh", "brx", "bs", "bss", "bua", "bug", "bum", "byn", "byv", - "ca", "cad", "car", "cay", "cch", "ce", "ceb", "cgg", + "ca", "cad", "car", "cay", "cch", "ccp", "ce", "ceb", "cgg", "ch", "chb", "chg", "chk", "chm", "chn", "cho", "chp", "chr", "chy", "ckb", "co", "cop", "cps", "cr", "crh", "cs", "csb", "cu", "cv", "cy", @@ -212,18 +214,19 @@ static const char* const REPLACEMENT_LANGUAGES[]={ */ /* Generated using org.unicode.cldr.icu.GenerateISO639LanguageTables */ /* ISO639 table version is 20150505 */ +/* Subsequent hand addition of selected languages */ static const char * const LANGUAGES_3[] = { "aar", "abk", "ace", "ach", "ada", "ady", "ave", "aeb", "afr", "afh", "agq", "ain", "aka", "akk", "akz", "ale", "aln", "alt", "amh", "arg", "ang", "anp", "ara", "arc", - "arn", "aro", "arp", "arq", "arw", "ary", "arz", "asm", + "arn", "aro", "arp", "arq", "ars", "arw", "ary", "arz", "asm", "asa", "ase", "ast", "ava", "avk", "awa", "aym", "aze", "bak", "bal", "ban", "bar", "bas", "bax", "bbc", "bbj", "bel", "bej", "bem", "bew", "bez", "bfd", "bfq", "bul", "bgn", "bho", "bis", "bik", "bin", "bjn", "bkm", "bla", "bam", "ben", "bod", "bpy", "bqi", "bre", "bra", "brh", "brx", "bos", "bss", "bua", "bug", "bum", "byn", "byv", - "cat", "cad", "car", "cay", "cch", "che", "ceb", "cgg", + "cat", "cad", "car", "cay", "cch", "ccp", "che", "ceb", "cgg", "cha", "chb", "chg", "chk", "chm", "chn", "cho", "chp", "chr", "chy", "ckb", "cos", "cop", "cps", "cre", "crh", "ces", "csb", "chu", "chv", "cym", @@ -528,14 +531,16 @@ static const VariantMap VARIANT_MAP[] = { #define _hasBCP47Extension(id) (id && uprv_strstr(id, "@") == NULL && getShortestSubtagLength(localeID) == 1) /* Converts the BCP47 id to Unicode id. Does nothing to id if conversion fails */ #define _ConvertBCP47(finalID, id, buffer, length,err) \ - if (uloc_forLanguageTag(id, buffer, length, NULL, err) <= 0 || U_FAILURE(*err)) { \ + if (uloc_forLanguageTag(id, buffer, length, NULL, err) <= 0 || \ + U_FAILURE(*err) || *err == U_STRING_NOT_TERMINATED_WARNING) { \ finalID=id; \ + if (*err == U_STRING_NOT_TERMINATED_WARNING) { *err = U_BUFFER_OVERFLOW_ERROR; } \ } else { \ finalID=buffer; \ } /* Gets the size of the shortest subtag in the given localeID. */ static int32_t getShortestSubtagLength(const char *localeID) { - int32_t localeIDLength = uprv_strlen(localeID); + int32_t localeIDLength = static_cast(uprv_strlen(localeID)); int32_t length = localeIDLength; int32_t tmpLength = 0; int32_t i; @@ -560,6 +565,10 @@ static int32_t getShortestSubtagLength(const char *localeID) { } /* ### Keywords **************************************************/ +#define UPRV_ISDIGIT(c) (((c) >= '0') && ((c) <= '9')) +#define UPRV_ISALPHANUM(c) (uprv_isASCIILetter(c) || UPRV_ISDIGIT(c) ) +/* Punctuation/symbols allowed in legacy key values */ +#define UPRV_OK_VALUE_PUNCTUATION(c) ((c) == '_' || (c) == '-' || (c) == '+' || (c) == '/') #define ULOC_KEYWORD_BUFFER_LEN 25 #define ULOC_MAX_NO_KEYWORDS 25 @@ -596,20 +605,26 @@ locale_getKeywordsStart(const char *localeID) { */ static int32_t locale_canonKeywordName(char *buf, const char *keywordName, UErrorCode *status) { - int32_t i; - int32_t keywordNameLen = (int32_t)uprv_strlen(keywordName); + int32_t keywordNameLen = 0; - if(keywordNameLen >= ULOC_KEYWORD_BUFFER_LEN) { - /* keyword name too long for internal buffer */ - *status = U_INTERNAL_PROGRAM_ERROR; - return 0; + for (; *keywordName != 0; keywordName++) { + if (!UPRV_ISALPHANUM(*keywordName)) { + *status = U_ILLEGAL_ARGUMENT_ERROR; /* malformed keyword name */ + return 0; + } + if (keywordNameLen < ULOC_KEYWORD_BUFFER_LEN - 1) { + buf[keywordNameLen++] = uprv_tolower(*keywordName); + } else { + /* keyword name too long for internal buffer */ + *status = U_INTERNAL_PROGRAM_ERROR; + return 0; + } } - - /* normalize the keyword name */ - for(i = 0; i < keywordNameLen; i++) { - buf[i] = uprv_tolower(keywordName[i]); + if (keywordNameLen == 0) { + *status = U_ILLEGAL_ARGUMENT_ERROR; /* empty keyword name */ + return 0; } - buf[i] = 0; + buf[keywordNameLen] = 0; /* terminate */ return keywordNameLen; } @@ -837,87 +852,108 @@ uloc_getKeywordValue(const char* localeID, const char* nextSeparator = NULL; char keywordNameBuffer[ULOC_KEYWORD_BUFFER_LEN]; char localeKeywordNameBuffer[ULOC_KEYWORD_BUFFER_LEN]; - int32_t i = 0; int32_t result = 0; if(status && U_SUCCESS(*status) && localeID) { char tempBuffer[ULOC_FULLNAME_CAPACITY]; const char* tmpLocaleID; + if (keywordName == NULL || keywordName[0] == 0) { + *status = U_ILLEGAL_ARGUMENT_ERROR; + return 0; + } + + locale_canonKeywordName(keywordNameBuffer, keywordName, status); + if(U_FAILURE(*status)) { + return 0; + } + if (_hasBCP47Extension(localeID)) { _ConvertBCP47(tmpLocaleID, localeID, tempBuffer, sizeof(tempBuffer), status); } else { tmpLocaleID=localeID; } - startSearchHere = uprv_strchr(tmpLocaleID, '@'); /* TODO: REVISIT: shouldn't this be locale_getKeywordsStart ? */ + startSearchHere = locale_getKeywordsStart(tmpLocaleID); if(startSearchHere == NULL) { /* no keywords, return at once */ return 0; } - locale_canonKeywordName(keywordNameBuffer, keywordName, status); - if(U_FAILURE(*status)) { - return 0; - } - /* find the first keyword */ while(startSearchHere) { - startSearchHere++; - /* skip leading spaces (allowed?) */ + const char* keyValueTail; + int32_t keyValueLen; + + startSearchHere++; /* skip @ or ; */ + nextSeparator = uprv_strchr(startSearchHere, '='); + if(!nextSeparator) { + *status = U_ILLEGAL_ARGUMENT_ERROR; /* key must have =value */ + return 0; + } + /* strip leading & trailing spaces (TC decided to tolerate these) */ while(*startSearchHere == ' ') { startSearchHere++; } - nextSeparator = uprv_strchr(startSearchHere, '='); - /* need to normalize both keyword and keyword name */ - if(!nextSeparator) { - break; + keyValueTail = nextSeparator; + while (keyValueTail > startSearchHere && *(keyValueTail-1) == ' ') { + keyValueTail--; + } + /* now keyValueTail points to first char after the keyName */ + /* copy & normalize keyName from locale */ + if (startSearchHere == keyValueTail) { + *status = U_ILLEGAL_ARGUMENT_ERROR; /* empty keyword name in passed-in locale */ + return 0; } - if(nextSeparator - startSearchHere >= ULOC_KEYWORD_BUFFER_LEN) { + keyValueLen = 0; + while (startSearchHere < keyValueTail) { + if (!UPRV_ISALPHANUM(*startSearchHere)) { + *status = U_ILLEGAL_ARGUMENT_ERROR; /* malformed keyword name */ + return 0; + } + if (keyValueLen < ULOC_KEYWORD_BUFFER_LEN - 1) { + localeKeywordNameBuffer[keyValueLen++] = uprv_tolower(*startSearchHere++); + } else { /* keyword name too long for internal buffer */ *status = U_INTERNAL_PROGRAM_ERROR; return 0; + } } - for(i = 0; i < nextSeparator - startSearchHere; i++) { - localeKeywordNameBuffer[i] = uprv_tolower(startSearchHere[i]); - } - /* trim trailing spaces */ - while(startSearchHere[i-1] == ' ') { - i--; - U_ASSERT(i>=0); - } - localeKeywordNameBuffer[i] = 0; + localeKeywordNameBuffer[keyValueLen] = 0; /* terminate */ startSearchHere = uprv_strchr(nextSeparator, ';'); if(uprv_strcmp(keywordNameBuffer, localeKeywordNameBuffer) == 0) { - nextSeparator++; + /* current entry matches the keyword. */ + nextSeparator++; /* skip '=' */ + /* First strip leading & trailing spaces (TC decided to tolerate these) */ while(*nextSeparator == ' ') { - nextSeparator++; + nextSeparator++; + } + keyValueTail = (startSearchHere)? startSearchHere: nextSeparator + uprv_strlen(nextSeparator); + while(keyValueTail > nextSeparator && *(keyValueTail-1) == ' ') { + keyValueTail--; + } + /* Now copy the value, but check well-formedness */ + if (nextSeparator == keyValueTail) { + *status = U_ILLEGAL_ARGUMENT_ERROR; /* empty key value name in passed-in locale */ + return 0; } - /* we actually found the keyword. Copy the value */ - if(startSearchHere && startSearchHere - nextSeparator < bufferCapacity) { - while(*(startSearchHere-1) == ' ') { - startSearchHere--; - } - uprv_strncpy(buffer, nextSeparator, startSearchHere - nextSeparator); - result = u_terminateChars(buffer, bufferCapacity, (int32_t)(startSearchHere - nextSeparator), status); - } else if(!startSearchHere && (int32_t)uprv_strlen(nextSeparator) < bufferCapacity) { /* last item in string */ - i = (int32_t)uprv_strlen(nextSeparator); - while(nextSeparator[i - 1] == ' ') { - i--; - } - uprv_strncpy(buffer, nextSeparator, i); - result = u_terminateChars(buffer, bufferCapacity, i, status); - } else { - /* give a bigger buffer, please */ - *status = U_BUFFER_OVERFLOW_ERROR; - if(startSearchHere) { - result = (int32_t)(startSearchHere - nextSeparator); - } else { - result = (int32_t)uprv_strlen(nextSeparator); - } + keyValueLen = 0; + while (nextSeparator < keyValueTail) { + if (!UPRV_ISALPHANUM(*nextSeparator) && !UPRV_OK_VALUE_PUNCTUATION(*nextSeparator)) { + *status = U_ILLEGAL_ARGUMENT_ERROR; /* malformed key value */ + return 0; + } + if (keyValueLen < bufferCapacity) { + /* Should we lowercase value to return here? Tests expect as-is. */ + buffer[keyValueLen++] = *nextSeparator++; + } else { /* keep advancing so we return correct length in case of overflow */ + keyValueLen++; + nextSeparator++; + } } + result = u_terminateChars(buffer, bufferCapacity, keyValueLen, status); return result; } } @@ -936,46 +972,59 @@ uloc_setKeywordValue(const char* keywordName, int32_t keywordValueLen; int32_t bufLen; int32_t needLen = 0; - int32_t foundValueLen; - int32_t keywordAtEnd = 0; /* is the keyword at the end of the string? */ char keywordNameBuffer[ULOC_KEYWORD_BUFFER_LEN]; + char keywordValueBuffer[ULOC_KEYWORDS_CAPACITY+1]; char localeKeywordNameBuffer[ULOC_KEYWORD_BUFFER_LEN]; - int32_t i = 0; int32_t rc; char* nextSeparator = NULL; char* nextEqualsign = NULL; char* startSearchHere = NULL; char* keywordStart = NULL; - char *insertHere = NULL; + CharString updatedKeysAndValues; + int32_t updatedKeysAndValuesLen; + UBool handledInputKeyAndValue = FALSE; + char keyValuePrefix = '@'; + if(U_FAILURE(*status)) { return -1; } - if(bufferCapacity>1) { - bufLen = (int32_t)uprv_strlen(buffer); - } else { + if (keywordName == NULL || keywordName[0] == 0 || bufferCapacity <= 1) { *status = U_ILLEGAL_ARGUMENT_ERROR; return 0; } + bufLen = (int32_t)uprv_strlen(buffer); if(bufferCapacity= ULOC_KEYWORD_BUFFER_LEN) { - /* keyword name too long for internal buffer */ - *status = U_INTERNAL_PROGRAM_ERROR; + /* now keyValueTail points to first char after the keyName */ + /* copy & normalize keyName from locale */ + if (keywordStart == keyValueTail) { + *status = U_ILLEGAL_ARGUMENT_ERROR; /* empty keyword name in passed-in locale */ return 0; } - for(i = 0; i < nextEqualsign - keywordStart; i++) { - localeKeywordNameBuffer[i] = uprv_tolower(keywordStart[i]); - } - /* trim trailing spaces */ - while(keywordStart[i-1] == ' ') { - i--; + keyValueLen = 0; + while (keywordStart < keyValueTail) { + if (!UPRV_ISALPHANUM(*keywordStart)) { + *status = U_ILLEGAL_ARGUMENT_ERROR; /* malformed keyword name */ + return 0; + } + if (keyValueLen < ULOC_KEYWORD_BUFFER_LEN - 1) { + localeKeywordNameBuffer[keyValueLen++] = uprv_tolower(*keywordStart++); + } else { + /* keyword name too long for internal buffer */ + *status = U_INTERNAL_PROGRAM_ERROR; + return 0; + } } - U_ASSERT(i>=0 && i nextEqualsign && *(keyValueTail-1) == ' ') { + keyValueTail--; + } + if (nextEqualsign == keyValueTail) { + *status = U_ILLEGAL_ARGUMENT_ERROR; /* empty key value in passed-in locale */ + return 0; + } + rc = uprv_strcmp(keywordNameBuffer, localeKeywordNameBuffer); if(rc == 0) { - nextEqualsign++; - while(*nextEqualsign == ' ') { - nextEqualsign++; - } - /* we actually found the keyword. Change the value */ - if (nextSeparator) { - keywordAtEnd = 0; - foundValueLen = (int32_t)(nextSeparator - nextEqualsign); - } else { - keywordAtEnd = 1; - foundValueLen = (int32_t)uprv_strlen(nextEqualsign); - } - if(keywordValue) { /* adding a value - not removing */ - if(foundValueLen == keywordValueLen) { - uprv_strncpy(nextEqualsign, keywordValue, keywordValueLen); - return bufLen; /* no change in size */ - } else if(foundValueLen > keywordValueLen) { - int32_t delta = foundValueLen - keywordValueLen; - if(nextSeparator) { /* RH side */ - uprv_memmove(nextSeparator - delta, nextSeparator, bufLen-(nextSeparator-buffer)); - } - uprv_strncpy(nextEqualsign, keywordValue, keywordValueLen); - bufLen -= delta; - buffer[bufLen]=0; - return bufLen; - } else { /* FVL < KVL */ - int32_t delta = keywordValueLen - foundValueLen; - if((bufLen+delta) >= bufferCapacity) { - *status = U_BUFFER_OVERFLOW_ERROR; - return bufLen+delta; - } - if(nextSeparator) { /* RH side */ - uprv_memmove(nextSeparator+delta,nextSeparator, bufLen-(nextSeparator-buffer)); - } - uprv_strncpy(nextEqualsign, keywordValue, keywordValueLen); - bufLen += delta; - buffer[bufLen]=0; - return bufLen; - } - } else { /* removing a keyword */ - if(keywordAtEnd) { - /* zero out the ';' or '@' just before startSearchhere */ - keywordStart[-1] = 0; - return (int32_t)((keywordStart-buffer)-1); /* (string length without keyword) minus separator */ - } else { - uprv_memmove(keywordStart, nextSeparator+1, bufLen-((nextSeparator+1)-buffer)); - keywordStart[bufLen-((nextSeparator+1)-buffer)]=0; - return (int32_t)(bufLen-((nextSeparator+1)-keywordStart)); - } + /* Current entry matches the input keyword. Update the entry */ + if(keywordValueLen > 0) { /* updating a value */ + updatedKeysAndValues.append(keyValuePrefix, *status); + keyValuePrefix = ';'; /* for any subsequent key-value pair */ + updatedKeysAndValues.append(keywordNameBuffer, keywordNameLen, *status); + updatedKeysAndValues.append('=', *status); + updatedKeysAndValues.append(keywordValueBuffer, keywordValueLen, *status); + } /* else removing this entry, don't emit anything */ + handledInputKeyAndValue = TRUE; + } else { + /* input keyword sorts earlier than current entry, add before current entry */ + if (rc < 0 && keywordValueLen > 0 && !handledInputKeyAndValue) { + /* insert new entry at this location */ + updatedKeysAndValues.append(keyValuePrefix, *status); + keyValuePrefix = ';'; /* for any subsequent key-value pair */ + updatedKeysAndValues.append(keywordNameBuffer, keywordNameLen, *status); + updatedKeysAndValues.append('=', *status); + updatedKeysAndValues.append(keywordValueBuffer, keywordValueLen, *status); + handledInputKeyAndValue = TRUE; } - } else if(rc<0){ /* end match keyword */ - /* could insert at this location. */ - insertHere = keywordStart; + /* copy the current entry */ + updatedKeysAndValues.append(keyValuePrefix, *status); + keyValuePrefix = ';'; /* for any subsequent key-value pair */ + updatedKeysAndValues.append(localeKeywordNameBuffer, keyValueLen, *status); + updatedKeysAndValues.append('=', *status); + updatedKeysAndValues.append(nextEqualsign, keyValueTail-nextEqualsign, *status); + } + if (!nextSeparator && keywordValueLen > 0 && !handledInputKeyAndValue) { + /* append new entry at the end, it sorts later than existing entries */ + updatedKeysAndValues.append(keyValuePrefix, *status); + /* skip keyValuePrefix update, no subsequent key-value pair */ + updatedKeysAndValues.append(keywordNameBuffer, keywordNameLen, *status); + updatedKeysAndValues.append('=', *status); + updatedKeysAndValues.append(keywordValueBuffer, keywordValueLen, *status); + handledInputKeyAndValue = TRUE; } keywordStart = nextSeparator; } /* end loop searching */ - if(!keywordValue) { - return bufLen; /* removal of non-extant keyword - no change */ - } - - /* we know there is at least one keyword. */ - needLen = bufLen+1+keywordNameLen+1+keywordValueLen; + /* Any error from updatedKeysAndValues.append above would be internal and not due to + * problems with the passed-in locale. So if we did encounter problems with the + * passed-in locale above, those errors took precedence and overrode any error + * status from updatedKeysAndValues.append, and also caused a return of 0. If there + * are errors here they are from updatedKeysAndValues.append; they do cause an + * error return but the passed-in locale is unmodified and the original bufLen is + * returned. + */ + if (!handledInputKeyAndValue || U_FAILURE(*status)) { + /* if input key/value specified removal of a keyword not present in locale, or + * there was an error in CharString.append, leave original locale alone. */ + return bufLen; + } + + updatedKeysAndValuesLen = updatedKeysAndValues.length(); + /* needLen = length of the part before '@' + length of updated key-value part including '@' */ + needLen = (int32_t)(startSearchHere - buffer) + updatedKeysAndValuesLen; if(needLen >= bufferCapacity) { *status = U_BUFFER_OVERFLOW_ERROR; return needLen; /* no change */ } - - if(insertHere) { - uprv_memmove(insertHere+(1+keywordNameLen+1+keywordValueLen), insertHere, bufLen-(insertHere-buffer)); - keywordStart = insertHere; - } else { - keywordStart = buffer+bufLen; - *keywordStart = ';'; - keywordStart++; - } - uprv_strncpy(keywordStart, keywordNameBuffer, keywordNameLen); - keywordStart += keywordNameLen; - *keywordStart = '='; - keywordStart++; - uprv_strncpy(keywordStart, keywordValue, keywordValueLen); /* terminates. */ - keywordStart+=keywordValueLen; - if(insertHere) { - *keywordStart = ';'; - keywordStart++; + if (updatedKeysAndValuesLen > 0) { + uprv_strncpy(startSearchHere, updatedKeysAndValues.data(), updatedKeysAndValuesLen); } buffer[needLen]=0; return needLen; @@ -2119,6 +2172,20 @@ uloc_getLCID(const char* localeID) { UErrorCode status = U_ZERO_ERROR; char langID[ULOC_FULLNAME_CAPACITY]; + uint32_t lcid = 0; + + /* Check for incomplete id. */ + if (!localeID || uprv_strlen(localeID) < 2) { + return 0; + } + + // Attempt platform lookup if available + lcid = uprv_convertToLCIDPlatform(localeID); + if (lcid > 0) + { + // Windows found an LCID, return that + return lcid; + } uloc_getLanguage(localeID, langID, sizeof(langID), &status); if (U_FAILURE(status)) { @@ -2423,7 +2490,7 @@ uloc_acceptLanguage(char *result, int32_t resultAvailable, #if defined(ULOC_DEBUG) fprintf(stderr,"%02d: %s\n", i, acceptList[i]); #endif - while((l=uenum_next(availableLocales, NULL, status))) { + while((l=uenum_next(availableLocales, NULL, status)) != NULL) { #if defined(ULOC_DEBUG) fprintf(stderr," %s\n", l); #endif @@ -2463,7 +2530,7 @@ uloc_acceptLanguage(char *result, int32_t resultAvailable, #if defined(ULOC_DEBUG) fprintf(stderr,"Try: [%s]", fallbackList[i]); #endif - while((l=uenum_next(availableLocales, NULL, status))) { + while((l=uenum_next(availableLocales, NULL, status)) != NULL) { #if defined(ULOC_DEBUG) fprintf(stderr," %s\n", l); #endif @@ -2529,9 +2596,6 @@ uloc_toUnicodeLocaleType(const char* keyword, const char* value) return bcpType; } -#define UPRV_ISDIGIT(c) (((c) >= '0') && ((c) <= '9')) -#define UPRV_ISALPHANUM(c) (uprv_isASCIILetter(c) || UPRV_ISDIGIT(c) ) - static UBool isWellFormedLegacyKey(const char* legacyKey) { @@ -2574,11 +2638,10 @@ uloc_toLegacyKey(const char* keyword) // Checks if the specified locale key is well-formed with the legacy locale syntax. // // Note: - // Neither ICU nor LDML/CLDR provides the definition of keyword syntax. - // However, a key should not contain '=' obviously. For now, all existing - // keys are using ASCII alphabetic letters only. We won't add any new key - // that is not compatible with the BCP 47 syntax. Therefore, we assume - // a valid key consist from [0-9a-zA-Z], no symbols. + // LDML/CLDR provides some definition of keyword syntax in + // * http://www.unicode.org/reports/tr35/#Unicode_locale_identifier and + // * http://www.unicode.org/reports/tr35/#Old_Locale_Extension_Syntax + // Keys can only consist of [0-9a-zA-Z]. if (isWellFormedLegacyKey(keyword)) { return keyword; } @@ -2594,12 +2657,11 @@ uloc_toLegacyType(const char* keyword, const char* value) // Checks if the specified locale type is well-formed with the legacy locale syntax. // // Note: - // Neither ICU nor LDML/CLDR provides the definition of keyword syntax. - // However, a type should not contain '=' obviously. For now, all existing - // types are using ASCII alphabetic letters with a few symbol letters. We won't - // add any new type that is not compatible with the BCP 47 syntax except timezone - // IDs. For now, we assume a valid type start with [0-9a-zA-Z], but may contain - // '-' '_' '/' in the middle. + // LDML/CLDR provides some definition of keyword syntax in + // * http://www.unicode.org/reports/tr35/#Unicode_locale_identifier and + // * http://www.unicode.org/reports/tr35/#Old_Locale_Extension_Syntax + // Values (types) can only consist of [0-9a-zA-Z], plus for legacy values + // we allow [/_-+] in the middle (e.g. "Etc/GMT+1", "Asia/Tel_Aviv") if (isWellFormedLegacyType(value)) { return value; } diff --git a/Build/source/libs/icu/icu-src/source/common/uloc_keytype.cpp b/Build/source/libs/icu/icu-src/source/common/uloc_keytype.cpp index fcb066c0dd7..4eea504bc26 100644 --- a/Build/source/libs/icu/icu-src/source/common/uloc_keytype.cpp +++ b/Build/source/libs/icu/icu-src/source/common/uloc_keytype.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** diff --git a/Build/source/libs/icu/icu-src/source/common/uloc_tag.c b/Build/source/libs/icu/icu-src/source/common/uloc_tag.c deleted file mode 100644 index 224470ad89c..00000000000 --- a/Build/source/libs/icu/icu-src/source/common/uloc_tag.c +++ /dev/null @@ -1,2531 +0,0 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. -// License & terms of use: http://www.unicode.org/copyright.html -/* -********************************************************************** -* Copyright (C) 2009-2015, International Business Machines -* Corporation and others. All Rights Reserved. -********************************************************************** -*/ - -#include "unicode/utypes.h" -#include "unicode/ures.h" -#include "unicode/putil.h" -#include "unicode/uloc.h" -#include "ustr_imp.h" -#include "cmemory.h" -#include "cstring.h" -#include "putilimp.h" -#include "uinvchar.h" -#include "ulocimp.h" -#include "uassert.h" - - -/* struct holding a single variant */ -typedef struct VariantListEntry { - const char *variant; - struct VariantListEntry *next; -} VariantListEntry; - -/* struct holding a single attribute value */ -typedef struct AttributeListEntry { - const char *attribute; - struct AttributeListEntry *next; -} AttributeListEntry; - -/* struct holding a single extension */ -typedef struct ExtensionListEntry { - const char *key; - const char *value; - struct ExtensionListEntry *next; -} ExtensionListEntry; - -#define MAXEXTLANG 3 -typedef struct ULanguageTag { - char *buf; /* holding parsed subtags */ - const char *language; - const char *extlang[MAXEXTLANG]; - const char *script; - const char *region; - VariantListEntry *variants; - ExtensionListEntry *extensions; - const char *privateuse; - const char *grandfathered; -} ULanguageTag; - -#define MINLEN 2 -#define SEP '-' -#define PRIVATEUSE 'x' -#define LDMLEXT 'u' - -#define LOCALE_SEP '_' -#define LOCALE_EXT_SEP '@' -#define LOCALE_KEYWORD_SEP ';' -#define LOCALE_KEY_TYPE_SEP '=' - -#define ISALPHA(c) uprv_isASCIILetter(c) -#define ISNUMERIC(c) ((c)>='0' && (c)<='9') - -static const char EMPTY[] = ""; -static const char LANG_UND[] = "und"; -static const char PRIVATEUSE_KEY[] = "x"; -static const char _POSIX[] = "_POSIX"; -static const char POSIX_KEY[] = "va"; -static const char POSIX_VALUE[] = "posix"; -static const char LOCALE_ATTRIBUTE_KEY[] = "attribute"; -static const char PRIVUSE_VARIANT_PREFIX[] = "lvariant"; -static const char LOCALE_TYPE_YES[] = "yes"; - -#define LANG_UND_LEN 3 - -static const char* const GRANDFATHERED[] = { -/* grandfathered preferred */ - "art-lojban", "jbo", - "cel-gaulish", "xtg-x-cel-gaulish", - "en-GB-oed", "en-GB-x-oed", - "i-ami", "ami", - "i-bnn", "bnn", - "i-default", "en-x-i-default", - "i-enochian", "und-x-i-enochian", - "i-hak", "hak", - "i-klingon", "tlh", - "i-lux", "lb", - "i-mingo", "see-x-i-mingo", - "i-navajo", "nv", - "i-pwn", "pwn", - "i-tao", "tao", - "i-tay", "tay", - "i-tsu", "tsu", - "no-bok", "nb", - "no-nyn", "nn", - "sgn-be-fr", "sfb", - "sgn-be-nl", "vgt", - "sgn-ch-de", "sgg", - "zh-guoyu", "cmn", - "zh-hakka", "hak", - "zh-min", "nan-x-zh-min", - "zh-min-nan", "nan", - "zh-xiang", "hsn", - NULL, NULL -}; - -static const char DEPRECATEDLANGS[][4] = { -/* deprecated new */ - "iw", "he", - "ji", "yi", - "in", "id" -}; - -/* -* ------------------------------------------------- -* -* These ultag_ functions may be exposed as APIs later -* -* ------------------------------------------------- -*/ - -static ULanguageTag* -ultag_parse(const char* tag, int32_t tagLen, int32_t* parsedLen, UErrorCode* status); - -static void -ultag_close(ULanguageTag* langtag); - -static const char* -ultag_getLanguage(const ULanguageTag* langtag); - -#if 0 -static const char* -ultag_getJDKLanguage(const ULanguageTag* langtag); -#endif - -static const char* -ultag_getExtlang(const ULanguageTag* langtag, int32_t idx); - -static int32_t -ultag_getExtlangSize(const ULanguageTag* langtag); - -static const char* -ultag_getScript(const ULanguageTag* langtag); - -static const char* -ultag_getRegion(const ULanguageTag* langtag); - -static const char* -ultag_getVariant(const ULanguageTag* langtag, int32_t idx); - -static int32_t -ultag_getVariantsSize(const ULanguageTag* langtag); - -static const char* -ultag_getExtensionKey(const ULanguageTag* langtag, int32_t idx); - -static const char* -ultag_getExtensionValue(const ULanguageTag* langtag, int32_t idx); - -static int32_t -ultag_getExtensionsSize(const ULanguageTag* langtag); - -static const char* -ultag_getPrivateUse(const ULanguageTag* langtag); - -#if 0 -static const char* -ultag_getGrandfathered(const ULanguageTag* langtag); -#endif - -/* -* ------------------------------------------------- -* -* Language subtag syntax validation functions -* -* ------------------------------------------------- -*/ - -static UBool -_isAlphaString(const char* s, int32_t len) { - int32_t i; - for (i = 0; i < len; i++) { - if (!ISALPHA(*(s + i))) { - return FALSE; - } - } - return TRUE; -} - -static UBool -_isNumericString(const char* s, int32_t len) { - int32_t i; - for (i = 0; i < len; i++) { - if (!ISNUMERIC(*(s + i))) { - return FALSE; - } - } - return TRUE; -} - -static UBool -_isAlphaNumericString(const char* s, int32_t len) { - int32_t i; - for (i = 0; i < len; i++) { - if (!ISALPHA(*(s + i)) && !ISNUMERIC(*(s + i))) { - return FALSE; - } - } - return TRUE; -} - -static UBool -_isLanguageSubtag(const char* s, int32_t len) { - /* - * language = 2*3ALPHA ; shortest ISO 639 code - * ["-" extlang] ; sometimes followed by - * ; extended language subtags - * / 4ALPHA ; or reserved for future use - * / 5*8ALPHA ; or registered language subtag - */ - if (len < 0) { - len = (int32_t)uprv_strlen(s); - } - if (len >= 2 && len <= 8 && _isAlphaString(s, len)) { - return TRUE; - } - return FALSE; -} - -static UBool -_isExtlangSubtag(const char* s, int32_t len) { - /* - * extlang = 3ALPHA ; selected ISO 639 codes - * *2("-" 3ALPHA) ; permanently reserved - */ - if (len < 0) { - len = (int32_t)uprv_strlen(s); - } - if (len == 3 && _isAlphaString(s, len)) { - return TRUE; - } - return FALSE; -} - -static UBool -_isScriptSubtag(const char* s, int32_t len) { - /* - * script = 4ALPHA ; ISO 15924 code - */ - if (len < 0) { - len = (int32_t)uprv_strlen(s); - } - if (len == 4 && _isAlphaString(s, len)) { - return TRUE; - } - return FALSE; -} - -static UBool -_isRegionSubtag(const char* s, int32_t len) { - /* - * region = 2ALPHA ; ISO 3166-1 code - * / 3DIGIT ; UN M.49 code - */ - if (len < 0) { - len = (int32_t)uprv_strlen(s); - } - if (len == 2 && _isAlphaString(s, len)) { - return TRUE; - } - if (len == 3 && _isNumericString(s, len)) { - return TRUE; - } - return FALSE; -} - -static UBool -_isVariantSubtag(const char* s, int32_t len) { - /* - * variant = 5*8alphanum ; registered variants - * / (DIGIT 3alphanum) - */ - if (len < 0) { - len = (int32_t)uprv_strlen(s); - } - if (len >= 5 && len <= 8 && _isAlphaNumericString(s, len)) { - return TRUE; - } - if (len == 4 && ISNUMERIC(*s) && _isAlphaNumericString(s + 1, 3)) { - return TRUE; - } - return FALSE; -} - -static UBool -_isPrivateuseVariantSubtag(const char* s, int32_t len) { - /* - * variant = 1*8alphanum ; registered variants - * / (DIGIT 3alphanum) - */ - if (len < 0) { - len = (int32_t)uprv_strlen(s); - } - if (len >= 1 && len <= 8 && _isAlphaNumericString(s, len)) { - return TRUE; - } - return FALSE; -} - -static UBool -_isExtensionSingleton(const char* s, int32_t len) { - /* - * extension = singleton 1*("-" (2*8alphanum)) - */ - if (len < 0) { - len = (int32_t)uprv_strlen(s); - } - if (len == 1 && ISALPHA(*s) && (uprv_tolower(*s) != PRIVATEUSE)) { - return TRUE; - } - return FALSE; -} - -static UBool -_isExtensionSubtag(const char* s, int32_t len) { - /* - * extension = singleton 1*("-" (2*8alphanum)) - */ - if (len < 0) { - len = (int32_t)uprv_strlen(s); - } - if (len >= 2 && len <= 8 && _isAlphaNumericString(s, len)) { - return TRUE; - } - return FALSE; -} - -static UBool -_isExtensionSubtags(const char* s, int32_t len) { - const char *p = s; - const char *pSubtag = NULL; - - if (len < 0) { - len = (int32_t)uprv_strlen(s); - } - - while ((p - s) < len) { - if (*p == SEP) { - if (pSubtag == NULL) { - return FALSE; - } - if (!_isExtensionSubtag(pSubtag, (int32_t)(p - pSubtag))) { - return FALSE; - } - pSubtag = NULL; - } else if (pSubtag == NULL) { - pSubtag = p; - } - p++; - } - if (pSubtag == NULL) { - return FALSE; - } - return _isExtensionSubtag(pSubtag, (int32_t)(p - pSubtag)); -} - -static UBool -_isPrivateuseValueSubtag(const char* s, int32_t len) { - /* - * privateuse = "x" 1*("-" (1*8alphanum)) - */ - if (len < 0) { - len = (int32_t)uprv_strlen(s); - } - if (len >= 1 && len <= 8 && _isAlphaNumericString(s, len)) { - return TRUE; - } - return FALSE; -} - -static UBool -_isPrivateuseValueSubtags(const char* s, int32_t len) { - const char *p = s; - const char *pSubtag = NULL; - - if (len < 0) { - len = (int32_t)uprv_strlen(s); - } - - while ((p - s) < len) { - if (*p == SEP) { - if (pSubtag == NULL) { - return FALSE; - } - if (!_isPrivateuseValueSubtag(pSubtag, (int32_t)(p - pSubtag))) { - return FALSE; - } - pSubtag = NULL; - } else if (pSubtag == NULL) { - pSubtag = p; - } - p++; - } - if (pSubtag == NULL) { - return FALSE; - } - return _isPrivateuseValueSubtag(pSubtag, (int32_t)(p - pSubtag)); -} - -U_CFUNC UBool -ultag_isUnicodeLocaleKey(const char* s, int32_t len) { - if (len < 0) { - len = (int32_t)uprv_strlen(s); - } - if (len == 2 && _isAlphaNumericString(s, len)) { - return TRUE; - } - return FALSE; -} - -U_CFUNC UBool -ultag_isUnicodeLocaleType(const char*s, int32_t len) { - const char* p; - int32_t subtagLen = 0; - - if (len < 0) { - len = (int32_t)uprv_strlen(s); - } - - for (p = s; len > 0; p++, len--) { - if (*p == SEP) { - if (subtagLen < 3) { - return FALSE; - } - subtagLen = 0; - } else if (ISALPHA(*p) || ISNUMERIC(*p)) { - subtagLen++; - if (subtagLen > 8) { - return FALSE; - } - } else { - return FALSE; - } - } - - return (subtagLen >= 3); -} -/* -* ------------------------------------------------- -* -* Helper functions -* -* ------------------------------------------------- -*/ - -static UBool -_addVariantToList(VariantListEntry **first, VariantListEntry *var) { - UBool bAdded = TRUE; - - if (*first == NULL) { - var->next = NULL; - *first = var; - } else { - VariantListEntry *prev, *cur; - int32_t cmp; - - /* variants order should be preserved */ - prev = NULL; - cur = *first; - while (TRUE) { - if (cur == NULL) { - prev->next = var; - var->next = NULL; - break; - } - - /* Checking for duplicate variant */ - cmp = uprv_compareInvCharsAsAscii(var->variant, cur->variant); - if (cmp == 0) { - /* duplicated variant */ - bAdded = FALSE; - break; - } - prev = cur; - cur = cur->next; - } - } - - return bAdded; -} - -static UBool -_addAttributeToList(AttributeListEntry **first, AttributeListEntry *attr) { - UBool bAdded = TRUE; - - if (*first == NULL) { - attr->next = NULL; - *first = attr; - } else { - AttributeListEntry *prev, *cur; - int32_t cmp; - - /* reorder variants in alphabetical order */ - prev = NULL; - cur = *first; - while (TRUE) { - if (cur == NULL) { - prev->next = attr; - attr->next = NULL; - break; - } - cmp = uprv_compareInvCharsAsAscii(attr->attribute, cur->attribute); - if (cmp < 0) { - if (prev == NULL) { - *first = attr; - } else { - prev->next = attr; - } - attr->next = cur; - break; - } - if (cmp == 0) { - /* duplicated variant */ - bAdded = FALSE; - break; - } - prev = cur; - cur = cur->next; - } - } - - return bAdded; -} - - -static UBool -_addExtensionToList(ExtensionListEntry **first, ExtensionListEntry *ext, UBool localeToBCP) { - UBool bAdded = TRUE; - - if (*first == NULL) { - ext->next = NULL; - *first = ext; - } else { - ExtensionListEntry *prev, *cur; - int32_t cmp; - - /* reorder variants in alphabetical order */ - prev = NULL; - cur = *first; - while (TRUE) { - if (cur == NULL) { - prev->next = ext; - ext->next = NULL; - break; - } - if (localeToBCP) { - /* special handling for locale to bcp conversion */ - int32_t len, curlen; - - len = (int32_t)uprv_strlen(ext->key); - curlen = (int32_t)uprv_strlen(cur->key); - - if (len == 1 && curlen == 1) { - if (*(ext->key) == *(cur->key)) { - cmp = 0; - } else if (*(ext->key) == PRIVATEUSE) { - cmp = 1; - } else if (*(cur->key) == PRIVATEUSE) { - cmp = -1; - } else { - cmp = *(ext->key) - *(cur->key); - } - } else if (len == 1) { - cmp = *(ext->key) - LDMLEXT; - } else if (curlen == 1) { - cmp = LDMLEXT - *(cur->key); - } else { - cmp = uprv_compareInvCharsAsAscii(ext->key, cur->key); - /* Both are u extension keys - we need special handling for 'attribute' */ - if (cmp != 0) { - if (uprv_strcmp(cur->key, LOCALE_ATTRIBUTE_KEY) == 0) { - cmp = 1; - } else if (uprv_strcmp(ext->key, LOCALE_ATTRIBUTE_KEY) == 0) { - cmp = -1; - } - } - } - } else { - cmp = uprv_compareInvCharsAsAscii(ext->key, cur->key); - } - if (cmp < 0) { - if (prev == NULL) { - *first = ext; - } else { - prev->next = ext; - } - ext->next = cur; - break; - } - if (cmp == 0) { - /* duplicated extension key */ - bAdded = FALSE; - break; - } - prev = cur; - cur = cur->next; - } - } - - return bAdded; -} - -static void -_initializeULanguageTag(ULanguageTag* langtag) { - int32_t i; - - langtag->buf = NULL; - - langtag->language = EMPTY; - for (i = 0; i < MAXEXTLANG; i++) { - langtag->extlang[i] = NULL; - } - - langtag->script = EMPTY; - langtag->region = EMPTY; - - langtag->variants = NULL; - langtag->extensions = NULL; - - langtag->grandfathered = EMPTY; - langtag->privateuse = EMPTY; -} - -static int32_t -_appendLanguageToLanguageTag(const char* localeID, char* appendAt, int32_t capacity, UBool strict, UErrorCode* status) { - char buf[ULOC_LANG_CAPACITY]; - UErrorCode tmpStatus = U_ZERO_ERROR; - int32_t len, i; - int32_t reslen = 0; - - if (U_FAILURE(*status)) { - return 0; - } - - len = uloc_getLanguage(localeID, buf, sizeof(buf), &tmpStatus); - if (U_FAILURE(tmpStatus) || tmpStatus == U_STRING_NOT_TERMINATED_WARNING) { - if (strict) { - *status = U_ILLEGAL_ARGUMENT_ERROR; - return 0; - } - len = 0; - } - - /* Note: returned language code is in lower case letters */ - - if (len == 0) { - if (reslen < capacity) { - uprv_memcpy(appendAt + reslen, LANG_UND, uprv_min(LANG_UND_LEN, capacity - reslen)); - } - reslen += LANG_UND_LEN; - } else if (!_isLanguageSubtag(buf, len)) { - /* invalid language code */ - if (strict) { - *status = U_ILLEGAL_ARGUMENT_ERROR; - return 0; - } - if (reslen < capacity) { - uprv_memcpy(appendAt + reslen, LANG_UND, uprv_min(LANG_UND_LEN, capacity - reslen)); - } - reslen += LANG_UND_LEN; - } else { - /* resolve deprecated */ - for (i = 0; i < UPRV_LENGTHOF(DEPRECATEDLANGS); i += 2) { - if (uprv_compareInvCharsAsAscii(buf, DEPRECATEDLANGS[i]) == 0) { - uprv_strcpy(buf, DEPRECATEDLANGS[i + 1]); - len = (int32_t)uprv_strlen(buf); - break; - } - } - if (reslen < capacity) { - uprv_memcpy(appendAt + reslen, buf, uprv_min(len, capacity - reslen)); - } - reslen += len; - } - u_terminateChars(appendAt, capacity, reslen, status); - return reslen; -} - -static int32_t -_appendScriptToLanguageTag(const char* localeID, char* appendAt, int32_t capacity, UBool strict, UErrorCode* status) { - char buf[ULOC_SCRIPT_CAPACITY]; - UErrorCode tmpStatus = U_ZERO_ERROR; - int32_t len; - int32_t reslen = 0; - - if (U_FAILURE(*status)) { - return 0; - } - - len = uloc_getScript(localeID, buf, sizeof(buf), &tmpStatus); - if (U_FAILURE(tmpStatus) || tmpStatus == U_STRING_NOT_TERMINATED_WARNING) { - if (strict) { - *status = U_ILLEGAL_ARGUMENT_ERROR; - } - return 0; - } - - if (len > 0) { - if (!_isScriptSubtag(buf, len)) { - /* invalid script code */ - if (strict) { - *status = U_ILLEGAL_ARGUMENT_ERROR; - } - return 0; - } else { - if (reslen < capacity) { - *(appendAt + reslen) = SEP; - } - reslen++; - - if (reslen < capacity) { - uprv_memcpy(appendAt + reslen, buf, uprv_min(len, capacity - reslen)); - } - reslen += len; - } - } - u_terminateChars(appendAt, capacity, reslen, status); - return reslen; -} - -static int32_t -_appendRegionToLanguageTag(const char* localeID, char* appendAt, int32_t capacity, UBool strict, UErrorCode* status) { - char buf[ULOC_COUNTRY_CAPACITY]; - UErrorCode tmpStatus = U_ZERO_ERROR; - int32_t len; - int32_t reslen = 0; - - if (U_FAILURE(*status)) { - return 0; - } - - len = uloc_getCountry(localeID, buf, sizeof(buf), &tmpStatus); - if (U_FAILURE(tmpStatus) || tmpStatus == U_STRING_NOT_TERMINATED_WARNING) { - if (strict) { - *status = U_ILLEGAL_ARGUMENT_ERROR; - } - return 0; - } - - if (len > 0) { - if (!_isRegionSubtag(buf, len)) { - /* invalid region code */ - if (strict) { - *status = U_ILLEGAL_ARGUMENT_ERROR; - } - return 0; - } else { - if (reslen < capacity) { - *(appendAt + reslen) = SEP; - } - reslen++; - - if (reslen < capacity) { - uprv_memcpy(appendAt + reslen, buf, uprv_min(len, capacity - reslen)); - } - reslen += len; - } - } - u_terminateChars(appendAt, capacity, reslen, status); - return reslen; -} - -static int32_t -_appendVariantsToLanguageTag(const char* localeID, char* appendAt, int32_t capacity, UBool strict, UBool *hadPosix, UErrorCode* status) { - char buf[ULOC_FULLNAME_CAPACITY]; - UErrorCode tmpStatus = U_ZERO_ERROR; - int32_t len, i; - int32_t reslen = 0; - - if (U_FAILURE(*status)) { - return 0; - } - - len = uloc_getVariant(localeID, buf, sizeof(buf), &tmpStatus); - if (U_FAILURE(tmpStatus) || tmpStatus == U_STRING_NOT_TERMINATED_WARNING) { - if (strict) { - *status = U_ILLEGAL_ARGUMENT_ERROR; - } - return 0; - } - - if (len > 0) { - char *p, *pVar; - UBool bNext = TRUE; - VariantListEntry *var; - VariantListEntry *varFirst = NULL; - - pVar = NULL; - p = buf; - while (bNext) { - if (*p == SEP || *p == LOCALE_SEP || *p == 0) { - if (*p == 0) { - bNext = FALSE; - } else { - *p = 0; /* terminate */ - } - if (pVar == NULL) { - if (strict) { - *status = U_ILLEGAL_ARGUMENT_ERROR; - break; - } - /* ignore empty variant */ - } else { - /* ICU uses upper case letters for variants, but - the canonical format is lowercase in BCP47 */ - for (i = 0; *(pVar + i) != 0; i++) { - *(pVar + i) = uprv_tolower(*(pVar + i)); - } - - /* validate */ - if (_isVariantSubtag(pVar, -1)) { - if (uprv_strcmp(pVar,POSIX_VALUE) || len != uprv_strlen(POSIX_VALUE)) { - /* emit the variant to the list */ - var = (VariantListEntry*)uprv_malloc(sizeof(VariantListEntry)); - if (var == NULL) { - *status = U_MEMORY_ALLOCATION_ERROR; - break; - } - var->variant = pVar; - if (!_addVariantToList(&varFirst, var)) { - /* duplicated variant */ - uprv_free(var); - if (strict) { - *status = U_ILLEGAL_ARGUMENT_ERROR; - break; - } - } - } else { - /* Special handling for POSIX variant, need to remember that we had it and then */ - /* treat it like an extension later. */ - *hadPosix = TRUE; - } - } else if (strict) { - *status = U_ILLEGAL_ARGUMENT_ERROR; - break; - } else if (_isPrivateuseValueSubtag(pVar, -1)) { - /* Handle private use subtags separately */ - break; - } - } - /* reset variant starting position */ - pVar = NULL; - } else if (pVar == NULL) { - pVar = p; - } - p++; - } - - if (U_SUCCESS(*status)) { - if (varFirst != NULL) { - int32_t varLen; - - /* write out validated/normalized variants to the target */ - var = varFirst; - while (var != NULL) { - if (reslen < capacity) { - *(appendAt + reslen) = SEP; - } - reslen++; - varLen = (int32_t)uprv_strlen(var->variant); - if (reslen < capacity) { - uprv_memcpy(appendAt + reslen, var->variant, uprv_min(varLen, capacity - reslen)); - } - reslen += varLen; - var = var->next; - } - } - } - - /* clean up */ - var = varFirst; - while (var != NULL) { - VariantListEntry *tmpVar = var->next; - uprv_free(var); - var = tmpVar; - } - - if (U_FAILURE(*status)) { - return 0; - } - } - - u_terminateChars(appendAt, capacity, reslen, status); - return reslen; -} - -static int32_t -_appendKeywordsToLanguageTag(const char* localeID, char* appendAt, int32_t capacity, UBool strict, UBool hadPosix, UErrorCode* status) { - char buf[ULOC_KEYWORD_AND_VALUES_CAPACITY]; - char attrBuf[ULOC_KEYWORD_AND_VALUES_CAPACITY] = { 0 }; - int32_t attrBufLength = 0; - UEnumeration *keywordEnum = NULL; - int32_t reslen = 0; - - keywordEnum = uloc_openKeywords(localeID, status); - if (U_FAILURE(*status) && !hadPosix) { - uenum_close(keywordEnum); - return 0; - } - if (keywordEnum != NULL || hadPosix) { - /* reorder extensions */ - int32_t len; - const char *key; - ExtensionListEntry *firstExt = NULL; - ExtensionListEntry *ext; - AttributeListEntry *firstAttr = NULL; - AttributeListEntry *attr; - char *attrValue; - char extBuf[ULOC_KEYWORD_AND_VALUES_CAPACITY]; - char *pExtBuf = extBuf; - int32_t extBufCapacity = sizeof(extBuf); - const char *bcpKey, *bcpValue; - UErrorCode tmpStatus = U_ZERO_ERROR; - int32_t keylen; - UBool isBcpUExt; - - while (TRUE) { - key = uenum_next(keywordEnum, NULL, status); - if (key == NULL) { - break; - } - len = uloc_getKeywordValue(localeID, key, buf, sizeof(buf), &tmpStatus); - /* buf must be null-terminated */ - if (U_FAILURE(tmpStatus) || tmpStatus == U_STRING_NOT_TERMINATED_WARNING) { - if (strict) { - *status = U_ILLEGAL_ARGUMENT_ERROR; - break; - } - /* ignore this keyword */ - tmpStatus = U_ZERO_ERROR; - continue; - } - - keylen = (int32_t)uprv_strlen(key); - isBcpUExt = (keylen > 1); - - /* special keyword used for representing Unicode locale attributes */ - if (uprv_strcmp(key, LOCALE_ATTRIBUTE_KEY) == 0) { - if (len > 0) { - int32_t i = 0; - while (TRUE) { - attrBufLength = 0; - for (; i < len; i++) { - if (buf[i] != '-') { - attrBuf[attrBufLength++] = buf[i]; - } else { - i++; - break; - } - } - if (attrBufLength > 0) { - attrBuf[attrBufLength] = 0; - - } else if (i >= len){ - break; - } - - /* create AttributeListEntry */ - attr = (AttributeListEntry*)uprv_malloc(sizeof(AttributeListEntry)); - if (attr == NULL) { - *status = U_MEMORY_ALLOCATION_ERROR; - break; - } - attrValue = (char*)uprv_malloc(attrBufLength + 1); - if (attrValue == NULL) { - *status = U_MEMORY_ALLOCATION_ERROR; - break; - } - uprv_strcpy(attrValue, attrBuf); - attr->attribute = attrValue; - - if (!_addAttributeToList(&firstAttr, attr)) { - uprv_free(attr); - uprv_free(attrValue); - if (strict) { - *status = U_ILLEGAL_ARGUMENT_ERROR; - break; - } - } - } - /* for a place holder ExtensionListEntry */ - bcpKey = LOCALE_ATTRIBUTE_KEY; - bcpValue = NULL; - } - } else if (isBcpUExt) { - bcpKey = uloc_toUnicodeLocaleKey(key); - if (bcpKey == NULL) { - if (strict) { - *status = U_ILLEGAL_ARGUMENT_ERROR; - break; - } - continue; - } - - /* we've checked buf is null-terminated above */ - bcpValue = uloc_toUnicodeLocaleType(key, buf); - if (bcpValue == NULL) { - if (strict) { - *status = U_ILLEGAL_ARGUMENT_ERROR; - break; - } - continue; - } - if (bcpValue == buf) { - /* - When uloc_toUnicodeLocaleType(key, buf) returns the - input value as is, the value is well-formed, but has - no known mapping. This implementation normalizes the - the value to lower case - */ - int32_t bcpValueLen = uprv_strlen(bcpValue); - if (bcpValueLen < extBufCapacity) { - uprv_strcpy(pExtBuf, bcpValue); - T_CString_toLowerCase(pExtBuf); - - bcpValue = pExtBuf; - - pExtBuf += (bcpValueLen + 1); - extBufCapacity -= (bcpValueLen + 1); - } else { - if (strict) { - *status = U_ILLEGAL_ARGUMENT_ERROR; - break; - } - continue; - } - } - } else { - if (*key == PRIVATEUSE) { - if (!_isPrivateuseValueSubtags(buf, len)) { - if (strict) { - *status = U_ILLEGAL_ARGUMENT_ERROR; - break; - } - continue; - } - } else { - if (!_isExtensionSingleton(key, keylen) || !_isExtensionSubtags(buf, len)) { - if (strict) { - *status = U_ILLEGAL_ARGUMENT_ERROR; - break; - } - continue; - } - } - bcpKey = key; - if ((len + 1) < extBufCapacity) { - uprv_memcpy(pExtBuf, buf, len); - bcpValue = pExtBuf; - - pExtBuf += len; - - *pExtBuf = 0; - pExtBuf++; - - extBufCapacity -= (len + 1); - } else { - *status = U_ILLEGAL_ARGUMENT_ERROR; - break; - } - } - - /* create ExtensionListEntry */ - ext = (ExtensionListEntry*)uprv_malloc(sizeof(ExtensionListEntry)); - if (ext == NULL) { - *status = U_MEMORY_ALLOCATION_ERROR; - break; - } - ext->key = bcpKey; - ext->value = bcpValue; - - if (!_addExtensionToList(&firstExt, ext, TRUE)) { - uprv_free(ext); - if (strict) { - *status = U_ILLEGAL_ARGUMENT_ERROR; - break; - } - } - } - - /* Special handling for POSIX variant - add the keywords for POSIX */ - if (hadPosix) { - /* create ExtensionListEntry for POSIX */ - ext = (ExtensionListEntry*)uprv_malloc(sizeof(ExtensionListEntry)); - if (ext == NULL) { - *status = U_MEMORY_ALLOCATION_ERROR; - goto cleanup; - } - ext->key = POSIX_KEY; - ext->value = POSIX_VALUE; - - if (!_addExtensionToList(&firstExt, ext, TRUE)) { - uprv_free(ext); - } - } - - if (U_SUCCESS(*status) && (firstExt != NULL || firstAttr != NULL)) { - UBool startLDMLExtension = FALSE; - for (ext = firstExt; ext; ext = ext->next) { - if (!startLDMLExtension && uprv_strlen(ext->key) > 1) { - /* first LDML u singlton extension */ - if (reslen < capacity) { - *(appendAt + reslen) = SEP; - } - reslen++; - if (reslen < capacity) { - *(appendAt + reslen) = LDMLEXT; - } - reslen++; - - startLDMLExtension = TRUE; - } - - /* write out the sorted BCP47 attributes, extensions and private use */ - if (uprv_strcmp(ext->key, LOCALE_ATTRIBUTE_KEY) == 0) { - /* write the value for the attributes */ - for (attr = firstAttr; attr; attr = attr->next) { - if (reslen < capacity) { - *(appendAt + reslen) = SEP; - } - reslen++; - len = (int32_t)uprv_strlen(attr->attribute); - if (reslen < capacity) { - uprv_memcpy(appendAt + reslen, attr->attribute, uprv_min(len, capacity - reslen)); - } - reslen += len; - } - } else { - if (reslen < capacity) { - *(appendAt + reslen) = SEP; - } - reslen++; - len = (int32_t)uprv_strlen(ext->key); - if (reslen < capacity) { - uprv_memcpy(appendAt + reslen, ext->key, uprv_min(len, capacity - reslen)); - } - reslen += len; - if (reslen < capacity) { - *(appendAt + reslen) = SEP; - } - reslen++; - len = (int32_t)uprv_strlen(ext->value); - if (reslen < capacity) { - uprv_memcpy(appendAt + reslen, ext->value, uprv_min(len, capacity - reslen)); - } - reslen += len; - } - } - } -cleanup: - /* clean up */ - ext = firstExt; - while (ext != NULL) { - ExtensionListEntry *tmpExt = ext->next; - uprv_free(ext); - ext = tmpExt; - } - - attr = firstAttr; - while (attr != NULL) { - AttributeListEntry *tmpAttr = attr->next; - char *pValue = (char *)attr->attribute; - uprv_free(pValue); - uprv_free(attr); - attr = tmpAttr; - } - - uenum_close(keywordEnum); - - if (U_FAILURE(*status)) { - return 0; - } - } - - return u_terminateChars(appendAt, capacity, reslen, status); -} - -/** - * Append keywords parsed from LDML extension value - * e.g. "u-ca-gregory-co-trad" -> {calendar = gregorian} {collation = traditional} - * Note: char* buf is used for storing keywords - */ -static void -_appendLDMLExtensionAsKeywords(const char* ldmlext, ExtensionListEntry** appendTo, char* buf, int32_t bufSize, UBool *posixVariant, UErrorCode *status) { - const char *pTag; /* beginning of current subtag */ - const char *pKwds; /* beginning of key-type pairs */ - UBool variantExists = *posixVariant; - - ExtensionListEntry *kwdFirst = NULL; /* first LDML keyword */ - ExtensionListEntry *kwd, *nextKwd; - - AttributeListEntry *attrFirst = NULL; /* first attribute */ - AttributeListEntry *attr, *nextAttr; - - int32_t len; - int32_t bufIdx = 0; - - char attrBuf[ULOC_KEYWORD_AND_VALUES_CAPACITY]; - int32_t attrBufIdx = 0; - - /* Reset the posixVariant value */ - *posixVariant = FALSE; - - pTag = ldmlext; - pKwds = NULL; - - /* Iterate through u extension attributes */ - while (*pTag) { - /* locate next separator char */ - for (len = 0; *(pTag + len) && *(pTag + len) != SEP; len++); - - if (ultag_isUnicodeLocaleKey(pTag, len)) { - pKwds = pTag; - break; - } - - /* add this attribute to the list */ - attr = (AttributeListEntry*)uprv_malloc(sizeof(AttributeListEntry)); - if (attr == NULL) { - *status = U_MEMORY_ALLOCATION_ERROR; - goto cleanup; - } - - if (len < (int32_t)sizeof(attrBuf) - attrBufIdx) { - uprv_memcpy(&attrBuf[attrBufIdx], pTag, len); - attrBuf[attrBufIdx + len] = 0; - attr->attribute = &attrBuf[attrBufIdx]; - attrBufIdx += (len + 1); - } else { - *status = U_ILLEGAL_ARGUMENT_ERROR; - goto cleanup; - } - - if (!_addAttributeToList(&attrFirst, attr)) { - *status = U_ILLEGAL_ARGUMENT_ERROR; - uprv_free(attr); - goto cleanup; - } - - /* next tag */ - pTag += len; - if (*pTag) { - /* next to the separator */ - pTag++; - } - } - - if (attrFirst) { - /* emit attributes as an LDML keyword, e.g. attribute=attr1-attr2 */ - - if (attrBufIdx > bufSize) { - /* attrBufIdx == + 1 */ - *status = U_ILLEGAL_ARGUMENT_ERROR; - goto cleanup; - } - - kwd = (ExtensionListEntry*)uprv_malloc(sizeof(ExtensionListEntry)); - if (kwd == NULL) { - *status = U_MEMORY_ALLOCATION_ERROR; - goto cleanup; - } - - kwd->key = LOCALE_ATTRIBUTE_KEY; - kwd->value = buf; - - /* attribute subtags sorted in alphabetical order as type */ - attr = attrFirst; - while (attr != NULL) { - nextAttr = attr->next; - - /* buffer size check is done above */ - if (attr != attrFirst) { - *(buf + bufIdx) = SEP; - bufIdx++; - } - - len = uprv_strlen(attr->attribute); - uprv_memcpy(buf + bufIdx, attr->attribute, len); - bufIdx += len; - - attr = nextAttr; - } - *(buf + bufIdx) = 0; - bufIdx++; - - if (!_addExtensionToList(&kwdFirst, kwd, FALSE)) { - *status = U_ILLEGAL_ARGUMENT_ERROR; - uprv_free(kwd); - goto cleanup; - } - - /* once keyword entry is created, delete the attribute list */ - attr = attrFirst; - while (attr != NULL) { - nextAttr = attr->next; - uprv_free(attr); - attr = nextAttr; - } - attrFirst = NULL; - } - - if (pKwds) { - const char *pBcpKey = NULL; /* u extenstion key subtag */ - const char *pBcpType = NULL; /* beginning of u extension type subtag(s) */ - int32_t bcpKeyLen = 0; - int32_t bcpTypeLen = 0; - UBool isDone = FALSE; - - pTag = pKwds; - /* BCP47 representation of LDML key/type pairs */ - while (!isDone) { - const char *pNextBcpKey = NULL; - int32_t nextBcpKeyLen = 0; - UBool emitKeyword = FALSE; - - if (*pTag) { - /* locate next separator char */ - for (len = 0; *(pTag + len) && *(pTag + len) != SEP; len++); - - if (ultag_isUnicodeLocaleKey(pTag, len)) { - if (pBcpKey) { - emitKeyword = TRUE; - pNextBcpKey = pTag; - nextBcpKeyLen = len; - } else { - pBcpKey = pTag; - bcpKeyLen = len; - } - } else { - U_ASSERT(pBcpKey != NULL); - /* within LDML type subtags */ - if (pBcpType) { - bcpTypeLen += (len + 1); - } else { - pBcpType = pTag; - bcpTypeLen = len; - } - } - - /* next tag */ - pTag += len; - if (*pTag) { - /* next to the separator */ - pTag++; - } - } else { - /* processing last one */ - emitKeyword = TRUE; - isDone = TRUE; - } - - if (emitKeyword) { - const char *pKey = NULL; /* LDML key */ - const char *pType = NULL; /* LDML type */ - - char bcpKeyBuf[9]; /* BCP key length is always 2 for now */ - - U_ASSERT(pBcpKey != NULL); - - if (bcpKeyLen >= sizeof(bcpKeyBuf)) { - /* the BCP key is invalid */ - *status = U_ILLEGAL_ARGUMENT_ERROR; - goto cleanup; - } - - uprv_strncpy(bcpKeyBuf, pBcpKey, bcpKeyLen); - bcpKeyBuf[bcpKeyLen] = 0; - - /* u extension key to LDML key */ - pKey = uloc_toLegacyKey(bcpKeyBuf); - if (pKey == NULL) { - *status = U_ILLEGAL_ARGUMENT_ERROR; - goto cleanup; - } - if (pKey == bcpKeyBuf) { - /* - The key returned by toLegacyKey points to the input buffer. - We normalize the result key to lower case. - */ - T_CString_toLowerCase(bcpKeyBuf); - if (bufSize - bufIdx - 1 >= bcpKeyLen) { - uprv_memcpy(buf + bufIdx, bcpKeyBuf, bcpKeyLen); - pKey = buf + bufIdx; - bufIdx += bcpKeyLen; - *(buf + bufIdx) = 0; - bufIdx++; - } else { - *status = U_BUFFER_OVERFLOW_ERROR; - goto cleanup; - } - } - - if (pBcpType) { - char bcpTypeBuf[128]; /* practically long enough even considering multiple subtag type */ - if (bcpTypeLen >= sizeof(bcpTypeBuf)) { - /* the BCP type is too long */ - *status = U_ILLEGAL_ARGUMENT_ERROR; - goto cleanup; - } - - uprv_strncpy(bcpTypeBuf, pBcpType, bcpTypeLen); - bcpTypeBuf[bcpTypeLen] = 0; - - /* BCP type to locale type */ - pType = uloc_toLegacyType(pKey, bcpTypeBuf); - if (pType == NULL) { - *status = U_ILLEGAL_ARGUMENT_ERROR; - goto cleanup; - } - if (pType == bcpTypeBuf) { - /* - The type returned by toLegacyType points to the input buffer. - We normalize the result type to lower case. - */ - /* normalize to lower case */ - T_CString_toLowerCase(bcpTypeBuf); - if (bufSize - bufIdx - 1 >= bcpTypeLen) { - uprv_memcpy(buf + bufIdx, bcpTypeBuf, bcpTypeLen); - pType = buf + bufIdx; - bufIdx += bcpTypeLen; - *(buf + bufIdx) = 0; - bufIdx++; - } else { - *status = U_BUFFER_OVERFLOW_ERROR; - goto cleanup; - } - } - } else { - /* typeless - default type value is "yes" */ - pType = LOCALE_TYPE_YES; - } - - /* Special handling for u-va-posix, since we want to treat this as a variant, - not as a keyword */ - if (!variantExists && !uprv_strcmp(pKey, POSIX_KEY) && !uprv_strcmp(pType, POSIX_VALUE) ) { - *posixVariant = TRUE; - } else { - /* create an ExtensionListEntry for this keyword */ - kwd = (ExtensionListEntry*)uprv_malloc(sizeof(ExtensionListEntry)); - if (kwd == NULL) { - *status = U_MEMORY_ALLOCATION_ERROR; - goto cleanup; - } - - kwd->key = pKey; - kwd->value = pType; - - if (!_addExtensionToList(&kwdFirst, kwd, FALSE)) { - *status = U_ILLEGAL_ARGUMENT_ERROR; - uprv_free(kwd); - goto cleanup; - } - } - - pBcpKey = pNextBcpKey; - bcpKeyLen = pNextBcpKey != NULL ? nextBcpKeyLen : 0; - pBcpType = NULL; - bcpTypeLen = 0; - } - } - } - - kwd = kwdFirst; - while (kwd != NULL) { - nextKwd = kwd->next; - _addExtensionToList(appendTo, kwd, FALSE); - kwd = nextKwd; - } - - return; - -cleanup: - attr = attrFirst; - while (attr != NULL) { - nextAttr = attr->next; - uprv_free(attr); - attr = nextAttr; - } - - kwd = kwdFirst; - while (kwd != NULL) { - nextKwd = kwd->next; - uprv_free(kwd); - kwd = nextKwd; - } -} - - -static int32_t -_appendKeywords(ULanguageTag* langtag, char* appendAt, int32_t capacity, UErrorCode* status) { - int32_t reslen = 0; - int32_t i, n; - int32_t len; - ExtensionListEntry *kwdFirst = NULL; - ExtensionListEntry *kwd; - const char *key, *type; - char *kwdBuf = NULL; - int32_t kwdBufLength = capacity; - UBool posixVariant = FALSE; - - if (U_FAILURE(*status)) { - return 0; - } - - kwdBuf = (char*)uprv_malloc(kwdBufLength); - if (kwdBuf == NULL) { - *status = U_MEMORY_ALLOCATION_ERROR; - return 0; - } - - /* Determine if variants already exists */ - if (ultag_getVariantsSize(langtag)) { - posixVariant = TRUE; - } - - n = ultag_getExtensionsSize(langtag); - - /* resolve locale keywords and reordering keys */ - for (i = 0; i < n; i++) { - key = ultag_getExtensionKey(langtag, i); - type = ultag_getExtensionValue(langtag, i); - if (*key == LDMLEXT) { - _appendLDMLExtensionAsKeywords(type, &kwdFirst, kwdBuf, kwdBufLength, &posixVariant, status); - if (U_FAILURE(*status)) { - break; - } - } else { - kwd = (ExtensionListEntry*)uprv_malloc(sizeof(ExtensionListEntry)); - if (kwd == NULL) { - *status = U_MEMORY_ALLOCATION_ERROR; - break; - } - kwd->key = key; - kwd->value = type; - if (!_addExtensionToList(&kwdFirst, kwd, FALSE)) { - uprv_free(kwd); - *status = U_ILLEGAL_ARGUMENT_ERROR; - break; - } - } - } - - if (U_SUCCESS(*status)) { - type = ultag_getPrivateUse(langtag); - if ((int32_t)uprv_strlen(type) > 0) { - /* add private use as a keyword */ - kwd = (ExtensionListEntry*)uprv_malloc(sizeof(ExtensionListEntry)); - if (kwd == NULL) { - *status = U_MEMORY_ALLOCATION_ERROR; - } else { - kwd->key = PRIVATEUSE_KEY; - kwd->value = type; - if (!_addExtensionToList(&kwdFirst, kwd, FALSE)) { - uprv_free(kwd); - *status = U_ILLEGAL_ARGUMENT_ERROR; - } - } - } - } - - /* If a POSIX variant was in the extensions, write it out before writing the keywords. */ - - if (U_SUCCESS(*status) && posixVariant) { - len = (int32_t) uprv_strlen(_POSIX); - if (reslen < capacity) { - uprv_memcpy(appendAt + reslen, _POSIX, uprv_min(len, capacity - reslen)); - } - reslen += len; - } - - if (U_SUCCESS(*status) && kwdFirst != NULL) { - /* write out the sorted keywords */ - UBool firstValue = TRUE; - kwd = kwdFirst; - do { - if (reslen < capacity) { - if (firstValue) { - /* '@' */ - *(appendAt + reslen) = LOCALE_EXT_SEP; - firstValue = FALSE; - } else { - /* ';' */ - *(appendAt + reslen) = LOCALE_KEYWORD_SEP; - } - } - reslen++; - - /* key */ - len = (int32_t)uprv_strlen(kwd->key); - if (reslen < capacity) { - uprv_memcpy(appendAt + reslen, kwd->key, uprv_min(len, capacity - reslen)); - } - reslen += len; - - /* '=' */ - if (reslen < capacity) { - *(appendAt + reslen) = LOCALE_KEY_TYPE_SEP; - } - reslen++; - - /* type */ - len = (int32_t)uprv_strlen(kwd->value); - if (reslen < capacity) { - uprv_memcpy(appendAt + reslen, kwd->value, uprv_min(len, capacity - reslen)); - } - reslen += len; - - kwd = kwd->next; - } while (kwd); - } - - /* clean up */ - kwd = kwdFirst; - while (kwd != NULL) { - ExtensionListEntry *tmpKwd = kwd->next; - uprv_free(kwd); - kwd = tmpKwd; - } - - uprv_free(kwdBuf); - - if (U_FAILURE(*status)) { - return 0; - } - - return u_terminateChars(appendAt, capacity, reslen, status); -} - -static int32_t -_appendPrivateuseToLanguageTag(const char* localeID, char* appendAt, int32_t capacity, UBool strict, UBool hadPosix, UErrorCode* status) { - char buf[ULOC_FULLNAME_CAPACITY]; - char tmpAppend[ULOC_FULLNAME_CAPACITY]; - UErrorCode tmpStatus = U_ZERO_ERROR; - int32_t len, i; - int32_t reslen = 0; - - if (U_FAILURE(*status)) { - return 0; - } - - len = uloc_getVariant(localeID, buf, sizeof(buf), &tmpStatus); - if (U_FAILURE(tmpStatus) || tmpStatus == U_STRING_NOT_TERMINATED_WARNING) { - if (strict) { - *status = U_ILLEGAL_ARGUMENT_ERROR; - } - return 0; - } - - if (len > 0) { - char *p, *pPriv; - UBool bNext = TRUE; - UBool firstValue = TRUE; - UBool writeValue; - - pPriv = NULL; - p = buf; - while (bNext) { - writeValue = FALSE; - if (*p == SEP || *p == LOCALE_SEP || *p == 0) { - if (*p == 0) { - bNext = FALSE; - } else { - *p = 0; /* terminate */ - } - if (pPriv != NULL) { - /* Private use in the canonical format is lowercase in BCP47 */ - for (i = 0; *(pPriv + i) != 0; i++) { - *(pPriv + i) = uprv_tolower(*(pPriv + i)); - } - - /* validate */ - if (_isPrivateuseValueSubtag(pPriv, -1)) { - if (firstValue) { - if (!_isVariantSubtag(pPriv, -1)) { - writeValue = TRUE; - } - } else { - writeValue = TRUE; - } - } else if (strict) { - *status = U_ILLEGAL_ARGUMENT_ERROR; - break; - } else { - break; - } - - if (writeValue) { - if (reslen < capacity) { - tmpAppend[reslen++] = SEP; - } - - if (firstValue) { - if (reslen < capacity) { - tmpAppend[reslen++] = *PRIVATEUSE_KEY; - } - - if (reslen < capacity) { - tmpAppend[reslen++] = SEP; - } - - len = (int32_t)uprv_strlen(PRIVUSE_VARIANT_PREFIX); - if (reslen < capacity) { - uprv_memcpy(tmpAppend + reslen, PRIVUSE_VARIANT_PREFIX, uprv_min(len, capacity - reslen)); - } - reslen += len; - - if (reslen < capacity) { - tmpAppend[reslen++] = SEP; - } - - firstValue = FALSE; - } - - len = (int32_t)uprv_strlen(pPriv); - if (reslen < capacity) { - uprv_memcpy(tmpAppend + reslen, pPriv, uprv_min(len, capacity - reslen)); - } - reslen += len; - } - } - /* reset private use starting position */ - pPriv = NULL; - } else if (pPriv == NULL) { - pPriv = p; - } - p++; - } - - if (U_FAILURE(*status)) { - return 0; - } - } - - if (U_SUCCESS(*status)) { - len = reslen; - if (reslen < capacity) { - uprv_memcpy(appendAt, tmpAppend, uprv_min(len, capacity - reslen)); - } - } - - u_terminateChars(appendAt, capacity, reslen, status); - - return reslen; -} - -/* -* ------------------------------------------------- -* -* ultag_ functions -* -* ------------------------------------------------- -*/ - -/* Bit flags used by the parser */ -#define LANG 0x0001 -#define EXTL 0x0002 -#define SCRT 0x0004 -#define REGN 0x0008 -#define VART 0x0010 -#define EXTS 0x0020 -#define EXTV 0x0040 -#define PRIV 0x0080 - -/** - * Ticket #12705 - Visual Studio 2015 Update 3 contains a new code optimizer which has problems optimizing - * this function. (See https://blogs.msdn.microsoft.com/vcblog/2016/05/04/new-code-optimizer/ ) - * As a workaround, we will turn off optimization just for this function on VS2015 Update 3 and above. - */ -#if (defined(_MSC_VER) && (_MSC_VER >= 1900) && defined(_MSC_FULL_VER) && (_MSC_FULL_VER >= 190024210)) -#pragma optimize( "", off ) -#endif - -static ULanguageTag* -ultag_parse(const char* tag, int32_t tagLen, int32_t* parsedLen, UErrorCode* status) { - ULanguageTag *t; - char *tagBuf; - int16_t next; - char *pSubtag, *pNext, *pLastGoodPosition; - int32_t subtagLen; - int32_t extlangIdx; - ExtensionListEntry *pExtension; - char *pExtValueSubtag, *pExtValueSubtagEnd; - int32_t i; - UBool privateuseVar = FALSE; - int32_t grandfatheredLen = 0; - - if (parsedLen != NULL) { - *parsedLen = 0; - } - - if (U_FAILURE(*status)) { - return NULL; - } - - if (tagLen < 0) { - tagLen = (int32_t)uprv_strlen(tag); - } - - /* copy the entire string */ - tagBuf = (char*)uprv_malloc(tagLen + 1); - if (tagBuf == NULL) { - *status = U_MEMORY_ALLOCATION_ERROR; - return NULL; - } - uprv_memcpy(tagBuf, tag, tagLen); - *(tagBuf + tagLen) = 0; - - /* create a ULanguageTag */ - t = (ULanguageTag*)uprv_malloc(sizeof(ULanguageTag)); - if (t == NULL) { - uprv_free(tagBuf); - *status = U_MEMORY_ALLOCATION_ERROR; - return NULL; - } - _initializeULanguageTag(t); - t->buf = tagBuf; - - if (tagLen < MINLEN) { - /* the input tag is too short - return empty ULanguageTag */ - return t; - } - - /* check if the tag is grandfathered */ - for (i = 0; GRANDFATHERED[i] != NULL; i += 2) { - if (uprv_stricmp(GRANDFATHERED[i], tagBuf) == 0) { - int32_t newTagLength; - - grandfatheredLen = tagLen; /* back up for output parsedLen */ - newTagLength = uprv_strlen(GRANDFATHERED[i+1]); - if (tagLen < newTagLength) { - uprv_free(tagBuf); - tagBuf = (char*)uprv_malloc(newTagLength + 1); - if (tagBuf == NULL) { - *status = U_MEMORY_ALLOCATION_ERROR; - ultag_close(t); - return NULL; - } - t->buf = tagBuf; - tagLen = newTagLength; - } - uprv_strcpy(t->buf, GRANDFATHERED[i + 1]); - break; - } - } - - /* - * langtag = language - * ["-" script] - * ["-" region] - * *("-" variant) - * *("-" extension) - * ["-" privateuse] - */ - - next = LANG | PRIV; - pNext = pLastGoodPosition = tagBuf; - extlangIdx = 0; - pExtension = NULL; - pExtValueSubtag = NULL; - pExtValueSubtagEnd = NULL; - - while (pNext) { - char *pSep; - - pSubtag = pNext; - - /* locate next separator char */ - pSep = pSubtag; - while (*pSep) { - if (*pSep == SEP) { - break; - } - pSep++; - } - if (*pSep == 0) { - /* last subtag */ - pNext = NULL; - } else { - pNext = pSep + 1; - } - subtagLen = (int32_t)(pSep - pSubtag); - - if (next & LANG) { - if (_isLanguageSubtag(pSubtag, subtagLen)) { - *pSep = 0; /* terminate */ - t->language = T_CString_toLowerCase(pSubtag); - - pLastGoodPosition = pSep; - next = EXTL | SCRT | REGN | VART | EXTS | PRIV; - continue; - } - } - if (next & EXTL) { - if (_isExtlangSubtag(pSubtag, subtagLen)) { - *pSep = 0; - t->extlang[extlangIdx++] = T_CString_toLowerCase(pSubtag); - - pLastGoodPosition = pSep; - if (extlangIdx < 3) { - next = EXTL | SCRT | REGN | VART | EXTS | PRIV; - } else { - next = SCRT | REGN | VART | EXTS | PRIV; - } - continue; - } - } - if (next & SCRT) { - if (_isScriptSubtag(pSubtag, subtagLen)) { - char *p = pSubtag; - - *pSep = 0; - - /* to title case */ - *p = uprv_toupper(*p); - p++; - for (; *p; p++) { - *p = uprv_tolower(*p); - } - - t->script = pSubtag; - - pLastGoodPosition = pSep; - next = REGN | VART | EXTS | PRIV; - continue; - } - } - if (next & REGN) { - if (_isRegionSubtag(pSubtag, subtagLen)) { - *pSep = 0; - t->region = T_CString_toUpperCase(pSubtag); - - pLastGoodPosition = pSep; - next = VART | EXTS | PRIV; - continue; - } - } - if (next & VART) { - if (_isVariantSubtag(pSubtag, subtagLen) || - (privateuseVar && _isPrivateuseVariantSubtag(pSubtag, subtagLen))) { - VariantListEntry *var; - UBool isAdded; - - var = (VariantListEntry*)uprv_malloc(sizeof(VariantListEntry)); - if (var == NULL) { - *status = U_MEMORY_ALLOCATION_ERROR; - goto error; - } - *pSep = 0; - var->variant = T_CString_toUpperCase(pSubtag); - isAdded = _addVariantToList(&(t->variants), var); - if (!isAdded) { - /* duplicated variant entry */ - uprv_free(var); - break; - } - pLastGoodPosition = pSep; - next = VART | EXTS | PRIV; - continue; - } - } - if (next & EXTS) { - if (_isExtensionSingleton(pSubtag, subtagLen)) { - if (pExtension != NULL) { - if (pExtValueSubtag == NULL || pExtValueSubtagEnd == NULL) { - /* the previous extension is incomplete */ - uprv_free(pExtension); - pExtension = NULL; - break; - } - - /* terminate the previous extension value */ - *pExtValueSubtagEnd = 0; - pExtension->value = T_CString_toLowerCase(pExtValueSubtag); - - /* insert the extension to the list */ - if (_addExtensionToList(&(t->extensions), pExtension, FALSE)) { - pLastGoodPosition = pExtValueSubtagEnd; - } else { - /* stop parsing here */ - uprv_free(pExtension); - pExtension = NULL; - break; - } - } - - /* create a new extension */ - pExtension = (ExtensionListEntry*)uprv_malloc(sizeof(ExtensionListEntry)); - if (pExtension == NULL) { - *status = U_MEMORY_ALLOCATION_ERROR; - goto error; - } - *pSep = 0; - pExtension->key = T_CString_toLowerCase(pSubtag); - pExtension->value = NULL; /* will be set later */ - - /* - * reset the start and the end location of extension value - * subtags for this extension - */ - pExtValueSubtag = NULL; - pExtValueSubtagEnd = NULL; - - next = EXTV; - continue; - } - } - if (next & EXTV) { - if (_isExtensionSubtag(pSubtag, subtagLen)) { - if (pExtValueSubtag == NULL) { - /* if the start postion of this extension's value is not yet, - this one is the first value subtag */ - pExtValueSubtag = pSubtag; - } - - /* Mark the end of this subtag */ - pExtValueSubtagEnd = pSep; - next = EXTS | EXTV | PRIV; - - continue; - } - } - if (next & PRIV) { - if (uprv_tolower(*pSubtag) == PRIVATEUSE) { - char *pPrivuseVal; - - if (pExtension != NULL) { - /* Process the last extension */ - if (pExtValueSubtag == NULL || pExtValueSubtagEnd == NULL) { - /* the previous extension is incomplete */ - uprv_free(pExtension); - pExtension = NULL; - break; - } else { - /* terminate the previous extension value */ - *pExtValueSubtagEnd = 0; - pExtension->value = T_CString_toLowerCase(pExtValueSubtag); - - /* insert the extension to the list */ - if (_addExtensionToList(&(t->extensions), pExtension, FALSE)) { - pLastGoodPosition = pExtValueSubtagEnd; - pExtension = NULL; - } else { - /* stop parsing here */ - uprv_free(pExtension); - pExtension = NULL; - break; - } - } - } - - /* The rest of part will be private use value subtags */ - if (pNext == NULL) { - /* empty private use subtag */ - break; - } - /* back up the private use value start position */ - pPrivuseVal = pNext; - - /* validate private use value subtags */ - while (pNext) { - pSubtag = pNext; - pSep = pSubtag; - while (*pSep) { - if (*pSep == SEP) { - break; - } - pSep++; - } - if (*pSep == 0) { - /* last subtag */ - pNext = NULL; - } else { - pNext = pSep + 1; - } - subtagLen = (int32_t)(pSep - pSubtag); - - if (uprv_strncmp(pSubtag, PRIVUSE_VARIANT_PREFIX, uprv_strlen(PRIVUSE_VARIANT_PREFIX)) == 0) { - *pSep = 0; - next = VART; - privateuseVar = TRUE; - break; - } else if (_isPrivateuseValueSubtag(pSubtag, subtagLen)) { - pLastGoodPosition = pSep; - } else { - break; - } - } - - if (next == VART) { - continue; - } - - if (pLastGoodPosition - pPrivuseVal > 0) { - *pLastGoodPosition = 0; - t->privateuse = T_CString_toLowerCase(pPrivuseVal); - } - /* No more subtags, exiting the parse loop */ - break; - } - break; - } - - /* If we fell through here, it means this subtag is illegal - quit parsing */ - break; - } - - if (pExtension != NULL) { - /* Process the last extension */ - if (pExtValueSubtag == NULL || pExtValueSubtagEnd == NULL) { - /* the previous extension is incomplete */ - uprv_free(pExtension); - } else { - /* terminate the previous extension value */ - *pExtValueSubtagEnd = 0; - pExtension->value = T_CString_toLowerCase(pExtValueSubtag); - /* insert the extension to the list */ - if (_addExtensionToList(&(t->extensions), pExtension, FALSE)) { - pLastGoodPosition = pExtValueSubtagEnd; - } else { - uprv_free(pExtension); - } - } - } - - if (parsedLen != NULL) { - *parsedLen = (grandfatheredLen > 0) ? grandfatheredLen : (int32_t)(pLastGoodPosition - t->buf); - } - - return t; - -error: - ultag_close(t); - return NULL; -} - -/** -* Ticket #12705 - Turn optimization back on. -*/ -#if (defined(_MSC_VER) && (_MSC_VER >= 1900) && defined(_MSC_FULL_VER) && (_MSC_FULL_VER >= 190024210)) -#pragma optimize( "", on ) -#endif - -static void -ultag_close(ULanguageTag* langtag) { - - if (langtag == NULL) { - return; - } - - uprv_free(langtag->buf); - - if (langtag->variants) { - VariantListEntry *curVar = langtag->variants; - while (curVar) { - VariantListEntry *nextVar = curVar->next; - uprv_free(curVar); - curVar = nextVar; - } - } - - if (langtag->extensions) { - ExtensionListEntry *curExt = langtag->extensions; - while (curExt) { - ExtensionListEntry *nextExt = curExt->next; - uprv_free(curExt); - curExt = nextExt; - } - } - - uprv_free(langtag); -} - -static const char* -ultag_getLanguage(const ULanguageTag* langtag) { - return langtag->language; -} - -#if 0 -static const char* -ultag_getJDKLanguage(const ULanguageTag* langtag) { - int32_t i; - for (i = 0; DEPRECATEDLANGS[i] != NULL; i += 2) { - if (uprv_compareInvCharsAsAscii(DEPRECATEDLANGS[i], langtag->language) == 0) { - return DEPRECATEDLANGS[i + 1]; - } - } - return langtag->language; -} -#endif - -static const char* -ultag_getExtlang(const ULanguageTag* langtag, int32_t idx) { - if (idx >= 0 && idx < MAXEXTLANG) { - return langtag->extlang[idx]; - } - return NULL; -} - -static int32_t -ultag_getExtlangSize(const ULanguageTag* langtag) { - int32_t size = 0; - int32_t i; - for (i = 0; i < MAXEXTLANG; i++) { - if (langtag->extlang[i]) { - size++; - } - } - return size; -} - -static const char* -ultag_getScript(const ULanguageTag* langtag) { - return langtag->script; -} - -static const char* -ultag_getRegion(const ULanguageTag* langtag) { - return langtag->region; -} - -static const char* -ultag_getVariant(const ULanguageTag* langtag, int32_t idx) { - const char *var = NULL; - VariantListEntry *cur = langtag->variants; - int32_t i = 0; - while (cur) { - if (i == idx) { - var = cur->variant; - break; - } - cur = cur->next; - i++; - } - return var; -} - -static int32_t -ultag_getVariantsSize(const ULanguageTag* langtag) { - int32_t size = 0; - VariantListEntry *cur = langtag->variants; - while (TRUE) { - if (cur == NULL) { - break; - } - size++; - cur = cur->next; - } - return size; -} - -static const char* -ultag_getExtensionKey(const ULanguageTag* langtag, int32_t idx) { - const char *key = NULL; - ExtensionListEntry *cur = langtag->extensions; - int32_t i = 0; - while (cur) { - if (i == idx) { - key = cur->key; - break; - } - cur = cur->next; - i++; - } - return key; -} - -static const char* -ultag_getExtensionValue(const ULanguageTag* langtag, int32_t idx) { - const char *val = NULL; - ExtensionListEntry *cur = langtag->extensions; - int32_t i = 0; - while (cur) { - if (i == idx) { - val = cur->value; - break; - } - cur = cur->next; - i++; - } - return val; -} - -static int32_t -ultag_getExtensionsSize(const ULanguageTag* langtag) { - int32_t size = 0; - ExtensionListEntry *cur = langtag->extensions; - while (TRUE) { - if (cur == NULL) { - break; - } - size++; - cur = cur->next; - } - return size; -} - -static const char* -ultag_getPrivateUse(const ULanguageTag* langtag) { - return langtag->privateuse; -} - -#if 0 -static const char* -ultag_getGrandfathered(const ULanguageTag* langtag) { - return langtag->grandfathered; -} -#endif - - -/* -* ------------------------------------------------- -* -* Locale/BCP47 conversion APIs, exposed as uloc_* -* -* ------------------------------------------------- -*/ -U_CAPI int32_t U_EXPORT2 -uloc_toLanguageTag(const char* localeID, - char* langtag, - int32_t langtagCapacity, - UBool strict, - UErrorCode* status) { - /* char canonical[ULOC_FULLNAME_CAPACITY]; */ /* See #6822 */ - char canonical[256]; - int32_t reslen = 0; - UErrorCode tmpStatus = U_ZERO_ERROR; - UBool hadPosix = FALSE; - const char* pKeywordStart; - - /* Note: uloc_canonicalize returns "en_US_POSIX" for input locale ID "". See #6835 */ - canonical[0] = 0; - if (uprv_strlen(localeID) > 0) { - uloc_canonicalize(localeID, canonical, sizeof(canonical), &tmpStatus); - if (tmpStatus != U_ZERO_ERROR) { - *status = U_ILLEGAL_ARGUMENT_ERROR; - return 0; - } - } - - /* For handling special case - private use only tag */ - pKeywordStart = locale_getKeywordsStart(canonical); - if (pKeywordStart == canonical) { - UEnumeration *kwdEnum; - int kwdCnt = 0; - UBool done = FALSE; - - kwdEnum = uloc_openKeywords((const char*)canonical, &tmpStatus); - if (kwdEnum != NULL) { - kwdCnt = uenum_count(kwdEnum, &tmpStatus); - if (kwdCnt == 1) { - const char *key; - int32_t len = 0; - - key = uenum_next(kwdEnum, &len, &tmpStatus); - if (len == 1 && *key == PRIVATEUSE) { - char buf[ULOC_KEYWORD_AND_VALUES_CAPACITY]; - buf[0] = PRIVATEUSE; - buf[1] = SEP; - len = uloc_getKeywordValue(localeID, key, &buf[2], sizeof(buf) - 2, &tmpStatus); - if (U_SUCCESS(tmpStatus)) { - if (_isPrivateuseValueSubtags(&buf[2], len)) { - /* return private use only tag */ - reslen = len + 2; - uprv_memcpy(langtag, buf, uprv_min(reslen, langtagCapacity)); - u_terminateChars(langtag, langtagCapacity, reslen, status); - done = TRUE; - } else if (strict) { - *status = U_ILLEGAL_ARGUMENT_ERROR; - done = TRUE; - } - /* if not strict mode, then "und" will be returned */ - } else { - *status = U_ILLEGAL_ARGUMENT_ERROR; - done = TRUE; - } - } - } - uenum_close(kwdEnum); - if (done) { - return reslen; - } - } - } - - reslen += _appendLanguageToLanguageTag(canonical, langtag, langtagCapacity, strict, status); - reslen += _appendScriptToLanguageTag(canonical, langtag + reslen, langtagCapacity - reslen, strict, status); - reslen += _appendRegionToLanguageTag(canonical, langtag + reslen, langtagCapacity - reslen, strict, status); - reslen += _appendVariantsToLanguageTag(canonical, langtag + reslen, langtagCapacity - reslen, strict, &hadPosix, status); - reslen += _appendKeywordsToLanguageTag(canonical, langtag + reslen, langtagCapacity - reslen, strict, hadPosix, status); - reslen += _appendPrivateuseToLanguageTag(canonical, langtag + reslen, langtagCapacity - reslen, strict, hadPosix, status); - - return reslen; -} - - -U_CAPI int32_t U_EXPORT2 -uloc_forLanguageTag(const char* langtag, - char* localeID, - int32_t localeIDCapacity, - int32_t* parsedLength, - UErrorCode* status) { - ULanguageTag *lt; - int32_t reslen = 0; - const char *subtag, *p; - int32_t len; - int32_t i, n; - UBool noRegion = TRUE; - - lt = ultag_parse(langtag, -1, parsedLength, status); - if (U_FAILURE(*status)) { - return 0; - } - - /* language */ - subtag = ultag_getExtlangSize(lt) > 0 ? ultag_getExtlang(lt, 0) : ultag_getLanguage(lt); - if (uprv_compareInvCharsAsAscii(subtag, LANG_UND) != 0) { - len = (int32_t)uprv_strlen(subtag); - if (len > 0) { - if (reslen < localeIDCapacity) { - uprv_memcpy(localeID, subtag, uprv_min(len, localeIDCapacity - reslen)); - } - reslen += len; - } - } - - /* script */ - subtag = ultag_getScript(lt); - len = (int32_t)uprv_strlen(subtag); - if (len > 0) { - if (reslen < localeIDCapacity) { - *(localeID + reslen) = LOCALE_SEP; - } - reslen++; - - /* write out the script in title case */ - p = subtag; - while (*p) { - if (reslen < localeIDCapacity) { - if (p == subtag) { - *(localeID + reslen) = uprv_toupper(*p); - } else { - *(localeID + reslen) = *p; - } - } - reslen++; - p++; - } - } - - /* region */ - subtag = ultag_getRegion(lt); - len = (int32_t)uprv_strlen(subtag); - if (len > 0) { - if (reslen < localeIDCapacity) { - *(localeID + reslen) = LOCALE_SEP; - } - reslen++; - /* write out the retion in upper case */ - p = subtag; - while (*p) { - if (reslen < localeIDCapacity) { - *(localeID + reslen) = uprv_toupper(*p); - } - reslen++; - p++; - } - noRegion = FALSE; - } - - /* variants */ - n = ultag_getVariantsSize(lt); - if (n > 0) { - if (noRegion) { - if (reslen < localeIDCapacity) { - *(localeID + reslen) = LOCALE_SEP; - } - reslen++; - } - - for (i = 0; i < n; i++) { - subtag = ultag_getVariant(lt, i); - if (reslen < localeIDCapacity) { - *(localeID + reslen) = LOCALE_SEP; - } - reslen++; - /* write out the variant in upper case */ - p = subtag; - while (*p) { - if (reslen < localeIDCapacity) { - *(localeID + reslen) = uprv_toupper(*p); - } - reslen++; - p++; - } - } - } - - /* keywords */ - n = ultag_getExtensionsSize(lt); - subtag = ultag_getPrivateUse(lt); - if (n > 0 || uprv_strlen(subtag) > 0) { - if (reslen == 0 && n > 0) { - /* need a language */ - if (reslen < localeIDCapacity) { - uprv_memcpy(localeID + reslen, LANG_UND, uprv_min(LANG_UND_LEN, localeIDCapacity - reslen)); - } - reslen += LANG_UND_LEN; - } - len = _appendKeywords(lt, localeID + reslen, localeIDCapacity - reslen, status); - reslen += len; - } - - ultag_close(lt); - return u_terminateChars(localeID, localeIDCapacity, reslen, status); -} - - diff --git a/Build/source/libs/icu/icu-src/source/common/uloc_tag.cpp b/Build/source/libs/icu/icu-src/source/common/uloc_tag.cpp new file mode 100644 index 00000000000..87b9f63f279 --- /dev/null +++ b/Build/source/libs/icu/icu-src/source/common/uloc_tag.cpp @@ -0,0 +1,2532 @@ +// © 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html +/* +********************************************************************** +* Copyright (C) 2009-2015, International Business Machines +* Corporation and others. All Rights Reserved. +********************************************************************** +*/ + +#include "unicode/utypes.h" +#include "unicode/ures.h" +#include "unicode/putil.h" +#include "unicode/uloc.h" +#include "ustr_imp.h" +#include "cmemory.h" +#include "cstring.h" +#include "putilimp.h" +#include "uinvchar.h" +#include "ulocimp.h" +#include "uassert.h" + + +/* struct holding a single variant */ +typedef struct VariantListEntry { + const char *variant; + struct VariantListEntry *next; +} VariantListEntry; + +/* struct holding a single attribute value */ +typedef struct AttributeListEntry { + const char *attribute; + struct AttributeListEntry *next; +} AttributeListEntry; + +/* struct holding a single extension */ +typedef struct ExtensionListEntry { + const char *key; + const char *value; + struct ExtensionListEntry *next; +} ExtensionListEntry; + +#define MAXEXTLANG 3 +typedef struct ULanguageTag { + char *buf; /* holding parsed subtags */ + const char *language; + const char *extlang[MAXEXTLANG]; + const char *script; + const char *region; + VariantListEntry *variants; + ExtensionListEntry *extensions; + const char *privateuse; + const char *grandfathered; +} ULanguageTag; + +#define MINLEN 2 +#define SEP '-' +#define PRIVATEUSE 'x' +#define LDMLEXT 'u' + +#define LOCALE_SEP '_' +#define LOCALE_EXT_SEP '@' +#define LOCALE_KEYWORD_SEP ';' +#define LOCALE_KEY_TYPE_SEP '=' + +#define ISALPHA(c) uprv_isASCIILetter(c) +#define ISNUMERIC(c) ((c)>='0' && (c)<='9') + +static const char EMPTY[] = ""; +static const char LANG_UND[] = "und"; +static const char PRIVATEUSE_KEY[] = "x"; +static const char _POSIX[] = "_POSIX"; +static const char POSIX_KEY[] = "va"; +static const char POSIX_VALUE[] = "posix"; +static const char LOCALE_ATTRIBUTE_KEY[] = "attribute"; +static const char PRIVUSE_VARIANT_PREFIX[] = "lvariant"; +static const char LOCALE_TYPE_YES[] = "yes"; + +#define LANG_UND_LEN 3 + +static const char* const GRANDFATHERED[] = { +/* grandfathered preferred */ + "art-lojban", "jbo", + "cel-gaulish", "xtg-x-cel-gaulish", + "en-GB-oed", "en-GB-x-oed", + "i-ami", "ami", + "i-bnn", "bnn", + "i-default", "en-x-i-default", + "i-enochian", "und-x-i-enochian", + "i-hak", "hak", + "i-klingon", "tlh", + "i-lux", "lb", + "i-mingo", "see-x-i-mingo", + "i-navajo", "nv", + "i-pwn", "pwn", + "i-tao", "tao", + "i-tay", "tay", + "i-tsu", "tsu", + "no-bok", "nb", + "no-nyn", "nn", + "sgn-be-fr", "sfb", + "sgn-be-nl", "vgt", + "sgn-ch-de", "sgg", + "zh-guoyu", "cmn", + "zh-hakka", "hak", + "zh-min", "nan-x-zh-min", + "zh-min-nan", "nan", + "zh-xiang", "hsn", + NULL, NULL +}; + +static const char DEPRECATEDLANGS[][4] = { +/* deprecated new */ + "iw", "he", + "ji", "yi", + "in", "id" +}; + +/* +* ------------------------------------------------- +* +* These ultag_ functions may be exposed as APIs later +* +* ------------------------------------------------- +*/ + +static ULanguageTag* +ultag_parse(const char* tag, int32_t tagLen, int32_t* parsedLen, UErrorCode* status); + +static void +ultag_close(ULanguageTag* langtag); + +static const char* +ultag_getLanguage(const ULanguageTag* langtag); + +#if 0 +static const char* +ultag_getJDKLanguage(const ULanguageTag* langtag); +#endif + +static const char* +ultag_getExtlang(const ULanguageTag* langtag, int32_t idx); + +static int32_t +ultag_getExtlangSize(const ULanguageTag* langtag); + +static const char* +ultag_getScript(const ULanguageTag* langtag); + +static const char* +ultag_getRegion(const ULanguageTag* langtag); + +static const char* +ultag_getVariant(const ULanguageTag* langtag, int32_t idx); + +static int32_t +ultag_getVariantsSize(const ULanguageTag* langtag); + +static const char* +ultag_getExtensionKey(const ULanguageTag* langtag, int32_t idx); + +static const char* +ultag_getExtensionValue(const ULanguageTag* langtag, int32_t idx); + +static int32_t +ultag_getExtensionsSize(const ULanguageTag* langtag); + +static const char* +ultag_getPrivateUse(const ULanguageTag* langtag); + +#if 0 +static const char* +ultag_getGrandfathered(const ULanguageTag* langtag); +#endif + +/* +* ------------------------------------------------- +* +* Language subtag syntax validation functions +* +* ------------------------------------------------- +*/ + +static UBool +_isAlphaString(const char* s, int32_t len) { + int32_t i; + for (i = 0; i < len; i++) { + if (!ISALPHA(*(s + i))) { + return FALSE; + } + } + return TRUE; +} + +static UBool +_isNumericString(const char* s, int32_t len) { + int32_t i; + for (i = 0; i < len; i++) { + if (!ISNUMERIC(*(s + i))) { + return FALSE; + } + } + return TRUE; +} + +static UBool +_isAlphaNumericString(const char* s, int32_t len) { + int32_t i; + for (i = 0; i < len; i++) { + if (!ISALPHA(*(s + i)) && !ISNUMERIC(*(s + i))) { + return FALSE; + } + } + return TRUE; +} + +static UBool +_isLanguageSubtag(const char* s, int32_t len) { + /* + * language = 2*3ALPHA ; shortest ISO 639 code + * ["-" extlang] ; sometimes followed by + * ; extended language subtags + * / 4ALPHA ; or reserved for future use + * / 5*8ALPHA ; or registered language subtag + */ + if (len < 0) { + len = (int32_t)uprv_strlen(s); + } + if (len >= 2 && len <= 8 && _isAlphaString(s, len)) { + return TRUE; + } + return FALSE; +} + +static UBool +_isExtlangSubtag(const char* s, int32_t len) { + /* + * extlang = 3ALPHA ; selected ISO 639 codes + * *2("-" 3ALPHA) ; permanently reserved + */ + if (len < 0) { + len = (int32_t)uprv_strlen(s); + } + if (len == 3 && _isAlphaString(s, len)) { + return TRUE; + } + return FALSE; +} + +static UBool +_isScriptSubtag(const char* s, int32_t len) { + /* + * script = 4ALPHA ; ISO 15924 code + */ + if (len < 0) { + len = (int32_t)uprv_strlen(s); + } + if (len == 4 && _isAlphaString(s, len)) { + return TRUE; + } + return FALSE; +} + +static UBool +_isRegionSubtag(const char* s, int32_t len) { + /* + * region = 2ALPHA ; ISO 3166-1 code + * / 3DIGIT ; UN M.49 code + */ + if (len < 0) { + len = (int32_t)uprv_strlen(s); + } + if (len == 2 && _isAlphaString(s, len)) { + return TRUE; + } + if (len == 3 && _isNumericString(s, len)) { + return TRUE; + } + return FALSE; +} + +static UBool +_isVariantSubtag(const char* s, int32_t len) { + /* + * variant = 5*8alphanum ; registered variants + * / (DIGIT 3alphanum) + */ + if (len < 0) { + len = (int32_t)uprv_strlen(s); + } + if (len >= 5 && len <= 8 && _isAlphaNumericString(s, len)) { + return TRUE; + } + if (len == 4 && ISNUMERIC(*s) && _isAlphaNumericString(s + 1, 3)) { + return TRUE; + } + return FALSE; +} + +static UBool +_isPrivateuseVariantSubtag(const char* s, int32_t len) { + /* + * variant = 1*8alphanum ; registered variants + * / (DIGIT 3alphanum) + */ + if (len < 0) { + len = (int32_t)uprv_strlen(s); + } + if (len >= 1 && len <= 8 && _isAlphaNumericString(s, len)) { + return TRUE; + } + return FALSE; +} + +static UBool +_isExtensionSingleton(const char* s, int32_t len) { + /* + * extension = singleton 1*("-" (2*8alphanum)) + */ + if (len < 0) { + len = (int32_t)uprv_strlen(s); + } + if (len == 1 && ISALPHA(*s) && (uprv_tolower(*s) != PRIVATEUSE)) { + return TRUE; + } + return FALSE; +} + +static UBool +_isExtensionSubtag(const char* s, int32_t len) { + /* + * extension = singleton 1*("-" (2*8alphanum)) + */ + if (len < 0) { + len = (int32_t)uprv_strlen(s); + } + if (len >= 2 && len <= 8 && _isAlphaNumericString(s, len)) { + return TRUE; + } + return FALSE; +} + +static UBool +_isExtensionSubtags(const char* s, int32_t len) { + const char *p = s; + const char *pSubtag = NULL; + + if (len < 0) { + len = (int32_t)uprv_strlen(s); + } + + while ((p - s) < len) { + if (*p == SEP) { + if (pSubtag == NULL) { + return FALSE; + } + if (!_isExtensionSubtag(pSubtag, (int32_t)(p - pSubtag))) { + return FALSE; + } + pSubtag = NULL; + } else if (pSubtag == NULL) { + pSubtag = p; + } + p++; + } + if (pSubtag == NULL) { + return FALSE; + } + return _isExtensionSubtag(pSubtag, (int32_t)(p - pSubtag)); +} + +static UBool +_isPrivateuseValueSubtag(const char* s, int32_t len) { + /* + * privateuse = "x" 1*("-" (1*8alphanum)) + */ + if (len < 0) { + len = (int32_t)uprv_strlen(s); + } + if (len >= 1 && len <= 8 && _isAlphaNumericString(s, len)) { + return TRUE; + } + return FALSE; +} + +static UBool +_isPrivateuseValueSubtags(const char* s, int32_t len) { + const char *p = s; + const char *pSubtag = NULL; + + if (len < 0) { + len = (int32_t)uprv_strlen(s); + } + + while ((p - s) < len) { + if (*p == SEP) { + if (pSubtag == NULL) { + return FALSE; + } + if (!_isPrivateuseValueSubtag(pSubtag, (int32_t)(p - pSubtag))) { + return FALSE; + } + pSubtag = NULL; + } else if (pSubtag == NULL) { + pSubtag = p; + } + p++; + } + if (pSubtag == NULL) { + return FALSE; + } + return _isPrivateuseValueSubtag(pSubtag, (int32_t)(p - pSubtag)); +} + +U_CFUNC UBool +ultag_isUnicodeLocaleKey(const char* s, int32_t len) { + if (len < 0) { + len = (int32_t)uprv_strlen(s); + } + if (len == 2 && _isAlphaNumericString(s, len)) { + return TRUE; + } + return FALSE; +} + +U_CFUNC UBool +ultag_isUnicodeLocaleType(const char*s, int32_t len) { + const char* p; + int32_t subtagLen = 0; + + if (len < 0) { + len = (int32_t)uprv_strlen(s); + } + + for (p = s; len > 0; p++, len--) { + if (*p == SEP) { + if (subtagLen < 3) { + return FALSE; + } + subtagLen = 0; + } else if (ISALPHA(*p) || ISNUMERIC(*p)) { + subtagLen++; + if (subtagLen > 8) { + return FALSE; + } + } else { + return FALSE; + } + } + + return (subtagLen >= 3); +} +/* +* ------------------------------------------------- +* +* Helper functions +* +* ------------------------------------------------- +*/ + +static UBool +_addVariantToList(VariantListEntry **first, VariantListEntry *var) { + UBool bAdded = TRUE; + + if (*first == NULL) { + var->next = NULL; + *first = var; + } else { + VariantListEntry *prev, *cur; + int32_t cmp; + + /* variants order should be preserved */ + prev = NULL; + cur = *first; + while (TRUE) { + if (cur == NULL) { + prev->next = var; + var->next = NULL; + break; + } + + /* Checking for duplicate variant */ + cmp = uprv_compareInvCharsAsAscii(var->variant, cur->variant); + if (cmp == 0) { + /* duplicated variant */ + bAdded = FALSE; + break; + } + prev = cur; + cur = cur->next; + } + } + + return bAdded; +} + +static UBool +_addAttributeToList(AttributeListEntry **first, AttributeListEntry *attr) { + UBool bAdded = TRUE; + + if (*first == NULL) { + attr->next = NULL; + *first = attr; + } else { + AttributeListEntry *prev, *cur; + int32_t cmp; + + /* reorder variants in alphabetical order */ + prev = NULL; + cur = *first; + while (TRUE) { + if (cur == NULL) { + prev->next = attr; + attr->next = NULL; + break; + } + cmp = uprv_compareInvCharsAsAscii(attr->attribute, cur->attribute); + if (cmp < 0) { + if (prev == NULL) { + *first = attr; + } else { + prev->next = attr; + } + attr->next = cur; + break; + } + if (cmp == 0) { + /* duplicated variant */ + bAdded = FALSE; + break; + } + prev = cur; + cur = cur->next; + } + } + + return bAdded; +} + + +static UBool +_addExtensionToList(ExtensionListEntry **first, ExtensionListEntry *ext, UBool localeToBCP) { + UBool bAdded = TRUE; + + if (*first == NULL) { + ext->next = NULL; + *first = ext; + } else { + ExtensionListEntry *prev, *cur; + int32_t cmp; + + /* reorder variants in alphabetical order */ + prev = NULL; + cur = *first; + while (TRUE) { + if (cur == NULL) { + prev->next = ext; + ext->next = NULL; + break; + } + if (localeToBCP) { + /* special handling for locale to bcp conversion */ + int32_t len, curlen; + + len = (int32_t)uprv_strlen(ext->key); + curlen = (int32_t)uprv_strlen(cur->key); + + if (len == 1 && curlen == 1) { + if (*(ext->key) == *(cur->key)) { + cmp = 0; + } else if (*(ext->key) == PRIVATEUSE) { + cmp = 1; + } else if (*(cur->key) == PRIVATEUSE) { + cmp = -1; + } else { + cmp = *(ext->key) - *(cur->key); + } + } else if (len == 1) { + cmp = *(ext->key) - LDMLEXT; + } else if (curlen == 1) { + cmp = LDMLEXT - *(cur->key); + } else { + cmp = uprv_compareInvCharsAsAscii(ext->key, cur->key); + /* Both are u extension keys - we need special handling for 'attribute' */ + if (cmp != 0) { + if (uprv_strcmp(cur->key, LOCALE_ATTRIBUTE_KEY) == 0) { + cmp = 1; + } else if (uprv_strcmp(ext->key, LOCALE_ATTRIBUTE_KEY) == 0) { + cmp = -1; + } + } + } + } else { + cmp = uprv_compareInvCharsAsAscii(ext->key, cur->key); + } + if (cmp < 0) { + if (prev == NULL) { + *first = ext; + } else { + prev->next = ext; + } + ext->next = cur; + break; + } + if (cmp == 0) { + /* duplicated extension key */ + bAdded = FALSE; + break; + } + prev = cur; + cur = cur->next; + } + } + + return bAdded; +} + +static void +_initializeULanguageTag(ULanguageTag* langtag) { + int32_t i; + + langtag->buf = NULL; + + langtag->language = EMPTY; + for (i = 0; i < MAXEXTLANG; i++) { + langtag->extlang[i] = NULL; + } + + langtag->script = EMPTY; + langtag->region = EMPTY; + + langtag->variants = NULL; + langtag->extensions = NULL; + + langtag->grandfathered = EMPTY; + langtag->privateuse = EMPTY; +} + +static int32_t +_appendLanguageToLanguageTag(const char* localeID, char* appendAt, int32_t capacity, UBool strict, UErrorCode* status) { + char buf[ULOC_LANG_CAPACITY]; + UErrorCode tmpStatus = U_ZERO_ERROR; + int32_t len, i; + int32_t reslen = 0; + + if (U_FAILURE(*status)) { + return 0; + } + + len = uloc_getLanguage(localeID, buf, sizeof(buf), &tmpStatus); + if (U_FAILURE(tmpStatus) || tmpStatus == U_STRING_NOT_TERMINATED_WARNING) { + if (strict) { + *status = U_ILLEGAL_ARGUMENT_ERROR; + return 0; + } + len = 0; + } + + /* Note: returned language code is in lower case letters */ + + if (len == 0) { + if (reslen < capacity) { + uprv_memcpy(appendAt + reslen, LANG_UND, uprv_min(LANG_UND_LEN, capacity - reslen)); + } + reslen += LANG_UND_LEN; + } else if (!_isLanguageSubtag(buf, len)) { + /* invalid language code */ + if (strict) { + *status = U_ILLEGAL_ARGUMENT_ERROR; + return 0; + } + if (reslen < capacity) { + uprv_memcpy(appendAt + reslen, LANG_UND, uprv_min(LANG_UND_LEN, capacity - reslen)); + } + reslen += LANG_UND_LEN; + } else { + /* resolve deprecated */ + for (i = 0; i < UPRV_LENGTHOF(DEPRECATEDLANGS); i += 2) { + if (uprv_compareInvCharsAsAscii(buf, DEPRECATEDLANGS[i]) == 0) { + uprv_strcpy(buf, DEPRECATEDLANGS[i + 1]); + len = (int32_t)uprv_strlen(buf); + break; + } + } + if (reslen < capacity) { + uprv_memcpy(appendAt + reslen, buf, uprv_min(len, capacity - reslen)); + } + reslen += len; + } + u_terminateChars(appendAt, capacity, reslen, status); + return reslen; +} + +static int32_t +_appendScriptToLanguageTag(const char* localeID, char* appendAt, int32_t capacity, UBool strict, UErrorCode* status) { + char buf[ULOC_SCRIPT_CAPACITY]; + UErrorCode tmpStatus = U_ZERO_ERROR; + int32_t len; + int32_t reslen = 0; + + if (U_FAILURE(*status)) { + return 0; + } + + len = uloc_getScript(localeID, buf, sizeof(buf), &tmpStatus); + if (U_FAILURE(tmpStatus) || tmpStatus == U_STRING_NOT_TERMINATED_WARNING) { + if (strict) { + *status = U_ILLEGAL_ARGUMENT_ERROR; + } + return 0; + } + + if (len > 0) { + if (!_isScriptSubtag(buf, len)) { + /* invalid script code */ + if (strict) { + *status = U_ILLEGAL_ARGUMENT_ERROR; + } + return 0; + } else { + if (reslen < capacity) { + *(appendAt + reslen) = SEP; + } + reslen++; + + if (reslen < capacity) { + uprv_memcpy(appendAt + reslen, buf, uprv_min(len, capacity - reslen)); + } + reslen += len; + } + } + u_terminateChars(appendAt, capacity, reslen, status); + return reslen; +} + +static int32_t +_appendRegionToLanguageTag(const char* localeID, char* appendAt, int32_t capacity, UBool strict, UErrorCode* status) { + char buf[ULOC_COUNTRY_CAPACITY]; + UErrorCode tmpStatus = U_ZERO_ERROR; + int32_t len; + int32_t reslen = 0; + + if (U_FAILURE(*status)) { + return 0; + } + + len = uloc_getCountry(localeID, buf, sizeof(buf), &tmpStatus); + if (U_FAILURE(tmpStatus) || tmpStatus == U_STRING_NOT_TERMINATED_WARNING) { + if (strict) { + *status = U_ILLEGAL_ARGUMENT_ERROR; + } + return 0; + } + + if (len > 0) { + if (!_isRegionSubtag(buf, len)) { + /* invalid region code */ + if (strict) { + *status = U_ILLEGAL_ARGUMENT_ERROR; + } + return 0; + } else { + if (reslen < capacity) { + *(appendAt + reslen) = SEP; + } + reslen++; + + if (reslen < capacity) { + uprv_memcpy(appendAt + reslen, buf, uprv_min(len, capacity - reslen)); + } + reslen += len; + } + } + u_terminateChars(appendAt, capacity, reslen, status); + return reslen; +} + +static int32_t +_appendVariantsToLanguageTag(const char* localeID, char* appendAt, int32_t capacity, UBool strict, UBool *hadPosix, UErrorCode* status) { + char buf[ULOC_FULLNAME_CAPACITY]; + UErrorCode tmpStatus = U_ZERO_ERROR; + int32_t len, i; + int32_t reslen = 0; + + if (U_FAILURE(*status)) { + return 0; + } + + len = uloc_getVariant(localeID, buf, sizeof(buf), &tmpStatus); + if (U_FAILURE(tmpStatus) || tmpStatus == U_STRING_NOT_TERMINATED_WARNING) { + if (strict) { + *status = U_ILLEGAL_ARGUMENT_ERROR; + } + return 0; + } + + if (len > 0) { + char *p, *pVar; + UBool bNext = TRUE; + VariantListEntry *var; + VariantListEntry *varFirst = NULL; + + pVar = NULL; + p = buf; + while (bNext) { + if (*p == SEP || *p == LOCALE_SEP || *p == 0) { + if (*p == 0) { + bNext = FALSE; + } else { + *p = 0; /* terminate */ + } + if (pVar == NULL) { + if (strict) { + *status = U_ILLEGAL_ARGUMENT_ERROR; + break; + } + /* ignore empty variant */ + } else { + /* ICU uses upper case letters for variants, but + the canonical format is lowercase in BCP47 */ + for (i = 0; *(pVar + i) != 0; i++) { + *(pVar + i) = uprv_tolower(*(pVar + i)); + } + + /* validate */ + if (_isVariantSubtag(pVar, -1)) { + if (uprv_strcmp(pVar,POSIX_VALUE) || len != (int32_t)uprv_strlen(POSIX_VALUE)) { + /* emit the variant to the list */ + var = (VariantListEntry*)uprv_malloc(sizeof(VariantListEntry)); + if (var == NULL) { + *status = U_MEMORY_ALLOCATION_ERROR; + break; + } + var->variant = pVar; + if (!_addVariantToList(&varFirst, var)) { + /* duplicated variant */ + uprv_free(var); + if (strict) { + *status = U_ILLEGAL_ARGUMENT_ERROR; + break; + } + } + } else { + /* Special handling for POSIX variant, need to remember that we had it and then */ + /* treat it like an extension later. */ + *hadPosix = TRUE; + } + } else if (strict) { + *status = U_ILLEGAL_ARGUMENT_ERROR; + break; + } else if (_isPrivateuseValueSubtag(pVar, -1)) { + /* Handle private use subtags separately */ + break; + } + } + /* reset variant starting position */ + pVar = NULL; + } else if (pVar == NULL) { + pVar = p; + } + p++; + } + + if (U_SUCCESS(*status)) { + if (varFirst != NULL) { + int32_t varLen; + + /* write out validated/normalized variants to the target */ + var = varFirst; + while (var != NULL) { + if (reslen < capacity) { + *(appendAt + reslen) = SEP; + } + reslen++; + varLen = (int32_t)uprv_strlen(var->variant); + if (reslen < capacity) { + uprv_memcpy(appendAt + reslen, var->variant, uprv_min(varLen, capacity - reslen)); + } + reslen += varLen; + var = var->next; + } + } + } + + /* clean up */ + var = varFirst; + while (var != NULL) { + VariantListEntry *tmpVar = var->next; + uprv_free(var); + var = tmpVar; + } + + if (U_FAILURE(*status)) { + return 0; + } + } + + u_terminateChars(appendAt, capacity, reslen, status); + return reslen; +} + +static int32_t +_appendKeywordsToLanguageTag(const char* localeID, char* appendAt, int32_t capacity, UBool strict, UBool hadPosix, UErrorCode* status) { + char buf[ULOC_KEYWORD_AND_VALUES_CAPACITY]; + char attrBuf[ULOC_KEYWORD_AND_VALUES_CAPACITY] = { 0 }; + int32_t attrBufLength = 0; + UEnumeration *keywordEnum = NULL; + int32_t reslen = 0; + + keywordEnum = uloc_openKeywords(localeID, status); + if (U_FAILURE(*status) && !hadPosix) { + uenum_close(keywordEnum); + return 0; + } + if (keywordEnum != NULL || hadPosix) { + /* reorder extensions */ + int32_t len; + const char *key; + ExtensionListEntry *firstExt = NULL; + ExtensionListEntry *ext; + AttributeListEntry *firstAttr = NULL; + AttributeListEntry *attr; + char *attrValue; + char extBuf[ULOC_KEYWORD_AND_VALUES_CAPACITY]; + char *pExtBuf = extBuf; + int32_t extBufCapacity = sizeof(extBuf); + const char *bcpKey=nullptr, *bcpValue=nullptr; + UErrorCode tmpStatus = U_ZERO_ERROR; + int32_t keylen; + UBool isBcpUExt; + + while (TRUE) { + key = uenum_next(keywordEnum, NULL, status); + if (key == NULL) { + break; + } + len = uloc_getKeywordValue(localeID, key, buf, sizeof(buf), &tmpStatus); + /* buf must be null-terminated */ + if (U_FAILURE(tmpStatus) || tmpStatus == U_STRING_NOT_TERMINATED_WARNING) { + if (strict) { + *status = U_ILLEGAL_ARGUMENT_ERROR; + break; + } + /* ignore this keyword */ + tmpStatus = U_ZERO_ERROR; + continue; + } + + keylen = (int32_t)uprv_strlen(key); + isBcpUExt = (keylen > 1); + + /* special keyword used for representing Unicode locale attributes */ + if (uprv_strcmp(key, LOCALE_ATTRIBUTE_KEY) == 0) { + if (len > 0) { + int32_t i = 0; + while (TRUE) { + attrBufLength = 0; + for (; i < len; i++) { + if (buf[i] != '-') { + attrBuf[attrBufLength++] = buf[i]; + } else { + i++; + break; + } + } + if (attrBufLength > 0) { + attrBuf[attrBufLength] = 0; + + } else if (i >= len){ + break; + } + + /* create AttributeListEntry */ + attr = (AttributeListEntry*)uprv_malloc(sizeof(AttributeListEntry)); + if (attr == NULL) { + *status = U_MEMORY_ALLOCATION_ERROR; + break; + } + attrValue = (char*)uprv_malloc(attrBufLength + 1); + if (attrValue == NULL) { + *status = U_MEMORY_ALLOCATION_ERROR; + break; + } + uprv_strcpy(attrValue, attrBuf); + attr->attribute = attrValue; + + if (!_addAttributeToList(&firstAttr, attr)) { + uprv_free(attr); + uprv_free(attrValue); + if (strict) { + *status = U_ILLEGAL_ARGUMENT_ERROR; + break; + } + } + } + /* for a place holder ExtensionListEntry */ + bcpKey = LOCALE_ATTRIBUTE_KEY; + bcpValue = NULL; + } + } else if (isBcpUExt) { + bcpKey = uloc_toUnicodeLocaleKey(key); + if (bcpKey == NULL) { + if (strict) { + *status = U_ILLEGAL_ARGUMENT_ERROR; + break; + } + continue; + } + + /* we've checked buf is null-terminated above */ + bcpValue = uloc_toUnicodeLocaleType(key, buf); + if (bcpValue == NULL) { + if (strict) { + *status = U_ILLEGAL_ARGUMENT_ERROR; + break; + } + continue; + } + if (bcpValue == buf) { + /* + When uloc_toUnicodeLocaleType(key, buf) returns the + input value as is, the value is well-formed, but has + no known mapping. This implementation normalizes the + the value to lower case + */ + int32_t bcpValueLen = static_cast(uprv_strlen(bcpValue)); + if (bcpValueLen < extBufCapacity) { + uprv_strcpy(pExtBuf, bcpValue); + T_CString_toLowerCase(pExtBuf); + + bcpValue = pExtBuf; + + pExtBuf += (bcpValueLen + 1); + extBufCapacity -= (bcpValueLen + 1); + } else { + if (strict) { + *status = U_ILLEGAL_ARGUMENT_ERROR; + break; + } + continue; + } + } + } else { + if (*key == PRIVATEUSE) { + if (!_isPrivateuseValueSubtags(buf, len)) { + if (strict) { + *status = U_ILLEGAL_ARGUMENT_ERROR; + break; + } + continue; + } + } else { + if (!_isExtensionSingleton(key, keylen) || !_isExtensionSubtags(buf, len)) { + if (strict) { + *status = U_ILLEGAL_ARGUMENT_ERROR; + break; + } + continue; + } + } + bcpKey = key; + if ((len + 1) < extBufCapacity) { + uprv_memcpy(pExtBuf, buf, len); + bcpValue = pExtBuf; + + pExtBuf += len; + + *pExtBuf = 0; + pExtBuf++; + + extBufCapacity -= (len + 1); + } else { + *status = U_ILLEGAL_ARGUMENT_ERROR; + break; + } + } + + /* create ExtensionListEntry */ + ext = (ExtensionListEntry*)uprv_malloc(sizeof(ExtensionListEntry)); + if (ext == NULL) { + *status = U_MEMORY_ALLOCATION_ERROR; + break; + } + ext->key = bcpKey; + ext->value = bcpValue; + + if (!_addExtensionToList(&firstExt, ext, TRUE)) { + uprv_free(ext); + if (strict) { + *status = U_ILLEGAL_ARGUMENT_ERROR; + break; + } + } + } + + /* Special handling for POSIX variant - add the keywords for POSIX */ + if (hadPosix) { + /* create ExtensionListEntry for POSIX */ + ext = (ExtensionListEntry*)uprv_malloc(sizeof(ExtensionListEntry)); + if (ext == NULL) { + *status = U_MEMORY_ALLOCATION_ERROR; + goto cleanup; + } + ext->key = POSIX_KEY; + ext->value = POSIX_VALUE; + + if (!_addExtensionToList(&firstExt, ext, TRUE)) { + uprv_free(ext); + } + } + + if (U_SUCCESS(*status) && (firstExt != NULL || firstAttr != NULL)) { + UBool startLDMLExtension = FALSE; + for (ext = firstExt; ext; ext = ext->next) { + if (!startLDMLExtension && uprv_strlen(ext->key) > 1) { + /* first LDML u singlton extension */ + if (reslen < capacity) { + *(appendAt + reslen) = SEP; + } + reslen++; + if (reslen < capacity) { + *(appendAt + reslen) = LDMLEXT; + } + reslen++; + + startLDMLExtension = TRUE; + } + + /* write out the sorted BCP47 attributes, extensions and private use */ + if (uprv_strcmp(ext->key, LOCALE_ATTRIBUTE_KEY) == 0) { + /* write the value for the attributes */ + for (attr = firstAttr; attr; attr = attr->next) { + if (reslen < capacity) { + *(appendAt + reslen) = SEP; + } + reslen++; + len = (int32_t)uprv_strlen(attr->attribute); + if (reslen < capacity) { + uprv_memcpy(appendAt + reslen, attr->attribute, uprv_min(len, capacity - reslen)); + } + reslen += len; + } + } else { + if (reslen < capacity) { + *(appendAt + reslen) = SEP; + } + reslen++; + len = (int32_t)uprv_strlen(ext->key); + if (reslen < capacity) { + uprv_memcpy(appendAt + reslen, ext->key, uprv_min(len, capacity - reslen)); + } + reslen += len; + if (reslen < capacity) { + *(appendAt + reslen) = SEP; + } + reslen++; + len = (int32_t)uprv_strlen(ext->value); + if (reslen < capacity) { + uprv_memcpy(appendAt + reslen, ext->value, uprv_min(len, capacity - reslen)); + } + reslen += len; + } + } + } +cleanup: + /* clean up */ + ext = firstExt; + while (ext != NULL) { + ExtensionListEntry *tmpExt = ext->next; + uprv_free(ext); + ext = tmpExt; + } + + attr = firstAttr; + while (attr != NULL) { + AttributeListEntry *tmpAttr = attr->next; + char *pValue = (char *)attr->attribute; + uprv_free(pValue); + uprv_free(attr); + attr = tmpAttr; + } + + uenum_close(keywordEnum); + + if (U_FAILURE(*status)) { + return 0; + } + } + + return u_terminateChars(appendAt, capacity, reslen, status); +} + +/** + * Append keywords parsed from LDML extension value + * e.g. "u-ca-gregory-co-trad" -> {calendar = gregorian} {collation = traditional} + * Note: char* buf is used for storing keywords + */ +static void +_appendLDMLExtensionAsKeywords(const char* ldmlext, ExtensionListEntry** appendTo, char* buf, int32_t bufSize, UBool *posixVariant, UErrorCode *status) { + const char *pTag; /* beginning of current subtag */ + const char *pKwds; /* beginning of key-type pairs */ + UBool variantExists = *posixVariant; + + ExtensionListEntry *kwdFirst = NULL; /* first LDML keyword */ + ExtensionListEntry *kwd, *nextKwd; + + AttributeListEntry *attrFirst = NULL; /* first attribute */ + AttributeListEntry *attr, *nextAttr; + + int32_t len; + int32_t bufIdx = 0; + + char attrBuf[ULOC_KEYWORD_AND_VALUES_CAPACITY]; + int32_t attrBufIdx = 0; + + /* Reset the posixVariant value */ + *posixVariant = FALSE; + + pTag = ldmlext; + pKwds = NULL; + + /* Iterate through u extension attributes */ + while (*pTag) { + /* locate next separator char */ + for (len = 0; *(pTag + len) && *(pTag + len) != SEP; len++); + + if (ultag_isUnicodeLocaleKey(pTag, len)) { + pKwds = pTag; + break; + } + + /* add this attribute to the list */ + attr = (AttributeListEntry*)uprv_malloc(sizeof(AttributeListEntry)); + if (attr == NULL) { + *status = U_MEMORY_ALLOCATION_ERROR; + goto cleanup; + } + + if (len < (int32_t)sizeof(attrBuf) - attrBufIdx) { + uprv_memcpy(&attrBuf[attrBufIdx], pTag, len); + attrBuf[attrBufIdx + len] = 0; + attr->attribute = &attrBuf[attrBufIdx]; + attrBufIdx += (len + 1); + } else { + *status = U_ILLEGAL_ARGUMENT_ERROR; + goto cleanup; + } + + if (!_addAttributeToList(&attrFirst, attr)) { + *status = U_ILLEGAL_ARGUMENT_ERROR; + uprv_free(attr); + goto cleanup; + } + + /* next tag */ + pTag += len; + if (*pTag) { + /* next to the separator */ + pTag++; + } + } + + if (attrFirst) { + /* emit attributes as an LDML keyword, e.g. attribute=attr1-attr2 */ + + if (attrBufIdx > bufSize) { + /* attrBufIdx == + 1 */ + *status = U_ILLEGAL_ARGUMENT_ERROR; + goto cleanup; + } + + kwd = (ExtensionListEntry*)uprv_malloc(sizeof(ExtensionListEntry)); + if (kwd == NULL) { + *status = U_MEMORY_ALLOCATION_ERROR; + goto cleanup; + } + + kwd->key = LOCALE_ATTRIBUTE_KEY; + kwd->value = buf; + + /* attribute subtags sorted in alphabetical order as type */ + attr = attrFirst; + while (attr != NULL) { + nextAttr = attr->next; + + /* buffer size check is done above */ + if (attr != attrFirst) { + *(buf + bufIdx) = SEP; + bufIdx++; + } + + len = static_cast(uprv_strlen(attr->attribute)); + uprv_memcpy(buf + bufIdx, attr->attribute, len); + bufIdx += len; + + attr = nextAttr; + } + *(buf + bufIdx) = 0; + bufIdx++; + + if (!_addExtensionToList(&kwdFirst, kwd, FALSE)) { + *status = U_ILLEGAL_ARGUMENT_ERROR; + uprv_free(kwd); + goto cleanup; + } + + /* once keyword entry is created, delete the attribute list */ + attr = attrFirst; + while (attr != NULL) { + nextAttr = attr->next; + uprv_free(attr); + attr = nextAttr; + } + attrFirst = NULL; + } + + if (pKwds) { + const char *pBcpKey = NULL; /* u extenstion key subtag */ + const char *pBcpType = NULL; /* beginning of u extension type subtag(s) */ + int32_t bcpKeyLen = 0; + int32_t bcpTypeLen = 0; + UBool isDone = FALSE; + + pTag = pKwds; + /* BCP47 representation of LDML key/type pairs */ + while (!isDone) { + const char *pNextBcpKey = NULL; + int32_t nextBcpKeyLen = 0; + UBool emitKeyword = FALSE; + + if (*pTag) { + /* locate next separator char */ + for (len = 0; *(pTag + len) && *(pTag + len) != SEP; len++); + + if (ultag_isUnicodeLocaleKey(pTag, len)) { + if (pBcpKey) { + emitKeyword = TRUE; + pNextBcpKey = pTag; + nextBcpKeyLen = len; + } else { + pBcpKey = pTag; + bcpKeyLen = len; + } + } else { + U_ASSERT(pBcpKey != NULL); + /* within LDML type subtags */ + if (pBcpType) { + bcpTypeLen += (len + 1); + } else { + pBcpType = pTag; + bcpTypeLen = len; + } + } + + /* next tag */ + pTag += len; + if (*pTag) { + /* next to the separator */ + pTag++; + } + } else { + /* processing last one */ + emitKeyword = TRUE; + isDone = TRUE; + } + + if (emitKeyword) { + const char *pKey = NULL; /* LDML key */ + const char *pType = NULL; /* LDML type */ + + char bcpKeyBuf[9]; /* BCP key length is always 2 for now */ + + U_ASSERT(pBcpKey != NULL); + + if (bcpKeyLen >= (int32_t)sizeof(bcpKeyBuf)) { + /* the BCP key is invalid */ + *status = U_ILLEGAL_ARGUMENT_ERROR; + goto cleanup; + } + + uprv_strncpy(bcpKeyBuf, pBcpKey, bcpKeyLen); + bcpKeyBuf[bcpKeyLen] = 0; + + /* u extension key to LDML key */ + pKey = uloc_toLegacyKey(bcpKeyBuf); + if (pKey == NULL) { + *status = U_ILLEGAL_ARGUMENT_ERROR; + goto cleanup; + } + if (pKey == bcpKeyBuf) { + /* + The key returned by toLegacyKey points to the input buffer. + We normalize the result key to lower case. + */ + T_CString_toLowerCase(bcpKeyBuf); + if (bufSize - bufIdx - 1 >= bcpKeyLen) { + uprv_memcpy(buf + bufIdx, bcpKeyBuf, bcpKeyLen); + pKey = buf + bufIdx; + bufIdx += bcpKeyLen; + *(buf + bufIdx) = 0; + bufIdx++; + } else { + *status = U_BUFFER_OVERFLOW_ERROR; + goto cleanup; + } + } + + if (pBcpType) { + char bcpTypeBuf[128]; /* practically long enough even considering multiple subtag type */ + if (bcpTypeLen >= (int32_t)sizeof(bcpTypeBuf)) { + /* the BCP type is too long */ + *status = U_ILLEGAL_ARGUMENT_ERROR; + goto cleanup; + } + + uprv_strncpy(bcpTypeBuf, pBcpType, bcpTypeLen); + bcpTypeBuf[bcpTypeLen] = 0; + + /* BCP type to locale type */ + pType = uloc_toLegacyType(pKey, bcpTypeBuf); + if (pType == NULL) { + *status = U_ILLEGAL_ARGUMENT_ERROR; + goto cleanup; + } + if (pType == bcpTypeBuf) { + /* + The type returned by toLegacyType points to the input buffer. + We normalize the result type to lower case. + */ + /* normalize to lower case */ + T_CString_toLowerCase(bcpTypeBuf); + if (bufSize - bufIdx - 1 >= bcpTypeLen) { + uprv_memcpy(buf + bufIdx, bcpTypeBuf, bcpTypeLen); + pType = buf + bufIdx; + bufIdx += bcpTypeLen; + *(buf + bufIdx) = 0; + bufIdx++; + } else { + *status = U_BUFFER_OVERFLOW_ERROR; + goto cleanup; + } + } + } else { + /* typeless - default type value is "yes" */ + pType = LOCALE_TYPE_YES; + } + + /* Special handling for u-va-posix, since we want to treat this as a variant, + not as a keyword */ + if (!variantExists && !uprv_strcmp(pKey, POSIX_KEY) && !uprv_strcmp(pType, POSIX_VALUE) ) { + *posixVariant = TRUE; + } else { + /* create an ExtensionListEntry for this keyword */ + kwd = (ExtensionListEntry*)uprv_malloc(sizeof(ExtensionListEntry)); + if (kwd == NULL) { + *status = U_MEMORY_ALLOCATION_ERROR; + goto cleanup; + } + + kwd->key = pKey; + kwd->value = pType; + + if (!_addExtensionToList(&kwdFirst, kwd, FALSE)) { + *status = U_ILLEGAL_ARGUMENT_ERROR; + uprv_free(kwd); + goto cleanup; + } + } + + pBcpKey = pNextBcpKey; + bcpKeyLen = pNextBcpKey != NULL ? nextBcpKeyLen : 0; + pBcpType = NULL; + bcpTypeLen = 0; + } + } + } + + kwd = kwdFirst; + while (kwd != NULL) { + nextKwd = kwd->next; + _addExtensionToList(appendTo, kwd, FALSE); + kwd = nextKwd; + } + + return; + +cleanup: + attr = attrFirst; + while (attr != NULL) { + nextAttr = attr->next; + uprv_free(attr); + attr = nextAttr; + } + + kwd = kwdFirst; + while (kwd != NULL) { + nextKwd = kwd->next; + uprv_free(kwd); + kwd = nextKwd; + } +} + + +static int32_t +_appendKeywords(ULanguageTag* langtag, char* appendAt, int32_t capacity, UErrorCode* status) { + int32_t reslen = 0; + int32_t i, n; + int32_t len; + ExtensionListEntry *kwdFirst = NULL; + ExtensionListEntry *kwd; + const char *key, *type; + char *kwdBuf = NULL; + int32_t kwdBufLength = capacity; + UBool posixVariant = FALSE; + + if (U_FAILURE(*status)) { + return 0; + } + + kwdBuf = (char*)uprv_malloc(kwdBufLength); + if (kwdBuf == NULL) { + *status = U_MEMORY_ALLOCATION_ERROR; + return 0; + } + + /* Determine if variants already exists */ + if (ultag_getVariantsSize(langtag)) { + posixVariant = TRUE; + } + + n = ultag_getExtensionsSize(langtag); + + /* resolve locale keywords and reordering keys */ + for (i = 0; i < n; i++) { + key = ultag_getExtensionKey(langtag, i); + type = ultag_getExtensionValue(langtag, i); + if (*key == LDMLEXT) { + _appendLDMLExtensionAsKeywords(type, &kwdFirst, kwdBuf, kwdBufLength, &posixVariant, status); + if (U_FAILURE(*status)) { + break; + } + } else { + kwd = (ExtensionListEntry*)uprv_malloc(sizeof(ExtensionListEntry)); + if (kwd == NULL) { + *status = U_MEMORY_ALLOCATION_ERROR; + break; + } + kwd->key = key; + kwd->value = type; + if (!_addExtensionToList(&kwdFirst, kwd, FALSE)) { + uprv_free(kwd); + *status = U_ILLEGAL_ARGUMENT_ERROR; + break; + } + } + } + + if (U_SUCCESS(*status)) { + type = ultag_getPrivateUse(langtag); + if ((int32_t)uprv_strlen(type) > 0) { + /* add private use as a keyword */ + kwd = (ExtensionListEntry*)uprv_malloc(sizeof(ExtensionListEntry)); + if (kwd == NULL) { + *status = U_MEMORY_ALLOCATION_ERROR; + } else { + kwd->key = PRIVATEUSE_KEY; + kwd->value = type; + if (!_addExtensionToList(&kwdFirst, kwd, FALSE)) { + uprv_free(kwd); + *status = U_ILLEGAL_ARGUMENT_ERROR; + } + } + } + } + + /* If a POSIX variant was in the extensions, write it out before writing the keywords. */ + + if (U_SUCCESS(*status) && posixVariant) { + len = (int32_t) uprv_strlen(_POSIX); + if (reslen < capacity) { + uprv_memcpy(appendAt + reslen, _POSIX, uprv_min(len, capacity - reslen)); + } + reslen += len; + } + + if (U_SUCCESS(*status) && kwdFirst != NULL) { + /* write out the sorted keywords */ + UBool firstValue = TRUE; + kwd = kwdFirst; + do { + if (reslen < capacity) { + if (firstValue) { + /* '@' */ + *(appendAt + reslen) = LOCALE_EXT_SEP; + firstValue = FALSE; + } else { + /* ';' */ + *(appendAt + reslen) = LOCALE_KEYWORD_SEP; + } + } + reslen++; + + /* key */ + len = (int32_t)uprv_strlen(kwd->key); + if (reslen < capacity) { + uprv_memcpy(appendAt + reslen, kwd->key, uprv_min(len, capacity - reslen)); + } + reslen += len; + + /* '=' */ + if (reslen < capacity) { + *(appendAt + reslen) = LOCALE_KEY_TYPE_SEP; + } + reslen++; + + /* type */ + len = (int32_t)uprv_strlen(kwd->value); + if (reslen < capacity) { + uprv_memcpy(appendAt + reslen, kwd->value, uprv_min(len, capacity - reslen)); + } + reslen += len; + + kwd = kwd->next; + } while (kwd); + } + + /* clean up */ + kwd = kwdFirst; + while (kwd != NULL) { + ExtensionListEntry *tmpKwd = kwd->next; + uprv_free(kwd); + kwd = tmpKwd; + } + + uprv_free(kwdBuf); + + if (U_FAILURE(*status)) { + return 0; + } + + return u_terminateChars(appendAt, capacity, reslen, status); +} + +static int32_t +_appendPrivateuseToLanguageTag(const char* localeID, char* appendAt, int32_t capacity, UBool strict, UBool hadPosix, UErrorCode* status) { + (void)hadPosix; + char buf[ULOC_FULLNAME_CAPACITY]; + char tmpAppend[ULOC_FULLNAME_CAPACITY]; + UErrorCode tmpStatus = U_ZERO_ERROR; + int32_t len, i; + int32_t reslen = 0; + + if (U_FAILURE(*status)) { + return 0; + } + + len = uloc_getVariant(localeID, buf, sizeof(buf), &tmpStatus); + if (U_FAILURE(tmpStatus) || tmpStatus == U_STRING_NOT_TERMINATED_WARNING) { + if (strict) { + *status = U_ILLEGAL_ARGUMENT_ERROR; + } + return 0; + } + + if (len > 0) { + char *p, *pPriv; + UBool bNext = TRUE; + UBool firstValue = TRUE; + UBool writeValue; + + pPriv = NULL; + p = buf; + while (bNext) { + writeValue = FALSE; + if (*p == SEP || *p == LOCALE_SEP || *p == 0) { + if (*p == 0) { + bNext = FALSE; + } else { + *p = 0; /* terminate */ + } + if (pPriv != NULL) { + /* Private use in the canonical format is lowercase in BCP47 */ + for (i = 0; *(pPriv + i) != 0; i++) { + *(pPriv + i) = uprv_tolower(*(pPriv + i)); + } + + /* validate */ + if (_isPrivateuseValueSubtag(pPriv, -1)) { + if (firstValue) { + if (!_isVariantSubtag(pPriv, -1)) { + writeValue = TRUE; + } + } else { + writeValue = TRUE; + } + } else if (strict) { + *status = U_ILLEGAL_ARGUMENT_ERROR; + break; + } else { + break; + } + + if (writeValue) { + if (reslen < capacity) { + tmpAppend[reslen++] = SEP; + } + + if (firstValue) { + if (reslen < capacity) { + tmpAppend[reslen++] = *PRIVATEUSE_KEY; + } + + if (reslen < capacity) { + tmpAppend[reslen++] = SEP; + } + + len = (int32_t)uprv_strlen(PRIVUSE_VARIANT_PREFIX); + if (reslen < capacity) { + uprv_memcpy(tmpAppend + reslen, PRIVUSE_VARIANT_PREFIX, uprv_min(len, capacity - reslen)); + } + reslen += len; + + if (reslen < capacity) { + tmpAppend[reslen++] = SEP; + } + + firstValue = FALSE; + } + + len = (int32_t)uprv_strlen(pPriv); + if (reslen < capacity) { + uprv_memcpy(tmpAppend + reslen, pPriv, uprv_min(len, capacity - reslen)); + } + reslen += len; + } + } + /* reset private use starting position */ + pPriv = NULL; + } else if (pPriv == NULL) { + pPriv = p; + } + p++; + } + + if (U_FAILURE(*status)) { + return 0; + } + } + + if (U_SUCCESS(*status)) { + len = reslen; + if (reslen < capacity) { + uprv_memcpy(appendAt, tmpAppend, uprv_min(len, capacity - reslen)); + } + } + + u_terminateChars(appendAt, capacity, reslen, status); + + return reslen; +} + +/* +* ------------------------------------------------- +* +* ultag_ functions +* +* ------------------------------------------------- +*/ + +/* Bit flags used by the parser */ +#define LANG 0x0001 +#define EXTL 0x0002 +#define SCRT 0x0004 +#define REGN 0x0008 +#define VART 0x0010 +#define EXTS 0x0020 +#define EXTV 0x0040 +#define PRIV 0x0080 + +/** + * Ticket #12705 - Visual Studio 2015 Update 3 contains a new code optimizer which has problems optimizing + * this function. (See https://blogs.msdn.microsoft.com/vcblog/2016/05/04/new-code-optimizer/ ) + * As a workaround, we will turn off optimization just for this function on VS2015 Update 3 and above. + */ +#if (defined(_MSC_VER) && (_MSC_VER >= 1900) && defined(_MSC_FULL_VER) && (_MSC_FULL_VER >= 190024210)) +#pragma optimize( "", off ) +#endif + +static ULanguageTag* +ultag_parse(const char* tag, int32_t tagLen, int32_t* parsedLen, UErrorCode* status) { + ULanguageTag *t; + char *tagBuf; + int16_t next; + char *pSubtag, *pNext, *pLastGoodPosition; + int32_t subtagLen; + int32_t extlangIdx; + ExtensionListEntry *pExtension; + char *pExtValueSubtag, *pExtValueSubtagEnd; + int32_t i; + UBool privateuseVar = FALSE; + int32_t grandfatheredLen = 0; + + if (parsedLen != NULL) { + *parsedLen = 0; + } + + if (U_FAILURE(*status)) { + return NULL; + } + + if (tagLen < 0) { + tagLen = (int32_t)uprv_strlen(tag); + } + + /* copy the entire string */ + tagBuf = (char*)uprv_malloc(tagLen + 1); + if (tagBuf == NULL) { + *status = U_MEMORY_ALLOCATION_ERROR; + return NULL; + } + uprv_memcpy(tagBuf, tag, tagLen); + *(tagBuf + tagLen) = 0; + + /* create a ULanguageTag */ + t = (ULanguageTag*)uprv_malloc(sizeof(ULanguageTag)); + if (t == NULL) { + uprv_free(tagBuf); + *status = U_MEMORY_ALLOCATION_ERROR; + return NULL; + } + _initializeULanguageTag(t); + t->buf = tagBuf; + + if (tagLen < MINLEN) { + /* the input tag is too short - return empty ULanguageTag */ + return t; + } + + /* check if the tag is grandfathered */ + for (i = 0; GRANDFATHERED[i] != NULL; i += 2) { + if (uprv_stricmp(GRANDFATHERED[i], tagBuf) == 0) { + int32_t newTagLength; + + grandfatheredLen = tagLen; /* back up for output parsedLen */ + newTagLength = static_cast(uprv_strlen(GRANDFATHERED[i+1])); + if (tagLen < newTagLength) { + uprv_free(tagBuf); + tagBuf = (char*)uprv_malloc(newTagLength + 1); + if (tagBuf == NULL) { + *status = U_MEMORY_ALLOCATION_ERROR; + ultag_close(t); + return NULL; + } + t->buf = tagBuf; + tagLen = newTagLength; + } + uprv_strcpy(t->buf, GRANDFATHERED[i + 1]); + break; + } + } + + /* + * langtag = language + * ["-" script] + * ["-" region] + * *("-" variant) + * *("-" extension) + * ["-" privateuse] + */ + + next = LANG | PRIV; + pNext = pLastGoodPosition = tagBuf; + extlangIdx = 0; + pExtension = NULL; + pExtValueSubtag = NULL; + pExtValueSubtagEnd = NULL; + + while (pNext) { + char *pSep; + + pSubtag = pNext; + + /* locate next separator char */ + pSep = pSubtag; + while (*pSep) { + if (*pSep == SEP) { + break; + } + pSep++; + } + if (*pSep == 0) { + /* last subtag */ + pNext = NULL; + } else { + pNext = pSep + 1; + } + subtagLen = (int32_t)(pSep - pSubtag); + + if (next & LANG) { + if (_isLanguageSubtag(pSubtag, subtagLen)) { + *pSep = 0; /* terminate */ + t->language = T_CString_toLowerCase(pSubtag); + + pLastGoodPosition = pSep; + next = EXTL | SCRT | REGN | VART | EXTS | PRIV; + continue; + } + } + if (next & EXTL) { + if (_isExtlangSubtag(pSubtag, subtagLen)) { + *pSep = 0; + t->extlang[extlangIdx++] = T_CString_toLowerCase(pSubtag); + + pLastGoodPosition = pSep; + if (extlangIdx < 3) { + next = EXTL | SCRT | REGN | VART | EXTS | PRIV; + } else { + next = SCRT | REGN | VART | EXTS | PRIV; + } + continue; + } + } + if (next & SCRT) { + if (_isScriptSubtag(pSubtag, subtagLen)) { + char *p = pSubtag; + + *pSep = 0; + + /* to title case */ + *p = uprv_toupper(*p); + p++; + for (; *p; p++) { + *p = uprv_tolower(*p); + } + + t->script = pSubtag; + + pLastGoodPosition = pSep; + next = REGN | VART | EXTS | PRIV; + continue; + } + } + if (next & REGN) { + if (_isRegionSubtag(pSubtag, subtagLen)) { + *pSep = 0; + t->region = T_CString_toUpperCase(pSubtag); + + pLastGoodPosition = pSep; + next = VART | EXTS | PRIV; + continue; + } + } + if (next & VART) { + if (_isVariantSubtag(pSubtag, subtagLen) || + (privateuseVar && _isPrivateuseVariantSubtag(pSubtag, subtagLen))) { + VariantListEntry *var; + UBool isAdded; + + var = (VariantListEntry*)uprv_malloc(sizeof(VariantListEntry)); + if (var == NULL) { + *status = U_MEMORY_ALLOCATION_ERROR; + goto error; + } + *pSep = 0; + var->variant = T_CString_toUpperCase(pSubtag); + isAdded = _addVariantToList(&(t->variants), var); + if (!isAdded) { + /* duplicated variant entry */ + uprv_free(var); + break; + } + pLastGoodPosition = pSep; + next = VART | EXTS | PRIV; + continue; + } + } + if (next & EXTS) { + if (_isExtensionSingleton(pSubtag, subtagLen)) { + if (pExtension != NULL) { + if (pExtValueSubtag == NULL || pExtValueSubtagEnd == NULL) { + /* the previous extension is incomplete */ + uprv_free(pExtension); + pExtension = NULL; + break; + } + + /* terminate the previous extension value */ + *pExtValueSubtagEnd = 0; + pExtension->value = T_CString_toLowerCase(pExtValueSubtag); + + /* insert the extension to the list */ + if (_addExtensionToList(&(t->extensions), pExtension, FALSE)) { + pLastGoodPosition = pExtValueSubtagEnd; + } else { + /* stop parsing here */ + uprv_free(pExtension); + pExtension = NULL; + break; + } + } + + /* create a new extension */ + pExtension = (ExtensionListEntry*)uprv_malloc(sizeof(ExtensionListEntry)); + if (pExtension == NULL) { + *status = U_MEMORY_ALLOCATION_ERROR; + goto error; + } + *pSep = 0; + pExtension->key = T_CString_toLowerCase(pSubtag); + pExtension->value = NULL; /* will be set later */ + + /* + * reset the start and the end location of extension value + * subtags for this extension + */ + pExtValueSubtag = NULL; + pExtValueSubtagEnd = NULL; + + next = EXTV; + continue; + } + } + if (next & EXTV) { + if (_isExtensionSubtag(pSubtag, subtagLen)) { + if (pExtValueSubtag == NULL) { + /* if the start postion of this extension's value is not yet, + this one is the first value subtag */ + pExtValueSubtag = pSubtag; + } + + /* Mark the end of this subtag */ + pExtValueSubtagEnd = pSep; + next = EXTS | EXTV | PRIV; + + continue; + } + } + if (next & PRIV) { + if (uprv_tolower(*pSubtag) == PRIVATEUSE) { + char *pPrivuseVal; + + if (pExtension != NULL) { + /* Process the last extension */ + if (pExtValueSubtag == NULL || pExtValueSubtagEnd == NULL) { + /* the previous extension is incomplete */ + uprv_free(pExtension); + pExtension = NULL; + break; + } else { + /* terminate the previous extension value */ + *pExtValueSubtagEnd = 0; + pExtension->value = T_CString_toLowerCase(pExtValueSubtag); + + /* insert the extension to the list */ + if (_addExtensionToList(&(t->extensions), pExtension, FALSE)) { + pLastGoodPosition = pExtValueSubtagEnd; + pExtension = NULL; + } else { + /* stop parsing here */ + uprv_free(pExtension); + pExtension = NULL; + break; + } + } + } + + /* The rest of part will be private use value subtags */ + if (pNext == NULL) { + /* empty private use subtag */ + break; + } + /* back up the private use value start position */ + pPrivuseVal = pNext; + + /* validate private use value subtags */ + while (pNext) { + pSubtag = pNext; + pSep = pSubtag; + while (*pSep) { + if (*pSep == SEP) { + break; + } + pSep++; + } + if (*pSep == 0) { + /* last subtag */ + pNext = NULL; + } else { + pNext = pSep + 1; + } + subtagLen = (int32_t)(pSep - pSubtag); + + if (uprv_strncmp(pSubtag, PRIVUSE_VARIANT_PREFIX, uprv_strlen(PRIVUSE_VARIANT_PREFIX)) == 0) { + *pSep = 0; + next = VART; + privateuseVar = TRUE; + break; + } else if (_isPrivateuseValueSubtag(pSubtag, subtagLen)) { + pLastGoodPosition = pSep; + } else { + break; + } + } + + if (next == VART) { + continue; + } + + if (pLastGoodPosition - pPrivuseVal > 0) { + *pLastGoodPosition = 0; + t->privateuse = T_CString_toLowerCase(pPrivuseVal); + } + /* No more subtags, exiting the parse loop */ + break; + } + break; + } + + /* If we fell through here, it means this subtag is illegal - quit parsing */ + break; + } + + if (pExtension != NULL) { + /* Process the last extension */ + if (pExtValueSubtag == NULL || pExtValueSubtagEnd == NULL) { + /* the previous extension is incomplete */ + uprv_free(pExtension); + } else { + /* terminate the previous extension value */ + *pExtValueSubtagEnd = 0; + pExtension->value = T_CString_toLowerCase(pExtValueSubtag); + /* insert the extension to the list */ + if (_addExtensionToList(&(t->extensions), pExtension, FALSE)) { + pLastGoodPosition = pExtValueSubtagEnd; + } else { + uprv_free(pExtension); + } + } + } + + if (parsedLen != NULL) { + *parsedLen = (grandfatheredLen > 0) ? grandfatheredLen : (int32_t)(pLastGoodPosition - t->buf); + } + + return t; + +error: + ultag_close(t); + return NULL; +} + +/** +* Ticket #12705 - Turn optimization back on. +*/ +#if (defined(_MSC_VER) && (_MSC_VER >= 1900) && defined(_MSC_FULL_VER) && (_MSC_FULL_VER >= 190024210)) +#pragma optimize( "", on ) +#endif + +static void +ultag_close(ULanguageTag* langtag) { + + if (langtag == NULL) { + return; + } + + uprv_free(langtag->buf); + + if (langtag->variants) { + VariantListEntry *curVar = langtag->variants; + while (curVar) { + VariantListEntry *nextVar = curVar->next; + uprv_free(curVar); + curVar = nextVar; + } + } + + if (langtag->extensions) { + ExtensionListEntry *curExt = langtag->extensions; + while (curExt) { + ExtensionListEntry *nextExt = curExt->next; + uprv_free(curExt); + curExt = nextExt; + } + } + + uprv_free(langtag); +} + +static const char* +ultag_getLanguage(const ULanguageTag* langtag) { + return langtag->language; +} + +#if 0 +static const char* +ultag_getJDKLanguage(const ULanguageTag* langtag) { + int32_t i; + for (i = 0; DEPRECATEDLANGS[i] != NULL; i += 2) { + if (uprv_compareInvCharsAsAscii(DEPRECATEDLANGS[i], langtag->language) == 0) { + return DEPRECATEDLANGS[i + 1]; + } + } + return langtag->language; +} +#endif + +static const char* +ultag_getExtlang(const ULanguageTag* langtag, int32_t idx) { + if (idx >= 0 && idx < MAXEXTLANG) { + return langtag->extlang[idx]; + } + return NULL; +} + +static int32_t +ultag_getExtlangSize(const ULanguageTag* langtag) { + int32_t size = 0; + int32_t i; + for (i = 0; i < MAXEXTLANG; i++) { + if (langtag->extlang[i]) { + size++; + } + } + return size; +} + +static const char* +ultag_getScript(const ULanguageTag* langtag) { + return langtag->script; +} + +static const char* +ultag_getRegion(const ULanguageTag* langtag) { + return langtag->region; +} + +static const char* +ultag_getVariant(const ULanguageTag* langtag, int32_t idx) { + const char *var = NULL; + VariantListEntry *cur = langtag->variants; + int32_t i = 0; + while (cur) { + if (i == idx) { + var = cur->variant; + break; + } + cur = cur->next; + i++; + } + return var; +} + +static int32_t +ultag_getVariantsSize(const ULanguageTag* langtag) { + int32_t size = 0; + VariantListEntry *cur = langtag->variants; + while (TRUE) { + if (cur == NULL) { + break; + } + size++; + cur = cur->next; + } + return size; +} + +static const char* +ultag_getExtensionKey(const ULanguageTag* langtag, int32_t idx) { + const char *key = NULL; + ExtensionListEntry *cur = langtag->extensions; + int32_t i = 0; + while (cur) { + if (i == idx) { + key = cur->key; + break; + } + cur = cur->next; + i++; + } + return key; +} + +static const char* +ultag_getExtensionValue(const ULanguageTag* langtag, int32_t idx) { + const char *val = NULL; + ExtensionListEntry *cur = langtag->extensions; + int32_t i = 0; + while (cur) { + if (i == idx) { + val = cur->value; + break; + } + cur = cur->next; + i++; + } + return val; +} + +static int32_t +ultag_getExtensionsSize(const ULanguageTag* langtag) { + int32_t size = 0; + ExtensionListEntry *cur = langtag->extensions; + while (TRUE) { + if (cur == NULL) { + break; + } + size++; + cur = cur->next; + } + return size; +} + +static const char* +ultag_getPrivateUse(const ULanguageTag* langtag) { + return langtag->privateuse; +} + +#if 0 +static const char* +ultag_getGrandfathered(const ULanguageTag* langtag) { + return langtag->grandfathered; +} +#endif + + +/* +* ------------------------------------------------- +* +* Locale/BCP47 conversion APIs, exposed as uloc_* +* +* ------------------------------------------------- +*/ +U_CAPI int32_t U_EXPORT2 +uloc_toLanguageTag(const char* localeID, + char* langtag, + int32_t langtagCapacity, + UBool strict, + UErrorCode* status) { + /* char canonical[ULOC_FULLNAME_CAPACITY]; */ /* See #6822 */ + char canonical[256]; + int32_t reslen = 0; + UErrorCode tmpStatus = U_ZERO_ERROR; + UBool hadPosix = FALSE; + const char* pKeywordStart; + + /* Note: uloc_canonicalize returns "en_US_POSIX" for input locale ID "". See #6835 */ + canonical[0] = 0; + if (uprv_strlen(localeID) > 0) { + uloc_canonicalize(localeID, canonical, sizeof(canonical), &tmpStatus); + if (tmpStatus != U_ZERO_ERROR) { + *status = U_ILLEGAL_ARGUMENT_ERROR; + return 0; + } + } + + /* For handling special case - private use only tag */ + pKeywordStart = locale_getKeywordsStart(canonical); + if (pKeywordStart == canonical) { + UEnumeration *kwdEnum; + int kwdCnt = 0; + UBool done = FALSE; + + kwdEnum = uloc_openKeywords((const char*)canonical, &tmpStatus); + if (kwdEnum != NULL) { + kwdCnt = uenum_count(kwdEnum, &tmpStatus); + if (kwdCnt == 1) { + const char *key; + int32_t len = 0; + + key = uenum_next(kwdEnum, &len, &tmpStatus); + if (len == 1 && *key == PRIVATEUSE) { + char buf[ULOC_KEYWORD_AND_VALUES_CAPACITY]; + buf[0] = PRIVATEUSE; + buf[1] = SEP; + len = uloc_getKeywordValue(localeID, key, &buf[2], sizeof(buf) - 2, &tmpStatus); + if (U_SUCCESS(tmpStatus)) { + if (_isPrivateuseValueSubtags(&buf[2], len)) { + /* return private use only tag */ + reslen = len + 2; + uprv_memcpy(langtag, buf, uprv_min(reslen, langtagCapacity)); + u_terminateChars(langtag, langtagCapacity, reslen, status); + done = TRUE; + } else if (strict) { + *status = U_ILLEGAL_ARGUMENT_ERROR; + done = TRUE; + } + /* if not strict mode, then "und" will be returned */ + } else { + *status = U_ILLEGAL_ARGUMENT_ERROR; + done = TRUE; + } + } + } + uenum_close(kwdEnum); + if (done) { + return reslen; + } + } + } + + reslen += _appendLanguageToLanguageTag(canonical, langtag, langtagCapacity, strict, status); + reslen += _appendScriptToLanguageTag(canonical, langtag + reslen, langtagCapacity - reslen, strict, status); + reslen += _appendRegionToLanguageTag(canonical, langtag + reslen, langtagCapacity - reslen, strict, status); + reslen += _appendVariantsToLanguageTag(canonical, langtag + reslen, langtagCapacity - reslen, strict, &hadPosix, status); + reslen += _appendKeywordsToLanguageTag(canonical, langtag + reslen, langtagCapacity - reslen, strict, hadPosix, status); + reslen += _appendPrivateuseToLanguageTag(canonical, langtag + reslen, langtagCapacity - reslen, strict, hadPosix, status); + + return reslen; +} + + +U_CAPI int32_t U_EXPORT2 +uloc_forLanguageTag(const char* langtag, + char* localeID, + int32_t localeIDCapacity, + int32_t* parsedLength, + UErrorCode* status) { + ULanguageTag *lt; + int32_t reslen = 0; + const char *subtag, *p; + int32_t len; + int32_t i, n; + UBool noRegion = TRUE; + + lt = ultag_parse(langtag, -1, parsedLength, status); + if (U_FAILURE(*status)) { + return 0; + } + + /* language */ + subtag = ultag_getExtlangSize(lt) > 0 ? ultag_getExtlang(lt, 0) : ultag_getLanguage(lt); + if (uprv_compareInvCharsAsAscii(subtag, LANG_UND) != 0) { + len = (int32_t)uprv_strlen(subtag); + if (len > 0) { + if (reslen < localeIDCapacity) { + uprv_memcpy(localeID, subtag, uprv_min(len, localeIDCapacity - reslen)); + } + reslen += len; + } + } + + /* script */ + subtag = ultag_getScript(lt); + len = (int32_t)uprv_strlen(subtag); + if (len > 0) { + if (reslen < localeIDCapacity) { + *(localeID + reslen) = LOCALE_SEP; + } + reslen++; + + /* write out the script in title case */ + p = subtag; + while (*p) { + if (reslen < localeIDCapacity) { + if (p == subtag) { + *(localeID + reslen) = uprv_toupper(*p); + } else { + *(localeID + reslen) = *p; + } + } + reslen++; + p++; + } + } + + /* region */ + subtag = ultag_getRegion(lt); + len = (int32_t)uprv_strlen(subtag); + if (len > 0) { + if (reslen < localeIDCapacity) { + *(localeID + reslen) = LOCALE_SEP; + } + reslen++; + /* write out the retion in upper case */ + p = subtag; + while (*p) { + if (reslen < localeIDCapacity) { + *(localeID + reslen) = uprv_toupper(*p); + } + reslen++; + p++; + } + noRegion = FALSE; + } + + /* variants */ + n = ultag_getVariantsSize(lt); + if (n > 0) { + if (noRegion) { + if (reslen < localeIDCapacity) { + *(localeID + reslen) = LOCALE_SEP; + } + reslen++; + } + + for (i = 0; i < n; i++) { + subtag = ultag_getVariant(lt, i); + if (reslen < localeIDCapacity) { + *(localeID + reslen) = LOCALE_SEP; + } + reslen++; + /* write out the variant in upper case */ + p = subtag; + while (*p) { + if (reslen < localeIDCapacity) { + *(localeID + reslen) = uprv_toupper(*p); + } + reslen++; + p++; + } + } + } + + /* keywords */ + n = ultag_getExtensionsSize(lt); + subtag = ultag_getPrivateUse(lt); + if (n > 0 || uprv_strlen(subtag) > 0) { + if (reslen == 0 && n > 0) { + /* need a language */ + if (reslen < localeIDCapacity) { + uprv_memcpy(localeID + reslen, LANG_UND, uprv_min(LANG_UND_LEN, localeIDCapacity - reslen)); + } + reslen += LANG_UND_LEN; + } + len = _appendKeywords(lt, localeID + reslen, localeIDCapacity - reslen, status); + reslen += len; + } + + ultag_close(lt); + return u_terminateChars(localeID, localeIDCapacity, reslen, status); +} + + diff --git a/Build/source/libs/icu/icu-src/source/common/ulocimp.h b/Build/source/libs/icu/icu-src/source/common/ulocimp.h index f54e216eb7b..869f296d022 100644 --- a/Build/source/libs/icu/icu-src/source/common/ulocimp.h +++ b/Build/source/libs/icu/icu-src/source/common/ulocimp.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** diff --git a/Build/source/libs/icu/icu-src/source/common/umapfile.c b/Build/source/libs/icu/icu-src/source/common/umapfile.c deleted file mode 100644 index d5d2033e415..00000000000 --- a/Build/source/libs/icu/icu-src/source/common/umapfile.c +++ /dev/null @@ -1,466 +0,0 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. -// License & terms of use: http://www.unicode.org/copyright.html -/* -****************************************************************************** -* -* Copyright (C) 1999-2013, International Business Machines -* Corporation and others. All Rights Reserved. -* -******************************************************************************/ - - -/*---------------------------------------------------------------------------- - * - * Memory mapped file wrappers for use by the ICU Data Implementation - * All of the platform-specific implementation for mapping data files - * is here. The rest of the ICU Data implementation uses only the - * wrapper functions. - * - *----------------------------------------------------------------------------*/ -/* Defines _XOPEN_SOURCE for access to POSIX functions. - * Must be before any other #includes. */ -#include "uposixdefs.h" - -#include "unicode/putil.h" -#include "udatamem.h" -#include "umapfile.h" - -/* memory-mapping base definitions ------------------------------------------ */ - -#if MAP_IMPLEMENTATION==MAP_WIN32 -# define WIN32_LEAN_AND_MEAN -# define VC_EXTRALEAN -# define NOUSER -# define NOSERVICE -# define NOIME -# define NOMCX -# include -# include "cmemory.h" - - typedef HANDLE MemoryMap; - -# define IS_MAP(map) ((map)!=NULL) -#elif MAP_IMPLEMENTATION==MAP_POSIX || MAP_IMPLEMENTATION==MAP_390DLL - typedef size_t MemoryMap; - -# define IS_MAP(map) ((map)!=0) - -# include -# include -# include -# include - -# ifndef MAP_FAILED -# define MAP_FAILED ((void*)-1) -# endif - -# if MAP_IMPLEMENTATION==MAP_390DLL - /* No memory mapping for 390 batch mode. Fake it using dll loading. */ -# include -# include "cstring.h" -# include "cmemory.h" -# include "unicode/udata.h" -# define LIB_PREFIX "lib" -# define LIB_SUFFIX ".dll" - /* This is inconvienient until we figure out what to do with U_ICUDATA_NAME in utypes.h */ -# define U_ICUDATA_ENTRY_NAME "icudt" U_ICU_VERSION_SHORT U_LIB_SUFFIX_C_NAME_STRING "_dat" -# endif -#elif MAP_IMPLEMENTATION==MAP_STDIO -# include -# include "cmemory.h" - - typedef void *MemoryMap; - -# define IS_MAP(map) ((map)!=NULL) -#endif - -/*----------------------------------------------------------------------------* - * * - * Memory Mapped File support. Platform dependent implementation of * - * functions used by the rest of the implementation.* - * * - *----------------------------------------------------------------------------*/ -#if MAP_IMPLEMENTATION==MAP_NONE - U_CFUNC UBool - uprv_mapFile(UDataMemory *pData, const char *path) { - UDataMemory_init(pData); /* Clear the output struct. */ - return FALSE; /* no file access */ - } - - U_CFUNC void uprv_unmapFile(UDataMemory *pData) { - /* nothing to do */ - } -#elif MAP_IMPLEMENTATION==MAP_WIN32 - U_CFUNC UBool - uprv_mapFile( - UDataMemory *pData, /* Fill in with info on the result doing the mapping. */ - /* Output only; any original contents are cleared. */ - const char *path /* File path to be opened/mapped */ - ) - { - HANDLE map; - HANDLE file; - SECURITY_ATTRIBUTES mappingAttributes; - SECURITY_ATTRIBUTES *mappingAttributesPtr = NULL; - SECURITY_DESCRIPTOR securityDesc; - - UDataMemory_init(pData); /* Clear the output struct. */ - - /* open the input file */ - file=CreateFileA(path, GENERIC_READ, FILE_SHARE_READ, NULL, - OPEN_EXISTING, - FILE_ATTRIBUTE_NORMAL|FILE_FLAG_RANDOM_ACCESS, NULL); - if(file==INVALID_HANDLE_VALUE) { - return FALSE; - } - - /* Declare and initialize a security descriptor. - This is required for multiuser systems on Windows 2000 SP4 and beyond */ - if (InitializeSecurityDescriptor(&securityDesc, SECURITY_DESCRIPTOR_REVISION)) { - /* give the security descriptor a Null Dacl done using the "TRUE, (PACL)NULL" here */ - if (SetSecurityDescriptorDacl(&securityDesc, TRUE, (PACL)NULL, FALSE)) { - /* Make the security attributes point to the security descriptor */ - uprv_memset(&mappingAttributes, 0, sizeof(mappingAttributes)); - mappingAttributes.nLength = sizeof(mappingAttributes); - mappingAttributes.lpSecurityDescriptor = &securityDesc; - mappingAttributes.bInheritHandle = FALSE; /* object uninheritable */ - mappingAttributesPtr = &mappingAttributes; - } - } - /* else creating security descriptors can fail when we are on Windows 98, - and mappingAttributesPtr == NULL for that case. */ - - /* create an unnamed Windows file-mapping object for the specified file */ - map=CreateFileMapping(file, mappingAttributesPtr, PAGE_READONLY, 0, 0, NULL); - CloseHandle(file); - if(map==NULL) { - return FALSE; - } - - /* map a view of the file into our address space */ - pData->pHeader=(const DataHeader *)MapViewOfFile(map, FILE_MAP_READ, 0, 0, 0); - if(pData->pHeader==NULL) { - CloseHandle(map); - return FALSE; - } - pData->map=map; - return TRUE; - } - - U_CFUNC void - uprv_unmapFile(UDataMemory *pData) { - if(pData!=NULL && pData->map!=NULL) { - UnmapViewOfFile(pData->pHeader); - CloseHandle(pData->map); - pData->pHeader=NULL; - pData->map=NULL; - } - } - - - -#elif MAP_IMPLEMENTATION==MAP_POSIX - U_CFUNC UBool - uprv_mapFile(UDataMemory *pData, const char *path) { - int fd; - int length; - struct stat mystat; - void *data; - - UDataMemory_init(pData); /* Clear the output struct. */ - - /* determine the length of the file */ - if(stat(path, &mystat)!=0 || mystat.st_size<=0) { - return FALSE; - } - length=mystat.st_size; - - /* open the file */ - fd=open(path, O_RDONLY); - if(fd==-1) { - return FALSE; - } - - /* get a view of the mapping */ -#if U_PLATFORM != U_PF_HPUX - data=mmap(0, length, PROT_READ, MAP_SHARED, fd, 0); -#else - data=mmap(0, length, PROT_READ, MAP_PRIVATE, fd, 0); -#endif - close(fd); /* no longer needed */ - if(data==MAP_FAILED) { - return FALSE; - } - - pData->map = (char *)data + length; - pData->pHeader=(const DataHeader *)data; - pData->mapAddr = data; -#if U_PLATFORM == U_PF_IPHONE - posix_madvise(data, length, POSIX_MADV_RANDOM); -#endif - return TRUE; - } - - U_CFUNC void - uprv_unmapFile(UDataMemory *pData) { - if(pData!=NULL && pData->map!=NULL) { - size_t dataLen = (char *)pData->map - (char *)pData->mapAddr; - if(munmap(pData->mapAddr, dataLen)==-1) { - } - pData->pHeader=NULL; - pData->map=0; - pData->mapAddr=NULL; - } - } - - - -#elif MAP_IMPLEMENTATION==MAP_STDIO - /* copy of the filestrm.c/T_FileStream_size() implementation */ - static int32_t - umap_fsize(FILE *f) { - int32_t savedPos = ftell(f); - int32_t size = 0; - - /*Changes by Bertrand A. D. doesn't affect the current position - goes to the end of the file before ftell*/ - fseek(f, 0, SEEK_END); - size = (int32_t)ftell(f); - fseek(f, savedPos, SEEK_SET); - return size; - } - - U_CFUNC UBool - uprv_mapFile(UDataMemory *pData, const char *path) { - FILE *file; - int32_t fileLength; - void *p; - - UDataMemory_init(pData); /* Clear the output struct. */ - /* open the input file */ - file=fopen(path, "rb"); - if(file==NULL) { - return FALSE; - } - - /* get the file length */ - fileLength=umap_fsize(file); - if(ferror(file) || fileLength<=20) { - fclose(file); - return FALSE; - } - - /* allocate the memory to hold the file data */ - p=uprv_malloc(fileLength); - if(p==NULL) { - fclose(file); - return FALSE; - } - - /* read the file */ - if(fileLength!=fread(p, 1, fileLength, file)) { - uprv_free(p); - fclose(file); - return FALSE; - } - - fclose(file); - pData->map=p; - pData->pHeader=(const DataHeader *)p; - pData->mapAddr=p; - return TRUE; - } - - U_CFUNC void - uprv_unmapFile(UDataMemory *pData) { - if(pData!=NULL && pData->map!=NULL) { - uprv_free(pData->map); - pData->map = NULL; - pData->mapAddr = NULL; - pData->pHeader = NULL; - } - } - - -#elif MAP_IMPLEMENTATION==MAP_390DLL - /* 390 specific Library Loading. - * This is the only platform left that dynamically loads an ICU Data Library. - * All other platforms use .data files when dynamic loading is required, but - * this turn out to be awkward to support in 390 batch mode. - * - * The idea here is to hide the fact that 390 is using dll loading from the - * rest of ICU, and make it look like there is file loading happening. - * - */ - - static char *strcpy_returnEnd(char *dest, const char *src) - { - while((*dest=*src)!=0) { - ++dest; - ++src; - } - return dest; - } - - /*------------------------------------------------------------------------------ - * - * computeDirPath given a user-supplied path of an item to be opened, - * compute and return - * - the full directory path to be used - * when opening the file. - * - Pointer to null at end of above returned path - * - * Parameters: - * path: input path. Buffer is not altered. - * pathBuffer: Output buffer. Any contents are overwritten. - * - * Returns: - * Pointer to null termination in returned pathBuffer. - * - * TODO: This works the way ICU historically has, but the - * whole data fallback search path is so complicated that - * proabably almost no one will ever really understand it, - * the potential for confusion is large. (It's not just - * this one function, but the whole scheme.) - * - *------------------------------------------------------------------------------*/ - static char *uprv_computeDirPath(const char *path, char *pathBuffer) - { - char *finalSlash; /* Ptr to last dir separator in input path, or null if none. */ - int32_t pathLen; /* Length of the returned directory path */ - - finalSlash = 0; - if (path != 0) { - finalSlash = uprv_strrchr(path, U_FILE_SEP_CHAR); - } - - *pathBuffer = 0; - if (finalSlash == 0) { - /* No user-supplied path. - * Copy the ICU_DATA path to the path buffer and return that*/ - const char *icuDataDir; - icuDataDir=u_getDataDirectory(); - if(icuDataDir!=NULL && *icuDataDir!=0) { - return strcpy_returnEnd(pathBuffer, icuDataDir); - } else { - /* there is no icuDataDir either. Just return the empty pathBuffer. */ - return pathBuffer; - } - } - - /* User supplied path did contain a directory portion. - * Copy it to the output path buffer */ - pathLen = (int32_t)(finalSlash - path + 1); - uprv_memcpy(pathBuffer, path, pathLen); - *(pathBuffer+pathLen) = 0; - return pathBuffer+pathLen; - } - - -# define DATA_TYPE "dat" - - U_CFUNC UBool uprv_mapFile(UDataMemory *pData, const char *path) { - const char *inBasename; - char *basename; - char pathBuffer[1024]; - const DataHeader *pHeader; - dllhandle *handle; - void *val=0; - - inBasename=uprv_strrchr(path, U_FILE_SEP_CHAR); - if(inBasename==NULL) { - inBasename = path; - } else { - inBasename++; - } - basename=uprv_computeDirPath(path, pathBuffer); - if(uprv_strcmp(inBasename, U_ICUDATA_NAME".dat") != 0) { - /* must mmap file... for build */ - int fd; - int length; - struct stat mystat; - void *data; - UDataMemory_init(pData); /* Clear the output struct. */ - - /* determine the length of the file */ - if(stat(path, &mystat)!=0 || mystat.st_size<=0) { - return FALSE; - } - length=mystat.st_size; - - /* open the file */ - fd=open(path, O_RDONLY); - if(fd==-1) { - return FALSE; - } - - /* get a view of the mapping */ - data=mmap(0, length, PROT_READ, MAP_PRIVATE, fd, 0); - close(fd); /* no longer needed */ - if(data==MAP_FAILED) { - return FALSE; - } - pData->map = (char *)data + length; - pData->pHeader=(const DataHeader *)data; - pData->mapAddr = data; - return TRUE; - } - -# ifdef OS390BATCH - /* ### hack: we still need to get u_getDataDirectory() fixed - for OS/390 (batch mode - always return "//"? ) - and this here straightened out with LIB_PREFIX and LIB_SUFFIX (both empty?!) - This is probably due to the strange file system on OS/390. It's more like - a database with short entry names than a typical file system. */ - /* U_ICUDATA_NAME should always have the correct name */ - /* BUT FOR BATCH MODE IT IS AN EXCEPTION BECAUSE */ - /* THE FIRST THREE LETTERS ARE PREASSIGNED TO THE */ - /* PROJECT!!!!! */ - uprv_strcpy(pathBuffer, "IXMI" U_ICU_VERSION_SHORT "DA"); -# else - /* set up the library name */ - uprv_strcpy(basename, LIB_PREFIX U_LIBICUDATA_NAME U_ICU_VERSION_SHORT LIB_SUFFIX); -# endif - -# ifdef UDATA_DEBUG - fprintf(stderr, "dllload: %s ", pathBuffer); -# endif - - handle=dllload(pathBuffer); - -# ifdef UDATA_DEBUG - fprintf(stderr, " -> %08X\n", handle ); -# endif - - if(handle != NULL) { - /* we have a data DLL - what kind of lookup do we need here? */ - /* try to find the Table of Contents */ - UDataMemory_init(pData); /* Clear the output struct. */ - val=dllqueryvar((dllhandle*)handle, U_ICUDATA_ENTRY_NAME); - if(val == 0) { - /* failed... so keep looking */ - return FALSE; - } -# ifdef UDATA_DEBUG - fprintf(stderr, "dllqueryvar(%08X, %s) -> %08X\n", handle, U_ICUDATA_ENTRY_NAME, val); -# endif - - pData->pHeader=(const DataHeader *)val; - return TRUE; - } else { - return FALSE; /* no handle */ - } - } - - U_CFUNC void uprv_unmapFile(UDataMemory *pData) { - if(pData!=NULL && pData->map!=NULL) { - uprv_free(pData->map); - pData->map = NULL; - pData->mapAddr = NULL; - pData->pHeader = NULL; - } - } - -#else -# error MAP_IMPLEMENTATION is set incorrectly -#endif diff --git a/Build/source/libs/icu/icu-src/source/common/umapfile.cpp b/Build/source/libs/icu/icu-src/source/common/umapfile.cpp new file mode 100644 index 00000000000..53699e762b2 --- /dev/null +++ b/Build/source/libs/icu/icu-src/source/common/umapfile.cpp @@ -0,0 +1,498 @@ +// © 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html +/* +****************************************************************************** +* +* Copyright (C) 1999-2013, International Business Machines +* Corporation and others. All Rights Reserved. +* +******************************************************************************/ + + +/*---------------------------------------------------------------------------- + * + * Memory mapped file wrappers for use by the ICU Data Implementation + * All of the platform-specific implementation for mapping data files + * is here. The rest of the ICU Data implementation uses only the + * wrapper functions. + * + *----------------------------------------------------------------------------*/ +/* Defines _XOPEN_SOURCE for access to POSIX functions. + * Must be before any other #includes. */ +#include "uposixdefs.h" + +#include "unicode/putil.h" +#include "udatamem.h" +#include "umapfile.h" + +/* memory-mapping base definitions ------------------------------------------ */ + +#if MAP_IMPLEMENTATION==MAP_WIN32 +#ifndef WIN32_LEAN_AND_MEAN +# define WIN32_LEAN_AND_MEAN +#endif +# define VC_EXTRALEAN +# define NOUSER +# define NOSERVICE +# define NOIME +# define NOMCX +# include +# include "cmemory.h" + + typedef HANDLE MemoryMap; + +# define IS_MAP(map) ((map)!=NULL) +#elif MAP_IMPLEMENTATION==MAP_POSIX || MAP_IMPLEMENTATION==MAP_390DLL + typedef size_t MemoryMap; + +# define IS_MAP(map) ((map)!=0) + +# include +# include +# include +# include + +# ifndef MAP_FAILED +# define MAP_FAILED ((void*)-1) +# endif + +# if MAP_IMPLEMENTATION==MAP_390DLL + /* No memory mapping for 390 batch mode. Fake it using dll loading. */ +# include +# include "cstring.h" +# include "cmemory.h" +# include "unicode/udata.h" +# define LIB_PREFIX "lib" +# define LIB_SUFFIX ".dll" + /* This is inconvienient until we figure out what to do with U_ICUDATA_NAME in utypes.h */ +# define U_ICUDATA_ENTRY_NAME "icudt" U_ICU_VERSION_SHORT U_LIB_SUFFIX_C_NAME_STRING "_dat" +# endif +#elif MAP_IMPLEMENTATION==MAP_STDIO +# include +# include "cmemory.h" + + typedef void *MemoryMap; + +# define IS_MAP(map) ((map)!=NULL) +#endif + +/*----------------------------------------------------------------------------* + * * + * Memory Mapped File support. Platform dependent implementation of * + * functions used by the rest of the implementation.* + * * + *----------------------------------------------------------------------------*/ +#if MAP_IMPLEMENTATION==MAP_NONE + U_CFUNC UBool + uprv_mapFile(UDataMemory *pData, const char *path) { + UDataMemory_init(pData); /* Clear the output struct. */ + return FALSE; /* no file access */ + } + + U_CFUNC void uprv_unmapFile(UDataMemory *pData) { + /* nothing to do */ + } +#elif MAP_IMPLEMENTATION==MAP_WIN32 + U_CFUNC UBool + uprv_mapFile( + UDataMemory *pData, /* Fill in with info on the result doing the mapping. */ + /* Output only; any original contents are cleared. */ + const char *path /* File path to be opened/mapped */ + ) + { + HANDLE map; + HANDLE file; + + UDataMemory_init(pData); /* Clear the output struct. */ + + /* open the input file */ +#if U_PLATFORM_HAS_WINUWP_API == 0 + file=CreateFileA(path, GENERIC_READ, FILE_SHARE_READ, NULL, + OPEN_EXISTING, + FILE_ATTRIBUTE_NORMAL|FILE_FLAG_RANDOM_ACCESS, NULL); +#else + // First we need to go from char to UTF-16 + // u_UCharsToChars could work but it requires length. + WCHAR utf16Path[MAX_PATH]; + int32_t i; + for (i = 0; i < UPRV_LENGTHOF(utf16Path); i++) + { + utf16Path[i] = path[i]; + if (path[i] == '\0') + { + break; + } + } + if (i >= UPRV_LENGTHOF(utf16Path)) + { + // Ran out of room, unlikely but be safe + utf16Path[UPRV_LENGTHOF(utf16Path) - 1] = '\0'; + } + + // TODO: Is it worth setting extended parameters to specify random access? + file = CreateFile2(utf16Path, GENERIC_READ, FILE_SHARE_READ, OPEN_EXISTING, NULL); +#endif + if(file==INVALID_HANDLE_VALUE) { + return FALSE; + } + + /* Declare and initialize a security descriptor. + This is required for multiuser systems on Windows 2000 SP4 and beyond */ + // TODO: UWP does not have this function and I do not think it is required? +#if U_PLATFORM_HAS_WINUWP_API == 0 + + SECURITY_ATTRIBUTES mappingAttributes; + SECURITY_ATTRIBUTES *mappingAttributesPtr = NULL; + SECURITY_DESCRIPTOR securityDesc; + + if (InitializeSecurityDescriptor(&securityDesc, SECURITY_DESCRIPTOR_REVISION)) { + /* give the security descriptor a Null Dacl done using the "TRUE, (PACL)NULL" here */ + if (SetSecurityDescriptorDacl(&securityDesc, TRUE, (PACL)NULL, FALSE)) { + /* Make the security attributes point to the security descriptor */ + uprv_memset(&mappingAttributes, 0, sizeof(mappingAttributes)); + mappingAttributes.nLength = sizeof(mappingAttributes); + mappingAttributes.lpSecurityDescriptor = &securityDesc; + mappingAttributes.bInheritHandle = FALSE; /* object uninheritable */ + mappingAttributesPtr = &mappingAttributes; + } + } + /* else creating security descriptors can fail when we are on Windows 98, + and mappingAttributesPtr == NULL for that case. */ + + /* create an unnamed Windows file-mapping object for the specified file */ + map=CreateFileMapping(file, mappingAttributesPtr, PAGE_READONLY, 0, 0, NULL); +#else + map = CreateFileMappingFromApp(file, NULL, PAGE_READONLY, 0, NULL); +#endif + CloseHandle(file); + if(map==NULL) { + return FALSE; + } + + /* map a view of the file into our address space */ + pData->pHeader=(const DataHeader *)MapViewOfFile(map, FILE_MAP_READ, 0, 0, 0); + if(pData->pHeader==NULL) { + CloseHandle(map); + return FALSE; + } + pData->map=map; + return TRUE; + } + + U_CFUNC void + uprv_unmapFile(UDataMemory *pData) { + if(pData!=NULL && pData->map!=NULL) { + UnmapViewOfFile(pData->pHeader); + CloseHandle(pData->map); + pData->pHeader=NULL; + pData->map=NULL; + } + } + + + +#elif MAP_IMPLEMENTATION==MAP_POSIX + U_CFUNC UBool + uprv_mapFile(UDataMemory *pData, const char *path) { + int fd; + int length; + struct stat mystat; + void *data; + + UDataMemory_init(pData); /* Clear the output struct. */ + + /* determine the length of the file */ + if(stat(path, &mystat)!=0 || mystat.st_size<=0) { + return FALSE; + } + length=mystat.st_size; + + /* open the file */ + fd=open(path, O_RDONLY); + if(fd==-1) { + return FALSE; + } + + /* get a view of the mapping */ +#if U_PLATFORM != U_PF_HPUX + data=mmap(0, length, PROT_READ, MAP_SHARED, fd, 0); +#else + data=mmap(0, length, PROT_READ, MAP_PRIVATE, fd, 0); +#endif + close(fd); /* no longer needed */ + if(data==MAP_FAILED) { + return FALSE; + } + + pData->map = (char *)data + length; + pData->pHeader=(const DataHeader *)data; + pData->mapAddr = data; +#if U_PLATFORM == U_PF_IPHONE + posix_madvise(data, length, POSIX_MADV_RANDOM); +#endif + return TRUE; + } + + U_CFUNC void + uprv_unmapFile(UDataMemory *pData) { + if(pData!=NULL && pData->map!=NULL) { + size_t dataLen = (char *)pData->map - (char *)pData->mapAddr; + if(munmap(pData->mapAddr, dataLen)==-1) { + } + pData->pHeader=NULL; + pData->map=0; + pData->mapAddr=NULL; + } + } + + + +#elif MAP_IMPLEMENTATION==MAP_STDIO + /* copy of the filestrm.c/T_FileStream_size() implementation */ + static int32_t + umap_fsize(FILE *f) { + int32_t savedPos = ftell(f); + int32_t size = 0; + + /*Changes by Bertrand A. D. doesn't affect the current position + goes to the end of the file before ftell*/ + fseek(f, 0, SEEK_END); + size = (int32_t)ftell(f); + fseek(f, savedPos, SEEK_SET); + return size; + } + + U_CFUNC UBool + uprv_mapFile(UDataMemory *pData, const char *path) { + FILE *file; + int32_t fileLength; + void *p; + + UDataMemory_init(pData); /* Clear the output struct. */ + /* open the input file */ + file=fopen(path, "rb"); + if(file==NULL) { + return FALSE; + } + + /* get the file length */ + fileLength=umap_fsize(file); + if(ferror(file) || fileLength<=20) { + fclose(file); + return FALSE; + } + + /* allocate the memory to hold the file data */ + p=uprv_malloc(fileLength); + if(p==NULL) { + fclose(file); + return FALSE; + } + + /* read the file */ + if(fileLength!=fread(p, 1, fileLength, file)) { + uprv_free(p); + fclose(file); + return FALSE; + } + + fclose(file); + pData->map=p; + pData->pHeader=(const DataHeader *)p; + pData->mapAddr=p; + return TRUE; + } + + U_CFUNC void + uprv_unmapFile(UDataMemory *pData) { + if(pData!=NULL && pData->map!=NULL) { + uprv_free(pData->map); + pData->map = NULL; + pData->mapAddr = NULL; + pData->pHeader = NULL; + } + } + + +#elif MAP_IMPLEMENTATION==MAP_390DLL + /* 390 specific Library Loading. + * This is the only platform left that dynamically loads an ICU Data Library. + * All other platforms use .data files when dynamic loading is required, but + * this turn out to be awkward to support in 390 batch mode. + * + * The idea here is to hide the fact that 390 is using dll loading from the + * rest of ICU, and make it look like there is file loading happening. + * + */ + + static char *strcpy_returnEnd(char *dest, const char *src) + { + while((*dest=*src)!=0) { + ++dest; + ++src; + } + return dest; + } + + /*------------------------------------------------------------------------------ + * + * computeDirPath given a user-supplied path of an item to be opened, + * compute and return + * - the full directory path to be used + * when opening the file. + * - Pointer to null at end of above returned path + * + * Parameters: + * path: input path. Buffer is not altered. + * pathBuffer: Output buffer. Any contents are overwritten. + * + * Returns: + * Pointer to null termination in returned pathBuffer. + * + * TODO: This works the way ICU historically has, but the + * whole data fallback search path is so complicated that + * proabably almost no one will ever really understand it, + * the potential for confusion is large. (It's not just + * this one function, but the whole scheme.) + * + *------------------------------------------------------------------------------*/ + static char *uprv_computeDirPath(const char *path, char *pathBuffer) + { + char *finalSlash; /* Ptr to last dir separator in input path, or null if none. */ + int32_t pathLen; /* Length of the returned directory path */ + + finalSlash = 0; + if (path != 0) { + finalSlash = uprv_strrchr(path, U_FILE_SEP_CHAR); + } + + *pathBuffer = 0; + if (finalSlash == 0) { + /* No user-supplied path. + * Copy the ICU_DATA path to the path buffer and return that*/ + const char *icuDataDir; + icuDataDir=u_getDataDirectory(); + if(icuDataDir!=NULL && *icuDataDir!=0) { + return strcpy_returnEnd(pathBuffer, icuDataDir); + } else { + /* there is no icuDataDir either. Just return the empty pathBuffer. */ + return pathBuffer; + } + } + + /* User supplied path did contain a directory portion. + * Copy it to the output path buffer */ + pathLen = (int32_t)(finalSlash - path + 1); + uprv_memcpy(pathBuffer, path, pathLen); + *(pathBuffer+pathLen) = 0; + return pathBuffer+pathLen; + } + + +# define DATA_TYPE "dat" + + U_CFUNC UBool uprv_mapFile(UDataMemory *pData, const char *path) { + const char *inBasename; + char *basename; + char pathBuffer[1024]; + const DataHeader *pHeader; + dllhandle *handle; + void *val=0; + + inBasename=uprv_strrchr(path, U_FILE_SEP_CHAR); + if(inBasename==NULL) { + inBasename = path; + } else { + inBasename++; + } + basename=uprv_computeDirPath(path, pathBuffer); + if(uprv_strcmp(inBasename, U_ICUDATA_NAME".dat") != 0) { + /* must mmap file... for build */ + int fd; + int length; + struct stat mystat; + void *data; + UDataMemory_init(pData); /* Clear the output struct. */ + + /* determine the length of the file */ + if(stat(path, &mystat)!=0 || mystat.st_size<=0) { + return FALSE; + } + length=mystat.st_size; + + /* open the file */ + fd=open(path, O_RDONLY); + if(fd==-1) { + return FALSE; + } + + /* get a view of the mapping */ + data=mmap(0, length, PROT_READ, MAP_PRIVATE, fd, 0); + close(fd); /* no longer needed */ + if(data==MAP_FAILED) { + return FALSE; + } + pData->map = (char *)data + length; + pData->pHeader=(const DataHeader *)data; + pData->mapAddr = data; + return TRUE; + } + +# ifdef OS390BATCH + /* ### hack: we still need to get u_getDataDirectory() fixed + for OS/390 (batch mode - always return "//"? ) + and this here straightened out with LIB_PREFIX and LIB_SUFFIX (both empty?!) + This is probably due to the strange file system on OS/390. It's more like + a database with short entry names than a typical file system. */ + /* U_ICUDATA_NAME should always have the correct name */ + /* BUT FOR BATCH MODE IT IS AN EXCEPTION BECAUSE */ + /* THE FIRST THREE LETTERS ARE PREASSIGNED TO THE */ + /* PROJECT!!!!! */ + uprv_strcpy(pathBuffer, "IXMI" U_ICU_VERSION_SHORT "DA"); +# else + /* set up the library name */ + uprv_strcpy(basename, LIB_PREFIX U_LIBICUDATA_NAME U_ICU_VERSION_SHORT LIB_SUFFIX); +# endif + +# ifdef UDATA_DEBUG + fprintf(stderr, "dllload: %s ", pathBuffer); +# endif + + handle=dllload(pathBuffer); + +# ifdef UDATA_DEBUG + fprintf(stderr, " -> %08X\n", handle ); +# endif + + if(handle != NULL) { + /* we have a data DLL - what kind of lookup do we need here? */ + /* try to find the Table of Contents */ + UDataMemory_init(pData); /* Clear the output struct. */ + val=dllqueryvar((dllhandle*)handle, U_ICUDATA_ENTRY_NAME); + if(val == 0) { + /* failed... so keep looking */ + return FALSE; + } +# ifdef UDATA_DEBUG + fprintf(stderr, "dllqueryvar(%08X, %s) -> %08X\n", handle, U_ICUDATA_ENTRY_NAME, val); +# endif + + pData->pHeader=(const DataHeader *)val; + return TRUE; + } else { + return FALSE; /* no handle */ + } + } + + U_CFUNC void uprv_unmapFile(UDataMemory *pData) { + if(pData!=NULL && pData->map!=NULL) { + uprv_free(pData->map); + pData->map = NULL; + pData->mapAddr = NULL; + pData->pHeader = NULL; + } + } + +#else +# error MAP_IMPLEMENTATION is set incorrectly +#endif diff --git a/Build/source/libs/icu/icu-src/source/common/umapfile.h b/Build/source/libs/icu/icu-src/source/common/umapfile.h index 70a6cc5f861..24e476b11e9 100644 --- a/Build/source/libs/icu/icu-src/source/common/umapfile.h +++ b/Build/source/libs/icu/icu-src/source/common/umapfile.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ****************************************************************************** diff --git a/Build/source/libs/icu/icu-src/source/common/umath.c b/Build/source/libs/icu/icu-src/source/common/umath.c deleted file mode 100644 index 78f1ca05c25..00000000000 --- a/Build/source/libs/icu/icu-src/source/common/umath.c +++ /dev/null @@ -1,26 +0,0 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. -// License & terms of use: http://www.unicode.org/copyright.html -/* -****************************************************************************** -* -* Copyright (C) 1997-2006, International Business Machines -* Corporation and others. All Rights Reserved. -* -****************************************************************************** -* This file contains platform independent math. -*/ - -#include "putilimp.h" - -U_CAPI int32_t U_EXPORT2 -uprv_max(int32_t x, int32_t y) -{ - return (x > y ? x : y); -} - -U_CAPI int32_t U_EXPORT2 -uprv_min(int32_t x, int32_t y) -{ - return (x > y ? y : x); -} - diff --git a/Build/source/libs/icu/icu-src/source/common/umath.cpp b/Build/source/libs/icu/icu-src/source/common/umath.cpp new file mode 100644 index 00000000000..7cf4b317494 --- /dev/null +++ b/Build/source/libs/icu/icu-src/source/common/umath.cpp @@ -0,0 +1,26 @@ +// © 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html +/* +****************************************************************************** +* +* Copyright (C) 1997-2006, International Business Machines +* Corporation and others. All Rights Reserved. +* +****************************************************************************** +* This file contains platform independent math. +*/ + +#include "putilimp.h" + +U_CAPI int32_t U_EXPORT2 +uprv_max(int32_t x, int32_t y) +{ + return (x > y ? x : y); +} + +U_CAPI int32_t U_EXPORT2 +uprv_min(int32_t x, int32_t y) +{ + return (x > y ? y : x); +} + diff --git a/Build/source/libs/icu/icu-src/source/common/umutex.cpp b/Build/source/libs/icu/icu-src/source/common/umutex.cpp index 0532838caf9..29dbc90ec98 100644 --- a/Build/source/libs/icu/icu-src/source/common/umutex.cpp +++ b/Build/source/libs/icu/icu-src/source/common/umutex.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ****************************************************************************** @@ -132,7 +132,7 @@ umtx_condBroadcast(UConditionVar *condition) { } U_CAPI void U_EXPORT2 -umtx_condSignal(UConditionVar *condition) { +umtx_condSignal(UConditionVar * /* condition */) { // Function not implemented. There is no immediate requirement from ICU to have it. // Once ICU drops support for Windows XP and Server 2003, ICU Condition Variables will be // changed to be thin wrappers on native Windows CONDITION_VARIABLEs, and this function diff --git a/Build/source/libs/icu/icu-src/source/common/umutex.h b/Build/source/libs/icu/icu-src/source/common/umutex.h index e8b92c27027..8e1f6e934a4 100644 --- a/Build/source/libs/icu/icu-src/source/common/umutex.h +++ b/Build/source/libs/icu/icu-src/source/common/umutex.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** @@ -76,7 +76,7 @@ inline int32_t umtx_atomic_dec(u_atomic_int32_t *var) { } U_NAMESPACE_END -#elif U_PLATFORM_USES_ONLY_WIN32_API +#elif U_PLATFORM_HAS_WIN32_API // MSVC compiler. Reads and writes of volatile variables have // acquire and release memory semantics, respectively. @@ -86,7 +86,9 @@ U_NAMESPACE_END // Original plan was to use gcc atomics for MinGW, but they // aren't supported, so we fold MinGW into this path. +#ifndef WIN32_LEAN_AND_MEAN # define WIN32_LEAN_AND_MEAN +#endif # define VC_EXTRALEAN # define NOUSER # define NOSERVICE @@ -331,7 +333,9 @@ U_NAMESPACE_END * win32 APIs for Critical Sections. */ +#ifndef WIN32_LEAN_AND_MEAN # define WIN32_LEAN_AND_MEAN +#endif # define VC_EXTRALEAN # define NOUSER # define NOSERVICE diff --git a/Build/source/libs/icu/icu-src/source/common/unames.cpp b/Build/source/libs/icu/icu-src/source/common/unames.cpp index 9da2045bc47..6ad349c2e3b 100644 --- a/Build/source/libs/icu/icu-src/source/common/unames.cpp +++ b/Build/source/libs/icu/icu-src/source/common/unames.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ****************************************************************************** @@ -8,7 +8,7 @@ * ****************************************************************************** * file name: unames.c -* encoding: US-ASCII +* encoding: UTF-8 * tab size: 8 (not used) * indentation:4 * diff --git a/Build/source/libs/icu/icu-src/source/common/unicode/appendable.h b/Build/source/libs/icu/icu-src/source/common/unicode/appendable.h index 2ae334505ef..8512c2f3031 100644 --- a/Build/source/libs/icu/icu-src/source/common/unicode/appendable.h +++ b/Build/source/libs/icu/icu-src/source/common/unicode/appendable.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* @@ -6,7 +6,7 @@ * Corporation and others. All Rights Reserved. ******************************************************************************* * file name: appendable.h -* encoding: US-ASCII +* encoding: UTF-8 * tab size: 8 (not used) * indentation:4 * @@ -19,7 +19,7 @@ /** * \file - * \brief C++ API: Appendable class: Sink for Unicode code points and 16-bit code units (UChars). + * \brief C++ API: Appendable class: Sink for Unicode code points and 16-bit code units (char16_ts). */ #include "unicode/utypes.h" @@ -34,10 +34,10 @@ class UnicodeString; * Combines elements of Java Appendable and ICU4C ByteSink. * * This class can be used in APIs where it does not matter whether the actual destination is - * a UnicodeString, a UChar[] array, a UnicodeSet, or any other object + * a UnicodeString, a char16_t[] array, a UnicodeSet, or any other object * that receives and processes characters and/or strings. * - * Implementation classes must implement at least appendCodeUnit(UChar). + * Implementation classes must implement at least appendCodeUnit(char16_t). * The base class provides default implementations for the other methods. * * The methods do not take UErrorCode parameters. @@ -62,11 +62,11 @@ public: * @return TRUE if the operation succeeded * @stable ICU 4.8 */ - virtual UBool appendCodeUnit(UChar c) = 0; + virtual UBool appendCodeUnit(char16_t c) = 0; /** * Appends a code point. - * The default implementation calls appendCodeUnit(UChar) once or twice. + * The default implementation calls appendCodeUnit(char16_t) once or twice. * @param c code point 0..0x10ffff * @return TRUE if the operation succeeded * @stable ICU 4.8 @@ -75,20 +75,20 @@ public: /** * Appends a string. - * The default implementation calls appendCodeUnit(UChar) for each code unit. + * The default implementation calls appendCodeUnit(char16_t) for each code unit. * @param s string, must not be NULL if length!=0 * @param length string length, or -1 if NUL-terminated * @return TRUE if the operation succeeded * @stable ICU 4.8 */ - virtual UBool appendString(const UChar *s, int32_t length); + virtual UBool appendString(const char16_t *s, int32_t length); /** * Tells the object that the caller is going to append roughly - * appendCapacity UChars. A subclass might use this to pre-allocate + * appendCapacity char16_ts. A subclass might use this to pre-allocate * a larger buffer if necessary. * The default implementation does nothing. (It always returns TRUE.) - * @param appendCapacity estimated number of UChars that will be appended + * @param appendCapacity estimated number of char16_ts that will be appended * @return TRUE if the operation succeeded * @stable ICU 4.8 */ @@ -102,19 +102,19 @@ public: * The returned buffer is only valid until the next operation * on this Appendable. * - * After writing at most *resultCapacity UChars, call appendString() with the - * pointer returned from this function and the number of UChars written. - * Many appendString() implementations will avoid copying UChars if this function + * After writing at most *resultCapacity char16_ts, call appendString() with the + * pointer returned from this function and the number of char16_ts written. + * Many appendString() implementations will avoid copying char16_ts if this function * returned an internal buffer. * * Partial usage example: * \code * int32_t capacity; - * UChar* buffer = app.getAppendBuffer(..., &capacity); - * ... Write n UChars into buffer, with n <= capacity. + * char16_t* buffer = app.getAppendBuffer(..., &capacity); + * ... Write n char16_ts into buffer, with n <= capacity. * app.appendString(buffer, n); * \endcode - * In many implementations, that call to append will avoid copying UChars. + * In many implementations, that call to append will avoid copying char16_ts. * * If the Appendable allocates or reallocates an internal buffer, it should use * the desiredCapacityHint if appropriate. @@ -138,9 +138,9 @@ public: * @return a buffer with *resultCapacity>=minCapacity * @stable ICU 4.8 */ - virtual UChar *getAppendBuffer(int32_t minCapacity, + virtual char16_t *getAppendBuffer(int32_t minCapacity, int32_t desiredCapacityHint, - UChar *scratch, int32_t scratchCapacity, + char16_t *scratch, int32_t scratchCapacity, int32_t *resultCapacity); }; @@ -171,7 +171,7 @@ public: * @return TRUE if the operation succeeded * @stable ICU 4.8 */ - virtual UBool appendCodeUnit(UChar c); + virtual UBool appendCodeUnit(char16_t c); /** * Appends a code point to the string. @@ -188,12 +188,12 @@ public: * @return TRUE if the operation succeeded * @stable ICU 4.8 */ - virtual UBool appendString(const UChar *s, int32_t length); + virtual UBool appendString(const char16_t *s, int32_t length); /** * Tells the UnicodeString that the caller is going to append roughly - * appendCapacity UChars. - * @param appendCapacity estimated number of UChars that will be appended + * appendCapacity char16_ts. + * @param appendCapacity estimated number of char16_ts that will be appended * @return TRUE if the operation succeeded * @stable ICU 4.8 */ @@ -220,9 +220,9 @@ public: * @return a buffer with *resultCapacity>=minCapacity * @stable ICU 4.8 */ - virtual UChar *getAppendBuffer(int32_t minCapacity, + virtual char16_t *getAppendBuffer(int32_t minCapacity, int32_t desiredCapacityHint, - UChar *scratch, int32_t scratchCapacity, + char16_t *scratch, int32_t scratchCapacity, int32_t *resultCapacity); private: diff --git a/Build/source/libs/icu/icu-src/source/common/unicode/brkiter.h b/Build/source/libs/icu/icu-src/source/common/unicode/brkiter.h index 88b39c6699b..c64bb712222 100644 --- a/Build/source/libs/icu/icu-src/source/common/unicode/brkiter.h +++ b/Build/source/libs/icu/icu-src/source/common/unicode/brkiter.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************** @@ -250,7 +250,7 @@ public: virtual int32_t next(void) = 0; /** - * Return character index of the current interator position within the text. + * Return character index of the current iterator position within the text. * @return The boundary most recently returned. * @stable ICU 2.0 */ @@ -277,7 +277,7 @@ public: virtual int32_t preceding(int32_t offset) = 0; /** - * Return true if the specfied position is a boundary position. + * Return true if the specified position is a boundary position. * As a side effect, the current position of the iterator is set * to the first boundary position at or following the specified offset. * @param offset the offset to check. @@ -292,7 +292,7 @@ public: * does nothing. Negative values move to previous boundaries * and positive values move to later boundaries. * @return The new iterator position, or - * DONE if there are fewer than |n| boundaries in the specfied direction. + * DONE if there are fewer than |n| boundaries in the specified direction. * @stable ICU 2.0 */ virtual int32_t next(int32_t n) = 0; @@ -331,7 +331,7 @@ public: * @param fillInVec an array to be filled in with the status values. * @param capacity the length of the supplied vector. A length of zero causes * the function to return the number of status values, in the - * normal way, without attemtping to store any values. + * normal way, without attempting to store any values. * @param status receives error codes. * @return The number of rule status values from rules that determined * the most recent boundary returned by the break iterator. @@ -469,7 +469,7 @@ public: static const Locale* U_EXPORT2 getAvailableLocales(int32_t& count); /** - * Get name of the object for the desired Locale, in the desired langauge. + * Get name of the object for the desired Locale, in the desired language. * @param objectLocale must be from getAvailableLocales. * @param displayLocale specifies the desired locale for output. * @param name the fill-in parameter of the return value @@ -482,7 +482,7 @@ public: UnicodeString& name); /** - * Get name of the object for the desired Locale, in the langauge of the + * Get name of the object for the desired Locale, in the language of the * default locale. * @param objectLocale must be from getMatchingLocales * @param name the fill-in parameter of the return value @@ -629,10 +629,12 @@ protected: /** @internal */ BreakIterator(); /** @internal */ - BreakIterator (const BreakIterator &other) : UObject(other) {} + BreakIterator (const BreakIterator &other); #ifndef U_HIDE_INTERNAL_API /** @internal */ - BreakIterator (const Locale& valid, const Locale& actual); + BreakIterator (const Locale& valid, const Locale &actual); + /** @internal. Assignment Operator, used by RuleBasedBreakIterator. */ + BreakIterator &operator = (const BreakIterator &other); #endif /* U_HIDE_INTERNAL_API */ private: @@ -640,12 +642,6 @@ private: /** @internal */ char actualLocale[ULOC_FULLNAME_CAPACITY]; char validLocale[ULOC_FULLNAME_CAPACITY]; - - /** - * The assignment operator has no real implementation. - * It's provided to make the compiler happy. Do not call. - */ - BreakIterator& operator=(const BreakIterator&); }; #ifndef U_HIDE_DEPRECATED_API @@ -661,5 +657,5 @@ U_NAMESPACE_END #endif /* #if !UCONFIG_NO_BREAK_ITERATION */ -#endif // _BRKITER +#endif // BRKITER_H //eof diff --git a/Build/source/libs/icu/icu-src/source/common/unicode/bytestream.h b/Build/source/libs/icu/icu-src/source/common/unicode/bytestream.h index 15562271bfa..6f61c384f79 100644 --- a/Build/source/libs/icu/icu-src/source/common/unicode/bytestream.h +++ b/Build/source/libs/icu/icu-src/source/common/unicode/bytestream.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html // Copyright (C) 2009-2012, International Business Machines // Corporation and others. All Rights Reserved. @@ -126,8 +126,8 @@ public: virtual void Flush(); private: - ByteSink(const ByteSink &); // copy constructor not implemented - ByteSink &operator=(const ByteSink &); // assignment operator not implemented + ByteSink(const ByteSink &) = delete; + ByteSink &operator=(const ByteSink &) = delete; }; // ------------------------------------------------------------- @@ -217,12 +217,11 @@ private: int32_t size_; int32_t appended_; UBool overflowed_; - CheckedArrayByteSink(); ///< default constructor not implemented - CheckedArrayByteSink(const CheckedArrayByteSink &); ///< copy constructor not implemented - CheckedArrayByteSink &operator=(const CheckedArrayByteSink &); ///< assignment operator not implemented -}; -#if U_HAVE_STD_STRING + CheckedArrayByteSink() = delete; + CheckedArrayByteSink(const CheckedArrayByteSink &) = delete; + CheckedArrayByteSink &operator=(const CheckedArrayByteSink &) = delete; +}; /** * Implementation of ByteSink that writes to a "string". @@ -238,6 +237,21 @@ class StringByteSink : public ByteSink { * @stable ICU 4.2 */ StringByteSink(StringClass* dest) : dest_(dest) { } +#ifndef U_HIDE_DRAFT_API + /** + * Constructs a ByteSink that reserves append capacity and will append bytes to the dest string. + * + * @param dest pointer to string object to append to + * @param initialAppendCapacity capacity beyond dest->length() to be reserve()d + * @draft ICU 60 + */ + StringByteSink(StringClass* dest, int32_t initialAppendCapacity) : dest_(dest) { + if (initialAppendCapacity > 0 && + (uint32_t)initialAppendCapacity > (dest->capacity() - dest->length())) { + dest->reserve(dest->length() + initialAppendCapacity); + } + } +#endif // U_HIDE_DRAFT_API /** * Append "bytes[0,n-1]" to this. * @param data the pointer to the bytes @@ -247,12 +261,11 @@ class StringByteSink : public ByteSink { virtual void Append(const char* data, int32_t n) { dest_->append(data, n); } private: StringClass* dest_; - StringByteSink(); ///< default constructor not implemented - StringByteSink(const StringByteSink &); ///< copy constructor not implemented - StringByteSink &operator=(const StringByteSink &); ///< assignment operator not implemented -}; -#endif + StringByteSink() = delete; + StringByteSink(const StringByteSink &) = delete; + StringByteSink &operator=(const StringByteSink &) = delete; +}; U_NAMESPACE_END diff --git a/Build/source/libs/icu/icu-src/source/common/unicode/bytestrie.h b/Build/source/libs/icu/icu-src/source/common/unicode/bytestrie.h index 4a30ce1c042..c57b8ccfeb5 100644 --- a/Build/source/libs/icu/icu-src/source/common/unicode/bytestrie.h +++ b/Build/source/libs/icu/icu-src/source/common/unicode/bytestrie.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* @@ -6,7 +6,7 @@ * Corporation and others. All Rights Reserved. ******************************************************************************* * file name: bytestrie.h -* encoding: US-ASCII +* encoding: UTF-8 * tab size: 8 (not used) * indentation:4 * diff --git a/Build/source/libs/icu/icu-src/source/common/unicode/bytestriebuilder.h b/Build/source/libs/icu/icu-src/source/common/unicode/bytestriebuilder.h index fe96887d511..a8412d3d6e8 100644 --- a/Build/source/libs/icu/icu-src/source/common/unicode/bytestriebuilder.h +++ b/Build/source/libs/icu/icu-src/source/common/unicode/bytestriebuilder.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* @@ -6,7 +6,7 @@ * Corporation and others. All Rights Reserved. ******************************************************************************* * file name: bytestriebuilder.h -* encoding: US-ASCII +* encoding: UTF-8 * tab size: 8 (not used) * indentation:4 * @@ -127,14 +127,14 @@ private: void buildBytes(UStringTrieBuildOption buildOption, UErrorCode &errorCode); virtual int32_t getElementStringLength(int32_t i) const; - virtual UChar getElementUnit(int32_t i, int32_t byteIndex) const; + virtual char16_t getElementUnit(int32_t i, int32_t byteIndex) const; virtual int32_t getElementValue(int32_t i) const; virtual int32_t getLimitOfLinearMatch(int32_t first, int32_t last, int32_t byteIndex) const; virtual int32_t countElementUnits(int32_t start, int32_t limit, int32_t byteIndex) const; virtual int32_t skipElementsBySomeUnits(int32_t i, int32_t byteIndex, int32_t count) const; - virtual int32_t indexOfElementWithNextUnit(int32_t i, int32_t byteIndex, UChar byte) const; + virtual int32_t indexOfElementWithNextUnit(int32_t i, int32_t byteIndex, char16_t byte) const; virtual UBool matchNodesCanHaveValues() const { return FALSE; } diff --git a/Build/source/libs/icu/icu-src/source/common/unicode/caniter.h b/Build/source/libs/icu/icu-src/source/common/unicode/caniter.h index 7c1bf6afd00..5a882fb3fb8 100644 --- a/Build/source/libs/icu/icu-src/source/common/unicode/caniter.h +++ b/Build/source/libs/icu/icu-src/source/common/unicode/caniter.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* @@ -187,7 +187,7 @@ private: UnicodeString *getEquivalents(const UnicodeString &segment, int32_t &result_len, UErrorCode &status); //private String[] getEquivalents(String segment) //Set getEquivalents2(String segment); - Hashtable *getEquivalents2(Hashtable *fillinResult, const UChar *segment, int32_t segLen, UErrorCode &status); + Hashtable *getEquivalents2(Hashtable *fillinResult, const char16_t *segment, int32_t segLen, UErrorCode &status); //Hashtable *getEquivalents2(const UnicodeString &segment, int32_t segLen, UErrorCode &status); /** @@ -196,7 +196,7 @@ private: * If so, take the remainder, and return the equivalents */ //Set extract(int comp, String segment, int segmentPos, StringBuffer buffer); - Hashtable *extract(Hashtable *fillinResult, UChar32 comp, const UChar *segment, int32_t segLen, int32_t segmentPos, UErrorCode &status); + Hashtable *extract(Hashtable *fillinResult, UChar32 comp, const char16_t *segment, int32_t segLen, int32_t segmentPos, UErrorCode &status); //Hashtable *extract(UChar32 comp, const UnicodeString &segment, int32_t segLen, int32_t segmentPos, UErrorCode &status); void cleanPieces(); diff --git a/Build/source/libs/icu/icu-src/source/common/unicode/casemap.h b/Build/source/libs/icu/icu-src/source/common/unicode/casemap.h new file mode 100644 index 00000000000..4a4917bdcaf --- /dev/null +++ b/Build/source/libs/icu/icu-src/source/common/unicode/casemap.h @@ -0,0 +1,496 @@ +// © 2017 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html + +// casemap.h +// created: 2017jan12 Markus W. Scherer + +#ifndef __CASEMAP_H__ +#define __CASEMAP_H__ + +#include "unicode/utypes.h" +#include "unicode/stringpiece.h" +#include "unicode/uobject.h" + +/** + * \file + * \brief C++ API: Low-level C++ case mapping functions. + */ + +U_NAMESPACE_BEGIN + +#ifndef U_HIDE_DRAFT_API + +class BreakIterator; +class ByteSink; +class Edits; + +/** + * Low-level C++ case mapping functions. + * + * @draft ICU 59 + */ +class U_COMMON_API CaseMap U_FINAL : public UMemory { +public: + /** + * Lowercases a UTF-16 string and optionally records edits. + * Casing is locale-dependent and context-sensitive. + * The result may be longer or shorter than the original. + * The source string and the destination buffer must not overlap. + * + * @param locale The locale ID. ("" = root locale, NULL = default locale.) + * @param options Options bit set, usually 0. See U_OMIT_UNCHANGED_TEXT and U_EDITS_NO_RESET. + * @param src The original string. + * @param srcLength The length of the original string. If -1, then src must be NUL-terminated. + * @param dest A buffer for the result string. The result will be NUL-terminated if + * the buffer is large enough. + * The contents is undefined in case of failure. + * @param destCapacity The size of the buffer (number of char16_ts). If it is 0, then + * dest may be NULL and the function will only return the length of the result + * without writing any of the result string. + * @param edits Records edits for index mapping, working with styled text, + * and getting only changes (if any). + * The Edits contents is undefined if any error occurs. + * This function calls edits->reset() first unless + * options includes U_EDITS_NO_RESET. edits can be NULL. + * @param errorCode Reference to an in/out error code value + * which must not indicate a failure before the function call. + * @return The length of the result string, if successful. + * When the result would be longer than destCapacity, + * the full length is returned and a U_BUFFER_OVERFLOW_ERROR is set. + * + * @see u_strToLower + * @draft ICU 59 + */ + static int32_t toLower( + const char *locale, uint32_t options, + const char16_t *src, int32_t srcLength, + char16_t *dest, int32_t destCapacity, Edits *edits, + UErrorCode &errorCode); + + /** + * Uppercases a UTF-16 string and optionally records edits. + * Casing is locale-dependent and context-sensitive. + * The result may be longer or shorter than the original. + * The source string and the destination buffer must not overlap. + * + * @param locale The locale ID. ("" = root locale, NULL = default locale.) + * @param options Options bit set, usually 0. See U_OMIT_UNCHANGED_TEXT and U_EDITS_NO_RESET. + * @param src The original string. + * @param srcLength The length of the original string. If -1, then src must be NUL-terminated. + * @param dest A buffer for the result string. The result will be NUL-terminated if + * the buffer is large enough. + * The contents is undefined in case of failure. + * @param destCapacity The size of the buffer (number of char16_ts). If it is 0, then + * dest may be NULL and the function will only return the length of the result + * without writing any of the result string. + * @param edits Records edits for index mapping, working with styled text, + * and getting only changes (if any). + * The Edits contents is undefined if any error occurs. + * This function calls edits->reset() first unless + * options includes U_EDITS_NO_RESET. edits can be NULL. + * @param errorCode Reference to an in/out error code value + * which must not indicate a failure before the function call. + * @return The length of the result string, if successful. + * When the result would be longer than destCapacity, + * the full length is returned and a U_BUFFER_OVERFLOW_ERROR is set. + * + * @see u_strToUpper + * @draft ICU 59 + */ + static int32_t toUpper( + const char *locale, uint32_t options, + const char16_t *src, int32_t srcLength, + char16_t *dest, int32_t destCapacity, Edits *edits, + UErrorCode &errorCode); + +#if !UCONFIG_NO_BREAK_ITERATION + + /** + * Titlecases a UTF-16 string and optionally records edits. + * Casing is locale-dependent and context-sensitive. + * The result may be longer or shorter than the original. + * The source string and the destination buffer must not overlap. + * + * Titlecasing uses a break iterator to find the first characters of words + * that are to be titlecased. It titlecases those characters and lowercases + * all others. (This can be modified with options bits.) + * + * @param locale The locale ID. ("" = root locale, NULL = default locale.) + * @param options Options bit set, usually 0. See U_OMIT_UNCHANGED_TEXT, U_EDITS_NO_RESET, + * U_TITLECASE_NO_LOWERCASE, + * U_TITLECASE_NO_BREAK_ADJUSTMENT, U_TITLECASE_ADJUST_TO_CASED, + * U_TITLECASE_WHOLE_STRING, U_TITLECASE_SENTENCES. + * @param iter A break iterator to find the first characters of words that are to be titlecased. + * It is set to the source string (setText()) + * and used one or more times for iteration (first() and next()). + * If NULL, then a word break iterator for the locale is used + * (or something equivalent). + * @param src The original string. + * @param srcLength The length of the original string. If -1, then src must be NUL-terminated. + * @param dest A buffer for the result string. The result will be NUL-terminated if + * the buffer is large enough. + * The contents is undefined in case of failure. + * @param destCapacity The size of the buffer (number of char16_ts). If it is 0, then + * dest may be NULL and the function will only return the length of the result + * without writing any of the result string. + * @param edits Records edits for index mapping, working with styled text, + * and getting only changes (if any). + * The Edits contents is undefined if any error occurs. + * This function calls edits->reset() first unless + * options includes U_EDITS_NO_RESET. edits can be NULL. + * @param errorCode Reference to an in/out error code value + * which must not indicate a failure before the function call. + * @return The length of the result string, if successful. + * When the result would be longer than destCapacity, + * the full length is returned and a U_BUFFER_OVERFLOW_ERROR is set. + * + * @see u_strToTitle + * @see ucasemap_toTitle + * @draft ICU 59 + */ + static int32_t toTitle( + const char *locale, uint32_t options, BreakIterator *iter, + const char16_t *src, int32_t srcLength, + char16_t *dest, int32_t destCapacity, Edits *edits, + UErrorCode &errorCode); + +#endif // UCONFIG_NO_BREAK_ITERATION + + /** + * Case-folds a UTF-16 string and optionally records edits. + * + * Case folding is locale-independent and not context-sensitive, + * but there is an option for whether to include or exclude mappings for dotted I + * and dotless i that are marked with 'T' in CaseFolding.txt. + * + * The result may be longer or shorter than the original. + * The source string and the destination buffer must not overlap. + * + * @param options Options bit set, usually 0. See U_OMIT_UNCHANGED_TEXT, U_EDITS_NO_RESET, + * U_FOLD_CASE_DEFAULT, U_FOLD_CASE_EXCLUDE_SPECIAL_I. + * @param src The original string. + * @param srcLength The length of the original string. If -1, then src must be NUL-terminated. + * @param dest A buffer for the result string. The result will be NUL-terminated if + * the buffer is large enough. + * The contents is undefined in case of failure. + * @param destCapacity The size of the buffer (number of char16_ts). If it is 0, then + * dest may be NULL and the function will only return the length of the result + * without writing any of the result string. + * @param edits Records edits for index mapping, working with styled text, + * and getting only changes (if any). + * The Edits contents is undefined if any error occurs. + * This function calls edits->reset() first unless + * options includes U_EDITS_NO_RESET. edits can be NULL. + * @param errorCode Reference to an in/out error code value + * which must not indicate a failure before the function call. + * @return The length of the result string, if successful. + * When the result would be longer than destCapacity, + * the full length is returned and a U_BUFFER_OVERFLOW_ERROR is set. + * + * @see u_strFoldCase + * @draft ICU 59 + */ + static int32_t fold( + uint32_t options, + const char16_t *src, int32_t srcLength, + char16_t *dest, int32_t destCapacity, Edits *edits, + UErrorCode &errorCode); + + /** + * Lowercases a UTF-8 string and optionally records edits. + * Casing is locale-dependent and context-sensitive. + * The result may be longer or shorter than the original. + * + * @param locale The locale ID. ("" = root locale, NULL = default locale.) + * @param options Options bit set, usually 0. See U_OMIT_UNCHANGED_TEXT and U_EDITS_NO_RESET. + * @param src The original string. + * @param sink A ByteSink to which the result string is written. + * sink.Flush() is called at the end. + * @param edits Records edits for index mapping, working with styled text, + * and getting only changes (if any). + * The Edits contents is undefined if any error occurs. + * This function calls edits->reset() first unless + * options includes U_EDITS_NO_RESET. edits can be NULL. + * @param errorCode Reference to an in/out error code value + * which must not indicate a failure before the function call. + * + * @see ucasemap_utf8ToLower + * @draft ICU 60 + */ + static void utf8ToLower( + const char *locale, uint32_t options, + StringPiece src, ByteSink &sink, Edits *edits, + UErrorCode &errorCode); + + /** + * Uppercases a UTF-8 string and optionally records edits. + * Casing is locale-dependent and context-sensitive. + * The result may be longer or shorter than the original. + * + * @param locale The locale ID. ("" = root locale, NULL = default locale.) + * @param options Options bit set, usually 0. See U_OMIT_UNCHANGED_TEXT and U_EDITS_NO_RESET. + * @param src The original string. + * @param sink A ByteSink to which the result string is written. + * sink.Flush() is called at the end. + * @param edits Records edits for index mapping, working with styled text, + * and getting only changes (if any). + * The Edits contents is undefined if any error occurs. + * This function calls edits->reset() first unless + * options includes U_EDITS_NO_RESET. edits can be NULL. + * @param errorCode Reference to an in/out error code value + * which must not indicate a failure before the function call. + * + * @see ucasemap_utf8ToUpper + * @draft ICU 60 + */ + static void utf8ToUpper( + const char *locale, uint32_t options, + StringPiece src, ByteSink &sink, Edits *edits, + UErrorCode &errorCode); + +#if !UCONFIG_NO_BREAK_ITERATION + + /** + * Titlecases a UTF-8 string and optionally records edits. + * Casing is locale-dependent and context-sensitive. + * The result may be longer or shorter than the original. + * + * Titlecasing uses a break iterator to find the first characters of words + * that are to be titlecased. It titlecases those characters and lowercases + * all others. (This can be modified with options bits.) + * + * @param locale The locale ID. ("" = root locale, NULL = default locale.) + * @param options Options bit set, usually 0. See U_OMIT_UNCHANGED_TEXT, U_EDITS_NO_RESET, + * U_TITLECASE_NO_LOWERCASE, + * U_TITLECASE_NO_BREAK_ADJUSTMENT, U_TITLECASE_ADJUST_TO_CASED, + * U_TITLECASE_WHOLE_STRING, U_TITLECASE_SENTENCES. + * @param iter A break iterator to find the first characters of words that are to be titlecased. + * It is set to the source string (setUText()) + * and used one or more times for iteration (first() and next()). + * If NULL, then a word break iterator for the locale is used + * (or something equivalent). + * @param src The original string. + * @param sink A ByteSink to which the result string is written. + * sink.Flush() is called at the end. + * @param edits Records edits for index mapping, working with styled text, + * and getting only changes (if any). + * The Edits contents is undefined if any error occurs. + * This function calls edits->reset() first unless + * options includes U_EDITS_NO_RESET. edits can be NULL. + * @param errorCode Reference to an in/out error code value + * which must not indicate a failure before the function call. + * + * @see ucasemap_utf8ToTitle + * @draft ICU 60 + */ + static void utf8ToTitle( + const char *locale, uint32_t options, BreakIterator *iter, + StringPiece src, ByteSink &sink, Edits *edits, + UErrorCode &errorCode); + +#endif // UCONFIG_NO_BREAK_ITERATION + + /** + * Case-folds a UTF-8 string and optionally records edits. + * + * Case folding is locale-independent and not context-sensitive, + * but there is an option for whether to include or exclude mappings for dotted I + * and dotless i that are marked with 'T' in CaseFolding.txt. + * + * The result may be longer or shorter than the original. + * + * @param options Options bit set, usually 0. See U_OMIT_UNCHANGED_TEXT and U_EDITS_NO_RESET. + * @param src The original string. + * @param sink A ByteSink to which the result string is written. + * sink.Flush() is called at the end. + * @param edits Records edits for index mapping, working with styled text, + * and getting only changes (if any). + * The Edits contents is undefined if any error occurs. + * This function calls edits->reset() first unless + * options includes U_EDITS_NO_RESET. edits can be NULL. + * @param errorCode Reference to an in/out error code value + * which must not indicate a failure before the function call. + * + * @see ucasemap_utf8FoldCase + * @draft ICU 60 + */ + static void utf8Fold( + uint32_t options, + StringPiece src, ByteSink &sink, Edits *edits, + UErrorCode &errorCode); + + /** + * Lowercases a UTF-8 string and optionally records edits. + * Casing is locale-dependent and context-sensitive. + * The result may be longer or shorter than the original. + * The source string and the destination buffer must not overlap. + * + * @param locale The locale ID. ("" = root locale, NULL = default locale.) + * @param options Options bit set, usually 0. See U_OMIT_UNCHANGED_TEXT and U_EDITS_NO_RESET. + * @param src The original string. + * @param srcLength The length of the original string. If -1, then src must be NUL-terminated. + * @param dest A buffer for the result string. The result will be NUL-terminated if + * the buffer is large enough. + * The contents is undefined in case of failure. + * @param destCapacity The size of the buffer (number of bytes). If it is 0, then + * dest may be NULL and the function will only return the length of the result + * without writing any of the result string. + * @param edits Records edits for index mapping, working with styled text, + * and getting only changes (if any). + * The Edits contents is undefined if any error occurs. + * This function calls edits->reset() first unless + * options includes U_EDITS_NO_RESET. edits can be NULL. + * @param errorCode Reference to an in/out error code value + * which must not indicate a failure before the function call. + * @return The length of the result string, if successful. + * When the result would be longer than destCapacity, + * the full length is returned and a U_BUFFER_OVERFLOW_ERROR is set. + * + * @see ucasemap_utf8ToLower + * @draft ICU 59 + */ + static int32_t utf8ToLower( + const char *locale, uint32_t options, + const char *src, int32_t srcLength, + char *dest, int32_t destCapacity, Edits *edits, + UErrorCode &errorCode); + + /** + * Uppercases a UTF-8 string and optionally records edits. + * Casing is locale-dependent and context-sensitive. + * The result may be longer or shorter than the original. + * The source string and the destination buffer must not overlap. + * + * @param locale The locale ID. ("" = root locale, NULL = default locale.) + * @param options Options bit set, usually 0. See U_OMIT_UNCHANGED_TEXT and U_EDITS_NO_RESET. + * @param src The original string. + * @param srcLength The length of the original string. If -1, then src must be NUL-terminated. + * @param dest A buffer for the result string. The result will be NUL-terminated if + * the buffer is large enough. + * The contents is undefined in case of failure. + * @param destCapacity The size of the buffer (number of bytes). If it is 0, then + * dest may be NULL and the function will only return the length of the result + * without writing any of the result string. + * @param edits Records edits for index mapping, working with styled text, + * and getting only changes (if any). + * The Edits contents is undefined if any error occurs. + * This function calls edits->reset() first unless + * options includes U_EDITS_NO_RESET. edits can be NULL. + * @param errorCode Reference to an in/out error code value + * which must not indicate a failure before the function call. + * @return The length of the result string, if successful. + * When the result would be longer than destCapacity, + * the full length is returned and a U_BUFFER_OVERFLOW_ERROR is set. + * + * @see ucasemap_utf8ToUpper + * @draft ICU 59 + */ + static int32_t utf8ToUpper( + const char *locale, uint32_t options, + const char *src, int32_t srcLength, + char *dest, int32_t destCapacity, Edits *edits, + UErrorCode &errorCode); + +#if !UCONFIG_NO_BREAK_ITERATION + + /** + * Titlecases a UTF-8 string and optionally records edits. + * Casing is locale-dependent and context-sensitive. + * The result may be longer or shorter than the original. + * The source string and the destination buffer must not overlap. + * + * Titlecasing uses a break iterator to find the first characters of words + * that are to be titlecased. It titlecases those characters and lowercases + * all others. (This can be modified with options bits.) + * + * @param locale The locale ID. ("" = root locale, NULL = default locale.) + * @param options Options bit set, usually 0. See U_OMIT_UNCHANGED_TEXT, U_EDITS_NO_RESET, + * U_TITLECASE_NO_LOWERCASE, + * U_TITLECASE_NO_BREAK_ADJUSTMENT, U_TITLECASE_ADJUST_TO_CASED, + * U_TITLECASE_WHOLE_STRING, U_TITLECASE_SENTENCES. + * @param iter A break iterator to find the first characters of words that are to be titlecased. + * It is set to the source string (setUText()) + * and used one or more times for iteration (first() and next()). + * If NULL, then a word break iterator for the locale is used + * (or something equivalent). + * @param src The original string. + * @param srcLength The length of the original string. If -1, then src must be NUL-terminated. + * @param dest A buffer for the result string. The result will be NUL-terminated if + * the buffer is large enough. + * The contents is undefined in case of failure. + * @param destCapacity The size of the buffer (number of bytes). If it is 0, then + * dest may be NULL and the function will only return the length of the result + * without writing any of the result string. + * @param edits Records edits for index mapping, working with styled text, + * and getting only changes (if any). + * The Edits contents is undefined if any error occurs. + * This function calls edits->reset() first unless + * options includes U_EDITS_NO_RESET. edits can be NULL. + * @param errorCode Reference to an in/out error code value + * which must not indicate a failure before the function call. + * @return The length of the result string, if successful. + * When the result would be longer than destCapacity, + * the full length is returned and a U_BUFFER_OVERFLOW_ERROR is set. + * + * @see ucasemap_utf8ToTitle + * @draft ICU 59 + */ + static int32_t utf8ToTitle( + const char *locale, uint32_t options, BreakIterator *iter, + const char *src, int32_t srcLength, + char *dest, int32_t destCapacity, Edits *edits, + UErrorCode &errorCode); + +#endif // UCONFIG_NO_BREAK_ITERATION + + /** + * Case-folds a UTF-8 string and optionally records edits. + * + * Case folding is locale-independent and not context-sensitive, + * but there is an option for whether to include or exclude mappings for dotted I + * and dotless i that are marked with 'T' in CaseFolding.txt. + * + * The result may be longer or shorter than the original. + * The source string and the destination buffer must not overlap. + * + * @param options Options bit set, usually 0. See U_OMIT_UNCHANGED_TEXT, U_EDITS_NO_RESET, + * U_FOLD_CASE_DEFAULT, U_FOLD_CASE_EXCLUDE_SPECIAL_I. + * @param src The original string. + * @param srcLength The length of the original string. If -1, then src must be NUL-terminated. + * @param dest A buffer for the result string. The result will be NUL-terminated if + * the buffer is large enough. + * The contents is undefined in case of failure. + * @param destCapacity The size of the buffer (number of bytes). If it is 0, then + * dest may be NULL and the function will only return the length of the result + * without writing any of the result string. + * @param edits Records edits for index mapping, working with styled text, + * and getting only changes (if any). + * The Edits contents is undefined if any error occurs. + * This function calls edits->reset() first unless + * options includes U_EDITS_NO_RESET. edits can be NULL. + * @param errorCode Reference to an in/out error code value + * which must not indicate a failure before the function call. + * @return The length of the result string, if successful. + * When the result would be longer than destCapacity, + * the full length is returned and a U_BUFFER_OVERFLOW_ERROR is set. + * + * @see ucasemap_utf8FoldCase + * @draft ICU 59 + */ + static int32_t utf8Fold( + uint32_t options, + const char *src, int32_t srcLength, + char *dest, int32_t destCapacity, Edits *edits, + UErrorCode &errorCode); + +private: + CaseMap() = delete; + CaseMap(const CaseMap &other) = delete; + CaseMap &operator=(const CaseMap &other) = delete; +}; + +#endif // U_HIDE_DRAFT_API + +U_NAMESPACE_END + +#endif // __CASEMAP_H__ diff --git a/Build/source/libs/icu/icu-src/source/common/unicode/char16ptr.h b/Build/source/libs/icu/icu-src/source/common/unicode/char16ptr.h new file mode 100644 index 00000000000..fbce1775911 --- /dev/null +++ b/Build/source/libs/icu/icu-src/source/common/unicode/char16ptr.h @@ -0,0 +1,306 @@ +// © 2017 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html + +// char16ptr.h +// created: 2017feb28 Markus W. Scherer + +#ifndef __CHAR16PTR_H__ +#define __CHAR16PTR_H__ + +#include +#include "unicode/utypes.h" + +/** + * \file + * \brief C++ API: char16_t pointer wrappers with + * implicit conversion from bit-compatible raw pointer types. + * Also conversion functions from char16_t * to UChar * and OldUChar *. + */ + +U_NAMESPACE_BEGIN + +/** + * \def U_ALIASING_BARRIER + * Barrier for pointer anti-aliasing optimizations even across function boundaries. + * @internal + */ +#ifdef U_ALIASING_BARRIER + // Use the predefined value. +#elif (defined(__clang__) || defined(__GNUC__)) && U_PLATFORM != U_PF_BROWSER_NATIVE_CLIENT +# define U_ALIASING_BARRIER(ptr) asm volatile("" : : "rm"(ptr) : "memory") +#endif + +// Do not use #ifndef U_HIDE_DRAFT_API for the following class, it +// is now used in place of UChar* in several stable C++ methods +/** + * char16_t * wrapper with implicit conversion from distinct but bit-compatible pointer types. + * @draft ICU 59 + */ +class U_COMMON_API Char16Ptr U_FINAL { +public: + /** + * Copies the pointer. + * @param p pointer + * @draft ICU 59 + */ + inline Char16Ptr(char16_t *p); +#if !U_CHAR16_IS_TYPEDEF + /** + * Converts the pointer to char16_t *. + * @param p pointer to be converted + * @draft ICU 59 + */ + inline Char16Ptr(uint16_t *p); +#endif +#if U_SIZEOF_WCHAR_T==2 || defined(U_IN_DOXYGEN) + /** + * Converts the pointer to char16_t *. + * (Only defined if U_SIZEOF_WCHAR_T==2.) + * @param p pointer to be converted + * @draft ICU 59 + */ + inline Char16Ptr(wchar_t *p); +#endif + /** + * nullptr constructor. + * @param p nullptr + * @draft ICU 59 + */ + inline Char16Ptr(std::nullptr_t p); + /** + * Destructor. + * @draft ICU 59 + */ + inline ~Char16Ptr(); + + /** + * Pointer access. + * @return the wrapped pointer + * @draft ICU 59 + */ + inline char16_t *get() const; + /** + * char16_t pointer access via type conversion (e.g., static_cast). + * @return the wrapped pointer + * @draft ICU 59 + */ + inline operator char16_t *() const { return get(); } + +private: + Char16Ptr() = delete; + +#ifdef U_ALIASING_BARRIER + template static char16_t *cast(T *t) { + U_ALIASING_BARRIER(t); + return reinterpret_cast(t); + } + + char16_t *p_; +#else + union { + char16_t *cp; + uint16_t *up; + wchar_t *wp; + } u_; +#endif +}; + +#ifdef U_ALIASING_BARRIER + +Char16Ptr::Char16Ptr(char16_t *p) : p_(p) {} +#if !U_CHAR16_IS_TYPEDEF +Char16Ptr::Char16Ptr(uint16_t *p) : p_(cast(p)) {} +#endif +#if U_SIZEOF_WCHAR_T==2 +Char16Ptr::Char16Ptr(wchar_t *p) : p_(cast(p)) {} +#endif +Char16Ptr::Char16Ptr(std::nullptr_t p) : p_(p) {} +Char16Ptr::~Char16Ptr() { + U_ALIASING_BARRIER(p_); +} + +char16_t *Char16Ptr::get() const { return p_; } + +#else + +Char16Ptr::Char16Ptr(char16_t *p) { u_.cp = p; } +#if !U_CHAR16_IS_TYPEDEF +Char16Ptr::Char16Ptr(uint16_t *p) { u_.up = p; } +#endif +#if U_SIZEOF_WCHAR_T==2 +Char16Ptr::Char16Ptr(wchar_t *p) { u_.wp = p; } +#endif +Char16Ptr::Char16Ptr(std::nullptr_t p) { u_.cp = p; } +Char16Ptr::~Char16Ptr() {} + +char16_t *Char16Ptr::get() const { return u_.cp; } + +#endif + +// Do not use #ifndef U_HIDE_DRAFT_API for the following class, it is +// now used in place of const UChar* in several stable C++ methods +/** + * const char16_t * wrapper with implicit conversion from distinct but bit-compatible pointer types. + * @draft ICU 59 + */ +class U_COMMON_API ConstChar16Ptr U_FINAL { +public: + /** + * Copies the pointer. + * @param p pointer + * @draft ICU 59 + */ + inline ConstChar16Ptr(const char16_t *p); +#if !U_CHAR16_IS_TYPEDEF + /** + * Converts the pointer to char16_t *. + * @param p pointer to be converted + * @draft ICU 59 + */ + inline ConstChar16Ptr(const uint16_t *p); +#endif +#if U_SIZEOF_WCHAR_T==2 || defined(U_IN_DOXYGEN) + /** + * Converts the pointer to char16_t *. + * (Only defined if U_SIZEOF_WCHAR_T==2.) + * @param p pointer to be converted + * @draft ICU 59 + */ + inline ConstChar16Ptr(const wchar_t *p); +#endif + /** + * nullptr constructor. + * @param p nullptr + * @draft ICU 59 + */ + inline ConstChar16Ptr(const std::nullptr_t p); + + /** + * Destructor. + * @draft ICU 59 + */ + inline ~ConstChar16Ptr(); + + /** + * Pointer access. + * @return the wrapped pointer + * @draft ICU 59 + */ + inline const char16_t *get() const; + /** + * char16_t pointer access via type conversion (e.g., static_cast). + * @return the wrapped pointer + * @draft ICU 59 + */ + inline operator const char16_t *() const { return get(); } + +private: + ConstChar16Ptr() = delete; + +#ifdef U_ALIASING_BARRIER + template static const char16_t *cast(const T *t) { + U_ALIASING_BARRIER(t); + return reinterpret_cast(t); + } + + const char16_t *p_; +#else + union { + const char16_t *cp; + const uint16_t *up; + const wchar_t *wp; + } u_; +#endif +}; + +#ifdef U_ALIASING_BARRIER + +ConstChar16Ptr::ConstChar16Ptr(const char16_t *p) : p_(p) {} +#if !U_CHAR16_IS_TYPEDEF +ConstChar16Ptr::ConstChar16Ptr(const uint16_t *p) : p_(cast(p)) {} +#endif +#if U_SIZEOF_WCHAR_T==2 +ConstChar16Ptr::ConstChar16Ptr(const wchar_t *p) : p_(cast(p)) {} +#endif +ConstChar16Ptr::ConstChar16Ptr(const std::nullptr_t p) : p_(p) {} +ConstChar16Ptr::~ConstChar16Ptr() { + U_ALIASING_BARRIER(p_); +} + +const char16_t *ConstChar16Ptr::get() const { return p_; } + +#else + +ConstChar16Ptr::ConstChar16Ptr(const char16_t *p) { u_.cp = p; } +#if !U_CHAR16_IS_TYPEDEF +ConstChar16Ptr::ConstChar16Ptr(const uint16_t *p) { u_.up = p; } +#endif +#if U_SIZEOF_WCHAR_T==2 +ConstChar16Ptr::ConstChar16Ptr(const wchar_t *p) { u_.wp = p; } +#endif +ConstChar16Ptr::ConstChar16Ptr(const std::nullptr_t p) { u_.cp = p; } +ConstChar16Ptr::~ConstChar16Ptr() {} + +const char16_t *ConstChar16Ptr::get() const { return u_.cp; } + +#endif + +/** + * Converts from const char16_t * to const UChar *. + * Includes an aliasing barrier if available. + * @param p pointer + * @return p as const UChar * + * @draft ICU 59 + */ +inline const UChar *toUCharPtr(const char16_t *p) { +#ifdef U_ALIASING_BARRIER + U_ALIASING_BARRIER(p); +#endif + return reinterpret_cast(p); +} + +/** + * Converts from char16_t * to UChar *. + * Includes an aliasing barrier if available. + * @param p pointer + * @return p as UChar * + * @draft ICU 59 + */ +inline UChar *toUCharPtr(char16_t *p) { +#ifdef U_ALIASING_BARRIER + U_ALIASING_BARRIER(p); +#endif + return reinterpret_cast(p); +} + +/** + * Converts from const char16_t * to const OldUChar *. + * Includes an aliasing barrier if available. + * @param p pointer + * @return p as const OldUChar * + * @draft ICU 59 + */ +inline const OldUChar *toOldUCharPtr(const char16_t *p) { +#ifdef U_ALIASING_BARRIER + U_ALIASING_BARRIER(p); +#endif + return reinterpret_cast(p); +} + +/** + * Converts from char16_t * to OldUChar *. + * Includes an aliasing barrier if available. + * @param p pointer + * @return p as OldUChar * + * @draft ICU 59 + */ +inline OldUChar *toOldUCharPtr(char16_t *p) { +#ifdef U_ALIASING_BARRIER + U_ALIASING_BARRIER(p); +#endif + return reinterpret_cast(p); +} + +U_NAMESPACE_END + +#endif // __CHAR16PTR_H__ diff --git a/Build/source/libs/icu/icu-src/source/common/unicode/chariter.h b/Build/source/libs/icu/icu-src/source/common/unicode/chariter.h index 07d1ca3d2dc..7a4e1a2f487 100644 --- a/Build/source/libs/icu/icu-src/source/common/unicode/chariter.h +++ b/Build/source/libs/icu/icu-src/source/common/unicode/chariter.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************** @@ -78,7 +78,7 @@ U_NAMESPACE_BEGIN * } * * void function1(ForwardCharacterIterator &it) { - * UChar c; + * char16_t c; * while((c=it.nextPostInc())!=ForwardCharacterIterator::DONE) { * // use c * } @@ -149,7 +149,7 @@ public: * @return the current code unit. * @stable ICU 2.0 */ - virtual UChar nextPostInc(void) = 0; + virtual char16_t nextPostInc(void) = 0; /** * Gets the current code point for returning and advances to the next code point @@ -230,7 +230,7 @@ protected: * showing a way to convert simple for() loops: * \code * void forward2(CharacterIterator &it) { - * UChar c; + * char16_t c; * for(c=it.firstPostInc(); c!=CharacterIterator::DONE; c=it.nextPostInc()) { * // use c * } @@ -249,7 +249,7 @@ protected: * Backward iteration with a more traditional for() loop: * \code * void backward2(CharacterIterator &it) { - * UChar c; + * char16_t c; * for(c=it.last(); c!=CharacterIterator::DONE; c=it.previous()) { * // use c * } @@ -266,7 +266,7 @@ protected: * // get the position * int32_t pos=it.getIndex(); * // get the previous code unit - * UChar u=it.previous(); + * char16_t u=it.previous(); * // move back one more code unit * it.move(-1, CharacterIterator::kCurrent); * // set the position back to where it was @@ -283,7 +283,7 @@ protected: * Function processing characters, in this example simple output *
        * \code
      - *  void processChar( UChar c )
      + *  void processChar( char16_t c )
        *  {
        *      cout << " " << c;
        *  }
      @@ -294,7 +294,7 @@ protected:
        * \code
        *  void traverseForward(CharacterIterator& iter)
        *  {
      - *      for(UChar c = iter.first(); c != CharacterIterator.DONE; c = iter.next()) {
      + *      for(char16_t c = iter.first(); c != CharacterIterator.DONE; c = iter.next()) {
        *          processChar(c);
        *      }
        *  }
      @@ -305,7 +305,7 @@ protected:
        * \code
        *  void traverseBackward(CharacterIterator& iter)
        *  {
      - *      for(UChar c = iter.last(); c != CharacterIterator.DONE; c = iter.previous()) {
      + *      for(char16_t c = iter.last(); c != CharacterIterator.DONE; c = iter.previous()) {
        *          processChar(c);
        *      }
        *  }
      @@ -317,7 +317,7 @@ protected:
        * \code
        * void traverseOut(CharacterIterator& iter, int32_t pos)
        * {
      - *      UChar c;
      + *      char16_t c;
        *      for (c = iter.setIndex(pos);
        *      c != CharacterIterator.DONE && (Unicode::isLetter(c) || Unicode::isDigit(c));
        *          c = iter.next()) {}
      @@ -386,7 +386,7 @@ public:
            * @return the first code unit in its iteration range.
            * @stable ICU 2.0
            */
      -    virtual UChar         first(void) = 0;
      +    virtual char16_t         first(void) = 0;
       
           /**
            * Sets the iterator to refer to the first code unit in its
      @@ -396,7 +396,7 @@ public:
            * @return the first code unit in its iteration range.
            * @stable ICU 2.0
            */
      -    virtual UChar         firstPostInc(void);
      +    virtual char16_t         firstPostInc(void);
       
           /**
            * Sets the iterator to refer to the first code point in its
      @@ -435,7 +435,7 @@ public:
            * @return the last code unit.
            * @stable ICU 2.0
            */
      -    virtual UChar         last(void) = 0;
      +    virtual char16_t         last(void) = 0;
               
           /**
            * Sets the iterator to refer to the last code point in its
      @@ -463,7 +463,7 @@ public:
            * @return the "position"-th code unit.
            * @stable ICU 2.0
            */
      -    virtual UChar         setIndex(int32_t position) = 0;
      +    virtual char16_t         setIndex(int32_t position) = 0;
       
           /**
            * Sets the iterator to refer to the beginning of the code point
      @@ -483,7 +483,7 @@ public:
            * @return the current code unit. 
            * @stable ICU 2.0
            */
      -    virtual UChar         current(void) const = 0;
      +    virtual char16_t         current(void) const = 0;
               
           /**
            * Returns the code point the iterator currently refers to.  
      @@ -499,7 +499,7 @@ public:
            * @return the next code unit.
            * @stable ICU 2.0
            */
      -    virtual UChar         next(void) = 0;
      +    virtual char16_t         next(void) = 0;
               
           /**
            * Advances to the next code point in the iteration range
      @@ -520,7 +520,7 @@ public:
            * @return the previous code unit.
            * @stable ICU 2.0
            */
      -    virtual UChar         previous(void) = 0;
      +    virtual char16_t         previous(void) = 0;
       
           /**
            * Advances to the previous code point in the iteration range
      @@ -607,6 +607,10 @@ public:
            * @return the new position
            * @stable ICU 2.0
            */
      +#ifdef move32
      +     // One of the system headers right now is sometimes defining a conflicting macro we don't use
      +#undef move32
      +#endif
           virtual int32_t      move32(int32_t delta, EOrigin origin) = 0;
       
           /**
      diff --git a/Build/source/libs/icu/icu-src/source/common/unicode/dbbi.h b/Build/source/libs/icu/icu-src/source/common/unicode/dbbi.h
      index 590b6f377a9..a2c3d7d7523 100644
      --- a/Build/source/libs/icu/icu-src/source/common/unicode/dbbi.h
      +++ b/Build/source/libs/icu/icu-src/source/common/unicode/dbbi.h
      @@ -1,4 +1,4 @@
      -// Copyright (C) 2016 and later: Unicode, Inc. and others.
      +// © 2016 and later: Unicode, Inc. and others.
       // License & terms of use: http://www.unicode.org/copyright.html
       /*
       **********************************************************************
      diff --git a/Build/source/libs/icu/icu-src/source/common/unicode/docmain.h b/Build/source/libs/icu/icu-src/source/common/unicode/docmain.h
      index 7fc10848916..636931cf258 100644
      --- a/Build/source/libs/icu/icu-src/source/common/unicode/docmain.h
      +++ b/Build/source/libs/icu/icu-src/source/common/unicode/docmain.h
      @@ -1,4 +1,4 @@
      -// Copyright (C) 2016 and later: Unicode, Inc. and others.
      +// © 2016 and later: Unicode, Inc. and others.
       // License & terms of use: http://www.unicode.org/copyright.html
       /********************************************************************
        * COPYRIGHT: 
      @@ -98,6 +98,11 @@
        *     C API
        *   
        *   
      + *     Codepage Detection
      + *     ucsdet.h
      + *     C API
      + *   
      + *   
        *     Unicode Text Compression
        *     ucnv.h
      (encoding name "SCSU" or "BOCU-1") * C API @@ -135,7 +140,7 @@ * * Number Formatting * unum.h - * icu::NumberFormat + * icu::number::NumberFormatter (ICU 60+) or icu::NumberFormat (older versions) * * * Number Spellout
      (Rule Based Number Formatting) diff --git a/Build/source/libs/icu/icu-src/source/common/unicode/dtintrv.h b/Build/source/libs/icu/icu-src/source/common/unicode/dtintrv.h index d45614a4676..10b566a39a8 100644 --- a/Build/source/libs/icu/icu-src/source/common/unicode/dtintrv.h +++ b/Build/source/libs/icu/icu-src/source/common/unicode/dtintrv.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* diff --git a/Build/source/libs/icu/icu-src/source/common/unicode/edits.h b/Build/source/libs/icu/icu-src/source/common/unicode/edits.h new file mode 100644 index 00000000000..082c3733a88 --- /dev/null +++ b/Build/source/libs/icu/icu-src/source/common/unicode/edits.h @@ -0,0 +1,422 @@ +// © 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html + +// edits.h +// created: 2016dec30 Markus W. Scherer + +#ifndef __EDITS_H__ +#define __EDITS_H__ + +#include "unicode/utypes.h" +#include "unicode/uobject.h" + +/** + * \file + * \brief C++ API: C++ class Edits for low-level string transformations on styled text. + */ + +U_NAMESPACE_BEGIN + +#ifndef U_HIDE_DRAFT_API + +/** + * Records lengths of string edits but not replacement text. + * Supports replacements, insertions, deletions in linear progression. + * Does not support moving/reordering of text. + * + * An Edits object tracks a separate UErrorCode, but ICU string transformation functions + * (e.g., case mapping functions) merge any such errors into their API's UErrorCode. + * + * @draft ICU 59 + */ +class U_COMMON_API Edits U_FINAL : public UMemory { +public: + /** + * Constructs an empty object. + * @draft ICU 59 + */ + Edits() : + array(stackArray), capacity(STACK_CAPACITY), length(0), delta(0), numChanges(0), + errorCode_(U_ZERO_ERROR) {} + /** + * Copy constructor. + * @param other source edits + * @draft ICU 60 + */ + Edits(const Edits &other) : + array(stackArray), capacity(STACK_CAPACITY), length(other.length), + delta(other.delta), numChanges(other.numChanges), + errorCode_(other.errorCode_) { + copyArray(other); + } + /** + * Move constructor, might leave src empty. + * This object will have the same contents that the source object had. + * @param src source edits + * @draft ICU 60 + */ + Edits(Edits &&src) U_NOEXCEPT : + array(stackArray), capacity(STACK_CAPACITY), length(src.length), + delta(src.delta), numChanges(src.numChanges), + errorCode_(src.errorCode_) { + moveArray(src); + } + + /** + * Destructor. + * @draft ICU 59 + */ + ~Edits(); + + /** + * Assignment operator. + * @param other source edits + * @return *this + * @draft ICU 60 + */ + Edits &operator=(const Edits &other); + + /** + * Move assignment operator, might leave src empty. + * This object will have the same contents that the source object had. + * The behavior is undefined if *this and src are the same object. + * @param src source edits + * @return *this + * @draft ICU 60 + */ + Edits &operator=(Edits &&src) U_NOEXCEPT; + + /** + * Resets the data but may not release memory. + * @draft ICU 59 + */ + void reset() U_NOEXCEPT; + + /** + * Adds a record for an unchanged segment of text. + * Normally called from inside ICU string transformation functions, not user code. + * @draft ICU 59 + */ + void addUnchanged(int32_t unchangedLength); + /** + * Adds a record for a text replacement/insertion/deletion. + * Normally called from inside ICU string transformation functions, not user code. + * @draft ICU 59 + */ + void addReplace(int32_t oldLength, int32_t newLength); + /** + * Sets the UErrorCode if an error occurred while recording edits. + * Preserves older error codes in the outErrorCode. + * Normally called from inside ICU string transformation functions, not user code. + * @param outErrorCode Set to an error code if it does not contain one already + * and an error occurred while recording edits. + * Otherwise unchanged. + * @return TRUE if U_FAILURE(outErrorCode) + * @draft ICU 59 + */ + UBool copyErrorTo(UErrorCode &outErrorCode); + + /** + * How much longer is the new text compared with the old text? + * @return new length minus old length + * @draft ICU 59 + */ + int32_t lengthDelta() const { return delta; } + /** + * @return TRUE if there are any change edits + * @draft ICU 59 + */ + UBool hasChanges() const { return numChanges != 0; } + + /** + * @return the number of change edits + * @draft ICU 60 + */ + int32_t numberOfChanges() const { return numChanges; } + + /** + * Access to the list of edits. + * @see getCoarseIterator + * @see getFineIterator + * @draft ICU 59 + */ + struct U_COMMON_API Iterator U_FINAL : public UMemory { + /** + * Default constructor, empty iterator. + * @draft ICU 60 + */ + Iterator() : + array(nullptr), index(0), length(0), + remaining(0), onlyChanges_(FALSE), coarse(FALSE), + dir(0), changed(FALSE), oldLength_(0), newLength_(0), + srcIndex(0), replIndex(0), destIndex(0) {} + /** + * Copy constructor. + * @draft ICU 59 + */ + Iterator(const Iterator &other) = default; + /** + * Assignment operator. + * @draft ICU 59 + */ + Iterator &operator=(const Iterator &other) = default; + + /** + * Advances to the next edit. + * @param errorCode ICU error code. Its input value must pass the U_SUCCESS() test, + * or else the function returns immediately. Check for U_FAILURE() + * on output or use with function chaining. (See User Guide for details.) + * @return TRUE if there is another edit + * @draft ICU 59 + */ + UBool next(UErrorCode &errorCode) { return next(onlyChanges_, errorCode); } + + /** + * Finds the edit that contains the source index. + * The source index may be found in a non-change + * even if normal iteration would skip non-changes. + * Normal iteration can continue from a found edit. + * + * The iterator state before this search logically does not matter. + * (It may affect the performance of the search.) + * + * The iterator state after this search is undefined + * if the source index is out of bounds for the source string. + * + * @param i source index + * @param errorCode ICU error code. Its input value must pass the U_SUCCESS() test, + * or else the function returns immediately. Check for U_FAILURE() + * on output or use with function chaining. (See User Guide for details.) + * @return TRUE if the edit for the source index was found + * @draft ICU 59 + */ + UBool findSourceIndex(int32_t i, UErrorCode &errorCode) { + return findIndex(i, TRUE, errorCode) == 0; + } + + /** + * Finds the edit that contains the destination index. + * The destination index may be found in a non-change + * even if normal iteration would skip non-changes. + * Normal iteration can continue from a found edit. + * + * The iterator state before this search logically does not matter. + * (It may affect the performance of the search.) + * + * The iterator state after this search is undefined + * if the source index is out of bounds for the source string. + * + * @param i destination index + * @param errorCode ICU error code. Its input value must pass the U_SUCCESS() test, + * or else the function returns immediately. Check for U_FAILURE() + * on output or use with function chaining. (See User Guide for details.) + * @return TRUE if the edit for the destination index was found + * @draft ICU 60 + */ + UBool findDestinationIndex(int32_t i, UErrorCode &errorCode) { + return findIndex(i, FALSE, errorCode) == 0; + } + + /** + * Returns the destination index corresponding to the given source index. + * If the source index is inside a change edit (not at its start), + * then the destination index at the end of that edit is returned, + * since there is no information about index mapping inside a change edit. + * + * (This means that indexes to the start and middle of an edit, + * for example around a grapheme cluster, are mapped to indexes + * encompassing the entire edit. + * The alternative, mapping an interior index to the start, + * would map such an interval to an empty one.) + * + * This operation will usually but not always modify this object. + * The iterator state after this search is undefined. + * + * @param i source index + * @param errorCode ICU error code. Its input value must pass the U_SUCCESS() test, + * or else the function returns immediately. Check for U_FAILURE() + * on output or use with function chaining. (See User Guide for details.) + * @return destination index; undefined if i is not 0..string length + * @draft ICU 60 + */ + int32_t destinationIndexFromSourceIndex(int32_t i, UErrorCode &errorCode); + + /** + * Returns the source index corresponding to the given destination index. + * If the destination index is inside a change edit (not at its start), + * then the source index at the end of that edit is returned, + * since there is no information about index mapping inside a change edit. + * + * (This means that indexes to the start and middle of an edit, + * for example around a grapheme cluster, are mapped to indexes + * encompassing the entire edit. + * The alternative, mapping an interior index to the start, + * would map such an interval to an empty one.) + * + * This operation will usually but not always modify this object. + * The iterator state after this search is undefined. + * + * @param i destination index + * @param errorCode ICU error code. Its input value must pass the U_SUCCESS() test, + * or else the function returns immediately. Check for U_FAILURE() + * on output or use with function chaining. (See User Guide for details.) + * @return source index; undefined if i is not 0..string length + * @draft ICU 60 + */ + int32_t sourceIndexFromDestinationIndex(int32_t i, UErrorCode &errorCode); + + /** + * @return TRUE if this edit replaces oldLength() units with newLength() different ones. + * FALSE if oldLength units remain unchanged. + * @draft ICU 59 + */ + UBool hasChange() const { return changed; } + /** + * @return the number of units in the original string which are replaced or remain unchanged. + * @draft ICU 59 + */ + int32_t oldLength() const { return oldLength_; } + /** + * @return the number of units in the modified string, if hasChange() is TRUE. + * Same as oldLength if hasChange() is FALSE. + * @draft ICU 59 + */ + int32_t newLength() const { return newLength_; } + + /** + * @return the current index into the source string + * @draft ICU 59 + */ + int32_t sourceIndex() const { return srcIndex; } + /** + * @return the current index into the replacement-characters-only string, + * not counting unchanged spans + * @draft ICU 59 + */ + int32_t replacementIndex() const { return replIndex; } + /** + * @return the current index into the full destination string + * @draft ICU 59 + */ + int32_t destinationIndex() const { return destIndex; } + + private: + friend class Edits; + + Iterator(const uint16_t *a, int32_t len, UBool oc, UBool crs); + + int32_t readLength(int32_t head); + void updateNextIndexes(); + void updatePreviousIndexes(); + UBool noNext(); + UBool next(UBool onlyChanges, UErrorCode &errorCode); + UBool previous(UErrorCode &errorCode); + /** @return -1: error or i<0; 0: found; 1: i>=string length */ + int32_t findIndex(int32_t i, UBool findSource, UErrorCode &errorCode); + + const uint16_t *array; + int32_t index, length; + // 0 if we are not within compressed equal-length changes. + // Otherwise the number of remaining changes, including the current one. + int32_t remaining; + UBool onlyChanges_, coarse; + + int8_t dir; // iteration direction: back(<0), initial(0), forward(>0) + UBool changed; + int32_t oldLength_, newLength_; + int32_t srcIndex, replIndex, destIndex; + }; + + /** + * Returns an Iterator for coarse-grained changes for simple string updates. + * Skips non-changes. + * @return an Iterator that merges adjacent changes. + * @draft ICU 59 + */ + Iterator getCoarseChangesIterator() const { + return Iterator(array, length, TRUE, TRUE); + } + + /** + * Returns an Iterator for coarse-grained changes and non-changes for simple string updates. + * @return an Iterator that merges adjacent changes. + * @draft ICU 59 + */ + Iterator getCoarseIterator() const { + return Iterator(array, length, FALSE, TRUE); + } + + /** + * Returns an Iterator for fine-grained changes for modifying styled text. + * Skips non-changes. + * @return an Iterator that separates adjacent changes. + * @draft ICU 59 + */ + Iterator getFineChangesIterator() const { + return Iterator(array, length, TRUE, FALSE); + } + + /** + * Returns an Iterator for fine-grained changes and non-changes for modifying styled text. + * @return an Iterator that separates adjacent changes. + * @draft ICU 59 + */ + Iterator getFineIterator() const { + return Iterator(array, length, FALSE, FALSE); + } + + /** + * Merges the two input Edits and appends the result to this object. + * + * Consider two string transformations (for example, normalization and case mapping) + * where each records Edits in addition to writing an output string.
      + * Edits ab reflect how substrings of input string a + * map to substrings of intermediate string b.
      + * Edits bc reflect how substrings of intermediate string b + * map to substrings of output string c.
      + * This function merges ab and bc such that the additional edits + * recorded in this object reflect how substrings of input string a + * map to substrings of output string c. + * + * If unrelated Edits are passed in where the output string of the first + * has a different length than the input string of the second, + * then a U_ILLEGAL_ARGUMENT_ERROR is reported. + * + * @param ab reflects how substrings of input string a + * map to substrings of intermediate string b. + * @param bc reflects how substrings of intermediate string b + * map to substrings of output string c. + * @param errorCode ICU error code. Its input value must pass the U_SUCCESS() test, + * or else the function returns immediately. Check for U_FAILURE() + * on output or use with function chaining. (See User Guide for details.) + * @return *this, with the merged edits appended + * @draft ICU 60 + */ + Edits &mergeAndAppend(const Edits &ab, const Edits &bc, UErrorCode &errorCode); + +private: + void releaseArray() U_NOEXCEPT; + Edits ©Array(const Edits &other); + Edits &moveArray(Edits &src) U_NOEXCEPT; + + void setLastUnit(int32_t last) { array[length - 1] = (uint16_t)last; } + int32_t lastUnit() const { return length > 0 ? array[length - 1] : 0xffff; } + + void append(int32_t r); + UBool growArray(); + + static const int32_t STACK_CAPACITY = 100; + uint16_t *array; + int32_t capacity; + int32_t length; + int32_t delta; + int32_t numChanges; + UErrorCode errorCode_; + uint16_t stackArray[STACK_CAPACITY]; +}; + +#endif // U_HIDE_DRAFT_API + +U_NAMESPACE_END + +#endif // __EDITS_H__ diff --git a/Build/source/libs/icu/icu-src/source/common/unicode/enumset.h b/Build/source/libs/icu/icu-src/source/common/unicode/enumset.h index 9c15b9a9675..f63dd1622e2 100644 --- a/Build/source/libs/icu/icu-src/source/common/unicode/enumset.h +++ b/Build/source/libs/icu/icu-src/source/common/unicode/enumset.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ****************************************************************************** diff --git a/Build/source/libs/icu/icu-src/source/common/unicode/errorcode.h b/Build/source/libs/icu/icu-src/source/common/unicode/errorcode.h index 13f43e19919..81cad207452 100644 --- a/Build/source/libs/icu/icu-src/source/common/unicode/errorcode.h +++ b/Build/source/libs/icu/icu-src/source/common/unicode/errorcode.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* @@ -8,7 +8,7 @@ * ******************************************************************************* * file name: errorcode.h -* encoding: US-ASCII +* encoding: UTF-8 * tab size: 8 (not used) * indentation:4 * diff --git a/Build/source/libs/icu/icu-src/source/common/unicode/filteredbrk.h b/Build/source/libs/icu/icu-src/source/common/unicode/filteredbrk.h index 261151138cd..a0319bf0a76 100644 --- a/Build/source/libs/icu/icu-src/source/common/unicode/filteredbrk.h +++ b/Build/source/libs/icu/icu-src/source/common/unicode/filteredbrk.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************** @@ -55,14 +55,30 @@ class U_COMMON_API FilteredBreakIteratorBuilder : public UObject { */ static FilteredBreakIteratorBuilder *createInstance(const Locale& where, UErrorCode& status); +#ifndef U_HIDE_DEPRECATED_API + /** + * This function has been deprecated in favor of createEmptyInstance, which has + * identical behavior. + * @param status The error code. + * @return the new builder + * @deprecated ICU 60 use createEmptyInstance instead + * @see createEmptyInstance() + */ + static inline FilteredBreakIteratorBuilder *createInstance(UErrorCode &status) { + return createEmptyInstance(status); + } +#endif /* U_HIDE_DEPRECATED_API */ + +#ifndef U_HIDE_DRAFT_API /** * Construct an empty FilteredBreakIteratorBuilder. * In this state, it will not suppress any segment boundaries. * @param status The error code. * @return the new builder - * @stable ICU 56 + * @draft ICU 60 */ - static FilteredBreakIteratorBuilder *createInstance(UErrorCode &status); + static FilteredBreakIteratorBuilder *createEmptyInstance(UErrorCode &status); +#endif /* U_HIDE_DRAFT_API */ /** * Suppress a certain string from being the end of a segment. @@ -89,6 +105,20 @@ class U_COMMON_API FilteredBreakIteratorBuilder : public UObject { */ virtual UBool unsuppressBreakAfter(const UnicodeString& string, UErrorCode& status) = 0; +#ifndef U_HIDE_DEPRECATED_API + /** + * This function has been deprecated in favor of wrapIteratorWithFilter() + * The behavior is identical. + * @param adoptBreakIterator the break iterator to adopt + * @param status error code + * @return the new BreakIterator, owned by the caller. + * @deprecated ICU 60 use wrapIteratorWithFilter() instead + * @see wrapBreakIteratorWithFilter() + */ + virtual BreakIterator *build(BreakIterator* adoptBreakIterator, UErrorCode& status) = 0; +#endif /* U_HIDE_DEPRECATED_API */ + +#ifndef U_HIDE_DRAFT_API /** * Wrap (adopt) an existing break iterator in a new filtered instance. * The resulting BreakIterator is owned by the caller. @@ -96,12 +126,16 @@ class U_COMMON_API FilteredBreakIteratorBuilder : public UObject { * Note that the adoptBreakIterator is adopted by the new BreakIterator * and should no longer be used by the caller. * The FilteredBreakIteratorBuilder may be reused. + * This function is an alias for build() * @param adoptBreakIterator the break iterator to adopt * @param status error code * @return the new BreakIterator, owned by the caller. - * @stable ICU 56 + * @draft ICU 60 */ - virtual BreakIterator *build(BreakIterator* adoptBreakIterator, UErrorCode& status) = 0; + inline BreakIterator *wrapIteratorWithFilter(BreakIterator* adoptBreakIterator, UErrorCode& status) { + return build(adoptBreakIterator, status); + } +#endif /* U_HIDE_DRAFT_API */ protected: /** diff --git a/Build/source/libs/icu/icu-src/source/common/unicode/icudataver.h b/Build/source/libs/icu/icu-src/source/common/unicode/icudataver.h index 99e7c284543..1cb202e3d45 100644 --- a/Build/source/libs/icu/icu-src/source/common/unicode/icudataver.h +++ b/Build/source/libs/icu/icu-src/source/common/unicode/icudataver.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ****************************************************************************** diff --git a/Build/source/libs/icu/icu-src/source/common/unicode/icuplug.h b/Build/source/libs/icu/icu-src/source/common/unicode/icuplug.h index cffa6f359f9..1a894a71c4a 100644 --- a/Build/source/libs/icu/icu-src/source/common/unicode/icuplug.h +++ b/Build/source/libs/icu/icu-src/source/common/unicode/icuplug.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ****************************************************************************** diff --git a/Build/source/libs/icu/icu-src/source/common/unicode/idna.h b/Build/source/libs/icu/icu-src/source/common/unicode/idna.h index 23a1d7ca0e8..f08658e502e 100644 --- a/Build/source/libs/icu/icu-src/source/common/unicode/idna.h +++ b/Build/source/libs/icu/icu-src/source/common/unicode/idna.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* @@ -6,7 +6,7 @@ * Corporation and others. All Rights Reserved. ******************************************************************************* * file name: idna.h -* encoding: US-ASCII +* encoding: UTF-8 * tab size: 8 (not used) * indentation:4 * diff --git a/Build/source/libs/icu/icu-src/source/common/unicode/listformatter.h b/Build/source/libs/icu/icu-src/source/common/unicode/listformatter.h index f2c898881a7..180fbcb5cde 100644 --- a/Build/source/libs/icu/icu-src/source/common/unicode/listformatter.h +++ b/Build/source/libs/icu/icu-src/source/common/unicode/listformatter.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* @@ -8,7 +8,7 @@ * ******************************************************************************* * file name: listformatter.h -* encoding: US-ASCII +* encoding: UTF-8 * tab size: 8 (not used) * indentation:4 * @@ -157,6 +157,8 @@ class U_COMMON_API ListFormatter : public UObject{ private: static void initializeHash(UErrorCode& errorCode); static const ListFormatInternal* getListFormatInternal(const Locale& locale, const char *style, UErrorCode& errorCode); + struct ListPatternsSink; + static ListFormatInternal* loadListFormatInternal(const Locale& locale, const char* style, UErrorCode& errorCode); ListFormatter(); diff --git a/Build/source/libs/icu/icu-src/source/common/unicode/localpointer.h b/Build/source/libs/icu/icu-src/source/common/unicode/localpointer.h index 9ac5de5f06d..e17ee3d886e 100644 --- a/Build/source/libs/icu/icu-src/source/common/unicode/localpointer.h +++ b/Build/source/libs/icu/icu-src/source/common/unicode/localpointer.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* @@ -8,7 +8,7 @@ * ******************************************************************************* * file name: localpointer.h -* encoding: US-ASCII +* encoding: UTF-8 * tab size: 8 (not used) * indentation:4 * @@ -174,9 +174,9 @@ private: * \code * LocalPointer s(new UnicodeString((UChar32)0x50005)); * int32_t length=s->length(); // 2 - * UChar lead=s->charAt(0); // 0xd900 + * char16_t lead=s->charAt(0); // 0xd900 * if(some condition) { return; } // no need to explicitly delete the pointer - * s.adoptInstead(new UnicodeString((UChar)0xfffc)); + * s.adoptInstead(new UnicodeString((char16_t)0xfffc)); * length=s->length(); // 1 * // no need to explicitly delete the pointer * \endcode @@ -213,7 +213,6 @@ public: errorCode=U_MEMORY_ALLOCATION_ERROR; } } -#if U_HAVE_RVALUE_REFERENCES /** * Move constructor, leaves src with isNull(). * @param src source smart pointer @@ -222,7 +221,6 @@ public: LocalPointer(LocalPointer &&src) U_NOEXCEPT : LocalPointerBase(src.ptr) { src.ptr=NULL; } -#endif /** * Destructor deletes the object it owns. * @stable ICU 4.4 @@ -230,7 +228,6 @@ public: ~LocalPointer() { delete LocalPointerBase::ptr; } -#if U_HAVE_RVALUE_REFERENCES /** * Move assignment operator, leaves src with isNull(). * The behavior is undefined if *this and src are the same object. @@ -241,7 +238,6 @@ public: LocalPointer &operator=(LocalPointer &&src) U_NOEXCEPT { return moveFrom(src); } -#endif // do not use #ifndef U_HIDE_DRAFT_API for moveFrom, needed by non-draft API /** * Move assignment, leaves src with isNull(). @@ -323,10 +319,10 @@ public: * Usage example: * \code * LocalArray a(new UnicodeString[2]); - * a[0].append((UChar)0x61); + * a[0].append((char16_t)0x61); * if(some condition) { return; } // no need to explicitly delete the array * a.adoptInstead(new UnicodeString[4]); - * a[3].append((UChar)0x62).append((UChar)0x63).reverse(); + * a[3].append((char16_t)0x62).append((char16_t)0x63).reverse(); * // no need to explicitly delete the array * \endcode * @@ -362,7 +358,6 @@ public: errorCode=U_MEMORY_ALLOCATION_ERROR; } } -#if U_HAVE_RVALUE_REFERENCES /** * Move constructor, leaves src with isNull(). * @param src source smart pointer @@ -371,7 +366,6 @@ public: LocalArray(LocalArray &&src) U_NOEXCEPT : LocalPointerBase(src.ptr) { src.ptr=NULL; } -#endif /** * Destructor deletes the array it owns. * @stable ICU 4.4 @@ -379,7 +373,6 @@ public: ~LocalArray() { delete[] LocalPointerBase::ptr; } -#if U_HAVE_RVALUE_REFERENCES /** * Move assignment operator, leaves src with isNull(). * The behavior is undefined if *this and src are the same object. @@ -390,7 +383,6 @@ public: LocalArray &operator=(LocalArray &&src) U_NOEXCEPT { return moveFrom(src); } -#endif // do not use #ifndef U_HIDE_DRAFT_API for moveFrom, needed by non-draft API /** * Move assignment, leaves src with isNull(). @@ -492,7 +484,6 @@ public: * @see LocalPointer * @stable ICU 4.4 */ -#if U_HAVE_RVALUE_REFERENCES #define U_DEFINE_LOCAL_OPEN_POINTER(LocalPointerClassName, Type, closeFunction) \ class LocalPointerClassName : public LocalPointerBase { \ public: \ @@ -526,34 +517,6 @@ public: ptr=p; \ } \ } -#else -#define U_DEFINE_LOCAL_OPEN_POINTER(LocalPointerClassName, Type, closeFunction) \ - class LocalPointerClassName : public LocalPointerBase { \ - public: \ - using LocalPointerBase::operator*; \ - using LocalPointerBase::operator->; \ - explicit LocalPointerClassName(Type *p=NULL) : LocalPointerBase(p) {} \ - ~LocalPointerClassName() { closeFunction(ptr); } \ - LocalPointerClassName &moveFrom(LocalPointerClassName &src) U_NOEXCEPT { \ - if (ptr != NULL) { closeFunction(ptr); } \ - LocalPointerBase::ptr=src.ptr; \ - src.ptr=NULL; \ - return *this; \ - } \ - void swap(LocalPointerClassName &other) U_NOEXCEPT { \ - Type *temp=LocalPointerBase::ptr; \ - LocalPointerBase::ptr=other.ptr; \ - other.ptr=temp; \ - } \ - friend inline void swap(LocalPointerClassName &p1, LocalPointerClassName &p2) U_NOEXCEPT { \ - p1.swap(p2); \ - } \ - void adoptInstead(Type *p) { \ - if (ptr != NULL) { closeFunction(ptr); } \ - ptr=p; \ - } \ - } -#endif U_NAMESPACE_END diff --git a/Build/source/libs/icu/icu-src/source/common/unicode/locdspnm.h b/Build/source/libs/icu/icu-src/source/common/unicode/locdspnm.h index b8c7a0ccae9..7f227829b4c 100644 --- a/Build/source/libs/icu/icu-src/source/common/unicode/locdspnm.h +++ b/Build/source/libs/icu/icu-src/source/common/unicode/locdspnm.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ****************************************************************************** @@ -20,6 +20,7 @@ #if !UCONFIG_NO_FORMATTING #include "unicode/locid.h" +#include "unicode/strenum.h" #include "unicode/uscript.h" #include "unicode/uldnames.h" #include "unicode/udisplaycontext.h" diff --git a/Build/source/libs/icu/icu-src/source/common/unicode/locid.h b/Build/source/libs/icu/icu-src/source/common/unicode/locid.h index a8ddb7f32c9..dd7d068a4e5 100644 --- a/Build/source/libs/icu/icu-src/source/common/unicode/locid.h +++ b/Build/source/libs/icu/icu-src/source/common/unicode/locid.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ****************************************************************************** @@ -33,10 +33,8 @@ #include "unicode/utypes.h" #include "unicode/uobject.h" -#include "unicode/unistr.h" #include "unicode/putil.h" #include "unicode/uloc.h" -#include "unicode/strenum.h" /** * \file @@ -48,6 +46,9 @@ U_NAMESPACE_BEGIN // Forward Declarations void U_CALLCONV locale_available_init(); /**< @internal */ +class StringEnumeration; +class UnicodeString; + /** * A Locale object represents a specific geographical, political, * or cultural region. An operation that requires a Locale to perform @@ -87,7 +88,7 @@ void U_CALLCONV locale_available_init(); /**< @internal */ *

      * The third constructor requires a third argument--the Variant. * The Variant codes are vendor and browser-specific. - * For example, use REVISED for a langauge's revised script orthography, and POSIX for POSIX. + * For example, use REVISED for a language's revised script orthography, and POSIX for POSIX. * Where there are two variants, separate them with an underscore, and * put the most important one first. For * example, a Traditional Spanish collation might be referenced, with diff --git a/Build/source/libs/icu/icu-src/source/common/unicode/messagepattern.h b/Build/source/libs/icu/icu-src/source/common/unicode/messagepattern.h index 8c1115e04dc..f28adafee0d 100644 --- a/Build/source/libs/icu/icu-src/source/common/unicode/messagepattern.h +++ b/Build/source/libs/icu/icu-src/source/common/unicode/messagepattern.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* @@ -6,7 +6,7 @@ * Corporation and others. All Rights Reserved. ******************************************************************************* * file name: messagepattern.h -* encoding: US-ASCII +* encoding: UTF-8 * tab size: 8 (not used) * indentation:4 * diff --git a/Build/source/libs/icu/icu-src/source/common/unicode/normalizer2.h b/Build/source/libs/icu/icu-src/source/common/unicode/normalizer2.h index 6a7668bfd5f..8a6d7138021 100644 --- a/Build/source/libs/icu/icu-src/source/common/unicode/normalizer2.h +++ b/Build/source/libs/icu/icu-src/source/common/unicode/normalizer2.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* @@ -8,7 +8,7 @@ * ******************************************************************************* * file name: normalizer2.h -* encoding: US-ASCII +* encoding: UTF-8 * tab size: 8 (not used) * indentation:4 * @@ -28,12 +28,15 @@ #if !UCONFIG_NO_NORMALIZATION +#include "unicode/stringpiece.h" #include "unicode/uniset.h" #include "unicode/unistr.h" #include "unicode/unorm2.h" U_NAMESPACE_BEGIN +class ByteSink; + /** * Unicode normalization functionality for standard Unicode normalization or * for using custom mapping tables. @@ -215,6 +218,35 @@ public: normalize(const UnicodeString &src, UnicodeString &dest, UErrorCode &errorCode) const = 0; + + /** + * Normalizes a UTF-8 string and optionally records how source substrings + * relate to changed and unchanged result substrings. + * + * Currently implemented completely only for "compose" modes, + * such as for NFC, NFKC, and NFKC_Casefold + * (UNORM2_COMPOSE and UNORM2_COMPOSE_CONTIGUOUS). + * Otherwise currently converts to & from UTF-16 and does not support edits. + * + * @param options Options bit set, usually 0. See U_OMIT_UNCHANGED_TEXT and U_EDITS_NO_RESET. + * @param src Source UTF-8 string. + * @param sink A ByteSink to which the normalized UTF-8 result string is written. + * sink.Flush() is called at the end. + * @param edits Records edits for index mapping, working with styled text, + * and getting only changes (if any). + * The Edits contents is undefined if any error occurs. + * This function calls edits->reset() first unless + * options includes U_EDITS_NO_RESET. edits can be nullptr. + * @param errorCode Standard ICU error code. Its input value must + * pass the U_SUCCESS() test, or else the function returns + * immediately. Check for U_FAILURE() on output or use with + * function chaining. (See User Guide for details.) + * @draft ICU 60 + */ + virtual void + normalizeUTF8(uint32_t options, StringPiece src, ByteSink &sink, + Edits *edits, UErrorCode &errorCode) const; + /** * Appends the normalized form of the second string to the first string * (merging them at the boundary) and returns the first string. @@ -282,7 +314,7 @@ public: * * When used on a standard NFC Normalizer2 instance, * it returns the Decomposition_Mapping only if the Decomposition_Type (dt) is Canonical (Can); - * in this case, the result contains either one or two code points (=1..4 UChars). + * in this case, the result contains either one or two code points (=1..4 char16_ts). * * This function is independent of the mode of the Normalizer2. * The default implementation returns FALSE. @@ -340,6 +372,30 @@ public: */ virtual UBool isNormalized(const UnicodeString &s, UErrorCode &errorCode) const = 0; + /** + * Tests if the UTF-8 string is normalized. + * Internally, in cases where the quickCheck() method would return "maybe" + * (which is only possible for the two COMPOSE modes) this method + * resolves to "yes" or "no" to provide a definitive result, + * at the cost of doing more work in those cases. + * + * This works for all normalization modes, + * but it is currently optimized for UTF-8 only for "compose" modes, + * such as for NFC, NFKC, and NFKC_Casefold + * (UNORM2_COMPOSE and UNORM2_COMPOSE_CONTIGUOUS). + * For other modes it currently converts to UTF-16 and calls isNormalized(). + * + * @param s UTF-8 input string + * @param errorCode Standard ICU error code. Its input value must + * pass the U_SUCCESS() test, or else the function returns + * immediately. Check for U_FAILURE() on output or use with + * function chaining. (See User Guide for details.) + * @return TRUE if s is normalized + * @draft ICU 60 + */ + virtual UBool + isNormalizedUTF8(StringPiece s, UErrorCode &errorCode) const; + /** * Tests if the string is normalized. @@ -479,7 +535,36 @@ public: virtual UnicodeString & normalize(const UnicodeString &src, UnicodeString &dest, - UErrorCode &errorCode) const; + UErrorCode &errorCode) const U_OVERRIDE; + + /** + * Normalizes a UTF-8 string and optionally records how source substrings + * relate to changed and unchanged result substrings. + * + * Currently implemented completely only for "compose" modes, + * such as for NFC, NFKC, and NFKC_Casefold + * (UNORM2_COMPOSE and UNORM2_COMPOSE_CONTIGUOUS). + * Otherwise currently converts to & from UTF-16 and does not support edits. + * + * @param options Options bit set, usually 0. See U_OMIT_UNCHANGED_TEXT and U_EDITS_NO_RESET. + * @param src Source UTF-8 string. + * @param sink A ByteSink to which the normalized UTF-8 result string is written. + * sink.Flush() is called at the end. + * @param edits Records edits for index mapping, working with styled text, + * and getting only changes (if any). + * The Edits contents is undefined if any error occurs. + * This function calls edits->reset() first unless + * options includes U_EDITS_NO_RESET. edits can be nullptr. + * @param errorCode Standard ICU error code. Its input value must + * pass the U_SUCCESS() test, or else the function returns + * immediately. Check for U_FAILURE() on output or use with + * function chaining. (See User Guide for details.) + * @draft ICU 60 + */ + virtual void + normalizeUTF8(uint32_t options, StringPiece src, ByteSink &sink, + Edits *edits, UErrorCode &errorCode) const U_OVERRIDE; + /** * Appends the normalized form of the second string to the first string * (merging them at the boundary) and returns the first string. @@ -497,7 +582,7 @@ public: virtual UnicodeString & normalizeSecondAndAppend(UnicodeString &first, const UnicodeString &second, - UErrorCode &errorCode) const; + UErrorCode &errorCode) const U_OVERRIDE; /** * Appends the second string to the first string * (merging them at the boundary) and returns the first string. @@ -515,7 +600,7 @@ public: virtual UnicodeString & append(UnicodeString &first, const UnicodeString &second, - UErrorCode &errorCode) const; + UErrorCode &errorCode) const U_OVERRIDE; /** * Gets the decomposition mapping of c. @@ -529,7 +614,7 @@ public: * @stable ICU 4.6 */ virtual UBool - getDecomposition(UChar32 c, UnicodeString &decomposition) const; + getDecomposition(UChar32 c, UnicodeString &decomposition) const U_OVERRIDE; /** * Gets the raw decomposition mapping of c. @@ -543,7 +628,7 @@ public: * @stable ICU 49 */ virtual UBool - getRawDecomposition(UChar32 c, UnicodeString &decomposition) const; + getRawDecomposition(UChar32 c, UnicodeString &decomposition) const U_OVERRIDE; /** * Performs pairwise composition of a & b and returns the composite if there is one. @@ -556,7 +641,7 @@ public: * @stable ICU 49 */ virtual UChar32 - composePair(UChar32 a, UChar32 b) const; + composePair(UChar32 a, UChar32 b) const U_OVERRIDE; /** * Gets the combining class of c. @@ -567,7 +652,7 @@ public: * @stable ICU 49 */ virtual uint8_t - getCombiningClass(UChar32 c) const; + getCombiningClass(UChar32 c) const U_OVERRIDE; /** * Tests if the string is normalized. @@ -581,7 +666,30 @@ public: * @stable ICU 4.4 */ virtual UBool - isNormalized(const UnicodeString &s, UErrorCode &errorCode) const; + isNormalized(const UnicodeString &s, UErrorCode &errorCode) const U_OVERRIDE; + /** + * Tests if the UTF-8 string is normalized. + * Internally, in cases where the quickCheck() method would return "maybe" + * (which is only possible for the two COMPOSE modes) this method + * resolves to "yes" or "no" to provide a definitive result, + * at the cost of doing more work in those cases. + * + * This works for all normalization modes, + * but it is currently optimized for UTF-8 only for "compose" modes, + * such as for NFC, NFKC, and NFKC_Casefold + * (UNORM2_COMPOSE and UNORM2_COMPOSE_CONTIGUOUS). + * For other modes it currently converts to UTF-16 and calls isNormalized(). + * + * @param s UTF-8 input string + * @param errorCode Standard ICU error code. Its input value must + * pass the U_SUCCESS() test, or else the function returns + * immediately. Check for U_FAILURE() on output or use with + * function chaining. (See User Guide for details.) + * @return TRUE if s is normalized + * @draft ICU 60 + */ + virtual UBool + isNormalizedUTF8(StringPiece s, UErrorCode &errorCode) const U_OVERRIDE; /** * Tests if the string is normalized. * For details see the Normalizer2 base class documentation. @@ -594,7 +702,7 @@ public: * @stable ICU 4.4 */ virtual UNormalizationCheckResult - quickCheck(const UnicodeString &s, UErrorCode &errorCode) const; + quickCheck(const UnicodeString &s, UErrorCode &errorCode) const U_OVERRIDE; /** * Returns the end of the normalized substring of the input string. * For details see the Normalizer2 base class documentation. @@ -607,7 +715,7 @@ public: * @stable ICU 4.4 */ virtual int32_t - spanQuickCheckYes(const UnicodeString &s, UErrorCode &errorCode) const; + spanQuickCheckYes(const UnicodeString &s, UErrorCode &errorCode) const U_OVERRIDE; /** * Tests if the character always has a normalization boundary before it, @@ -617,7 +725,7 @@ public: * @return TRUE if c has a normalization boundary before it * @stable ICU 4.4 */ - virtual UBool hasBoundaryBefore(UChar32 c) const; + virtual UBool hasBoundaryBefore(UChar32 c) const U_OVERRIDE; /** * Tests if the character always has a normalization boundary after it, @@ -627,7 +735,7 @@ public: * @return TRUE if c has a normalization boundary after it * @stable ICU 4.4 */ - virtual UBool hasBoundaryAfter(UChar32 c) const; + virtual UBool hasBoundaryAfter(UChar32 c) const U_OVERRIDE; /** * Tests if the character is normalization-inert. @@ -636,7 +744,7 @@ public: * @return TRUE if c is normalization-inert * @stable ICU 4.4 */ - virtual UBool isInert(UChar32 c) const; + virtual UBool isInert(UChar32 c) const U_OVERRIDE; private: UnicodeString & normalize(const UnicodeString &src, @@ -644,6 +752,12 @@ private: USetSpanCondition spanCondition, UErrorCode &errorCode) const; + void + normalizeUTF8(uint32_t options, const char *src, int32_t length, + ByteSink &sink, Edits *edits, + USetSpanCondition spanCondition, + UErrorCode &errorCode) const; + UnicodeString & normalizeSecondAndAppend(UnicodeString &first, const UnicodeString &second, diff --git a/Build/source/libs/icu/icu-src/source/common/unicode/normlzr.h b/Build/source/libs/icu/icu-src/source/common/unicode/normlzr.h index d529aa23ab4..0141058fb00 100644 --- a/Build/source/libs/icu/icu-src/source/common/unicode/normlzr.h +++ b/Build/source/libs/icu/icu-src/source/common/unicode/normlzr.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************** @@ -168,7 +168,7 @@ public: * @param mode The normalization mode. * @deprecated ICU 56 Use Normalizer2 instead. */ - Normalizer(const UChar* str, int32_t length, UNormalizationMode mode); + Normalizer(ConstChar16Ptr str, int32_t length, UNormalizationMode mode); /** * Creates a new Normalizer object for iterating over the @@ -704,7 +704,7 @@ public: * @param status a UErrorCode * @deprecated ICU 56 Use Normalizer2 instead. */ - void setText(const UChar* newText, + void setText(ConstChar16Ptr newText, int32_t length, UErrorCode &status); /** @@ -796,8 +796,8 @@ Normalizer::compare(const UnicodeString &s1, const UnicodeString &s2, uint32_t options, UErrorCode &errorCode) { // all argument checking is done in unorm_compare - return unorm_compare(s1.getBuffer(), s1.length(), - s2.getBuffer(), s2.length(), + return unorm_compare(toUCharPtr(s1.getBuffer()), s1.length(), + toUCharPtr(s2.getBuffer()), s2.length(), options, &errorCode); } diff --git a/Build/source/libs/icu/icu-src/source/common/unicode/parseerr.h b/Build/source/libs/icu/icu-src/source/common/unicode/parseerr.h index 71aef40e23a..fc1e3f4c8e6 100644 --- a/Build/source/libs/icu/icu-src/source/common/unicode/parseerr.h +++ b/Build/source/libs/icu/icu-src/source/common/unicode/parseerr.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** diff --git a/Build/source/libs/icu/icu-src/source/common/unicode/parsepos.h b/Build/source/libs/icu/icu-src/source/common/unicode/parsepos.h index 1f74ebda9bf..bbebca7b571 100644 --- a/Build/source/libs/icu/icu-src/source/common/unicode/parsepos.h +++ b/Build/source/libs/icu/icu-src/source/common/unicode/parsepos.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* * Copyright (C) 1997-2005, International Business Machines Corporation and others. All Rights Reserved. diff --git a/Build/source/libs/icu/icu-src/source/common/unicode/platform.h b/Build/source/libs/icu/icu-src/source/common/unicode/platform.h index b42bef83234..f220b1fc34d 100644 --- a/Build/source/libs/icu/icu-src/source/common/unicode/platform.h +++ b/Build/source/libs/icu/icu-src/source/common/unicode/platform.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ****************************************************************************** @@ -132,6 +132,8 @@ #define U_PF_BROWSER_NATIVE_CLIENT 4020 /** Android is based on Linux. @internal */ #define U_PF_ANDROID 4050 +/** Fuchsia is a POSIX-ish platform. @internal */ +#define U_PF_FUCHSIA 4100 /* Maximum value for Linux-based platform is 4499 */ /** z/OS is the successor to OS/390 which was the successor to MVS. @internal */ #define U_PF_OS390 9000 @@ -150,8 +152,10 @@ # define U_PLATFORM U_PF_ANDROID /* Android wchar_t support depends on the API level. */ # include -#elif defined(__native_client__) +#elif defined(__pnacl__) || defined(__native_client__) # define U_PLATFORM U_PF_BROWSER_NATIVE_CLIENT +#elif defined(__Fuchsia__) +# define U_PLATFORM U_PF_FUCHSIA #elif defined(linux) || defined(__linux__) || defined(__linux) # define U_PLATFORM U_PF_LINUX #elif defined(__APPLE__) && defined(__MACH__) @@ -192,6 +196,20 @@ # define U_PLATFORM U_PF_UNKNOWN #endif +/** + * \def UPRV_INCOMPLETE_CPP11_SUPPORT + * This switch turns off ICU 60 NumberFormatter code. + * By default, this switch is enabled on AIX and z/OS, + * which have poor C++11 support. + * + * NOTE: This switch is intended to be temporary; see #13393. + * + * @internal + */ +#ifndef UPRV_INCOMPLETE_CPP11_SUPPORT +# define UPRV_INCOMPLETE_CPP11_SUPPORT (U_PLATFORM == U_PF_AIX || U_PLATFORM == U_PF_OS390 || U_PLATFORM == U_PF_SOLARIS ) +#endif + /** * \def CYGWINMSVC * Defined if this is Windows with Cygwin, but using MSVC rather than gcc. @@ -233,6 +251,18 @@ # define U_PLATFORM_HAS_WIN32_API 0 #endif +/** + * \def U_PLATFORM_HAS_WINUWP_API + * Defines whether target is intended for Universal Windows Platform API + * Set to 1 for Windows10 Release Solution Configuration + * @internal + */ +#ifdef U_PLATFORM_HAS_WINUWP_API + /* Use the predefined value. */ +#else +# define U_PLATFORM_HAS_WINUWP_API 0 +#endif + /** * \def U_PLATFORM_IMPLEMENTS_POSIX * Defines whether the platform implements (most of) the POSIX API. @@ -318,42 +348,6 @@ # define U_HAVE_INTTYPES_H U_HAVE_STDINT_H #endif -/** - * \def U_IOSTREAM_SOURCE - * Defines what support for C++ streams is available. - * - * If U_IOSTREAM_SOURCE is set to 199711, then <iostream> is available - * (the ISO/IEC C++ FDIS was published in November 1997), and then - * one should qualify streams using the std namespace in ICU header - * files. - * Starting with ICU 49, this is the only supported version. - * - * If U_IOSTREAM_SOURCE is set to 198506, then <iostream.h> is - * available instead (in June 1985 Stroustrup published - * "An Extensible I/O Facility for C++" at the summer USENIX conference). - * Starting with ICU 49, this version is not supported any more. - * - * If U_IOSTREAM_SOURCE is 0 (or any value less than 199711), - * then C++ streams are not available and - * support for them will be silently suppressed in ICU. - * - * @internal - */ -#ifndef U_IOSTREAM_SOURCE -#define U_IOSTREAM_SOURCE 199711 -#endif - -/** - * \def U_HAVE_STD_STRING - * Defines whether the standard C++ (STL) <string> header is available. - * @internal - */ -#ifdef U_HAVE_STD_STRING - /* Use the predefined value. */ -#else -# define U_HAVE_STD_STRING 1 -#endif - /*===========================================================================*/ /** @{ Compiler and environment features */ /*===========================================================================*/ @@ -430,7 +424,7 @@ # define U_HAVE_DEBUG_LOCATION_NEW 0 #endif -/* Compatibility with non clang compilers: http://clang.llvm.org/docs/LanguageExtensions.html */ +/* Compatibility with compilers other than clang: http://clang.llvm.org/docs/LanguageExtensions.html */ #ifndef __has_attribute # define __has_attribute(x) 0 #endif @@ -497,20 +491,11 @@ # define U_CPLUSPLUS_VERSION 1 #endif -/** - * \def U_HAVE_RVALUE_REFERENCES - * Set to 1 if the compiler supports rvalue references. - * C++11 feature, necessary for move constructor & move assignment. - * @internal - */ -#ifdef U_HAVE_RVALUE_REFERENCES - /* Use the predefined value. */ -#elif U_CPLUSPLUS_VERSION >= 11 || __has_feature(cxx_rvalue_references) \ - || defined(__GXX_EXPERIMENTAL_CXX0X__) \ - || (defined(_MSC_VER) && _MSC_VER >= 1600) /* Visual Studio 2010 */ -# define U_HAVE_RVALUE_REFERENCES 1 -#else -# define U_HAVE_RVALUE_REFERENCES 0 +#if (U_PLATFORM == U_PF_AIX || U_PLATFORM == U_PF_OS390) && defined(__cplusplus) &&(U_CPLUSPLUS_VERSION < 11) +// add in std::nullptr_t +namespace std { + typedef decltype(nullptr) nullptr_t; +}; #endif /** @@ -537,17 +522,22 @@ * http://clang.llvm.org/docs/AttributeReference.html#fallthrough-clang-fallthrough * @internal */ -#ifdef __cplusplus +#ifndef __cplusplus + // Not for C. +#elif defined(U_FALLTHROUGH) + // Use the predefined value. +#elif defined(__clang__) + // Test for compiler vs. feature separately. + // Other compilers might choke on the feature test. # if __has_cpp_attribute(clang::fallthrough) || \ (__has_feature(cxx_attributes) && __has_warning("-Wimplicit-fallthrough")) # define U_FALLTHROUGH [[clang::fallthrough]] -# else -# define U_FALLTHROUGH # endif -#else -# define U_FALLTHROUGH #endif +#ifndef U_FALLTHROUGH +# define U_FALLTHROUGH +#endif /** @} */ @@ -764,6 +754,7 @@ * gcc 4.4 defines the __CHAR16_TYPE__ macro to a usable type but * does not support u"abc" string literals. * C++11 and C11 require support for UTF-16 literals + * TODO: Fix for plain C. Doesn't work on Mac. */ # if U_CPLUSPLUS_VERSION >= 11 || (defined(__STDC_VERSION__) && __STDC_VERSION__ >= 201112L) # define U_HAVE_CHAR16_T 1 @@ -857,6 +848,16 @@ # define U_CALLCONV U_EXPORT2 #endif +/** + * \def U_CALLCONV_FPTR + * Similar to U_CALLCONV, but only used on function pointers. + * @internal + */ +#if U_PLATFORM == U_PF_OS390 && defined(__cplusplus) +# define U_CALLCONV_FPTR U_CALLCONV +#else +# define U_CALLCONV_FPTR +#endif /* @} */ #endif diff --git a/Build/source/libs/icu/icu-src/source/common/unicode/ptypes.h b/Build/source/libs/icu/icu-src/source/common/unicode/ptypes.h index 69d7286d323..6eaf2dbf035 100644 --- a/Build/source/libs/icu/icu-src/source/common/unicode/ptypes.h +++ b/Build/source/libs/icu/icu-src/source/common/unicode/ptypes.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ****************************************************************************** diff --git a/Build/source/libs/icu/icu-src/source/common/unicode/putil.h b/Build/source/libs/icu/icu-src/source/common/unicode/putil.h index 63a7b9b3d43..406551a8d86 100644 --- a/Build/source/libs/icu/icu-src/source/common/unicode/putil.h +++ b/Build/source/libs/icu/icu-src/source/common/unicode/putil.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ****************************************************************************** diff --git a/Build/source/libs/icu/icu-src/source/common/unicode/rbbi.h b/Build/source/libs/icu/icu-src/source/common/unicode/rbbi.h index 9f2a1a62b36..521e502f119 100644 --- a/Build/source/libs/icu/icu-src/source/common/unicode/rbbi.h +++ b/Build/source/libs/icu/icu-src/source/common/unicode/rbbi.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* *************************************************************************** @@ -31,23 +31,14 @@ #include "unicode/schriter.h" #include "unicode/uchriter.h" - -struct UTrie; - U_NAMESPACE_BEGIN /** @internal */ +class LanguageBreakEngine; struct RBBIDataHeader; -class RuleBasedBreakIteratorTables; -class BreakIterator; class RBBIDataWrapper; -class UStack; -class LanguageBreakEngine; class UnhandledEngine; -struct RBBIStateTable; - - - +class UStack; /** * @@ -96,47 +87,49 @@ private: */ RBBIDataWrapper *fData; - /** Index of the Rule {tag} values for the most recent match. + /** + * The iteration state - current position, rule status for the current position, + * and whether the iterator ran off the end, yielding UBRK_DONE. + * Current position is pinned to be 0 < position <= text.length. + * Current position is always set to a boundary. * @internal */ - int32_t fLastRuleStatusIndex; + /** + * The current position of the iterator. Pinned, 0 < fPosition <= text.length. + * Never has the value UBRK_DONE (-1). + */ + int32_t fPosition; /** - * Rule tag value valid flag. - * Some iterator operations don't intrinsically set the correct tag value. - * This flag lets us lazily compute the value if we are ever asked for it. - * @internal - */ - UBool fLastStatusIndexValid; + * TODO: + */ + int32_t fRuleStatusIndex; /** - * Counter for the number of characters encountered with the "dictionary" - * flag set. - * @internal - */ - uint32_t fDictionaryCharCount; + * True when iteration has run off the end, and iterator functions should return UBRK_DONE. + */ + UBool fDone; /** - * When a range of characters is divided up using the dictionary, the break - * positions that are discovered are stored here, preventing us from having - * to use either the dictionary or the state table again until the iterator - * leaves this range of text. Has the most impact for line breaking. - * @internal + * Cache of previously determined boundary positions. */ - int32_t* fCachedBreakPositions; - + public: // TODO: debug, return to private. + class BreakCache; + BreakCache *fBreakCache; + private: /** - * The number of elements in fCachedBreakPositions + * Counter for the number of characters encountered with the "dictionary" + * flag set. * @internal */ - int32_t fNumCachedBreakPositions; + uint32_t fDictionaryCharCount; /** - * if fCachedBreakPositions is not null, this indicates which item in the - * cache the current iteration position refers to - * @internal + * Cache of boundary positions within a region of text that has been + * sub-divided by dictionary based breaking. */ - int32_t fPositionInCache; + class DictionaryCache; + DictionaryCache *fDictionaryCache; /** * @@ -179,13 +172,11 @@ private: */ RuleBasedBreakIterator(RBBIDataHeader* data, UErrorCode &status); - + /** @internal */ friend class RBBIRuleBuilder; /** @internal */ friend class BreakIterator; - - public: /** Default constructor. Creates an empty shell of an iterator, with no @@ -469,7 +460,10 @@ public: virtual UBool isBoundary(int32_t offset); /** - * Returns the current iteration position. + * Returns the current iteration position. Note that UBRK_DONE is never + * returned from this function; if iteration has run to the end of a + * string, current() will return the length of the string while + * next() will return UBRK_DONE). * @return The current iteration position. * @stable ICU 2.0 */ @@ -501,6 +495,7 @@ public: * Note: this function is not thread safe. It should not have been * declared const, and the const remains only for compatibility * reasons. (The function is logically const, but not bit-wise const). + * TODO: check this. Probably thread safe now. *

      * @return the status from the break rule that determined the most recently * returned break position. @@ -660,46 +655,31 @@ private: * Common initialization function, used by constructors and bufferClone. * @internal */ - void init(); + void init(UErrorCode &status); /** - * This method backs the iterator back up to a "safe position" in the text. - * This is a position that we know, without any context, must be a break position. - * The various calling methods then iterate forward from this safe position to - * the appropriate position to return. (For more information, see the description - * of buildBackwardsStateTable() in RuleBasedBreakIterator.Builder.) - * @param statetable state table used of moving backwards + * Iterate backwards from an arbitrary position in the input text using the Safe Reverse rules. + * This locates a "Safe Position" from which the forward break rules + * will operate correctly. A Safe Position is not necessarily a boundary itself. + * + * @param fromPosition the position in the input text to begin the iteration. * @internal */ - int32_t handlePrevious(const RBBIStateTable *statetable); + int32_t handlePrevious(int32_t fromPosition); /** - * This method is the actual implementation of the next() method. All iteration - * vectors through here. This method initializes the state machine to state 1 - * and advances through the text character by character until we reach the end - * of the text or the state machine transitions to state 0. We update our return - * value every time the state machine passes through a possible end state. - * @param statetable state table used of moving forwards - * @internal - */ - int32_t handleNext(const RBBIStateTable *statetable); - - - /** - * This is the function that actually implements dictionary-based - * breaking. Covering at least the range from startPos to endPos, - * it checks for dictionary characters, and if it finds them determines - * the appropriate object to deal with them. It may cache found breaks in - * fCachedBreakPositions as it goes. It may well also look at text outside - * the range startPos to endPos. - * If going forward, endPos is the normal Unicode break result, and - * if goind in reverse, startPos is the normal Unicode break result - * @param startPos The start position of a range of text - * @param endPos The end position of a range of text - * @param reverse The call is for the reverse direction + * Find a rule-based boundary by running the state machine. + * Input + * fPosition, the position in the text to begin from. + * Output + * fPosition: the boundary following the starting position. + * fDictionaryCharCount the number of dictionary characters encountered. + * If > 0, the segment will be further subdivided + * fRuleStatusIndex Info from the state table indicating which rules caused the boundary. + * * @internal */ - int32_t checkDictionary(int32_t startPos, int32_t endPos, UBool reverse); + int32_t handleNext(); /** @@ -710,11 +690,14 @@ private: */ const LanguageBreakEngine *getLanguageBreakEngine(UChar32 c); + public: +#ifndef U_HIDE_INTERNAL_API /** - * @internal + * Debugging function only. + * @internal */ - void makeRuleStatusValid(); - + void dumpCache(); +#endif /* U_HIDE_INTERNAL_API */ }; //------------------------------------------------------------------------------ diff --git a/Build/source/libs/icu/icu-src/source/common/unicode/rep.h b/Build/source/libs/icu/icu-src/source/common/unicode/rep.h index 6ffd1f49003..41fdc040497 100644 --- a/Build/source/libs/icu/icu-src/source/common/unicode/rep.h +++ b/Build/source/libs/icu/icu-src/source/common/unicode/rep.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ************************************************************************** @@ -93,7 +93,7 @@ public: * @return 16-bit code unit of text at given offset * @stable ICU 1.8 */ - inline UChar charAt(int32_t offset) const; + inline char16_t charAt(int32_t offset) const; /** * Returns the 32-bit code point at the given 16-bit offset into @@ -230,7 +230,7 @@ protected: * Virtual version of charAt(). * @stable ICU 2.4 */ - virtual UChar getCharAt(int32_t offset) const = 0; + virtual char16_t getCharAt(int32_t offset) const = 0; /** * Virtual version of char32At(). @@ -246,7 +246,7 @@ Replaceable::length() const { return getLength(); } -inline UChar +inline char16_t Replaceable::charAt(int32_t offset) const { return getCharAt(offset); } diff --git a/Build/source/libs/icu/icu-src/source/common/unicode/resbund.h b/Build/source/libs/icu/icu-src/source/common/unicode/resbund.h index 927a65b79be..b522a7a6154 100644 --- a/Build/source/libs/icu/icu-src/source/common/unicode/resbund.h +++ b/Build/source/libs/icu/icu-src/source/common/unicode/resbund.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ****************************************************************************** @@ -216,7 +216,7 @@ public: * could be U_MISSING_RESOURCE_ERROR if the key is not found * could be a warning * e.g.: U_USING_FALLBACK_WARNING,U_USING_DEFAULT_WARNING - * @return a pointer to a zero-terminated UChar array which lives in a memory mapped/DLL file. + * @return a pointer to a zero-terminated char16_t array which lives in a memory mapped/DLL file. * @stable ICU 2.0 */ UnicodeString diff --git a/Build/source/libs/icu/icu-src/source/common/unicode/schriter.h b/Build/source/libs/icu/icu-src/source/common/unicode/schriter.h index e52b97c263a..b1dc939bd66 100644 --- a/Build/source/libs/icu/icu-src/source/common/unicode/schriter.h +++ b/Build/source/libs/icu/icu-src/source/common/unicode/schriter.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ****************************************************************************** @@ -175,7 +175,7 @@ protected: * @param newTextLength The length of the String * @stable ICU 2.0 */ - void setText(const UChar* newText, int32_t newTextLength); + void setText(const char16_t* newText, int32_t newTextLength); /** * Copy of the iterated string object. diff --git a/Build/source/libs/icu/icu-src/source/common/unicode/simpleformatter.h b/Build/source/libs/icu/icu-src/source/common/unicode/simpleformatter.h index 2b74f5ca527..850949caaf5 100644 --- a/Build/source/libs/icu/icu-src/source/common/unicode/simpleformatter.h +++ b/Build/source/libs/icu/icu-src/source/common/unicode/simpleformatter.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ****************************************************************************** @@ -19,10 +19,15 @@ #include "unicode/utypes.h" #include "unicode/unistr.h" -#ifndef U_HIDE_DRAFT_API - U_NAMESPACE_BEGIN +// Forward declaration: +namespace number { +namespace impl { +class SimpleModifier; +} +} + /** * Formats simple patterns like "{1} was born in {0}". * Minimal subset of MessageFormat; fast, simple, minimal dependencies. @@ -49,15 +54,15 @@ U_NAMESPACE_BEGIN * * @see MessageFormat * @see UMessagePatternApostropheMode - * @draft ICU 57 + * @stable ICU 57 */ class U_COMMON_API SimpleFormatter U_FINAL : public UMemory { public: /** * Default constructor. - * @draft ICU 57 + * @stable ICU 57 */ - SimpleFormatter() : compiledPattern((UChar)0) {} + SimpleFormatter() : compiledPattern((char16_t)0) {} /** * Constructs a formatter from the pattern string. @@ -66,7 +71,7 @@ public: * @param errorCode ICU error code in/out parameter. * Must fulfill U_SUCCESS before the function call. * Set to U_ILLEGAL_ARGUMENT_ERROR for bad argument syntax. - * @draft ICU 57 + * @stable ICU 57 */ SimpleFormatter(const UnicodeString& pattern, UErrorCode &errorCode) { applyPattern(pattern, errorCode); @@ -84,7 +89,7 @@ public: * Must fulfill U_SUCCESS before the function call. * Set to U_ILLEGAL_ARGUMENT_ERROR for bad argument syntax and * too few or too many arguments. - * @draft ICU 57 + * @stable ICU 57 */ SimpleFormatter(const UnicodeString& pattern, int32_t min, int32_t max, UErrorCode &errorCode) { @@ -93,20 +98,20 @@ public: /** * Copy constructor. - * @draft ICU 57 + * @stable ICU 57 */ SimpleFormatter(const SimpleFormatter& other) : compiledPattern(other.compiledPattern) {} /** * Assignment operator. - * @draft ICU 57 + * @stable ICU 57 */ SimpleFormatter &operator=(const SimpleFormatter& other); /** * Destructor. - * @draft ICU 57 + * @stable ICU 57 */ ~SimpleFormatter(); @@ -118,7 +123,7 @@ public: * Must fulfill U_SUCCESS before the function call. * Set to U_ILLEGAL_ARGUMENT_ERROR for bad argument syntax. * @return TRUE if U_SUCCESS(errorCode). - * @draft ICU 57 + * @stable ICU 57 */ UBool applyPattern(const UnicodeString &pattern, UErrorCode &errorCode) { return applyPatternMinMaxArguments(pattern, 0, INT32_MAX, errorCode); @@ -137,14 +142,14 @@ public: * Set to U_ILLEGAL_ARGUMENT_ERROR for bad argument syntax and * too few or too many arguments. * @return TRUE if U_SUCCESS(errorCode). - * @draft ICU 57 + * @stable ICU 57 */ UBool applyPatternMinMaxArguments(const UnicodeString &pattern, int32_t min, int32_t max, UErrorCode &errorCode); /** * @return The max argument number + 1. - * @draft ICU 57 + * @stable ICU 57 */ int32_t getArgumentLimit() const { return getArgumentLimit(compiledPattern.getBuffer(), compiledPattern.length()); @@ -160,7 +165,7 @@ public: * @param errorCode ICU error code in/out parameter. * Must fulfill U_SUCCESS before the function call. * @return appendTo - * @draft ICU 57 + * @stable ICU 57 */ UnicodeString &format( const UnicodeString &value0, @@ -177,7 +182,7 @@ public: * @param errorCode ICU error code in/out parameter. * Must fulfill U_SUCCESS before the function call. * @return appendTo - * @draft ICU 57 + * @stable ICU 57 */ UnicodeString &format( const UnicodeString &value0, @@ -196,7 +201,7 @@ public: * @param errorCode ICU error code in/out parameter. * Must fulfill U_SUCCESS before the function call. * @return appendTo - * @draft ICU 57 + * @stable ICU 57 */ UnicodeString &format( const UnicodeString &value0, @@ -221,7 +226,7 @@ public: * @param errorCode ICU error code in/out parameter. * Must fulfill U_SUCCESS before the function call. * @return appendTo - * @draft ICU 57 + * @stable ICU 57 */ UnicodeString &formatAndAppend( const UnicodeString *const *values, int32_t valuesLength, @@ -247,7 +252,7 @@ public: * @param errorCode ICU error code in/out parameter. * Must fulfill U_SUCCESS before the function call. * @return result - * @draft ICU 57 + * @stable ICU 57 */ UnicodeString &formatAndReplace( const UnicodeString *const *values, int32_t valuesLength, @@ -257,7 +262,7 @@ public: /** * Returns the pattern text with none of the arguments. * Like formatting with all-empty string values. - * @draft ICU 57 + * @stable ICU 57 */ UnicodeString getTextWithNoArguments() const { return getTextWithNoArguments(compiledPattern.getBuffer(), compiledPattern.length()); @@ -275,23 +280,24 @@ private: */ UnicodeString compiledPattern; - static inline int32_t getArgumentLimit(const UChar *compiledPattern, + static inline int32_t getArgumentLimit(const char16_t *compiledPattern, int32_t compiledPatternLength) { return compiledPatternLength == 0 ? 0 : compiledPattern[0]; } - static UnicodeString getTextWithNoArguments(const UChar *compiledPattern, int32_t compiledPatternLength); + static UnicodeString getTextWithNoArguments(const char16_t *compiledPattern, int32_t compiledPatternLength); static UnicodeString &format( - const UChar *compiledPattern, int32_t compiledPatternLength, + const char16_t *compiledPattern, int32_t compiledPatternLength, const UnicodeString *const *values, UnicodeString &result, const UnicodeString *resultCopy, UBool forbidResultAsValue, int32_t *offsets, int32_t offsetsLength, UErrorCode &errorCode); + + // Give access to internals to SimpleModifier for number formatting + friend class number::impl::SimpleModifier; }; U_NAMESPACE_END -#endif /* U_HIDE_DRAFT_API */ - #endif // __SIMPLEFORMATTER_H__ diff --git a/Build/source/libs/icu/icu-src/source/common/unicode/std_string.h b/Build/source/libs/icu/icu-src/source/common/unicode/std_string.h index 104ef0c83e8..729c5639950 100644 --- a/Build/source/libs/icu/icu-src/source/common/unicode/std_string.h +++ b/Build/source/libs/icu/icu-src/source/common/unicode/std_string.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* @@ -8,7 +8,7 @@ * ******************************************************************************* * file name: std_string.h -* encoding: US-ASCII +* encoding: UTF-8 * tab size: 8 (not used) * indentation:4 * @@ -27,13 +27,11 @@ #include "unicode/utypes.h" -#if U_HAVE_STD_STRING - -#if !defined(_MSC_VER) -namespace std { class type_info; } // WORKAROUND: http://llvm.org/bugs/show_bug.cgi?id=13364 +// Workaround for a libstdc++ bug before libstdc++4.6 (2011). +// https://bugs.llvm.org/show_bug.cgi?id=13364 +#if defined(__GLIBCXX__) +namespace std { class type_info; } #endif #include -#endif // U_HAVE_STD_STRING - #endif // __STD_STRING_H__ diff --git a/Build/source/libs/icu/icu-src/source/common/unicode/strenum.h b/Build/source/libs/icu/icu-src/source/common/unicode/strenum.h index 5a33f7f1667..61d514813b9 100644 --- a/Build/source/libs/icu/icu-src/source/common/unicode/strenum.h +++ b/Build/source/libs/icu/icu-src/source/common/unicode/strenum.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* @@ -35,7 +35,7 @@ U_NAMESPACE_BEGIN * call, so the returned string still might not be 'valid' on * subsequent use.

      * - *

      Strings may take the form of const char*, const UChar*, or const + *

      Strings may take the form of const char*, const char16_t*, or const * UnicodeString*. The type you get is determine by the variant of * 'next' that you call. In general the StringEnumeration is * optimized for one of these types, but all StringEnumerations can @@ -112,7 +112,7 @@ public: *

      If the iterator is out of sync with its service, status is set * to U_ENUM_OUT_OF_SYNC_ERROR and NULL is returned.

      * - *

      If the native service string is a UChar* string, it is + *

      If the native service string is a char16_t* string, it is * converted to char* with the invariant converter. If the * conversion fails (because a character cannot be converted) then * status is set to U_INVARIANT_CONVERSION_ERROR and the return @@ -131,7 +131,7 @@ public: virtual const char* next(int32_t *resultLength, UErrorCode& status); /** - *

      Returns the next element as a NUL-terminated UChar*. If there + *

      Returns the next element as a NUL-terminated char16_t*. If there * are no more elements, returns NULL. If the resultLength pointer * is not NULL, the length of the string (not counting the * terminating NUL) is returned at that address. If an error @@ -153,7 +153,7 @@ public: * * @stable ICU 2.4 */ - virtual const UChar* unext(int32_t *resultLength, UErrorCode& status); + virtual const char16_t* unext(int32_t *resultLength, UErrorCode& status); /** *

      Returns the next element a UnicodeString*. If there are no diff --git a/Build/source/libs/icu/icu-src/source/common/unicode/stringoptions.h b/Build/source/libs/icu/icu-src/source/common/unicode/stringoptions.h new file mode 100644 index 00000000000..f2de96e9634 --- /dev/null +++ b/Build/source/libs/icu/icu-src/source/common/unicode/stringoptions.h @@ -0,0 +1,198 @@ +// © 2017 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html + +// stringoptions.h +// created: 2017jun08 Markus W. Scherer + +#ifndef __STRINGOPTIONS_H__ +#define __STRINGOPTIONS_H__ + +#include "unicode/utypes.h" + +/** + * \file + * \brief C API: Bit set option bit constants for various string and character processing functions. + */ + +/** + * Option value for case folding: Use default mappings defined in CaseFolding.txt. + * + * @stable ICU 2.0 + */ +#define U_FOLD_CASE_DEFAULT 0 + +/** + * Option value for case folding: + * + * Use the modified set of mappings provided in CaseFolding.txt to handle dotted I + * and dotless i appropriately for Turkic languages (tr, az). + * + * Before Unicode 3.2, CaseFolding.txt contains mappings marked with 'I' that + * are to be included for default mappings and + * excluded for the Turkic-specific mappings. + * + * Unicode 3.2 CaseFolding.txt instead contains mappings marked with 'T' that + * are to be excluded for default mappings and + * included for the Turkic-specific mappings. + * + * @stable ICU 2.0 + */ +#define U_FOLD_CASE_EXCLUDE_SPECIAL_I 1 + +#ifndef U_HIDE_DRAFT_API + +/** + * Titlecase the string as a whole rather than each word. + * (Titlecase only the character at index 0, possibly adjusted.) + * Option bits value for titlecasing APIs that take an options bit set. + * + * It is an error to specify multiple titlecasing iterator options together, + * including both an options bit and an explicit BreakIterator. + * + * @see U_TITLECASE_ADJUST_TO_CASED + * @draft ICU 60 + */ +#define U_TITLECASE_WHOLE_STRING 0x20 + +/** + * Titlecase sentences rather than words. + * (Titlecase only the first character of each sentence, possibly adjusted.) + * Option bits value for titlecasing APIs that take an options bit set. + * + * It is an error to specify multiple titlecasing iterator options together, + * including both an options bit and an explicit BreakIterator. + * + * @see U_TITLECASE_ADJUST_TO_CASED + * @draft ICU 60 + */ +#define U_TITLECASE_SENTENCES 0x40 + +#endif // U_HIDE_DRAFT_API + +/** + * Do not lowercase non-initial parts of words when titlecasing. + * Option bit for titlecasing APIs that take an options bit set. + * + * By default, titlecasing will titlecase the character at each + * (possibly adjusted) BreakIterator index and + * lowercase all other characters up to the next iterator index. + * With this option, the other characters will not be modified. + * + * @see U_TITLECASE_ADJUST_TO_CASED + * @see UnicodeString::toTitle + * @see CaseMap::toTitle + * @see ucasemap_setOptions + * @see ucasemap_toTitle + * @see ucasemap_utf8ToTitle + * @stable ICU 3.8 + */ +#define U_TITLECASE_NO_LOWERCASE 0x100 + +/** + * Do not adjust the titlecasing BreakIterator indexes; + * titlecase exactly the characters at breaks from the iterator. + * Option bit for titlecasing APIs that take an options bit set. + * + * By default, titlecasing will take each break iterator index, + * adjust it to the next relevant character (see U_TITLECASE_ADJUST_TO_CASED), + * and titlecase that one. + * + * Other characters are lowercased. + * + * It is an error to specify multiple titlecasing adjustment options together. + * + * @see U_TITLECASE_ADJUST_TO_CASED + * @see U_TITLECASE_NO_LOWERCASE + * @see UnicodeString::toTitle + * @see CaseMap::toTitle + * @see ucasemap_setOptions + * @see ucasemap_toTitle + * @see ucasemap_utf8ToTitle + * @stable ICU 3.8 + */ +#define U_TITLECASE_NO_BREAK_ADJUSTMENT 0x200 + +#ifndef U_HIDE_DRAFT_API + +/** + * Adjust each titlecasing BreakIterator index to the next cased character. + * (See the Unicode Standard, chapter 3, Default Case Conversion, R3 toTitlecase(X).) + * Option bit for titlecasing APIs that take an options bit set. + * + * This used to be the default index adjustment in ICU. + * Since ICU 60, the default index adjustment is to the next character that is + * a letter, number, symbol, or private use code point. + * (Uncased modifier letters are skipped.) + * The difference in behavior is small for word titlecasing, + * but the new adjustment is much better for whole-string and sentence titlecasing: + * It yields "49ers" and "«丰(abc)»" instead of "49Ers" and "«丰(Abc)»". + * + * It is an error to specify multiple titlecasing adjustment options together. + * + * @see U_TITLECASE_NO_BREAK_ADJUSTMENT + * @draft ICU 60 + */ +#define U_TITLECASE_ADJUST_TO_CASED 0x400 + +/** + * Option for string transformation functions to not first reset the Edits object. + * Used for example in some case-mapping and normalization functions. + * + * @see CaseMap + * @see Edits + * @see Normalizer2 + * @draft ICU 60 + */ +#define U_EDITS_NO_RESET 0x2000 + +/** + * Omit unchanged text when recording how source substrings + * relate to changed and unchanged result substrings. + * Used for example in some case-mapping and normalization functions. + * + * @see CaseMap + * @see Edits + * @see Normalizer2 + * @draft ICU 60 + */ +#define U_OMIT_UNCHANGED_TEXT 0x4000 + +#endif // U_HIDE_DRAFT_API + +/** + * Option bit for u_strCaseCompare, u_strcasecmp, unorm_compare, etc: + * Compare strings in code point order instead of code unit order. + * @stable ICU 2.2 + */ +#define U_COMPARE_CODE_POINT_ORDER 0x8000 + +/** + * Option bit for unorm_compare: + * Perform case-insensitive comparison. + * @stable ICU 2.2 + */ +#define U_COMPARE_IGNORE_CASE 0x10000 + +/** + * Option bit for unorm_compare: + * Both input strings are assumed to fulfill FCD conditions. + * @stable ICU 2.2 + */ +#define UNORM_INPUT_IS_FCD 0x20000 + +// Related definitions elsewhere. +// Options that are not meaningful in the same functions +// can share the same bits. +// +// Public: +// unicode/unorm.h #define UNORM_COMPARE_NORM_OPTIONS_SHIFT 20 +// +// Internal: (may change or be removed) +// ucase.h #define _STRCASECMP_OPTIONS_MASK 0xffff +// ucase.h #define _FOLD_CASE_OPTIONS_MASK 7 +// ucasemap_imp.h #define U_TITLECASE_ITERATOR_MASK 0xe0 +// ucasemap_imp.h #define U_TITLECASE_ADJUSTMENT_MASK 0x600 +// ustr_imp.h #define _STRNCMP_STYLE 0x1000 +// unormcmp.cpp #define _COMPARE_EQUIV 0x80000 + +#endif // __STRINGOPTIONS_H__ diff --git a/Build/source/libs/icu/icu-src/source/common/unicode/stringpiece.h b/Build/source/libs/icu/icu-src/source/common/unicode/stringpiece.h index 5e40d4aca9b..b0887effa52 100644 --- a/Build/source/libs/icu/icu-src/source/common/unicode/stringpiece.h +++ b/Build/source/libs/icu/icu-src/source/common/unicode/stringpiece.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html // Copyright (C) 2009-2013, International Business Machines // Corporation and others. All Rights Reserved. @@ -68,14 +68,12 @@ class U_COMMON_API StringPiece : public UMemory { * @stable ICU 4.2 */ StringPiece(const char* str); -#if U_HAVE_STD_STRING /** * Constructs from a std::string. * @stable ICU 4.2 */ StringPiece(const std::string& str) : ptr_(str.data()), length_(static_cast(str.size())) { } -#endif /** * Constructs from a const char * pointer and a specified length. * @param offset a const char * pointer (need not be terminated) diff --git a/Build/source/libs/icu/icu-src/source/common/unicode/stringtriebuilder.h b/Build/source/libs/icu/icu-src/source/common/unicode/stringtriebuilder.h index 95cd841a374..caeae51a472 100644 --- a/Build/source/libs/icu/icu-src/source/common/unicode/stringtriebuilder.h +++ b/Build/source/libs/icu/icu-src/source/common/unicode/stringtriebuilder.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* @@ -6,7 +6,7 @@ * Corporation and others. All Rights Reserved. ******************************************************************************* * file name: stringtriebuilder.h -* encoding: US-ASCII +* encoding: UTF-8 * tab size: 8 (not used) * indentation:4 * @@ -105,7 +105,7 @@ protected: /** @internal */ virtual int32_t getElementStringLength(int32_t i) const = 0; /** @internal */ - virtual UChar getElementUnit(int32_t i, int32_t unitIndex) const = 0; + virtual char16_t getElementUnit(int32_t i, int32_t unitIndex) const = 0; /** @internal */ virtual int32_t getElementValue(int32_t i) const = 0; @@ -120,7 +120,7 @@ protected: /** @internal */ virtual int32_t skipElementsBySomeUnits(int32_t i, int32_t unitIndex, int32_t count) const = 0; /** @internal */ - virtual int32_t indexOfElementWithNextUnit(int32_t i, int32_t unitIndex, UChar unit) const = 0; + virtual int32_t indexOfElementWithNextUnit(int32_t i, int32_t unitIndex, char16_t unit) const = 0; /** @internal */ virtual UBool matchNodesCanHaveValues() const = 0; @@ -137,7 +137,7 @@ protected: /** @internal */ static const int32_t kMaxBranchLinearSubNodeLength=5; - // Maximum number of nested split-branch levels for a branch on all 2^16 possible UChar units. + // Maximum number of nested split-branch levels for a branch on all 2^16 possible char16_t units. // log2(2^16/kMaxBranchLinearSubNodeLength) rounded up. /** @internal */ static const int32_t kMaxSplitBranchLevels=14; @@ -256,7 +256,7 @@ protected: /** @internal */ class FinalValueNode : public Node { public: - FinalValueNode(int32_t v) : Node(0x111111*37+v), value(v) {} + FinalValueNode(int32_t v) : Node(0x111111u*37u+v), value(v) {} virtual UBool operator==(const Node &other) const; virtual void write(StringTrieBuilder &builder); protected: @@ -276,7 +276,7 @@ protected: void setValue(int32_t v) { hasValue=TRUE; value=v; - hash=hash*37+v; + hash=hash*37u+v; } protected: UBool hasValue; @@ -290,7 +290,7 @@ protected: class IntermediateValueNode : public ValueNode { public: IntermediateValueNode(int32_t v, Node *nextNode) - : ValueNode(0x222222*37+hashCode(nextNode)), next(nextNode) { setValue(v); } + : ValueNode(0x222222u*37u+hashCode(nextNode)), next(nextNode) { setValue(v); } virtual UBool operator==(const Node &other) const; virtual int32_t markRightEdgesFirst(int32_t edgeNumber); virtual void write(StringTrieBuilder &builder); @@ -307,7 +307,7 @@ protected: class LinearMatchNode : public ValueNode { public: LinearMatchNode(int32_t len, Node *nextNode) - : ValueNode((0x333333*37+len)*37+hashCode(nextNode)), + : ValueNode((0x333333u*37u+len)*37u+hashCode(nextNode)), length(len), next(nextNode) {} virtual UBool operator==(const Node &other) const; virtual int32_t markRightEdgesFirst(int32_t edgeNumber); @@ -338,25 +338,25 @@ protected: virtual void write(StringTrieBuilder &builder); // Adds a unit with a final value. void add(int32_t c, int32_t value) { - units[length]=(UChar)c; + units[length]=(char16_t)c; equal[length]=NULL; values[length]=value; ++length; - hash=(hash*37+c)*37+value; + hash=(hash*37u+c)*37u+value; } // Adds a unit which leads to another match node. void add(int32_t c, Node *node) { - units[length]=(UChar)c; + units[length]=(char16_t)c; equal[length]=node; values[length]=0; ++length; - hash=(hash*37+c)*37+hashCode(node); + hash=(hash*37u+c)*37u+hashCode(node); } protected: Node *equal[kMaxBranchLinearSubNodeLength]; // NULL means "has final value". int32_t length; int32_t values[kMaxBranchLinearSubNodeLength]; - UChar units[kMaxBranchLinearSubNodeLength]; + char16_t units[kMaxBranchLinearSubNodeLength]; }; /** @@ -364,15 +364,15 @@ protected: */ class SplitBranchNode : public BranchNode { public: - SplitBranchNode(UChar middleUnit, Node *lessThanNode, Node *greaterOrEqualNode) - : BranchNode(((0x555555*37+middleUnit)*37+ - hashCode(lessThanNode))*37+hashCode(greaterOrEqualNode)), + SplitBranchNode(char16_t middleUnit, Node *lessThanNode, Node *greaterOrEqualNode) + : BranchNode(((0x555555u*37u+middleUnit)*37u+ + hashCode(lessThanNode))*37u+hashCode(greaterOrEqualNode)), unit(middleUnit), lessThan(lessThanNode), greaterOrEqual(greaterOrEqualNode) {} virtual UBool operator==(const Node &other) const; virtual int32_t markRightEdgesFirst(int32_t edgeNumber); virtual void write(StringTrieBuilder &builder); protected: - UChar unit; + char16_t unit; Node *lessThan; Node *greaterOrEqual; }; @@ -382,7 +382,7 @@ protected: class BranchHeadNode : public ValueNode { public: BranchHeadNode(int32_t len, Node *subNode) - : ValueNode((0x666666*37+len)*37+hashCode(subNode)), + : ValueNode((0x666666u*37u+len)*37u+hashCode(subNode)), length(len), next(subNode) {} virtual UBool operator==(const Node &other) const; virtual int32_t markRightEdgesFirst(int32_t edgeNumber); diff --git a/Build/source/libs/icu/icu-src/source/common/unicode/symtable.h b/Build/source/libs/icu/icu-src/source/common/unicode/symtable.h index cf2c4f0f412..35e5f238a70 100644 --- a/Build/source/libs/icu/icu-src/source/common/unicode/symtable.h +++ b/Build/source/libs/icu/icu-src/source/common/unicode/symtable.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** diff --git a/Build/source/libs/icu/icu-src/source/common/unicode/ubidi.h b/Build/source/libs/icu/icu-src/source/common/unicode/ubidi.h index e59969861f3..ef21f242066 100644 --- a/Build/source/libs/icu/icu-src/source/common/unicode/ubidi.h +++ b/Build/source/libs/icu/icu-src/source/common/unicode/ubidi.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ****************************************************************************** @@ -8,7 +8,7 @@ * ****************************************************************************** * file name: ubidi.h -* encoding: US-ASCII +* encoding: UTF-8 * tab size: 8 (not used) * indentation:4 * @@ -1196,11 +1196,14 @@ ubidi_setContext(UBiDi *pBiDi, * A level overrides the directional property of its corresponding * (same index) character if the level has the * #UBIDI_LEVEL_OVERRIDE bit set.

      - * Except for that bit, it must be + * Aside from that bit, it must be * paraLevel<=embeddingLevels[]<=UBIDI_MAX_EXPLICIT_LEVEL, - * with one exception: a level of zero may be specified for a paragraph - * separator even if paraLevel>0 when multiple paragraphs - * are submitted in the same call to ubidi_setPara().

      + * except that level 0 is always allowed. + * Level 0 for a paragraph separator prevents reordering of paragraphs; + * this only works reliably if #UBIDI_LEVEL_OVERRIDE + * is also set for paragraph separators. + * Level 0 for other characters is treated as a wildcard + * and is lifted up to the resolved level of the surrounding paragraph.

      * Caution: A copy of this pointer, not of the levels, * will be stored in the UBiDi object; * the embeddingLevels array must not be diff --git a/Build/source/libs/icu/icu-src/source/common/unicode/ubiditransform.h b/Build/source/libs/icu/icu-src/source/common/unicode/ubiditransform.h index 509f68bcc01..627b005ed45 100644 --- a/Build/source/libs/icu/icu-src/source/common/unicode/ubiditransform.h +++ b/Build/source/libs/icu/icu-src/source/common/unicode/ubiditransform.h @@ -1,12 +1,12 @@ /* ****************************************************************************** * -* Copyright (C) 2016 and later: Unicode, Inc. and others. +* © 2016 and later: Unicode, Inc. and others. * License & terms of use: http://www.unicode.org/copyright.html * ****************************************************************************** * file name: ubiditransform.h -* encoding: US-ASCII +* encoding: UTF-8 * tab size: 8 (not used) * indentation:4 * @@ -23,8 +23,6 @@ #include "unicode/uchar.h" #include "unicode/localpointer.h" -#ifndef U_HIDE_DRAFT_API - /** * \file * \brief Bidi Transformations @@ -60,17 +58,17 @@ * @see UBIDI_REORDER_DEFAULT * @see UBIDI_REORDER_INVERSE_LIKE_DIRECT * @see UBIDI_REORDER_RUNS_ONLY - * @draft ICU 58 + * @stable ICU 58 */ typedef enum { /** 0: Constant indicating a logical order. * This is the default for input text. - * @draft ICU 58 + * @stable ICU 58 */ UBIDI_LOGICAL = 0, /** 1: Constant indicating a visual order. * This is a default for output text. - * @draft ICU 58 + * @stable ICU 58 */ UBIDI_VISUAL } UBiDiOrder; @@ -83,20 +81,20 @@ typedef enum { * @see ubidi_setReorderingOptions * @see ubidi_writeReordered * @see ubidi_writeReverse - * @draft ICU 58 + * @stable ICU 58 */ typedef enum { /** 0: Constant indicating that character mirroring should not be * performed. * This is the default. - * @draft ICU 58 + * @stable ICU 58 */ UBIDI_MIRRORING_OFF = 0, /** 1: Constant indicating that character mirroring should be performed. * This corresponds to calling ubidi_writeReordered or * ubidi_writeReverse with the * UBIDI_DO_MIRRORING option bit set. - * @draft ICU 58 + * @stable ICU 58 */ UBIDI_MIRRORING_ON } UBiDiMirroring; @@ -104,7 +102,7 @@ typedef enum { /** * Forward declaration of the UBiDiTransform structure that stores * information used by the layout transformation engine. - * @draft ICU 58 + * @stable ICU 58 */ typedef struct UBiDiTransform UBiDiTransform; @@ -240,9 +238,9 @@ typedef struct UBiDiTransform UBiDiTransform; * @see UBiDiMirroring * @see ubidi_setPara * @see u_shapeArabic - * @draft ICU 58 + * @stable ICU 58 */ -U_DRAFT uint32_t U_EXPORT2 +U_STABLE uint32_t U_EXPORT2 ubiditransform_transform(UBiDiTransform *pBiDiTransform, const UChar *src, int32_t srcLength, UChar *dest, int32_t destSize, @@ -286,16 +284,16 @@ ubiditransform_transform(UBiDiTransform *pBiDiTransform, * ubiditransform_close(). * * @return An empty UBiDiTransform object. - * @draft ICU 58 + * @stable ICU 58 */ -U_DRAFT UBiDiTransform* U_EXPORT2 +U_STABLE UBiDiTransform* U_EXPORT2 ubiditransform_open(UErrorCode *pErrorCode); /** * Deallocates the given UBiDiTransform object. - * @draft ICU 58 + * @stable ICU 58 */ -U_DRAFT void U_EXPORT2 +U_STABLE void U_EXPORT2 ubiditransform_close(UBiDiTransform *pBidiTransform); #if U_SHOW_CPLUSPLUS_API @@ -309,7 +307,7 @@ U_NAMESPACE_BEGIN * * @see LocalPointerBase * @see LocalPointer - * @draft ICU 58 + * @stable ICU 58 */ U_DEFINE_LOCAL_OPEN_POINTER(LocalUBiDiTransformPointer, UBiDiTransform, ubiditransform_close); @@ -317,5 +315,4 @@ U_NAMESPACE_END #endif -#endif /* U_HIDE_DRAFT_API */ #endif diff --git a/Build/source/libs/icu/icu-src/source/common/unicode/ubrk.h b/Build/source/libs/icu/icu-src/source/common/unicode/ubrk.h index f43943ed1ab..600328c49c6 100644 --- a/Build/source/libs/icu/icu-src/source/common/unicode/ubrk.h +++ b/Build/source/libs/icu/icu-src/source/common/unicode/ubrk.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ****************************************************************************** @@ -230,7 +230,8 @@ typedef enum USentenceBreakTag { * @param locale The locale specifying the text-breaking conventions. Note that * locale keys such as "lb" and "ss" may be used to modify text break behavior, * see general discussion of BreakIterator C API. - * @param text The text to be iterated over. + * @param text The text to be iterated over. May be null, in which case ubrk_setText() is + * used to specify the text to be iterated. * @param textLength The number of characters in text, or -1 if null-terminated. * @param status A UErrorCode to receive any errors. * @return A UBreakIterator for the specified locale. @@ -267,6 +268,34 @@ ubrk_openRules(const UChar *rules, UParseError *parseErr, UErrorCode *status); +#ifndef U_HIDE_DRAFT_API +/** + * Open a new UBreakIterator for locating text boundaries using precompiled binary rules. + * Opening a UBreakIterator this way is substantially faster than using ubrk_openRules. + * Binary rules may be obtained using ubrk_getBinaryRules. The compiled rules are not + * compatible across different major versions of ICU, nor across platforms of different + * endianness or different base character set family (ASCII vs EBCDIC). + * @param binaryRules A set of compiled binary rules specifying the text breaking + * conventions. Ownership of the storage containing the compiled + * rules remains with the caller of this function. The compiled + * rules must not be modified or deleted during the life of the + * break iterator. + * @param rulesLength The length of binaryRules in bytes; must be >= 0. + * @param text The text to be iterated over. May be null, in which case + * ubrk_setText() is used to specify the text to be iterated. + * @param textLength The number of characters in text, or -1 if null-terminated. + * @param status Pointer to UErrorCode to receive any errors. + * @return UBreakIterator for the specified rules. + * @see ubrk_getBinaryRules + * @draft ICU 59 + */ +U_DRAFT UBreakIterator* U_EXPORT2 +ubrk_openBinaryRules(const uint8_t *binaryRules, int32_t rulesLength, + const UChar * text, int32_t textLength, + UErrorCode * status); + +#endif /* U_HIDE_DRAFT_API */ + /** * Thread safe cloning operation * @param bi iterator to be cloned @@ -566,6 +595,40 @@ ubrk_refreshUText(UBreakIterator *bi, UText *text, UErrorCode *status); + +#ifndef U_HIDE_DRAFT_API +/** + * Get a compiled binary version of the rules specifying the behavior of a UBreakIterator. + * The binary rules may be used with ubrk_openBinaryRules to open a new UBreakIterator + * more quickly than using ubrk_openRules. The compiled rules are not compatible across + * different major versions of ICU, nor across platforms of different endianness or + * different base character set family (ASCII vs EBCDIC). Supports preflighting (with + * binaryRules=NULL and rulesCapacity=0) to get the rules length without copying them to + * the binaryRules buffer. However, whether preflighting or not, if the actual length + * is greater than INT32_MAX, then the function returns 0 and sets *status to + * U_INDEX_OUTOFBOUNDS_ERROR. + + * @param bi The break iterator to use. + * @param binaryRules Buffer to receive the compiled binary rules; set to NULL for + * preflighting. + * @param rulesCapacity Capacity (in bytes) of the binaryRules buffer; set to 0 for + * preflighting. Must be >= 0. + * @param status Pointer to UErrorCode to receive any errors, such as + * U_BUFFER_OVERFLOW_ERROR, U_INDEX_OUTOFBOUNDS_ERROR, or + * U_ILLEGAL_ARGUMENT_ERROR. + * @return The actual byte length of the binary rules, if <= INT32_MAX; + * otherwise 0. If not preflighting and this is larger than + * rulesCapacity, *status will be set to an error. + * @see ubrk_openBinaryRules + * @draft ICU 59 + */ +U_DRAFT int32_t U_EXPORT2 +ubrk_getBinaryRules(UBreakIterator *bi, + uint8_t * binaryRules, int32_t rulesCapacity, + UErrorCode * status); + +#endif /* U_HIDE_DRAFT_API */ + #endif /* #if !UCONFIG_NO_BREAK_ITERATION */ #endif diff --git a/Build/source/libs/icu/icu-src/source/common/unicode/ucasemap.h b/Build/source/libs/icu/icu-src/source/common/unicode/ucasemap.h index d7345e8a402..6b253e3d638 100644 --- a/Build/source/libs/icu/icu-src/source/common/unicode/ucasemap.h +++ b/Build/source/libs/icu/icu-src/source/common/unicode/ucasemap.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* @@ -8,7 +8,7 @@ * ******************************************************************************* * file name: ucasemap.h -* encoding: US-ASCII +* encoding: UTF-8 * tab size: 8 (not used) * indentation:4 * @@ -22,8 +22,9 @@ #define __UCASEMAP_H__ #include "unicode/utypes.h" -#include "unicode/ustring.h" #include "unicode/localpointer.h" +#include "unicode/stringoptions.h" +#include "unicode/ustring.h" /** * \file @@ -144,47 +145,6 @@ ucasemap_setLocale(UCaseMap *csm, const char *locale, UErrorCode *pErrorCode); U_STABLE void U_EXPORT2 ucasemap_setOptions(UCaseMap *csm, uint32_t options, UErrorCode *pErrorCode); -/** - * Do not lowercase non-initial parts of words when titlecasing. - * Option bit for titlecasing APIs that take an options bit set. - * - * By default, titlecasing will titlecase the first cased character - * of a word and lowercase all other characters. - * With this option, the other characters will not be modified. - * - * @see ucasemap_setOptions - * @see ucasemap_toTitle - * @see ucasemap_utf8ToTitle - * @see UnicodeString::toTitle - * @stable ICU 3.8 - */ -#define U_TITLECASE_NO_LOWERCASE 0x100 - -/** - * Do not adjust the titlecasing indexes from BreakIterator::next() indexes; - * titlecase exactly the characters at breaks from the iterator. - * Option bit for titlecasing APIs that take an options bit set. - * - * By default, titlecasing will take each break iterator index, - * adjust it by looking for the next cased character, and titlecase that one. - * Other characters are lowercased. - * - * This follows Unicode 4 & 5 section 3.13 Default Case Operations: - * - * R3 toTitlecase(X): Find the word boundaries based on Unicode Standard Annex - * #29, "Text Boundaries." Between each pair of word boundaries, find the first - * cased character F. If F exists, map F to default_title(F); then map each - * subsequent character C to default_lower(C). - * - * @see ucasemap_setOptions - * @see ucasemap_toTitle - * @see ucasemap_utf8ToTitle - * @see UnicodeString::toTitle - * @see U_TITLECASE_NO_LOWERCASE - * @stable ICU 3.8 - */ -#define U_TITLECASE_NO_BREAK_ADJUSTMENT 0x200 - #if !UCONFIG_NO_BREAK_ITERATION /** @@ -242,7 +202,7 @@ ucasemap_setBreakIterator(UCaseMap *csm, UBreakIterator *iterToAdopt, UErrorCode * The standard titlecase iterator for the root locale implements the * algorithm of Unicode TR 21. * - * This function uses only the setUText(), first(), next() and close() methods of the + * This function uses only the setText(), first() and next() methods of the * provided break iterator. * * The result may be longer or shorter than the original. @@ -253,7 +213,7 @@ ucasemap_setBreakIterator(UCaseMap *csm, UBreakIterator *iterToAdopt, UErrorCode * @param dest A buffer for the result string. The result will be NUL-terminated if * the buffer is large enough. * The contents is undefined in case of failure. - * @param destCapacity The size of the buffer (number of bytes). If it is 0, then + * @param destCapacity The size of the buffer (number of UChars). If it is 0, then * dest may be NULL and the function will only return the length of the result * without writing any of the result string. * @param src The original string. @@ -272,7 +232,7 @@ ucasemap_toTitle(UCaseMap *csm, const UChar *src, int32_t srcLength, UErrorCode *pErrorCode); -#endif +#endif // UCONFIG_NO_BREAK_ITERATION /** * Lowercase the characters in a UTF-8 string. diff --git a/Build/source/libs/icu/icu-src/source/common/unicode/ucat.h b/Build/source/libs/icu/icu-src/source/common/unicode/ucat.h index c52e4d914b8..4d1ff3f6b28 100644 --- a/Build/source/libs/icu/icu-src/source/common/unicode/ucat.h +++ b/Build/source/libs/icu/icu-src/source/common/unicode/ucat.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** diff --git a/Build/source/libs/icu/icu-src/source/common/unicode/uchar.h b/Build/source/libs/icu/icu-src/source/common/unicode/uchar.h index 7f6ea6d9343..3613374d9a4 100644 --- a/Build/source/libs/icu/icu-src/source/common/unicode/uchar.h +++ b/Build/source/libs/icu/icu-src/source/common/unicode/uchar.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** @@ -26,6 +26,7 @@ #define UCHAR_H #include "unicode/utypes.h" +#include "unicode/stringoptions.h" U_CDECL_BEGIN @@ -41,7 +42,7 @@ U_CDECL_BEGIN * @see u_getUnicodeVersion * @stable ICU 2.0 */ -#define U_UNICODE_VERSION "9.0" +#define U_UNICODE_VERSION "10.0" /** * \file @@ -148,8 +149,9 @@ U_CDECL_BEGIN * * The properties APIs are intended to reflect Unicode properties as defined * in the Unicode Character Database (UCD) and Unicode Technical Reports (UTR). - * For details about the properties see http://www.unicode.org/ucd/ . - * For names of Unicode properties see the UCD file PropertyAliases.txt. + * + * For details about the properties see + * UAX #44: Unicode Character Database (http://www.unicode.org/reports/tr44/). * * Important: If ICU is built with UCD files from Unicode versions below, e.g., 3.2, * then properties marked with "new in Unicode 3.2" are not or not fully available. @@ -399,42 +401,57 @@ typedef enum UProperty { UCHAR_CHANGES_WHEN_CASEMAPPED=55, /** Binary property Changes_When_NFKC_Casefolded. @stable ICU 4.4 */ UCHAR_CHANGES_WHEN_NFKC_CASEFOLDED=56, -#ifndef U_HIDE_DRAFT_API /** * Binary property Emoji. * See http://www.unicode.org/reports/tr51/#Emoji_Properties * - * @draft ICU 57 + * @stable ICU 57 */ UCHAR_EMOJI=57, /** * Binary property Emoji_Presentation. * See http://www.unicode.org/reports/tr51/#Emoji_Properties * - * @draft ICU 57 + * @stable ICU 57 */ UCHAR_EMOJI_PRESENTATION=58, /** * Binary property Emoji_Modifier. * See http://www.unicode.org/reports/tr51/#Emoji_Properties * - * @draft ICU 57 + * @stable ICU 57 */ UCHAR_EMOJI_MODIFIER=59, /** * Binary property Emoji_Modifier_Base. * See http://www.unicode.org/reports/tr51/#Emoji_Properties * - * @draft ICU 57 + * @stable ICU 57 */ UCHAR_EMOJI_MODIFIER_BASE=60, -#endif /* U_HIDE_DRAFT_API */ + /** + * Binary property Emoji_Component. + * See http://www.unicode.org/reports/tr51/#Emoji_Properties + * + * @stable ICU 60 + */ + UCHAR_EMOJI_COMPONENT=61, + /** + * Binary property Regional_Indicator. + * @stable ICU 60 + */ + UCHAR_REGIONAL_INDICATOR=62, + /** + * Binary property Prepended_Concatenation_Mark. + * @stable ICU 60 + */ + UCHAR_PREPENDED_CONCATENATION_MARK=63, #ifndef U_HIDE_DEPRECATED_API /** * One more than the last constant for binary Unicode properties. * @deprecated ICU 58 The numeric value may change over time, see ICU ticket #12420. */ - UCHAR_BINARY_LIMIT=61, + UCHAR_BINARY_LIMIT, #endif // U_HIDE_DEPRECATED_API /** Enumerated property Bidi_Class. @@ -1649,6 +1666,23 @@ enum UBlockCode { /** @stable ICU 58 */ UBLOCK_TANGUT_COMPONENTS = 273, /*[18800]*/ + // New blocks in Unicode 10.0 + + /** @stable ICU 60 */ + UBLOCK_CJK_UNIFIED_IDEOGRAPHS_EXTENSION_F = 274, /*[2CEB0]*/ + /** @stable ICU 60 */ + UBLOCK_KANA_EXTENDED_A = 275, /*[1B100]*/ + /** @stable ICU 60 */ + UBLOCK_MASARAM_GONDI = 276, /*[11D00]*/ + /** @stable ICU 60 */ + UBLOCK_NUSHU = 277, /*[1B170]*/ + /** @stable ICU 60 */ + UBLOCK_SOYOMBO = 278, /*[11A50]*/ + /** @stable ICU 60 */ + UBLOCK_SYRIAC_SUPPLEMENT = 279, /*[0860]*/ + /** @stable ICU 60 */ + UBLOCK_ZANABAZAR_SQUARE = 280, /*[11A00]*/ + #ifndef U_HIDE_DEPRECATED_API /** * One more than the highest normal UBlockCode value. @@ -1656,7 +1690,7 @@ enum UBlockCode { * * @deprecated ICU 58 The numeric value may change over time, see ICU ticket #12420. */ - UBLOCK_COUNT = 274, + UBLOCK_COUNT = 281, #endif // U_HIDE_DEPRECATED_API /** @stable ICU 2.0 */ @@ -1932,6 +1966,19 @@ typedef enum UJoiningGroup { U_JG_AFRICAN_FEH, /**< @stable ICU 58 */ U_JG_AFRICAN_NOON, /**< @stable ICU 58 */ U_JG_AFRICAN_QAF, /**< @stable ICU 58 */ + + U_JG_MALAYALAM_BHA, /**< @stable ICU 60 */ + U_JG_MALAYALAM_JA, /**< @stable ICU 60 */ + U_JG_MALAYALAM_LLA, /**< @stable ICU 60 */ + U_JG_MALAYALAM_LLLA, /**< @stable ICU 60 */ + U_JG_MALAYALAM_NGA, /**< @stable ICU 60 */ + U_JG_MALAYALAM_NNA, /**< @stable ICU 60 */ + U_JG_MALAYALAM_NNNA, /**< @stable ICU 60 */ + U_JG_MALAYALAM_NYA, /**< @stable ICU 60 */ + U_JG_MALAYALAM_RA, /**< @stable ICU 60 */ + U_JG_MALAYALAM_SSA, /**< @stable ICU 60 */ + U_JG_MALAYALAM_TTA, /**< @stable ICU 60 */ + #ifndef U_HIDE_DEPRECATED_API /** * One more than the highest normal UJoiningGroup value. @@ -3523,27 +3570,6 @@ u_toupper(UChar32 c); U_STABLE UChar32 U_EXPORT2 u_totitle(UChar32 c); -/** Option value for case folding: use default mappings defined in CaseFolding.txt. @stable ICU 2.0 */ -#define U_FOLD_CASE_DEFAULT 0 - -/** - * Option value for case folding: - * - * Use the modified set of mappings provided in CaseFolding.txt to handle dotted I - * and dotless i appropriately for Turkic languages (tr, az). - * - * Before Unicode 3.2, CaseFolding.txt contains mappings marked with 'I' that - * are to be included for default mappings and - * excluded for the Turkic-specific mappings. - * - * Unicode 3.2 CaseFolding.txt instead contains mappings marked with 'T' that - * are to be excluded for default mappings and - * included for the Turkic-specific mappings. - * - * @stable ICU 2.0 - */ -#define U_FOLD_CASE_EXCLUDE_SPECIAL_I 1 - /** * The given character is mapped to its case folding equivalent according to * UnicodeData.txt and CaseFolding.txt; diff --git a/Build/source/libs/icu/icu-src/source/common/unicode/ucharstrie.h b/Build/source/libs/icu/icu-src/source/common/unicode/ucharstrie.h index 8daed447ced..dfc93f6d0ba 100644 --- a/Build/source/libs/icu/icu-src/source/common/unicode/ucharstrie.h +++ b/Build/source/libs/icu/icu-src/source/common/unicode/ucharstrie.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* @@ -6,7 +6,7 @@ * Corporation and others. All Rights Reserved. ******************************************************************************* * file name: ucharstrie.h -* encoding: US-ASCII +* encoding: UTF-8 * tab size: 8 (not used) * indentation:4 * @@ -36,7 +36,7 @@ class UVector32; /** * Light-weight, non-const reader class for a UCharsTrie. - * Traverses a UChar-serialized data structure with minimal state, + * Traverses a char16_t-serialized data structure with minimal state, * for mapping strings (16-bit-unit sequences) to non-negative integer values. * * This class owns the serialized trie data only if it was constructed by @@ -52,18 +52,18 @@ public: /** * Constructs a UCharsTrie reader instance. * - * The trieUChars must contain a copy of a UChar sequence from the UCharsTrieBuilder, - * starting with the first UChar of that sequence. - * The UCharsTrie object will not read more UChars than + * The trieUChars must contain a copy of a char16_t sequence from the UCharsTrieBuilder, + * starting with the first char16_t of that sequence. + * The UCharsTrie object will not read more char16_ts than * the UCharsTrieBuilder generated in the corresponding build() call. * * The array is not copied/cloned and must not be modified while * the UCharsTrie object is in use. * - * @param trieUChars The UChar array that contains the serialized trie. + * @param trieUChars The char16_t array that contains the serialized trie. * @stable ICU 4.8 */ - UCharsTrie(const UChar *trieUChars) + UCharsTrie(ConstChar16Ptr trieUChars) : ownedArray_(NULL), uchars_(trieUChars), pos_(uchars_), remainingMatchLength_(-1) {} @@ -75,7 +75,7 @@ public: /** * Copy constructor, copies the other trie reader object and its state, - * but not the UChar array which will be shared. (Shallow copy.) + * but not the char16_t array which will be shared. (Shallow copy.) * @param other Another UCharsTrie object. * @stable ICU 4.8 */ @@ -109,8 +109,8 @@ public: private: friend class UCharsTrie; - const UChar *uchars; - const UChar *pos; + const char16_t *uchars; + const char16_t *pos; int32_t remainingMatchLength; }; @@ -148,14 +148,14 @@ public: /** * Determines whether the string so far matches, whether it has a value, - * and whether another input UChar can continue a matching string. + * and whether another input char16_t can continue a matching string. * @return The match/value Result. * @stable ICU 4.8 */ UStringTrieResult current() const; /** - * Traverses the trie from the initial state for this input UChar. + * Traverses the trie from the initial state for this input char16_t. * Equivalent to reset().next(uchar). * @param uchar Input char value. Values below 0 and above 0xffff will never match. * @return The match/value Result. @@ -177,7 +177,7 @@ public: UStringTrieResult firstForCodePoint(UChar32 cp); /** - * Traverses the trie from the current state for this input UChar. + * Traverses the trie from the current state for this input char16_t. * @param uchar Input char value. Values below 0 and above 0xffff will never match. * @return The match/value Result. * @stable ICU 4.8 @@ -208,7 +208,7 @@ public: * @return The match/value Result. * @stable ICU 4.8 */ - UStringTrieResult next(const UChar *s, int32_t length); + UStringTrieResult next(ConstChar16Ptr s, int32_t length); /** * Returns a matching string's value if called immediately after @@ -220,7 +220,7 @@ public: * @stable ICU 4.8 */ inline int32_t getValue() const { - const UChar *pos=pos_; + const char16_t *pos=pos_; int32_t leadUnit=*pos++; // U_ASSERT(leadUnit>=kMinValueLead); return leadUnit&kValueIsFinal ? @@ -237,16 +237,16 @@ public: * @stable ICU 4.8 */ inline UBool hasUniqueValue(int32_t &uniqueValue) const { - const UChar *pos=pos_; + const char16_t *pos=pos_; // Skip the rest of a pending linear-match node. return pos!=NULL && findUniqueValue(pos+remainingMatchLength_+1, FALSE, uniqueValue); } /** - * Finds each UChar which continues the string from the current state. - * That is, each UChar c for which it would be next(c)!=USTRINGTRIE_NO_MATCH now. - * @param out Each next UChar is appended to this object. - * @return the number of UChars which continue the string from here + * Finds each char16_t which continues the string from the current state. + * That is, each char16_t c for which it would be next(c)!=USTRINGTRIE_NO_MATCH now. + * @param out Each next char16_t is appended to this object. + * @return the number of char16_ts which continue the string from here * @stable ICU 4.8 */ int32_t getNextUChars(Appendable &out) const; @@ -258,8 +258,8 @@ public: class U_COMMON_API Iterator : public UMemory { public: /** - * Iterates from the root of a UChar-serialized UCharsTrie. - * @param trieUChars The trie UChars. + * Iterates from the root of a char16_t-serialized UCharsTrie. + * @param trieUChars The trie char16_ts. * @param maxStringLength If 0, the iterator returns full strings. * Otherwise, the iterator returns strings with this maximum length. * @param errorCode Standard ICU error code. Its input value must @@ -268,7 +268,7 @@ public: * function chaining. (See User Guide for details.) * @stable ICU 4.8 */ - Iterator(const UChar *trieUChars, int32_t maxStringLength, UErrorCode &errorCode); + Iterator(ConstChar16Ptr trieUChars, int32_t maxStringLength, UErrorCode &errorCode); /** * Iterates from the current state of the specified UCharsTrie. @@ -336,11 +336,11 @@ public: return TRUE; } - const UChar *branchNext(const UChar *pos, int32_t length, UErrorCode &errorCode); + const char16_t *branchNext(const char16_t *pos, int32_t length, UErrorCode &errorCode); - const UChar *uchars_; - const UChar *pos_; - const UChar *initialPos_; + const char16_t *uchars_; + const char16_t *pos_; + const char16_t *initialPos_; int32_t remainingMatchLength_; int32_t initialRemainingMatchLength_; UBool skipValue_; // Skip intermediate value which was already delivered. @@ -368,7 +368,7 @@ private: * this constructor adopts the builder's array. * This constructor is only called by the builder. */ - UCharsTrie(UChar *adoptUChars, const UChar *trieUChars) + UCharsTrie(char16_t *adoptUChars, const char16_t *trieUChars) : ownedArray_(adoptUChars), uchars_(trieUChars), pos_(uchars_), remainingMatchLength_(-1) {} @@ -381,7 +381,7 @@ private: // Reads a compact 32-bit integer. // pos is already after the leadUnit, and the lead unit has bit 15 reset. - static inline int32_t readValue(const UChar *pos, int32_t leadUnit) { + static inline int32_t readValue(const char16_t *pos, int32_t leadUnit) { int32_t value; if(leadUnit=kMinTwoUnitValueLead) { if(leadUnit=kMinTwoUnitNodeValueLead) { if(leadUnit=kMinTwoUnitDeltaLead) { if(delta==kThreeUnitDeltaLead) { @@ -444,7 +444,7 @@ private: return pos+delta; } - static const UChar *skipDelta(const UChar *pos) { + static const char16_t *skipDelta(const char16_t *pos) { int32_t delta=*pos++; if(delta>=kMinTwoUnitDeltaLead) { if(delta==kThreeUnitDeltaLead) { @@ -461,28 +461,28 @@ private: } // Handles a branch node for both next(uchar) and next(string). - UStringTrieResult branchNext(const UChar *pos, int32_t length, int32_t uchar); + UStringTrieResult branchNext(const char16_t *pos, int32_t length, int32_t uchar); // Requires remainingLength_<0. - UStringTrieResult nextImpl(const UChar *pos, int32_t uchar); + UStringTrieResult nextImpl(const char16_t *pos, int32_t uchar); // Helper functions for hasUniqueValue(). // Recursively finds a unique value (or whether there is not a unique one) // from a branch. - static const UChar *findUniqueValueFromBranch(const UChar *pos, int32_t length, + static const char16_t *findUniqueValueFromBranch(const char16_t *pos, int32_t length, UBool haveUniqueValue, int32_t &uniqueValue); // Recursively finds a unique value (or whether there is not a unique one) // starting from a position on a node lead unit. - static UBool findUniqueValue(const UChar *pos, UBool haveUniqueValue, int32_t &uniqueValue); + static UBool findUniqueValue(const char16_t *pos, UBool haveUniqueValue, int32_t &uniqueValue); // Helper functions for getNextUChars(). // getNextUChars() when pos is on a branch node. - static void getNextBranchUChars(const UChar *pos, int32_t length, Appendable &out); + static void getNextBranchUChars(const char16_t *pos, int32_t length, Appendable &out); // UCharsTrie data structure // - // The trie consists of a series of UChar-serialized nodes for incremental - // Unicode string/UChar sequence matching. (UChar=16-bit unsigned integer) + // The trie consists of a series of char16_t-serialized nodes for incremental + // Unicode string/char16_t sequence matching. (char16_t=16-bit unsigned integer) // The root node is at the beginning of the trie data. // // Types of nodes are distinguished by their node lead unit ranges. @@ -491,9 +491,9 @@ private: // // Node types: // - Final-value node: Stores a 32-bit integer in a compact, variable-length format. - // The value is for the string/UChar sequence so far. + // The value is for the string/char16_t sequence so far. // - Match node, optionally with an intermediate value in a different compact format. - // The value, if present, is for the string/UChar sequence so far. + // The value, if present, is for the string/char16_t sequence so far. // // Aside from the value, which uses the node lead unit's high bits: // @@ -560,15 +560,15 @@ private: static const int32_t kMaxTwoUnitDelta=((kThreeUnitDeltaLead-kMinTwoUnitDeltaLead)<<16)-1; // 0x03feffff - UChar *ownedArray_; + char16_t *ownedArray_; // Fixed value referencing the UCharsTrie words. - const UChar *uchars_; + const char16_t *uchars_; // Iterator variables. // Pointer to next trie unit to read. NULL if no more matches. - const UChar *pos_; + const char16_t *pos_; // Remaining length of a linear-match node, minus 1. Negative if not in such a node. int32_t remainingMatchLength_; }; diff --git a/Build/source/libs/icu/icu-src/source/common/unicode/ucharstriebuilder.h b/Build/source/libs/icu/icu-src/source/common/unicode/ucharstriebuilder.h index cc9fb77a917..2aa4757e52c 100644 --- a/Build/source/libs/icu/icu-src/source/common/unicode/ucharstriebuilder.h +++ b/Build/source/libs/icu/icu-src/source/common/unicode/ucharstriebuilder.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* @@ -6,7 +6,7 @@ * Corporation and others. All Rights Reserved. ******************************************************************************* * file name: ucharstriebuilder.h -* encoding: US-ASCII +* encoding: UTF-8 * tab size: 8 (not used) * indentation:4 * @@ -89,21 +89,21 @@ public: UCharsTrie *build(UStringTrieBuildOption buildOption, UErrorCode &errorCode); /** - * Builds a UCharsTrie for the add()ed data and UChar-serializes it. + * Builds a UCharsTrie for the add()ed data and char16_t-serializes it. * Once built, no further data can be add()ed until clear() is called. * * A UCharsTrie cannot be empty. At least one (string, value) pair * must have been add()ed. * * Multiple calls to buildUnicodeString() set the UnicodeStrings to the - * builder's same UChar array, without rebuilding. + * builder's same char16_t array, without rebuilding. * If buildUnicodeString() is called after build(), the trie will be * re-serialized into a new array. * If build() is called after buildUnicodeString(), the trie object will become * the owner of the previously returned array. * After clear() has been called, a new array will be used as well. * @param buildOption Build option, see UStringTrieBuildOption. - * @param result A UnicodeString which will be set to the UChar-serialized + * @param result A UnicodeString which will be set to the char16_t-serialized * UCharsTrie for the add()ed data. * @param errorCode Standard ICU error code. Its input value must * pass the U_SUCCESS() test, or else the function returns @@ -135,14 +135,14 @@ private: void buildUChars(UStringTrieBuildOption buildOption, UErrorCode &errorCode); virtual int32_t getElementStringLength(int32_t i) const; - virtual UChar getElementUnit(int32_t i, int32_t unitIndex) const; + virtual char16_t getElementUnit(int32_t i, int32_t unitIndex) const; virtual int32_t getElementValue(int32_t i) const; virtual int32_t getLimitOfLinearMatch(int32_t first, int32_t last, int32_t unitIndex) const; virtual int32_t countElementUnits(int32_t start, int32_t limit, int32_t unitIndex) const; virtual int32_t skipElementsBySomeUnits(int32_t i, int32_t unitIndex, int32_t count) const; - virtual int32_t indexOfElementWithNextUnit(int32_t i, int32_t unitIndex, UChar unit) const; + virtual int32_t indexOfElementWithNextUnit(int32_t i, int32_t unitIndex, char16_t unit) const; virtual UBool matchNodesCanHaveValues() const { return TRUE; } @@ -152,11 +152,11 @@ private: class UCTLinearMatchNode : public LinearMatchNode { public: - UCTLinearMatchNode(const UChar *units, int32_t len, Node *nextNode); + UCTLinearMatchNode(const char16_t *units, int32_t len, Node *nextNode); virtual UBool operator==(const Node &other) const; virtual void write(StringTrieBuilder &builder); private: - const UChar *s; + const char16_t *s; }; virtual Node *createLinearMatchNode(int32_t i, int32_t unitIndex, int32_t length, @@ -164,7 +164,7 @@ private: UBool ensureCapacity(int32_t length); virtual int32_t write(int32_t unit); - int32_t write(const UChar *s, int32_t length); + int32_t write(const char16_t *s, int32_t length); virtual int32_t writeElementUnits(int32_t i, int32_t unitIndex, int32_t length); virtual int32_t writeValueAndFinal(int32_t i, UBool isFinal); virtual int32_t writeValueAndType(UBool hasValue, int32_t value, int32_t node); @@ -175,9 +175,9 @@ private: int32_t elementsCapacity; int32_t elementsLength; - // UChar serialization of the trie. + // char16_t serialization of the trie. // Grows from the back: ucharsLength measures from the end of the buffer! - UChar *uchars; + char16_t *uchars; int32_t ucharsCapacity; int32_t ucharsLength; }; diff --git a/Build/source/libs/icu/icu-src/source/common/unicode/uchriter.h b/Build/source/libs/icu/icu-src/source/common/unicode/uchriter.h index d87ffb13cf9..efcd263f8bc 100644 --- a/Build/source/libs/icu/icu-src/source/common/unicode/uchriter.h +++ b/Build/source/libs/icu/icu-src/source/common/unicode/uchriter.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** @@ -15,18 +15,18 @@ /** * \file - * \brief C++ API: UChar Character Iterator + * \brief C++ API: char16_t Character Iterator */ U_NAMESPACE_BEGIN /** * A concrete subclass of CharacterIterator that iterates over the - * characters (code units or code points) in a UChar array. + * characters (code units or code points) in a char16_t array. * It's possible not only to create an - * iterator that iterates over an entire UChar array, but also to - * create one that iterates over only a subrange of a UChar array - * (iterators over different subranges of the same UChar array don't + * iterator that iterates over an entire char16_t array, but also to + * create one that iterates over only a subrange of a char16_t array + * (iterators over different subranges of the same char16_t array don't * compare equal). * @see CharacterIterator * @see ForwardCharacterIterator @@ -35,34 +35,34 @@ U_NAMESPACE_BEGIN class U_COMMON_API UCharCharacterIterator : public CharacterIterator { public: /** - * Create an iterator over the UChar array referred to by "textPtr". + * Create an iterator over the char16_t array referred to by "textPtr". * The iteration range is 0 to length-1. * text is only aliased, not adopted (the * destructor will not delete it). - * @param textPtr The UChar array to be iterated over - * @param length The length of the UChar array + * @param textPtr The char16_t array to be iterated over + * @param length The length of the char16_t array * @stable ICU 2.0 */ - UCharCharacterIterator(const UChar* textPtr, int32_t length); + UCharCharacterIterator(ConstChar16Ptr textPtr, int32_t length); /** - * Create an iterator over the UChar array referred to by "textPtr". + * Create an iterator over the char16_t array referred to by "textPtr". * The iteration range is 0 to length-1. * text is only aliased, not adopted (the * destructor will not delete it). * The starting * position is specified by "position". If "position" is outside the valid * iteration range, the behavior of this object is undefined. - * @param textPtr The UChar array to be iteratd over - * @param length The length of the UChar array + * @param textPtr The char16_t array to be iteratd over + * @param length The length of the char16_t array * @param position The starting position of the iteration * @stable ICU 2.0 */ - UCharCharacterIterator(const UChar* textPtr, int32_t length, + UCharCharacterIterator(ConstChar16Ptr textPtr, int32_t length, int32_t position); /** - * Create an iterator over the UChar array referred to by "textPtr". + * Create an iterator over the char16_t array referred to by "textPtr". * The iteration range is 0 to end-1. * text is only aliased, not adopted (the * destructor will not delete it). @@ -70,14 +70,14 @@ public: * position is specified by "position". If begin and end do not * form a valid iteration range or "position" is outside the valid * iteration range, the behavior of this object is undefined. - * @param textPtr The UChar array to be iterated over - * @param length The length of the UChar array + * @param textPtr The char16_t array to be iterated over + * @param length The length of the char16_t array * @param textBegin The begin position of the iteration range * @param textEnd The end position of the iteration range * @param position The starting position of the iteration * @stable ICU 2.0 */ - UCharCharacterIterator(const UChar* textPtr, int32_t length, + UCharCharacterIterator(ConstChar16Ptr textPtr, int32_t length, int32_t textBegin, int32_t textEnd, int32_t position); @@ -141,7 +141,7 @@ public: * @return the first code unit in its iteration range. * @stable ICU 2.0 */ - virtual UChar first(void); + virtual char16_t first(void); /** * Sets the iterator to refer to the first code unit in its @@ -151,7 +151,7 @@ public: * @return the first code unit in its iteration range * @stable ICU 2.0 */ - virtual UChar firstPostInc(void); + virtual char16_t firstPostInc(void); /** * Sets the iterator to refer to the first code point in its @@ -181,7 +181,7 @@ public: * @return the last code unit in its iteration range. * @stable ICU 2.0 */ - virtual UChar last(void); + virtual char16_t last(void); /** * Sets the iterator to refer to the last code point in its @@ -200,7 +200,7 @@ public: * @return the code unit * @stable ICU 2.0 */ - virtual UChar setIndex(int32_t position); + virtual char16_t setIndex(int32_t position); /** * Sets the iterator to refer to the beginning of the code point @@ -220,7 +220,7 @@ public: * @return the code unit the iterator currently refers to. * @stable ICU 2.0 */ - virtual UChar current(void) const; + virtual char16_t current(void) const; /** * Returns the code point the iterator currently refers to. @@ -236,7 +236,7 @@ public: * @return the next code unit in the iteration range. * @stable ICU 2.0 */ - virtual UChar next(void); + virtual char16_t next(void); /** * Gets the current code unit for returning and advances to the next code unit @@ -246,7 +246,7 @@ public: * @return the current code unit. * @stable ICU 2.0 */ - virtual UChar nextPostInc(void); + virtual char16_t nextPostInc(void); /** * Advances to the next code point in the iteration range (toward @@ -288,7 +288,7 @@ public: * @return the previous code unit in the iteration range. * @stable ICU 2.0 */ - virtual UChar previous(void); + virtual char16_t previous(void); /** * Advances to the previous code point in the iteration range (toward @@ -334,16 +334,20 @@ public: * @return the new position * @stable ICU 2.0 */ +#ifdef move32 + // One of the system headers right now is sometimes defining a conflicting macro we don't use +#undef move32 +#endif virtual int32_t move32(int32_t delta, EOrigin origin); /** * Sets the iterator to iterate over a new range of text * @stable ICU 2.0 */ - void setText(const UChar* newText, int32_t newTextLength); + void setText(ConstChar16Ptr newText, int32_t newTextLength); /** - * Copies the UChar array under iteration into the UnicodeString + * Copies the char16_t array under iteration into the UnicodeString * referred to by "result". Even if this iterator iterates across * only a part of this string, the whole string is copied. * @param result Receives a copy of the text under iteration. @@ -375,7 +379,7 @@ protected: * Protected member text * @stable ICU 2.0 */ - const UChar* text; + const char16_t* text; }; diff --git a/Build/source/libs/icu/icu-src/source/common/unicode/uclean.h b/Build/source/libs/icu/icu-src/source/common/unicode/uclean.h index d7801d69b4a..5b0486d3950 100644 --- a/Build/source/libs/icu/icu-src/source/common/unicode/uclean.h +++ b/Build/source/libs/icu/icu-src/source/common/unicode/uclean.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ****************************************************************************** @@ -6,7 +6,7 @@ * Corporation and others. All Rights Reserved. ****************************************************************************** * file name: uclean.h -* encoding: US-ASCII +* encoding: UTF-8 * tab size: 8 (not used) * indentation:4 * @@ -101,7 +101,7 @@ u_init(UErrorCode *status); U_STABLE void U_EXPORT2 u_cleanup(void); - +U_CDECL_BEGIN /** * Pointer type for a user supplied memory allocation function. * @param context user supplied value, obtained from from u_setMemoryFunctions(). @@ -149,9 +149,10 @@ typedef void U_CALLCONV UMemFreeFn (const void *context, void *mem); * @system */ U_STABLE void U_EXPORT2 -u_setMemoryFunctions(const void *context, UMemAllocFn *a, UMemReallocFn *r, UMemFreeFn *f, +u_setMemoryFunctions(const void *context, UMemAllocFn * U_CALLCONV_FPTR a, UMemReallocFn * U_CALLCONV_FPTR r, UMemFreeFn * U_CALLCONV_FPTR f, UErrorCode *status); +U_CDECL_END #ifndef U_HIDE_DEPRECATED_API /********************************************************************************* @@ -172,6 +173,7 @@ u_setMemoryFunctions(const void *context, UMemAllocFn *a, UMemReallocFn *r, UMem */ typedef void *UMTX; +U_CDECL_BEGIN /** * Function Pointer type for a user supplied mutex initialization function. * The user-supplied function will be called by ICU whenever ICU needs to create a @@ -201,7 +203,7 @@ typedef void U_CALLCONV UMtxInitFn (const void *context, UMTX *mutex, UErrorCod * @system */ typedef void U_CALLCONV UMtxFn (const void *context, UMTX *mutex); - +U_CDECL_END /** * Set the functions that ICU will use for mutex operations diff --git a/Build/source/libs/icu/icu-src/source/common/unicode/ucnv.h b/Build/source/libs/icu/icu-src/source/common/unicode/ucnv.h index 767c1a2a7f4..05d0050f4a2 100644 --- a/Build/source/libs/icu/icu-src/source/common/unicode/ucnv.h +++ b/Build/source/libs/icu/icu-src/source/common/unicode/ucnv.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** @@ -29,7 +29,7 @@ * converter, you can get its properties, set options, convert your data and * close the converter.

      * - *

      Since many software programs recogize different converter names for + *

      Since many software programs recognize different converter names for * different types of converters, there are other functions in this API to * iterate over the converter aliases. The functions {@link ucnv_getAvailableName() }, * {@link ucnv_getAlias() } and {@link ucnv_getStandardName() } are some of the @@ -184,7 +184,7 @@ typedef enum { /** * Function pointer for error callback in the codepage to unicode direction. - * Called when an error has occured in conversion to unicode, or on open/close of the callback (see reason). + * Called when an error has occurred in conversion to unicode, or on open/close of the callback (see reason). * @param context Pointer to the callback's private data * @param args Information about the conversion in progress * @param codeUnits Points to 'length' bytes of the concerned codepage sequence @@ -452,7 +452,7 @@ ucnv_openU(const UChar *name, * @param platform the platform in which the codepage number exists * @param err error status U_MEMORY_ALLOCATION_ERROR, U_FILE_ACCESS_ERROR * @return the created Unicode converter object, or NULL if an error - * occured. + * occurred. * @see ucnv_open * @see ucnv_openU * @see ucnv_close @@ -596,7 +596,7 @@ U_NAMESPACE_END * stateful, then subChars will be an empty string. * * @param converter the Unicode converter - * @param subChars the subsitution characters + * @param subChars the substitution characters * @param len on input the capacity of subChars, on output the number * of bytes copied to it * @param err the outgoing error status code. @@ -832,7 +832,7 @@ ucnv_getMinCharSize(const UConverter *converter); * name will be filled in. * * @param converter the Unicode converter. - * @param displayLocale is the specific Locale we want to localised for + * @param displayLocale is the specific Locale we want to localized for * @param displayName user provided buffer to be filled in * @param displayNameCapacity size of displayName Buffer * @param err error status code @@ -877,7 +877,7 @@ ucnv_getName(const UConverter *converter, UErrorCode *err); * * @param converter the Unicode converter * @param err the error status code. - * @return If any error occurrs, -1 will be returned otherwise, the codepage number + * @return If any error occurs, -1 will be returned otherwise, the codepage number * will be returned * @see ucnv_openCCSID * @see ucnv_getPlatform diff --git a/Build/source/libs/icu/icu-src/source/common/unicode/ucnv_cb.h b/Build/source/libs/icu/icu-src/source/common/unicode/ucnv_cb.h index 7104c724525..14169ed61c1 100644 --- a/Build/source/libs/icu/icu-src/source/common/unicode/ucnv_cb.h +++ b/Build/source/libs/icu/icu-src/source/common/unicode/ucnv_cb.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** diff --git a/Build/source/libs/icu/icu-src/source/common/unicode/ucnv_err.h b/Build/source/libs/icu/icu-src/source/common/unicode/ucnv_err.h index b970b891fd0..2f74754ce4d 100644 --- a/Build/source/libs/icu/icu-src/source/common/unicode/ucnv_err.h +++ b/Build/source/libs/icu/icu-src/source/common/unicode/ucnv_err.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** diff --git a/Build/source/libs/icu/icu-src/source/common/unicode/ucnvsel.h b/Build/source/libs/icu/icu-src/source/common/unicode/ucnvsel.h index 3eed081a37b..d423845ceb6 100644 --- a/Build/source/libs/icu/icu-src/source/common/unicode/ucnvsel.h +++ b/Build/source/libs/icu/icu-src/source/common/unicode/ucnvsel.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* diff --git a/Build/source/libs/icu/icu-src/source/common/unicode/uconfig.h b/Build/source/libs/icu/icu-src/source/common/unicode/uconfig.h index 77a476dd897..7ddf4e6adfb 100644 --- a/Build/source/libs/icu/icu-src/source/common/unicode/uconfig.h +++ b/Build/source/libs/icu/icu-src/source/common/unicode/uconfig.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** @@ -6,7 +6,7 @@ * Corporation and others. All Rights Reserved. ********************************************************************** * file name: uconfig.h -* encoding: US-ASCII +* encoding: UTF-8 * tab size: 8 (not used) * indentation:4 * @@ -76,7 +76,7 @@ #endif /** - * Determines wheter to enable auto cleanup of libraries. + * Determines whether to enable auto cleanup of libraries. * @internal */ #ifndef UCLN_NO_AUTO_CLEANUP @@ -262,7 +262,8 @@ /** * \def UCONFIG_NO_CONVERSION - * ICU will not completely build with this switch turned on. + * ICU will not completely build (compiling the tools fails) with this + * switch turned on. * This switch turns off all converters. * * You may want to use this together with U_CHARSET_IS_UTF8 defined to 1 @@ -320,7 +321,9 @@ */ #ifndef UCONFIG_NO_NORMALIZATION # define UCONFIG_NO_NORMALIZATION 0 -#elif UCONFIG_NO_NORMALIZATION +#endif + +#if UCONFIG_NO_NORMALIZATION /* common library */ /* ICU 50 CJK dictionary BreakIterator uses normalization */ # define UCONFIG_NO_BREAK_ITERATION 1 diff --git a/Build/source/libs/icu/icu-src/source/common/unicode/ucurr.h b/Build/source/libs/icu/icu-src/source/common/unicode/ucurr.h index 56bad0aec65..1abb3b22e97 100644 --- a/Build/source/libs/icu/icu-src/source/common/unicode/ucurr.h +++ b/Build/source/libs/icu/icu-src/source/common/unicode/ucurr.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** diff --git a/Build/source/libs/icu/icu-src/source/common/unicode/udata.h b/Build/source/libs/icu/icu-src/source/common/unicode/udata.h index bde719d8e2e..a0286e1e420 100644 --- a/Build/source/libs/icu/icu-src/source/common/unicode/udata.h +++ b/Build/source/libs/icu/icu-src/source/common/unicode/udata.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ****************************************************************************** @@ -8,7 +8,7 @@ * ****************************************************************************** * file name: udata.h -* encoding: US-ASCII +* encoding: UTF-8 * tab size: 8 (not used) * indentation:4 * diff --git a/Build/source/libs/icu/icu-src/source/common/unicode/udisplaycontext.h b/Build/source/libs/icu/icu-src/source/common/unicode/udisplaycontext.h index eaef02d7956..398481c6812 100644 --- a/Build/source/libs/icu/icu-src/source/common/unicode/udisplaycontext.h +++ b/Build/source/libs/icu/icu-src/source/common/unicode/udisplaycontext.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ***************************************************************************************** @@ -44,14 +44,12 @@ enum UDisplayContextType { * @stable ICU 54 */ UDISPCTX_TYPE_DISPLAY_LENGTH = 2, -#ifndef U_HIDE_DRAFT_API /** * Type to retrieve the substitute handling setting, e.g. * UDISPCTX_SUBSTITUTE, UDISPCTX_NO_SUBSTITUTE. - * @draft ICU 58 + * @stable ICU 58 */ UDISPCTX_TYPE_SUBSTITUTE_HANDLING = 3 -#endif /* U_HIDE_DRAFT_API */ }; /** * @stable ICU 51 @@ -143,7 +141,6 @@ enum UDisplayContext { * @stable ICU 54 */ UDISPCTX_LENGTH_SHORT = (UDISPCTX_TYPE_DISPLAY_LENGTH<<8) + 1, -#ifndef U_HIDE_DRAFT_API /** * ================================ * SUBSTITUTE_HANDLING can be set to one of UDISPCTX_SUBSTITUTE or @@ -154,16 +151,15 @@ enum UDisplayContext { * A possible setting for SUBSTITUTE_HANDLING: * Returns a fallback value (e.g., the input code) when no data is available. * This is the default value. - * @draft ICU 58 + * @stable ICU 58 */ UDISPCTX_SUBSTITUTE = (UDISPCTX_TYPE_SUBSTITUTE_HANDLING<<8) + 0, /** * A possible setting for SUBSTITUTE_HANDLING: * Returns a null value when no data is available. - * @draft ICU 58 + * @stable ICU 58 */ UDISPCTX_NO_SUBSTITUTE = (UDISPCTX_TYPE_SUBSTITUTE_HANDLING<<8) + 1 -#endif /* U_HIDE_DRAFT_API */ }; /** diff --git a/Build/source/libs/icu/icu-src/source/common/unicode/uenum.h b/Build/source/libs/icu/icu-src/source/common/unicode/uenum.h index 8da1bd45937..fc6efa2450d 100644 --- a/Build/source/libs/icu/icu-src/source/common/unicode/uenum.h +++ b/Build/source/libs/icu/icu-src/source/common/unicode/uenum.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* @@ -8,7 +8,7 @@ * ******************************************************************************* * file name: uenum.h -* encoding: US-ASCII +* encoding: UTF-8 * tab size: 8 (not used) * indentation:2 * @@ -23,7 +23,9 @@ #include "unicode/localpointer.h" #if U_SHOW_CPLUSPLUS_API -#include "unicode/strenum.h" +U_NAMESPACE_BEGIN +class StringEnumeration; +U_NAMESPACE_END #endif /** diff --git a/Build/source/libs/icu/icu-src/source/common/unicode/uidna.h b/Build/source/libs/icu/icu-src/source/common/unicode/uidna.h index af3455c1f76..0dafb762017 100644 --- a/Build/source/libs/icu/icu-src/source/common/unicode/uidna.h +++ b/Build/source/libs/icu/icu-src/source/common/unicode/uidna.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* @@ -8,7 +8,7 @@ * ******************************************************************************* * file name: uidna.h - * encoding: US-ASCII + * encoding: UTF-8 * tab size: 8 (not used) * indentation:4 * diff --git a/Build/source/libs/icu/icu-src/source/common/unicode/uiter.h b/Build/source/libs/icu/icu-src/source/common/unicode/uiter.h index e6cb838cf87..11ad75acd51 100644 --- a/Build/source/libs/icu/icu-src/source/common/unicode/uiter.h +++ b/Build/source/libs/icu/icu-src/source/common/unicode/uiter.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* @@ -8,7 +8,7 @@ * ******************************************************************************* * file name: uiter.h -* encoding: US-ASCII +* encoding: UTF-8 * tab size: 8 (not used) * indentation:4 * diff --git a/Build/source/libs/icu/icu-src/source/common/unicode/uldnames.h b/Build/source/libs/icu/icu-src/source/common/unicode/uldnames.h index 30f465a4501..3ebffa23db5 100644 --- a/Build/source/libs/icu/icu-src/source/common/unicode/uldnames.h +++ b/Build/source/libs/icu/icu-src/source/common/unicode/uldnames.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* diff --git a/Build/source/libs/icu/icu-src/source/common/unicode/ulistformatter.h b/Build/source/libs/icu/icu-src/source/common/unicode/ulistformatter.h index 2167f60346f..9fe24f7c7b5 100644 --- a/Build/source/libs/icu/icu-src/source/common/unicode/ulistformatter.h +++ b/Build/source/libs/icu/icu-src/source/common/unicode/ulistformatter.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ***************************************************************************************** @@ -49,7 +49,7 @@ typedef struct UListFormatter UListFormatter; /**< C typedef for struct UListFo * or NULL if an error occurred. * @stable ICU 55 */ -U_STABLE UListFormatter* U_EXPORT2 +U_CAPI UListFormatter* U_EXPORT2 ulistfmt_open(const char* locale, UErrorCode* status); @@ -59,7 +59,7 @@ ulistfmt_open(const char* locale, * The UListFormatter object to close. * @stable ICU 55 */ -U_STABLE void U_EXPORT2 +U_CAPI void U_EXPORT2 ulistfmt_close(UListFormatter *listfmt); @@ -116,7 +116,7 @@ U_NAMESPACE_END * total buffer size needed (e.g. for illegal arguments). * @stable ICU 55 */ -U_DRAFT int32_t U_EXPORT2 +U_CAPI int32_t U_EXPORT2 ulistfmt_format(const UListFormatter* listfmt, const UChar* const strings[], const int32_t * stringLengths, diff --git a/Build/source/libs/icu/icu-src/source/common/unicode/uloc.h b/Build/source/libs/icu/icu-src/source/common/unicode/uloc.h index 92ce20ec5fa..23a54a9981c 100644 --- a/Build/source/libs/icu/icu-src/source/common/unicode/uloc.h +++ b/Build/source/libs/icu/icu-src/source/common/unicode/uloc.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** @@ -61,7 +61,7 @@ * http://www.ics.uci.edu/pub/ietf/http/related/iso639.txt * *

      - * The second option includes an additonal ISO Country + * The second option includes an additional ISO Country * Code. These codes are the upper-case two-letter codes * as defined by ISO-3166. * You can find a full list of these codes at a number of sites, such as: @@ -69,7 +69,7 @@ * http://www.chemie.fu-berlin.de/diverse/doc/ISO_3166.html * *

      - * The third option requires another additonal information--the + * The third option requires another additional information--the * Variant. * The Variant codes are vendor and browser-specific. * For example, use WIN for Windows, MAC for Macintosh, and POSIX for POSIX. @@ -157,7 +157,7 @@ * just a mechanism for identifying these services. * *

      - * Each international serivce that performs locale-sensitive operations + * Each international service that performs locale-sensitive operations * allows you * to get all the available objects of that type. You can sift * through these objects by language, country, or variant, @@ -539,6 +539,9 @@ uloc_getISO3Country(const char* localeID); * Gets the Win32 LCID value for the specified locale. * If the ICU locale is not recognized by Windows, 0 will be returned. * + * LCIDs were deprecated with Windows Vista and Microsoft recommends + * that developers use BCP47 style tags instead (uloc_toLanguageTag). + * * @param localeID the locale to get the Win32 LCID value with * @return country the Win32 LCID for localeID * @stable ICU 2.0 @@ -577,7 +580,7 @@ uloc_getDisplayLanguage(const char* locale, * if the locale's language code is "en", passing Locale::getFrench() for * inLocale would result in "", while passing Locale::getGerman() * for inLocale would result in "". NULL may be used to specify the default. - * @param script the displayable country code for localeID + * @param script the displayable script for the localeID * @param scriptCapacity the size of the script buffer to store the * displayable script code with * @param status error information if retrieving the displayable script code failed @@ -852,10 +855,12 @@ uloc_openKeywords(const char* localeID, * Get the value for a keyword. Locale name does not need to be normalized. * * @param localeID locale name containing the keyword ("de_DE@currency=EURO;collation=PHONEBOOK") - * @param keywordName name of the keyword for which we want the value. Case insensitive. + * @param keywordName name of the keyword for which we want the value; must not be + * NULL or empty, and must consist only of [A-Za-z0-9]. Case insensitive. * @param buffer receiving buffer * @param bufferCapacity capacity of receiving buffer - * @param status containing error code - buffer not big enough. + * @param status containing error code: e.g. buffer not big enough or ill-formed localeID + * or keywordName parameters. * @return the length of keyword value * @stable ICU 2.8 */ @@ -872,18 +877,26 @@ uloc_getKeywordValue(const char* localeID, * For removing all keywords, use uloc_getBaseName(). * * NOTE: Unlike almost every other ICU function which takes a - * buffer, this function will NOT truncate the output text. If a - * BUFFER_OVERFLOW_ERROR is received, it means that the original - * buffer is untouched. This is done to prevent incorrect or possibly - * even malformed locales from being generated and used. + * buffer, this function will NOT truncate the output text, and will + * not update the buffer with unterminated text setting a status of + * U_STRING_NOT_TERMINATED_WARNING. If a BUFFER_OVERFLOW_ERROR is received, + * it means a terminated version of the updated locale ID would not fit + * in the buffer, and the original buffer is untouched. This is done to + * prevent incorrect or possibly even malformed locales from being generated + * and used. * - * @param keywordName name of the keyword to be set. Case insensitive. + * @param keywordName name of the keyword to be set; must not be + * NULL or empty, and must consist only of [A-Za-z0-9]. Case insensitive. * @param keywordValue value of the keyword to be set. If 0-length or - * NULL, will result in the keyword being removed. No error is given if - * that keyword does not exist. - * @param buffer input buffer containing locale to be modified. + * NULL, will result in the keyword being removed; no error is given if + * that keyword does not exist. Otherwise, must consist only of + * [A-Za-z0-9] and [/_+-]. + * @param buffer input buffer containing well-formed locale ID to be + * modified. * @param bufferCapacity capacity of receiving buffer - * @param status containing error code - buffer not big enough. + * @param status containing error code: e.g. buffer not big enough + * or ill-formed keywordName or keywordValue parameters, or ill-formed + * locale ID in buffer on input. * @return the length needed for the buffer * @see uloc_getKeywordValue * @stable ICU 3.2 diff --git a/Build/source/libs/icu/icu-src/source/common/unicode/umachine.h b/Build/source/libs/icu/icu-src/source/common/unicode/umachine.h index 51581c7dcdc..3ba9161d2a5 100644 --- a/Build/source/libs/icu/icu-src/source/common/unicode/umachine.h +++ b/Build/source/libs/icu/icu-src/source/common/unicode/umachine.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ****************************************************************************** @@ -8,7 +8,7 @@ * ****************************************************************************** * file name: umachine.h -* encoding: US-ASCII +* encoding: UTF-8 * tab size: 8 (not used) * indentation:4 * @@ -51,29 +51,6 @@ */ #include -#ifndef U_HIDE_INTERNAL_API -/* - * U_USE_CHAR16_T - * When defined, force use of char16_t for UChar. - * Note: char16_t is expected to become the default and required in the future, - * and this option will be removed. - * @internal - */ -#ifdef U_USE_CHAR16_T -#ifdef UCHAR_TYPE -#undef UCHAR_TYPE -#endif -#define UCHAR_TYPE char16_t - -/* - * In plain C, is needed for the definition of char16_t - */ -#ifndef __cplusplus -#include -#endif -#endif -#endif /* U_HIDE_INTERNAL_API */ - /*==========================================================================*/ /* For C wrappers, we use the symbol U_STABLE. */ /* This works properly if the includer is C or C++. */ @@ -313,30 +290,92 @@ typedef int8_t UBool; /** Number of bytes in a UChar. @stable ICU 2.0 */ #define U_SIZEOF_UCHAR 2 +/** + * \def U_CHAR16_IS_TYPEDEF + * If 1, then char16_t is a typedef and not a real type (yet) + * @internal + */ +#if (U_PLATFORM == U_PF_AIX) && defined(__cplusplus) &&(U_CPLUSPLUS_VERSION < 11) +// for AIX, uchar.h needs to be included +# include +# define U_CHAR16_IS_TYPEDEF 1 +#else +# define U_CHAR16_IS_TYPEDEF 0 +#endif + + /** * \var UChar - * Define UChar to be UCHAR_TYPE, if that is #defined (for example, to char16_t), - * or wchar_t if that is 16 bits wide; always assumed to be unsigned. - * If neither is available, then define UChar to be uint16_t. * - * This makes the definition of UChar platform-dependent - * but allows direct string type compatibility with platforms with - * 16-bit wchar_t types. + * The base type for UTF-16 code units and pointers. + * Unsigned 16-bit integer. + * Starting with ICU 59, C++ API uses char16_t directly, while C API continues to use UChar. + * + * UChar is configurable by defining the macro UCHAR_TYPE + * on the preprocessor or compiler command line: + * -DUCHAR_TYPE=uint16_t or -DUCHAR_TYPE=wchar_t (if U_SIZEOF_WCHAR_T==2) etc. + * (The UCHAR_TYPE can also be #defined earlier in this file, for outside the ICU library code.) + * This is for transitional use from application code that uses uint16_t or wchar_t for UTF-16. + * + * The default is UChar=char16_t. + * + * C++11 defines char16_t as bit-compatible with uint16_t, but as a distinct type. + * + * In C, char16_t is a simple typedef of uint_least16_t. + * ICU requires uint_least16_t=uint16_t for data memory mapping. + * On macOS, char16_t is not available because the uchar.h standard header is missing. * * @stable ICU 4.4 */ -#if defined(UCHAR_TYPE) + +#if 1 + // #if 1 is normal. UChar defaults to char16_t in C++. + // For configuration testing of UChar=uint16_t temporarily change this to #if 0. + // The intltest Makefile #defines UCHAR_TYPE=char16_t, + // so we only #define it to uint16_t if it is undefined so far. +#elif !defined(UCHAR_TYPE) +# define UCHAR_TYPE uint16_t +#endif + +#if defined(U_COMBINED_IMPLEMENTATION) || defined(U_COMMON_IMPLEMENTATION) || \ + defined(U_I18N_IMPLEMENTATION) || defined(U_IO_IMPLEMENTATION) + // Inside the ICU library code, never configurable. + typedef char16_t UChar; +#elif defined(UCHAR_TYPE) typedef UCHAR_TYPE UChar; -/* Not #elif U_HAVE_CHAR16_T -- because that is type-incompatible with pre-C++11 callers - typedef char16_t UChar; */ -#elif U_SIZEOF_WCHAR_T==2 - typedef wchar_t UChar; -#elif defined(__CHAR16_TYPE__) - typedef __CHAR16_TYPE__ UChar; +#elif defined(__cplusplus) + typedef char16_t UChar; #else typedef uint16_t UChar; #endif +/** + * \var OldUChar + * Default ICU 58 definition of UChar. + * A base type for UTF-16 code units and pointers. + * Unsigned 16-bit integer. + * + * Define OldUChar to be wchar_t if that is 16 bits wide. + * If wchar_t is not 16 bits wide, then define UChar to be uint16_t. + * + * This makes the definition of OldUChar platform-dependent + * but allows direct string type compatibility with platforms with + * 16-bit wchar_t types. + * + * This is how UChar was defined in ICU 58, for transition convenience. + * Exception: ICU 58 UChar was defined to UCHAR_TYPE if that macro was defined. + * The current UChar responds to UCHAR_TYPE but OldUChar does not. + * + * @draft ICU 59 + */ +#if U_SIZEOF_WCHAR_T==2 + typedef wchar_t OldUChar; +#elif defined(__CHAR16_TYPE__) + typedef __CHAR16_TYPE__ OldUChar; +#else + typedef uint16_t OldUChar; +#endif + /** * Define UChar32 as a type for single Unicode code points. * UChar32 is a signed 32-bit integer (same as int32_t). diff --git a/Build/source/libs/icu/icu-src/source/common/unicode/umisc.h b/Build/source/libs/icu/icu-src/source/common/unicode/umisc.h index 7b6d35f5224..213290b9afa 100644 --- a/Build/source/libs/icu/icu-src/source/common/unicode/umisc.h +++ b/Build/source/libs/icu/icu-src/source/common/unicode/umisc.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** @@ -6,7 +6,7 @@ * Corporation and others. All Rights Reserved. ********************************************************************** * file name: umisc.h -* encoding: US-ASCII +* encoding: UTF-8 * tab size: 8 (not used) * indentation:4 * diff --git a/Build/source/libs/icu/icu-src/source/common/unicode/unifilt.h b/Build/source/libs/icu/icu-src/source/common/unicode/unifilt.h index 0fdcd148258..e10527154b6 100644 --- a/Build/source/libs/icu/icu-src/source/common/unicode/unifilt.h +++ b/Build/source/libs/icu/icu-src/source/common/unicode/unifilt.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** @@ -30,7 +30,7 @@ U_NAMESPACE_BEGIN * defined range. * @stable ICU 3.0 */ -#define U_ETHER ((UChar)0xFFFF) +#define U_ETHER ((char16_t)0xFFFF) /** * diff --git a/Build/source/libs/icu/icu-src/source/common/unicode/unifunct.h b/Build/source/libs/icu/icu-src/source/common/unicode/unifunct.h index b40027c01de..1c507596861 100644 --- a/Build/source/libs/icu/icu-src/source/common/unicode/unifunct.h +++ b/Build/source/libs/icu/icu-src/source/common/unicode/unifunct.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** diff --git a/Build/source/libs/icu/icu-src/source/common/unicode/unimatch.h b/Build/source/libs/icu/icu-src/source/common/unicode/unimatch.h index 605f3f5e75e..ee4326f93c1 100644 --- a/Build/source/libs/icu/icu-src/source/common/unicode/unimatch.h +++ b/Build/source/libs/icu/icu-src/source/common/unicode/unimatch.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* * Copyright (C) 2001-2005, International Business Machines Corporation and others. All Rights Reserved. diff --git a/Build/source/libs/icu/icu-src/source/common/unicode/uniset.h b/Build/source/libs/icu/icu-src/source/common/unicode/uniset.h index fdd7fc39ad3..4a4ce193b64 100644 --- a/Build/source/libs/icu/icu-src/source/common/unicode/uniset.h +++ b/Build/source/libs/icu/icu-src/source/common/unicode/uniset.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* *************************************************************************** @@ -294,7 +294,7 @@ class U_COMMON_API UnicodeSet U_FINAL : public UnicodeFilter { * indicating that toPattern() must generate a pattern * representation from the inversion list. */ - UChar *pat; + char16_t *pat; UVector* strings; // maintained in sorted order UnicodeSetStringSpan *stringSpan; @@ -891,7 +891,7 @@ public: * @stable ICU 3.8 * @see USetSpanCondition */ - int32_t span(const UChar *s, int32_t length, USetSpanCondition spanCondition) const; + int32_t span(const char16_t *s, int32_t length, USetSpanCondition spanCondition) const; /** * Returns the end of the substring of the input string according to the USetSpanCondition. @@ -924,7 +924,7 @@ public: * @stable ICU 3.8 * @see USetSpanCondition */ - int32_t spanBack(const UChar *s, int32_t length, USetSpanCondition spanCondition) const; + int32_t spanBack(const char16_t *s, int32_t length, USetSpanCondition spanCondition) const; /** * Returns the start of the substring of the input string according to the USetSpanCondition. diff --git a/Build/source/libs/icu/icu-src/source/common/unicode/unistr.h b/Build/source/libs/icu/icu-src/source/common/unicode/unistr.h index 6f62244a1e2..b99a686126c 100644 --- a/Build/source/libs/icu/icu-src/source/common/unicode/unistr.h +++ b/Build/source/libs/icu/icu-src/source/common/unicode/unistr.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** @@ -28,25 +28,16 @@ * \brief C++ API: Unicode String */ +#include #include "unicode/utypes.h" +#include "unicode/char16ptr.h" #include "unicode/rep.h" #include "unicode/std_string.h" #include "unicode/stringpiece.h" #include "unicode/bytestream.h" -#include "unicode/ucasemap.h" struct UConverter; // unicode/ucnv.h -#ifndef U_COMPARE_CODE_POINT_ORDER -/* see also ustring.h and unorm.h */ -/** - * Option bit for u_strCaseCompare, u_strcasecmp, unorm_compare, etc: - * Compare strings in code point order instead of code unit order. - * @stable ICU 2.2 - */ -#define U_COMPARE_CODE_POINT_ORDER 0x8000 -#endif - #ifndef USTRING_H /** * \ingroup ustring_ustrlen @@ -55,30 +46,34 @@ U_STABLE int32_t U_EXPORT2 u_strlen(const UChar *s); #endif -/** - * \def U_STRING_CASE_MAPPER_DEFINED - * @internal - */ -#ifndef U_STRING_CASE_MAPPER_DEFINED -#define U_STRING_CASE_MAPPER_DEFINED +U_NAMESPACE_BEGIN + +#if !UCONFIG_NO_BREAK_ITERATION +class BreakIterator; // unicode/brkiter.h +#endif +class Edits; + +U_NAMESPACE_END +// Not #ifndef U_HIDE_INTERNAL_API because UnicodeString needs the UStringCaseMapper. /** * Internal string case mapping function type. + * All error checking must be done. + * src and dest must not overlap. * @internal */ typedef int32_t U_CALLCONV -UStringCaseMapper(const UCaseMap *csm, - UChar *dest, int32_t destCapacity, - const UChar *src, int32_t srcLength, - UErrorCode *pErrorCode); - +UStringCaseMapper(int32_t caseLocale, uint32_t options, +#if !UCONFIG_NO_BREAK_ITERATION + icu::BreakIterator *iter, #endif + char16_t *dest, int32_t destCapacity, + const char16_t *src, int32_t srcLength, + icu::Edits *edits, + UErrorCode &errorCode); U_NAMESPACE_BEGIN -#if !UCONFIG_NO_BREAK_ITERATION -class BreakIterator; // unicode/brkiter.h -#endif class Locale; // unicode/locid.h class StringCharacterIterator; class UnicodeStringAppendable; // unicode/appendable.h @@ -99,10 +94,12 @@ class UnicodeStringAppendable; // unicode/appendable.h /** * Unicode String literals in C++. - * Dependent on the platform properties, different UnicodeString - * constructors should be used to create a UnicodeString object from - * a string literal. - * The macros are defined for maximum performance. + * + * Note: these macros are not recommended for new code. + * Prior to the availability of C++11 and u"unicode string literals", + * these macros were provided for portability and efficiency when + * initializing UnicodeStrings from literals. + * * They work only for strings that contain "invariant characters", i.e., * only latin letters, digits, and some punctuation. * See utypes.h for details. @@ -110,18 +107,12 @@ class UnicodeStringAppendable; // unicode/appendable.h * The string parameter must be a C string literal. * The length of the string, not including the terminating * NUL, must be specified as a constant. - * The U_STRING_DECL macro should be invoked exactly once for one - * such string variable before it is used. * @stable ICU 2.0 */ -#if defined(U_DECLARE_UTF16) -# define UNICODE_STRING(cs, _length) icu::UnicodeString(TRUE, (const UChar *)U_DECLARE_UTF16(cs), _length) -#elif U_SIZEOF_WCHAR_T==U_SIZEOF_UCHAR && (U_CHARSET_FAMILY==U_ASCII_FAMILY || (U_SIZEOF_UCHAR == 2 && defined(U_WCHAR_IS_UTF16))) -# define UNICODE_STRING(cs, _length) icu::UnicodeString(TRUE, (const UChar *)L ## cs, _length) -#elif U_SIZEOF_UCHAR==1 && U_CHARSET_FAMILY==U_ASCII_FAMILY -# define UNICODE_STRING(cs, _length) icu::UnicodeString(TRUE, (const UChar *)cs, _length) +#if !U_CHAR16_IS_TYPEDEF +# define UNICODE_STRING(cs, _length) icu::UnicodeString(TRUE, u ## cs, _length) #else -# define UNICODE_STRING(cs, _length) icu::UnicodeString(cs, _length, US_INV) +# define UNICODE_STRING(cs, _length) icu::UnicodeString(TRUE, (const char16_t*)u ## cs, _length) #endif /** @@ -142,7 +133,7 @@ class UnicodeStringAppendable; // unicode/appendable.h /** * \def UNISTR_FROM_CHAR_EXPLICIT * This can be defined to be empty or "explicit". - * If explicit, then the UnicodeString(UChar) and UnicodeString(UChar32) + * If explicit, then the UnicodeString(char16_t) and UnicodeString(UChar32) * constructors are marked as explicit, preventing their inadvertent use. * @stable ICU 49 */ @@ -159,7 +150,7 @@ class UnicodeStringAppendable; // unicode/appendable.h /** * \def UNISTR_FROM_STRING_EXPLICIT * This can be defined to be empty or "explicit". - * If explicit, then the UnicodeString(const char *) and UnicodeString(const UChar *) + * If explicit, then the UnicodeString(const char *) and UnicodeString(const char16_t *) * constructors are marked as explicit, preventing their inadvertent use. * * In particular, this helps prevent accidentally depending on ICU conversion code @@ -193,18 +184,18 @@ class UnicodeStringAppendable; // unicode/appendable.h * to 4 * sizeof(pointer) (or 3 * sizeof(pointer) for P128 data models), * to hold the fields for heap-allocated strings. * Such a minimum size also ensures that the object is easily large enough - * to hold at least 2 UChars, for one supplementary code point (U16_MAX_LENGTH). + * to hold at least 2 char16_ts, for one supplementary code point (U16_MAX_LENGTH). * * sizeof(UnicodeString) >= 48 should work for all known platforms. * * For example, on a 64-bit machine where sizeof(vtable pointer) is 8, * sizeof(UnicodeString) = 64 would leave space for * (64 - sizeof(vtable pointer) - 2) / U_SIZEOF_UCHAR = (64 - 8 - 2) / 2 = 27 - * UChars stored inside the object. + * char16_ts stored inside the object. * * The minimum object size on a 64-bit machine would be * 4 * sizeof(pointer) = 4 * 8 = 32 bytes, - * and the internal buffer would hold up to 11 UChars in that case. + * and the internal buffer would hold up to 11 char16_ts in that case. * * @see U16_MAX_LENGTH * @stable ICU 56 @@ -236,7 +227,7 @@ class UnicodeStringAppendable; // unicode/appendable.h *

      In ICU, a Unicode string consists of 16-bit Unicode code units. * A Unicode character may be stored with either one code unit * (the most common case) or with a matched pair of special code units - * ("surrogates"). The data type for code units is UChar. + * ("surrogates"). The data type for code units is char16_t. * For single-character handling, a Unicode character code point is a value * in the range 0..0x10ffff. ICU uses the UChar32 type for code points.

      * @@ -252,7 +243,7 @@ class UnicodeStringAppendable; // unicode/appendable.h * than other ICU APIs. In particular: * - If indexes are out of bounds for a UnicodeString object * (<0 or >length()) then they are "pinned" to the nearest boundary. - * - If primitive string pointer values (e.g., const UChar * or char *) + * - If primitive string pointer values (e.g., const char16_t * or char *) * for input strings are NULL, then those input string parameters are treated * as if they pointed to an empty string. * However, this is not the case for char * parameters for charset names @@ -439,7 +430,7 @@ public: * in srcChars. * @stable ICU 2.0 */ - inline int8_t compare(const UChar *srcChars, + inline int8_t compare(ConstChar16Ptr srcChars, int32_t srcLength) const; /** @@ -458,7 +449,7 @@ public: */ inline int8_t compare(int32_t start, int32_t length, - const UChar *srcChars) const; + const char16_t *srcChars) const; /** * Compare the characters bitwise in the range @@ -479,7 +470,7 @@ public: */ inline int8_t compare(int32_t start, int32_t length, - const UChar *srcChars, + const char16_t *srcChars, int32_t srcStart, int32_t srcLength) const; @@ -593,7 +584,7 @@ public: * in code point order * @stable ICU 2.0 */ - inline int8_t compareCodePointOrder(const UChar *srcChars, + inline int8_t compareCodePointOrder(ConstChar16Ptr srcChars, int32_t srcLength) const; /** @@ -617,7 +608,7 @@ public: */ inline int8_t compareCodePointOrder(int32_t start, int32_t length, - const UChar *srcChars) const; + const char16_t *srcChars) const; /** * Compare two Unicode strings in code point order. @@ -642,7 +633,7 @@ public: */ inline int8_t compareCodePointOrder(int32_t start, int32_t length, - const UChar *srcChars, + const char16_t *srcChars, int32_t srcStart, int32_t srcLength) const; @@ -766,7 +757,7 @@ public: * @return A negative, zero, or positive integer indicating the comparison result. * @stable ICU 2.0 */ - inline int8_t caseCompare(const UChar *srcChars, + inline int8_t caseCompare(ConstChar16Ptr srcChars, int32_t srcLength, uint32_t options) const; @@ -792,7 +783,7 @@ public: */ inline int8_t caseCompare(int32_t start, int32_t length, - const UChar *srcChars, + const char16_t *srcChars, uint32_t options) const; /** @@ -819,7 +810,7 @@ public: */ inline int8_t caseCompare(int32_t start, int32_t length, - const UChar *srcChars, + const char16_t *srcChars, int32_t srcStart, int32_t srcLength, uint32_t options) const; @@ -884,7 +875,7 @@ public: * FALSE otherwise * @stable ICU 2.0 */ - inline UBool startsWith(const UChar *srcChars, + inline UBool startsWith(ConstChar16Ptr srcChars, int32_t srcLength) const; /** @@ -896,7 +887,7 @@ public: * @return TRUE if this ends with the characters in srcChars, FALSE otherwise * @stable ICU 2.0 */ - inline UBool startsWith(const UChar *srcChars, + inline UBool startsWith(const char16_t *srcChars, int32_t srcStart, int32_t srcLength) const; @@ -931,7 +922,7 @@ public: * FALSE otherwise * @stable ICU 2.0 */ - inline UBool endsWith(const UChar *srcChars, + inline UBool endsWith(ConstChar16Ptr srcChars, int32_t srcLength) const; /** @@ -944,7 +935,7 @@ public: * FALSE otherwise * @stable ICU 2.0 */ - inline UBool endsWith(const UChar *srcChars, + inline UBool endsWith(const char16_t *srcChars, int32_t srcStart, int32_t srcLength) const; @@ -1021,7 +1012,7 @@ public: * or -1 if not found. * @stable ICU 2.0 */ - inline int32_t indexOf(const UChar *srcChars, + inline int32_t indexOf(const char16_t *srcChars, int32_t srcLength, int32_t start) const; @@ -1037,7 +1028,7 @@ public: * or -1 if not found. * @stable ICU 2.0 */ - inline int32_t indexOf(const UChar *srcChars, + inline int32_t indexOf(ConstChar16Ptr srcChars, int32_t srcLength, int32_t start, int32_t length) const; @@ -1058,7 +1049,7 @@ public: * or -1 if not found. * @stable ICU 2.0 */ - int32_t indexOf(const UChar *srcChars, + int32_t indexOf(const char16_t *srcChars, int32_t srcStart, int32_t srcLength, int32_t start, @@ -1071,7 +1062,7 @@ public: * @return The offset into this of c, or -1 if not found. * @stable ICU 2.0 */ - inline int32_t indexOf(UChar c) const; + inline int32_t indexOf(char16_t c) const; /** * Locate in this the first occurrence of the code point c, @@ -1091,7 +1082,7 @@ public: * @return The offset into this of c, or -1 if not found. * @stable ICU 2.0 */ - inline int32_t indexOf(UChar c, + inline int32_t indexOf(char16_t c, int32_t start) const; /** @@ -1116,7 +1107,7 @@ public: * @return The offset into this of c, or -1 if not found. * @stable ICU 2.0 */ - inline int32_t indexOf(UChar c, + inline int32_t indexOf(char16_t c, int32_t start, int32_t length) const; @@ -1204,7 +1195,7 @@ public: * or -1 if not found. * @stable ICU 2.0 */ - inline int32_t lastIndexOf(const UChar *srcChars, + inline int32_t lastIndexOf(const char16_t *srcChars, int32_t srcLength, int32_t start) const; @@ -1220,7 +1211,7 @@ public: * or -1 if not found. * @stable ICU 2.0 */ - inline int32_t lastIndexOf(const UChar *srcChars, + inline int32_t lastIndexOf(ConstChar16Ptr srcChars, int32_t srcLength, int32_t start, int32_t length) const; @@ -1241,7 +1232,7 @@ public: * or -1 if not found. * @stable ICU 2.0 */ - int32_t lastIndexOf(const UChar *srcChars, + int32_t lastIndexOf(const char16_t *srcChars, int32_t srcStart, int32_t srcLength, int32_t start, @@ -1254,7 +1245,7 @@ public: * @return The offset into this of c, or -1 if not found. * @stable ICU 2.0 */ - inline int32_t lastIndexOf(UChar c) const; + inline int32_t lastIndexOf(char16_t c) const; /** * Locate in this the last occurrence of the code point c, @@ -1274,7 +1265,7 @@ public: * @return The offset into this of c, or -1 if not found. * @stable ICU 2.0 */ - inline int32_t lastIndexOf(UChar c, + inline int32_t lastIndexOf(char16_t c, int32_t start) const; /** @@ -1299,7 +1290,7 @@ public: * @return The offset into this of c, or -1 if not found. * @stable ICU 2.0 */ - inline int32_t lastIndexOf(UChar c, + inline int32_t lastIndexOf(char16_t c, int32_t start, int32_t length) const; @@ -1329,7 +1320,7 @@ public: * or 0xffff if the offset is not valid for this string * @stable ICU 2.0 */ - inline UChar charAt(int32_t offset) const; + inline char16_t charAt(int32_t offset) const; /** * Return the code unit at offset offset. @@ -1338,7 +1329,7 @@ public: * @return the code unit at offset offset * @stable ICU 2.0 */ - inline UChar operator[] (int32_t offset) const; + inline char16_t operator[] (int32_t offset) const; /** * Return the code point that contains the code unit @@ -1459,7 +1450,7 @@ public: */ inline void extract(int32_t start, int32_t length, - UChar *dst, + Char16Ptr dst, int32_t dstStart = 0) const; /** @@ -1478,13 +1469,13 @@ public: * then extract() will not copy the contents. * * @param dest Destination string buffer. - * @param destCapacity Number of UChars available at dest. + * @param destCapacity Number of char16_ts available at dest. * @param errorCode ICU error code. * @return length() * @stable ICU 2.0 */ int32_t - extract(UChar *dest, int32_t destCapacity, + extract(Char16Ptr dest, int32_t destCapacity, UErrorCode &errorCode) const; /** @@ -1514,7 +1505,7 @@ public: */ inline void extractBetween(int32_t start, int32_t limit, - UChar *dst, + char16_t *dst, int32_t dstStart = 0) const; /** @@ -1715,8 +1706,6 @@ public: */ void toUTF8(ByteSink &sink) const; -#if U_HAVE_STD_STRING - /** * Convert the UnicodeString to UTF-8 and append the result * to a standard string. @@ -1731,13 +1720,11 @@ public: */ template StringClass &toUTF8String(StringClass &result) const { - StringByteSink sbs(&result); + StringByteSink sbs(&result, length()); toUTF8(sbs); return result; } -#endif - /** * Convert the UnicodeString to UTF-32. * Unpaired surrogates are replaced with U+FFFD. @@ -1759,7 +1746,7 @@ public: /** * Return the length of the UnicodeString object. - * The length is the number of UChar code units are in the UnicodeString. + * The length is the number of char16_t code units are in the UnicodeString. * If you want the number of code points, please use countChar32(). * @return the length of the UnicodeString object * @see countChar32 @@ -1768,14 +1755,14 @@ public: inline int32_t length(void) const; /** - * Count Unicode code points in the length UChar code units of the string. - * A code point may occupy either one or two UChar code units. + * Count Unicode code points in the length char16_t code units of the string. + * A code point may occupy either one or two char16_t code units. * Counting code points involves reading all code units. * * This functions is basically the inverse of moveIndex32(). * * @param start the index of the first code unit to check - * @param length the number of UChar code units to check + * @param length the number of char16_t code units to check * @return the number of code points in the specified code units * @see length * @stable ICU 2.0 @@ -1784,7 +1771,7 @@ public: countChar32(int32_t start=0, int32_t length=INT32_MAX) const; /** - * Check if the length UChar code units of the string + * Check if the length char16_t code units of the string * contain more Unicode code points than a certain number. * This is more efficient than counting all code points in this part of the string * and comparing that number with a threshold. @@ -1792,10 +1779,10 @@ public: * falls within a certain range, and * never needs to count more than 'number+1' code points. * Logically equivalent to (countChar32(start, length)>number). - * A Unicode code point may occupy either one or two UChar code units. + * A Unicode code point may occupy either one or two char16_t code units. * * @param start the index of the first code unit to check (0 for the entire string) - * @param length the number of UChar code units to check + * @param length the number of char16_t code units to check * (use INT32_MAX for the entire string; remember that start/length * values are pinned) * @param number The number of code points in the (sub)string is compared against @@ -1821,7 +1808,7 @@ public: * This is useful together with the getBuffer functions. * See there for details. * - * @return the number of UChars available in the internal buffer + * @return the number of char16_ts available in the internal buffer * @see getBuffer * @stable ICU 2.0 */ @@ -1904,7 +1891,6 @@ public: */ UnicodeString &fastCopyFrom(const UnicodeString &src); -#if U_HAVE_RVALUE_REFERENCES /** * Move assignment operator, might leave src in bogus state. * This string will have the same contents and state that the source string had. @@ -1916,7 +1902,7 @@ public: UnicodeString &operator=(UnicodeString &&src) U_NOEXCEPT { return moveFrom(src); } -#endif + // do not use #ifndef U_HIDE_DRAFT_API for moveFrom, needed by non-draft API /** * Move assignment, might leave src in bogus state. @@ -1955,7 +1941,7 @@ public: * @return a reference to this * @stable ICU 2.0 */ - inline UnicodeString& operator= (UChar ch); + inline UnicodeString& operator= (char16_t ch); /** * Assignment operator. Replace the characters in this UnicodeString @@ -2015,7 +2001,7 @@ public: * @return a reference to this * @stable ICU 2.0 */ - inline UnicodeString& setTo(const UChar *srcChars, + inline UnicodeString& setTo(const char16_t *srcChars, int32_t srcLength); /** @@ -2026,7 +2012,7 @@ public: * @return a reference to this * @stable ICU 2.0 */ - UnicodeString& setTo(UChar srcChar); + UnicodeString& setTo(char16_t srcChar); /** * Set the characters in the UnicodeString object to the code point @@ -2039,7 +2025,7 @@ public: UnicodeString& setTo(UChar32 srcChar); /** - * Aliasing setTo() function, analogous to the readonly-aliasing UChar* constructor. + * Aliasing setTo() function, analogous to the readonly-aliasing char16_t* constructor. * The text will be used for the UnicodeString object, but * it will not be released when the UnicodeString is destroyed. * This has copy-on-write semantics: @@ -2062,11 +2048,11 @@ public: * @stable ICU 2.0 */ UnicodeString &setTo(UBool isTerminated, - const UChar *text, + ConstChar16Ptr text, int32_t textLength); /** - * Aliasing setTo() function, analogous to the writable-aliasing UChar* constructor. + * Aliasing setTo() function, analogous to the writable-aliasing char16_t* constructor. * The text will be used for the UnicodeString object, but * it will not be released when the UnicodeString is destroyed. * This has write-through semantics: @@ -2075,16 +2061,16 @@ public: * a new buffer will be allocated and the contents copied as with regularly * constructed strings. * In an assignment to another UnicodeString, the buffer will be copied. - * The extract(UChar *dst) function detects whether the dst pointer is the same + * The extract(Char16Ptr dst) function detects whether the dst pointer is the same * as the string buffer itself and will in this case not copy the contents. * * @param buffer The characters to alias for the UnicodeString. * @param buffLength The number of Unicode characters in buffer to alias. - * @param buffCapacity The size of buffer in UChars. + * @param buffCapacity The size of buffer in char16_ts. * @return a reference to this * @stable ICU 2.0 */ - UnicodeString &setTo(UChar *buffer, + UnicodeString &setTo(char16_t *buffer, int32_t buffLength, int32_t buffCapacity); @@ -2120,7 +2106,7 @@ public: * s.truncate(0); // set to an empty string (complete truncation), or * s=UnicodeString(); // assign an empty string, or * s.setTo((UChar32)-1); // set to a pseudo code point that is out of range, or - * static const UChar nul=0; + * static const char16_t nul=0; * s.setTo(&nul, 0); // set to an empty C Unicode string * } * \endcode @@ -2138,7 +2124,7 @@ public: * @stable ICU 2.0 */ UnicodeString& setCharAt(int32_t offset, - UChar ch); + char16_t ch); /* Append operations */ @@ -2150,7 +2136,7 @@ public: * @return a reference to this * @stable ICU 2.0 */ - inline UnicodeString& operator+= (UChar ch); + inline UnicodeString& operator+= (char16_t ch); /** * Append operator. Append the code point ch to the UnicodeString @@ -2210,7 +2196,7 @@ public: * @return a reference to this * @stable ICU 2.0 */ - inline UnicodeString& append(const UChar *srcChars, + inline UnicodeString& append(const char16_t *srcChars, int32_t srcStart, int32_t srcLength); @@ -2223,7 +2209,7 @@ public: * @return a reference to this * @stable ICU 2.0 */ - inline UnicodeString& append(const UChar *srcChars, + inline UnicodeString& append(ConstChar16Ptr srcChars, int32_t srcLength); /** @@ -2232,7 +2218,7 @@ public: * @return a reference to this * @stable ICU 2.0 */ - inline UnicodeString& append(UChar srcChar); + inline UnicodeString& append(char16_t srcChar); /** * Append the code point srcChar to the UnicodeString object. @@ -2288,7 +2274,7 @@ public: * @stable ICU 2.0 */ inline UnicodeString& insert(int32_t start, - const UChar *srcChars, + const char16_t *srcChars, int32_t srcStart, int32_t srcLength); @@ -2302,7 +2288,7 @@ public: * @stable ICU 2.0 */ inline UnicodeString& insert(int32_t start, - const UChar *srcChars, + ConstChar16Ptr srcChars, int32_t srcLength); /** @@ -2314,7 +2300,7 @@ public: * @stable ICU 2.0 */ inline UnicodeString& insert(int32_t start, - UChar srcChar); + char16_t srcChar); /** * Insert the code point srcChar into the UnicodeString object at @@ -2388,7 +2374,7 @@ public: */ UnicodeString& replace(int32_t start, int32_t length, - const UChar *srcChars, + const char16_t *srcChars, int32_t srcStart, int32_t srcLength); @@ -2406,7 +2392,7 @@ public: */ inline UnicodeString& replace(int32_t start, int32_t length, - const UChar *srcChars, + ConstChar16Ptr srcChars, int32_t srcLength); /** @@ -2422,7 +2408,7 @@ public: */ inline UnicodeString& replace(int32_t start, int32_t length, - UChar srcChar); + char16_t srcChar); /** * Replace the characters in the range @@ -2620,7 +2606,7 @@ public: * @stable ICU 2.0 */ UBool padLeading(int32_t targetLength, - UChar padChar = 0x0020); + char16_t padChar = 0x0020); /** * Pad the end of this UnicodeString with the character padChar. @@ -2634,7 +2620,7 @@ public: * @stable ICU 2.0 */ UBool padTrailing(int32_t targetLength, - UChar padChar = 0x0020); + char16_t padChar = 0x0020); /** * Truncate this UnicodeString to the targetLength. @@ -2789,11 +2775,11 @@ public: * break iterator is opened. * Otherwise the provided iterator is set to the string's text. * @param locale The locale to consider. + * @param options Options bit set, usually 0. See U_TITLECASE_NO_LOWERCASE, + * U_TITLECASE_NO_BREAK_ADJUSTMENT, U_TITLECASE_ADJUST_TO_CASED, + * U_TITLECASE_WHOLE_STRING, U_TITLECASE_SENTENCES. * @param options Options bit set, see ucasemap_open(). * @return A reference to this. - * @see U_TITLECASE_NO_LOWERCASE - * @see U_TITLECASE_NO_BREAK_ADJUSTMENT - * @see ucasemap_open * @stable ICU 3.8 */ UnicodeString &toTitle(BreakIterator *titleIter, const Locale &locale, uint32_t options); @@ -2821,7 +2807,7 @@ public: /** * Get a read/write pointer to the internal buffer. - * The buffer is guaranteed to be large enough for at least minCapacity UChars, + * The buffer is guaranteed to be large enough for at least minCapacity char16_ts, * writable, and is still owned by the UnicodeString object. * Calls to getBuffer(minCapacity) must not be nested, and * must be matched with calls to releaseBuffer(newLength). @@ -2852,17 +2838,17 @@ public: * - You must call releaseBuffer(newLength) before and in order to * return to normal UnicodeString operation. * - * @param minCapacity the minimum number of UChars that are to be available + * @param minCapacity the minimum number of char16_ts that are to be available * in the buffer, starting at the returned pointer; * default to the current string capacity if minCapacity==-1 * @return a writable pointer to the internal string buffer, - * or 0 if an error occurs (nested calls, out of memory) + * or nullptr if an error occurs (nested calls, out of memory) * * @see releaseBuffer * @see getTerminatedBuffer() * @stable ICU 2.0 */ - UChar *getBuffer(int32_t minCapacity); + char16_t *getBuffer(int32_t minCapacity); /** * Release a read/write buffer on a UnicodeString object with an @@ -2910,13 +2896,13 @@ public: * be modified. * * @return a read-only pointer to the internal string buffer, - * or 0 if the string is empty or bogus + * or nullptr if the string is empty or bogus * * @see getBuffer(int32_t minCapacity) * @see getTerminatedBuffer() * @stable ICU 2.0 */ - inline const UChar *getBuffer() const; + inline const char16_t *getBuffer() const; /** * Get a read-only pointer to the internal buffer, @@ -2951,7 +2937,7 @@ public: * @see getBuffer() * @stable ICU 2.2 */ - const UChar *getTerminatedBuffer(); + const char16_t *getTerminatedBuffer(); //======================================== // Constructors @@ -2963,8 +2949,8 @@ public: inline UnicodeString(); /** - * Construct a UnicodeString with capacity to hold capacity UChars - * @param capacity the number of UChars this UnicodeString should hold + * Construct a UnicodeString with capacity to hold capacity char16_ts + * @param capacity the number of char16_ts this UnicodeString should hold * before a resize is necessary; if count is greater than 0 and count * code points c take up more space than capacity, then capacity is adjusted * accordingly. @@ -2976,7 +2962,7 @@ public: UnicodeString(int32_t capacity, UChar32 c, int32_t count); /** - * Single UChar (code unit) constructor. + * Single char16_t (code unit) constructor. * * It is recommended to mark this constructor "explicit" by * -DUNISTR_FROM_CHAR_EXPLICIT=explicit @@ -2984,7 +2970,7 @@ public: * @param ch the character to place in the UnicodeString * @stable ICU 2.0 */ - UNISTR_FROM_CHAR_EXPLICIT UnicodeString(UChar ch); + UNISTR_FROM_CHAR_EXPLICIT UnicodeString(char16_t ch); /** * Single UChar32 (code point) constructor. @@ -2998,7 +2984,7 @@ public: UNISTR_FROM_CHAR_EXPLICIT UnicodeString(UChar32 ch); /** - * UChar* constructor. + * char16_t* constructor. * * It is recommended to mark this constructor "explicit" by * -DUNISTR_FROM_STRING_EXPLICIT=explicit @@ -3007,20 +2993,121 @@ public: * must be NULL (U+0000) terminated. * @stable ICU 2.0 */ - UNISTR_FROM_STRING_EXPLICIT UnicodeString(const UChar *text); + UNISTR_FROM_STRING_EXPLICIT UnicodeString(const char16_t *text); + + /* + * Do not use #ifndef U_HIDE_DRAFT_API for the following constructor, + * it should always be available regardless of U_HIDE_DRAFT_API status + */ +#if !U_CHAR16_IS_TYPEDEF + /** + * uint16_t * constructor. + * Delegates to UnicodeString(const char16_t *). + * + * It is recommended to mark this constructor "explicit" by + * -DUNISTR_FROM_STRING_EXPLICIT=explicit + * on the compiler command line or similar. + * @param text NUL-terminated UTF-16 string + * @draft ICU 59 + */ + UNISTR_FROM_STRING_EXPLICIT UnicodeString(const uint16_t *text) : + UnicodeString(ConstChar16Ptr(text)) {} +#endif + + /* + * Do not use #ifndef U_HIDE_DRAFT_API for the following constructor, + * it should always be available regardless of U_HIDE_DRAFT_API status + */ +#if U_SIZEOF_WCHAR_T==2 || defined(U_IN_DOXYGEN) + /** + * wchar_t * constructor. + * (Only defined if U_SIZEOF_WCHAR_T==2.) + * Delegates to UnicodeString(const char16_t *). + * + * It is recommended to mark this constructor "explicit" by + * -DUNISTR_FROM_STRING_EXPLICIT=explicit + * on the compiler command line or similar. + * @param text NUL-terminated UTF-16 string + * @draft ICU 59 + */ + UNISTR_FROM_STRING_EXPLICIT UnicodeString(const wchar_t *text) : + UnicodeString(ConstChar16Ptr(text)) {} +#endif + /* + * Do not use #ifndef U_HIDE_DRAFT_API for the following constructor, + * it should always be available regardless of U_HIDE_DRAFT_API status + */ /** - * UChar* constructor. + * nullptr_t constructor. + * Effectively the same as the default constructor, makes an empty string object. + * + * It is recommended to mark this constructor "explicit" by + * -DUNISTR_FROM_STRING_EXPLICIT=explicit + * on the compiler command line or similar. + * @param text nullptr + * @draft ICU 59 + */ + UNISTR_FROM_STRING_EXPLICIT inline UnicodeString(const std::nullptr_t text); + + /** + * char16_t* constructor. * @param text The characters to place in the UnicodeString. * @param textLength The number of Unicode characters in text * to copy. * @stable ICU 2.0 */ - UnicodeString(const UChar *text, + UnicodeString(const char16_t *text, int32_t textLength); + /* + * Do not use #ifndef U_HIDE_DRAFT_API for the following constructor, + * it should always be available regardless of U_HIDE_DRAFT_API status + */ +#if !U_CHAR16_IS_TYPEDEF + /** + * uint16_t * constructor. + * Delegates to UnicodeString(const char16_t *, int32_t). + * @param text UTF-16 string + * @param length string length + * @draft ICU 59 + */ + UnicodeString(const uint16_t *text, int32_t length) : + UnicodeString(ConstChar16Ptr(text), length) {} +#endif + + /* + * Do not use #ifndef U_HIDE_DRAFT_API for the following constructor, + * it should always be available regardless of U_HIDE_DRAFT_API status + */ +#if U_SIZEOF_WCHAR_T==2 || defined(U_IN_DOXYGEN) + /** + * wchar_t * constructor. + * (Only defined if U_SIZEOF_WCHAR_T==2.) + * Delegates to UnicodeString(const char16_t *, int32_t). + * @param text NUL-terminated UTF-16 string + * @param length string length + * @draft ICU 59 + */ + UnicodeString(const wchar_t *text, int32_t length) : + UnicodeString(ConstChar16Ptr(text), length) {} +#endif + + /* + * Do not use #ifndef U_HIDE_DRAFT_API for the following constructor, + * it should always be available regardless of U_HIDE_DRAFT_API status + */ /** - * Readonly-aliasing UChar* constructor. + * nullptr_t constructor. + * Effectively the same as the default constructor, makes an empty string object. + * @param text nullptr + * @param length ignored + * @draft ICU 59 + */ + inline UnicodeString(const std::nullptr_t text, int32_t length); + + /** + * Readonly-aliasing char16_t* constructor. * The text will be used for the UnicodeString object, but * it will not be released when the UnicodeString is destroyed. * This has copy-on-write semantics: @@ -3042,11 +3129,11 @@ public: * @stable ICU 2.0 */ UnicodeString(UBool isTerminated, - const UChar *text, + ConstChar16Ptr text, int32_t textLength); /** - * Writable-aliasing UChar* constructor. + * Writable-aliasing char16_t* constructor. * The text will be used for the UnicodeString object, but * it will not be released when the UnicodeString is destroyed. * This has write-through semantics: @@ -3055,15 +3142,64 @@ public: * a new buffer will be allocated and the contents copied as with regularly * constructed strings. * In an assignment to another UnicodeString, the buffer will be copied. - * The extract(UChar *dst) function detects whether the dst pointer is the same + * The extract(Char16Ptr dst) function detects whether the dst pointer is the same * as the string buffer itself and will in this case not copy the contents. * * @param buffer The characters to alias for the UnicodeString. * @param buffLength The number of Unicode characters in buffer to alias. - * @param buffCapacity The size of buffer in UChars. + * @param buffCapacity The size of buffer in char16_ts. * @stable ICU 2.0 */ - UnicodeString(UChar *buffer, int32_t buffLength, int32_t buffCapacity); + UnicodeString(char16_t *buffer, int32_t buffLength, int32_t buffCapacity); + + /* + * Do not use #ifndef U_HIDE_DRAFT_API for the following constructor, + * it should always be available regardless of U_HIDE_DRAFT_API status + */ +#if !U_CHAR16_IS_TYPEDEF + /** + * Writable-aliasing uint16_t * constructor. + * Delegates to UnicodeString(const char16_t *, int32_t, int32_t). + * @param buffer writable buffer of/for UTF-16 text + * @param buffLength length of the current buffer contents + * @param buffCapacity buffer capacity + * @draft ICU 59 + */ + UnicodeString(uint16_t *buffer, int32_t buffLength, int32_t buffCapacity) : + UnicodeString(Char16Ptr(buffer), buffLength, buffCapacity) {} +#endif + + /* + * Do not use #ifndef U_HIDE_DRAFT_API for the following constructor, + * it should always be available regardless of U_HIDE_DRAFT_API status + */ +#if U_SIZEOF_WCHAR_T==2 || defined(U_IN_DOXYGEN) + /** + * Writable-aliasing wchar_t * constructor. + * (Only defined if U_SIZEOF_WCHAR_T==2.) + * Delegates to UnicodeString(const char16_t *, int32_t, int32_t). + * @param buffer writable buffer of/for UTF-16 text + * @param buffLength length of the current buffer contents + * @param buffCapacity buffer capacity + * @draft ICU 59 + */ + UnicodeString(wchar_t *buffer, int32_t buffLength, int32_t buffCapacity) : + UnicodeString(Char16Ptr(buffer), buffLength, buffCapacity) {} +#endif + + /* + * Do not use #ifndef U_HIDE_DRAFT_API for the following constructor, + * it should always be available regardless of U_HIDE_DRAFT_API status + */ + /** + * Writable-aliasing nullptr_t constructor. + * Effectively the same as the default constructor, makes an empty string object. + * @param buffer nullptr + * @param buffLength ignored + * @param buffCapacity ignored + * @draft ICU 59 + */ + inline UnicodeString(std::nullptr_t buffer, int32_t buffLength, int32_t buffCapacity); #if U_CHARSET_IS_UTF8 || !UCONFIG_NO_CONVERSION @@ -3213,7 +3349,6 @@ public: */ UnicodeString(const UnicodeString& that); -#if U_HAVE_RVALUE_REFERENCES /** * Move constructor, might leave src in bogus state. * This string will have the same contents and state that the source string had. @@ -3221,7 +3356,6 @@ public: * @stable ICU 56 */ UnicodeString(UnicodeString &&src) U_NOEXCEPT; -#endif /** * 'Substring' constructor from tail of source string. @@ -3380,7 +3514,7 @@ protected: * UnicodeString::charAt() to be inline again (see jitterbug 709). * @stable ICU 2.4 */ - virtual UChar getCharAt(int32_t offset) const; + virtual char16_t getCharAt(int32_t offset) const; /** * The change in Replaceable to use virtual getChar32At() allows @@ -3416,7 +3550,7 @@ private: int8_t doCompare(int32_t start, int32_t length, - const UChar *srcChars, + const char16_t *srcChars, int32_t srcStart, int32_t srcLength) const; @@ -3429,7 +3563,7 @@ private: int8_t doCompareCodePointOrder(int32_t start, int32_t length, - const UChar *srcChars, + const char16_t *srcChars, int32_t srcStart, int32_t srcLength) const; @@ -3444,12 +3578,12 @@ private: int8_t doCaseCompare(int32_t start, int32_t length, - const UChar *srcChars, + const char16_t *srcChars, int32_t srcStart, int32_t srcLength, uint32_t options) const; - int32_t doIndexOf(UChar c, + int32_t doIndexOf(char16_t c, int32_t start, int32_t length) const; @@ -3457,7 +3591,7 @@ private: int32_t start, int32_t length) const; - int32_t doLastIndexOf(UChar c, + int32_t doLastIndexOf(char16_t c, int32_t start, int32_t length) const; @@ -3467,14 +3601,14 @@ private: void doExtract(int32_t start, int32_t length, - UChar *dst, + char16_t *dst, int32_t dstStart) const; inline void doExtract(int32_t start, int32_t length, UnicodeString& target) const; - inline UChar doCharAt(int32_t offset) const; + inline char16_t doCharAt(int32_t offset) const; UnicodeString& doReplace(int32_t start, int32_t length, @@ -3484,12 +3618,12 @@ private: UnicodeString& doReplace(int32_t start, int32_t length, - const UChar *srcChars, + const char16_t *srcChars, int32_t srcStart, int32_t srcLength); UnicodeString& doAppend(const UnicodeString& src, int32_t srcStart, int32_t srcLength); - UnicodeString& doAppend(const UChar *srcChars, int32_t srcStart, int32_t srcLength); + UnicodeString& doAppend(const char16_t *srcChars, int32_t srcStart, int32_t srcLength); UnicodeString& doReverse(int32_t start, int32_t length); @@ -3499,8 +3633,8 @@ private: // get pointer to start of array // these do not check for kOpenGetBuffer, unlike the public getBuffer() function - inline UChar* getArrayStart(void); - inline const UChar* getArrayStart(void) const; + inline char16_t* getArrayStart(void); + inline const char16_t* getArrayStart(void) const; inline UBool hasShortLength() const; inline int32_t getShortLength() const; @@ -3517,7 +3651,7 @@ private: inline void setShortLength(int32_t len); inline void setLength(int32_t len); inline void setToEmpty(); - inline void setArray(UChar *array, int32_t len, int32_t capacity); // sets length but not flags + inline void setArray(char16_t *array, int32_t len, int32_t capacity); // sets length but not flags // allocate the array; result may be the stack buffer // sets refCount to 1 if appropriate @@ -3600,7 +3734,11 @@ private: * as in ustr_imp.h for ustrcase_map(). */ UnicodeString & - caseMap(const UCaseMap *csm, UStringCaseMapper *stringCaseMapper); + caseMap(int32_t caseLocale, uint32_t options, +#if !UCONFIG_NO_BREAK_ITERATION + BreakIterator *iter, +#endif + UStringCaseMapper *stringCaseMapper); // ref counting void addRef(void); @@ -3691,15 +3829,15 @@ private: // Each struct of the union must begin with fLengthAndFlags. struct { int16_t fLengthAndFlags; // bit fields: see constants above - UChar fBuffer[US_STACKBUF_SIZE]; // buffer for short strings + char16_t fBuffer[US_STACKBUF_SIZE]; // buffer for short strings } fStackFields; struct { int16_t fLengthAndFlags; // bit fields: see constants above int32_t fLength; // number of characters in fArray if >127; else undefined - int32_t fCapacity; // capacity of fArray (in UChars) + int32_t fCapacity; // capacity of fArray (in char16_ts) // array pointer last to minimize padding for machines with P128 data model // or pointer sizes that are not a power of 2 - UChar *fArray; // the Unicode data + char16_t *fArray; // the Unicode data } fFields; } fUnion; }; @@ -3752,13 +3890,13 @@ UnicodeString::pinIndices(int32_t& start, } } -inline UChar* +inline char16_t* UnicodeString::getArrayStart() { return (fUnion.fFields.fLengthAndFlags&kUsingStackBuffer) ? fUnion.fStackFields.fBuffer : fUnion.fFields.fArray; } -inline const UChar* +inline const char16_t* UnicodeString::getArrayStart() const { return (fUnion.fFields.fLengthAndFlags&kUsingStackBuffer) ? fUnion.fStackFields.fBuffer : fUnion.fFields.fArray; @@ -3773,6 +3911,18 @@ UnicodeString::UnicodeString() { fUnion.fStackFields.fLengthAndFlags=kShortString; } +inline UnicodeString::UnicodeString(const std::nullptr_t /*text*/) { + fUnion.fStackFields.fLengthAndFlags=kShortString; +} + +inline UnicodeString::UnicodeString(const std::nullptr_t /*text*/, int32_t /*length*/) { + fUnion.fStackFields.fLengthAndFlags=kShortString; +} + +inline UnicodeString::UnicodeString(std::nullptr_t /*buffer*/, int32_t /*buffLength*/, int32_t /*buffCapacity*/) { + fUnion.fStackFields.fLengthAndFlags=kShortString; +} + //======================================== // Read-only implementation methods //======================================== @@ -3819,10 +3969,10 @@ UnicodeString::isBufferWritable() const (!(fUnion.fFields.fLengthAndFlags&kRefCounted) || refCount()==1)); } -inline const UChar * +inline const char16_t * UnicodeString::getBuffer() const { if(fUnion.fFields.fLengthAndFlags&(kIsBogus|kOpenGetBuffer)) { - return 0; + return nullptr; } else if(fUnion.fFields.fLengthAndFlags&kUsingStackBuffer) { return fUnion.fStackFields.fBuffer; } else { @@ -3890,7 +4040,7 @@ UnicodeString::compare(int32_t start, { return doCompare(start, _length, srcText, 0, srcText.length()); } inline int8_t -UnicodeString::compare(const UChar *srcChars, +UnicodeString::compare(ConstChar16Ptr srcChars, int32_t srcLength) const { return doCompare(0, length(), srcChars, 0, srcLength); } @@ -3905,13 +4055,13 @@ UnicodeString::compare(int32_t start, inline int8_t UnicodeString::compare(int32_t start, int32_t _length, - const UChar *srcChars) const + const char16_t *srcChars) const { return doCompare(start, _length, srcChars, 0, _length); } inline int8_t UnicodeString::compare(int32_t start, int32_t _length, - const UChar *srcChars, + const char16_t *srcChars, int32_t srcStart, int32_t srcLength) const { return doCompare(start, _length, srcChars, srcStart, srcLength); } @@ -3951,7 +4101,7 @@ UnicodeString::compareCodePointOrder(int32_t start, { return doCompareCodePointOrder(start, _length, srcText, 0, srcText.length()); } inline int8_t -UnicodeString::compareCodePointOrder(const UChar *srcChars, +UnicodeString::compareCodePointOrder(ConstChar16Ptr srcChars, int32_t srcLength) const { return doCompareCodePointOrder(0, length(), srcChars, 0, srcLength); } @@ -3966,13 +4116,13 @@ UnicodeString::compareCodePointOrder(int32_t start, inline int8_t UnicodeString::compareCodePointOrder(int32_t start, int32_t _length, - const UChar *srcChars) const + const char16_t *srcChars) const { return doCompareCodePointOrder(start, _length, srcChars, 0, _length); } inline int8_t UnicodeString::compareCodePointOrder(int32_t start, int32_t _length, - const UChar *srcChars, + const char16_t *srcChars, int32_t srcStart, int32_t srcLength) const { return doCompareCodePointOrder(start, _length, srcChars, srcStart, srcLength); } @@ -4016,7 +4166,7 @@ UnicodeString::caseCompare(int32_t start, } inline int8_t -UnicodeString::caseCompare(const UChar *srcChars, +UnicodeString::caseCompare(ConstChar16Ptr srcChars, int32_t srcLength, uint32_t options) const { return doCaseCompare(0, length(), srcChars, 0, srcLength, options); @@ -4035,7 +4185,7 @@ UnicodeString::caseCompare(int32_t start, inline int8_t UnicodeString::caseCompare(int32_t start, int32_t _length, - const UChar *srcChars, + const char16_t *srcChars, uint32_t options) const { return doCaseCompare(start, _length, srcChars, 0, _length, options); } @@ -4043,7 +4193,7 @@ UnicodeString::caseCompare(int32_t start, inline int8_t UnicodeString::caseCompare(int32_t start, int32_t _length, - const UChar *srcChars, + const char16_t *srcChars, int32_t srcStart, int32_t srcLength, uint32_t options) const { @@ -4094,7 +4244,7 @@ UnicodeString::indexOf(const UnicodeString& text, { return indexOf(text, 0, text.length(), start, _length); } inline int32_t -UnicodeString::indexOf(const UChar *srcChars, +UnicodeString::indexOf(const char16_t *srcChars, int32_t srcLength, int32_t start) const { pinIndex(start); @@ -4102,14 +4252,14 @@ UnicodeString::indexOf(const UChar *srcChars, } inline int32_t -UnicodeString::indexOf(const UChar *srcChars, +UnicodeString::indexOf(ConstChar16Ptr srcChars, int32_t srcLength, int32_t start, int32_t _length) const { return indexOf(srcChars, 0, srcLength, start, _length); } inline int32_t -UnicodeString::indexOf(UChar c, +UnicodeString::indexOf(char16_t c, int32_t start, int32_t _length) const { return doIndexOf(c, start, _length); } @@ -4121,7 +4271,7 @@ UnicodeString::indexOf(UChar32 c, { return doIndexOf(c, start, _length); } inline int32_t -UnicodeString::indexOf(UChar c) const +UnicodeString::indexOf(char16_t c) const { return doIndexOf(c, 0, length()); } inline int32_t @@ -4129,7 +4279,7 @@ UnicodeString::indexOf(UChar32 c) const { return indexOf(c, 0, length()); } inline int32_t -UnicodeString::indexOf(UChar c, +UnicodeString::indexOf(char16_t c, int32_t start) const { pinIndex(start); return doIndexOf(c, start, length() - start); @@ -4143,14 +4293,14 @@ UnicodeString::indexOf(UChar32 c, } inline int32_t -UnicodeString::lastIndexOf(const UChar *srcChars, +UnicodeString::lastIndexOf(ConstChar16Ptr srcChars, int32_t srcLength, int32_t start, int32_t _length) const { return lastIndexOf(srcChars, 0, srcLength, start, _length); } inline int32_t -UnicodeString::lastIndexOf(const UChar *srcChars, +UnicodeString::lastIndexOf(const char16_t *srcChars, int32_t srcLength, int32_t start) const { pinIndex(start); @@ -4191,7 +4341,7 @@ UnicodeString::lastIndexOf(const UnicodeString& text) const { return lastIndexOf(text, 0, text.length(), 0, length()); } inline int32_t -UnicodeString::lastIndexOf(UChar c, +UnicodeString::lastIndexOf(char16_t c, int32_t start, int32_t _length) const { return doLastIndexOf(c, start, _length); } @@ -4204,7 +4354,7 @@ UnicodeString::lastIndexOf(UChar32 c, } inline int32_t -UnicodeString::lastIndexOf(UChar c) const +UnicodeString::lastIndexOf(char16_t c) const { return doLastIndexOf(c, 0, length()); } inline int32_t @@ -4213,7 +4363,7 @@ UnicodeString::lastIndexOf(UChar32 c) const { } inline int32_t -UnicodeString::lastIndexOf(UChar c, +UnicodeString::lastIndexOf(char16_t c, int32_t start) const { pinIndex(start); return doLastIndexOf(c, start, length() - start); @@ -4237,17 +4387,17 @@ UnicodeString::startsWith(const UnicodeString& srcText, { return doCompare(0, srcLength, srcText, srcStart, srcLength) == 0; } inline UBool -UnicodeString::startsWith(const UChar *srcChars, int32_t srcLength) const { +UnicodeString::startsWith(ConstChar16Ptr srcChars, int32_t srcLength) const { if(srcLength < 0) { - srcLength = u_strlen(srcChars); + srcLength = u_strlen(toUCharPtr(srcChars)); } return doCompare(0, srcLength, srcChars, 0, srcLength) == 0; } inline UBool -UnicodeString::startsWith(const UChar *srcChars, int32_t srcStart, int32_t srcLength) const { +UnicodeString::startsWith(const char16_t *srcChars, int32_t srcStart, int32_t srcLength) const { if(srcLength < 0) { - srcLength = u_strlen(srcChars); + srcLength = u_strlen(toUCharPtr(srcChars)); } return doCompare(0, srcLength, srcChars, srcStart, srcLength) == 0; } @@ -4267,21 +4417,21 @@ UnicodeString::endsWith(const UnicodeString& srcText, } inline UBool -UnicodeString::endsWith(const UChar *srcChars, +UnicodeString::endsWith(ConstChar16Ptr srcChars, int32_t srcLength) const { if(srcLength < 0) { - srcLength = u_strlen(srcChars); + srcLength = u_strlen(toUCharPtr(srcChars)); } return doCompare(length() - srcLength, srcLength, srcChars, 0, srcLength) == 0; } inline UBool -UnicodeString::endsWith(const UChar *srcChars, +UnicodeString::endsWith(const char16_t *srcChars, int32_t srcStart, int32_t srcLength) const { if(srcLength < 0) { - srcLength = u_strlen(srcChars + srcStart); + srcLength = u_strlen(toUCharPtr(srcChars + srcStart)); } return doCompare(length() - srcLength, srcLength, srcChars, srcStart, srcLength) == 0; @@ -4307,14 +4457,14 @@ UnicodeString::replace(int32_t start, inline UnicodeString& UnicodeString::replace(int32_t start, int32_t _length, - const UChar *srcChars, + ConstChar16Ptr srcChars, int32_t srcLength) { return doReplace(start, _length, srcChars, 0, srcLength); } inline UnicodeString& UnicodeString::replace(int32_t start, int32_t _length, - const UChar *srcChars, + const char16_t *srcChars, int32_t srcStart, int32_t srcLength) { return doReplace(start, _length, srcChars, srcStart, srcLength); } @@ -4322,7 +4472,7 @@ UnicodeString::replace(int32_t start, inline UnicodeString& UnicodeString::replace(int32_t start, int32_t _length, - UChar srcChar) + char16_t srcChar) { return doReplace(start, _length, &srcChar, 0, 1); } inline UnicodeString& @@ -4365,7 +4515,7 @@ UnicodeString::doExtract(int32_t start, inline void UnicodeString::extract(int32_t start, int32_t _length, - UChar *target, + Char16Ptr target, int32_t targetStart) const { doExtract(start, _length, target, targetStart); } @@ -4393,7 +4543,7 @@ UnicodeString::extract(int32_t start, inline void UnicodeString::extractBetween(int32_t start, int32_t limit, - UChar *dst, + char16_t *dst, int32_t dstStart) const { pinIndex(start); pinIndex(limit); @@ -4405,7 +4555,7 @@ UnicodeString::tempSubStringBetween(int32_t start, int32_t limit) const { return tempSubString(start, limit - start); } -inline UChar +inline char16_t UnicodeString::doCharAt(int32_t offset) const { if((uint32_t)offset < (uint32_t)length()) { @@ -4415,11 +4565,11 @@ UnicodeString::doCharAt(int32_t offset) const } } -inline UChar +inline char16_t UnicodeString::charAt(int32_t offset) const { return doCharAt(offset); } -inline UChar +inline char16_t UnicodeString::operator[] (int32_t offset) const { return doCharAt(offset); } @@ -4460,14 +4610,14 @@ UnicodeString::setToEmpty() { } inline void -UnicodeString::setArray(UChar *array, int32_t len, int32_t capacity) { +UnicodeString::setArray(char16_t *array, int32_t len, int32_t capacity) { setLength(len); fUnion.fFields.fArray = array; fUnion.fFields.fCapacity = capacity; } inline UnicodeString& -UnicodeString::operator= (UChar ch) +UnicodeString::operator= (char16_t ch) { return doReplace(0, length(), &ch, 0, 1); } inline UnicodeString& @@ -4499,7 +4649,7 @@ UnicodeString::setTo(const UnicodeString& srcText) } inline UnicodeString& -UnicodeString::setTo(const UChar *srcChars, +UnicodeString::setTo(const char16_t *srcChars, int32_t srcLength) { unBogus(); @@ -4507,7 +4657,7 @@ UnicodeString::setTo(const UChar *srcChars, } inline UnicodeString& -UnicodeString::setTo(UChar srcChar) +UnicodeString::setTo(char16_t srcChar) { unBogus(); return doReplace(0, length(), &srcChar, 0, 1); @@ -4531,22 +4681,22 @@ UnicodeString::append(const UnicodeString& srcText) { return doAppend(srcText, 0, srcText.length()); } inline UnicodeString& -UnicodeString::append(const UChar *srcChars, +UnicodeString::append(const char16_t *srcChars, int32_t srcStart, int32_t srcLength) { return doAppend(srcChars, srcStart, srcLength); } inline UnicodeString& -UnicodeString::append(const UChar *srcChars, +UnicodeString::append(ConstChar16Ptr srcChars, int32_t srcLength) { return doAppend(srcChars, 0, srcLength); } inline UnicodeString& -UnicodeString::append(UChar srcChar) +UnicodeString::append(char16_t srcChar) { return doAppend(&srcChar, 0, 1); } inline UnicodeString& -UnicodeString::operator+= (UChar ch) +UnicodeString::operator+= (char16_t ch) { return doAppend(&ch, 0, 1); } inline UnicodeString& @@ -4572,20 +4722,20 @@ UnicodeString::insert(int32_t start, inline UnicodeString& UnicodeString::insert(int32_t start, - const UChar *srcChars, + const char16_t *srcChars, int32_t srcStart, int32_t srcLength) { return doReplace(start, 0, srcChars, srcStart, srcLength); } inline UnicodeString& UnicodeString::insert(int32_t start, - const UChar *srcChars, + ConstChar16Ptr srcChars, int32_t srcLength) { return doReplace(start, 0, srcChars, 0, srcLength); } inline UnicodeString& UnicodeString::insert(int32_t start, - UChar srcChar) + char16_t srcChar) { return doReplace(start, 0, &srcChar, 0, 1); } inline UnicodeString& diff --git a/Build/source/libs/icu/icu-src/source/common/unicode/unorm.h b/Build/source/libs/icu/icu-src/source/common/unicode/unorm.h index f527c263f02..3839de12957 100644 --- a/Build/source/libs/icu/icu-src/source/common/unicode/unorm.h +++ b/Build/source/libs/icu/icu-src/source/common/unicode/unorm.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* @@ -210,7 +210,7 @@ enum { * the output was truncated, and the error code is set to U_BUFFER_OVERFLOW_ERROR. * @deprecated ICU 56 Use unorm2.h instead. */ -U_STABLE int32_t U_EXPORT2 +U_DEPRECATED int32_t U_EXPORT2 unorm_normalize(const UChar *source, int32_t sourceLength, UNormalizationMode mode, int32_t options, UChar *result, int32_t resultLength, @@ -236,7 +236,7 @@ unorm_normalize(const UChar *source, int32_t sourceLength, * @see unorm_isNormalized * @deprecated ICU 56 Use unorm2.h instead. */ -U_STABLE UNormalizationCheckResult U_EXPORT2 +U_DEPRECATED UNormalizationCheckResult U_EXPORT2 unorm_quickCheck(const UChar *source, int32_t sourcelength, UNormalizationMode mode, UErrorCode *status); @@ -257,7 +257,7 @@ unorm_quickCheck(const UChar *source, int32_t sourcelength, * @see unorm_isNormalized * @deprecated ICU 56 Use unorm2.h instead. */ -U_STABLE UNormalizationCheckResult U_EXPORT2 +U_DEPRECATED UNormalizationCheckResult U_EXPORT2 unorm_quickCheckWithOptions(const UChar *src, int32_t srcLength, UNormalizationMode mode, int32_t options, UErrorCode *pErrorCode); @@ -283,7 +283,7 @@ unorm_quickCheckWithOptions(const UChar *src, int32_t srcLength, * @see unorm_quickCheck * @deprecated ICU 56 Use unorm2.h instead. */ -U_STABLE UBool U_EXPORT2 +U_DEPRECATED UBool U_EXPORT2 unorm_isNormalized(const UChar *src, int32_t srcLength, UNormalizationMode mode, UErrorCode *pErrorCode); @@ -305,7 +305,7 @@ unorm_isNormalized(const UChar *src, int32_t srcLength, * @see unorm_isNormalized * @deprecated ICU 56 Use unorm2.h instead. */ -U_STABLE UBool U_EXPORT2 +U_DEPRECATED UBool U_EXPORT2 unorm_isNormalizedWithOptions(const UChar *src, int32_t srcLength, UNormalizationMode mode, int32_t options, UErrorCode *pErrorCode); @@ -383,7 +383,7 @@ unorm_isNormalizedWithOptions(const UChar *src, int32_t srcLength, * * @deprecated ICU 56 Use unorm2.h instead. */ -U_STABLE int32_t U_EXPORT2 +U_DEPRECATED int32_t U_EXPORT2 unorm_next(UCharIterator *src, UChar *dest, int32_t destCapacity, UNormalizationMode mode, int32_t options, @@ -416,7 +416,7 @@ unorm_next(UCharIterator *src, * * @deprecated ICU 56 Use unorm2.h instead. */ -U_STABLE int32_t U_EXPORT2 +U_DEPRECATED int32_t U_EXPORT2 unorm_previous(UCharIterator *src, UChar *dest, int32_t destCapacity, UNormalizationMode mode, int32_t options, @@ -460,7 +460,7 @@ unorm_previous(UCharIterator *src, * * @deprecated ICU 56 Use unorm2.h instead. */ -U_STABLE int32_t U_EXPORT2 +U_DEPRECATED int32_t U_EXPORT2 unorm_concatenate(const UChar *left, int32_t leftLength, const UChar *right, int32_t rightLength, UChar *dest, int32_t destCapacity, diff --git a/Build/source/libs/icu/icu-src/source/common/unicode/unorm2.h b/Build/source/libs/icu/icu-src/source/common/unicode/unorm2.h index 56e99b2a22b..a9bd02f2563 100644 --- a/Build/source/libs/icu/icu-src/source/common/unicode/unorm2.h +++ b/Build/source/libs/icu/icu-src/source/common/unicode/unorm2.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* @@ -8,7 +8,7 @@ * ******************************************************************************* * file name: unorm2.h -* encoding: US-ASCII +* encoding: UTF-8 * tab size: 8 (not used) * indentation:4 * @@ -32,6 +32,7 @@ #include "unicode/utypes.h" #include "unicode/localpointer.h" +#include "unicode/stringoptions.h" #include "unicode/uset.h" /** @@ -526,30 +527,6 @@ unorm2_hasBoundaryAfter(const UNormalizer2 *norm2, UChar32 c); U_STABLE UBool U_EXPORT2 unorm2_isInert(const UNormalizer2 *norm2, UChar32 c); -/** - * Option bit for unorm_compare: - * Both input strings are assumed to fulfill FCD conditions. - * @stable ICU 2.2 - */ -#define UNORM_INPUT_IS_FCD 0x20000 - -/** - * Option bit for unorm_compare: - * Perform case-insensitive comparison. - * @stable ICU 2.2 - */ -#define U_COMPARE_IGNORE_CASE 0x10000 - -#ifndef U_COMPARE_CODE_POINT_ORDER -/* see also unistr.h and ustring.h */ -/** - * Option bit for u_strCaseCompare, u_strcasecmp, unorm_compare, etc: - * Compare strings in code point order instead of code unit order. - * @stable ICU 2.2 - */ -#define U_COMPARE_CODE_POINT_ORDER 0x8000 -#endif - /** * Compares two strings for canonical equivalence. * Further options include case-insensitive comparison and diff --git a/Build/source/libs/icu/icu-src/source/common/unicode/uobject.h b/Build/source/libs/icu/icu-src/source/common/unicode/uobject.h index ec231ee2c6b..9782f272f6d 100644 --- a/Build/source/libs/icu/icu-src/source/common/unicode/uobject.h +++ b/Build/source/libs/icu/icu-src/source/common/unicode/uobject.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ****************************************************************************** @@ -8,7 +8,7 @@ * ****************************************************************************** * file name: uobject.h -* encoding: US-ASCII +* encoding: UTF-8 * tab size: 8 (not used) * indentation:4 * diff --git a/Build/source/libs/icu/icu-src/source/common/unicode/urename.h b/Build/source/libs/icu/icu-src/source/common/unicode/urename.h index b220a546975..982655c4425 100644 --- a/Build/source/libs/icu/icu-src/source/common/unicode/urename.h +++ b/Build/source/libs/icu/icu-src/source/common/unicode/urename.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* @@ -7,7 +7,7 @@ ******************************************************************************* * * file name: urename.h -* encoding: US-ASCII +* encoding: UTF-8 * tab size: 8 (not used) * indentation:4 * @@ -100,12 +100,17 @@ #define _UTF16BEData U_ICU_ENTRY_POINT_RENAME(_UTF16BEData) #define _UTF16Data U_ICU_ENTRY_POINT_RENAME(_UTF16Data) #define _UTF16LEData U_ICU_ENTRY_POINT_RENAME(_UTF16LEData) +#define _UTF16v2Data U_ICU_ENTRY_POINT_RENAME(_UTF16v2Data) #define _UTF32BEData U_ICU_ENTRY_POINT_RENAME(_UTF32BEData) #define _UTF32Data U_ICU_ENTRY_POINT_RENAME(_UTF32Data) #define _UTF32LEData U_ICU_ENTRY_POINT_RENAME(_UTF32LEData) #define _UTF7Data U_ICU_ENTRY_POINT_RENAME(_UTF7Data) #define _UTF8Data U_ICU_ENTRY_POINT_RENAME(_UTF8Data) +#define allowedHourFormatsCleanup U_ICU_ENTRY_POINT_RENAME(allowedHourFormatsCleanup) +#define checkImpl U_ICU_ENTRY_POINT_RENAME(checkImpl) #define cmemory_cleanup U_ICU_ENTRY_POINT_RENAME(cmemory_cleanup) +#define dayPeriodRulesCleanup U_ICU_ENTRY_POINT_RENAME(dayPeriodRulesCleanup) +#define deleteAllowedHourFormats U_ICU_ENTRY_POINT_RENAME(deleteAllowedHourFormats) #define gTimeZoneFilesInitOnce U_ICU_ENTRY_POINT_RENAME(gTimeZoneFilesInitOnce) #define izrule_clone U_ICU_ENTRY_POINT_RENAME(izrule_clone) #define izrule_close U_ICU_ENTRY_POINT_RENAME(izrule_close) @@ -121,16 +126,6 @@ #define izrule_getStaticClassID U_ICU_ENTRY_POINT_RENAME(izrule_getStaticClassID) #define izrule_isEquivalentTo U_ICU_ENTRY_POINT_RENAME(izrule_isEquivalentTo) #define izrule_open U_ICU_ENTRY_POINT_RENAME(izrule_open) -#define le_close U_ICU_ENTRY_POINT_RENAME(le_close) -#define le_create U_ICU_ENTRY_POINT_RENAME(le_create) -#define le_getCharIndices U_ICU_ENTRY_POINT_RENAME(le_getCharIndices) -#define le_getCharIndicesWithBase U_ICU_ENTRY_POINT_RENAME(le_getCharIndicesWithBase) -#define le_getGlyphCount U_ICU_ENTRY_POINT_RENAME(le_getGlyphCount) -#define le_getGlyphPosition U_ICU_ENTRY_POINT_RENAME(le_getGlyphPosition) -#define le_getGlyphPositions U_ICU_ENTRY_POINT_RENAME(le_getGlyphPositions) -#define le_getGlyphs U_ICU_ENTRY_POINT_RENAME(le_getGlyphs) -#define le_layoutChars U_ICU_ENTRY_POINT_RENAME(le_layoutChars) -#define le_reset U_ICU_ENTRY_POINT_RENAME(le_reset) #define locale_getKeywords U_ICU_ENTRY_POINT_RENAME(locale_getKeywords) #define locale_getKeywordsStart U_ICU_ENTRY_POINT_RENAME(locale_getKeywordsStart) #define locale_get_default U_ICU_ENTRY_POINT_RENAME(locale_get_default) @@ -486,6 +481,7 @@ #define ubrk_first U_ICU_ENTRY_POINT_RENAME(ubrk_first) #define ubrk_following U_ICU_ENTRY_POINT_RENAME(ubrk_following) #define ubrk_getAvailable U_ICU_ENTRY_POINT_RENAME(ubrk_getAvailable) +#define ubrk_getBinaryRules U_ICU_ENTRY_POINT_RENAME(ubrk_getBinaryRules) #define ubrk_getLocaleByType U_ICU_ENTRY_POINT_RENAME(ubrk_getLocaleByType) #define ubrk_getRuleStatus U_ICU_ENTRY_POINT_RENAME(ubrk_getRuleStatus) #define ubrk_getRuleStatusVec U_ICU_ENTRY_POINT_RENAME(ubrk_getRuleStatusVec) @@ -493,6 +489,7 @@ #define ubrk_last U_ICU_ENTRY_POINT_RENAME(ubrk_last) #define ubrk_next U_ICU_ENTRY_POINT_RENAME(ubrk_next) #define ubrk_open U_ICU_ENTRY_POINT_RENAME(ubrk_open) +#define ubrk_openBinaryRules U_ICU_ENTRY_POINT_RENAME(ubrk_openBinaryRules) #define ubrk_openRules U_ICU_ENTRY_POINT_RENAME(ubrk_openRules) #define ubrk_preceding U_ICU_ENTRY_POINT_RENAME(ubrk_preceding) #define ubrk_previous U_ICU_ENTRY_POINT_RENAME(ubrk_previous) @@ -554,7 +551,6 @@ #define ucase_addStringCaseClosure U_ICU_ENTRY_POINT_RENAME(ucase_addStringCaseClosure) #define ucase_fold U_ICU_ENTRY_POINT_RENAME(ucase_fold) #define ucase_getCaseLocale U_ICU_ENTRY_POINT_RENAME(ucase_getCaseLocale) -#define ucase_getSingleton U_ICU_ENTRY_POINT_RENAME(ucase_getSingleton) #define ucase_getType U_ICU_ENTRY_POINT_RENAME(ucase_getType) #define ucase_getTypeOrIgnorable U_ICU_ENTRY_POINT_RENAME(ucase_getTypeOrIgnorable) #define ucase_hasBinaryProperty U_ICU_ENTRY_POINT_RENAME(ucase_hasBinaryProperty) @@ -949,6 +945,7 @@ #define uhash_iget U_ICU_ENTRY_POINT_RENAME(uhash_iget) #define uhash_igeti U_ICU_ENTRY_POINT_RENAME(uhash_igeti) #define uhash_init U_ICU_ENTRY_POINT_RENAME(uhash_init) +#define uhash_initSize U_ICU_ENTRY_POINT_RENAME(uhash_initSize) #define uhash_iput U_ICU_ENTRY_POINT_RENAME(uhash_iput) #define uhash_iputi U_ICU_ENTRY_POINT_RENAME(uhash_iputi) #define uhash_iremove U_ICU_ENTRY_POINT_RENAME(uhash_iremove) @@ -1150,6 +1147,7 @@ #define unum_formatDecimal U_ICU_ENTRY_POINT_RENAME(unum_formatDecimal) #define unum_formatDouble U_ICU_ENTRY_POINT_RENAME(unum_formatDouble) #define unum_formatDoubleCurrency U_ICU_ENTRY_POINT_RENAME(unum_formatDoubleCurrency) +#define unum_formatDoubleForFields U_ICU_ENTRY_POINT_RENAME(unum_formatDoubleForFields) #define unum_formatInt64 U_ICU_ENTRY_POINT_RENAME(unum_formatInt64) #define unum_formatUFormattable U_ICU_ENTRY_POINT_RENAME(unum_formatUFormattable) #define unum_getAttribute U_ICU_ENTRY_POINT_RENAME(unum_getAttribute) @@ -1181,9 +1179,11 @@ #define unumsys_openAvailableNames U_ICU_ENTRY_POINT_RENAME(unumsys_openAvailableNames) #define unumsys_openByName U_ICU_ENTRY_POINT_RENAME(unumsys_openByName) #define uplrules_close U_ICU_ENTRY_POINT_RENAME(uplrules_close) +#define uplrules_getKeywords U_ICU_ENTRY_POINT_RENAME(uplrules_getKeywords) #define uplrules_open U_ICU_ENTRY_POINT_RENAME(uplrules_open) #define uplrules_openForType U_ICU_ENTRY_POINT_RENAME(uplrules_openForType) #define uplrules_select U_ICU_ENTRY_POINT_RENAME(uplrules_select) +#define uplrules_selectWithFormat U_ICU_ENTRY_POINT_RENAME(uplrules_selectWithFormat) #define uplug_closeLibrary U_ICU_ENTRY_POINT_RENAME(uplug_closeLibrary) #define uplug_findLibrary U_ICU_ENTRY_POINT_RENAME(uplug_findLibrary) #define uplug_getConfiguration U_ICU_ENTRY_POINT_RENAME(uplug_getConfiguration) @@ -1220,6 +1220,7 @@ #define uprv_compareInvEbcdic U_ICU_ENTRY_POINT_RENAME(uprv_compareInvEbcdic) #define uprv_compareInvEbcdicAsAscii U_ICU_ENTRY_POINT_RENAME(uprv_compareInvEbcdicAsAscii) #define uprv_convertToLCID U_ICU_ENTRY_POINT_RENAME(uprv_convertToLCID) +#define uprv_convertToLCIDPlatform U_ICU_ENTRY_POINT_RENAME(uprv_convertToLCIDPlatform) #define uprv_convertToPosix U_ICU_ENTRY_POINT_RENAME(uprv_convertToPosix) #define uprv_copyAscii U_ICU_ENTRY_POINT_RENAME(uprv_copyAscii) #define uprv_copyEbcdic U_ICU_ENTRY_POINT_RENAME(uprv_copyEbcdic) @@ -1654,12 +1655,14 @@ #define ustr_hashCharsN U_ICU_ENTRY_POINT_RENAME(ustr_hashCharsN) #define ustr_hashICharsN U_ICU_ENTRY_POINT_RENAME(ustr_hashICharsN) #define ustr_hashUCharsN U_ICU_ENTRY_POINT_RENAME(ustr_hashUCharsN) +#define ustrcase_getCaseLocale U_ICU_ENTRY_POINT_RENAME(ustrcase_getCaseLocale) +#define ustrcase_getTitleBreakIterator U_ICU_ENTRY_POINT_RENAME(ustrcase_getTitleBreakIterator) #define ustrcase_internalFold U_ICU_ENTRY_POINT_RENAME(ustrcase_internalFold) #define ustrcase_internalToLower U_ICU_ENTRY_POINT_RENAME(ustrcase_internalToLower) #define ustrcase_internalToTitle U_ICU_ENTRY_POINT_RENAME(ustrcase_internalToTitle) #define ustrcase_internalToUpper U_ICU_ENTRY_POINT_RENAME(ustrcase_internalToUpper) #define ustrcase_map U_ICU_ENTRY_POINT_RENAME(ustrcase_map) -#define ustrcase_setTempCaseMapLocale U_ICU_ENTRY_POINT_RENAME(ustrcase_setTempCaseMapLocale) +#define ustrcase_mapWithOverlap U_ICU_ENTRY_POINT_RENAME(ustrcase_mapWithOverlap) #define utext_char32At U_ICU_ENTRY_POINT_RENAME(utext_char32At) #define utext_clone U_ICU_ENTRY_POINT_RENAME(utext_clone) #define utext_close U_ICU_ENTRY_POINT_RENAME(utext_close) @@ -1704,7 +1707,6 @@ #define utrace_functionName U_ICU_ENTRY_POINT_RENAME(utrace_functionName) #define utrace_getFunctions U_ICU_ENTRY_POINT_RENAME(utrace_getFunctions) #define utrace_getLevel U_ICU_ENTRY_POINT_RENAME(utrace_getLevel) -#define utrace_level U_ICU_ENTRY_POINT_RENAME(utrace_level) #define utrace_setFunctions U_ICU_ENTRY_POINT_RENAME(utrace_setFunctions) #define utrace_setLevel U_ICU_ENTRY_POINT_RENAME(utrace_setLevel) #define utrace_vformat U_ICU_ENTRY_POINT_RENAME(utrace_vformat) diff --git a/Build/source/libs/icu/icu-src/source/common/unicode/urep.h b/Build/source/libs/icu/icu-src/source/common/unicode/urep.h index b559b2485fc..932202ddb04 100644 --- a/Build/source/libs/icu/icu-src/source/common/unicode/urep.h +++ b/Build/source/libs/icu/icu-src/source/common/unicode/urep.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ****************************************************************************** diff --git a/Build/source/libs/icu/icu-src/source/common/unicode/ures.h b/Build/source/libs/icu/icu-src/source/common/unicode/ures.h index 620d9268aac..918b9f208e2 100644 --- a/Build/source/libs/icu/icu-src/source/common/unicode/ures.h +++ b/Build/source/libs/icu/icu-src/source/common/unicode/ures.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** diff --git a/Build/source/libs/icu/icu-src/source/common/unicode/uscript.h b/Build/source/libs/icu/icu-src/source/common/unicode/uscript.h index a20cd157a45..3ec235d50ce 100644 --- a/Build/source/libs/icu/icu-src/source/common/unicode/uscript.h +++ b/Build/source/libs/icu/icu-src/source/common/unicode/uscript.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** @@ -444,6 +444,13 @@ typedef enum UScriptCode { /** @stable ICU 58 */ USCRIPT_SYMBOLS_EMOJI = 174,/* Zsye */ + /** @stable ICU 60 */ + USCRIPT_MASARAM_GONDI = 175,/* Gonm */ + /** @stable ICU 60 */ + USCRIPT_SOYOMBO = 176,/* Soyo */ + /** @stable ICU 60 */ + USCRIPT_ZANABAZAR_SQUARE = 177,/* Zanb */ + #ifndef U_HIDE_DEPRECATED_API /** * One more than the highest normal UScriptCode value. @@ -451,7 +458,7 @@ typedef enum UScriptCode { * * @deprecated ICU 58 The numeric value may change over time, see ICU ticket #12420. */ - USCRIPT_CODE_LIMIT = 175 + USCRIPT_CODE_LIMIT = 178 #endif // U_HIDE_DEPRECATED_API } UScriptCode; diff --git a/Build/source/libs/icu/icu-src/source/common/unicode/uset.h b/Build/source/libs/icu/icu-src/source/common/unicode/uset.h index 8baabbe96b4..59f46507d54 100644 --- a/Build/source/libs/icu/icu-src/source/common/unicode/uset.h +++ b/Build/source/libs/icu/icu-src/source/common/unicode/uset.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* @@ -8,7 +8,7 @@ * ******************************************************************************* * file name: uset.h -* encoding: US-ASCII +* encoding: UTF-8 * tab size: 8 (not used) * indentation:4 * diff --git a/Build/source/libs/icu/icu-src/source/common/unicode/usetiter.h b/Build/source/libs/icu/icu-src/source/common/unicode/usetiter.h index 26591d0439d..d0d99185b7c 100644 --- a/Build/source/libs/icu/icu-src/source/common/unicode/usetiter.h +++ b/Build/source/libs/icu/icu-src/source/common/unicode/usetiter.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** diff --git a/Build/source/libs/icu/icu-src/source/common/unicode/ushape.h b/Build/source/libs/icu/icu-src/source/common/unicode/ushape.h index 0ea323169a0..c64fe227c1f 100644 --- a/Build/source/libs/icu/icu-src/source/common/unicode/ushape.h +++ b/Build/source/libs/icu/icu-src/source/common/unicode/ushape.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ****************************************************************************** @@ -8,7 +8,7 @@ * ****************************************************************************** * file name: ushape.h -* encoding: US-ASCII +* encoding: UTF-8 * tab size: 8 (not used) * indentation:4 * diff --git a/Build/source/libs/icu/icu-src/source/common/unicode/usprep.h b/Build/source/libs/icu/icu-src/source/common/unicode/usprep.h index 5bd837e0463..da0848dac1b 100644 --- a/Build/source/libs/icu/icu-src/source/common/unicode/usprep.h +++ b/Build/source/libs/icu/icu-src/source/common/unicode/usprep.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* @@ -8,7 +8,7 @@ * ******************************************************************************* * file name: usprep.h - * encoding: US-ASCII + * encoding: UTF-8 * tab size: 8 (not used) * indentation:4 * diff --git a/Build/source/libs/icu/icu-src/source/common/unicode/ustring.h b/Build/source/libs/icu/icu-src/source/common/unicode/ustring.h index e62fef53485..3daa28e555e 100644 --- a/Build/source/libs/icu/icu-src/source/common/unicode/ustring.h +++ b/Build/source/libs/icu/icu-src/source/common/unicode/ustring.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** @@ -497,16 +497,6 @@ u_strCompare(const UChar *s1, int32_t length1, U_STABLE int32_t U_EXPORT2 u_strCompareIter(UCharIterator *iter1, UCharIterator *iter2, UBool codePointOrder); -#ifndef U_COMPARE_CODE_POINT_ORDER -/* see also unistr.h and unorm.h */ -/** - * Option bit for u_strCaseCompare, u_strcasecmp, unorm_compare, etc: - * Compare strings in code point order instead of code unit order. - * @stable ICU 2.2 - */ -#define U_COMPARE_CODE_POINT_ORDER 0x8000 -#endif - /** * Compare two strings case-insensitively using full case folding. * This is equivalent to diff --git a/Build/source/libs/icu/icu-src/source/common/unicode/ustringtrie.h b/Build/source/libs/icu/icu-src/source/common/unicode/ustringtrie.h index 50d31ba226c..fd856482254 100644 --- a/Build/source/libs/icu/icu-src/source/common/unicode/ustringtrie.h +++ b/Build/source/libs/icu/icu-src/source/common/unicode/ustringtrie.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* @@ -6,7 +6,7 @@ * Corporation and others. All Rights Reserved. ******************************************************************************* * file name: udicttrie.h -* encoding: US-ASCII +* encoding: UTF-8 * tab size: 8 (not used) * indentation:4 * diff --git a/Build/source/libs/icu/icu-src/source/common/unicode/utext.h b/Build/source/libs/icu/icu-src/source/common/unicode/utext.h index fd1199561d1..33f2f4cf27b 100644 --- a/Build/source/libs/icu/icu-src/source/common/unicode/utext.h +++ b/Build/source/libs/icu/icu-src/source/common/unicode/utext.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* @@ -8,7 +8,7 @@ * ******************************************************************************* * file name: utext.h -* encoding: US-ASCII +* encoding: UTF-8 * tab size: 8 (not used) * indentation:4 * @@ -389,7 +389,7 @@ utext_equals(const UText *a, const UText *b); /***************************************************************************** * - * Functions to work with the text represeted by a UText wrapper + * Functions to work with the text represented by a UText wrapper * *****************************************************************************/ @@ -433,7 +433,7 @@ utext_isLengthExpensive(const UText *ut); * * The iteration position will be set to the start of the returned code point. * - * This function is roughly equivalent to the the sequence + * This function is roughly equivalent to the sequence * utext_setNativeIndex(index); * utext_current32(); * (There is a subtle difference if the index is out of bounds by being less than zero - @@ -592,7 +592,7 @@ U_STABLE void U_EXPORT2 utext_setNativeIndex(UText *ut, int64_t nativeIndex); /** - * Move the iterator postion by delta code points. The number of code points + * Move the iterator position by delta code points. The number of code points * is a signed number; a negative delta will move the iterator backwards, * towards the start of the text. *

      @@ -611,7 +611,7 @@ U_STABLE UBool U_EXPORT2 utext_moveIndex32(UText *ut, int32_t delta); /** - * Get the native index of the character preceeding the current position. + * Get the native index of the character preceding the current position. * If the iteration position is already at the start of the text, zero * is returned. * The value returned is the same as that obtained from the following sequence, @@ -628,7 +628,7 @@ utext_moveIndex32(UText *ut, int32_t delta); * native index of the character most recently returned from utext_next(). * * @param ut the text to be accessed - * @return the native index of the character preceeding the current index position, + * @return the native index of the character preceding the current index position, * or zero if the current position is at the start of the text. * @stable ICU 3.6 */ @@ -768,7 +768,7 @@ utext_extract(UText *ut, */ #define UTEXT_SETNATIVEINDEX(ut, ix) \ { int64_t __offset = (ix) - (ut)->chunkNativeStart; \ - if (__offset>=0 && __offset<=(int64_t)(ut)->nativeIndexingLimit) { \ + if (__offset>=0 && __offset<(int64_t)(ut)->nativeIndexingLimit && (ut)->chunkContents[__offset]<0xdc00) { \ (ut)->chunkOffset=(int32_t)__offset; \ } else { \ utext_setNativeIndex((ut), (ix)); } } @@ -1054,7 +1054,7 @@ UTextAccess(UText *ut, int64_t nativeIndex, UBool forward); * be NUL-terminated if there is sufficient space in the destination buffer. * * @param ut the UText from which to extract data. - * @param nativeStart the native index of the first characer to extract. + * @param nativeStart the native index of the first character to extract. * @param nativeLimit the native string index of the position following the last * character to extract. * @param dest the UChar (UTF-16) buffer into which the extracted text is placed @@ -1211,7 +1211,7 @@ UTextClose(UText *ut); struct UTextFuncs { /** * (public) Function table size, sizeof(UTextFuncs) - * Intended for use should the table grow to accomodate added + * Intended for use should the table grow to accommodate added * functions in the future, to allow tests for older format * function tables that do not contain the extensions. * @@ -1345,7 +1345,7 @@ typedef struct UTextFuncs UTextFuncs; struct UText { /** * (private) Magic. Used to help detect when UText functions are handed - * invalid or unitialized UText structs. + * invalid or uninitialized UText structs. * utext_openXYZ() functions take an initialized, * but not necessarily open, UText struct as an * optional fill-in parameter. This magic field @@ -1367,7 +1367,7 @@ struct UText { /** - * Text provider properties. This set of flags is maintainted by the + * Text provider properties. This set of flags is maintained by the * text provider implementation. * @stable ICU 3.4 */ diff --git a/Build/source/libs/icu/icu-src/source/common/unicode/utf.h b/Build/source/libs/icu/icu-src/source/common/unicode/utf.h index ffb094f49fe..ef512997f05 100644 --- a/Build/source/libs/icu/icu-src/source/common/unicode/utf.h +++ b/Build/source/libs/icu/icu-src/source/common/unicode/utf.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* @@ -8,7 +8,7 @@ * ******************************************************************************* * file name: utf.h -* encoding: US-ASCII +* encoding: UTF-8 * tab size: 8 (not used) * indentation:4 * @@ -23,9 +23,6 @@ * This file defines macros for checking whether a code point is * a surrogate or a non-character etc. * - * The UChar and UChar32 data types for Unicode code units and code points - * are defined in umachine.h because they can be machine-dependent. - * * If U_NO_DEFAULT_INCLUDE_UTF_HEADERS is 0 then utf.h is included by utypes.h * and itself includes utf8.h and utf16.h after some * common definitions. @@ -50,11 +47,11 @@ * but are optimized for the much more frequently occurring BMP code points. * * umachine.h defines UChar to be an unsigned 16-bit integer. - * Where available, UChar is defined to be a char16_t - * or a wchar_t (if that is an unsigned 16-bit type), otherwise uint16_t. + * Since ICU 59, ICU uses char16_t in C++, UChar only in C, + * and defines UChar=char16_t by default. See the UChar API docs for details. * * UChar32 is defined to be a signed 32-bit integer (int32_t), large enough for a 21-bit - * Unicode code point (Unicode scalar value, 0..0x10ffff). + * Unicode code point (Unicode scalar value, 0..0x10ffff) and U_SENTINEL (-1). * Before ICU 2.4, the definition of UChar32 was similarly platform-dependent as * the definition of UChar. For details see the documentation for UChar32 itself. * @@ -63,11 +60,20 @@ * For actual Unicode character properties see uchar.h. * * By default, string operations must be done with error checking in case - * a string is not well-formed UTF-16. - * The macros will detect if a surrogate code unit is unpaired + * a string is not well-formed UTF-16 or UTF-8. + * + * The U16_ macros detect if a surrogate code unit is unpaired * (lead unit without trail unit or vice versa) and just return the unit itself * as the code point. * + * The U8_ macros detect illegal byte sequences and return a negative value. + * Starting with ICU 60, the observable length of a single illegal byte sequence + * skipped by one of these macros follows the Unicode 6+ recommendation + * which is consistent with the W3C Encoding Standard. + * + * There are ..._OR_FFFD versions of both U16_ and U8_ macros + * that return U+FFFD for illegal code unit sequences. + * * The regular "safe" macros require that the initial, passed-in string index * is within bounds. They only check the index when they read more than one * code unit. This is usually done with code similar to the following loop: @@ -91,10 +97,7 @@ * The performance differences are much larger here because UTF-8 provides so * many opportunities for malformed sequences. * The unsafe UTF-8 macros are entirely implemented inside the macro definitions - * and are fast, while the safe UTF-8 macros call functions for all but the - * trivial (ASCII) cases. - * (ICU 3.6 optimizes U8_NEXT() and U8_APPEND() to handle most other common - * characters inline as well.) + * and are fast, while the safe UTF-8 macros call functions for some complicated cases. * * Unlike with UTF-16, malformed sequences cannot be expressed with distinct * code point values (0..U+10ffff). They are indicated with negative values instead. @@ -126,8 +129,7 @@ */ #define U_IS_UNICODE_NONCHAR(c) \ ((c)>=0xfdd0 && \ - ((uint32_t)(c)<=0xfdef || ((c)&0xfffe)==0xfffe) && \ - (uint32_t)(c)<=0x10ffff) + ((c)<=0xfdef || ((c)&0xfffe)==0xfffe) && (c)<=0x10ffff) /** * Is c a Unicode code point value (0..U+10ffff) @@ -148,9 +150,7 @@ */ #define U_IS_UNICODE_CHAR(c) \ ((uint32_t)(c)<0xd800 || \ - ((uint32_t)(c)>0xdfff && \ - (uint32_t)(c)<=0x10ffff && \ - !U_IS_UNICODE_NONCHAR(c))) + (0xdfff<(c) && (c)<=0x10ffff && !U_IS_UNICODE_NONCHAR(c))) /** * Is this code point a BMP code point (U+0000..U+ffff)? diff --git a/Build/source/libs/icu/icu-src/source/common/unicode/utf16.h b/Build/source/libs/icu/icu-src/source/common/unicode/utf16.h index 6e7d1da79d7..35fd0986114 100644 --- a/Build/source/libs/icu/icu-src/source/common/unicode/utf16.h +++ b/Build/source/libs/icu/icu-src/source/common/unicode/utf16.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* @@ -8,7 +8,7 @@ * ******************************************************************************* * file name: utf16.h -* encoding: US-ASCII +* encoding: UTF-8 * tab size: 8 (not used) * indentation:4 * @@ -185,8 +185,8 @@ * * The length can be negative for a NUL-terminated string. * - * If the offset points to a single, unpaired surrogate, then that itself - * will be returned as the code point. + * If the offset points to a single, unpaired surrogate, then + * c is set to that unpaired surrogate. * Iteration through a string is more efficient with U16_NEXT_UNSAFE or U16_NEXT. * * @param s const UChar * string @@ -213,6 +213,53 @@ } \ } +#ifndef U_HIDE_DRAFT_API + +/** + * Get a code point from a string at a random-access offset, + * without changing the offset. + * "Safe" macro, handles unpaired surrogates and checks for string boundaries. + * + * The offset may point to either the lead or trail surrogate unit + * for a supplementary code point, in which case the macro will read + * the adjacent matching surrogate as well. + * + * The length can be negative for a NUL-terminated string. + * + * If the offset points to a single, unpaired surrogate, then + * c is set to U+FFFD. + * Iteration through a string is more efficient with U16_NEXT_UNSAFE or U16_NEXT_OR_FFFD. + * + * @param s const UChar * string + * @param start starting string offset (usually 0) + * @param i string offset, must be start<=i(start) && U16_IS_LEAD(__c2=(s)[(i)-1])) { \ + (c)=U16_GET_SUPPLEMENTARY(__c2, (c)); \ + } else { \ + (c)=0xfffd; \ + } \ + } \ + } \ +} + +#endif // U_HIDE_DRAFT_API + /* definitions with forward iteration --------------------------------------- */ /** @@ -253,8 +300,7 @@ * for a supplementary code point, in which case the macro will read * the following trail surrogate as well. * If the offset points to a trail surrogate or - * to a single, unpaired lead surrogate, then that itself - * will be returned as the code point. + * to a single, unpaired lead surrogate, then c is set to that unpaired surrogate. * * @param s const UChar * string * @param i string offset, must be i(start) && U16_IS_LEAD(__c2=(s)[(i)-1])) { \ + --(i); \ + (c)=U16_GET_SUPPLEMENTARY(__c2, (c)); \ + } else { \ + (c)=0xfffd; \ + } \ + } \ +} + +#endif // U_HIDE_DRAFT_API + /** * Move the string offset from one code point boundary to the previous one. * (Pre-decrementing backward iteration.) diff --git a/Build/source/libs/icu/icu-src/source/common/unicode/utf32.h b/Build/source/libs/icu/icu-src/source/common/unicode/utf32.h index f93727c1094..8822c4dd096 100644 --- a/Build/source/libs/icu/icu-src/source/common/unicode/utf32.h +++ b/Build/source/libs/icu/icu-src/source/common/unicode/utf32.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* @@ -8,7 +8,7 @@ * ******************************************************************************* * file name: utf32.h -* encoding: US-ASCII +* encoding: UTF-8 * tab size: 8 (not used) * indentation:4 * diff --git a/Build/source/libs/icu/icu-src/source/common/unicode/utf8.h b/Build/source/libs/icu/icu-src/source/common/unicode/utf8.h index 55f7b9d21d8..df08d341ab8 100644 --- a/Build/source/libs/icu/icu-src/source/common/unicode/utf8.h +++ b/Build/source/libs/icu/icu-src/source/common/unicode/utf8.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* @@ -8,7 +8,7 @@ * ******************************************************************************* * file name: utf8.h -* encoding: US-ASCII +* encoding: UTF-8 * tab size: 8 (not used) * indentation:4 * @@ -41,52 +41,24 @@ /* internal definitions ----------------------------------------------------- */ -/** - * \var utf8_countTrailBytes - * Internal array with numbers of trail bytes for any given byte used in - * lead byte position. - * - * This is internal since it is not meant to be called directly by external clients; - * however it is called by public macros in this file and thus must remain stable, - * and should not be hidden when other internal functions are hidden (otherwise - * public macros would fail to compile). - * @internal - */ -#ifdef U_UTF8_IMPL -U_EXPORT const uint8_t -#elif defined(U_STATIC_IMPLEMENTATION) || defined(U_COMMON_IMPLEMENTATION) -U_CFUNC const uint8_t -#else -U_CFUNC U_IMPORT const uint8_t /* U_IMPORT2? */ /*U_IMPORT*/ -#endif -utf8_countTrailBytes[256]; - /** * Counts the trail bytes for a UTF-8 lead byte. - * Returns 0 for 0..0xbf as well as for 0xfe and 0xff. + * Returns 0 for 0..0xc1 as well as for 0xf5..0xff. + * leadByte might be evaluated multiple times. * * This is internal since it is not meant to be called directly by external clients; * however it is called by public macros in this file and thus must remain stable. * - * Note: Beginning with ICU 50, the implementation uses a multi-condition expression - * which was shown in 2012 (on x86-64) to compile to fast, branch-free code. - * leadByte is evaluated multiple times. - * - * The pre-ICU 50 implementation used the exported array utf8_countTrailBytes: - * #define U8_COUNT_TRAIL_BYTES(leadByte) (utf8_countTrailBytes[leadByte]) - * leadByte was evaluated exactly once. - * * @param leadByte The first byte of a UTF-8 sequence. Must be 0..0xff. * @internal */ #define U8_COUNT_TRAIL_BYTES(leadByte) \ - ((uint8_t)(leadByte)<0xf0 ? \ - ((uint8_t)(leadByte)>=0xc0)+((uint8_t)(leadByte)>=0xe0) : \ - (uint8_t)(leadByte)<0xfe ? 3+((uint8_t)(leadByte)>=0xf8)+((uint8_t)(leadByte)>=0xfc) : 0) + (U8_IS_LEAD(leadByte) ? \ + ((uint8_t)(leadByte)>=0xe0)+((uint8_t)(leadByte)>=0xf0)+1 : 0) /** * Counts the trail bytes for a UTF-8 lead byte of a valid UTF-8 sequence. - * The maximum supported lead byte is 0xf4 corresponding to U+10FFFF. + * Returns 0 for 0..0xc1. Undefined for 0xf5..0xff. * leadByte might be evaluated multiple times. * * This is internal since it is not meant to be called directly by external clients; @@ -96,7 +68,7 @@ utf8_countTrailBytes[256]; * @internal */ #define U8_COUNT_TRAIL_BYTES_UNSAFE(leadByte) \ - (((leadByte)>=0xc0)+((leadByte)>=0xe0)+((leadByte)>=0xf0)) + (((uint8_t)(leadByte)>=0xc2)+((uint8_t)(leadByte)>=0xe0)+((uint8_t)(leadByte)>=0xf0)) /** * Mask a UTF-8 lead byte, leave only the lower bits that form part of the code point value. @@ -107,6 +79,40 @@ utf8_countTrailBytes[256]; */ #define U8_MASK_LEAD_BYTE(leadByte, countTrailBytes) ((leadByte)&=(1<<(6-(countTrailBytes)))-1) +/** + * Internal bit vector for 3-byte UTF-8 validity check, for use in U8_IS_VALID_LEAD3_AND_T1. + * Each bit indicates whether one lead byte + first trail byte pair starts a valid sequence. + * Lead byte E0..EF bits 3..0 are used as byte index, + * first trail byte bits 7..5 are used as bit index into that byte. + * @see U8_IS_VALID_LEAD3_AND_T1 + * @internal + */ +#define U8_LEAD3_T1_BITS "\x20\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x10\x30\x30" + +/** + * Internal 3-byte UTF-8 validity check. + * Non-zero if lead byte E0..EF and first trail byte 00..FF start a valid sequence. + * @internal + */ +#define U8_IS_VALID_LEAD3_AND_T1(lead, t1) (U8_LEAD3_T1_BITS[(lead)&0xf]&(1<<((uint8_t)(t1)>>5))) + +/** + * Internal bit vector for 4-byte UTF-8 validity check, for use in U8_IS_VALID_LEAD4_AND_T1. + * Each bit indicates whether one lead byte + first trail byte pair starts a valid sequence. + * First trail byte bits 7..4 are used as byte index, + * lead byte F0..F4 bits 2..0 are used as bit index into that byte. + * @see U8_IS_VALID_LEAD4_AND_T1 + * @internal + */ +#define U8_LEAD4_T1_BITS "\x00\x00\x00\x00\x00\x00\x00\x00\x1E\x0F\x0F\x0F\x00\x00\x00\x00" + +/** + * Internal 4-byte UTF-8 validity check. + * Non-zero if lead byte F0..F4 and first trail byte 00..FF start a valid sequence. + * @internal + */ +#define U8_IS_VALID_LEAD4_AND_T1(lead, t1) (U8_LEAD4_T1_BITS[(uint8_t)(t1)>>4]&(1<<((lead)&7))) + /** * Function for handling "next code point" with error-checking. * @@ -166,20 +172,21 @@ utf8_back1SafeBody(const uint8_t *s, int32_t start, int32_t i); #define U8_IS_SINGLE(c) (((c)&0x80)==0) /** - * Is this code unit (byte) a UTF-8 lead byte? + * Is this code unit (byte) a UTF-8 lead byte? (0xC2..0xF4) * @param c 8-bit code unit (byte) * @return TRUE or FALSE * @stable ICU 2.4 */ -#define U8_IS_LEAD(c) ((uint8_t)((c)-0xc0)<0x3e) +#define U8_IS_LEAD(c) ((uint8_t)((c)-0xc2)<=0x32) +// 0x32=0xf4-0xc2 /** - * Is this code unit (byte) a UTF-8 trail byte? + * Is this code unit (byte) a UTF-8 trail byte? (0x80..0xBF) * @param c 8-bit code unit (byte) * @return TRUE or FALSE * @stable ICU 2.4 */ -#define U8_IS_TRAIL(c) (((c)&0xc0)==0x80) +#define U8_IS_TRAIL(c) ((int8_t)(c)<-0x40) /** * How many code units (bytes) are used for the UTF-8 encoding @@ -307,7 +314,7 @@ utf8_back1SafeBody(const uint8_t *s, int32_t start, int32_t i); */ #define U8_NEXT_UNSAFE(s, i, c) { \ (c)=(uint8_t)(s)[(i)++]; \ - if((c)>=0x80) { \ + if(!U8_IS_SINGLE(c)) { \ if((c)<0xe0) { \ (c)=(((c)&0x1f)<<6)|((s)[(i)++]&0x3f); \ } else if((c)<0xf0) { \ @@ -343,22 +350,19 @@ utf8_back1SafeBody(const uint8_t *s, int32_t start, int32_t i); */ #define U8_NEXT(s, i, length, c) { \ (c)=(uint8_t)(s)[(i)++]; \ - if((c)>=0x80) { \ + if(!U8_IS_SINGLE(c)) { \ uint8_t __t1, __t2; \ - if( /* handle U+1000..U+CFFF inline */ \ - (0xe0<(c) && (c)<=0xec) && \ - (((i)+1)<(length) || (length)<0) && \ - (__t1=(uint8_t)((s)[i]-0x80))<=0x3f && \ - (__t2=(uint8_t)((s)[(i)+1]-0x80))<= 0x3f \ - ) { \ - /* no need for (c&0xf) because the upper bits are truncated after <<12 in the cast to (UChar) */ \ - (c)=(UChar)(((c)<<12)|(__t1<<6)|__t2); \ + if( /* handle U+0800..U+FFFF inline */ \ + (0xe0<=(c) && (c)<0xf0) && \ + (((i)+1)<(length) || (length)<0) && \ + U8_IS_VALID_LEAD3_AND_T1((c), __t1=(s)[i]) && \ + (__t2=(s)[(i)+1]-0x80)<=0x3f) { \ + (c)=(((c)&0xf)<<12)|((__t1&0x3f)<<6)|__t2; \ (i)+=2; \ } else if( /* handle U+0080..U+07FF inline */ \ - ((c)<0xe0 && (c)>=0xc2) && \ - ((i)!=(length)) && \ - (__t1=(uint8_t)((s)[i]-0x80))<=0x3f \ - ) { \ + ((c)<0xe0 && (c)>=0xc2) && \ + ((i)!=(length)) && \ + (__t1=(s)[i]-0x80)<=0x3f) { \ (c)=(((c)&0x1f)<<6)|__t1; \ ++(i); \ } else { \ @@ -394,22 +398,19 @@ utf8_back1SafeBody(const uint8_t *s, int32_t start, int32_t i); */ #define U8_NEXT_OR_FFFD(s, i, length, c) { \ (c)=(uint8_t)(s)[(i)++]; \ - if((c)>=0x80) { \ + if(!U8_IS_SINGLE(c)) { \ uint8_t __t1, __t2; \ - if( /* handle U+1000..U+CFFF inline */ \ - (0xe0<(c) && (c)<=0xec) && \ - (((i)+1)<(length) || (length)<0) && \ - (__t1=(uint8_t)((s)[i]-0x80))<=0x3f && \ - (__t2=(uint8_t)((s)[(i)+1]-0x80))<= 0x3f \ - ) { \ - /* no need for (c&0xf) because the upper bits are truncated after <<12 in the cast to (UChar) */ \ - (c)=(UChar)(((c)<<12)|(__t1<<6)|__t2); \ + if( /* handle U+0800..U+FFFF inline */ \ + (0xe0<=(c) && (c)<0xf0) && \ + (((i)+1)<(length) || (length)<0) && \ + U8_IS_VALID_LEAD3_AND_T1((c), __t1=(s)[i]) && \ + (__t2=(s)[(i)+1]-0x80)<=0x3f) { \ + (c)=(((c)&0xf)<<12)|((__t1&0x3f)<<6)|__t2; \ (i)+=2; \ } else if( /* handle U+0080..U+07FF inline */ \ - ((c)<0xe0 && (c)>=0xc2) && \ - ((i)!=(length)) && \ - (__t1=(uint8_t)((s)[i]-0x80))<=0x3f \ - ) { \ + ((c)<0xe0 && (c)>=0xc2) && \ + ((i)!=(length)) && \ + (__t1=(s)[i]-0x80)<=0x3f) { \ (c)=(((c)&0x1f)<<6)|__t1; \ ++(i); \ } else { \ @@ -494,7 +495,7 @@ utf8_back1SafeBody(const uint8_t *s, int32_t start, int32_t i); * @stable ICU 2.4 */ #define U8_FWD_1_UNSAFE(s, i) { \ - (i)+=1+U8_COUNT_TRAIL_BYTES_UNSAFE((uint8_t)(s)[i]); \ + (i)+=1+U8_COUNT_TRAIL_BYTES_UNSAFE((s)[i]); \ } /** @@ -511,15 +512,24 @@ utf8_back1SafeBody(const uint8_t *s, int32_t start, int32_t i); * @stable ICU 2.4 */ #define U8_FWD_1(s, i, length) { \ - uint8_t __b=(uint8_t)(s)[(i)++]; \ - if(U8_IS_LEAD(__b)) { \ - uint8_t __count=U8_COUNT_TRAIL_BYTES(__b); \ - if((i)+__count>(length) && (length)>=0) { \ - __count=(uint8_t)((length)-(i)); \ - } \ - while(__count>0 && U8_IS_TRAIL((s)[i])) { \ - ++(i); \ - --__count; \ + uint8_t __b=(s)[(i)++]; \ + if(U8_IS_LEAD(__b) && (i)!=(length)) { \ + uint8_t __t1=(s)[i]; \ + if((0xe0<=__b && __b<0xf0)) { \ + if(U8_IS_VALID_LEAD3_AND_T1(__b, __t1) && \ + ++(i)!=(length) && U8_IS_TRAIL((s)[i])) { \ + ++(i); \ + } \ + } else if(__b<0xe0) { \ + if(U8_IS_TRAIL(__t1)) { \ + ++(i); \ + } \ + } else /* c>=0xf0 */ { \ + if(U8_IS_VALID_LEAD4_AND_T1(__b, __t1) && \ + ++(i)!=(length) && U8_IS_TRAIL((s)[i]) && \ + ++(i)!=(length) && U8_IS_TRAIL((s)[i])) { \ + ++(i); \ + } \ } \ } \ } @@ -633,7 +643,7 @@ utf8_back1SafeBody(const uint8_t *s, int32_t start, int32_t i); /* c is a trail byte */ \ (c)&=0x3f; \ for(;;) { \ - __b=(uint8_t)(s)[--(i)]; \ + __b=(s)[--(i)]; \ if(__b>=0xc0) { \ U8_MASK_LEAD_BYTE(__b, __count); \ (c)|=(UChar32)__b<<__shift; \ @@ -669,7 +679,7 @@ utf8_back1SafeBody(const uint8_t *s, int32_t start, int32_t i); */ #define U8_PREV(s, start, i, c) { \ (c)=(uint8_t)(s)[--(i)]; \ - if((c)>=0x80) { \ + if(!U8_IS_SINGLE(c)) { \ (c)=utf8_prevCharSafeBody((const uint8_t *)s, start, &(i), c, -1); \ } \ } @@ -700,7 +710,7 @@ utf8_back1SafeBody(const uint8_t *s, int32_t start, int32_t i); */ #define U8_PREV_OR_FFFD(s, start, i, c) { \ (c)=(uint8_t)(s)[--(i)]; \ - if((c)>=0x80) { \ + if(!U8_IS_SINGLE(c)) { \ (c)=utf8_prevCharSafeBody((const uint8_t *)s, start, &(i), c, -3); \ } \ } diff --git a/Build/source/libs/icu/icu-src/source/common/unicode/utf_old.h b/Build/source/libs/icu/icu-src/source/common/unicode/utf_old.h index c7d5145a231..55c17c01df6 100644 --- a/Build/source/libs/icu/icu-src/source/common/unicode/utf_old.h +++ b/Build/source/libs/icu/icu-src/source/common/unicode/utf_old.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* @@ -8,7 +8,7 @@ * ******************************************************************************* * file name: utf_old.h -* encoding: US-ASCII +* encoding: UTF-8 * tab size: 8 (not used) * indentation:4 * @@ -17,12 +17,12 @@ */ /** - * \file + * \file * \brief C API: Deprecated macros for Unicode string handling */ /** - * + * * The macros in utf_old.h are all deprecated and their use discouraged. * Some of the design principles behind the set of UTF macros * have changed or proved impractical. @@ -145,7 +145,22 @@ #ifndef __UTF_OLD_H__ #define __UTF_OLD_H__ -#ifndef U_HIDE_DEPRECATED_API +/** + * \def U_HIDE_OBSOLETE_UTF_OLD_H + * + * Hides the obsolete definitions in unicode/utf_old.h. + * Recommended to be set to 1 at compile time to make sure + * the long-deprecated macros are no longer used. + * + * For reasons for the deprecation see the utf_old.h file comments. + * + * @internal + */ +#ifndef U_HIDE_OBSOLETE_UTF_OLD_H +# define U_HIDE_OBSOLETE_UTF_OLD_H 0 +#endif + +#if !defined(U_HIDE_DEPRECATED_API) && !U_HIDE_OBSOLETE_UTF_OLD_H #include "unicode/utf.h" #include "unicode/utf8.h" @@ -267,6 +282,25 @@ typedef int32_t UTextOffset; /* Formerly utf8.h ---------------------------------------------------------- */ +/** +* \var utf8_countTrailBytes +* Internal array with numbers of trail bytes for any given byte used in +* lead byte position. +* +* This is internal since it is not meant to be called directly by external clients; +* however it is called by public macros in this file and thus must remain stable, +* and should not be hidden when other internal functions are hidden (otherwise +* public macros would fail to compile). +* @internal +*/ +#ifdef U_UTF8_IMPL +// No forward declaration if compiling utf_impl.cpp, which defines utf8_countTrailBytes. +#elif defined(U_STATIC_IMPLEMENTATION) || defined(U_COMMON_IMPLEMENTATION) +U_CFUNC const uint8_t utf8_countTrailBytes[]; +#else +U_CFUNC U_IMPORT const uint8_t utf8_countTrailBytes[]; /* U_IMPORT2? */ /*U_IMPORT*/ +#endif + /** * Count the trail bytes for a UTF-8 lead byte. * @deprecated ICU 2.4. Renamed to U8_COUNT_TRAIL_BYTES, see utf_old.h. @@ -1165,7 +1199,6 @@ typedef int32_t UTextOffset; */ #define UTF_SET_CHAR_LIMIT(s, start, i, length) U16_SET_CP_LIMIT(s, start, i, length) -#endif /* U_HIDE_DEPRECATED_API */ +#endif // !U_HIDE_DEPRECATED_API && !U_HIDE_OBSOLETE_UTF_OLD_H #endif - diff --git a/Build/source/libs/icu/icu-src/source/common/unicode/utrace.h b/Build/source/libs/icu/icu-src/source/common/unicode/utrace.h index c55f8c11233..6b4c4df9402 100644 --- a/Build/source/libs/icu/icu-src/source/common/unicode/utrace.h +++ b/Build/source/libs/icu/icu-src/source/common/unicode/utrace.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* @@ -8,7 +8,7 @@ * ******************************************************************************* * file name: utrace.h -* encoding: US-ASCII +* encoding: UTF-8 * tab size: 8 (not used) * indentation:4 * diff --git a/Build/source/libs/icu/icu-src/source/common/unicode/utypes.h b/Build/source/libs/icu/icu-src/source/common/unicode/utypes.h index 3d19c503839..d60450b5a56 100644 --- a/Build/source/libs/icu/icu-src/source/common/unicode/utypes.h +++ b/Build/source/libs/icu/icu-src/source/common/unicode/utypes.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** @@ -178,12 +178,12 @@ /** * \def NULL - * Define NULL if necessary, to 0 for C++ and to ((void *)0) for C. + * Define NULL if necessary, to nullptr for C++ and to ((void *)0) for C. * @stable ICU 2.0 */ #ifndef NULL #ifdef __cplusplus -#define NULL 0 +#define NULL nullptr #else #define NULL ((void *)0) #endif diff --git a/Build/source/libs/icu/icu-src/source/common/unicode/uvernum.h b/Build/source/libs/icu/icu-src/source/common/unicode/uvernum.h index 5590f9a5cc3..d905a0f50d1 100644 --- a/Build/source/libs/icu/icu-src/source/common/unicode/uvernum.h +++ b/Build/source/libs/icu/icu-src/source/common/unicode/uvernum.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* @@ -7,7 +7,7 @@ ******************************************************************************* * * file name: uvernum.h -* encoding: US-ASCII +* encoding: UTF-8 * tab size: 8 (not used) * indentation:4 * @@ -58,7 +58,7 @@ * This value will change in the subsequent releases of ICU * @stable ICU 2.4 */ -#define U_ICU_VERSION_MAJOR_NUM 58 +#define U_ICU_VERSION_MAJOR_NUM 60 /** The current ICU minor version as an integer. * This value will change in the subsequent releases of ICU @@ -84,7 +84,7 @@ * This value will change in the subsequent releases of ICU * @stable ICU 2.6 */ -#define U_ICU_VERSION_SUFFIX _58 +#define U_ICU_VERSION_SUFFIX _60 /** * \def U_DEF2_ICU_ENTRY_POINT_RENAME @@ -119,19 +119,19 @@ * This value will change in the subsequent releases of ICU * @stable ICU 2.4 */ -#define U_ICU_VERSION "58.2" +#define U_ICU_VERSION "60.2" /** The current ICU library major/minor version as a string without dots, for library name suffixes. * This value will change in the subsequent releases of ICU * @stable ICU 2.6 */ -#define U_ICU_VERSION_SHORT "58" +#define U_ICU_VERSION_SHORT "60" #ifndef U_HIDE_INTERNAL_API /** Data version in ICU4C. * @internal ICU 4.4 Internal Use Only **/ -#define U_ICU_DATA_VERSION "58.2" +#define U_ICU_DATA_VERSION "60.2" #endif /* U_HIDE_INTERNAL_API */ /*=========================================================================== diff --git a/Build/source/libs/icu/icu-src/source/common/unicode/uversion.h b/Build/source/libs/icu/icu-src/source/common/unicode/uversion.h index 3f8ad360f17..e24068d0f95 100644 --- a/Build/source/libs/icu/icu-src/source/common/unicode/uversion.h +++ b/Build/source/libs/icu/icu-src/source/common/unicode/uversion.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* @@ -7,7 +7,7 @@ ******************************************************************************* * * file name: uversion.h -* encoding: US-ASCII +* encoding: UTF-8 * tab size: 8 (not used) * indentation:4 * diff --git a/Build/source/libs/icu/icu-src/source/common/unifiedcache.cpp b/Build/source/libs/icu/icu-src/source/common/unifiedcache.cpp index 6e7156f8714..d0238825d11 100644 --- a/Build/source/libs/icu/icu-src/source/common/unifiedcache.cpp +++ b/Build/source/libs/icu/icu-src/source/common/unifiedcache.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ****************************************************************************** @@ -24,8 +24,8 @@ static UConditionVar gInProgressValueAddedCond = U_CONDITION_INITIALIZER; static icu::UInitOnce gCacheInitOnce = U_INITONCE_INITIALIZER; static const int32_t MAX_EVICT_ITERATIONS = 10; -static int32_t DEFAULT_MAX_UNUSED = 1000; -static int32_t DEFAULT_PERCENTAGE_OF_IN_USE = 100; +static const int32_t DEFAULT_MAX_UNUSED = 1000; +static const int32_t DEFAULT_PERCENTAGE_OF_IN_USE = 100; U_CDECL_BEGIN diff --git a/Build/source/libs/icu/icu-src/source/common/unifiedcache.h b/Build/source/libs/icu/icu-src/source/common/unifiedcache.h index 72b8a791313..957c0dbd73b 100644 --- a/Build/source/libs/icu/icu-src/source/common/unifiedcache.h +++ b/Build/source/libs/icu/icu-src/source/common/unifiedcache.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ****************************************************************************** @@ -107,7 +107,7 @@ class CacheKey : public CacheKeyBase { */ virtual int32_t hashCode() const { const char *s = typeid(T).name(); - return ustr_hashCharsN(s, uprv_strlen(s)); + return ustr_hashCharsN(s, static_cast(uprv_strlen(s))); } /** diff --git a/Build/source/libs/icu/icu-src/source/common/unifilt.cpp b/Build/source/libs/icu/icu-src/source/common/unifilt.cpp index 2d8ce355c75..4ab0d9b5f93 100644 --- a/Build/source/libs/icu/icu-src/source/common/unifilt.cpp +++ b/Build/source/libs/icu/icu-src/source/common/unifilt.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** diff --git a/Build/source/libs/icu/icu-src/source/common/unifunct.cpp b/Build/source/libs/icu/icu-src/source/common/unifunct.cpp index 8fdc638407d..f3995b298d2 100644 --- a/Build/source/libs/icu/icu-src/source/common/unifunct.cpp +++ b/Build/source/libs/icu/icu-src/source/common/unifunct.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** diff --git a/Build/source/libs/icu/icu-src/source/common/uniset.cpp b/Build/source/libs/icu/icu-src/source/common/uniset.cpp index 7866719a171..fe5a157aa6b 100644 --- a/Build/source/libs/icu/icu-src/source/common/uniset.cpp +++ b/Build/source/libs/icu/icu-src/source/common/uniset.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** diff --git a/Build/source/libs/icu/icu-src/source/common/uniset_closure.cpp b/Build/source/libs/icu/icu-src/source/common/uniset_closure.cpp index b6bc64f03c0..44bb4bcd05f 100644 --- a/Build/source/libs/icu/icu-src/source/common/uniset_closure.cpp +++ b/Build/source/libs/icu/icu-src/source/common/uniset_closure.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* @@ -8,7 +8,7 @@ * ******************************************************************************* * file name: uniset_closure.cpp -* encoding: US-ASCII +* encoding: UTF-8 * tab size: 8 (not used) * indentation:4 * @@ -184,7 +184,6 @@ UnicodeSet& UnicodeSet::closeOver(int32_t attribute) { return *this; } if (attribute & (USET_CASE_INSENSITIVE | USET_ADD_CASE_MAPPINGS)) { - const UCaseProps *csp = ucase_getSingleton(); { UnicodeSet foldSet(*this); UnicodeString str; @@ -207,7 +206,6 @@ UnicodeSet& UnicodeSet::closeOver(int32_t attribute) { int32_t n = getRangeCount(); UChar32 result; const UChar *full; - int32_t locCache = 0; for (int32_t i=0; isize(); ++j) { str = *(const UnicodeString *) strings->elementAt(j); str.foldCase(); - if(!ucase_addStringCaseClosure(csp, str.getBuffer(), str.length(), &sa)) { + if(!ucase_addStringCaseClosure(str.getBuffer(), str.length(), &sa)) { foldSet.add(str); // does not map to code points: add the folded string itself } } diff --git a/Build/source/libs/icu/icu-src/source/common/uniset_props.cpp b/Build/source/libs/icu/icu-src/source/common/uniset_props.cpp index ed31946849c..1c28a2d84c9 100644 --- a/Build/source/libs/icu/icu-src/source/common/uniset_props.cpp +++ b/Build/source/libs/icu/icu-src/source/common/uniset_props.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* @@ -8,7 +8,7 @@ * ******************************************************************************* * file name: uniset_props.cpp -* encoding: US-ASCII +* encoding: UTF-8 * tab size: 8 (not used) * indentation:4 * @@ -195,7 +195,7 @@ void U_CALLCONV UnicodeSet_initInclusion(int32_t src, UErrorCode &status) { if(U_SUCCESS(status)) { impl->addPropertyStarts(&sa, status); } - ucase_addPropertyStarts(ucase_getSingleton(), &sa, &status); + ucase_addPropertyStarts(&sa, &status); break; } case UPROPS_SRC_NFC: { @@ -228,7 +228,7 @@ void U_CALLCONV UnicodeSet_initInclusion(int32_t src, UErrorCode &status) { } #endif case UPROPS_SRC_CASE: - ucase_addPropertyStarts(ucase_getSingleton(), &sa, &status); + ucase_addPropertyStarts(&sa, &status); break; case UPROPS_SRC_BIDI: ubidi_addPropertyStarts(ubidi_getSingleton(), &sa, &status); @@ -987,7 +987,7 @@ UnicodeSet::applyPropertyAlias(const UnicodeString& prop, UProperty p; int32_t v; - UBool mustNotBeEmpty = FALSE, invert = FALSE; + UBool invert = FALSE; if (value.length() > 0) { p = u_getPropertyEnum(pname.data()); @@ -1009,14 +1009,15 @@ UnicodeSet::applyPropertyAlias(const UnicodeString& prop, p == UCHAR_LEAD_CANONICAL_COMBINING_CLASS) { char* end; double value = uprv_strtod(vname.data(), &end); - v = (int32_t) value; - if (v != value || v < 0 || *end != 0) { - // non-integral or negative value, or trailing junk + // Anything between 0 and 255 is valid even if unused. + // Cast double->int only after range check. + // We catch NaN here because comparing it with both 0 and 255 will be false + // (as are all comparisons with NaN). + if (*end != 0 || !(0 <= value && value <= 255) || + (v = (int32_t)value) != value) { + // non-integral value or outside 0..255, or trailing junk FAIL(ec); } - // If the resultant set is empty then the numeric value - // was invalid. - mustNotBeEmpty = TRUE; } else { FAIL(ec); } @@ -1115,12 +1116,6 @@ UnicodeSet::applyPropertyAlias(const UnicodeString& prop, complement(); } - if (U_SUCCESS(ec) && (mustNotBeEmpty && isEmpty())) { - // mustNotBeEmpty is set to true if an empty set indicates - // invalid input. - ec = U_ILLEGAL_ARGUMENT_ERROR; - } - if (isBogus() && U_SUCCESS(ec)) { // We likely ran out of memory. AHHH! ec = U_MEMORY_ALLOCATION_ERROR; diff --git a/Build/source/libs/icu/icu-src/source/common/unisetspan.cpp b/Build/source/libs/icu/icu-src/source/common/unisetspan.cpp index 2e77dfd548a..0a8893472f9 100644 --- a/Build/source/libs/icu/icu-src/source/common/unisetspan.cpp +++ b/Build/source/libs/icu/icu-src/source/common/unisetspan.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ****************************************************************************** @@ -8,7 +8,7 @@ * ****************************************************************************** * file name: unisetspan.cpp -* encoding: US-ASCII +* encoding: UTF-8 * tab size: 8 (not used) * indentation:4 * @@ -502,7 +502,7 @@ spanOneBack(const UnicodeSet &set, const UChar *s, int32_t length) { static inline int32_t spanOneUTF8(const UnicodeSet &set, const uint8_t *s, int32_t length) { UChar32 c=*s; - if((int8_t)c>=0) { + if(U8_IS_SINGLE(c)) { return set.contains(c) ? 1 : -1; } // Take advantage of non-ASCII fastpaths in U8_NEXT_OR_FFFD(). @@ -514,7 +514,7 @@ spanOneUTF8(const UnicodeSet &set, const uint8_t *s, int32_t length) { static inline int32_t spanOneBackUTF8(const UnicodeSet &set, const uint8_t *s, int32_t length) { UChar32 c=s[length-1]; - if((int8_t)c>=0) { + if(U8_IS_SINGLE(c)) { return set.contains(c) ? 1 : -1; } int32_t i=length-1; @@ -1006,11 +1006,9 @@ int32_t UnicodeSetStringSpan::spanUTF8(const uint8_t *s, int32_t length, USetSpa // Try to match if the increment is not listed already. // Match at code point boundaries. (The UTF-8 strings were converted // from UTF-16 and are guaranteed to be well-formed.) - if( !U8_IS_TRAIL(s[pos-overlap]) && - !offsets.containsOffset(inc) && - matches8(s+pos-overlap, s8, length8) - - ) { + if(!U8_IS_TRAIL(s[pos-overlap]) && + !offsets.containsOffset(inc) && + matches8(s+pos-overlap, s8, length8)) { if(inc==rest) { return length; // Reached the end of the string. } @@ -1052,11 +1050,10 @@ int32_t UnicodeSetStringSpan::spanUTF8(const uint8_t *s, int32_t length, USetSpa // Try to match if the string is longer or starts earlier. // Match at code point boundaries. (The UTF-8 strings were converted // from UTF-16 and are guaranteed to be well-formed.) - if( !U8_IS_TRAIL(s[pos-overlap]) && - (overlap>maxOverlap || /* redundant overlap==maxOverlap && */ inc>maxInc) && - matches8(s+pos-overlap, s8, length8) - - ) { + if(!U8_IS_TRAIL(s[pos-overlap]) && + (overlap>maxOverlap || + /* redundant overlap==maxOverlap && */ inc>maxInc) && + matches8(s+pos-overlap, s8, length8)) { maxInc=inc; // Longest match from earliest start. maxOverlap=overlap; break; diff --git a/Build/source/libs/icu/icu-src/source/common/unisetspan.h b/Build/source/libs/icu/icu-src/source/common/unisetspan.h index 36cdd98d044..f1e78ff3ee2 100644 --- a/Build/source/libs/icu/icu-src/source/common/unisetspan.h +++ b/Build/source/libs/icu/icu-src/source/common/unisetspan.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ****************************************************************************** @@ -8,7 +8,7 @@ * ****************************************************************************** * file name: unisetspan.h -* encoding: US-ASCII +* encoding: UTF-8 * tab size: 8 (not used) * indentation:4 * diff --git a/Build/source/libs/icu/icu-src/source/common/unistr.cpp b/Build/source/libs/icu/icu-src/source/common/unistr.cpp index bdd58ecd267..5d7cab2e155 100644 --- a/Build/source/libs/icu/icu-src/source/common/unistr.cpp +++ b/Build/source/libs/icu/icu-src/source/common/unistr.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ****************************************************************************** @@ -218,9 +218,10 @@ UnicodeString::UnicodeString(const UChar *text, } UnicodeString::UnicodeString(UBool isTerminated, - const UChar *text, + ConstChar16Ptr textPtr, int32_t textLength) { fUnion.fFields.fLengthAndFlags = kReadonlyAlias; + const UChar *text = textPtr; if(text == NULL) { // treat as an empty string, do not alias setToEmpty(); @@ -234,7 +235,8 @@ UnicodeString::UnicodeString(UBool isTerminated, // text is terminated, or else it would have failed the above test textLength = u_strlen(text); } - setArray((UChar *)text, textLength, isTerminated ? textLength + 1 : textLength); + setArray(const_cast(text), textLength, + isTerminated ? textLength + 1 : textLength); } } @@ -306,12 +308,10 @@ UnicodeString::UnicodeString(const UnicodeString& that) { copyFrom(that); } -#if U_HAVE_RVALUE_REFERENCES UnicodeString::UnicodeString(UnicodeString &&src) U_NOEXCEPT { fUnion.fFields.fLengthAndFlags = kShortString; moveFrom(src); } -#endif UnicodeString::UnicodeString(const UnicodeString& that, int32_t srcStart) { @@ -873,7 +873,7 @@ UnicodeString::doExtract(int32_t start, } int32_t -UnicodeString::extract(UChar *dest, int32_t destCapacity, +UnicodeString::extract(Char16Ptr dest, int32_t destCapacity, UErrorCode &errorCode) const { int32_t len = length(); if(U_SUCCESS(errorCode)) { @@ -1215,10 +1215,10 @@ UnicodeString::unBogus() { } } -const UChar * +const char16_t * UnicodeString::getTerminatedBuffer() { if(!isWritable()) { - return 0; + return nullptr; } UChar *array = getArrayStart(); int32_t len = length(); @@ -1249,14 +1249,14 @@ UnicodeString::getTerminatedBuffer() { array[len] = 0; return array; } else { - return NULL; + return nullptr; } } // setTo() analogous to the readonly-aliasing constructor with the same signature UnicodeString & UnicodeString::setTo(UBool isTerminated, - const UChar *text, + ConstChar16Ptr textPtr, int32_t textLength) { if(fUnion.fFields.fLengthAndFlags & kOpenGetBuffer) { @@ -1264,6 +1264,7 @@ UnicodeString::setTo(UBool isTerminated, return *this; } + const UChar *text = textPtr; if(text == NULL) { // treat as an empty string, do not alias releaseArray(); @@ -1713,14 +1714,14 @@ UnicodeString::doHashCode() const // External Buffer //======================================== -UChar * +char16_t * UnicodeString::getBuffer(int32_t minCapacity) { if(minCapacity>=-1 && cloneArrayIfNeeded(minCapacity)) { fUnion.fFields.fLengthAndFlags|=kOpenGetBuffer; setZeroLength(); return getArrayStart(); } else { - return 0; + return nullptr; } } diff --git a/Build/source/libs/icu/icu-src/source/common/unistr_case.cpp b/Build/source/libs/icu/icu-src/source/common/unistr_case.cpp index 1715b6ec66e..2138d60c01c 100644 --- a/Build/source/libs/icu/icu-src/source/common/unistr_case.cpp +++ b/Build/source/libs/icu/icu-src/source/common/unistr_case.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* @@ -8,7 +8,7 @@ * ******************************************************************************* * file name: unistr_case.cpp -* encoding: US-ASCII +* encoding: UTF-8 * tab size: 8 (not used) * indentation:2 * @@ -19,14 +19,18 @@ */ #include "unicode/utypes.h" +#include "unicode/brkiter.h" +#include "unicode/casemap.h" +#include "unicode/edits.h" #include "unicode/putil.h" #include "cstring.h" #include "cmemory.h" #include "unicode/ustring.h" #include "unicode/unistr.h" #include "unicode/uchar.h" +#include "uassert.h" +#include "ucasemap_imp.h" #include "uelement.h" -#include "ustr_imp.h" U_NAMESPACE_BEGIN @@ -87,56 +91,123 @@ UnicodeString::doCaseCompare(int32_t start, //======================================== UnicodeString & -UnicodeString::caseMap(const UCaseMap *csm, +UnicodeString::caseMap(int32_t caseLocale, uint32_t options, UCASEMAP_BREAK_ITERATOR_PARAM UStringCaseMapper *stringCaseMapper) { if(isEmpty() || !isWritable()) { // nothing to do return *this; } - // We need to allocate a new buffer for the internal string case mapping function. - // This is very similar to how doReplace() keeps the old array pointer - // and deletes the old array itself after it is done. - // In addition, we are forcing cloneArrayIfNeeded() to always allocate a new array. - UChar oldStackBuffer[US_STACKBUF_SIZE]; + UChar oldBuffer[2 * US_STACKBUF_SIZE]; UChar *oldArray; - int32_t oldLength; - - if(fUnion.fFields.fLengthAndFlags&kUsingStackBuffer) { - // copy the stack buffer contents because it will be overwritten - oldArray = oldStackBuffer; - oldLength = getShortLength(); - u_memcpy(oldStackBuffer, fUnion.fStackFields.fBuffer, oldLength); + int32_t oldLength = length(); + int32_t newLength; + UBool writable = isBufferWritable(); + UErrorCode errorCode = U_ZERO_ERROR; + +#if !UCONFIG_NO_BREAK_ITERATION + // Read-only alias to the original string contents for the titlecasing BreakIterator. + // We cannot set the iterator simply to *this because *this is being modified. + UnicodeString oldString; +#endif + + // Try to avoid heap-allocating a new character array for this string. + if (writable ? oldLength <= UPRV_LENGTHOF(oldBuffer) : oldLength < US_STACKBUF_SIZE) { + // Short string: Copy the contents into a temporary buffer and + // case-map back into the current array, or into the stack buffer. + UChar *buffer = getArrayStart(); + int32_t capacity; + oldArray = oldBuffer; + u_memcpy(oldBuffer, buffer, oldLength); + if (writable) { + capacity = getCapacity(); + } else { + // Switch from the read-only alias or shared heap buffer to the stack buffer. + if (!cloneArrayIfNeeded(US_STACKBUF_SIZE, US_STACKBUF_SIZE, /* doCopyArray= */ FALSE)) { + return *this; + } + U_ASSERT(fUnion.fFields.fLengthAndFlags & kUsingStackBuffer); + buffer = fUnion.fStackFields.fBuffer; + capacity = US_STACKBUF_SIZE; + } +#if !UCONFIG_NO_BREAK_ITERATION + if (iter != nullptr) { + oldString.setTo(FALSE, oldArray, oldLength); + iter->setText(oldString); + } +#endif + newLength = stringCaseMapper(caseLocale, options, UCASEMAP_BREAK_ITERATOR + buffer, capacity, + oldArray, oldLength, NULL, errorCode); + if (U_SUCCESS(errorCode)) { + setLength(newLength); + return *this; + } else if (errorCode == U_BUFFER_OVERFLOW_ERROR) { + // common overflow handling below + } else { + setToBogus(); + return *this; + } } else { + // Longer string or read-only buffer: + // Collect only changes and then apply them to this string. + // Case mapping often changes only small parts of a string, + // and often does not change its length. oldArray = getArrayStart(); - oldLength = length(); + Edits edits; + UChar replacementChars[200]; +#if !UCONFIG_NO_BREAK_ITERATION + if (iter != nullptr) { + oldString.setTo(FALSE, oldArray, oldLength); + iter->setText(oldString); + } +#endif + stringCaseMapper(caseLocale, options | U_OMIT_UNCHANGED_TEXT, UCASEMAP_BREAK_ITERATOR + replacementChars, UPRV_LENGTHOF(replacementChars), + oldArray, oldLength, &edits, errorCode); + if (U_SUCCESS(errorCode)) { + // Grow the buffer at most once, not for multiple doReplace() calls. + newLength = oldLength + edits.lengthDelta(); + if (newLength > oldLength && !cloneArrayIfNeeded(newLength, newLength)) { + return *this; + } + for (Edits::Iterator ei = edits.getCoarseChangesIterator(); ei.next(errorCode);) { + doReplace(ei.destinationIndex(), ei.oldLength(), + replacementChars, ei.replacementIndex(), ei.newLength()); + } + if (U_FAILURE(errorCode)) { + setToBogus(); + } + return *this; + } else if (errorCode == U_BUFFER_OVERFLOW_ERROR) { + // common overflow handling below + newLength = oldLength + edits.lengthDelta(); + } else { + setToBogus(); + return *this; + } } - int32_t capacity; - if(oldLength <= US_STACKBUF_SIZE) { - capacity = US_STACKBUF_SIZE; - } else { - capacity = oldLength + 20; - } + // Handle buffer overflow, newLength is known. + // We need to allocate a new buffer for the internal string case mapping function. + // This is very similar to how doReplace() keeps the old array pointer + // and deletes the old array itself after it is done. + // In addition, we are forcing cloneArrayIfNeeded() to always allocate a new array. int32_t *bufferToDelete = 0; - if(!cloneArrayIfNeeded(capacity, capacity, FALSE, &bufferToDelete, TRUE)) { + if (!cloneArrayIfNeeded(newLength, newLength, FALSE, &bufferToDelete, TRUE)) { return *this; } - - // Case-map, and if the result is too long, then reallocate and repeat. - UErrorCode errorCode; - int32_t newLength; - do { - errorCode = U_ZERO_ERROR; - newLength = stringCaseMapper(csm, getArrayStart(), getCapacity(), - oldArray, oldLength, &errorCode); - setLength(newLength); - } while(errorCode==U_BUFFER_OVERFLOW_ERROR && cloneArrayIfNeeded(newLength, newLength, FALSE)); - + errorCode = U_ZERO_ERROR; + // No need to iter->setText() again: The case mapper restarts via iter->first(). + newLength = stringCaseMapper(caseLocale, options, UCASEMAP_BREAK_ITERATOR + getArrayStart(), getCapacity(), + oldArray, oldLength, NULL, errorCode); if (bufferToDelete) { uprv_free(bufferToDelete); } - if(U_FAILURE(errorCode)) { + if (U_SUCCESS(errorCode)) { + setLength(newLength); + } else { setToBogus(); } return *this; @@ -144,10 +215,7 @@ UnicodeString::caseMap(const UCaseMap *csm, UnicodeString & UnicodeString::foldCase(uint32_t options) { - UCaseMap csm=UCASEMAP_INITIALIZER; - csm.csp=ucase_getSingleton(); - csm.options=options; - return caseMap(&csm, ustrcase_internalFold); + return caseMap(UCASE_LOC_ROOT, options, UCASEMAP_BREAK_ITERATOR_NULL ustrcase_internalFold); } U_NAMESPACE_END diff --git a/Build/source/libs/icu/icu-src/source/common/unistr_case_locale.cpp b/Build/source/libs/icu/icu-src/source/common/unistr_case_locale.cpp index a01be5c30b3..f0f3048d06f 100644 --- a/Build/source/libs/icu/icu-src/source/common/unistr_case_locale.cpp +++ b/Build/source/libs/icu/icu-src/source/common/unistr_case_locale.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* @@ -6,7 +6,7 @@ * Corporation and others. All Rights Reserved. ******************************************************************************* * file name: unistr_case_locale.cpp -* encoding: US-ASCII +* encoding: UTF-8 * tab size: 8 (not used) * indentation:4 * @@ -19,9 +19,9 @@ #include "unicode/utypes.h" #include "unicode/locid.h" +#include "unicode/ucasemap.h" #include "unicode/unistr.h" -#include "cmemory.h" -#include "ustr_imp.h" +#include "ucasemap_imp.h" U_NAMESPACE_BEGIN @@ -29,44 +29,28 @@ U_NAMESPACE_BEGIN // Write implementation //======================================== -/* - * Set parameters on an empty UCaseMap, for UCaseMap-less API functions. - * Do this fast because it is called with every function call. - */ -static inline void -setTempCaseMap(UCaseMap *csm, const char *locale) { - if(csm->csp==NULL) { - csm->csp=ucase_getSingleton(); - } - if(locale!=NULL && locale[0]==0) { - csm->locale[0]=0; - } else { - ustrcase_setTempCaseMapLocale(csm, locale); - } -} - UnicodeString & UnicodeString::toLower() { - return toLower(Locale::getDefault()); + return caseMap(ustrcase_getCaseLocale(NULL), 0, + UCASEMAP_BREAK_ITERATOR_NULL ustrcase_internalToLower); } UnicodeString & UnicodeString::toLower(const Locale &locale) { - UCaseMap csm=UCASEMAP_INITIALIZER; - setTempCaseMap(&csm, locale.getName()); - return caseMap(&csm, ustrcase_internalToLower); + return caseMap(ustrcase_getCaseLocale(locale.getBaseName()), 0, + UCASEMAP_BREAK_ITERATOR_NULL ustrcase_internalToLower); } UnicodeString & UnicodeString::toUpper() { - return toUpper(Locale::getDefault()); + return caseMap(ustrcase_getCaseLocale(NULL), 0, + UCASEMAP_BREAK_ITERATOR_NULL ustrcase_internalToUpper); } UnicodeString & UnicodeString::toUpper(const Locale &locale) { - UCaseMap csm=UCASEMAP_INITIALIZER; - setTempCaseMap(&csm, locale.getName()); - return caseMap(&csm, ustrcase_internalToUpper); + return caseMap(ustrcase_getCaseLocale(locale.getBaseName()), 0, + UCASEMAP_BREAK_ITERATOR_NULL ustrcase_internalToUpper); } U_NAMESPACE_END diff --git a/Build/source/libs/icu/icu-src/source/common/unistr_cnv.cpp b/Build/source/libs/icu/icu-src/source/common/unistr_cnv.cpp index a9b44ee424c..64d3c16801c 100644 --- a/Build/source/libs/icu/icu-src/source/common/unistr_cnv.cpp +++ b/Build/source/libs/icu/icu-src/source/common/unistr_cnv.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* @@ -8,7 +8,7 @@ * ******************************************************************************* * file name: unistr_cnv.cpp -* encoding: US-ASCII +* encoding: UTF-8 * tab size: 8 (not used) * indentation:2 * diff --git a/Build/source/libs/icu/icu-src/source/common/unistr_props.cpp b/Build/source/libs/icu/icu-src/source/common/unistr_props.cpp index f0997790667..40064757902 100644 --- a/Build/source/libs/icu/icu-src/source/common/unistr_props.cpp +++ b/Build/source/libs/icu/icu-src/source/common/unistr_props.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* @@ -8,7 +8,7 @@ * ******************************************************************************* * file name: unistr_props.cpp -* encoding: US-ASCII +* encoding: UTF-8 * tab size: 8 (not used) * indentation:2 * diff --git a/Build/source/libs/icu/icu-src/source/common/unistr_titlecase_brkiter.cpp b/Build/source/libs/icu/icu-src/source/common/unistr_titlecase_brkiter.cpp index 3d6737cfc5e..4969884b0dc 100644 --- a/Build/source/libs/icu/icu-src/source/common/unistr_titlecase_brkiter.cpp +++ b/Build/source/libs/icu/icu-src/source/common/unistr_titlecase_brkiter.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* @@ -6,7 +6,7 @@ * Corporation and others. All Rights Reserved. ******************************************************************************* * file name: unistr_titlecase_brkiter.cpp -* encoding: US-ASCII +* encoding: UTF-8 * tab size: 8 (not used) * indentation:2 * @@ -22,69 +22,34 @@ #if !UCONFIG_NO_BREAK_ITERATION #include "unicode/brkiter.h" -#include "unicode/ubrk.h" +#include "unicode/locid.h" +#include "unicode/ucasemap.h" #include "unicode/unistr.h" -#include "unicode/ustring.h" -#include "cmemory.h" -#include "ustr_imp.h" - -static int32_t U_CALLCONV -unistr_case_internalToTitle(const UCaseMap *csm, - UChar *dest, int32_t destCapacity, - const UChar *src, int32_t srcLength, - UErrorCode *pErrorCode) { - ubrk_setText(csm->iter, src, srcLength, pErrorCode); - return ustrcase_internalToTitle(csm, dest, destCapacity, src, srcLength, pErrorCode); -} - -/* - * Set parameters on an empty UCaseMap, for UCaseMap-less API functions. - * Do this fast because it is called with every function call. - */ -static inline void -setTempCaseMap(UCaseMap *csm, const char *locale) { - if(csm->csp==NULL) { - csm->csp=ucase_getSingleton(); - } - if(locale!=NULL && locale[0]==0) { - csm->locale[0]=0; - } else { - ustrcase_setTempCaseMapLocale(csm, locale); - } -} +#include "ucasemap_imp.h" U_NAMESPACE_BEGIN UnicodeString & -UnicodeString::toTitle(BreakIterator *titleIter) { - return toTitle(titleIter, Locale::getDefault(), 0); +UnicodeString::toTitle(BreakIterator *iter) { + return toTitle(iter, Locale::getDefault(), 0); } UnicodeString & -UnicodeString::toTitle(BreakIterator *titleIter, const Locale &locale) { - return toTitle(titleIter, locale, 0); +UnicodeString::toTitle(BreakIterator *iter, const Locale &locale) { + return toTitle(iter, locale, 0); } UnicodeString & -UnicodeString::toTitle(BreakIterator *titleIter, const Locale &locale, uint32_t options) { - UCaseMap csm=UCASEMAP_INITIALIZER; - csm.options=options; - setTempCaseMap(&csm, locale.getName()); - BreakIterator *bi=titleIter; - if(bi==NULL) { - UErrorCode errorCode=U_ZERO_ERROR; - bi=BreakIterator::createWordInstance(locale, errorCode); - if(U_FAILURE(errorCode)) { - setToBogus(); - return *this; +UnicodeString::toTitle(BreakIterator *iter, const Locale &locale, uint32_t options) { + LocalPointer ownedIter; + UErrorCode errorCode = U_ZERO_ERROR; + iter = ustrcase_getTitleBreakIterator(&locale, "", options, iter, ownedIter, errorCode); + if (iter == nullptr) { + setToBogus(); + return *this; } - } - csm.iter=reinterpret_cast(bi); - caseMap(&csm, unistr_case_internalToTitle); - if(titleIter==NULL) { - delete bi; - } - return *this; + caseMap(ustrcase_getCaseLocale(locale.getBaseName()), options, iter, ustrcase_internalToTitle); + return *this; } U_NAMESPACE_END diff --git a/Build/source/libs/icu/icu-src/source/common/unistrappender.h b/Build/source/libs/icu/icu-src/source/common/unistrappender.h index 330f3a5f987..75fcb9e775f 100644 --- a/Build/source/libs/icu/icu-src/source/common/unistrappender.h +++ b/Build/source/libs/icu/icu-src/source/common/unistrappender.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ****************************************************************************** diff --git a/Build/source/libs/icu/icu-src/source/common/unorm.cpp b/Build/source/libs/icu/icu-src/source/common/unorm.cpp index a9df6d2cb22..2d9f46052ff 100644 --- a/Build/source/libs/icu/icu-src/source/common/unorm.cpp +++ b/Build/source/libs/icu/icu-src/source/common/unorm.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ****************************************************************************** diff --git a/Build/source/libs/icu/icu-src/source/common/unormcmp.cpp b/Build/source/libs/icu/icu-src/source/common/unormcmp.cpp index b40a10a1385..689b0b53b2d 100644 --- a/Build/source/libs/icu/icu-src/source/common/unormcmp.cpp +++ b/Build/source/libs/icu/icu-src/source/common/unormcmp.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* @@ -8,7 +8,7 @@ * ******************************************************************************* * file name: unormcmp.cpp -* encoding: US-ASCII +* encoding: UTF-8 * tab size: 8 (not used) * indentation:4 * @@ -145,7 +145,6 @@ unorm_cmpEquivFold(const UChar *s1, int32_t length1, uint32_t options, UErrorCode *pErrorCode) { const Normalizer2Impl *nfcImpl; - const UCaseProps *csp; /* current-level start/limit - s1/s2 as current */ const UChar *start1, *start2, *limit1, *limit2; @@ -183,11 +182,6 @@ unorm_cmpEquivFold(const UChar *s1, int32_t length1, } else { nfcImpl=NULL; } - if((options&U_COMPARE_IGNORE_CASE)!=0) { - csp=ucase_getSingleton(); - } else { - csp=NULL; - } if(U_FAILURE(*pErrorCode)) { return 0; } @@ -319,7 +313,7 @@ unorm_cmpEquivFold(const UChar *s1, int32_t length1, */ if( level1==0 && (options&U_COMPARE_IGNORE_CASE) && - (length=ucase_toFullFolding(csp, (UChar32)cp1, &p, options))>=0 + (length=ucase_toFullFolding((UChar32)cp1, &p, options))>=0 ) { /* cp1 case-folds to the code point "length" or to p[length] */ if(U_IS_SURROGATE(c1)) { @@ -364,7 +358,7 @@ unorm_cmpEquivFold(const UChar *s1, int32_t length1, } if( level2==0 && (options&U_COMPARE_IGNORE_CASE) && - (length=ucase_toFullFolding(csp, (UChar32)cp2, &p, options))>=0 + (length=ucase_toFullFolding((UChar32)cp2, &p, options))>=0 ) { /* cp2 case-folds to the code point "length" or to p[length] */ if(U_IS_SURROGATE(c2)) { diff --git a/Build/source/libs/icu/icu-src/source/common/unormimp.h b/Build/source/libs/icu/icu-src/source/common/unormimp.h index cd1d9a86acb..88c7975cc4e 100644 --- a/Build/source/libs/icu/icu-src/source/common/unormimp.h +++ b/Build/source/libs/icu/icu-src/source/common/unormimp.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* @@ -8,7 +8,7 @@ * ******************************************************************************* * file name: unormimp.h -* encoding: US-ASCII +* encoding: UTF-8 * tab size: 8 (not used) * indentation:4 * diff --git a/Build/source/libs/icu/icu-src/source/common/uobject.cpp b/Build/source/libs/icu/icu-src/source/common/uobject.cpp index 37406e4a0dc..1133dd9b67a 100644 --- a/Build/source/libs/icu/icu-src/source/common/uobject.cpp +++ b/Build/source/libs/icu/icu-src/source/common/uobject.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ****************************************************************************** @@ -8,7 +8,7 @@ * ****************************************************************************** * file name: uobject.h -* encoding: US-ASCII +* encoding: UTF-8 * tab size: 8 (not used) * indentation:4 * diff --git a/Build/source/libs/icu/icu-src/source/common/uposixdefs.h b/Build/source/libs/icu/icu-src/source/common/uposixdefs.h index 9ab307c6ee3..9acd3ba264a 100644 --- a/Build/source/libs/icu/icu-src/source/common/uposixdefs.h +++ b/Build/source/libs/icu/icu-src/source/common/uposixdefs.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* @@ -6,7 +6,7 @@ * Corporation and others. All Rights Reserved. ******************************************************************************* * file name: uposixdefs.h -* encoding: US-ASCII +* encoding: UTF-8 * tab size: 8 (not used) * indentation:4 * @@ -57,22 +57,18 @@ * * z/OS needs this definition for timeval and to get usleep. */ -#if !defined(_XOPEN_SOURCE_EXTENDED) && !defined(__sun) +#if !defined(_XOPEN_SOURCE_EXTENDED) && defined(__TOS_MVS__) && !defined(sun) # define _XOPEN_SOURCE_EXTENDED 1 #endif -/* - * There is an issue with turning on _XOPEN_SOURCE_EXTENDED on certain platforms. - * A compatibility issue exists between turning on _XOPEN_SOURCE_EXTENDED and using - * standard C++ string class. As a result, standard C++ string class needs to be - * turned off for the follwing platforms: - * -AIX/VACPP - * -Solaris/GCC +/** + * Solaris says: + * "...it is invalid to compile an XPG6 or a POSIX.1-2001 application with anything other + * than a c99 or later compiler." + * Apparently C++11 is not "or later". Work around this. */ -#if (U_PLATFORM == U_PF_AIX && !defined(__GNUC__)) || (U_PLATFORM == U_PF_SOLARIS && defined(__GNUC__)) -# if _XOPEN_SOURCE_EXTENDED && !defined(U_HAVE_STD_STRING) -# define U_HAVE_STD_STRING 0 -# endif +#if defined(__cplusplus) && (defined(sun) || defined(__sun)) && !defined (_STDC_C99) +# define _STDC_C99 #endif #endif /* __UPOSIXDEFS_H__ */ diff --git a/Build/source/libs/icu/icu-src/source/common/uprops.cpp b/Build/source/libs/icu/icu-src/source/common/uprops.cpp index 46ceb66d8cf..ace3c4d6d04 100644 --- a/Build/source/libs/icu/icu-src/source/common/uprops.cpp +++ b/Build/source/libs/icu/icu-src/source/common/uprops.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* @@ -8,7 +8,7 @@ * ******************************************************************************* * file name: uprops.cpp -* encoding: US-ASCII +* encoding: UTF-8 * tab size: 8 (not used) * indentation:4 * @@ -128,9 +128,8 @@ static UBool changesWhenCasefolded(const BinaryProperty &/*prop*/, UChar32 c, UP } if(c>=0) { /* single code point */ - const UCaseProps *csp=ucase_getSingleton(); const UChar *resultString; - return (UBool)(ucase_toFullFolding(csp, c, &resultString, U_FOLD_CASE_DEFAULT)>=0); + return (UBool)(ucase_toFullFolding(c, &resultString, U_FOLD_CASE_DEFAULT)>=0); } else { /* guess some large but stack-friendly capacity */ UChar dest[2*UCASE_MAX_STRING_LENGTH]; @@ -207,6 +206,11 @@ static UBool isPOSIX_xdigit(const BinaryProperty &/*prop*/, UChar32 c, UProperty return u_isxdigit(c); } +static UBool isRegionalIndicator(const BinaryProperty &/*prop*/, UChar32 c, UProperty /*which*/) { + // Property starts are a subset of lb=RI etc. + return 0x1F1E6<=c && c<=0x1F1FF; +} + static const BinaryProperty binProps[UCHAR_BINARY_LIMIT]={ /* * column and mask values for binary properties from u_getUnicodeProperties(). @@ -277,6 +281,9 @@ static const BinaryProperty binProps[UCHAR_BINARY_LIMIT]={ { 2, U_MASK(UPROPS_2_EMOJI_PRESENTATION), defaultContains }, { 2, U_MASK(UPROPS_2_EMOJI_MODIFIER), defaultContains }, { 2, U_MASK(UPROPS_2_EMOJI_MODIFIER_BASE), defaultContains }, + { 2, U_MASK(UPROPS_2_EMOJI_COMPONENT), defaultContains }, + { 2, 0, isRegionalIndicator }, + { 1, U_MASK(UPROPS_PREPENDED_CONCATENATION_MARK), defaultContains }, }; U_CAPI UBool U_EXPORT2 @@ -576,14 +583,13 @@ u_getFC_NFKC_Closure(UChar32 c, UChar *dest, int32_t destCapacity, UErrorCode *p // case folding and NFKC.) // For the derivation, see Unicode's DerivedNormalizationProps.txt. const Normalizer2 *nfkc=Normalizer2::getNFKCInstance(*pErrorCode); - const UCaseProps *csp=ucase_getSingleton(); if(U_FAILURE(*pErrorCode)) { return 0; } // first: b = NFKC(Fold(a)) UnicodeString folded1String; const UChar *folded1; - int32_t folded1Length=ucase_toFullFolding(csp, c, &folded1, U_FOLD_CASE_DEFAULT); + int32_t folded1Length=ucase_toFullFolding(c, &folded1, U_FOLD_CASE_DEFAULT); if(folded1Length<0) { const Normalizer2Impl *nfkcImpl=Normalizer2Factory::getImpl(nfkc); if(nfkcImpl->getCompQuickCheck(nfkcImpl->getNorm16(c))!=UNORM_NO) { diff --git a/Build/source/libs/icu/icu-src/source/common/uprops.h b/Build/source/libs/icu/icu-src/source/common/uprops.h index 63c588088ad..6f67756cd91 100644 --- a/Build/source/libs/icu/icu-src/source/common/uprops.h +++ b/Build/source/libs/icu/icu-src/source/common/uprops.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* @@ -8,7 +8,7 @@ * ******************************************************************************* * file name: uprops.h -* encoding: US-ASCII +* encoding: UTF-8 * tab size: 8 (not used) * indentation:4 * @@ -189,15 +189,15 @@ enum { UPROPS_VARIATION_SELECTOR, UPROPS_PATTERN_SYNTAX, /* new in ICU 3.4 and Unicode 4.1 */ UPROPS_PATTERN_WHITE_SPACE, - UPROPS_RESERVED, /* reserved & unused */ + UPROPS_PREPENDED_CONCATENATION_MARK, // new in ICU 60 and Unicode 10 UPROPS_BINARY_1_TOP /* ==32 - full! */ }; /* * Properties in vector word 2 * Bits - * 31..28 http://www.unicode.org/reports/tr51/#Emoji_Properties - * 27..26 reserved + * 31..27 http://www.unicode.org/reports/tr51/#Emoji_Properties + * 26 reserved * 25..20 Line Break * 19..15 Sentence Break * 14..10 Word Break @@ -205,7 +205,8 @@ enum { * 4.. 0 Decomposition Type */ enum { - UPROPS_2_EMOJI=28, + UPROPS_2_EMOJI_COMPONENT=27, + UPROPS_2_EMOJI, UPROPS_2_EMOJI_PRESENTATION, UPROPS_2_EMOJI_MODIFIER, UPROPS_2_EMOJI_MODIFIER_BASE diff --git a/Build/source/libs/icu/icu-src/source/common/ures_cnv.c b/Build/source/libs/icu/icu-src/source/common/ures_cnv.c deleted file mode 100644 index 58c6cd0746f..00000000000 --- a/Build/source/libs/icu/icu-src/source/common/ures_cnv.c +++ /dev/null @@ -1,78 +0,0 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. -// License & terms of use: http://www.unicode.org/copyright.html -/* -******************************************************************************* -* -* Copyright (C) 1997-2006, International Business Machines -* Corporation and others. All Rights Reserved. -* -******************************************************************************* -* file name: ures_cnv.c -* encoding: US-ASCII -* tab size: 8 (not used) -* indentation:4 -* -* created on: 2004aug25 -* created by: Markus W. Scherer -* -* Character conversion functions moved here from uresbund.c -*/ - -#include "unicode/utypes.h" -#include "unicode/putil.h" -#include "unicode/ustring.h" -#include "unicode/ucnv.h" -#include "unicode/ures.h" -#include "uinvchar.h" -#include "ustr_cnv.h" - -U_CAPI UResourceBundle * U_EXPORT2 -ures_openU(const UChar *myPath, - const char *localeID, - UErrorCode *status) -{ - char pathBuffer[1024]; - int32_t length; - char *path = pathBuffer; - - if(status==NULL || U_FAILURE(*status)) { - return NULL; - } - if(myPath==NULL) { - path = NULL; - } - else { - length=u_strlen(myPath); - if(length>=sizeof(pathBuffer)) { - *status=U_ILLEGAL_ARGUMENT_ERROR; - return NULL; - } else if(uprv_isInvariantUString(myPath, length)) { - /* - * the invariant converter is sufficient for package and tree names - * and is more efficient - */ - u_UCharsToChars(myPath, path, length+1); /* length+1 to include the NUL */ - } else { -#if !UCONFIG_NO_CONVERSION - /* use the default converter to support variant-character paths */ - UConverter *cnv=u_getDefaultConverter(status); - length=ucnv_fromUChars(cnv, path, (int32_t)sizeof(pathBuffer), myPath, length, status); - u_releaseDefaultConverter(cnv); - if(U_FAILURE(*status)) { - return NULL; - } - if(length>=sizeof(pathBuffer)) { - /* not NUL-terminated - path too long */ - *status=U_ILLEGAL_ARGUMENT_ERROR; - return NULL; - } -#else - /* the default converter is not available */ - *status=U_UNSUPPORTED_ERROR; - return NULL; -#endif - } - } - - return ures_open(path, localeID, status); -} diff --git a/Build/source/libs/icu/icu-src/source/common/ures_cnv.cpp b/Build/source/libs/icu/icu-src/source/common/ures_cnv.cpp new file mode 100644 index 00000000000..1aa58e753ce --- /dev/null +++ b/Build/source/libs/icu/icu-src/source/common/ures_cnv.cpp @@ -0,0 +1,78 @@ +// © 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html +/* +******************************************************************************* +* +* Copyright (C) 1997-2006, International Business Machines +* Corporation and others. All Rights Reserved. +* +******************************************************************************* +* file name: ures_cnv.c +* encoding: UTF-8 +* tab size: 8 (not used) +* indentation:4 +* +* created on: 2004aug25 +* created by: Markus W. Scherer +* +* Character conversion functions moved here from uresbund.c +*/ + +#include "unicode/utypes.h" +#include "unicode/putil.h" +#include "unicode/ustring.h" +#include "unicode/ucnv.h" +#include "unicode/ures.h" +#include "uinvchar.h" +#include "ustr_cnv.h" + +U_CAPI UResourceBundle * U_EXPORT2 +ures_openU(const UChar *myPath, + const char *localeID, + UErrorCode *status) +{ + char pathBuffer[1024]; + int32_t length; + char *path = pathBuffer; + + if(status==NULL || U_FAILURE(*status)) { + return NULL; + } + if(myPath==NULL) { + path = NULL; + } + else { + length=u_strlen(myPath); + if(length>=(int32_t)sizeof(pathBuffer)) { + *status=U_ILLEGAL_ARGUMENT_ERROR; + return NULL; + } else if(uprv_isInvariantUString(myPath, length)) { + /* + * the invariant converter is sufficient for package and tree names + * and is more efficient + */ + u_UCharsToChars(myPath, path, length+1); /* length+1 to include the NUL */ + } else { +#if !UCONFIG_NO_CONVERSION + /* use the default converter to support variant-character paths */ + UConverter *cnv=u_getDefaultConverter(status); + length=ucnv_fromUChars(cnv, path, (int32_t)sizeof(pathBuffer), myPath, length, status); + u_releaseDefaultConverter(cnv); + if(U_FAILURE(*status)) { + return NULL; + } + if(length>=(int32_t)sizeof(pathBuffer)) { + /* not NUL-terminated - path too long */ + *status=U_ILLEGAL_ARGUMENT_ERROR; + return NULL; + } +#else + /* the default converter is not available */ + *status=U_UNSUPPORTED_ERROR; + return NULL; +#endif + } + } + + return ures_open(path, localeID, status); +} diff --git a/Build/source/libs/icu/icu-src/source/common/uresbund.cpp b/Build/source/libs/icu/icu-src/source/common/uresbund.cpp index a32bfd132fe..c51f7fdb64c 100644 --- a/Build/source/libs/icu/icu-src/source/common/uresbund.cpp +++ b/Build/source/libs/icu/icu-src/source/common/uresbund.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ****************************************************************************** @@ -1083,6 +1083,7 @@ static UResourceBundle *init_resb_result(const ResourceData *rdata, Resource r, pathBuf = (char *)uprv_malloc((uprv_strlen(keyPath)+1)*sizeof(char)); if(pathBuf == NULL) { *status = U_MEMORY_ALLOCATION_ERROR; + ures_close(mainRes); return NULL; } } diff --git a/Build/source/libs/icu/icu-src/source/common/uresdata.cpp b/Build/source/libs/icu/icu-src/source/common/uresdata.cpp index 44654dcf579..8bcb9ab8b88 100644 --- a/Build/source/libs/icu/icu-src/source/common/uresdata.cpp +++ b/Build/source/libs/icu/icu-src/source/common/uresdata.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* @@ -6,7 +6,7 @@ * and others. All Rights Reserved. ******************************************************************************* * file name: uresdata.cpp -* encoding: US-ASCII +* encoding: UTF-8 * tab size: 8 (not used) * indentation:4 * @@ -758,7 +758,9 @@ res_getTableItemByIndex(const ResourceData *pResData, Resource table, int32_t indexR, const char **key) { uint32_t offset=RES_GET_OFFSET(table); int32_t length; - U_ASSERT(indexR>=0); /* to ensure the index is not negative */ + if (indexR < 0) { + return RES_BOGUS; + } switch(RES_GET_TYPE(table)) { case URES_TABLE: { if (offset != 0) { /* empty if offset==0 */ @@ -836,7 +838,9 @@ UBool icu::ResourceTable::getKeyAndValue(int32_t i, U_CAPI Resource U_EXPORT2 res_getArrayItem(const ResourceData *pResData, Resource array, int32_t indexR) { uint32_t offset=RES_GET_OFFSET(array); - U_ASSERT(indexR>=0); /* to ensure the index is not negative */ + if (indexR < 0) { + return RES_BOGUS; + } switch(RES_GET_TYPE(array)) { case URES_ARRAY: { if (offset!=0) { /* empty if offset==0 */ @@ -923,14 +927,14 @@ res_findResource(const ResourceData *pResData, Resource r, char** path, const ch if(t2 == RES_BOGUS) { /* if we fail to get the resource by key, maybe we got an index */ indexR = uprv_strtol(pathP, &closeIndex, 10); - if(*closeIndex == 0) { + if(indexR >= 0 && *closeIndex == 0) { /* if we indeed have an index, try to get the item by index */ t2 = res_getTableItemByIndex(pResData, t1, indexR, key); - } + } // else t2 is already RES_BOGUS } } else if(URES_IS_ARRAY(type)) { indexR = uprv_strtol(pathP, &closeIndex, 10); - if(*closeIndex == 0) { + if(indexR >= 0 && *closeIndex == 0) { t2 = res_getArrayItem(pResData, t1, indexR); } else { t2 = RES_BOGUS; /* have an array, but don't have a valid index */ diff --git a/Build/source/libs/icu/icu-src/source/common/uresdata.h b/Build/source/libs/icu/icu-src/source/common/uresdata.h index ae7d9a817d2..8d845e3dfcf 100644 --- a/Build/source/libs/icu/icu-src/source/common/uresdata.h +++ b/Build/source/libs/icu/icu-src/source/common/uresdata.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ****************************************************************************** @@ -6,7 +6,7 @@ * Corporation and others. All Rights Reserved. ****************************************************************************** * file name: uresdata.h -* encoding: US-ASCII +* encoding: UTF-8 * tab size: 8 (not used) * indentation:4 * diff --git a/Build/source/libs/icu/icu-src/source/common/uresimp.h b/Build/source/libs/icu/icu-src/source/common/uresimp.h index 5645ee92165..e7fa3e1e36b 100644 --- a/Build/source/libs/icu/icu-src/source/common/uresimp.h +++ b/Build/source/libs/icu/icu-src/source/common/uresimp.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** diff --git a/Build/source/libs/icu/icu-src/source/common/ureslocs.h b/Build/source/libs/icu/icu-src/source/common/ureslocs.h index 85dd8fb4b7f..f7c3344ef20 100644 --- a/Build/source/libs/icu/icu-src/source/common/ureslocs.h +++ b/Build/source/libs/icu/icu-src/source/common/ureslocs.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** diff --git a/Build/source/libs/icu/icu-src/source/common/usc_impl.c b/Build/source/libs/icu/icu-src/source/common/usc_impl.c deleted file mode 100644 index 1fff0c4482d..00000000000 --- a/Build/source/libs/icu/icu-src/source/common/usc_impl.c +++ /dev/null @@ -1,361 +0,0 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. -// License & terms of use: http://www.unicode.org/copyright.html -/* -********************************************************************** -* Copyright (C) 1999-2016, International Business Machines -* Corporation and others. All Rights Reserved. -********************************************************************** -* -* File USC_IMPL.C -* -* Modification History: -* -* Date Name Description -* 07/08/2002 Eric Mader Creation. -****************************************************************************** -*/ - -#include "unicode/uscript.h" -#include "usc_impl.h" -#include "cmemory.h" - -#define PAREN_STACK_DEPTH 32 - -#define MOD(sp) ((sp) % PAREN_STACK_DEPTH) -#define LIMIT_INC(sp) (((sp) < PAREN_STACK_DEPTH)? (sp) + 1 : PAREN_STACK_DEPTH) -#define INC(sp,count) (MOD((sp) + (count))) -#define INC1(sp) (INC(sp, 1)) -#define DEC(sp,count) (MOD((sp) + PAREN_STACK_DEPTH - (count))) -#define DEC1(sp) (DEC(sp, 1)) -#define STACK_IS_EMPTY(scriptRun) ((scriptRun)->pushCount <= 0) -#define STACK_IS_NOT_EMPTY(scriptRun) (! STACK_IS_EMPTY(scriptRun)) -#define TOP(scriptRun) ((scriptRun)->parenStack[(scriptRun)->parenSP]) -#define SYNC_FIXUP(scriptRun) ((scriptRun)->fixupCount = 0) - -struct ParenStackEntry -{ - int32_t pairIndex; - UScriptCode scriptCode; -}; - -struct UScriptRun -{ - int32_t textLength; - const UChar *textArray; - - int32_t scriptStart; - int32_t scriptLimit; - UScriptCode scriptCode; - - struct ParenStackEntry parenStack[PAREN_STACK_DEPTH]; - int32_t parenSP; - int32_t pushCount; - int32_t fixupCount; -}; - -static int8_t highBit(int32_t value); - -static const UChar32 pairedChars[] = { - 0x0028, 0x0029, /* ascii paired punctuation */ - 0x003c, 0x003e, - 0x005b, 0x005d, - 0x007b, 0x007d, - 0x00ab, 0x00bb, /* guillemets */ - 0x2018, 0x2019, /* general punctuation */ - 0x201c, 0x201d, - 0x2039, 0x203a, - 0x3008, 0x3009, /* chinese paired punctuation */ - 0x300a, 0x300b, - 0x300c, 0x300d, - 0x300e, 0x300f, - 0x3010, 0x3011, - 0x3014, 0x3015, - 0x3016, 0x3017, - 0x3018, 0x3019, - 0x301a, 0x301b -}; - -static void push(UScriptRun *scriptRun, int32_t pairIndex, UScriptCode scriptCode) -{ - scriptRun->pushCount = LIMIT_INC(scriptRun->pushCount); - scriptRun->fixupCount = LIMIT_INC(scriptRun->fixupCount); - - scriptRun->parenSP = INC1(scriptRun->parenSP); - scriptRun->parenStack[scriptRun->parenSP].pairIndex = pairIndex; - scriptRun->parenStack[scriptRun->parenSP].scriptCode = scriptCode; -} - -static void pop(UScriptRun *scriptRun) -{ - if (STACK_IS_EMPTY(scriptRun)) { - return; - } - - if (scriptRun->fixupCount > 0) { - scriptRun->fixupCount -= 1; - } - - scriptRun->pushCount -= 1; - scriptRun->parenSP = DEC1(scriptRun->parenSP); - - /* If the stack is now empty, reset the stack - pointers to their initial values. - */ - if (STACK_IS_EMPTY(scriptRun)) { - scriptRun->parenSP = -1; - } -} - -static void fixup(UScriptRun *scriptRun, UScriptCode scriptCode) -{ - int32_t fixupSP = DEC(scriptRun->parenSP, scriptRun->fixupCount); - - while (scriptRun->fixupCount-- > 0) { - fixupSP = INC1(fixupSP); - scriptRun->parenStack[fixupSP].scriptCode = scriptCode; - } -} - -static int8_t -highBit(int32_t value) -{ - int8_t bit = 0; - - if (value <= 0) { - return -32; - } - - if (value >= 1 << 16) { - value >>= 16; - bit += 16; - } - - if (value >= 1 << 8) { - value >>= 8; - bit += 8; - } - - if (value >= 1 << 4) { - value >>= 4; - bit += 4; - } - - if (value >= 1 << 2) { - value >>= 2; - bit += 2; - } - - if (value >= 1 << 1) { - //value >>= 1; - bit += 1; - } - - return bit; -} - -static int32_t -getPairIndex(UChar32 ch) -{ - int32_t pairedCharCount = UPRV_LENGTHOF(pairedChars); - int32_t pairedCharPower = 1 << highBit(pairedCharCount); - int32_t pairedCharExtra = pairedCharCount - pairedCharPower; - - int32_t probe = pairedCharPower; - int32_t pairIndex = 0; - - if (ch >= pairedChars[pairedCharExtra]) { - pairIndex = pairedCharExtra; - } - - while (probe > (1 << 0)) { - probe >>= 1; - - if (ch >= pairedChars[pairIndex + probe]) { - pairIndex += probe; - } - } - - if (pairedChars[pairIndex] != ch) { - pairIndex = -1; - } - - return pairIndex; -} - -static UBool -sameScript(UScriptCode scriptOne, UScriptCode scriptTwo) -{ - return scriptOne <= USCRIPT_INHERITED || scriptTwo <= USCRIPT_INHERITED || scriptOne == scriptTwo; -} - -U_CAPI UScriptRun * U_EXPORT2 -uscript_openRun(const UChar *src, int32_t length, UErrorCode *pErrorCode) -{ - UScriptRun *result = NULL; - - if (pErrorCode == NULL || U_FAILURE(*pErrorCode)) { - return NULL; - } - - result = uprv_malloc(sizeof (UScriptRun)); - - if (result == NULL) { - *pErrorCode = U_MEMORY_ALLOCATION_ERROR; - return NULL; - } - - uscript_setRunText(result, src, length, pErrorCode); - - /* Release the UScriptRun if uscript_setRunText() returns an error */ - if (U_FAILURE(*pErrorCode)) { - uprv_free(result); - result = NULL; - } - - return result; -} - -U_CAPI void U_EXPORT2 -uscript_closeRun(UScriptRun *scriptRun) -{ - if (scriptRun != NULL) { - uprv_free(scriptRun); - } -} - -U_CAPI void U_EXPORT2 -uscript_resetRun(UScriptRun *scriptRun) -{ - if (scriptRun != NULL) { - scriptRun->scriptStart = 0; - scriptRun->scriptLimit = 0; - scriptRun->scriptCode = USCRIPT_INVALID_CODE; - scriptRun->parenSP = -1; - scriptRun->pushCount = 0; - scriptRun->fixupCount = 0; - } -} - -U_CAPI void U_EXPORT2 -uscript_setRunText(UScriptRun *scriptRun, const UChar *src, int32_t length, UErrorCode *pErrorCode) -{ - if (pErrorCode == NULL || U_FAILURE(*pErrorCode)) { - return; - } - - if (scriptRun == NULL || length < 0 || ((src == NULL) != (length == 0))) { - *pErrorCode = U_ILLEGAL_ARGUMENT_ERROR; - return; - } - - scriptRun->textArray = src; - scriptRun->textLength = length; - - uscript_resetRun(scriptRun); -} - -U_CAPI UBool U_EXPORT2 -uscript_nextRun(UScriptRun *scriptRun, int32_t *pRunStart, int32_t *pRunLimit, UScriptCode *pRunScript) -{ - UErrorCode error = U_ZERO_ERROR; - - /* if we've fallen off the end of the text, we're done */ - if (scriptRun == NULL || scriptRun->scriptLimit >= scriptRun->textLength) { - return FALSE; - } - - SYNC_FIXUP(scriptRun); - scriptRun->scriptCode = USCRIPT_COMMON; - - for (scriptRun->scriptStart = scriptRun->scriptLimit; scriptRun->scriptLimit < scriptRun->textLength; scriptRun->scriptLimit += 1) { - UChar high = scriptRun->textArray[scriptRun->scriptLimit]; - UChar32 ch = high; - UScriptCode sc; - int32_t pairIndex; - - /* - * if the character is a high surrogate and it's not the last one - * in the text, see if it's followed by a low surrogate - */ - if (high >= 0xD800 && high <= 0xDBFF && scriptRun->scriptLimit < scriptRun->textLength - 1) { - UChar low = scriptRun->textArray[scriptRun->scriptLimit + 1]; - - /* - * if it is followed by a low surrogate, - * consume it and form the full character - */ - if (low >= 0xDC00 && low <= 0xDFFF) { - ch = (high - 0xD800) * 0x0400 + low - 0xDC00 + 0x10000; - scriptRun->scriptLimit += 1; - } - } - - sc = uscript_getScript(ch, &error); - pairIndex = getPairIndex(ch); - - /* - * Paired character handling: - * - * if it's an open character, push it onto the stack. - * if it's a close character, find the matching open on the - * stack, and use that script code. Any non-matching open - * characters above it on the stack will be poped. - */ - if (pairIndex >= 0) { - if ((pairIndex & 1) == 0) { - push(scriptRun, pairIndex, scriptRun->scriptCode); - } else { - int32_t pi = pairIndex & ~1; - - while (STACK_IS_NOT_EMPTY(scriptRun) && TOP(scriptRun).pairIndex != pi) { - pop(scriptRun); - } - - if (STACK_IS_NOT_EMPTY(scriptRun)) { - sc = TOP(scriptRun).scriptCode; - } - } - } - - if (sameScript(scriptRun->scriptCode, sc)) { - if (scriptRun->scriptCode <= USCRIPT_INHERITED && sc > USCRIPT_INHERITED) { - scriptRun->scriptCode = sc; - - fixup(scriptRun, scriptRun->scriptCode); - } - - /* - * if this character is a close paired character, - * pop the matching open character from the stack - */ - if (pairIndex >= 0 && (pairIndex & 1) != 0) { - pop(scriptRun); - } - } else { - /* - * if the run broke on a surrogate pair, - * end it before the high surrogate - */ - if (ch >= 0x10000) { - scriptRun->scriptLimit -= 1; - } - - break; - } - } - - - if (pRunStart != NULL) { - *pRunStart = scriptRun->scriptStart; - } - - if (pRunLimit != NULL) { - *pRunLimit = scriptRun->scriptLimit; - } - - if (pRunScript != NULL) { - *pRunScript = scriptRun->scriptCode; - } - - return TRUE; -} diff --git a/Build/source/libs/icu/icu-src/source/common/usc_impl.cpp b/Build/source/libs/icu/icu-src/source/common/usc_impl.cpp new file mode 100644 index 00000000000..111029b9749 --- /dev/null +++ b/Build/source/libs/icu/icu-src/source/common/usc_impl.cpp @@ -0,0 +1,361 @@ +// © 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html +/* +********************************************************************** +* Copyright (C) 1999-2016, International Business Machines +* Corporation and others. All Rights Reserved. +********************************************************************** +* +* File USC_IMPL.C +* +* Modification History: +* +* Date Name Description +* 07/08/2002 Eric Mader Creation. +****************************************************************************** +*/ + +#include "unicode/uscript.h" +#include "usc_impl.h" +#include "cmemory.h" + +#define PAREN_STACK_DEPTH 32 + +#define MOD(sp) ((sp) % PAREN_STACK_DEPTH) +#define LIMIT_INC(sp) (((sp) < PAREN_STACK_DEPTH)? (sp) + 1 : PAREN_STACK_DEPTH) +#define INC(sp,count) (MOD((sp) + (count))) +#define INC1(sp) (INC(sp, 1)) +#define DEC(sp,count) (MOD((sp) + PAREN_STACK_DEPTH - (count))) +#define DEC1(sp) (DEC(sp, 1)) +#define STACK_IS_EMPTY(scriptRun) ((scriptRun)->pushCount <= 0) +#define STACK_IS_NOT_EMPTY(scriptRun) (! STACK_IS_EMPTY(scriptRun)) +#define TOP(scriptRun) ((scriptRun)->parenStack[(scriptRun)->parenSP]) +#define SYNC_FIXUP(scriptRun) ((scriptRun)->fixupCount = 0) + +struct ParenStackEntry +{ + int32_t pairIndex; + UScriptCode scriptCode; +}; + +struct UScriptRun +{ + int32_t textLength; + const UChar *textArray; + + int32_t scriptStart; + int32_t scriptLimit; + UScriptCode scriptCode; + + struct ParenStackEntry parenStack[PAREN_STACK_DEPTH]; + int32_t parenSP; + int32_t pushCount; + int32_t fixupCount; +}; + +static int8_t highBit(int32_t value); + +static const UChar32 pairedChars[] = { + 0x0028, 0x0029, /* ascii paired punctuation */ + 0x003c, 0x003e, + 0x005b, 0x005d, + 0x007b, 0x007d, + 0x00ab, 0x00bb, /* guillemets */ + 0x2018, 0x2019, /* general punctuation */ + 0x201c, 0x201d, + 0x2039, 0x203a, + 0x3008, 0x3009, /* chinese paired punctuation */ + 0x300a, 0x300b, + 0x300c, 0x300d, + 0x300e, 0x300f, + 0x3010, 0x3011, + 0x3014, 0x3015, + 0x3016, 0x3017, + 0x3018, 0x3019, + 0x301a, 0x301b +}; + +static void push(UScriptRun *scriptRun, int32_t pairIndex, UScriptCode scriptCode) +{ + scriptRun->pushCount = LIMIT_INC(scriptRun->pushCount); + scriptRun->fixupCount = LIMIT_INC(scriptRun->fixupCount); + + scriptRun->parenSP = INC1(scriptRun->parenSP); + scriptRun->parenStack[scriptRun->parenSP].pairIndex = pairIndex; + scriptRun->parenStack[scriptRun->parenSP].scriptCode = scriptCode; +} + +static void pop(UScriptRun *scriptRun) +{ + if (STACK_IS_EMPTY(scriptRun)) { + return; + } + + if (scriptRun->fixupCount > 0) { + scriptRun->fixupCount -= 1; + } + + scriptRun->pushCount -= 1; + scriptRun->parenSP = DEC1(scriptRun->parenSP); + + /* If the stack is now empty, reset the stack + pointers to their initial values. + */ + if (STACK_IS_EMPTY(scriptRun)) { + scriptRun->parenSP = -1; + } +} + +static void fixup(UScriptRun *scriptRun, UScriptCode scriptCode) +{ + int32_t fixupSP = DEC(scriptRun->parenSP, scriptRun->fixupCount); + + while (scriptRun->fixupCount-- > 0) { + fixupSP = INC1(fixupSP); + scriptRun->parenStack[fixupSP].scriptCode = scriptCode; + } +} + +static int8_t +highBit(int32_t value) +{ + int8_t bit = 0; + + if (value <= 0) { + return -32; + } + + if (value >= 1 << 16) { + value >>= 16; + bit += 16; + } + + if (value >= 1 << 8) { + value >>= 8; + bit += 8; + } + + if (value >= 1 << 4) { + value >>= 4; + bit += 4; + } + + if (value >= 1 << 2) { + value >>= 2; + bit += 2; + } + + if (value >= 1 << 1) { + //value >>= 1; + bit += 1; + } + + return bit; +} + +static int32_t +getPairIndex(UChar32 ch) +{ + int32_t pairedCharCount = UPRV_LENGTHOF(pairedChars); + int32_t pairedCharPower = 1 << highBit(pairedCharCount); + int32_t pairedCharExtra = pairedCharCount - pairedCharPower; + + int32_t probe = pairedCharPower; + int32_t pairIndex = 0; + + if (ch >= pairedChars[pairedCharExtra]) { + pairIndex = pairedCharExtra; + } + + while (probe > (1 << 0)) { + probe >>= 1; + + if (ch >= pairedChars[pairIndex + probe]) { + pairIndex += probe; + } + } + + if (pairedChars[pairIndex] != ch) { + pairIndex = -1; + } + + return pairIndex; +} + +static UBool +sameScript(UScriptCode scriptOne, UScriptCode scriptTwo) +{ + return scriptOne <= USCRIPT_INHERITED || scriptTwo <= USCRIPT_INHERITED || scriptOne == scriptTwo; +} + +U_CAPI UScriptRun * U_EXPORT2 +uscript_openRun(const UChar *src, int32_t length, UErrorCode *pErrorCode) +{ + UScriptRun *result = NULL; + + if (pErrorCode == NULL || U_FAILURE(*pErrorCode)) { + return NULL; + } + + result = (UScriptRun *)uprv_malloc(sizeof (UScriptRun)); + + if (result == NULL) { + *pErrorCode = U_MEMORY_ALLOCATION_ERROR; + return NULL; + } + + uscript_setRunText(result, src, length, pErrorCode); + + /* Release the UScriptRun if uscript_setRunText() returns an error */ + if (U_FAILURE(*pErrorCode)) { + uprv_free(result); + result = NULL; + } + + return result; +} + +U_CAPI void U_EXPORT2 +uscript_closeRun(UScriptRun *scriptRun) +{ + if (scriptRun != NULL) { + uprv_free(scriptRun); + } +} + +U_CAPI void U_EXPORT2 +uscript_resetRun(UScriptRun *scriptRun) +{ + if (scriptRun != NULL) { + scriptRun->scriptStart = 0; + scriptRun->scriptLimit = 0; + scriptRun->scriptCode = USCRIPT_INVALID_CODE; + scriptRun->parenSP = -1; + scriptRun->pushCount = 0; + scriptRun->fixupCount = 0; + } +} + +U_CAPI void U_EXPORT2 +uscript_setRunText(UScriptRun *scriptRun, const UChar *src, int32_t length, UErrorCode *pErrorCode) +{ + if (pErrorCode == NULL || U_FAILURE(*pErrorCode)) { + return; + } + + if (scriptRun == NULL || length < 0 || ((src == NULL) != (length == 0))) { + *pErrorCode = U_ILLEGAL_ARGUMENT_ERROR; + return; + } + + scriptRun->textArray = src; + scriptRun->textLength = length; + + uscript_resetRun(scriptRun); +} + +U_CAPI UBool U_EXPORT2 +uscript_nextRun(UScriptRun *scriptRun, int32_t *pRunStart, int32_t *pRunLimit, UScriptCode *pRunScript) +{ + UErrorCode error = U_ZERO_ERROR; + + /* if we've fallen off the end of the text, we're done */ + if (scriptRun == NULL || scriptRun->scriptLimit >= scriptRun->textLength) { + return FALSE; + } + + SYNC_FIXUP(scriptRun); + scriptRun->scriptCode = USCRIPT_COMMON; + + for (scriptRun->scriptStart = scriptRun->scriptLimit; scriptRun->scriptLimit < scriptRun->textLength; scriptRun->scriptLimit += 1) { + UChar high = scriptRun->textArray[scriptRun->scriptLimit]; + UChar32 ch = high; + UScriptCode sc; + int32_t pairIndex; + + /* + * if the character is a high surrogate and it's not the last one + * in the text, see if it's followed by a low surrogate + */ + if (high >= 0xD800 && high <= 0xDBFF && scriptRun->scriptLimit < scriptRun->textLength - 1) { + UChar low = scriptRun->textArray[scriptRun->scriptLimit + 1]; + + /* + * if it is followed by a low surrogate, + * consume it and form the full character + */ + if (low >= 0xDC00 && low <= 0xDFFF) { + ch = (high - 0xD800) * 0x0400 + low - 0xDC00 + 0x10000; + scriptRun->scriptLimit += 1; + } + } + + sc = uscript_getScript(ch, &error); + pairIndex = getPairIndex(ch); + + /* + * Paired character handling: + * + * if it's an open character, push it onto the stack. + * if it's a close character, find the matching open on the + * stack, and use that script code. Any non-matching open + * characters above it on the stack will be poped. + */ + if (pairIndex >= 0) { + if ((pairIndex & 1) == 0) { + push(scriptRun, pairIndex, scriptRun->scriptCode); + } else { + int32_t pi = pairIndex & ~1; + + while (STACK_IS_NOT_EMPTY(scriptRun) && TOP(scriptRun).pairIndex != pi) { + pop(scriptRun); + } + + if (STACK_IS_NOT_EMPTY(scriptRun)) { + sc = TOP(scriptRun).scriptCode; + } + } + } + + if (sameScript(scriptRun->scriptCode, sc)) { + if (scriptRun->scriptCode <= USCRIPT_INHERITED && sc > USCRIPT_INHERITED) { + scriptRun->scriptCode = sc; + + fixup(scriptRun, scriptRun->scriptCode); + } + + /* + * if this character is a close paired character, + * pop the matching open character from the stack + */ + if (pairIndex >= 0 && (pairIndex & 1) != 0) { + pop(scriptRun); + } + } else { + /* + * if the run broke on a surrogate pair, + * end it before the high surrogate + */ + if (ch >= 0x10000) { + scriptRun->scriptLimit -= 1; + } + + break; + } + } + + + if (pRunStart != NULL) { + *pRunStart = scriptRun->scriptStart; + } + + if (pRunLimit != NULL) { + *pRunLimit = scriptRun->scriptLimit; + } + + if (pRunScript != NULL) { + *pRunScript = scriptRun->scriptCode; + } + + return TRUE; +} diff --git a/Build/source/libs/icu/icu-src/source/common/usc_impl.h b/Build/source/libs/icu/icu-src/source/common/usc_impl.h index 7c9c5e09505..44899649d4c 100644 --- a/Build/source/libs/icu/icu-src/source/common/usc_impl.h +++ b/Build/source/libs/icu/icu-src/source/common/usc_impl.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** diff --git a/Build/source/libs/icu/icu-src/source/common/uscript.c b/Build/source/libs/icu/icu-src/source/common/uscript.c deleted file mode 100644 index 336e185799a..00000000000 --- a/Build/source/libs/icu/icu-src/source/common/uscript.c +++ /dev/null @@ -1,144 +0,0 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. -// License & terms of use: http://www.unicode.org/copyright.html -/* -********************************************************************** -* Copyright (C) 1997-2014, International Business Machines -* Corporation and others. All Rights Reserved. -********************************************************************** -* -* File USCRIPT.C -* -* Modification History: -* -* Date Name Description -* 07/06/2001 Ram Creation. -****************************************************************************** -*/ - -#include "unicode/uchar.h" -#include "unicode/uscript.h" -#include "unicode/uloc.h" -#include "cmemory.h" -#include "cstring.h" - -static const UScriptCode JAPANESE[3] = { USCRIPT_KATAKANA, USCRIPT_HIRAGANA, USCRIPT_HAN }; -static const UScriptCode KOREAN[2] = { USCRIPT_HANGUL, USCRIPT_HAN }; -static const UScriptCode HAN_BOPO[2] = { USCRIPT_HAN, USCRIPT_BOPOMOFO }; - -static int32_t -setCodes(const UScriptCode *src, int32_t length, - UScriptCode *dest, int32_t capacity, UErrorCode *err) { - int32_t i; - if(U_FAILURE(*err)) { return 0; } - if(length > capacity) { - *err = U_BUFFER_OVERFLOW_ERROR; - return length; - } - for(i = 0; i < length; ++i) { - dest[i] = src[i]; - } - return length; -} - -static int32_t -setOneCode(UScriptCode script, UScriptCode *scripts, int32_t capacity, UErrorCode *err) { - if(U_FAILURE(*err)) { return 0; } - if(1 > capacity) { - *err = U_BUFFER_OVERFLOW_ERROR; - return 1; - } - scripts[0] = script; - return 1; -} - -static int32_t -getCodesFromLocale(const char *locale, - UScriptCode *scripts, int32_t capacity, UErrorCode *err) { - UErrorCode internalErrorCode = U_ZERO_ERROR; - char lang[8]; - char script[8]; - int32_t scriptLength; - if(U_FAILURE(*err)) { return 0; } - // Multi-script languages, equivalent to the LocaleScript data - // that we used to load from locale resource bundles. - /*length = */ uloc_getLanguage(locale, lang, UPRV_LENGTHOF(lang), &internalErrorCode); - if(U_FAILURE(internalErrorCode) || internalErrorCode == U_STRING_NOT_TERMINATED_WARNING) { - return 0; - } - if(0 == uprv_strcmp(lang, "ja")) { - return setCodes(JAPANESE, UPRV_LENGTHOF(JAPANESE), scripts, capacity, err); - } - if(0 == uprv_strcmp(lang, "ko")) { - return setCodes(KOREAN, UPRV_LENGTHOF(KOREAN), scripts, capacity, err); - } - scriptLength = uloc_getScript(locale, script, UPRV_LENGTHOF(script), &internalErrorCode); - if(U_FAILURE(internalErrorCode) || internalErrorCode == U_STRING_NOT_TERMINATED_WARNING) { - return 0; - } - if(0 == uprv_strcmp(lang, "zh") && 0 == uprv_strcmp(script, "Hant")) { - return setCodes(HAN_BOPO, UPRV_LENGTHOF(HAN_BOPO), scripts, capacity, err); - } - // Explicit script code. - if(scriptLength != 0) { - UScriptCode scriptCode = (UScriptCode)u_getPropertyValueEnum(UCHAR_SCRIPT, script); - if(scriptCode != USCRIPT_INVALID_CODE) { - if(scriptCode == USCRIPT_SIMPLIFIED_HAN || scriptCode == USCRIPT_TRADITIONAL_HAN) { - scriptCode = USCRIPT_HAN; - } - return setOneCode(scriptCode, scripts, capacity, err); - } - } - return 0; -} - -/* TODO: this is a bad API and should be deprecated, ticket #11141 */ -U_CAPI int32_t U_EXPORT2 -uscript_getCode(const char* nameOrAbbrOrLocale, - UScriptCode* fillIn, - int32_t capacity, - UErrorCode* err){ - UBool triedCode; - char likely[ULOC_FULLNAME_CAPACITY]; - UErrorCode internalErrorCode; - int32_t length; - - if(U_FAILURE(*err)) { - return 0; - } - if(nameOrAbbrOrLocale==NULL || - (fillIn == NULL ? capacity != 0 : capacity < 0)) { - *err = U_ILLEGAL_ARGUMENT_ERROR; - return 0; - } - - triedCode = FALSE; - if(uprv_strchr(nameOrAbbrOrLocale, '-')==NULL && uprv_strchr(nameOrAbbrOrLocale, '_')==NULL ){ - /* try long and abbreviated script names first */ - UScriptCode code = (UScriptCode) u_getPropertyValueEnum(UCHAR_SCRIPT, nameOrAbbrOrLocale); - if(code!=USCRIPT_INVALID_CODE) { - return setOneCode(code, fillIn, capacity, err); - } - triedCode = TRUE; - } - internalErrorCode = U_ZERO_ERROR; - length = getCodesFromLocale(nameOrAbbrOrLocale, fillIn, capacity, err); - if(U_FAILURE(*err) || length != 0) { - return length; - } - (void)uloc_addLikelySubtags(nameOrAbbrOrLocale, - likely, UPRV_LENGTHOF(likely), &internalErrorCode); - if(U_SUCCESS(internalErrorCode) && internalErrorCode != U_STRING_NOT_TERMINATED_WARNING) { - length = getCodesFromLocale(likely, fillIn, capacity, err); - if(U_FAILURE(*err) || length != 0) { - return length; - } - } - if(!triedCode) { - /* still not found .. try long and abbreviated script names again */ - UScriptCode code = (UScriptCode) u_getPropertyValueEnum(UCHAR_SCRIPT, nameOrAbbrOrLocale); - if(code!=USCRIPT_INVALID_CODE) { - return setOneCode(code, fillIn, capacity, err); - } - } - return 0; -} diff --git a/Build/source/libs/icu/icu-src/source/common/uscript.cpp b/Build/source/libs/icu/icu-src/source/common/uscript.cpp new file mode 100644 index 00000000000..83b5f7ef168 --- /dev/null +++ b/Build/source/libs/icu/icu-src/source/common/uscript.cpp @@ -0,0 +1,144 @@ +// © 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html +/* +********************************************************************** +* Copyright (C) 1997-2014, International Business Machines +* Corporation and others. All Rights Reserved. +********************************************************************** +* +* File USCRIPT.C +* +* Modification History: +* +* Date Name Description +* 07/06/2001 Ram Creation. +****************************************************************************** +*/ + +#include "unicode/uchar.h" +#include "unicode/uscript.h" +#include "unicode/uloc.h" +#include "cmemory.h" +#include "cstring.h" + +static const UScriptCode JAPANESE[3] = { USCRIPT_KATAKANA, USCRIPT_HIRAGANA, USCRIPT_HAN }; +static const UScriptCode KOREAN[2] = { USCRIPT_HANGUL, USCRIPT_HAN }; +static const UScriptCode HAN_BOPO[2] = { USCRIPT_HAN, USCRIPT_BOPOMOFO }; + +static int32_t +setCodes(const UScriptCode *src, int32_t length, + UScriptCode *dest, int32_t capacity, UErrorCode *err) { + int32_t i; + if(U_FAILURE(*err)) { return 0; } + if(length > capacity) { + *err = U_BUFFER_OVERFLOW_ERROR; + return length; + } + for(i = 0; i < length; ++i) { + dest[i] = src[i]; + } + return length; +} + +static int32_t +setOneCode(UScriptCode script, UScriptCode *scripts, int32_t capacity, UErrorCode *err) { + if(U_FAILURE(*err)) { return 0; } + if(1 > capacity) { + *err = U_BUFFER_OVERFLOW_ERROR; + return 1; + } + scripts[0] = script; + return 1; +} + +static int32_t +getCodesFromLocale(const char *locale, + UScriptCode *scripts, int32_t capacity, UErrorCode *err) { + UErrorCode internalErrorCode = U_ZERO_ERROR; + char lang[8]; + char script[8]; + int32_t scriptLength; + if(U_FAILURE(*err)) { return 0; } + // Multi-script languages, equivalent to the LocaleScript data + // that we used to load from locale resource bundles. + /*length = */ uloc_getLanguage(locale, lang, UPRV_LENGTHOF(lang), &internalErrorCode); + if(U_FAILURE(internalErrorCode) || internalErrorCode == U_STRING_NOT_TERMINATED_WARNING) { + return 0; + } + if(0 == uprv_strcmp(lang, "ja")) { + return setCodes(JAPANESE, UPRV_LENGTHOF(JAPANESE), scripts, capacity, err); + } + if(0 == uprv_strcmp(lang, "ko")) { + return setCodes(KOREAN, UPRV_LENGTHOF(KOREAN), scripts, capacity, err); + } + scriptLength = uloc_getScript(locale, script, UPRV_LENGTHOF(script), &internalErrorCode); + if(U_FAILURE(internalErrorCode) || internalErrorCode == U_STRING_NOT_TERMINATED_WARNING) { + return 0; + } + if(0 == uprv_strcmp(lang, "zh") && 0 == uprv_strcmp(script, "Hant")) { + return setCodes(HAN_BOPO, UPRV_LENGTHOF(HAN_BOPO), scripts, capacity, err); + } + // Explicit script code. + if(scriptLength != 0) { + UScriptCode scriptCode = (UScriptCode)u_getPropertyValueEnum(UCHAR_SCRIPT, script); + if(scriptCode != USCRIPT_INVALID_CODE) { + if(scriptCode == USCRIPT_SIMPLIFIED_HAN || scriptCode == USCRIPT_TRADITIONAL_HAN) { + scriptCode = USCRIPT_HAN; + } + return setOneCode(scriptCode, scripts, capacity, err); + } + } + return 0; +} + +/* TODO: this is a bad API and should be deprecated, ticket #11141 */ +U_CAPI int32_t U_EXPORT2 +uscript_getCode(const char* nameOrAbbrOrLocale, + UScriptCode* fillIn, + int32_t capacity, + UErrorCode* err){ + UBool triedCode; + char likely[ULOC_FULLNAME_CAPACITY]; + UErrorCode internalErrorCode; + int32_t length; + + if(U_FAILURE(*err)) { + return 0; + } + if(nameOrAbbrOrLocale==NULL || + (fillIn == NULL ? capacity != 0 : capacity < 0)) { + *err = U_ILLEGAL_ARGUMENT_ERROR; + return 0; + } + + triedCode = FALSE; + if(uprv_strchr(nameOrAbbrOrLocale, '-')==NULL && uprv_strchr(nameOrAbbrOrLocale, '_')==NULL ){ + /* try long and abbreviated script names first */ + UScriptCode code = (UScriptCode) u_getPropertyValueEnum(UCHAR_SCRIPT, nameOrAbbrOrLocale); + if(code!=USCRIPT_INVALID_CODE) { + return setOneCode(code, fillIn, capacity, err); + } + triedCode = TRUE; + } + internalErrorCode = U_ZERO_ERROR; + length = getCodesFromLocale(nameOrAbbrOrLocale, fillIn, capacity, err); + if(U_FAILURE(*err) || length != 0) { + return length; + } + (void)uloc_addLikelySubtags(nameOrAbbrOrLocale, + likely, UPRV_LENGTHOF(likely), &internalErrorCode); + if(U_SUCCESS(internalErrorCode) && internalErrorCode != U_STRING_NOT_TERMINATED_WARNING) { + length = getCodesFromLocale(likely, fillIn, capacity, err); + if(U_FAILURE(*err) || length != 0) { + return length; + } + } + if(!triedCode) { + /* still not found .. try long and abbreviated script names again */ + UScriptCode code = (UScriptCode) u_getPropertyValueEnum(UCHAR_SCRIPT, nameOrAbbrOrLocale); + if(code!=USCRIPT_INVALID_CODE) { + return setOneCode(code, fillIn, capacity, err); + } + } + return 0; +} diff --git a/Build/source/libs/icu/icu-src/source/common/uscript_props.cpp b/Build/source/libs/icu/icu-src/source/common/uscript_props.cpp index 20c7cdce2ff..7998c52c7f0 100644 --- a/Build/source/libs/icu/icu-src/source/common/uscript_props.cpp +++ b/Build/source/libs/icu/icu-src/source/common/uscript_props.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* @@ -6,7 +6,7 @@ * Corporation and others. All Rights Reserved. ******************************************************************************* * file name: uscript_props.cpp -* encoding: US-ASCII +* encoding: UTF-8 * tab size: 8 (not used) * indentation:4 * @@ -33,7 +33,7 @@ namespace { const int32_t UNKNOWN = 1 << 21; const int32_t EXCLUSION = 2 << 21; const int32_t LIMITED_USE = 3 << 21; -const int32_t ASPIRATIONAL = 4 << 21; +// st int32_t ASPIRATIONAL = 4 << 21; -- not used any more since Unicode 10 const int32_t RECOMMENDED = 5 << 21; // Bits 31..24: Single-bit flags @@ -71,7 +71,7 @@ const int32_t SCRIPT_PROPS[] = { 0x0EA5 | RECOMMENDED | LB_LETTERS, // Laoo 0x004C | RECOMMENDED | CASED, // Latn 0x0D15 | RECOMMENDED, // Mlym - 0x1826 | ASPIRATIONAL, // Mong + 0x1826 | LIMITED_USE, // Mong 0x1000 | RECOMMENDED | LB_LETTERS, // Mymr 0x168F | EXCLUSION, // Ogam 0x10300 | EXCLUSION, // Ital @@ -84,8 +84,8 @@ const int32_t SCRIPT_PROPS[] = { 0x078C | RECOMMENDED | RTL, // Thaa 0x0E17 | RECOMMENDED | LB_LETTERS, // Thai 0x0F40 | RECOMMENDED, // Tibt - 0x14C0 | ASPIRATIONAL, // Cans - 0xA288 | ASPIRATIONAL | LB_LETTERS, // Yiii + 0x14C0 | LIMITED_USE, // Cans + 0xA288 | LIMITED_USE | LB_LETTERS, // Yiii 0x1703 | EXCLUSION, // Tglg 0x1723 | EXCLUSION, // Hano 0x1743 | EXCLUSION, // Buhd @@ -104,7 +104,7 @@ const int32_t SCRIPT_PROPS[] = { 0x10A00 | EXCLUSION | RTL, // Khar 0xA800 | LIMITED_USE, // Sylo 0x1980 | LIMITED_USE | LB_LETTERS, // Talu - 0x2D30 | ASPIRATIONAL, // Tfng + 0x2D30 | LIMITED_USE, // Tfng 0x103A0 | EXCLUSION, // Xpeo 0x1B05 | LIMITED_USE, // Bali 0x1BC0 | LIMITED_USE, // Batk @@ -136,7 +136,7 @@ const int32_t SCRIPT_PROPS[] = { 0x1036B | EXCLUSION, // Perm 0xA840 | EXCLUSION, // Phag 0x10900 | EXCLUSION | RTL, // Phnx - 0x16F00 | ASPIRATIONAL, // Plrd + 0x16F00 | LIMITED_USE, // Plrd 0, 0, 0, @@ -194,7 +194,7 @@ const int32_t SCRIPT_PROPS[] = { 0, 0, 0x16A4F | EXCLUSION, // Mroo - 0, + 0x1B1C4 | EXCLUSION | LB_LETTERS, // Nshu 0x11183 | EXCLUSION, // Shrd 0x110D0 | EXCLUSION, // Sora 0x11680 | EXCLUSION, // Takr @@ -219,6 +219,9 @@ const int32_t SCRIPT_PROPS[] = { 0x5B57 | RECOMMENDED | LB_LETTERS, // Hanb 0x1112 | RECOMMENDED, // Jamo 0, + 0x11D10 | EXCLUSION, // Gonm + 0x11A5C | EXCLUSION, // Soyo + 0x11A0B | EXCLUSION, // Zanb // End copy-paste from parsescriptmetadata.py }; diff --git a/Build/source/libs/icu/icu-src/source/common/uset.cpp b/Build/source/libs/icu/icu-src/source/common/uset.cpp index dbbf6944cd4..39ad0a340c4 100644 --- a/Build/source/libs/icu/icu-src/source/common/uset.cpp +++ b/Build/source/libs/icu/icu-src/source/common/uset.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* @@ -8,7 +8,7 @@ * ******************************************************************************* * file name: uset.cpp -* encoding: US-ASCII +* encoding: UTF-8 * tab size: 8 (not used) * indentation:4 * diff --git a/Build/source/libs/icu/icu-src/source/common/uset_imp.h b/Build/source/libs/icu/icu-src/source/common/uset_imp.h index 703c881ddde..7233b9303c3 100644 --- a/Build/source/libs/icu/icu-src/source/common/uset_imp.h +++ b/Build/source/libs/icu/icu-src/source/common/uset_imp.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* @@ -8,7 +8,7 @@ * ******************************************************************************* * file name: uset_imp.h -* encoding: US-ASCII +* encoding: UTF-8 * tab size: 8 (not used) * indentation:4 * diff --git a/Build/source/libs/icu/icu-src/source/common/uset_props.cpp b/Build/source/libs/icu/icu-src/source/common/uset_props.cpp index fd48f45a5fe..f08e760b10d 100644 --- a/Build/source/libs/icu/icu-src/source/common/uset_props.cpp +++ b/Build/source/libs/icu/icu-src/source/common/uset_props.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* @@ -8,7 +8,7 @@ * ******************************************************************************* * file name: uset_props.cpp -* encoding: US-ASCII +* encoding: UTF-8 * tab size: 8 (not used) * indentation:4 * diff --git a/Build/source/libs/icu/icu-src/source/common/usetiter.cpp b/Build/source/libs/icu/icu-src/source/common/usetiter.cpp index 514dc03c4c9..93048ba2a08 100644 --- a/Build/source/libs/icu/icu-src/source/common/usetiter.cpp +++ b/Build/source/libs/icu/icu-src/source/common/usetiter.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** diff --git a/Build/source/libs/icu/icu-src/source/common/ushape.cpp b/Build/source/libs/icu/icu-src/source/common/ushape.cpp index 8420cc95c60..90f339b4b8c 100644 --- a/Build/source/libs/icu/icu-src/source/common/ushape.cpp +++ b/Build/source/libs/icu/icu-src/source/common/ushape.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ****************************************************************************** @@ -8,7 +8,7 @@ * ****************************************************************************** * file name: ushape.cpp - * encoding: US-ASCII + * encoding: UTF-8 * tab size: 8 (not used) * indentation:4 * diff --git a/Build/source/libs/icu/icu-src/source/common/usprep.cpp b/Build/source/libs/icu/icu-src/source/common/usprep.cpp index 565d9e55160..d96e825c24d 100644 --- a/Build/source/libs/icu/icu-src/source/common/usprep.cpp +++ b/Build/source/libs/icu/icu-src/source/common/usprep.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* @@ -8,7 +8,7 @@ * ******************************************************************************* * file name: usprep.cpp - * encoding: US-ASCII + * encoding: UTF-8 * tab size: 8 (not used) * indentation:4 * diff --git a/Build/source/libs/icu/icu-src/source/common/ustack.cpp b/Build/source/libs/icu/icu-src/source/common/ustack.cpp index 1de79ecfe35..fb314b0ebe5 100644 --- a/Build/source/libs/icu/icu-src/source/common/ustack.cpp +++ b/Build/source/libs/icu/icu-src/source/common/ustack.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** diff --git a/Build/source/libs/icu/icu-src/source/common/ustr_cnv.cpp b/Build/source/libs/icu/icu-src/source/common/ustr_cnv.cpp index e27639f0b76..38f4d82105c 100644 --- a/Build/source/libs/icu/icu-src/source/common/ustr_cnv.cpp +++ b/Build/source/libs/icu/icu-src/source/common/ustr_cnv.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* @@ -8,7 +8,7 @@ * ******************************************************************************* * file name: ustr_cnv.cpp -* encoding: US-ASCII +* encoding: UTF-8 * tab size: 8 (not used) * indentation:4 * diff --git a/Build/source/libs/icu/icu-src/source/common/ustr_cnv.h b/Build/source/libs/icu/icu-src/source/common/ustr_cnv.h index 74f888567ed..861e3ebff06 100644 --- a/Build/source/libs/icu/icu-src/source/common/ustr_cnv.h +++ b/Build/source/libs/icu/icu-src/source/common/ustr_cnv.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** @@ -6,7 +6,7 @@ * Corporation and others. All Rights Reserved. ********************************************************************** * file name: ustr_cnv.h -* encoding: US-ASCII +* encoding: UTF-8 * tab size: 8 (not used) * indentation:4 * diff --git a/Build/source/libs/icu/icu-src/source/common/ustr_imp.h b/Build/source/libs/icu/icu-src/source/common/ustr_imp.h index 34a69363a76..c555ee37ea8 100644 --- a/Build/source/libs/icu/icu-src/source/common/ustr_imp.h +++ b/Build/source/libs/icu/icu-src/source/common/ustr_imp.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** @@ -6,7 +6,7 @@ * Corporation and others. All Rights Reserved. ********************************************************************** * file name: ustr_imp.h -* encoding: US-ASCII +* encoding: UTF-8 * tab size: 8 (not used) * indentation:4 * @@ -18,23 +18,7 @@ #define __USTR_IMP_H__ #include "unicode/utypes.h" -#include "unicode/uiter.h" -#include "ucase.h" - -/** Simple declaration to avoid including unicode/ubrk.h. */ -#ifndef UBRK_TYPEDEF_UBREAK_ITERATOR -# define UBRK_TYPEDEF_UBREAK_ITERATOR - typedef struct UBreakIterator UBreakIterator; -#endif - -#ifndef U_COMPARE_IGNORE_CASE -/* see also unorm.h */ -/** - * Option bit for unorm_compare: - * Perform case-insensitive comparison. - */ -#define U_COMPARE_IGNORE_CASE 0x10000 -#endif +#include "unicode/utf8.h" /** * Internal option for unorm_cmpEquivFold() for strncmp style. @@ -53,211 +37,6 @@ uprv_strCompare(const UChar *s1, int32_t length1, const UChar *s2, int32_t length2, UBool strncmpStyle, UBool codePointOrder); -/** - * Internal API, used by u_strcasecmp() etc. - * Compare strings case-insensitively, - * in code point order or code unit order. - */ -U_CFUNC int32_t -u_strcmpFold(const UChar *s1, int32_t length1, - const UChar *s2, int32_t length2, - uint32_t options, - UErrorCode *pErrorCode); - -/** - * Interanl API, used for detecting length of - * shared prefix case-insensitively. - * @param s1 input string 1 - * @param length1 length of string 1, or -1 (NULL terminated) - * @param s2 input string 2 - * @param length2 length of string 2, or -1 (NULL terminated) - * @param options compare options - * @param matchLen1 (output) length of partial prefix match in s1 - * @param matchLen2 (output) length of partial prefix match in s2 - * @param pErrorCode receives error status - */ -U_CAPI void -u_caseInsensitivePrefixMatch(const UChar *s1, int32_t length1, - const UChar *s2, int32_t length2, - uint32_t options, - int32_t *matchLen1, int32_t *matchLen2, - UErrorCode *pErrorCode); - -/** - * Are the Unicode properties loaded? - * This must be used before internal functions are called that do - * not perform this check. - * Generate a debug assertion failure if data is not loaded. - */ -U_CFUNC UBool -uprv_haveProperties(UErrorCode *pErrorCode); - -/** - * Load the Unicode property data. - * Intended primarily for use from u_init(). - * Has no effect if property data is already loaded. - * NOT thread safe. - */ -/*U_CFUNC int8_t -uprv_loadPropsData(UErrorCode *errorCode);*/ - -/* - * Internal string casing functions implementing - * ustring.h/ustrcase.c and UnicodeString case mapping functions. - */ - -struct UCaseMap { - const UCaseProps *csp; -#if !UCONFIG_NO_BREAK_ITERATION - UBreakIterator *iter; /* We adopt the iterator, so we own it. */ -#endif - char locale[32]; - int32_t locCache; - uint32_t options; -}; - -#ifndef __UCASEMAP_H__ -typedef struct UCaseMap UCaseMap; -#endif - -#if UCONFIG_NO_BREAK_ITERATION -# define UCASEMAP_INITIALIZER { NULL, { 0 }, 0, 0 } -#else -# define UCASEMAP_INITIALIZER { NULL, NULL, { 0 }, 0, 0 } -#endif - -U_CFUNC void -ustrcase_setTempCaseMapLocale(UCaseMap *csm, const char *locale); - -#ifndef U_STRING_CASE_MAPPER_DEFINED -#define U_STRING_CASE_MAPPER_DEFINED - -/** - * String case mapping function type, used by ustrcase_map(). - * All error checking must be done. - * The UCaseMap must be fully initialized, with locale and/or iter set as needed. - * src and dest must not overlap. - */ -typedef int32_t U_CALLCONV -UStringCaseMapper(const UCaseMap *csm, - UChar *dest, int32_t destCapacity, - const UChar *src, int32_t srcLength, - UErrorCode *pErrorCode); - -#endif - -/** Implements UStringCaseMapper. */ -U_CFUNC int32_t U_CALLCONV -ustrcase_internalToLower(const UCaseMap *csm, - UChar *dest, int32_t destCapacity, - const UChar *src, int32_t srcLength, - UErrorCode *pErrorCode); - -/** Implements UStringCaseMapper. */ -U_CFUNC int32_t U_CALLCONV -ustrcase_internalToUpper(const UCaseMap *csm, - UChar *dest, int32_t destCapacity, - const UChar *src, int32_t srcLength, - UErrorCode *pErrorCode); - -#if !UCONFIG_NO_BREAK_ITERATION - -/** Implements UStringCaseMapper. */ -U_CFUNC int32_t U_CALLCONV -ustrcase_internalToTitle(const UCaseMap *csm, - UChar *dest, int32_t destCapacity, - const UChar *src, int32_t srcLength, - UErrorCode *pErrorCode); - -#endif - -/** Implements UStringCaseMapper. */ -U_CFUNC int32_t U_CALLCONV -ustrcase_internalFold(const UCaseMap *csm, - UChar *dest, int32_t destCapacity, - const UChar *src, int32_t srcLength, - UErrorCode *pErrorCode); - -/** - * Implements argument checking and buffer handling - * for string case mapping as a common function. - */ -U_CFUNC int32_t -ustrcase_map(const UCaseMap *csm, - UChar *dest, int32_t destCapacity, - const UChar *src, int32_t srcLength, - UStringCaseMapper *stringCaseMapper, - UErrorCode *pErrorCode); - -/** - * UTF-8 string case mapping function type, used by ucasemap_mapUTF8(). - * UTF-8 version of UStringCaseMapper. - * All error checking must be done. - * The UCaseMap must be fully initialized, with locale and/or iter set as needed. - * src and dest must not overlap. - */ -typedef int32_t U_CALLCONV -UTF8CaseMapper(const UCaseMap *csm, - uint8_t *dest, int32_t destCapacity, - const uint8_t *src, int32_t srcLength, - UErrorCode *pErrorCode); - -/** Implements UTF8CaseMapper. */ -U_CFUNC int32_t U_CALLCONV -ucasemap_internalUTF8ToTitle(const UCaseMap *csm, - uint8_t *dest, int32_t destCapacity, - const uint8_t *src, int32_t srcLength, - UErrorCode *pErrorCode); - -/** - * Implements argument checking and buffer handling - * for UTF-8 string case mapping as a common function. - */ -U_CFUNC int32_t -ucasemap_mapUTF8(const UCaseMap *csm, - uint8_t *dest, int32_t destCapacity, - const uint8_t *src, int32_t srcLength, - UTF8CaseMapper *stringCaseMapper, - UErrorCode *pErrorCode); - -#ifdef __cplusplus - -U_NAMESPACE_BEGIN -namespace GreekUpper { - -// Data bits. -static const uint32_t UPPER_MASK = 0x3ff; -static const uint32_t HAS_VOWEL = 0x1000; -static const uint32_t HAS_YPOGEGRAMMENI = 0x2000; -static const uint32_t HAS_ACCENT = 0x4000; -static const uint32_t HAS_DIALYTIKA = 0x8000; -// Further bits during data building and processing, not stored in the data map. -static const uint32_t HAS_COMBINING_DIALYTIKA = 0x10000; -static const uint32_t HAS_OTHER_GREEK_DIACRITIC = 0x20000; - -static const uint32_t HAS_VOWEL_AND_ACCENT = HAS_VOWEL | HAS_ACCENT; -static const uint32_t HAS_VOWEL_AND_ACCENT_AND_DIALYTIKA = - HAS_VOWEL_AND_ACCENT | HAS_DIALYTIKA; -static const uint32_t HAS_EITHER_DIALYTIKA = HAS_DIALYTIKA | HAS_COMBINING_DIALYTIKA; - -// State bits. -static const uint32_t AFTER_CASED = 1; -static const uint32_t AFTER_VOWEL_WITH_ACCENT = 2; - -uint32_t getLetterData(UChar32 c); - -/** - * Returns a non-zero value for each of the Greek combining diacritics - * listed in The Unicode Standard, version 8, chapter 7.2 Greek, - * plus some perispomeni look-alikes. - */ -uint32_t getDiacriticData(UChar32 c); - -} // namespace GreekUpper -U_NAMESPACE_END - -#endif // __cplusplus - U_CAPI int32_t U_EXPORT2 ustr_hashUCharsN(const UChar *str, int32_t length); @@ -303,4 +82,62 @@ u_terminateUChar32s(UChar32 *dest, int32_t destCapacity, int32_t length, UErrorC U_CAPI int32_t U_EXPORT2 u_terminateWChars(wchar_t *dest, int32_t destCapacity, int32_t length, UErrorCode *pErrorCode); +/** + * Counts the bytes of any whole valid sequence for a UTF-8 lead byte. + * Returns 1 for ASCII 0..0x7f. + * Returns 0 for 0x80..0xc1 as well as for 0xf5..0xff. + * leadByte might be evaluated multiple times. + * + * @param leadByte The first byte of a UTF-8 sequence. Must be 0..0xff. + * @return 0..4 + */ +#define U8_COUNT_BYTES(leadByte) \ + (U8_IS_SINGLE(leadByte) ? 1 : U8_COUNT_BYTES_NON_ASCII(leadByte)) + +/** + * Counts the bytes of any whole valid sequence for a UTF-8 lead byte. + * Returns 0 for 0x00..0xc1 as well as for 0xf5..0xff. + * leadByte might be evaluated multiple times. + * + * @param leadByte The first byte of a UTF-8 sequence. Must be 0..0xff. + * @return 0 or 2..4 + */ +#define U8_COUNT_BYTES_NON_ASCII(leadByte) \ + (U8_IS_LEAD(leadByte) ? ((uint8_t)(leadByte)>=0xe0)+((uint8_t)(leadByte)>=0xf0)+2 : 0) + +#ifdef __cplusplus + +U_NAMESPACE_BEGIN + +class UTF8 { +public: + UTF8() = delete; // all static + + /** + * Is t a valid UTF-8 trail byte? + * + * @param prev Must be the preceding lead byte if i==1 and length>=3; + * otherwise ignored. + * @param t The i-th byte following the lead byte. + * @param i The index (1..3) of byte t in the byte sequence. 0 1) { + return U8_IS_TRAIL(t); + } else if (length == 3) { + return U8_IS_VALID_LEAD3_AND_T1(prev, t); + } else { // length == 4 + return U8_IS_VALID_LEAD4_AND_T1(prev, t); + } + } +}; + +U_NAMESPACE_END + +#endif // __cplusplus + #endif diff --git a/Build/source/libs/icu/icu-src/source/common/ustr_titlecase_brkiter.cpp b/Build/source/libs/icu/icu-src/source/common/ustr_titlecase_brkiter.cpp index 63808776199..89888cf336b 100644 --- a/Build/source/libs/icu/icu-src/source/common/ustr_titlecase_brkiter.cpp +++ b/Build/source/libs/icu/icu-src/source/common/ustr_titlecase_brkiter.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* @@ -6,7 +6,7 @@ * Corporation and others. All Rights Reserved. ******************************************************************************* * file name: ustr_titlecase_brkiter.cpp -* encoding: US-ASCII +* encoding: UTF-8 * tab size: 8 (not used) * indentation:4 * @@ -22,32 +22,177 @@ #if !UCONFIG_NO_BREAK_ITERATION #include "unicode/brkiter.h" +#include "unicode/casemap.h" +#include "unicode/chariter.h" +#include "unicode/localpointer.h" #include "unicode/ubrk.h" #include "unicode/ucasemap.h" +#include "unicode/utext.h" #include "cmemory.h" +#include "uassert.h" #include "ucase.h" -#include "ustr_imp.h" +#include "ucasemap_imp.h" -/* functions available in the common library (for unistr_case.cpp) */ +U_NAMESPACE_BEGIN -/* - * Set parameters on an empty UCaseMap, for UCaseMap-less API functions. - * Do this fast because it is called with every function call. - * Duplicate of the same function in ustrcase.cpp, to keep it inline. +/** + * Whole-string BreakIterator. + * Titlecasing only calls setText(), first(), and next(). + * We implement the rest only to satisfy the abstract interface. */ -static inline void -setTempCaseMap(UCaseMap *csm, const char *locale) { - if(csm->csp==NULL) { - csm->csp=ucase_getSingleton(); +class WholeStringBreakIterator : public BreakIterator { +public: + WholeStringBreakIterator() : BreakIterator(), length(0) {} + ~WholeStringBreakIterator() U_OVERRIDE; + UBool operator==(const BreakIterator&) const U_OVERRIDE; + BreakIterator *clone() const U_OVERRIDE; + static UClassID U_EXPORT2 getStaticClassID(); + UClassID getDynamicClassID() const U_OVERRIDE; + CharacterIterator &getText() const U_OVERRIDE; + UText *getUText(UText *fillIn, UErrorCode &errorCode) const U_OVERRIDE; + void setText(const UnicodeString &text) U_OVERRIDE; + void setText(UText *text, UErrorCode &errorCode) U_OVERRIDE; + void adoptText(CharacterIterator* it) U_OVERRIDE; + int32_t first() U_OVERRIDE; + int32_t last() U_OVERRIDE; + int32_t previous() U_OVERRIDE; + int32_t next() U_OVERRIDE; + int32_t current() const U_OVERRIDE; + int32_t following(int32_t offset) U_OVERRIDE; + int32_t preceding(int32_t offset) U_OVERRIDE; + UBool isBoundary(int32_t offset) U_OVERRIDE; + int32_t next(int32_t n) U_OVERRIDE; + BreakIterator *createBufferClone(void *stackBuffer, int32_t &BufferSize, + UErrorCode &errorCode) U_OVERRIDE; + BreakIterator &refreshInputText(UText *input, UErrorCode &errorCode) U_OVERRIDE; + +private: + int32_t length; +}; + +UOBJECT_DEFINE_RTTI_IMPLEMENTATION(WholeStringBreakIterator) + +WholeStringBreakIterator::~WholeStringBreakIterator() {} +UBool WholeStringBreakIterator::operator==(const BreakIterator&) const { return FALSE; } +BreakIterator *WholeStringBreakIterator::clone() const { return nullptr; } + +CharacterIterator &WholeStringBreakIterator::getText() const { + U_ASSERT(FALSE); // really should not be called + // Returns a null reference. + // Otherwise we would have to define a dummy CharacterIterator, + // and either have it as a field and const_cast it to a non-const reference, + // or have it via a pointer and return a reference to that. + CharacterIterator *none = nullptr; + return *none; +} +UText *WholeStringBreakIterator::getUText(UText * /*fillIn*/, UErrorCode &errorCode) const { + if (U_SUCCESS(errorCode)) { + errorCode = U_UNSUPPORTED_ERROR; } - if(locale!=NULL && locale[0]==0) { - csm->locale[0]=0; - } else { - ustrcase_setTempCaseMapLocale(csm, locale); + return nullptr; +} + +void WholeStringBreakIterator::setText(const UnicodeString &text) { + length = text.length(); +} +void WholeStringBreakIterator::setText(UText *text, UErrorCode &errorCode) { + if (U_SUCCESS(errorCode)) { + int64_t length64 = utext_nativeLength(text); + if (length64 <= INT32_MAX) { + length = (int32_t)length64; + } else { + errorCode = U_INDEX_OUTOFBOUNDS_ERROR; + } } } +void WholeStringBreakIterator::adoptText(CharacterIterator* it) { + U_ASSERT(FALSE); // should not be called + length = it->getLength(); + delete it; +} -/* public API functions */ +int32_t WholeStringBreakIterator::first() { return 0; } +int32_t WholeStringBreakIterator::last() { return length; } +int32_t WholeStringBreakIterator::previous() { return 0; } +int32_t WholeStringBreakIterator::next() { return length; } +int32_t WholeStringBreakIterator::current() const { return 0; } +int32_t WholeStringBreakIterator::following(int32_t /*offset*/) { return length; } +int32_t WholeStringBreakIterator::preceding(int32_t /*offset*/) { return 0; } +UBool WholeStringBreakIterator::isBoundary(int32_t /*offset*/) { return FALSE; } +int32_t WholeStringBreakIterator::next(int32_t /*n*/) { return length; } + +BreakIterator *WholeStringBreakIterator::createBufferClone( + void * /*stackBuffer*/, int32_t & /*BufferSize*/, UErrorCode &errorCode) { + if (U_SUCCESS(errorCode)) { + errorCode = U_UNSUPPORTED_ERROR; + } + return nullptr; +} +BreakIterator &WholeStringBreakIterator::refreshInputText( + UText * /*input*/, UErrorCode &errorCode) { + if (U_SUCCESS(errorCode)) { + errorCode = U_UNSUPPORTED_ERROR; + } + return *this; +} + +U_CFUNC +BreakIterator *ustrcase_getTitleBreakIterator( + const Locale *locale, const char *locID, uint32_t options, BreakIterator *iter, + LocalPointer &ownedIter, UErrorCode &errorCode) { + if (U_FAILURE(errorCode)) { return nullptr; } + options &= U_TITLECASE_ITERATOR_MASK; + if (options != 0 && iter != nullptr) { + errorCode = U_ILLEGAL_ARGUMENT_ERROR; + return nullptr; + } + if (iter == nullptr) { + switch (options) { + case 0: + iter = BreakIterator::createWordInstance( + locale != nullptr ? *locale : Locale(locID), errorCode); + break; + case U_TITLECASE_WHOLE_STRING: + iter = new WholeStringBreakIterator(); + if (iter == nullptr) { + errorCode = U_MEMORY_ALLOCATION_ERROR; + } + break; + case U_TITLECASE_SENTENCES: + iter = BreakIterator::createSentenceInstance( + locale != nullptr ? *locale : Locale(locID), errorCode); + break; + default: + errorCode = U_ILLEGAL_ARGUMENT_ERROR; + break; + } + ownedIter.adoptInstead(iter); + } + return iter; +} + +int32_t CaseMap::toTitle( + const char *locale, uint32_t options, BreakIterator *iter, + const UChar *src, int32_t srcLength, + UChar *dest, int32_t destCapacity, Edits *edits, + UErrorCode &errorCode) { + LocalPointer ownedIter; + iter = ustrcase_getTitleBreakIterator(nullptr, locale, options, iter, ownedIter, errorCode); + if(iter==NULL) { + return 0; + } + UnicodeString s(srcLength<0, src, srcLength); + iter->setText(s); + return ustrcase_map( + ustrcase_getCaseLocale(locale), options, iter, + dest, destCapacity, + src, srcLength, + ustrcase_internalToTitle, edits, errorCode); +} + +U_NAMESPACE_END + +U_NAMESPACE_USE U_CAPI int32_t U_EXPORT2 u_strToTitle(UChar *dest, int32_t destCapacity, @@ -55,22 +200,20 @@ u_strToTitle(UChar *dest, int32_t destCapacity, UBreakIterator *titleIter, const char *locale, UErrorCode *pErrorCode) { - UCaseMap csm=UCASEMAP_INITIALIZER; - setTempCaseMap(&csm, locale); - if(titleIter!=NULL) { - ubrk_setText(csm.iter=titleIter, src, srcLength, pErrorCode); - } else { - csm.iter=ubrk_open(UBRK_WORD, csm.locale, src, srcLength, pErrorCode); + LocalPointer ownedIter; + BreakIterator *iter = ustrcase_getTitleBreakIterator( + nullptr, locale, 0, reinterpret_cast(titleIter), + ownedIter, *pErrorCode); + if (iter == nullptr) { + return 0; } - int32_t length=ustrcase_map( - &csm, + UnicodeString s(srcLength<0, src, srcLength); + iter->setText(s); + return ustrcase_mapWithOverlap( + ustrcase_getCaseLocale(locale), 0, iter, dest, destCapacity, src, srcLength, - ustrcase_internalToTitle, pErrorCode); - if(titleIter==NULL && csm.iter!=NULL) { - ubrk_close(csm.iter); - } - return length; + ustrcase_internalToTitle, *pErrorCode); } U_CAPI int32_t U_EXPORT2 @@ -78,16 +221,25 @@ ucasemap_toTitle(UCaseMap *csm, UChar *dest, int32_t destCapacity, const UChar *src, int32_t srcLength, UErrorCode *pErrorCode) { - if(csm->iter!=NULL) { - ubrk_setText(csm->iter, src, srcLength, pErrorCode); - } else { - csm->iter=ubrk_open(UBRK_WORD, csm->locale, src, srcLength, pErrorCode); + if (U_FAILURE(*pErrorCode)) { + return 0; + } + if (csm->iter == NULL) { + LocalPointer ownedIter; + BreakIterator *iter = ustrcase_getTitleBreakIterator( + nullptr, csm->locale, csm->options, nullptr, ownedIter, *pErrorCode); + if (iter == nullptr) { + return 0; + } + csm->iter = ownedIter.orphan(); } + UnicodeString s(srcLength<0, src, srcLength); + csm->iter->setText(s); return ustrcase_map( - csm, + csm->caseLocale, csm->options, csm->iter, dest, destCapacity, src, srcLength, - ustrcase_internalToTitle, pErrorCode); + ustrcase_internalToTitle, NULL, *pErrorCode); } #endif // !UCONFIG_NO_BREAK_ITERATION diff --git a/Build/source/libs/icu/icu-src/source/common/ustr_wcs.cpp b/Build/source/libs/icu/icu-src/source/common/ustr_wcs.cpp index 59a58692ec3..e72054969c7 100644 --- a/Build/source/libs/icu/icu-src/source/common/ustr_wcs.cpp +++ b/Build/source/libs/icu/icu-src/source/common/ustr_wcs.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* @@ -8,7 +8,7 @@ * ******************************************************************************* * file name: ustr_wcs.cpp -* encoding: US-ASCII +* encoding: UTF-8 * tab size: 8 (not used) * indentation:4 * @@ -254,7 +254,7 @@ u_strToWCS(wchar_t *dest, srcLength = u_strlen(src); } if(0 < srcLength && srcLength <= destCapacity){ - u_memcpy(dest, src, srcLength); + u_memcpy((UChar *)dest, src, srcLength); } if(pDestLength){ *pDestLength = srcLength; @@ -509,7 +509,7 @@ u_strFromWCS(UChar *dest, srcLength = u_strlen((const UChar *)src); } if(0 < srcLength && srcLength <= destCapacity){ - u_memcpy(dest, src, srcLength); + u_memcpy(dest, (const UChar *)src, srcLength); } if(pDestLength){ *pDestLength = srcLength; diff --git a/Build/source/libs/icu/icu-src/source/common/ustrcase.cpp b/Build/source/libs/icu/icu-src/source/common/ustrcase.cpp index 8f594ec2785..b1beb342778 100644 --- a/Build/source/libs/icu/icu-src/source/common/ustrcase.cpp +++ b/Build/source/libs/icu/icu-src/source/common/ustrcase.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* @@ -8,7 +8,7 @@ * ******************************************************************************* * file name: ustrcase.cpp -* encoding: US-ASCII +* encoding: UTF-8 * tab size: 8 (not used) * indentation:4 * @@ -22,6 +22,9 @@ #include "unicode/utypes.h" #include "unicode/brkiter.h" +#include "unicode/casemap.h" +#include "unicode/edits.h" +#include "unicode/stringoptions.h" #include "unicode/ustring.h" #include "unicode/ucasemap.h" #include "unicode/ubrk.h" @@ -29,9 +32,30 @@ #include "unicode/utf16.h" #include "cmemory.h" #include "ucase.h" +#include "ucasemap_imp.h" #include "ustr_imp.h" #include "uassert.h" +U_NAMESPACE_BEGIN + +namespace { + +int32_t checkOverflowAndEditsError(int32_t destIndex, int32_t destCapacity, + Edits *edits, UErrorCode &errorCode) { + if (U_SUCCESS(errorCode)) { + if (destIndex > destCapacity) { + errorCode = U_BUFFER_OVERFLOW_ERROR; + } else if (edits != NULL) { + edits->copyErrorTo(errorCode); + } + } + return destIndex; +} + +} // namespace + +U_NAMESPACE_END + U_NAMESPACE_USE /* string casing ------------------------------------------------------------ */ @@ -39,21 +63,43 @@ U_NAMESPACE_USE /* Appends a full case mapping result, see UCASE_MAX_STRING_LENGTH. */ static inline int32_t appendResult(UChar *dest, int32_t destIndex, int32_t destCapacity, - int32_t result, const UChar *s) { + int32_t result, const UChar *s, + int32_t cpLength, uint32_t options, icu::Edits *edits) { UChar32 c; int32_t length; /* decode the result */ if(result<0) { /* (not) original code point */ + if(edits!=NULL) { + edits->addUnchanged(cpLength); + } + if(options & U_OMIT_UNCHANGED_TEXT) { + return destIndex; + } c=~result; - length=U16_LENGTH(c); - } else if(result<=UCASE_MAX_STRING_LENGTH) { - c=U_SENTINEL; - length=result; + if(destIndexaddReplace(cpLength, 1); + } + return destIndex; + } else { + c=result; + length=U16_LENGTH(c); + } + if(edits!=NULL) { + edits->addReplace(cpLength, length); + } } if(length>(INT32_MAX-destIndex)) { return -1; // integer overflow @@ -99,9 +145,15 @@ appendUChar(UChar *dest, int32_t destIndex, int32_t destCapacity, UChar c) { } static inline int32_t -appendString(UChar *dest, int32_t destIndex, int32_t destCapacity, - const UChar *s, int32_t length) { +appendUnchanged(UChar *dest, int32_t destIndex, int32_t destCapacity, + const UChar *s, int32_t length, uint32_t options, icu::Edits *edits) { if(length>0) { + if(edits!=NULL) { + edits->addUnchanged(length); + } + if(options & U_OMIT_UNCHANGED_TEXT) { + return destIndex; + } if(length>(INT32_MAX-destIndex)) { return -1; // integer overflow } @@ -150,123 +202,101 @@ utf16_caseContextIterator(void *context, int8_t dir) { * context [0..srcLength[ into account. */ static int32_t -_caseMap(const UCaseMap *csm, UCaseMapFull *map, +_caseMap(int32_t caseLocale, uint32_t options, UCaseMapFull *map, UChar *dest, int32_t destCapacity, const UChar *src, UCaseContext *csc, int32_t srcStart, int32_t srcLimit, - UErrorCode *pErrorCode) { - const UChar *s; - UChar32 c, c2 = 0; - int32_t srcIndex, destIndex; - int32_t locCache; - - locCache=csm->locCache; - + icu::Edits *edits, + UErrorCode &errorCode) { /* case mapping loop */ - srcIndex=srcStart; - destIndex=0; + int32_t srcIndex=srcStart; + int32_t destIndex=0; while(srcIndexcpStart=srcIndex; + int32_t cpStart; + csc->cpStart=cpStart=srcIndex; + UChar32 c; U16_NEXT(src, srcIndex, srcLimit, c); csc->cpLimit=srcIndex; - c=map(csm->csp, c, utf16_caseContextIterator, csc, &s, csm->locale, &locCache); - if((destIndexdestCapacity) { - *pErrorCode=U_BUFFER_OVERFLOW_ERROR; - } return destIndex; } #if !UCONFIG_NO_BREAK_ITERATION U_CFUNC int32_t U_CALLCONV -ustrcase_internalToTitle(const UCaseMap *csm, +ustrcase_internalToTitle(int32_t caseLocale, uint32_t options, BreakIterator *iter, UChar *dest, int32_t destCapacity, const UChar *src, int32_t srcLength, - UErrorCode *pErrorCode) { - const UChar *s; - UChar32 c; - int32_t prev, titleStart, titleLimit, idx, destIndex; - UBool isFirstIndex; - - if(U_FAILURE(*pErrorCode)) { + icu::Edits *edits, + UErrorCode &errorCode) { + if (!ustrcase_checkTitleAdjustmentOptions(options, errorCode)) { return 0; } - // Use the C++ abstract base class to minimize dependencies. - // TODO: Change UCaseMap.iter to store a BreakIterator directly. - BreakIterator *bi=reinterpret_cast(csm->iter); - /* set up local variables */ - int32_t locCache=csm->locCache; UCaseContext csc=UCASECONTEXT_INITIALIZER; csc.p=(void *)src; csc.limit=srcLength; - destIndex=0; - prev=0; - isFirstIndex=TRUE; + int32_t destIndex=0; + int32_t prev=0; + UBool isFirstIndex=TRUE; /* titlecasing loop */ while(prevfirst(); + index=iter->first(); } else { - idx=bi->next(); + index=iter->next(); } - if(idx==UBRK_DONE || idx>srcLength) { - idx=srcLength; + if(index==UBRK_DONE || index>srcLength) { + index=srcLength; } /* - * Unicode 4 & 5 section 3.13 Default Case Operations: - * - * R3 toTitlecase(X): Find the word boundaries based on Unicode Standard Annex - * #29, "Text Boundaries." Between each pair of word boundaries, find the first - * cased character F. If F exists, map F to default_title(F); then map each - * subsequent character C to default_lower(C). - * - * In this implementation, segment [prev..index[ into 3 parts: - * a) uncased characters (copy as-is) [prev..titleStart[ - * b) first case letter (titlecase) [titleStart..titleLimit[ + * Segment [prev..index[ into 3 parts: + * a) skipped characters (copy as-is) [prev..titleStart[ + * b) first letter (titlecase) [titleStart..titleLimit[ * c) subsequent characters (lowercase) [titleLimit..index[ */ - if(prevoptions&U_TITLECASE_NO_BREAK_ADJUSTMENT)==0 && UCASE_NONE==ucase_getType(csm->csp, c)) { - /* Adjust the titlecasing index (titleStart) to the next cased character. */ - for(;;) { + if(prevcsp, c)) { - break; /* cased letter at [titleStart..titleLimit[ */ - } + U16_NEXT(src, titleLimit, index, c); } - destIndex=appendString(dest, destIndex, destCapacity, src+prev, titleStart-prev); - if(destIndex<0) { - *pErrorCode=U_INDEX_OUTOFBOUNDS_ERROR; - return 0; + if (prev < titleStart) { + destIndex=appendUnchanged(dest, destIndex, destCapacity, + src+prev, titleStart-prev, options, edits); + if(destIndex<0) { + errorCode=U_INDEX_OUTOFBOUNDS_ERROR; + return 0; + } } } @@ -274,48 +304,64 @@ ustrcase_internalToTitle(const UCaseMap *csm, /* titlecase c which is from [titleStart..titleLimit[ */ csc.cpStart=titleStart; csc.cpLimit=titleLimit; - c=ucase_toFullTitle(csm->csp, c, utf16_caseContextIterator, &csc, &s, csm->locale, &locCache); - destIndex=appendResult(dest, destIndex, destCapacity, c, s); + const UChar *s; + c=ucase_toFullTitle(c, utf16_caseContextIterator, &csc, &s, caseLocale); + destIndex=appendResult(dest, destIndex, destCapacity, c, s, + titleLimit-titleStart, options, edits); if(destIndex<0) { - *pErrorCode=U_INDEX_OUTOFBOUNDS_ERROR; + errorCode=U_INDEX_OUTOFBOUNDS_ERROR; return 0; } /* Special case Dutch IJ titlecasing */ - if (titleStart+1 < idx && - ucase_getCaseLocale(csm->locale,&locCache) == UCASE_LOC_DUTCH && - (src[titleStart] == 0x0049 || src[titleStart] == 0x0069) && - (src[titleStart+1] == 0x004A || src[titleStart+1] == 0x006A)) { - destIndex=appendUChar(dest, destIndex, destCapacity, 0x004A); - if(destIndex<0) { - *pErrorCode=U_INDEX_OUTOFBOUNDS_ERROR; - return 0; + if (titleStart+1 < index && + caseLocale == UCASE_LOC_DUTCH && + (src[titleStart] == 0x0049 || src[titleStart] == 0x0069)) { + if (src[titleStart+1] == 0x006A) { + destIndex=appendUChar(dest, destIndex, destCapacity, 0x004A); + if(destIndex<0) { + errorCode=U_INDEX_OUTOFBOUNDS_ERROR; + return 0; + } + if(edits!=NULL) { + edits->addReplace(1, 1); + } + titleLimit++; + } else if (src[titleStart+1] == 0x004A) { + // Keep the capital J from getting lowercased. + destIndex=appendUnchanged(dest, destIndex, destCapacity, + src+titleStart+1, 1, options, edits); + if(destIndex<0) { + errorCode=U_INDEX_OUTOFBOUNDS_ERROR; + return 0; + } + titleLimit++; } - titleLimit++; } /* lowercase [titleLimit..index[ */ - if(titleLimitoptions&U_TITLECASE_NO_LOWERCASE)==0) { + if(titleLimitdestCapacity) { - *pErrorCode=U_BUFFER_OVERFLOW_ERROR; - } - return destIndex; + return checkOverflowAndEditsError(destIndex, destCapacity, edits, errorCode); } #endif // !UCONFIG_NO_BREAK_ITERATION @@ -791,11 +834,11 @@ uint32_t getDiacriticData(UChar32 c) { } } -UBool isFollowedByCasedLetter(const UCaseProps *csp, const UChar *s, int32_t i, int32_t length) { +UBool isFollowedByCasedLetter(const UChar *s, int32_t i, int32_t length) { while (i < length) { UChar32 c; U16_NEXT(s, i, length, c); - int32_t type = ucase_getTypeOrIgnorable(csp, c); + int32_t type = ucase_getTypeOrIgnorable(c); if ((type & UCASE_IGNORABLE) != 0) { // Case-ignorable, continue with the loop. } else if (type != UCASE_NONE) { @@ -813,11 +856,11 @@ UBool isFollowedByCasedLetter(const UCaseProps *csp, const UChar *s, int32_t i, * for each character. * TODO: Try to re-consolidate one way or another with the non-Greek function. */ -int32_t toUpper(const UCaseMap *csm, +int32_t toUpper(uint32_t options, UChar *dest, int32_t destCapacity, const UChar *src, int32_t srcLength, - UErrorCode *pErrorCode) { - int32_t locCache = UCASE_LOC_GREEK; + Edits *edits, + UErrorCode &errorCode) { int32_t destIndex=0; uint32_t state = 0; for (int32_t i = 0; i < srcLength;) { @@ -825,7 +868,7 @@ int32_t toUpper(const UCaseMap *csm, UChar32 c; U16_NEXT(src, nextIndex, srcLength, c); uint32_t nextState = 0; - int32_t type = ucase_getTypeOrIgnorable(csm->csp, c); + int32_t type = ucase_getTypeOrIgnorable(c); if ((type & UCASE_IGNORABLE) != 0) { // c is case-ignorable nextState |= (state & AFTER_CASED); @@ -872,7 +915,7 @@ int32_t toUpper(const UCaseMap *csm, (data & HAS_ACCENT) != 0 && numYpogegrammeni == 0 && (state & AFTER_CASED) == 0 && - !isFollowedByCasedLetter(csm->csp, src, nextIndex, srcLength)) { + !isFollowedByCasedLetter(src, nextIndex, srcLength)) { // Keep disjunctive "or" with (only) a tonos. // We use the same "word boundary" conditions as for the Final_Sigma test. if (i == nextIndex) { @@ -890,43 +933,69 @@ int32_t toUpper(const UCaseMap *csm, data &= ~HAS_EITHER_DIALYTIKA; } } - destIndex=appendUChar(dest, destIndex, destCapacity, (UChar)upper); - if (destIndex >= 0 && (data & HAS_EITHER_DIALYTIKA) != 0) { - destIndex=appendUChar(dest, destIndex, destCapacity, 0x308); // restore or add a dialytika - } - if (destIndex >= 0 && addTonos) { - destIndex=appendUChar(dest, destIndex, destCapacity, 0x301); - } - while (destIndex >= 0 && numYpogegrammeni > 0) { - destIndex=appendUChar(dest, destIndex, destCapacity, 0x399); - --numYpogegrammeni; - } - if(destIndex<0) { - *pErrorCode=U_INDEX_OUTOFBOUNDS_ERROR; - return 0; - } - } else { - const UChar *s; - UChar32 c2 = 0; - c=ucase_toFullUpper(csm->csp, c, NULL, NULL, &s, csm->locale, &locCache); - if((destIndex 0; + int32_t i2 = i + 1; + if ((data & HAS_EITHER_DIALYTIKA) != 0) { + change |= i2 >= nextIndex || src[i2] != 0x308; + ++i2; + } + if (addTonos) { + change |= i2 >= nextIndex || src[i2] != 0x301; + ++i2; + } + int32_t oldLength = nextIndex - i; + int32_t newLength = (i2 - i) + numYpogegrammeni; + change |= oldLength != newLength; + if (change) { + if (edits != NULL) { + edits->addReplace(oldLength, newLength); + } + } else { + if (edits != NULL) { + edits->addUnchanged(oldLength); + } + // Write unchanged text? + change = (options & U_OMIT_UNCHANGED_TEXT) == 0; + } + } + + if (change) { + destIndex=appendUChar(dest, destIndex, destCapacity, (UChar)upper); + if (destIndex >= 0 && (data & HAS_EITHER_DIALYTIKA) != 0) { + destIndex=appendUChar(dest, destIndex, destCapacity, 0x308); // restore or add a dialytika + } + if (destIndex >= 0 && addTonos) { + destIndex=appendUChar(dest, destIndex, destCapacity, 0x301); + } + while (destIndex >= 0 && numYpogegrammeni > 0) { + destIndex=appendUChar(dest, destIndex, destCapacity, 0x399); + --numYpogegrammeni; + } if(destIndex<0) { - *pErrorCode=U_INDEX_OUTOFBOUNDS_ERROR; + errorCode=U_INDEX_OUTOFBOUNDS_ERROR; return 0; } } + } else { + const UChar *s; + c=ucase_toFullUpper(c, NULL, NULL, &s, UCASE_LOC_GREEK); + destIndex = appendResult(dest, destIndex, destCapacity, c, s, + nextIndex - i, options, edits); + if (destIndex < 0) { + errorCode = U_INDEX_OUTOFBOUNDS_ERROR; + return 0; + } } i = nextIndex; state = nextState; } - if(destIndex>destCapacity) { - *pErrorCode=U_BUFFER_OVERFLOW_ERROR; - } return destIndex; } @@ -936,94 +1005,128 @@ U_NAMESPACE_END /* functions available in the common library (for unistr_case.cpp) */ U_CFUNC int32_t U_CALLCONV -ustrcase_internalToLower(const UCaseMap *csm, +ustrcase_internalToLower(int32_t caseLocale, uint32_t options, UCASEMAP_BREAK_ITERATOR_UNUSED UChar *dest, int32_t destCapacity, const UChar *src, int32_t srcLength, - UErrorCode *pErrorCode) { + icu::Edits *edits, + UErrorCode &errorCode) { UCaseContext csc=UCASECONTEXT_INITIALIZER; csc.p=(void *)src; csc.limit=srcLength; - return _caseMap( - csm, ucase_toFullLower, + int32_t destIndex = _caseMap( + caseLocale, options, ucase_toFullLower, dest, destCapacity, src, &csc, 0, srcLength, - pErrorCode); + edits, errorCode); + return checkOverflowAndEditsError(destIndex, destCapacity, edits, errorCode); } U_CFUNC int32_t U_CALLCONV -ustrcase_internalToUpper(const UCaseMap *csm, +ustrcase_internalToUpper(int32_t caseLocale, uint32_t options, UCASEMAP_BREAK_ITERATOR_UNUSED UChar *dest, int32_t destCapacity, const UChar *src, int32_t srcLength, - UErrorCode *pErrorCode) { - int32_t locCache = csm->locCache; - if (ucase_getCaseLocale(csm->locale, &locCache) == UCASE_LOC_GREEK) { - return GreekUpper::toUpper(csm, dest, destCapacity, src, srcLength, pErrorCode); + icu::Edits *edits, + UErrorCode &errorCode) { + int32_t destIndex; + if (caseLocale == UCASE_LOC_GREEK) { + destIndex = GreekUpper::toUpper(options, dest, destCapacity, + src, srcLength, edits, errorCode); + } else { + UCaseContext csc=UCASECONTEXT_INITIALIZER; + csc.p=(void *)src; + csc.limit=srcLength; + destIndex = _caseMap( + caseLocale, options, ucase_toFullUpper, + dest, destCapacity, + src, &csc, 0, srcLength, + edits, errorCode); } - UCaseContext csc=UCASECONTEXT_INITIALIZER; - csc.p=(void *)src; - csc.limit=srcLength; - return _caseMap( - csm, ucase_toFullUpper, - dest, destCapacity, - src, &csc, 0, srcLength, - pErrorCode); + return checkOverflowAndEditsError(destIndex, destCapacity, edits, errorCode); } -static int32_t -ustr_foldCase(const UCaseProps *csp, - UChar *dest, int32_t destCapacity, - const UChar *src, int32_t srcLength, - uint32_t options, - UErrorCode *pErrorCode) { - int32_t srcIndex, destIndex; - - const UChar *s; - UChar32 c, c2 = 0; - +U_CFUNC int32_t U_CALLCONV +ustrcase_internalFold(int32_t /* caseLocale */, uint32_t options, UCASEMAP_BREAK_ITERATOR_UNUSED + UChar *dest, int32_t destCapacity, + const UChar *src, int32_t srcLength, + icu::Edits *edits, + UErrorCode &errorCode) { /* case mapping loop */ - srcIndex=destIndex=0; - while(srcIndexdestCapacity) { - *pErrorCode=U_BUFFER_OVERFLOW_ERROR; - } - return destIndex; -} - -U_CFUNC int32_t U_CALLCONV -ustrcase_internalFold(const UCaseMap *csm, - UChar *dest, int32_t destCapacity, - const UChar *src, int32_t srcLength, - UErrorCode *pErrorCode) { - return ustr_foldCase(csm->csp, dest, destCapacity, src, srcLength, csm->options, pErrorCode); + return checkOverflowAndEditsError(destIndex, destCapacity, edits, errorCode); } U_CFUNC int32_t -ustrcase_map(const UCaseMap *csm, +ustrcase_map(int32_t caseLocale, uint32_t options, UCASEMAP_BREAK_ITERATOR_PARAM UChar *dest, int32_t destCapacity, const UChar *src, int32_t srcLength, UStringCaseMapper *stringCaseMapper, - UErrorCode *pErrorCode) { + icu::Edits *edits, + UErrorCode &errorCode) { + int32_t destLength; + + /* check argument values */ + if(U_FAILURE(errorCode)) { + return 0; + } + if( destCapacity<0 || + (dest==NULL && destCapacity>0) || + src==NULL || + srcLength<-1 + ) { + errorCode=U_ILLEGAL_ARGUMENT_ERROR; + return 0; + } + + /* get the string length */ + if(srcLength==-1) { + srcLength=u_strlen(src); + } + + /* check for overlapping source and destination */ + if( dest!=NULL && + ((src>=dest && src<(dest+destCapacity)) || + (dest>=src && dest<(src+srcLength))) + ) { + errorCode=U_ILLEGAL_ARGUMENT_ERROR; + return 0; + } + + if (edits != nullptr && (options & U_EDITS_NO_RESET) == 0) { + edits->reset(); + } + destLength=stringCaseMapper(caseLocale, options, UCASEMAP_BREAK_ITERATOR + dest, destCapacity, src, srcLength, edits, errorCode); + return u_terminateUChars(dest, destCapacity, destLength, &errorCode); +} + +U_CFUNC int32_t +ustrcase_mapWithOverlap(int32_t caseLocale, uint32_t options, UCASEMAP_BREAK_ITERATOR_PARAM + UChar *dest, int32_t destCapacity, + const UChar *src, int32_t srcLength, + UStringCaseMapper *stringCaseMapper, + UErrorCode &errorCode) { UChar buffer[300]; UChar *temp; int32_t destLength; /* check argument values */ - if(U_FAILURE(*pErrorCode)) { + if(U_FAILURE(errorCode)) { return 0; } if( destCapacity<0 || @@ -1031,7 +1134,7 @@ ustrcase_map(const UCaseMap *csm, src==NULL || srcLength<-1 ) { - *pErrorCode=U_ILLEGAL_ARGUMENT_ERROR; + errorCode=U_ILLEGAL_ARGUMENT_ERROR; return 0; } @@ -1053,7 +1156,7 @@ ustrcase_map(const UCaseMap *csm, /* allocate a buffer */ temp=(UChar *)uprv_malloc(destCapacity*U_SIZEOF_UCHAR); if(temp==NULL) { - *pErrorCode=U_MEMORY_ALLOCATION_ERROR; + errorCode=U_MEMORY_ALLOCATION_ERROR; return 0; } } @@ -1061,21 +1164,19 @@ ustrcase_map(const UCaseMap *csm, temp=dest; } - destLength=stringCaseMapper(csm, temp, destCapacity, src, srcLength, pErrorCode); + destLength=stringCaseMapper(caseLocale, options, UCASEMAP_BREAK_ITERATOR + temp, destCapacity, src, srcLength, NULL, errorCode); if(temp!=dest) { /* copy the result string to the destination buffer */ - if(destLength>0) { - int32_t copyLength= destLength<=destCapacity ? destLength : destCapacity; - if(copyLength>0) { - u_memmove(dest, temp, copyLength); - } + if (U_SUCCESS(errorCode) && 0 < destLength && destLength <= destCapacity) { + u_memmove(dest, temp, destLength); } if(temp!=buffer) { uprv_free(temp); } } - return u_terminateUChars(dest, destCapacity, destLength, pErrorCode); + return u_terminateUChars(dest, destCapacity, destLength, &errorCode); } /* public API functions */ @@ -1085,16 +1186,29 @@ u_strFoldCase(UChar *dest, int32_t destCapacity, const UChar *src, int32_t srcLength, uint32_t options, UErrorCode *pErrorCode) { - UCaseMap csm=UCASEMAP_INITIALIZER; - csm.csp=ucase_getSingleton(); - csm.options=options; + return ustrcase_mapWithOverlap( + UCASE_LOC_ROOT, options, UCASEMAP_BREAK_ITERATOR_NULL + dest, destCapacity, + src, srcLength, + ustrcase_internalFold, *pErrorCode); +} + +U_NAMESPACE_BEGIN + +int32_t CaseMap::fold( + uint32_t options, + const UChar *src, int32_t srcLength, + UChar *dest, int32_t destCapacity, Edits *edits, + UErrorCode &errorCode) { return ustrcase_map( - &csm, + UCASE_LOC_ROOT, options, UCASEMAP_BREAK_ITERATOR_NULL dest, destCapacity, src, srcLength, - ustrcase_internalFold, pErrorCode); + ustrcase_internalFold, edits, errorCode); } +U_NAMESPACE_END + /* case-insensitive string comparisons -------------------------------------- */ /* @@ -1134,8 +1248,6 @@ static int32_t _cmpFold( UErrorCode *pErrorCode) { int32_t cmpRes = 0; - const UCaseProps *csp; - /* current-level start/limit - s1/s2 as current */ const UChar *start1, *start2, *limit1, *limit2; @@ -1167,7 +1279,6 @@ static int32_t _cmpFold( * assume that at least the option U_COMPARE_IGNORE_CASE is set * otherwise this function would have to behave exactly as uprv_strCompare() */ - csp=ucase_getSingleton(); if(U_FAILURE(*pErrorCode)) { return 0; } @@ -1349,7 +1460,7 @@ static int32_t _cmpFold( */ if( level1==0 && - (length=ucase_toFullFolding(csp, (UChar32)cp1, &p, options))>=0 + (length=ucase_toFullFolding((UChar32)cp1, &p, options))>=0 ) { /* cp1 case-folds to the code point "length" or to p[length] */ if(U_IS_SURROGATE(c1)) { @@ -1395,7 +1506,7 @@ static int32_t _cmpFold( } if( level2==0 && - (length=ucase_toFullFolding(csp, (UChar32)cp2, &p, options))>=0 + (length=ucase_toFullFolding((UChar32)cp2, &p, options))>=0 ) { /* cp2 case-folds to the code point "length" or to p[length] */ if(U_IS_SURROGATE(c2)) { diff --git a/Build/source/libs/icu/icu-src/source/common/ustrcase_locale.cpp b/Build/source/libs/icu/icu-src/source/common/ustrcase_locale.cpp index 78f4bbd7a2f..2ecd24f03ec 100644 --- a/Build/source/libs/icu/icu-src/source/common/ustrcase_locale.cpp +++ b/Build/source/libs/icu/icu-src/source/common/ustrcase_locale.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* @@ -6,7 +6,7 @@ * Corporation and others. All Rights Reserved. ******************************************************************************* * file name: ustrcase_locale.cpp -* encoding: US-ASCII +* encoding: UTF-8 * tab size: 8 (not used) * indentation:4 * @@ -18,66 +18,24 @@ */ #include "unicode/utypes.h" +#include "uassert.h" +#include "unicode/brkiter.h" +#include "unicode/casemap.h" #include "unicode/ucasemap.h" #include "unicode/uloc.h" #include "unicode/ustring.h" #include "ucase.h" -#include "ustr_imp.h" +#include "ucasemap_imp.h" -U_CFUNC void -ustrcase_setTempCaseMapLocale(UCaseMap *csm, const char *locale) { - /* - * We could call ucasemap_setLocale(), but here we really only care about - * the initial language subtag, we need not return the real string via - * ucasemap_getLocale(), and we don't care about only getting "x" from - * "x-some-thing" etc. - * - * We ignore locales with a longer-than-3 initial subtag. - * - * We also do not fill in the locCache because it is rarely used, - * and not worth setting unless we reuse it for many case mapping operations. - * (That's why UCaseMap was created.) - */ - int i; - char c; - - /* the internal functions require locale!=NULL */ - if(locale==NULL) { - // Do not call uprv_getDefaultLocaleID() because that does not see - // changes to the default locale via uloc_setDefault(). - // It would also be inefficient if used frequently because uprv_getDefaultLocaleID() - // does not cache the locale ID. - // - // Unfortunately, uloc_getDefault() has many dependencies. - // We only care about a small set of language subtags, - // and we do not need the locale ID to be canonicalized. - // - // Best is to not call case mapping functions with a NULL locale ID. - locale=uloc_getDefault(); - } - for(i=0; i<4 && (c=locale[i])!=0 && c!='-' && c!='_'; ++i) { - csm->locale[i]=c; - } - if(i<=3) { - csm->locale[i]=0; /* Up to 3 non-separator characters. */ - } else { - csm->locale[0]=0; /* Longer-than-3 initial subtag: Ignore. */ - } -} - -/* - * Set parameters on an empty UCaseMap, for UCaseMap-less API functions. - * Do this fast because it is called with every function call. - */ -static inline void -setTempCaseMap(UCaseMap *csm, const char *locale) { - if(csm->csp==NULL) { - csm->csp=ucase_getSingleton(); +U_CFUNC int32_t +ustrcase_getCaseLocale(const char *locale) { + if (locale == NULL) { + locale = uloc_getDefault(); } - if(locale!=NULL && locale[0]==0) { - csm->locale[0]=0; + if (*locale == 0) { + return UCASE_LOC_ROOT; } else { - ustrcase_setTempCaseMapLocale(csm, locale); + return ucase_getCaseLocale(locale); } } @@ -88,13 +46,11 @@ u_strToLower(UChar *dest, int32_t destCapacity, const UChar *src, int32_t srcLength, const char *locale, UErrorCode *pErrorCode) { - UCaseMap csm=UCASEMAP_INITIALIZER; - setTempCaseMap(&csm, locale); - return ustrcase_map( - &csm, + return ustrcase_mapWithOverlap( + ustrcase_getCaseLocale(locale), 0, UCASEMAP_BREAK_ITERATOR_NULL dest, destCapacity, src, srcLength, - ustrcase_internalToLower, pErrorCode); + ustrcase_internalToLower, *pErrorCode); } U_CAPI int32_t U_EXPORT2 @@ -102,11 +58,37 @@ u_strToUpper(UChar *dest, int32_t destCapacity, const UChar *src, int32_t srcLength, const char *locale, UErrorCode *pErrorCode) { - UCaseMap csm=UCASEMAP_INITIALIZER; - setTempCaseMap(&csm, locale); + return ustrcase_mapWithOverlap( + ustrcase_getCaseLocale(locale), 0, UCASEMAP_BREAK_ITERATOR_NULL + dest, destCapacity, + src, srcLength, + ustrcase_internalToUpper, *pErrorCode); +} + +U_NAMESPACE_BEGIN + +int32_t CaseMap::toLower( + const char *locale, uint32_t options, + const UChar *src, int32_t srcLength, + UChar *dest, int32_t destCapacity, Edits *edits, + UErrorCode &errorCode) { + return ustrcase_map( + ustrcase_getCaseLocale(locale), options, UCASEMAP_BREAK_ITERATOR_NULL + dest, destCapacity, + src, srcLength, + ustrcase_internalToLower, edits, errorCode); +} + +int32_t CaseMap::toUpper( + const char *locale, uint32_t options, + const UChar *src, int32_t srcLength, + UChar *dest, int32_t destCapacity, Edits *edits, + UErrorCode &errorCode) { return ustrcase_map( - &csm, + ustrcase_getCaseLocale(locale), options, UCASEMAP_BREAK_ITERATOR_NULL dest, destCapacity, src, srcLength, - ustrcase_internalToUpper, pErrorCode); + ustrcase_internalToUpper, edits, errorCode); } + +U_NAMESPACE_END diff --git a/Build/source/libs/icu/icu-src/source/common/ustrenum.cpp b/Build/source/libs/icu/icu-src/source/common/ustrenum.cpp index df732647a94..ed23eaa232e 100644 --- a/Build/source/libs/icu/icu-src/source/common/ustrenum.cpp +++ b/Build/source/libs/icu/icu-src/source/common/ustrenum.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** diff --git a/Build/source/libs/icu/icu-src/source/common/ustrenum.h b/Build/source/libs/icu/icu-src/source/common/ustrenum.h index c893cd193bc..a82162e2bde 100644 --- a/Build/source/libs/icu/icu-src/source/common/ustrenum.h +++ b/Build/source/libs/icu/icu-src/source/common/ustrenum.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** diff --git a/Build/source/libs/icu/icu-src/source/common/ustrfmt.c b/Build/source/libs/icu/icu-src/source/common/ustrfmt.c deleted file mode 100644 index c7805d8d2a3..00000000000 --- a/Build/source/libs/icu/icu-src/source/common/ustrfmt.c +++ /dev/null @@ -1,59 +0,0 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. -// License & terms of use: http://www.unicode.org/copyright.html -/* -********************************************************************** -* Copyright (C) 2001-2006, International Business Machines -* Corporation and others. All Rights Reserved. -********************************************************************** -*/ - -#include "cstring.h" -#include "ustrfmt.h" - - -/*** - * Fills in a UChar* string with the radix-based representation of a - * uint32_t number padded with zeroes to minwidth. The result - * will be null terminated if there is room. - * - * @param buffer UChar buffer to receive result - * @param capacity capacity of buffer - * @param i the unsigned number to be formatted - * @param radix the radix from 2..36 - * @param minwidth the minimum width. If the result is narrower than - * this, '0's will be added on the left. Must be <= - * capacity. - * @return the length of the result, not including any terminating - * null - */ -U_CAPI int32_t U_EXPORT2 -uprv_itou (UChar * buffer, int32_t capacity, - uint32_t i, uint32_t radix, int32_t minwidth) -{ - int32_t length = 0; - int digit; - int32_t j; - UChar temp; - - do{ - digit = (int)(i % radix); - buffer[length++]=(UChar)(digit<=9?(0x0030+digit):(0x0030+digit+7)); - i=i/radix; - } while(i && length=4 is always illegal: no more than 3 trail bytes in Unicode's UTF-8 */ - illegal=1; - break; - case 3: - trail=(uint8_t)(*s++ - 0x80); - c=(c<<6)|trail; - if(trail>0x3f || c>=0x110) { - /* not a trail byte, or code point>0x10ffff (outside Unicode) */ - illegal=1; - break; - } - U_FALLTHROUGH; - case 2: - trail=(uint8_t)(*s++ - 0x80); - if(trail>0x3f) { - /* not a trail byte */ - illegal=1; - break; - } - c=(c<<6)|trail; - U_FALLTHROUGH; - case 1: - trail=(uint8_t)(*s++ - 0x80); - if(trail>0x3f) { - /* not a trail byte */ - illegal=1; - } - c=(c<<6)|trail; - break; - case 0: - return U_SENTINEL; - /* no default branch to optimize switch() - all values are covered */ - } - - /* correct sequence - all trail bytes have (b7..b6)==(10)? */ - /* illegal is also set if count>=4 */ - if(illegal || c0 && U8_IS_TRAIL(*s)) { - ++s; - --count; - } - c=U_SENTINEL; - } - *ps=s; - return c; -} - -/* - * Version of utf8_nextCharSafeBody() with the following differences: - * - works with pointers instead of indexes - * - always strict (strict==-1) - * - * *ps points to after the lead byte and will be moved to after the last trail byte. - * c is the lead byte. - * @return the code point, or U_SENTINEL - */ -static UChar32 -utf8_nextCharSafeBodyPointer(const uint8_t **ps, const uint8_t *limit, UChar32 c) { - const uint8_t *s=*ps; - uint8_t trail, illegal=0; - uint8_t count=U8_COUNT_TRAIL_BYTES(c); - if((limit-s)>=count) { - U8_MASK_LEAD_BYTE((c), count); - /* count==0 for illegally leading trail bytes and the illegal bytes 0xfe and 0xff */ - switch(count) { - /* each branch falls through to the next one */ - case 5: - case 4: - /* count>=4 is always illegal: no more than 3 trail bytes in Unicode's UTF-8 */ - illegal=1; - break; - case 3: - trail=*s++; - c=(c<<6)|(trail&0x3f); - if(c<0x110) { - illegal|=(trail&0xc0)^0x80; - } else { - /* code point>0x10ffff, outside Unicode */ - illegal=1; - break; - } - U_FALLTHROUGH; - case 2: - trail=*s++; - c=(c<<6)|(trail&0x3f); - illegal|=(trail&0xc0)^0x80; - U_FALLTHROUGH; - case 1: - trail=*s++; - c=(c<<6)|(trail&0x3f); - illegal|=(trail&0xc0)^0x80; - break; - case 0: - return U_SENTINEL; - /* no default branch to optimize switch() - all values are covered */ - } - } else { - illegal=1; /* too few bytes left */ - } - - /* correct sequence - all trail bytes have (b7..b6)==(10)? */ - /* illegal is also set if count>=4 */ - U_ASSERT(illegal || count0 && s 0) || subchar > 0x10ffff || U_IS_SURROGATE(subchar) @@ -434,7 +279,10 @@ u_strFromUTF8WithSub(UChar *dest, if(pNumSubstitutions!=NULL) { *pNumSubstitutions=0; } - numSubstitutions=0; + UChar *pDest = dest; + UChar *pDestLimit = dest+destCapacity; + int32_t reqLength = 0; + int32_t numSubstitutions=0; /* * Inline processing of UTF-8 byte sequences: @@ -455,95 +303,81 @@ u_strFromUTF8WithSub(UChar *dest, * The code explicitly checks for NULs only in the lead byte position. * A NUL byte in the trail byte position fails the trail byte range check anyway. */ - while(((ch = *pSrc) != 0) && (pDest < pDestLimit)) { - if(ch <= 0x7f){ - *pDest++=(UChar)ch; - ++pSrc; + int32_t i; + UChar32 c; + for(i = 0; (c = (uint8_t)src[i]) != 0 && (pDest < pDestLimit);) { + // modified copy of U8_NEXT() + ++i; + if(U8_IS_SINGLE(c)) { + *pDest++=(UChar)c; } else { - if(ch > 0xe0) { - if( /* handle U+1000..U+CFFF inline */ - ch <= 0xec && - (t1 = (uint8_t)(pSrc[1] - 0x80)) <= 0x3f && - (t2 = (uint8_t)(pSrc[2] - 0x80)) <= 0x3f - ) { - /* no need for (ch & 0xf) because the upper bits are truncated after <<12 in the cast to (UChar) */ - *pDest++ = (UChar)((ch << 12) | (t1 << 6) | t2); - pSrc += 3; - continue; - } - } else if(ch < 0xe0) { - if( /* handle U+0080..U+07FF inline */ - ch >= 0xc2 && - (t1 = (uint8_t)(pSrc[1] - 0x80)) <= 0x3f - ) { - *pDest++ = (UChar)(((ch & 0x1f) << 6) | t1); - pSrc += 2; - continue; - } - } - - /* function call for "complicated" and error cases */ - ++pSrc; /* continue after the lead byte */ - ch=utf8_nextCharSafeBodyTerminated(&pSrc, ch); - if(ch<0 && (++numSubstitutions, ch = subchar) < 0) { - *pErrorCode = U_INVALID_CHAR_FOUND; - return NULL; - } else if(ch<=0xFFFF) { - *(pDest++)=(UChar)ch; + uint8_t __t1, __t2; + if( /* handle U+0800..U+FFFF inline */ + (0xe0<=(c) && (c)<0xf0) && + U8_IS_VALID_LEAD3_AND_T1((c), src[i]) && + (__t2=src[(i)+1]-0x80)<=0x3f) { + *pDest++ = (((c)&0xf)<<12)|((src[i]&0x3f)<<6)|__t2; + i+=2; + } else if( /* handle U+0080..U+07FF inline */ + ((c)<0xe0 && (c)>=0xc2) && + (__t1=src[i]-0x80)<=0x3f) { + *pDest++ = (((c)&0x1f)<<6)|__t1; + ++(i); } else { - *(pDest++)=U16_LEAD(ch); - if(pDest 0xe0) { - if( /* handle U+1000..U+CFFF inline */ - ch <= 0xec && - (uint8_t)(pSrc[1] - 0x80) <= 0x3f && - (uint8_t)(pSrc[2] - 0x80) <= 0x3f - ) { - ++reqLength; - pSrc += 3; - continue; - } - } else if(ch < 0xe0) { - if( /* handle U+0080..U+07FF inline */ - ch >= 0xc2 && - (uint8_t)(pSrc[1] - 0x80) <= 0x3f - ) { - ++reqLength; - pSrc += 2; - continue; + uint8_t __t1, __t2; + if( /* handle U+0800..U+FFFF inline */ + (0xe0<=(c) && (c)<0xf0) && + U8_IS_VALID_LEAD3_AND_T1((c), src[i]) && + (__t2=src[(i)+1]-0x80)<=0x3f) { + ++reqLength; + i+=2; + } else if( /* handle U+0080..U+07FF inline */ + ((c)<0xe0 && (c)>=0xc2) && + (__t1=src[i]-0x80)<=0x3f) { + ++reqLength; + ++(i); + } else { + /* function call for "complicated" and error cases */ + (c)=utf8_nextCharSafeBody((const uint8_t *)src, &(i), -1, c, -1); + if(c<0 && (++numSubstitutions, c = subchar) < 0) { + *pErrorCode = U_INVALID_CHAR_FOUND; + return NULL; } + reqLength += U16_LENGTH(c); } - - /* function call for "complicated" and error cases */ - ++pSrc; /* continue after the lead byte */ - ch=utf8_nextCharSafeBodyTerminated(&pSrc, ch); - if(ch<0 && (++numSubstitutions, ch = subchar) < 0) { - *pErrorCode = U_INVALID_CHAR_FOUND; - return NULL; - } - reqLength += U16_LENGTH(ch); } } } else /* srcLength >= 0 */ { - const uint8_t *pSrcLimit = pSrc + srcLength; - int32_t count; - - /* Faster loop without ongoing checking for pSrcLimit and pDestLimit. */ + /* Faster loop without ongoing checking for srcLength and pDestLimit. */ + int32_t i = 0; + UChar32 c; for(;;) { /* * Each iteration of the inner loop progresses by at most 3 UTF-8 @@ -551,10 +385,10 @@ u_strFromUTF8WithSub(UChar *dest, * For supplementary code points (4 & 2), which are rare, * there is an additional adjustment. */ - count = (int32_t)(pDestLimit - pDest); - srcLength = (int32_t)((pSrcLimit - pSrc) / 3); - if(count > srcLength) { - count = srcLength; /* min(remaining dest, remaining src/3) */ + int32_t count = (int32_t)(pDestLimit - pDest); + int32_t count2 = (srcLength - i) / 3; + if(count > count2) { + count = count2; /* min(remaining dest, remaining src/3) */ } if(count < 3) { /* @@ -565,147 +399,123 @@ u_strFromUTF8WithSub(UChar *dest, } do { - ch = *pSrc; - if(ch <= 0x7f){ - *pDest++=(UChar)ch; - ++pSrc; + // modified copy of U8_NEXT() + c = (uint8_t)src[i++]; + if(U8_IS_SINGLE(c)) { + *pDest++=(UChar)c; } else { - if(ch > 0xe0) { - if( /* handle U+1000..U+CFFF inline */ - ch <= 0xec && - (t1 = (uint8_t)(pSrc[1] - 0x80)) <= 0x3f && - (t2 = (uint8_t)(pSrc[2] - 0x80)) <= 0x3f - ) { - /* no need for (ch & 0xf) because the upper bits are truncated after <<12 in the cast to (UChar) */ - *pDest++ = (UChar)((ch << 12) | (t1 << 6) | t2); - pSrc += 3; - continue; - } - } else if(ch < 0xe0) { - if( /* handle U+0080..U+07FF inline */ - ch >= 0xc2 && - (t1 = (uint8_t)(pSrc[1] - 0x80)) <= 0x3f - ) { - *pDest++ = (UChar)(((ch & 0x1f) << 6) | t1); - pSrc += 2; - continue; + uint8_t __t1, __t2; + if( /* handle U+0800..U+FFFF inline */ + (0xe0<=(c) && (c)<0xf0) && + ((i)+1)=0xc2) && + ((i)!=srcLength) && + (__t1=src[i]-0x80)<=0x3f) { + *pDest++ = (((c)&0x1f)<<6)|__t1; + ++(i); + } else { + if(c >= 0xf0 || subchar > 0xffff) { + // We may read up to four bytes and write up to two UChars, + // which we didn't account for with computing count, + // so we adjust it here. + if(--count == 0) { + --i; // back out byte c + break; + } } - } - if(ch >= 0xf0 || subchar > 0xffff) { - /* - * We may read up to six bytes and write up to two UChars, - * which we didn't account for with computing count, - * so we adjust it here. - */ - if(--count == 0) { - break; + /* function call for "complicated" and error cases */ + (c)=utf8_nextCharSafeBody((const uint8_t *)src, &(i), srcLength, c, -1); + if(c<0 && (++numSubstitutions, c = subchar) < 0) { + *pErrorCode = U_INVALID_CHAR_FOUND; + return NULL; + } else if(c<=0xFFFF) { + *(pDest++)=(UChar)c; + } else { + *(pDest++)=U16_LEAD(c); + *(pDest++)=U16_TRAIL(c); } } - - /* function call for "complicated" and error cases */ - ++pSrc; /* continue after the lead byte */ - ch=utf8_nextCharSafeBodyPointer(&pSrc, pSrcLimit, ch); - if(ch<0 && (++numSubstitutions, ch = subchar) < 0){ - *pErrorCode = U_INVALID_CHAR_FOUND; - return NULL; - }else if(ch<=0xFFFF){ - *(pDest++)=(UChar)ch; - }else{ - *(pDest++)=U16_LEAD(ch); - *(pDest++)=U16_TRAIL(ch); - } } } while(--count > 0); } - while((pSrc 0xe0) { - if( /* handle U+1000..U+CFFF inline */ - ch <= 0xec && - ((pSrcLimit - pSrc) >= 3) && - (t1 = (uint8_t)(pSrc[1] - 0x80)) <= 0x3f && - (t2 = (uint8_t)(pSrc[2] - 0x80)) <= 0x3f - ) { - /* no need for (ch & 0xf) because the upper bits are truncated after <<12 in the cast to (UChar) */ - *pDest++ = (UChar)((ch << 12) | (t1 << 6) | t2); - pSrc += 3; - continue; - } - } else if(ch < 0xe0) { - if( /* handle U+0080..U+07FF inline */ - ch >= 0xc2 && - ((pSrcLimit - pSrc) >= 2) && - (t1 = (uint8_t)(pSrc[1] - 0x80)) <= 0x3f - ) { - *pDest++ = (UChar)(((ch & 0x1f) << 6) | t1); - pSrc += 2; - continue; - } - } - - /* function call for "complicated" and error cases */ - ++pSrc; /* continue after the lead byte */ - ch=utf8_nextCharSafeBodyPointer(&pSrc, pSrcLimit, ch); - if(ch<0 && (++numSubstitutions, ch = subchar) < 0){ - *pErrorCode = U_INVALID_CHAR_FOUND; - return NULL; - }else if(ch<=0xFFFF){ - *(pDest++)=(UChar)ch; - }else{ - *(pDest++)=U16_LEAD(ch); - if(pDest=0xc2) && + ((i)!=srcLength) && + (__t1=src[i]-0x80)<=0x3f) { + *pDest++ = (((c)&0x1f)<<6)|__t1; + ++(i); + } else { + /* function call for "complicated" and error cases */ + (c)=utf8_nextCharSafeBody((const uint8_t *)src, &(i), srcLength, c, -1); + if(c<0 && (++numSubstitutions, c = subchar) < 0) { + *pErrorCode = U_INVALID_CHAR_FOUND; + return NULL; + } else if(c<=0xFFFF) { + *(pDest++)=(UChar)c; + } else { + *(pDest++)=U16_LEAD(c); + if(pDest 0xe0) { - if( /* handle U+1000..U+CFFF inline */ - ch <= 0xec && - ((pSrcLimit - pSrc) >= 3) && - (uint8_t)(pSrc[1] - 0x80) <= 0x3f && - (uint8_t)(pSrc[2] - 0x80) <= 0x3f - ) { - reqLength++; - pSrc += 3; - continue; - } - } else if(ch < 0xe0) { - if( /* handle U+0080..U+07FF inline */ - ch >= 0xc2 && - ((pSrcLimit - pSrc) >= 2) && - (uint8_t)(pSrc[1] - 0x80) <= 0x3f - ) { - reqLength++; - pSrc += 2; - continue; + uint8_t __t1, __t2; + if( /* handle U+0800..U+FFFF inline */ + (0xe0<=(c) && (c)<0xf0) && + ((i)+1)=0xc2) && + ((i)!=srcLength) && + (__t1=src[i]-0x80)<=0x3f) { + ++reqLength; + ++(i); + } else { + /* function call for "complicated" and error cases */ + (c)=utf8_nextCharSafeBody((const uint8_t *)src, &(i), srcLength, c, -1); + if(c<0 && (++numSubstitutions, c = subchar) < 0) { + *pErrorCode = U_INVALID_CHAR_FOUND; + return NULL; } + reqLength += U16_LENGTH(c); } - - /* function call for "complicated" and error cases */ - ++pSrc; /* continue after the lead byte */ - ch=utf8_nextCharSafeBodyPointer(&pSrc, pSrcLimit, ch); - if(ch<0 && (++numSubstitutions, ch = subchar) < 0){ - *pErrorCode = U_INVALID_CHAR_FOUND; - return NULL; - } - reqLength+=U16_LENGTH(ch); } } } @@ -753,7 +563,7 @@ u_strFromUTF8Lenient(UChar *dest, uint8_t* pSrc = (uint8_t*) src; /* args check */ - if(pErrorCode==NULL || U_FAILURE(*pErrorCode)){ + if(U_FAILURE(*pErrorCode)){ return NULL; } @@ -994,7 +804,7 @@ u_strToUTF8WithSub(char *dest, int32_t numSubstitutions; /* args check */ - if(pErrorCode==NULL || U_FAILURE(*pErrorCode)){ + if(U_FAILURE(*pErrorCode)){ return NULL; } @@ -1266,18 +1076,8 @@ u_strFromJavaModifiedUTF8WithSub( int32_t srcLength, UChar32 subchar, int32_t *pNumSubstitutions, UErrorCode *pErrorCode) { - UChar *pDest = dest; - UChar *pDestLimit = dest+destCapacity; - UChar32 ch; - int32_t reqLength = 0; - const uint8_t* pSrc = (const uint8_t*) src; - const uint8_t *pSrcLimit; - int32_t count; - uint8_t t1, t2; /* trail bytes */ - int32_t numSubstitutions; - /* args check */ - if(U_FAILURE(*pErrorCode)){ + if(U_FAILURE(*pErrorCode)) { return NULL; } if( (src==NULL && srcLength!=0) || srcLength < -1 || @@ -1291,18 +1091,22 @@ u_strFromJavaModifiedUTF8WithSub( if(pNumSubstitutions!=NULL) { *pNumSubstitutions=0; } - numSubstitutions=0; + UChar *pDest = dest; + UChar *pDestLimit = dest+destCapacity; + int32_t reqLength = 0; + int32_t numSubstitutions=0; if(srcLength < 0) { /* * Transform a NUL-terminated ASCII string. * Handle non-ASCII strings with slower code. */ - while(((ch = *pSrc) != 0) && ch <= 0x7f && (pDest < pDestLimit)) { - *pDest++=(UChar)ch; - ++pSrc; + UChar32 c; + while(((c = (uint8_t)*src) != 0) && c <= 0x7f && (pDest < pDestLimit)) { + *pDest++=(UChar)c; + ++src; } - if(ch == 0) { + if(c == 0) { reqLength=(int32_t)(pDest - dest); if(pDestLength) { *pDestLength = reqLength; @@ -1312,33 +1116,38 @@ u_strFromJavaModifiedUTF8WithSub( u_terminateUChars(dest, destCapacity, reqLength, pErrorCode); return dest; } - srcLength = uprv_strlen((const char *)pSrc); + srcLength = static_cast(uprv_strlen(src)); } - /* Faster loop without ongoing checking for pSrcLimit and pDestLimit. */ - pSrcLimit = (pSrc == NULL) ? NULL : pSrc + srcLength; + /* Faster loop without ongoing checking for srcLength and pDestLimit. */ + UChar32 ch; + uint8_t t1, t2; + int32_t i = 0; for(;;) { - count = (int32_t)(pDestLimit - pDest); - srcLength = (int32_t)(pSrcLimit - pSrc); - if(count >= srcLength && srcLength > 0 && *pSrc <= 0x7f) { + int32_t count = (int32_t)(pDestLimit - pDest); + int32_t count2 = srcLength - i; + if(count >= count2 && srcLength > 0 && U8_IS_SINGLE(*src)) { /* fast ASCII loop */ - const uint8_t *prevSrc = pSrc; - int32_t delta; - while(pSrc < pSrcLimit && (ch = *pSrc) <= 0x7f) { - *pDest++=(UChar)ch; - ++pSrc; + int32_t start = i; + uint8_t b; + while(i < srcLength && U8_IS_SINGLE(b = src[i])) { + *pDest++=b; + ++i; } - delta = (int32_t)(pSrc - prevSrc); + int32_t delta = i - start; count -= delta; - srcLength -= delta; + count2 -= delta; } /* * Each iteration of the inner loop progresses by at most 3 UTF-8 * bytes and one UChar. */ - srcLength /= 3; - if(count > srcLength) { - count = srcLength; /* min(remaining dest, remaining src/3) */ + if(subchar > 0xFFFF) { + break; + } + count2 /= 3; + if(count > count2) { + count = count2; /* min(remaining dest, remaining src/3) */ } if(count < 3) { /* @@ -1348,29 +1157,28 @@ u_strFromJavaModifiedUTF8WithSub( break; } do { - ch = *pSrc; - if(ch <= 0x7f){ + ch = (uint8_t)src[i++]; + if(U8_IS_SINGLE(ch)) { *pDest++=(UChar)ch; - ++pSrc; } else { if(ch >= 0xe0) { if( /* handle U+0000..U+FFFF inline */ ch <= 0xef && - (t1 = (uint8_t)(pSrc[1] - 0x80)) <= 0x3f && - (t2 = (uint8_t)(pSrc[2] - 0x80)) <= 0x3f + (t1 = (uint8_t)(src[i] - 0x80)) <= 0x3f && + (t2 = (uint8_t)(src[i+1] - 0x80)) <= 0x3f ) { /* no need for (ch & 0xf) because the upper bits are truncated after <<12 in the cast to (UChar) */ *pDest++ = (UChar)((ch << 12) | (t1 << 6) | t2); - pSrc += 3; + i += 2; continue; } } else { if( /* handle U+0000..U+07FF inline */ ch >= 0xc0 && - (t1 = (uint8_t)(pSrc[1] - 0x80)) <= 0x3f + (t1 = (uint8_t)(src[i] - 0x80)) <= 0x3f ) { *pDest++ = (UChar)(((ch & 0x1f) << 6) | t1); - pSrc += 2; + ++i; continue; } } @@ -1383,49 +1191,43 @@ u_strFromJavaModifiedUTF8WithSub( * We need to write two UChars, adjusted count for that, * and ran out of space. */ + --i; // back out byte ch break; } else { /* function call for error cases */ - ++pSrc; /* continue after the lead byte */ - utf8_nextCharSafeBodyPointer(&pSrc, pSrcLimit, ch); + utf8_nextCharSafeBody((const uint8_t *)src, &(i), srcLength, ch, -1); ++numSubstitutions; - if(subchar<=0xFFFF) { - *(pDest++)=(UChar)subchar; - } else { - *(pDest++)=U16_LEAD(subchar); - *(pDest++)=U16_TRAIL(subchar); - } + *(pDest++)=(UChar)subchar; } } } while(--count > 0); } - while((pSrc= 0xe0) { if( /* handle U+0000..U+FFFF inline */ ch <= 0xef && - ((pSrcLimit - pSrc) >= 3) && - (t1 = (uint8_t)(pSrc[1] - 0x80)) <= 0x3f && - (t2 = (uint8_t)(pSrc[2] - 0x80)) <= 0x3f + (i+1) < srcLength && + (t1 = (uint8_t)(src[i] - 0x80)) <= 0x3f && + (t2 = (uint8_t)(src[i+1] - 0x80)) <= 0x3f ) { /* no need for (ch & 0xf) because the upper bits are truncated after <<12 in the cast to (UChar) */ *pDest++ = (UChar)((ch << 12) | (t1 << 6) | t2); - pSrc += 3; + i += 2; continue; } } else { if( /* handle U+0000..U+07FF inline */ ch >= 0xc0 && - ((pSrcLimit - pSrc) >= 2) && - (t1 = (uint8_t)(pSrc[1] - 0x80)) <= 0x3f + i < srcLength && + (t1 = (uint8_t)(src[i] - 0x80)) <= 0x3f ) { *pDest++ = (UChar)(((ch & 0x1f) << 6) | t1); - pSrc += 2; + ++i; continue; } } @@ -1435,8 +1237,7 @@ u_strFromJavaModifiedUTF8WithSub( return NULL; } else { /* function call for error cases */ - ++pSrc; /* continue after the lead byte */ - utf8_nextCharSafeBodyPointer(&pSrc, pSrcLimit, ch); + utf8_nextCharSafeBody((const uint8_t *)src, &(i), srcLength, ch, -1); ++numSubstitutions; if(subchar<=0xFFFF) { *(pDest++)=(UChar)subchar; @@ -1453,32 +1254,31 @@ u_strFromJavaModifiedUTF8WithSub( } } - /* do not fill the dest buffer just count the UChars needed */ - while(pSrc < pSrcLimit){ - ch = *pSrc; - if(ch <= 0x7f) { + /* Pre-flight the rest of the string. */ + while(i < srcLength) { + ch = (uint8_t)src[i++]; + if(U8_IS_SINGLE(ch)) { reqLength++; - ++pSrc; } else { if(ch >= 0xe0) { if( /* handle U+0000..U+FFFF inline */ ch <= 0xef && - ((pSrcLimit - pSrc) >= 3) && - (uint8_t)(pSrc[1] - 0x80) <= 0x3f && - (uint8_t)(pSrc[2] - 0x80) <= 0x3f + (i+1) < srcLength && + (uint8_t)(src[i] - 0x80) <= 0x3f && + (uint8_t)(src[i+1] - 0x80) <= 0x3f ) { reqLength++; - pSrc += 3; + i += 2; continue; } } else { if( /* handle U+0000..U+07FF inline */ ch >= 0xc0 && - ((pSrcLimit - pSrc) >= 2) && - (uint8_t)(pSrc[1] - 0x80) <= 0x3f + i < srcLength && + (uint8_t)(src[i] - 0x80) <= 0x3f ) { reqLength++; - pSrc += 2; + ++i; continue; } } @@ -1488,8 +1288,7 @@ u_strFromJavaModifiedUTF8WithSub( return NULL; } else { /* function call for error cases */ - ++pSrc; /* continue after the lead byte */ - utf8_nextCharSafeBodyPointer(&pSrc, pSrcLimit, ch); + utf8_nextCharSafeBody((const uint8_t *)src, &(i), srcLength, ch, -1); ++numSubstitutions; reqLength+=U16_LENGTH(ch); } diff --git a/Build/source/libs/icu/icu-src/source/common/utext.cpp b/Build/source/libs/icu/icu-src/source/common/utext.cpp index a89e7a62b56..a2c9008abf6 100644 --- a/Build/source/libs/icu/icu-src/source/common/utext.cpp +++ b/Build/source/libs/icu/icu-src/source/common/utext.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* @@ -8,7 +8,7 @@ * ******************************************************************************* * file name: utext.cpp -* encoding: US-ASCII +* encoding: UTF-8 * tab size: 8 (not used) * indentation:4 * @@ -847,9 +847,11 @@ U_CDECL_END //------------------------------------------------------------------------------ // Chunk size. -// Must be less than 85, because of byte mapping from UChar indexes to native indexes. +// Must be less than 85 (256/3), because of byte mapping from UChar indexes to native indexes. // Worst case is three native bytes to one UChar. (Supplemenaries are 4 native bytes // to two UChars.) +// The longest illegal byte sequence treated as a single error (and converted to U+FFFD) +// is a three-byte sequence (truncated four-byte sequence). // enum { UTF8_TEXT_CHUNK_SIZE=32 }; @@ -1032,6 +1034,7 @@ utf8TextAccess(UText *ut, int64_t index, UBool forward) { // Requested index is in this buffer. u8b = (UTF8Buf *)ut->p; // the current buffer mapIndex = ix - u8b->toUCharsMapStart; + U_ASSERT(mapIndex < (int32_t)sizeof(UTF8Buf::mapToUChars)); ut->chunkOffset = u8b->mapToUChars[mapIndex] - u8b->bufStartIdx; return TRUE; @@ -1298,6 +1301,10 @@ fillReverse: // Can only do this if the incoming index is somewhere in the interior of the string. // If index is at the end, there is no character there to look at. if (ix != ut->b) { + // Note: this function will only move the index back if it is on a trail byte + // and there is a preceding lead byte and the sequence from the lead + // through this trail could be part of a valid UTF-8 sequence + // Otherwise the index remains unchanged. U8_SET_CP_START(s8, 0, ix); } @@ -1311,7 +1318,10 @@ fillReverse: UChar *buf = u8b->buf; uint8_t *mapToNative = u8b->mapToNative; uint8_t *mapToUChars = u8b->mapToUChars; - int32_t toUCharsMapStart = ix - (UTF8_TEXT_CHUNK_SIZE*3 + 1); + int32_t toUCharsMapStart = ix - sizeof(UTF8Buf::mapToUChars) + 1; + // Note that toUCharsMapStart can be negative. Happens when the remaining + // text from current position to the beginning is less than the buffer size. + // + 1 because mapToUChars must have a slot at the end for the bufNativeLimit entry. int32_t destIx = UTF8_TEXT_CHUNK_SIZE+2; // Start in the overflow region // at end of buffer to leave room // for a surrogate pair at the @@ -1338,6 +1348,7 @@ fillReverse: if (c<0x80) { // Special case ASCII range for speed. buf[destIx] = (UChar)c; + U_ASSERT(toUCharsMapStart <= srcIx); mapToUChars[srcIx - toUCharsMapStart] = (uint8_t)destIx; mapToNative[destIx] = (uint8_t)(srcIx - toUCharsMapStart); } else { @@ -1367,6 +1378,7 @@ fillReverse: do { mapToUChars[sIx-- - toUCharsMapStart] = (uint8_t)destIx; } while (sIx >= srcIx); + U_ASSERT(toUCharsMapStart <= (srcIx+1)); // Set native indexing limit to be the current position. // We are processing a non-ascii, non-native-indexing char now; @@ -1541,6 +1553,7 @@ utf8TextMapIndexToUTF16(const UText *ut, int64_t index64) { U_ASSERT(index>=ut->chunkNativeStart+ut->nativeIndexingLimit); U_ASSERT(index<=ut->chunkNativeLimit); int32_t mapIndex = index - u8b->toUCharsMapStart; + U_ASSERT(mapIndex < (int32_t)sizeof(UTF8Buf::mapToUChars)); int32_t offset = u8b->mapToUChars[mapIndex] - u8b->bufStartIdx; U_ASSERT(offset>=0 && offset<=ut->chunkLength); return offset; @@ -2225,13 +2238,13 @@ unistrTextCopy(UText *ut, } if(move) { - // move: copy to destIndex, then replace original with nothing + // move: copy to destIndex, then remove original int32_t segLength=limit32-start32; us->copy(start32, limit32, destIndex32); if(destIndex32replace(start32, segLength, NULL, 0); + us->remove(start32, segLength); } else { // copy us->copy(start32, limit32, destIndex32); diff --git a/Build/source/libs/icu/icu-src/source/common/utf_impl.c b/Build/source/libs/icu/icu-src/source/common/utf_impl.c deleted file mode 100644 index c4c88121380..00000000000 --- a/Build/source/libs/icu/icu-src/source/common/utf_impl.c +++ /dev/null @@ -1,328 +0,0 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. -// License & terms of use: http://www.unicode.org/copyright.html -/* -****************************************************************************** -* -* Copyright (C) 1999-2012, International Business Machines -* Corporation and others. All Rights Reserved. -* -****************************************************************************** -* file name: utf_impl.c -* encoding: US-ASCII -* tab size: 8 (not used) -* indentation:4 -* -* created on: 1999sep13 -* created by: Markus W. Scherer -* -* This file provides implementation functions for macros in the utfXX.h -* that would otherwise be too long as macros. -*/ - -/* set import/export definitions */ -#ifndef U_UTF8_IMPL -# define U_UTF8_IMPL -#endif - -#include "unicode/utypes.h" -#include "unicode/utf.h" -#include "unicode/utf8.h" -#include "unicode/utf_old.h" -#include "uassert.h" - -/* - * This table could be replaced on many machines by - * a few lines of assembler code using an - * "index of first 0-bit from msb" instruction and - * one or two more integer instructions. - * - * For example, on an i386, do something like - * - MOV AL, leadByte - * - NOT AL (8-bit, leave b15..b8==0..0, reverse only b7..b0) - * - MOV AH, 0 - * - BSR BX, AX (16-bit) - * - MOV AX, 6 (result) - * - JZ finish (ZF==1 if leadByte==0xff) - * - SUB AX, BX (result) - * -finish: - * (BSR: Bit Scan Reverse, scans for a 1-bit, starting from the MSB) - * - * In Unicode, all UTF-8 byte sequences with more than 4 bytes are illegal; - * lead bytes above 0xf4 are illegal. - * We keep them in this table for skipping long ISO 10646-UTF-8 sequences. - */ -U_EXPORT const uint8_t -utf8_countTrailBytes[256]={ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 3, 3, 3, 3, 3, - 3, 3, 3, /* illegal in Unicode */ - 4, 4, 4, 4, /* illegal in Unicode */ - 5, 5, /* illegal in Unicode */ - 0, 0 /* illegal bytes 0xfe and 0xff */ -}; - -static const UChar32 -utf8_minLegal[4]={ 0, 0x80, 0x800, 0x10000 }; - -static const UChar32 -utf8_errorValue[6]={ - UTF8_ERROR_VALUE_1, UTF8_ERROR_VALUE_2, UTF_ERROR_VALUE, 0x10ffff, - 0x3ffffff, 0x7fffffff -}; - -static UChar32 -errorValue(int32_t count, int8_t strict) { - if(strict>=0) { - return utf8_errorValue[count]; - } else if(strict==-3) { - return 0xfffd; - } else { - return U_SENTINEL; - } -} - -/* - * Handle the non-inline part of the U8_NEXT() and U8_NEXT_FFFD() macros - * and their obsolete sibling UTF8_NEXT_CHAR_SAFE(). - * - * U8_NEXT() supports NUL-terminated strings indicated via length<0. - * - * The "strict" parameter controls the error behavior: - * <0 "Safe" behavior of U8_NEXT(): - * -1: All illegal byte sequences yield U_SENTINEL=-1. - * -2: Same as -1, except for lenient treatment of surrogate code points as legal. - * Some implementations use this for roundtripping of - * Unicode 16-bit strings that are not well-formed UTF-16, that is, they - * contain unpaired surrogates. - * -3: All illegal byte sequences yield U+FFFD. - * 0 Obsolete "safe" behavior of UTF8_NEXT_CHAR_SAFE(..., FALSE): - * All illegal byte sequences yield a positive code point such that this - * result code point would be encoded with the same number of bytes as - * the illegal sequence. - * >0 Obsolete "strict" behavior of UTF8_NEXT_CHAR_SAFE(..., TRUE): - * Same as the obsolete "safe" behavior, but non-characters are also treated - * like illegal sequences. - * - * Note that a UBool is the same as an int8_t. - */ -U_CAPI UChar32 U_EXPORT2 -utf8_nextCharSafeBody(const uint8_t *s, int32_t *pi, int32_t length, UChar32 c, UBool strict) { - int32_t i=*pi; - uint8_t count=U8_COUNT_TRAIL_BYTES(c); - U_ASSERT(count <= 5); /* U8_COUNT_TRAIL_BYTES returns value 0...5 */ - if(i+count<=length || length<0) { - uint8_t trail; - - U8_MASK_LEAD_BYTE(c, count); - /* support NUL-terminated strings: do not read beyond the first non-trail byte */ - switch(count) { - /* each branch falls through to the next one */ - case 0: - /* count==0 for illegally leading trail bytes and the illegal bytes 0xfe and 0xff */ - case 5: - case 4: - /* count>=4 is always illegal: no more than 3 trail bytes in Unicode's UTF-8 */ - break; - case 3: - trail=s[i++]-0x80; - c=(c<<6)|trail; - /* c>=0x110 would result in code point>0x10ffff, outside Unicode */ - if(c>=0x110 || trail>0x3f) { break; } - case 2: - trail=s[i++]-0x80; - c=(c<<6)|trail; - /* - * test for a surrogate d800..dfff unless we are lenient: - * before the last (c<<6), a surrogate is c=360..37f - */ - if(((c&0xffe0)==0x360 && strict!=-2) || trail>0x3f) { break; } - case 1: - trail=s[i++]-0x80; - c=(c<<6)|trail; - if(trail>0x3f) { break; } - /* correct sequence - all trail bytes have (b7..b6)==(10) */ - if(c>=utf8_minLegal[count] && - /* strict: forbid non-characters like U+fffe */ - (strict<=0 || !U_IS_UNICODE_NONCHAR(c))) { - *pi=i; - return c; - } - /* no default branch to optimize switch() - all values are covered */ - } - } else { - /* too few bytes left */ - count=length-i; - } - - /* error handling */ - i=*pi; - while(count>0 && U8_IS_TRAIL(s[i])) { - ++i; - --count; - } - c=errorValue(i-*pi, strict); - *pi=i; - return c; -} - -U_CAPI int32_t U_EXPORT2 -utf8_appendCharSafeBody(uint8_t *s, int32_t i, int32_t length, UChar32 c, UBool *pIsError) { - if((uint32_t)(c)<=0x7ff) { - if((i)+1<(length)) { - (s)[(i)++]=(uint8_t)(((c)>>6)|0xc0); - (s)[(i)++]=(uint8_t)(((c)&0x3f)|0x80); - return i; - } - } else if((uint32_t)(c)<=0xffff) { - /* Starting with Unicode 3.2, surrogate code points must not be encoded in UTF-8. */ - if((i)+2<(length) && !U_IS_SURROGATE(c)) { - (s)[(i)++]=(uint8_t)(((c)>>12)|0xe0); - (s)[(i)++]=(uint8_t)((((c)>>6)&0x3f)|0x80); - (s)[(i)++]=(uint8_t)(((c)&0x3f)|0x80); - return i; - } - } else if((uint32_t)(c)<=0x10ffff) { - if((i)+3<(length)) { - (s)[(i)++]=(uint8_t)(((c)>>18)|0xf0); - (s)[(i)++]=(uint8_t)((((c)>>12)&0x3f)|0x80); - (s)[(i)++]=(uint8_t)((((c)>>6)&0x3f)|0x80); - (s)[(i)++]=(uint8_t)(((c)&0x3f)|0x80); - return i; - } - } - /* c>0x10ffff or not enough space, write an error value */ - if(pIsError!=NULL) { - *pIsError=TRUE; - } else { - length-=i; - if(length>0) { - int32_t offset; - if(length>3) { - length=3; - } - s+=i; - offset=0; - c=utf8_errorValue[length-1]; - UTF8_APPEND_CHAR_UNSAFE(s, offset, c); - i=i+offset; - } - } - return i; -} - -U_CAPI UChar32 U_EXPORT2 -utf8_prevCharSafeBody(const uint8_t *s, int32_t start, int32_t *pi, UChar32 c, UBool strict) { - int32_t i=*pi; - uint8_t b, count=1, shift=6; - - if(!U8_IS_TRAIL(c)) { return errorValue(0, strict); } - - /* extract value bits from the last trail byte */ - c&=0x3f; - - for(;;) { - if(i<=start) { - /* no lead byte at all */ - return errorValue(0, strict); - } - - /* read another previous byte */ - b=s[--i]; - if((uint8_t)(b-0x80)<0x7e) { /* 0x80<=b<0xfe */ - if(b&0x40) { - /* lead byte, this will always end the loop */ - uint8_t shouldCount=U8_COUNT_TRAIL_BYTES(b); - - if(count==shouldCount) { - /* set the new position */ - *pi=i; - U8_MASK_LEAD_BYTE(b, count); - c|=(UChar32)b<=4 || c>0x10ffff || c0 && U_IS_UNICODE_NONCHAR(c))) { - /* illegal sequence or (strict and non-character) */ - if(count>=4) { - count=3; - } - c=errorValue(count, strict); - } else { - /* exit with correct c */ - } - } else { - /* the lead byte does not match the number of trail bytes */ - /* only set the position to the lead byte if it would - include the trail byte that we started with */ - if(countstart) { - Z=I-5; - } else { - Z=start; - } - - /* return I if the sequence starting there is long enough to include i */ - do { - b=s[I]; - if((uint8_t)(b-0x80)>=0x7e) { /* not 0x80<=b<0xfe */ - break; - } else if(b>=0xc0) { - if(U8_COUNT_TRAIL_BYTES(b)>=(i-I)) { - return I; - } else { - break; - } - } - } while(Z<=--I); - - /* return i itself to be consistent with the FWD_1 macro */ - return i; -} diff --git a/Build/source/libs/icu/icu-src/source/common/utf_impl.cpp b/Build/source/libs/icu/icu-src/source/common/utf_impl.cpp new file mode 100644 index 00000000000..f78c566e098 --- /dev/null +++ b/Build/source/libs/icu/icu-src/source/common/utf_impl.cpp @@ -0,0 +1,332 @@ +// © 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html +/* +****************************************************************************** +* +* Copyright (C) 1999-2012, International Business Machines +* Corporation and others. All Rights Reserved. +* +****************************************************************************** +* file name: utf_impl.cpp +* encoding: UTF-8 +* tab size: 8 (not used) +* indentation:4 +* +* created on: 1999sep13 +* created by: Markus W. Scherer +* +* This file provides implementation functions for macros in the utfXX.h +* that would otherwise be too long as macros. +*/ + +/* set import/export definitions */ +#ifndef U_UTF8_IMPL +# define U_UTF8_IMPL +#endif + +#include "unicode/utypes.h" +#include "unicode/utf.h" +#include "unicode/utf8.h" +#include "uassert.h" + +/* + * Table of the number of utf8 trail bytes, indexed by the lead byte. + * Used by the deprecated macro UTF8_COUNT_TRAIL_BYTES, defined in utf_old.h + * + * The current macro, U8_COUNT_TRAIL_BYTES, does _not_ use this table. + * + * Note that this table cannot be removed, even if UTF8_COUNT_TRAIL_BYTES were + * changed to no longer use it. References to the table from expansions of UTF8_COUNT_TRAIL_BYTES + * may exist in old client code that must continue to run with newer icu library versions. + * + * This table could be replaced on many machines by + * a few lines of assembler code using an + * "index of first 0-bit from msb" instruction and + * one or two more integer instructions. + * + * For example, on an i386, do something like + * - MOV AL, leadByte + * - NOT AL (8-bit, leave b15..b8==0..0, reverse only b7..b0) + * - MOV AH, 0 + * - BSR BX, AX (16-bit) + * - MOV AX, 6 (result) + * - JZ finish (ZF==1 if leadByte==0xff) + * - SUB AX, BX (result) + * -finish: + * (BSR: Bit Scan Reverse, scans for a 1-bit, starting from the MSB) + */ +extern "C" U_EXPORT const uint8_t +utf8_countTrailBytes[256]={ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + // illegal C0 & C1 + // 2-byte lead bytes C2..DF + 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + + // 3-byte lead bytes E0..EF + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + // 4-byte lead bytes F0..F4 + // illegal F5..FF + 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 +}; + +static const UChar32 +utf8_errorValue[6]={ + // Same values as UTF8_ERROR_VALUE_1, UTF8_ERROR_VALUE_2, UTF_ERROR_VALUE, + // but without relying on the obsolete unicode/utf_old.h. + 0x15, 0x9f, 0xffff, + 0x10ffff +}; + +static UChar32 +errorValue(int32_t count, int8_t strict) { + if(strict>=0) { + return utf8_errorValue[count]; + } else if(strict==-3) { + return 0xfffd; + } else { + return U_SENTINEL; + } +} + +/* + * Handle the non-inline part of the U8_NEXT() and U8_NEXT_FFFD() macros + * and their obsolete sibling UTF8_NEXT_CHAR_SAFE(). + * + * U8_NEXT() supports NUL-terminated strings indicated via length<0. + * + * The "strict" parameter controls the error behavior: + * <0 "Safe" behavior of U8_NEXT(): + * -1: All illegal byte sequences yield U_SENTINEL=-1. + * -2: Same as -1, except for lenient treatment of surrogate code points as legal. + * Some implementations use this for roundtripping of + * Unicode 16-bit strings that are not well-formed UTF-16, that is, they + * contain unpaired surrogates. + * -3: All illegal byte sequences yield U+FFFD. + * 0 Obsolete "safe" behavior of UTF8_NEXT_CHAR_SAFE(..., FALSE): + * All illegal byte sequences yield a positive code point such that this + * result code point would be encoded with the same number of bytes as + * the illegal sequence. + * >0 Obsolete "strict" behavior of UTF8_NEXT_CHAR_SAFE(..., TRUE): + * Same as the obsolete "safe" behavior, but non-characters are also treated + * like illegal sequences. + * + * Note that a UBool is the same as an int8_t. + */ +U_CAPI UChar32 U_EXPORT2 +utf8_nextCharSafeBody(const uint8_t *s, int32_t *pi, int32_t length, UChar32 c, UBool strict) { + // *pi is one after byte c. + int32_t i=*pi; + // length can be negative for NUL-terminated strings: Read and validate one byte at a time. + if(i==length || c>0xf4) { + // end of string, or not a lead byte + } else if(c>=0xf0) { + // Test for 4-byte sequences first because + // U8_NEXT() handles shorter valid sequences inline. + uint8_t t1=s[i], t2, t3; + c&=7; + if(U8_IS_VALID_LEAD4_AND_T1(c, t1) && + ++i!=length && (t2=s[i]-0x80)<=0x3f && + ++i!=length && (t3=s[i]-0x80)<=0x3f) { + ++i; + c=(c<<18)|((t1&0x3f)<<12)|(t2<<6)|t3; + // strict: forbid non-characters like U+fffe + if(strict<=0 || !U_IS_UNICODE_NONCHAR(c)) { + *pi=i; + return c; + } + } + } else if(c>=0xe0) { + c&=0xf; + if(strict!=-2) { + uint8_t t1=s[i], t2; + if(U8_IS_VALID_LEAD3_AND_T1(c, t1) && + ++i!=length && (t2=s[i]-0x80)<=0x3f) { + ++i; + c=(c<<12)|((t1&0x3f)<<6)|t2; + // strict: forbid non-characters like U+fffe + if(strict<=0 || !U_IS_UNICODE_NONCHAR(c)) { + *pi=i; + return c; + } + } + } else { + // strict=-2 -> lenient: allow surrogates + uint8_t t1=s[i]-0x80, t2; + if(t1<=0x3f && (c>0 || t1>=0x20) && + ++i!=length && (t2=s[i]-0x80)<=0x3f) { + *pi=i+1; + return (c<<12)|(t1<<6)|t2; + } + } + } else if(c>=0xc2) { + uint8_t t1=s[i]-0x80; + if(t1<=0x3f) { + *pi=i+1; + return ((c-0xc0)<<6)|t1; + } + } // else 0x80<=c<0xc2 is not a lead byte + + /* error handling */ + c=errorValue(i-*pi, strict); + *pi=i; + return c; +} + +U_CAPI int32_t U_EXPORT2 +utf8_appendCharSafeBody(uint8_t *s, int32_t i, int32_t length, UChar32 c, UBool *pIsError) { + if((uint32_t)(c)<=0x7ff) { + if((i)+1<(length)) { + (s)[(i)++]=(uint8_t)(((c)>>6)|0xc0); + (s)[(i)++]=(uint8_t)(((c)&0x3f)|0x80); + return i; + } + } else if((uint32_t)(c)<=0xffff) { + /* Starting with Unicode 3.2, surrogate code points must not be encoded in UTF-8. */ + if((i)+2<(length) && !U_IS_SURROGATE(c)) { + (s)[(i)++]=(uint8_t)(((c)>>12)|0xe0); + (s)[(i)++]=(uint8_t)((((c)>>6)&0x3f)|0x80); + (s)[(i)++]=(uint8_t)(((c)&0x3f)|0x80); + return i; + } + } else if((uint32_t)(c)<=0x10ffff) { + if((i)+3<(length)) { + (s)[(i)++]=(uint8_t)(((c)>>18)|0xf0); + (s)[(i)++]=(uint8_t)((((c)>>12)&0x3f)|0x80); + (s)[(i)++]=(uint8_t)((((c)>>6)&0x3f)|0x80); + (s)[(i)++]=(uint8_t)(((c)&0x3f)|0x80); + return i; + } + } + /* c>0x10ffff or not enough space, write an error value */ + if(pIsError!=NULL) { + *pIsError=TRUE; + } else { + length-=i; + if(length>0) { + int32_t offset; + if(length>3) { + length=3; + } + s+=i; + offset=0; + c=utf8_errorValue[length-1]; + U8_APPEND_UNSAFE(s, offset, c); + i=i+offset; + } + } + return i; +} + +U_CAPI UChar32 U_EXPORT2 +utf8_prevCharSafeBody(const uint8_t *s, int32_t start, int32_t *pi, UChar32 c, UBool strict) { + // *pi is the index of byte c. + int32_t i=*pi; + if(U8_IS_TRAIL(c) && i>start) { + uint8_t b1=s[--i]; + if(0xc2<=b1 && b1<0xe0) { + *pi=i; + return ((b1-0xc0)<<6)|(c&0x3f); + } else if(U8_IS_TRAIL(b1) && i>start) { + // Extract the value bits from the last trail byte. + c&=0x3f; + uint8_t b2=s[--i]; + if(0xe0<=b2 && b2<0xf0) { + b2&=0xf; + if(strict!=-2) { + if(U8_IS_VALID_LEAD3_AND_T1(b2, b1)) { + *pi=i; + c=(b2<<12)|((b1&0x3f)<<6)|c; + if(strict<=0 || !U_IS_UNICODE_NONCHAR(c)) { + return c; + } else { + // strict: forbid non-characters like U+fffe + return errorValue(2, strict); + } + } + } else { + // strict=-2 -> lenient: allow surrogates + b1-=0x80; + if((b2>0 || b1>=0x20)) { + *pi=i; + return (b2<<12)|(b1<<6)|c; + } + } + } else if(U8_IS_TRAIL(b2) && i>start) { + uint8_t b3=s[--i]; + if(0xf0<=b3 && b3<=0xf4) { + b3&=7; + if(U8_IS_VALID_LEAD4_AND_T1(b3, b2)) { + *pi=i; + c=(b3<<18)|((b2&0x3f)<<12)|((b1&0x3f)<<6)|c; + if(strict<=0 || !U_IS_UNICODE_NONCHAR(c)) { + return c; + } else { + // strict: forbid non-characters like U+fffe + return errorValue(3, strict); + } + } + } + } else if(0xf0<=b2 && b2<=0xf4 && U8_IS_VALID_LEAD4_AND_T1(b2, b1)) { + // Truncated 4-byte sequence. + *pi=i; + return errorValue(2, strict); + } + } else if((0xe0<=b1 && b1<0xf0 && U8_IS_VALID_LEAD3_AND_T1(b1, c)) || + (0xf0<=b1 && b1<=0xf4 && U8_IS_VALID_LEAD4_AND_T1(b1, c))) { + // Truncated 3- or 4-byte sequence. + *pi=i; + return errorValue(1, strict); + } + } + return errorValue(0, strict); +} + +U_CAPI int32_t U_EXPORT2 +utf8_back1SafeBody(const uint8_t *s, int32_t start, int32_t i) { + // Same as utf8_prevCharSafeBody(..., strict=-1) minus assembling code points. + int32_t orig_i=i; + uint8_t c=s[i]; + if(U8_IS_TRAIL(c) && i>start) { + uint8_t b1=s[--i]; + if(0xc2<=b1 && b1<0xe0) { + return i; + } else if(U8_IS_TRAIL(b1) && i>start) { + uint8_t b2=s[--i]; + if(0xe0<=b2 && b2<0xf0) { + if(U8_IS_VALID_LEAD3_AND_T1(b2, b1)) { + return i; + } + } else if(U8_IS_TRAIL(b2) && i>start) { + uint8_t b3=s[--i]; + if(0xf0<=b3 && b3<=0xf4) { + if(U8_IS_VALID_LEAD4_AND_T1(b3, b2)) { + return i; + } + } + } else if(0xf0<=b2 && b2<=0xf4 && U8_IS_VALID_LEAD4_AND_T1(b2, b1)) { + // Truncated 4-byte sequence. + return i; + } + } else if((0xe0<=b1 && b1<0xf0 && U8_IS_VALID_LEAD3_AND_T1(b1, c)) || + (0xf0<=b1 && b1<=0xf4 && U8_IS_VALID_LEAD4_AND_T1(b1, c))) { + // Truncated 3- or 4-byte sequence. + return i; + } + } + return orig_i; +} diff --git a/Build/source/libs/icu/icu-src/source/common/util.cpp b/Build/source/libs/icu/icu-src/source/common/util.cpp index 1b77110c689..a762cc48716 100644 --- a/Build/source/libs/icu/icu-src/source/common/util.cpp +++ b/Build/source/libs/icu/icu-src/source/common/util.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** diff --git a/Build/source/libs/icu/icu-src/source/common/util.h b/Build/source/libs/icu/icu-src/source/common/util.h index 57f1bb0fe2d..e7822490665 100644 --- a/Build/source/libs/icu/icu-src/source/common/util.h +++ b/Build/source/libs/icu/icu-src/source/common/util.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** diff --git a/Build/source/libs/icu/icu-src/source/common/util_props.cpp b/Build/source/libs/icu/icu-src/source/common/util_props.cpp index a88d5816c7a..95a112bc912 100644 --- a/Build/source/libs/icu/icu-src/source/common/util_props.cpp +++ b/Build/source/libs/icu/icu-src/source/common/util_props.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** diff --git a/Build/source/libs/icu/icu-src/source/common/utrace.c b/Build/source/libs/icu/icu-src/source/common/utrace.c deleted file mode 100644 index ca4dddfa1a3..00000000000 --- a/Build/source/libs/icu/icu-src/source/common/utrace.c +++ /dev/null @@ -1,490 +0,0 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. -// License & terms of use: http://www.unicode.org/copyright.html -/* -******************************************************************************* -* Copyright (C) 2003-2014, International Business Machines -* Corporation and others. All Rights Reserved. -******************************************************************************* -* file name: utrace.c -* encoding: US-ASCII -* tab size: 8 (not used) -* indentation:4 -*/ - -#define UTRACE_IMPL -#include "unicode/utrace.h" -#include "utracimp.h" -#include "cstring.h" -#include "uassert.h" -#include "ucln_cmn.h" - - -static UTraceEntry *pTraceEntryFunc = NULL; -static UTraceExit *pTraceExitFunc = NULL; -static UTraceData *pTraceDataFunc = NULL; -static const void *gTraceContext = NULL; - -U_EXPORT int32_t -utrace_level = UTRACE_ERROR; - -U_CAPI void U_EXPORT2 -utrace_entry(int32_t fnNumber) { - if (pTraceEntryFunc != NULL) { - (*pTraceEntryFunc)(gTraceContext, fnNumber); - } -} - - -static const char gExitFmt[] = "Returns."; -static const char gExitFmtValue[] = "Returns %d."; -static const char gExitFmtStatus[] = "Returns. Status = %d."; -static const char gExitFmtValueStatus[] = "Returns %d. Status = %d."; -static const char gExitFmtPtrStatus[] = "Returns %d. Status = %p."; - -U_CAPI void U_EXPORT2 -utrace_exit(int32_t fnNumber, int32_t returnType, ...) { - if (pTraceExitFunc != NULL) { - va_list args; - const char *fmt; - - switch (returnType) { - case 0: - fmt = gExitFmt; - break; - case UTRACE_EXITV_I32: - fmt = gExitFmtValue; - break; - case UTRACE_EXITV_STATUS: - fmt = gExitFmtStatus; - break; - case UTRACE_EXITV_I32 | UTRACE_EXITV_STATUS: - fmt = gExitFmtValueStatus; - break; - case UTRACE_EXITV_PTR | UTRACE_EXITV_STATUS: - fmt = gExitFmtPtrStatus; - break; - default: - U_ASSERT(FALSE); - fmt = gExitFmt; - } - - va_start(args, returnType); - (*pTraceExitFunc)(gTraceContext, fnNumber, fmt, args); - va_end(args); - } -} - - - -U_CAPI void U_EXPORT2 -utrace_data(int32_t fnNumber, int32_t level, const char *fmt, ...) { - if (pTraceDataFunc != NULL) { - va_list args; - va_start(args, fmt ); - (*pTraceDataFunc)(gTraceContext, fnNumber, level, fmt, args); - va_end(args); - } -} - - -static void outputChar(char c, char *outBuf, int32_t *outIx, int32_t capacity, int32_t indent) { - int32_t i; - /* Check whether a start of line indenting is needed. Three cases: - * 1. At the start of the first line (output index == 0). - * 2. At the start of subsequent lines (preceeding char in buffer == '\n') - * 3. When preflighting buffer len (buffer capacity is exceeded), when - * a \n is output. Ideally we wouldn't do the indent until the following char - * is received, but that won't work because there's no place to remember that - * the preceding char was \n. Meaning that we may overstimate the - * buffer size needed. No harm done. - */ - if (*outIx==0 || /* case 1. */ - (c!='\n' && c!=0 && *outIx < capacity && outBuf[(*outIx)-1]=='\n') || /* case 2. */ - (c=='\n' && *outIx>=capacity)) /* case 3 */ - { - /* At the start of a line. Indent. */ - for(i=0; i= 0; shiftCount-=4) { - char c = gHexChars[(val >> shiftCount) & 0xf]; - outputChar(c, outBuf, outIx, capacity, 0); - } -} - -/* Output a pointer value in hex. Work with any size of pointer */ -static void outputPtrBytes(void *val, char *outBuf, int32_t *outIx, int32_t capacity) { - int32_t i; - int32_t incVal = 1; /* +1 for big endian, -1 for little endian */ - char *p = (char *)&val; /* point to current byte to output in the ptr val */ - -#if !U_IS_BIG_ENDIAN - /* Little Endian. Move p to most significant end of the value */ - incVal = -1; - p += sizeof(void *) - 1; -#endif - - /* Loop through the bytes of the ptr as it sits in memory, from - * most significant to least significant end */ - for (i=0; i 0) { - outputHexBytes(longArg, charsToOutput, outBuf, &outIx, capacity); - outputChar(' ', outBuf, &outIx, capacity, indent); - } - if (vectorLen == -1 && longArg == 0) { - break; - } - } - } - outputChar('[', outBuf, &outIx, capacity, indent); - outputHexBytes(vectorLen, 8, outBuf, &outIx, capacity); - outputChar(']', outBuf, &outIx, capacity, indent); - } - break; - - - default: - /* %. in format string, where . is some character not in the set - * of recognized format chars. Just output it as if % wasn't there. - * (Covers "%%" outputing a single '%') - */ - outputChar(fmtC, outBuf, &outIx, capacity, indent); - } - } - outputChar(0, outBuf, &outIx, capacity, indent); /* Make sure that output is null terminated */ - return outIx + 1; /* outIx + 1 because outIx does not increment when outputing final null. */ -} - - - - -U_CAPI int32_t U_EXPORT2 -utrace_format(char *outBuf, int32_t capacity, - int32_t indent, const char *fmt, ...) { - int32_t retVal; - va_list args; - va_start(args, fmt ); - retVal = utrace_vformat(outBuf, capacity, indent, fmt, args); - va_end(args); - return retVal; -} - - -U_CAPI void U_EXPORT2 -utrace_setFunctions(const void *context, - UTraceEntry *e, UTraceExit *x, UTraceData *d) { - pTraceEntryFunc = e; - pTraceExitFunc = x; - pTraceDataFunc = d; - gTraceContext = context; -} - - -U_CAPI void U_EXPORT2 -utrace_getFunctions(const void **context, - UTraceEntry **e, UTraceExit **x, UTraceData **d) { - *e = pTraceEntryFunc; - *x = pTraceExitFunc; - *d = pTraceDataFunc; - *context = gTraceContext; -} - -U_CAPI void U_EXPORT2 -utrace_setLevel(int32_t level) { - if (level < UTRACE_OFF) { - level = UTRACE_OFF; - } - if (level > UTRACE_VERBOSE) { - level = UTRACE_VERBOSE; - } - utrace_level = level; -} - -U_CAPI int32_t U_EXPORT2 -utrace_getLevel() { - return utrace_level; -} - - -U_CFUNC UBool -utrace_cleanup() { - pTraceEntryFunc = NULL; - pTraceExitFunc = NULL; - pTraceDataFunc = NULL; - utrace_level = UTRACE_OFF; - gTraceContext = NULL; - return TRUE; -} - - -static const char * const -trFnName[] = { - "u_init", - "u_cleanup", - NULL -}; - - -static const char * const -trConvNames[] = { - "ucnv_open", - "ucnv_openPackage", - "ucnv_openAlgorithmic", - "ucnv_clone", - "ucnv_close", - "ucnv_flushCache", - "ucnv_load", - "ucnv_unload", - NULL -}; - - -static const char * const -trCollNames[] = { - "ucol_open", - "ucol_close", - "ucol_strcoll", - "ucol_getSortKey", - "ucol_getLocale", - "ucol_nextSortKeyPart", - "ucol_strcollIter", - "ucol_openFromShortString", - "ucol_strcollUTF8", - NULL -}; - - -U_CAPI const char * U_EXPORT2 -utrace_functionName(int32_t fnNumber) { - if(UTRACE_FUNCTION_START <= fnNumber && fnNumber < UTRACE_FUNCTION_LIMIT) { - return trFnName[fnNumber]; - } else if(UTRACE_CONVERSION_START <= fnNumber && fnNumber < UTRACE_CONVERSION_LIMIT) { - return trConvNames[fnNumber - UTRACE_CONVERSION_START]; - } else if(UTRACE_COLLATION_START <= fnNumber && fnNumber < UTRACE_COLLATION_LIMIT){ - return trCollNames[fnNumber - UTRACE_COLLATION_START]; - } else { - return "[BOGUS Trace Function Number]"; - } -} - diff --git a/Build/source/libs/icu/icu-src/source/common/utrace.cpp b/Build/source/libs/icu/icu-src/source/common/utrace.cpp new file mode 100644 index 00000000000..dad1ef8b644 --- /dev/null +++ b/Build/source/libs/icu/icu-src/source/common/utrace.cpp @@ -0,0 +1,493 @@ +// © 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html +/* +******************************************************************************* +* Copyright (C) 2003-2014, International Business Machines +* Corporation and others. All Rights Reserved. +******************************************************************************* +* file name: utrace.c +* encoding: UTF-8 +* tab size: 8 (not used) +* indentation:4 +*/ + +#include "unicode/utrace.h" +#include "utracimp.h" +#include "cstring.h" +#include "uassert.h" +#include "ucln_cmn.h" + + +static UTraceEntry *pTraceEntryFunc = NULL; +static UTraceExit *pTraceExitFunc = NULL; +static UTraceData *pTraceDataFunc = NULL; +static const void *gTraceContext = NULL; + +/** + * \var utrace_level + * Trace level variable. Negative for "off". + */ +static int32_t +utrace_level = UTRACE_ERROR; + +U_CAPI void U_EXPORT2 +utrace_entry(int32_t fnNumber) { + if (pTraceEntryFunc != NULL) { + (*pTraceEntryFunc)(gTraceContext, fnNumber); + } +} + + +static const char gExitFmt[] = "Returns."; +static const char gExitFmtValue[] = "Returns %d."; +static const char gExitFmtStatus[] = "Returns. Status = %d."; +static const char gExitFmtValueStatus[] = "Returns %d. Status = %d."; +static const char gExitFmtPtrStatus[] = "Returns %d. Status = %p."; + +U_CAPI void U_EXPORT2 +utrace_exit(int32_t fnNumber, int32_t returnType, ...) { + if (pTraceExitFunc != NULL) { + va_list args; + const char *fmt; + + switch (returnType) { + case 0: + fmt = gExitFmt; + break; + case UTRACE_EXITV_I32: + fmt = gExitFmtValue; + break; + case UTRACE_EXITV_STATUS: + fmt = gExitFmtStatus; + break; + case UTRACE_EXITV_I32 | UTRACE_EXITV_STATUS: + fmt = gExitFmtValueStatus; + break; + case UTRACE_EXITV_PTR | UTRACE_EXITV_STATUS: + fmt = gExitFmtPtrStatus; + break; + default: + U_ASSERT(FALSE); + fmt = gExitFmt; + } + + va_start(args, returnType); + (*pTraceExitFunc)(gTraceContext, fnNumber, fmt, args); + va_end(args); + } +} + + + +U_CAPI void U_EXPORT2 +utrace_data(int32_t fnNumber, int32_t level, const char *fmt, ...) { + if (pTraceDataFunc != NULL) { + va_list args; + va_start(args, fmt ); + (*pTraceDataFunc)(gTraceContext, fnNumber, level, fmt, args); + va_end(args); + } +} + + +static void outputChar(char c, char *outBuf, int32_t *outIx, int32_t capacity, int32_t indent) { + int32_t i; + /* Check whether a start of line indenting is needed. Three cases: + * 1. At the start of the first line (output index == 0). + * 2. At the start of subsequent lines (preceeding char in buffer == '\n') + * 3. When preflighting buffer len (buffer capacity is exceeded), when + * a \n is output. Ideally we wouldn't do the indent until the following char + * is received, but that won't work because there's no place to remember that + * the preceding char was \n. Meaning that we may overstimate the + * buffer size needed. No harm done. + */ + if (*outIx==0 || /* case 1. */ + (c!='\n' && c!=0 && *outIx < capacity && outBuf[(*outIx)-1]=='\n') || /* case 2. */ + (c=='\n' && *outIx>=capacity)) /* case 3 */ + { + /* At the start of a line. Indent. */ + for(i=0; i= 0; shiftCount-=4) { + char c = gHexChars[(val >> shiftCount) & 0xf]; + outputChar(c, outBuf, outIx, capacity, 0); + } +} + +/* Output a pointer value in hex. Work with any size of pointer */ +static void outputPtrBytes(void *val, char *outBuf, int32_t *outIx, int32_t capacity) { + uint32_t i; + int32_t incVal = 1; /* +1 for big endian, -1 for little endian */ + char *p = (char *)&val; /* point to current byte to output in the ptr val */ + +#if !U_IS_BIG_ENDIAN + /* Little Endian. Move p to most significant end of the value */ + incVal = -1; + p += sizeof(void *) - 1; +#endif + + /* Loop through the bytes of the ptr as it sits in memory, from + * most significant to least significant end */ + for (i=0; i 0) { + outputHexBytes(longArg, charsToOutput, outBuf, &outIx, capacity); + outputChar(' ', outBuf, &outIx, capacity, indent); + } + if (vectorLen == -1 && longArg == 0) { + break; + } + } + } + outputChar('[', outBuf, &outIx, capacity, indent); + outputHexBytes(vectorLen, 8, outBuf, &outIx, capacity); + outputChar(']', outBuf, &outIx, capacity, indent); + } + break; + + + default: + /* %. in format string, where . is some character not in the set + * of recognized format chars. Just output it as if % wasn't there. + * (Covers "%%" outputing a single '%') + */ + outputChar(fmtC, outBuf, &outIx, capacity, indent); + } + } + outputChar(0, outBuf, &outIx, capacity, indent); /* Make sure that output is null terminated */ + return outIx + 1; /* outIx + 1 because outIx does not increment when outputing final null. */ +} + + + + +U_CAPI int32_t U_EXPORT2 +utrace_format(char *outBuf, int32_t capacity, + int32_t indent, const char *fmt, ...) { + int32_t retVal; + va_list args; + va_start(args, fmt ); + retVal = utrace_vformat(outBuf, capacity, indent, fmt, args); + va_end(args); + return retVal; +} + + +U_CAPI void U_EXPORT2 +utrace_setFunctions(const void *context, + UTraceEntry *e, UTraceExit *x, UTraceData *d) { + pTraceEntryFunc = e; + pTraceExitFunc = x; + pTraceDataFunc = d; + gTraceContext = context; +} + + +U_CAPI void U_EXPORT2 +utrace_getFunctions(const void **context, + UTraceEntry **e, UTraceExit **x, UTraceData **d) { + *e = pTraceEntryFunc; + *x = pTraceExitFunc; + *d = pTraceDataFunc; + *context = gTraceContext; +} + +U_CAPI void U_EXPORT2 +utrace_setLevel(int32_t level) { + if (level < UTRACE_OFF) { + level = UTRACE_OFF; + } + if (level > UTRACE_VERBOSE) { + level = UTRACE_VERBOSE; + } + utrace_level = level; +} + +U_CAPI int32_t U_EXPORT2 +utrace_getLevel() { + return utrace_level; +} + + +U_CFUNC UBool +utrace_cleanup() { + pTraceEntryFunc = NULL; + pTraceExitFunc = NULL; + pTraceDataFunc = NULL; + utrace_level = UTRACE_OFF; + gTraceContext = NULL; + return TRUE; +} + + +static const char * const +trFnName[] = { + "u_init", + "u_cleanup", + NULL +}; + + +static const char * const +trConvNames[] = { + "ucnv_open", + "ucnv_openPackage", + "ucnv_openAlgorithmic", + "ucnv_clone", + "ucnv_close", + "ucnv_flushCache", + "ucnv_load", + "ucnv_unload", + NULL +}; + + +static const char * const +trCollNames[] = { + "ucol_open", + "ucol_close", + "ucol_strcoll", + "ucol_getSortKey", + "ucol_getLocale", + "ucol_nextSortKeyPart", + "ucol_strcollIter", + "ucol_openFromShortString", + "ucol_strcollUTF8", + NULL +}; + + +U_CAPI const char * U_EXPORT2 +utrace_functionName(int32_t fnNumber) { + if(UTRACE_FUNCTION_START <= fnNumber && fnNumber < UTRACE_FUNCTION_LIMIT) { + return trFnName[fnNumber]; + } else if(UTRACE_CONVERSION_START <= fnNumber && fnNumber < UTRACE_CONVERSION_LIMIT) { + return trConvNames[fnNumber - UTRACE_CONVERSION_START]; + } else if(UTRACE_COLLATION_START <= fnNumber && fnNumber < UTRACE_COLLATION_LIMIT){ + return trCollNames[fnNumber - UTRACE_COLLATION_START]; + } else { + return "[BOGUS Trace Function Number]"; + } +} + diff --git a/Build/source/libs/icu/icu-src/source/common/utracimp.h b/Build/source/libs/icu/icu-src/source/common/utracimp.h index c1786f55b2a..e8ee53fcd61 100644 --- a/Build/source/libs/icu/icu-src/source/common/utracimp.h +++ b/Build/source/libs/icu/icu-src/source/common/utracimp.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* @@ -8,7 +8,7 @@ * ******************************************************************************* * file name: utracimp.h -* encoding: US-ASCII +* encoding: UTF-8 * tab size: 8 (not used) * indentation:4 * @@ -47,20 +47,6 @@ U_CDECL_BEGIN -/** - * \var utrace_level - * Trace level variable. Negative for "off". - * Use only via UTRACE_ macros. - * @internal - */ -#ifdef UTRACE_IMPL -U_EXPORT int32_t -#else -U_CFUNC U_COMMON_API int32_t -#endif -utrace_level; - - /** * Traced Function Exit return types. * Flags indicating the number and types of varargs included in a call diff --git a/Build/source/libs/icu/icu-src/source/common/utrie.cpp b/Build/source/libs/icu/icu-src/source/common/utrie.cpp index 478560df66e..ecf9b1cba72 100644 --- a/Build/source/libs/icu/icu-src/source/common/utrie.cpp +++ b/Build/source/libs/icu/icu-src/source/common/utrie.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ****************************************************************************** @@ -8,7 +8,7 @@ * ****************************************************************************** * file name: utrie.cpp -* encoding: US-ASCII +* encoding: UTF-8 * tab size: 8 (not used) * indentation:4 * diff --git a/Build/source/libs/icu/icu-src/source/common/utrie.h b/Build/source/libs/icu/icu-src/source/common/utrie.h index 17e660b3e30..9c5382c5949 100644 --- a/Build/source/libs/icu/icu-src/source/common/utrie.h +++ b/Build/source/libs/icu/icu-src/source/common/utrie.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ****************************************************************************** @@ -8,7 +8,7 @@ * ****************************************************************************** * file name: utrie.h -* encoding: US-ASCII +* encoding: UTF-8 * tab size: 8 (not used) * indentation:4 * diff --git a/Build/source/libs/icu/icu-src/source/common/utrie2.cpp b/Build/source/libs/icu/icu-src/source/common/utrie2.cpp index 4bd35a924d8..8f9183bafad 100644 --- a/Build/source/libs/icu/icu-src/source/common/utrie2.cpp +++ b/Build/source/libs/icu/icu-src/source/common/utrie2.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ****************************************************************************** @@ -8,7 +8,7 @@ * ****************************************************************************** * file name: utrie2.cpp -* encoding: US-ASCII +* encoding: UTF-8 * tab size: 8 (not used) * indentation:4 * @@ -746,7 +746,7 @@ uint16_t BackwardUTrie2StringIterator::previous16() { codePointLimit=codePointStart; if(start>=codePointStart) { codePoint=U_SENTINEL; - return 0; + return trie->errorValue; } uint16_t result; UTRIE2_U16_PREV16(trie, start, codePointStart, codePoint, result); @@ -757,7 +757,7 @@ uint16_t ForwardUTrie2StringIterator::next16() { codePointStart=codePointLimit; if(codePointLimit==limit) { codePoint=U_SENTINEL; - return 0; + return trie->errorValue; } uint16_t result; UTRIE2_U16_NEXT16(trie, codePointLimit, limit, codePoint, result); diff --git a/Build/source/libs/icu/icu-src/source/common/utrie2.h b/Build/source/libs/icu/icu-src/source/common/utrie2.h index 810bcfc9591..8e1caa5e90b 100644 --- a/Build/source/libs/icu/icu-src/source/common/utrie2.h +++ b/Build/source/libs/icu/icu-src/source/common/utrie2.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ****************************************************************************** @@ -8,7 +8,7 @@ * ****************************************************************************** * file name: utrie2.h -* encoding: US-ASCII +* encoding: UTF-8 * tab size: 8 (not used) * indentation:4 * @@ -20,6 +20,7 @@ #define __UTRIE2_H__ #include "unicode/utypes.h" +#include "unicode/utf8.h" #include "putilimp.h" #include "udataswp.h" @@ -54,6 +55,8 @@ typedef struct UTrie UTrie; * is truncated, omitting both the BMP portion and the high range. * - There is a special small index for 2-byte UTF-8, and the initial data * entries are designed for fast 1/2-byte UTF-8 lookup. + * Starting with ICU 60, C0 and C1 are not recognized as UTF-8 lead bytes any more at all, + * and the associated 2-byte indexes are unused. */ /** @@ -933,29 +936,29 @@ utrie2_internalU8PrevIndex(const UTrie2 *trie, UChar32 c, /** Internal UTF-8 next-post-increment: get the next code point's data. */ #define _UTRIE2_U8_NEXT(trie, ascii, data, src, limit, result) { \ uint8_t __lead=(uint8_t)*(src)++; \ - if(__lead<0xc0) { \ + if(U8_IS_SINGLE(__lead)) { \ (result)=(trie)->ascii[__lead]; \ } else { \ uint8_t __t1, __t2; \ - if( /* handle U+0000..U+07FF inline */ \ - __lead<0xe0 && (src)<(limit) && \ - (__t1=(uint8_t)(*(src)-0x80))<=0x3f \ - ) { \ - ++(src); \ - (result)=(trie)->data[ \ - (trie)->index[(UTRIE2_UTF8_2B_INDEX_2_OFFSET-0xc0)+__lead]+ \ - __t1]; \ - } else if( /* handle U+0000..U+CFFF inline */ \ - __lead<0xed && ((src)+1)<(limit) && \ - (__t1=(uint8_t)(*(src)-0x80))<=0x3f && (__lead>0xe0 || __t1>=0x20) && \ + if( /* handle U+0800..U+FFFF inline */ \ + 0xe0<=__lead && __lead<0xf0 && ((src)+1)<(limit) && \ + U8_IS_VALID_LEAD3_AND_T1(__lead, __t1=(uint8_t)*(src)) && \ (__t2=(uint8_t)(*((src)+1)-0x80))<= 0x3f \ ) { \ (src)+=2; \ (result)=(trie)->data[ \ ((int32_t)((trie)->index[((__lead-0xe0)<<(12-UTRIE2_SHIFT_2))+ \ - (__t1<<(6-UTRIE2_SHIFT_2))+(__t2>>UTRIE2_SHIFT_2)]) \ + ((__t1&0x3f)<<(6-UTRIE2_SHIFT_2))+(__t2>>UTRIE2_SHIFT_2)]) \ <=0xc2 && (src)<(limit) && \ + (__t1=(uint8_t)(*(src)-0x80))<=0x3f \ + ) { \ + ++(src); \ + (result)=(trie)->data[ \ + (trie)->index[(UTRIE2_UTF8_2B_INDEX_2_OFFSET-0xc0)+__lead]+ \ + __t1]; \ } else { \ int32_t __index=utrie2_internalU8NextIndex((trie), __lead, (const uint8_t *)(src), \ (const uint8_t *)(limit)); \ @@ -968,7 +971,7 @@ utrie2_internalU8PrevIndex(const UTrie2 *trie, UChar32 c, /** Internal UTF-8 pre-decrement-previous: get the previous code point's data. */ #define _UTRIE2_U8_PREV(trie, ascii, data, start, src, result) { \ uint8_t __b=(uint8_t)*--(src); \ - if(__b<0x80) { \ + if(U8_IS_SINGLE(__b)) { \ (result)=(trie)->ascii[__b]; \ } else { \ int32_t __index=utrie2_internalU8PrevIndex((trie), __b, (const uint8_t *)(start), \ @@ -980,11 +983,4 @@ utrie2_internalU8PrevIndex(const UTrie2 *trie, UChar32 c, U_CDECL_END -/** - * Work around MSVC 2003 optimization bugs. - */ -#if defined (U_HAVE_MSVC_2003_OR_EARLIER) -#pragma optimize("", off) -#endif - #endif diff --git a/Build/source/libs/icu/icu-src/source/common/utrie2_builder.cpp b/Build/source/libs/icu/icu-src/source/common/utrie2_builder.cpp index 664051c5f9b..d8a3a067573 100644 --- a/Build/source/libs/icu/icu-src/source/common/utrie2_builder.cpp +++ b/Build/source/libs/icu/icu-src/source/common/utrie2_builder.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ****************************************************************************** @@ -8,7 +8,7 @@ * ****************************************************************************** * file name: utrie2_builder.cpp -* encoding: US-ASCII +* encoding: UTF-8 * tab size: 8 (not used) * indentation:4 * diff --git a/Build/source/libs/icu/icu-src/source/common/utrie2_impl.h b/Build/source/libs/icu/icu-src/source/common/utrie2_impl.h index 48883638b18..b7dc9d3fb45 100644 --- a/Build/source/libs/icu/icu-src/source/common/utrie2_impl.h +++ b/Build/source/libs/icu/icu-src/source/common/utrie2_impl.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ****************************************************************************** @@ -8,7 +8,7 @@ * ****************************************************************************** * file name: utrie2_impl.h -* encoding: US-ASCII +* encoding: UTF-8 * tab size: 8 (not used) * indentation:4 * diff --git a/Build/source/libs/icu/icu-src/source/common/uts46.cpp b/Build/source/libs/icu/icu-src/source/common/uts46.cpp index 7bc4f925cac..9b8d3ded2fd 100644 --- a/Build/source/libs/icu/icu-src/source/common/uts46.cpp +++ b/Build/source/libs/icu/icu-src/source/common/uts46.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* @@ -6,7 +6,7 @@ * Corporation and others. All Rights Reserved. ******************************************************************************* * file name: uts46.cpp -* encoding: US-ASCII +* encoding: UTF-8 * tab size: 8 (not used) * indentation:4 * @@ -1015,8 +1015,8 @@ UTS46::checkLabelBiDi(const UChar *label, int32_t labelLength, IDNAInfo &info) c ) { info.isOkBiDi=FALSE; } - // Get the directionalities of the intervening characters. - uint32_t mask=0; + // Add the directionalities of the intervening characters. + uint32_t mask=firstMask|lastMask; while(i(uprv_strlen(label)) : length); CheckedArrayByteSink sink(dest, capacity); IDNAInfo info; reinterpret_cast(idna)->labelToASCII_UTF8(src, sink, info, *pErrorCode); @@ -1431,7 +1431,7 @@ uidna_labelToUnicodeUTF8(const UIDNA *idna, if(!checkArgs(label, length, dest, capacity, pInfo, pErrorCode)) { return 0; } - StringPiece src(label, length<0 ? uprv_strlen(label) : length); + StringPiece src(label, length<0 ? static_cast(uprv_strlen(label)) : length); CheckedArrayByteSink sink(dest, capacity); IDNAInfo info; reinterpret_cast(idna)->labelToUnicodeUTF8(src, sink, info, *pErrorCode); @@ -1447,7 +1447,7 @@ uidna_nameToASCII_UTF8(const UIDNA *idna, if(!checkArgs(name, length, dest, capacity, pInfo, pErrorCode)) { return 0; } - StringPiece src(name, length<0 ? uprv_strlen(name) : length); + StringPiece src(name, length<0 ? static_cast(uprv_strlen(name)) : length); CheckedArrayByteSink sink(dest, capacity); IDNAInfo info; reinterpret_cast(idna)->nameToASCII_UTF8(src, sink, info, *pErrorCode); @@ -1463,7 +1463,7 @@ uidna_nameToUnicodeUTF8(const UIDNA *idna, if(!checkArgs(name, length, dest, capacity, pInfo, pErrorCode)) { return 0; } - StringPiece src(name, length<0 ? uprv_strlen(name) : length); + StringPiece src(name, length<0 ? static_cast(uprv_strlen(name)) : length); CheckedArrayByteSink sink(dest, capacity); IDNAInfo info; reinterpret_cast(idna)->nameToUnicodeUTF8(src, sink, info, *pErrorCode); diff --git a/Build/source/libs/icu/icu-src/source/common/utypeinfo.h b/Build/source/libs/icu/icu-src/source/common/utypeinfo.h index b39aa0d6053..c6663734fc3 100644 --- a/Build/source/libs/icu/icu-src/source/common/utypeinfo.h +++ b/Build/source/libs/icu/icu-src/source/common/utypeinfo.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ****************************************************************************** @@ -24,7 +24,7 @@ #include using std::exception; #endif -#if !defined(_MSC_VER) +#if defined(__GLIBCXX__) namespace std { class type_info; } // WORKAROUND: http://llvm.org/bugs/show_bug.cgi?id=13364 #endif #include // for 'typeid' to work diff --git a/Build/source/libs/icu/icu-src/source/common/utypes.c b/Build/source/libs/icu/icu-src/source/common/utypes.c deleted file mode 100644 index c506dd44f54..00000000000 --- a/Build/source/libs/icu/icu-src/source/common/utypes.c +++ /dev/null @@ -1,224 +0,0 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. -// License & terms of use: http://www.unicode.org/copyright.html -/* -****************************************************************************** -* -* Copyright (C) 1997-2015, International Business Machines -* Corporation and others. All Rights Reserved. -* -****************************************************************************** -* -* FILE NAME : utypes.c (previously putil.c) -* -* Date Name Description -* 10/07/2004 grhoten split from putil.c -****************************************************************************** -*/ - -#include "unicode/utypes.h" - -/* u_errorName() ------------------------------------------------------------ */ - -static const char * const -_uErrorInfoName[U_ERROR_WARNING_LIMIT-U_ERROR_WARNING_START]={ - "U_USING_FALLBACK_WARNING", - "U_USING_DEFAULT_WARNING", - "U_SAFECLONE_ALLOCATED_WARNING", - "U_STATE_OLD_WARNING", - "U_STRING_NOT_TERMINATED_WARNING", - "U_SORT_KEY_TOO_SHORT_WARNING", - "U_AMBIGUOUS_ALIAS_WARNING", - "U_DIFFERENT_UCA_VERSION", - "U_PLUGIN_CHANGED_LEVEL_WARNING", -}; - -static const char * const -_uTransErrorName[U_PARSE_ERROR_LIMIT - U_PARSE_ERROR_START]={ - "U_BAD_VARIABLE_DEFINITION", - "U_MALFORMED_RULE", - "U_MALFORMED_SET", - "U_MALFORMED_SYMBOL_REFERENCE", - "U_MALFORMED_UNICODE_ESCAPE", - "U_MALFORMED_VARIABLE_DEFINITION", - "U_MALFORMED_VARIABLE_REFERENCE", - "U_MISMATCHED_SEGMENT_DELIMITERS", - "U_MISPLACED_ANCHOR_START", - "U_MISPLACED_CURSOR_OFFSET", - "U_MISPLACED_QUANTIFIER", - "U_MISSING_OPERATOR", - "U_MISSING_SEGMENT_CLOSE", - "U_MULTIPLE_ANTE_CONTEXTS", - "U_MULTIPLE_CURSORS", - "U_MULTIPLE_POST_CONTEXTS", - "U_TRAILING_BACKSLASH", - "U_UNDEFINED_SEGMENT_REFERENCE", - "U_UNDEFINED_VARIABLE", - "U_UNQUOTED_SPECIAL", - "U_UNTERMINATED_QUOTE", - "U_RULE_MASK_ERROR", - "U_MISPLACED_COMPOUND_FILTER", - "U_MULTIPLE_COMPOUND_FILTERS", - "U_INVALID_RBT_SYNTAX", - "U_INVALID_PROPERTY_PATTERN", - "U_MALFORMED_PRAGMA", - "U_UNCLOSED_SEGMENT", - "U_ILLEGAL_CHAR_IN_SEGMENT", - "U_VARIABLE_RANGE_EXHAUSTED", - "U_VARIABLE_RANGE_OVERLAP", - "U_ILLEGAL_CHARACTER", - "U_INTERNAL_TRANSLITERATOR_ERROR", - "U_INVALID_ID", - "U_INVALID_FUNCTION" -}; - -static const char * const -_uErrorName[U_STANDARD_ERROR_LIMIT]={ - "U_ZERO_ERROR", - - "U_ILLEGAL_ARGUMENT_ERROR", - "U_MISSING_RESOURCE_ERROR", - "U_INVALID_FORMAT_ERROR", - "U_FILE_ACCESS_ERROR", - "U_INTERNAL_PROGRAM_ERROR", - "U_MESSAGE_PARSE_ERROR", - "U_MEMORY_ALLOCATION_ERROR", - "U_INDEX_OUTOFBOUNDS_ERROR", - "U_PARSE_ERROR", - "U_INVALID_CHAR_FOUND", - "U_TRUNCATED_CHAR_FOUND", - "U_ILLEGAL_CHAR_FOUND", - "U_INVALID_TABLE_FORMAT", - "U_INVALID_TABLE_FILE", - "U_BUFFER_OVERFLOW_ERROR", - "U_UNSUPPORTED_ERROR", - "U_RESOURCE_TYPE_MISMATCH", - "U_ILLEGAL_ESCAPE_SEQUENCE", - "U_UNSUPPORTED_ESCAPE_SEQUENCE", - "U_NO_SPACE_AVAILABLE", - "U_CE_NOT_FOUND_ERROR", - "U_PRIMARY_TOO_LONG_ERROR", - "U_STATE_TOO_OLD_ERROR", - "U_TOO_MANY_ALIASES_ERROR", - "U_ENUM_OUT_OF_SYNC_ERROR", - "U_INVARIANT_CONVERSION_ERROR", - "U_INVALID_STATE_ERROR", - "U_COLLATOR_VERSION_MISMATCH", - "U_USELESS_COLLATOR_ERROR", - "U_NO_WRITE_PERMISSION" -}; -static const char * const -_uFmtErrorName[U_FMT_PARSE_ERROR_LIMIT - U_FMT_PARSE_ERROR_START] = { - "U_UNEXPECTED_TOKEN", - "U_MULTIPLE_DECIMAL_SEPARATORS", - "U_MULTIPLE_EXPONENTIAL_SYMBOLS", - "U_MALFORMED_EXPONENTIAL_PATTERN", - "U_MULTIPLE_PERCENT_SYMBOLS", - "U_MULTIPLE_PERMILL_SYMBOLS", - "U_MULTIPLE_PAD_SPECIFIERS", - "U_PATTERN_SYNTAX_ERROR", - "U_ILLEGAL_PAD_POSITION", - "U_UNMATCHED_BRACES", - "U_UNSUPPORTED_PROPERTY", - "U_UNSUPPORTED_ATTRIBUTE", - "U_ARGUMENT_TYPE_MISMATCH", - "U_DUPLICATE_KEYWORD", - "U_UNDEFINED_KEYWORD", - "U_DEFAULT_KEYWORD_MISSING", - "U_DECIMAL_NUMBER_SYNTAX_ERROR", - "U_FORMAT_INEXACT_ERROR" -}; - -static const char * const -_uBrkErrorName[U_BRK_ERROR_LIMIT - U_BRK_ERROR_START] = { - "U_BRK_INTERNAL_ERROR", - "U_BRK_HEX_DIGITS_EXPECTED", - "U_BRK_SEMICOLON_EXPECTED", - "U_BRK_RULE_SYNTAX", - "U_BRK_UNCLOSED_SET", - "U_BRK_ASSIGN_ERROR", - "U_BRK_VARIABLE_REDFINITION", - "U_BRK_MISMATCHED_PAREN", - "U_BRK_NEW_LINE_IN_QUOTED_STRING", - "U_BRK_UNDEFINED_VARIABLE", - "U_BRK_INIT_ERROR", - "U_BRK_RULE_EMPTY_SET", - "U_BRK_UNRECOGNIZED_OPTION", - "U_BRK_MALFORMED_RULE_TAG" -}; - -static const char * const -_uRegexErrorName[U_REGEX_ERROR_LIMIT - U_REGEX_ERROR_START] = { - "U_REGEX_INTERNAL_ERROR", - "U_REGEX_RULE_SYNTAX", - "U_REGEX_INVALID_STATE", - "U_REGEX_BAD_ESCAPE_SEQUENCE", - "U_REGEX_PROPERTY_SYNTAX", - "U_REGEX_UNIMPLEMENTED", - "U_REGEX_MISMATCHED_PAREN", - "U_REGEX_NUMBER_TOO_BIG", - "U_REGEX_BAD_INTERVAL", - "U_REGEX_MAX_LT_MIN", - "U_REGEX_INVALID_BACK_REF", - "U_REGEX_INVALID_FLAG", - "U_REGEX_LOOK_BEHIND_LIMIT", - "U_REGEX_SET_CONTAINS_STRING", - "U_REGEX_OCTAL_TOO_BIG", - "U_REGEX_MISSING_CLOSE_BRACKET", - "U_REGEX_INVALID_RANGE", - "U_REGEX_STACK_OVERFLOW", - "U_REGEX_TIME_OUT", - "U_REGEX_STOPPED_BY_CALLER", - "U_REGEX_PATTERN_TOO_BIG", - "U_REGEX_INVALID_CAPTURE_GROUP_NAME" -}; - -static const char * const -_uIDNAErrorName[U_IDNA_ERROR_LIMIT - U_IDNA_ERROR_START] = { - "U_STRINGPREP_PROHIBITED_ERROR", - "U_STRINGPREP_UNASSIGNED_ERROR", - "U_STRINGPREP_CHECK_BIDI_ERROR", - "U_IDNA_STD3_ASCII_RULES_ERROR", - "U_IDNA_ACE_PREFIX_ERROR", - "U_IDNA_VERIFICATION_ERROR", - "U_IDNA_LABEL_TOO_LONG_ERROR", - "U_IDNA_ZERO_LENGTH_LABEL_ERROR", - "U_IDNA_DOMAIN_NAME_TOO_LONG_ERROR" -}; - -static const char * const -_uPluginErrorName[U_PLUGIN_ERROR_LIMIT - U_PLUGIN_ERROR_START] = { - "U_PLUGIN_TOO_HIGH", - "U_PLUGIN_DIDNT_SET_LEVEL", -}; - -U_CAPI const char * U_EXPORT2 -u_errorName(UErrorCode code) { - if(U_ZERO_ERROR <= code && code < U_STANDARD_ERROR_LIMIT) { - return _uErrorName[code]; - } else if(U_ERROR_WARNING_START <= code && code < U_ERROR_WARNING_LIMIT) { - return _uErrorInfoName[code - U_ERROR_WARNING_START]; - } else if(U_PARSE_ERROR_START <= code && code < U_PARSE_ERROR_LIMIT){ - return _uTransErrorName[code - U_PARSE_ERROR_START]; - } else if(U_FMT_PARSE_ERROR_START <= code && code < U_FMT_PARSE_ERROR_LIMIT){ - return _uFmtErrorName[code - U_FMT_PARSE_ERROR_START]; - } else if (U_BRK_ERROR_START <= code && code < U_BRK_ERROR_LIMIT){ - return _uBrkErrorName[code - U_BRK_ERROR_START]; - } else if (U_REGEX_ERROR_START <= code && code < U_REGEX_ERROR_LIMIT) { - return _uRegexErrorName[code - U_REGEX_ERROR_START]; - } else if(U_IDNA_ERROR_START <= code && code < U_IDNA_ERROR_LIMIT) { - return _uIDNAErrorName[code - U_IDNA_ERROR_START]; - } else if(U_PLUGIN_ERROR_START <= code && code < U_PLUGIN_ERROR_LIMIT) { - return _uPluginErrorName[code - U_PLUGIN_ERROR_START]; - } else { - return "[BOGUS UErrorCode]"; - } -} - -/* - * Hey, Emacs, please set the following: - * - * Local Variables: - * indent-tabs-mode: nil - * End: - * - */ diff --git a/Build/source/libs/icu/icu-src/source/common/utypes.cpp b/Build/source/libs/icu/icu-src/source/common/utypes.cpp new file mode 100644 index 00000000000..8f5791be160 --- /dev/null +++ b/Build/source/libs/icu/icu-src/source/common/utypes.cpp @@ -0,0 +1,224 @@ +// © 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html +/* +****************************************************************************** +* +* Copyright (C) 1997-2015, International Business Machines +* Corporation and others. All Rights Reserved. +* +****************************************************************************** +* +* FILE NAME : utypes.c (previously putil.c) +* +* Date Name Description +* 10/07/2004 grhoten split from putil.c +****************************************************************************** +*/ + +#include "unicode/utypes.h" + +/* u_errorName() ------------------------------------------------------------ */ + +static const char * const +_uErrorInfoName[U_ERROR_WARNING_LIMIT-U_ERROR_WARNING_START]={ + "U_USING_FALLBACK_WARNING", + "U_USING_DEFAULT_WARNING", + "U_SAFECLONE_ALLOCATED_WARNING", + "U_STATE_OLD_WARNING", + "U_STRING_NOT_TERMINATED_WARNING", + "U_SORT_KEY_TOO_SHORT_WARNING", + "U_AMBIGUOUS_ALIAS_WARNING", + "U_DIFFERENT_UCA_VERSION", + "U_PLUGIN_CHANGED_LEVEL_WARNING", +}; + +static const char * const +_uTransErrorName[U_PARSE_ERROR_LIMIT - U_PARSE_ERROR_START]={ + "U_BAD_VARIABLE_DEFINITION", + "U_MALFORMED_RULE", + "U_MALFORMED_SET", + "U_MALFORMED_SYMBOL_REFERENCE", + "U_MALFORMED_UNICODE_ESCAPE", + "U_MALFORMED_VARIABLE_DEFINITION", + "U_MALFORMED_VARIABLE_REFERENCE", + "U_MISMATCHED_SEGMENT_DELIMITERS", + "U_MISPLACED_ANCHOR_START", + "U_MISPLACED_CURSOR_OFFSET", + "U_MISPLACED_QUANTIFIER", + "U_MISSING_OPERATOR", + "U_MISSING_SEGMENT_CLOSE", + "U_MULTIPLE_ANTE_CONTEXTS", + "U_MULTIPLE_CURSORS", + "U_MULTIPLE_POST_CONTEXTS", + "U_TRAILING_BACKSLASH", + "U_UNDEFINED_SEGMENT_REFERENCE", + "U_UNDEFINED_VARIABLE", + "U_UNQUOTED_SPECIAL", + "U_UNTERMINATED_QUOTE", + "U_RULE_MASK_ERROR", + "U_MISPLACED_COMPOUND_FILTER", + "U_MULTIPLE_COMPOUND_FILTERS", + "U_INVALID_RBT_SYNTAX", + "U_INVALID_PROPERTY_PATTERN", + "U_MALFORMED_PRAGMA", + "U_UNCLOSED_SEGMENT", + "U_ILLEGAL_CHAR_IN_SEGMENT", + "U_VARIABLE_RANGE_EXHAUSTED", + "U_VARIABLE_RANGE_OVERLAP", + "U_ILLEGAL_CHARACTER", + "U_INTERNAL_TRANSLITERATOR_ERROR", + "U_INVALID_ID", + "U_INVALID_FUNCTION" +}; + +static const char * const +_uErrorName[U_STANDARD_ERROR_LIMIT]={ + "U_ZERO_ERROR", + + "U_ILLEGAL_ARGUMENT_ERROR", + "U_MISSING_RESOURCE_ERROR", + "U_INVALID_FORMAT_ERROR", + "U_FILE_ACCESS_ERROR", + "U_INTERNAL_PROGRAM_ERROR", + "U_MESSAGE_PARSE_ERROR", + "U_MEMORY_ALLOCATION_ERROR", + "U_INDEX_OUTOFBOUNDS_ERROR", + "U_PARSE_ERROR", + "U_INVALID_CHAR_FOUND", + "U_TRUNCATED_CHAR_FOUND", + "U_ILLEGAL_CHAR_FOUND", + "U_INVALID_TABLE_FORMAT", + "U_INVALID_TABLE_FILE", + "U_BUFFER_OVERFLOW_ERROR", + "U_UNSUPPORTED_ERROR", + "U_RESOURCE_TYPE_MISMATCH", + "U_ILLEGAL_ESCAPE_SEQUENCE", + "U_UNSUPPORTED_ESCAPE_SEQUENCE", + "U_NO_SPACE_AVAILABLE", + "U_CE_NOT_FOUND_ERROR", + "U_PRIMARY_TOO_LONG_ERROR", + "U_STATE_TOO_OLD_ERROR", + "U_TOO_MANY_ALIASES_ERROR", + "U_ENUM_OUT_OF_SYNC_ERROR", + "U_INVARIANT_CONVERSION_ERROR", + "U_INVALID_STATE_ERROR", + "U_COLLATOR_VERSION_MISMATCH", + "U_USELESS_COLLATOR_ERROR", + "U_NO_WRITE_PERMISSION" +}; +static const char * const +_uFmtErrorName[U_FMT_PARSE_ERROR_LIMIT - U_FMT_PARSE_ERROR_START] = { + "U_UNEXPECTED_TOKEN", + "U_MULTIPLE_DECIMAL_SEPARATORS", + "U_MULTIPLE_EXPONENTIAL_SYMBOLS", + "U_MALFORMED_EXPONENTIAL_PATTERN", + "U_MULTIPLE_PERCENT_SYMBOLS", + "U_MULTIPLE_PERMILL_SYMBOLS", + "U_MULTIPLE_PAD_SPECIFIERS", + "U_PATTERN_SYNTAX_ERROR", + "U_ILLEGAL_PAD_POSITION", + "U_UNMATCHED_BRACES", + "U_UNSUPPORTED_PROPERTY", + "U_UNSUPPORTED_ATTRIBUTE", + "U_ARGUMENT_TYPE_MISMATCH", + "U_DUPLICATE_KEYWORD", + "U_UNDEFINED_KEYWORD", + "U_DEFAULT_KEYWORD_MISSING", + "U_DECIMAL_NUMBER_SYNTAX_ERROR", + "U_FORMAT_INEXACT_ERROR" +}; + +static const char * const +_uBrkErrorName[U_BRK_ERROR_LIMIT - U_BRK_ERROR_START] = { + "U_BRK_INTERNAL_ERROR", + "U_BRK_HEX_DIGITS_EXPECTED", + "U_BRK_SEMICOLON_EXPECTED", + "U_BRK_RULE_SYNTAX", + "U_BRK_UNCLOSED_SET", + "U_BRK_ASSIGN_ERROR", + "U_BRK_VARIABLE_REDFINITION", + "U_BRK_MISMATCHED_PAREN", + "U_BRK_NEW_LINE_IN_QUOTED_STRING", + "U_BRK_UNDEFINED_VARIABLE", + "U_BRK_INIT_ERROR", + "U_BRK_RULE_EMPTY_SET", + "U_BRK_UNRECOGNIZED_OPTION", + "U_BRK_MALFORMED_RULE_TAG" +}; + +static const char * const +_uRegexErrorName[U_REGEX_ERROR_LIMIT - U_REGEX_ERROR_START] = { + "U_REGEX_INTERNAL_ERROR", + "U_REGEX_RULE_SYNTAX", + "U_REGEX_INVALID_STATE", + "U_REGEX_BAD_ESCAPE_SEQUENCE", + "U_REGEX_PROPERTY_SYNTAX", + "U_REGEX_UNIMPLEMENTED", + "U_REGEX_MISMATCHED_PAREN", + "U_REGEX_NUMBER_TOO_BIG", + "U_REGEX_BAD_INTERVAL", + "U_REGEX_MAX_LT_MIN", + "U_REGEX_INVALID_BACK_REF", + "U_REGEX_INVALID_FLAG", + "U_REGEX_LOOK_BEHIND_LIMIT", + "U_REGEX_SET_CONTAINS_STRING", + "U_REGEX_OCTAL_TOO_BIG", + "U_REGEX_MISSING_CLOSE_BRACKET", + "U_REGEX_INVALID_RANGE", + "U_REGEX_STACK_OVERFLOW", + "U_REGEX_TIME_OUT", + "U_REGEX_STOPPED_BY_CALLER", + "U_REGEX_PATTERN_TOO_BIG", + "U_REGEX_INVALID_CAPTURE_GROUP_NAME" +}; + +static const char * const +_uIDNAErrorName[U_IDNA_ERROR_LIMIT - U_IDNA_ERROR_START] = { + "U_STRINGPREP_PROHIBITED_ERROR", + "U_STRINGPREP_UNASSIGNED_ERROR", + "U_STRINGPREP_CHECK_BIDI_ERROR", + "U_IDNA_STD3_ASCII_RULES_ERROR", + "U_IDNA_ACE_PREFIX_ERROR", + "U_IDNA_VERIFICATION_ERROR", + "U_IDNA_LABEL_TOO_LONG_ERROR", + "U_IDNA_ZERO_LENGTH_LABEL_ERROR", + "U_IDNA_DOMAIN_NAME_TOO_LONG_ERROR" +}; + +static const char * const +_uPluginErrorName[U_PLUGIN_ERROR_LIMIT - U_PLUGIN_ERROR_START] = { + "U_PLUGIN_TOO_HIGH", + "U_PLUGIN_DIDNT_SET_LEVEL", +}; + +U_CAPI const char * U_EXPORT2 +u_errorName(UErrorCode code) { + if(U_ZERO_ERROR <= code && code < U_STANDARD_ERROR_LIMIT) { + return _uErrorName[code]; + } else if(U_ERROR_WARNING_START <= code && code < U_ERROR_WARNING_LIMIT) { + return _uErrorInfoName[code - U_ERROR_WARNING_START]; + } else if(U_PARSE_ERROR_START <= code && code < U_PARSE_ERROR_LIMIT){ + return _uTransErrorName[code - U_PARSE_ERROR_START]; + } else if(U_FMT_PARSE_ERROR_START <= code && code < U_FMT_PARSE_ERROR_LIMIT){ + return _uFmtErrorName[code - U_FMT_PARSE_ERROR_START]; + } else if (U_BRK_ERROR_START <= code && code < U_BRK_ERROR_LIMIT){ + return _uBrkErrorName[code - U_BRK_ERROR_START]; + } else if (U_REGEX_ERROR_START <= code && code < U_REGEX_ERROR_LIMIT) { + return _uRegexErrorName[code - U_REGEX_ERROR_START]; + } else if(U_IDNA_ERROR_START <= code && code < U_IDNA_ERROR_LIMIT) { + return _uIDNAErrorName[code - U_IDNA_ERROR_START]; + } else if(U_PLUGIN_ERROR_START <= code && code < U_PLUGIN_ERROR_LIMIT) { + return _uPluginErrorName[code - U_PLUGIN_ERROR_START]; + } else { + return "[BOGUS UErrorCode]"; + } +} + +/* + * Hey, Emacs, please set the following: + * + * Local Variables: + * indent-tabs-mode: nil + * End: + * + */ diff --git a/Build/source/libs/icu/icu-src/source/common/uvector.cpp b/Build/source/libs/icu/icu-src/source/common/uvector.cpp index 863ef7878c0..cf19edf646f 100644 --- a/Build/source/libs/icu/icu-src/source/common/uvector.cpp +++ b/Build/source/libs/icu/icu-src/source/common/uvector.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ****************************************************************************** diff --git a/Build/source/libs/icu/icu-src/source/common/uvector.h b/Build/source/libs/icu/icu-src/source/common/uvector.h index 6439b4e2179..5ec6e114b8f 100644 --- a/Build/source/libs/icu/icu-src/source/common/uvector.h +++ b/Build/source/libs/icu/icu-src/source/common/uvector.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** diff --git a/Build/source/libs/icu/icu-src/source/common/uvectr32.cpp b/Build/source/libs/icu/icu-src/source/common/uvectr32.cpp index 41f5fb7c08d..d1ae6599585 100644 --- a/Build/source/libs/icu/icu-src/source/common/uvectr32.cpp +++ b/Build/source/libs/icu/icu-src/source/common/uvectr32.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ****************************************************************************** diff --git a/Build/source/libs/icu/icu-src/source/common/uvectr32.h b/Build/source/libs/icu/icu-src/source/common/uvectr32.h index e3a0577ced7..9112d9fe4aa 100644 --- a/Build/source/libs/icu/icu-src/source/common/uvectr32.h +++ b/Build/source/libs/icu/icu-src/source/common/uvectr32.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** diff --git a/Build/source/libs/icu/icu-src/source/common/uvectr64.cpp b/Build/source/libs/icu/icu-src/source/common/uvectr64.cpp index b69e1938392..081565959cf 100644 --- a/Build/source/libs/icu/icu-src/source/common/uvectr64.cpp +++ b/Build/source/libs/icu/icu-src/source/common/uvectr64.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ****************************************************************************** diff --git a/Build/source/libs/icu/icu-src/source/common/uvectr64.h b/Build/source/libs/icu/icu-src/source/common/uvectr64.h index b78ed871da5..5571685988a 100644 --- a/Build/source/libs/icu/icu-src/source/common/uvectr64.h +++ b/Build/source/libs/icu/icu-src/source/common/uvectr64.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** diff --git a/Build/source/libs/icu/icu-src/source/common/wintz.c b/Build/source/libs/icu/icu-src/source/common/wintz.c deleted file mode 100644 index 004b60b7728..00000000000 --- a/Build/source/libs/icu/icu-src/source/common/wintz.c +++ /dev/null @@ -1,441 +0,0 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. -// License & terms of use: http://www.unicode.org/copyright.html -/* -******************************************************************************** -* Copyright (C) 2005-2015, International Business Machines -* Corporation and others. All Rights Reserved. -******************************************************************************** -* -* File WINTZ.CPP -* -******************************************************************************** -*/ - -#include "unicode/utypes.h" - -#if U_PLATFORM_USES_ONLY_WIN32_API - -#include "wintz.h" -#include "cmemory.h" -#include "cstring.h" - -#include "unicode/ures.h" -#include "unicode/ustring.h" - -# define WIN32_LEAN_AND_MEAN -# define VC_EXTRALEAN -# define NOUSER -# define NOSERVICE -# define NOIME -# define NOMCX -#include - -#define MAX_LENGTH_ID 40 - -/* The layout of the Tzi value in the registry */ -typedef struct -{ - int32_t bias; - int32_t standardBias; - int32_t daylightBias; - SYSTEMTIME standardDate; - SYSTEMTIME daylightDate; -} TZI; - -/** - * Various registry keys and key fragments. - */ -static const char CURRENT_ZONE_REGKEY[] = "SYSTEM\\CurrentControlSet\\Control\\TimeZoneInformation\\"; -/* static const char STANDARD_NAME_REGKEY[] = "StandardName"; Currently unused constant */ -static const char STANDARD_TIME_REGKEY[] = " Standard Time"; -static const char TZI_REGKEY[] = "TZI"; -static const char STD_REGKEY[] = "Std"; - -/** - * HKLM subkeys used to probe for the flavor of Windows. Note that we - * specifically check for the "GMT" zone subkey; this is present on - * NT, but on XP has become "GMT Standard Time". We need to - * discriminate between these cases. - */ -static const char* const WIN_TYPE_PROBE_REGKEY[] = { - /* WIN_9X_ME_TYPE */ - "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Time Zones", - - /* WIN_NT_TYPE */ - "SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Time Zones\\GMT" - - /* otherwise: WIN_2K_XP_TYPE */ -}; - -/** - * The time zone root subkeys (under HKLM) for different flavors of - * Windows. - */ -static const char* const TZ_REGKEY[] = { - /* WIN_9X_ME_TYPE */ - "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Time Zones\\", - - /* WIN_NT_TYPE | WIN_2K_XP_TYPE */ - "SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Time Zones\\" -}; - -/** - * Flavor of Windows, from our perspective. Not a real OS version, - * but rather the flavor of the layout of the time zone information in - * the registry. - */ -enum { - WIN_9X_ME_TYPE = 1, - WIN_NT_TYPE = 2, - WIN_2K_XP_TYPE = 3 -}; - -static int32_t gWinType = 0; - -static int32_t detectWindowsType() -{ - int32_t winType; - LONG result; - HKEY hkey; - - /* Detect the version of windows by trying to open a sequence of - probe keys. We don't use the OS version API because what we - really want to know is how the registry is laid out. - Specifically, is it 9x/Me or not, and is it "GMT" or "GMT - Standard Time". */ - for (winType = 0; winType < 2; winType++) { - result = RegOpenKeyExA(HKEY_LOCAL_MACHINE, - WIN_TYPE_PROBE_REGKEY[winType], - 0, - KEY_QUERY_VALUE, - &hkey); - RegCloseKey(hkey); - - if (result == ERROR_SUCCESS) { - break; - } - } - - return winType+1; /* +1 to bring it inline with the enum */ -} - -static LONG openTZRegKey(HKEY *hkey, const char *winid) -{ - char subKeyName[110]; /* TODO: why 96?? */ - char *name; - LONG result; - - /* This isn't thread safe, but it's good enough because the result should be constant per system. */ - if (gWinType <= 0) { - gWinType = detectWindowsType(); - } - - uprv_strcpy(subKeyName, TZ_REGKEY[(gWinType != WIN_9X_ME_TYPE)]); - name = &subKeyName[strlen(subKeyName)]; - uprv_strcat(subKeyName, winid); - - if (gWinType == WIN_9X_ME_TYPE) { - /* Remove " Standard Time" */ - char *pStd = uprv_strstr(subKeyName, STANDARD_TIME_REGKEY); - if (pStd) { - *pStd = 0; - } - } - - result = RegOpenKeyExA(HKEY_LOCAL_MACHINE, - subKeyName, - 0, - KEY_QUERY_VALUE, - hkey); - return result; -} - -static LONG getTZI(const char *winid, TZI *tzi) -{ - DWORD cbData = sizeof(TZI); - LONG result; - HKEY hkey; - - result = openTZRegKey(&hkey, winid); - - if (result == ERROR_SUCCESS) { - result = RegQueryValueExA(hkey, - TZI_REGKEY, - NULL, - NULL, - (LPBYTE)tzi, - &cbData); - - } - - RegCloseKey(hkey); - - return result; -} - -static LONG getSTDName(const char *winid, char *regStdName, int32_t length) { - DWORD cbData = length; - LONG result; - HKEY hkey; - - result = openTZRegKey(&hkey, winid); - - if (result == ERROR_SUCCESS) { - result = RegQueryValueExA(hkey, - STD_REGKEY, - NULL, - NULL, - (LPBYTE)regStdName, - &cbData); - - } - - RegCloseKey(hkey); - - return result; -} - -static LONG getTZKeyName(char* tzKeyName, int32_t length) { - HKEY hkey; - LONG result = FALSE; - DWORD cbData = length; - - if(ERROR_SUCCESS == RegOpenKeyExA( - HKEY_LOCAL_MACHINE, - CURRENT_ZONE_REGKEY, - 0, - KEY_QUERY_VALUE, - &hkey)) - { - result = RegQueryValueExA( - hkey, - "TimeZoneKeyName", - NULL, - NULL, - (LPBYTE)tzKeyName, - &cbData); - } - - return result; -} - -/* - This code attempts to detect the Windows time zone, as set in the - Windows Date and Time control panel. It attempts to work on - multiple flavors of Windows (9x, Me, NT, 2000, XP) and on localized - installs. It works by directly interrogating the registry and - comparing the data there with the data returned by the - GetTimeZoneInformation API, along with some other strategies. The - registry contains time zone data under one of two keys (depending on - the flavor of Windows): - - HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Time Zones\ - HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Time Zones\ - - Under this key are several subkeys, one for each time zone. These - subkeys are named "Pacific" on Win9x/Me and "Pacific Standard Time" - on WinNT/2k/XP. There are some other wrinkles; see the code for - details. The subkey name is NOT LOCALIZED, allowing us to support - localized installs. - - Under the subkey are data values. We care about: - - Std Standard time display name, localized - TZI Binary block of data - - The TZI data is of particular interest. It contains the offset, two - more offsets for standard and daylight time, and the start and end - rules. This is the same data returned by the GetTimeZoneInformation - API. The API may modify the data on the way out, so we have to be - careful, but essentially we do a binary comparison against the TZI - blocks of various registry keys. When we find a match, we know what - time zone Windows is set to. Since the registry key is not - localized, we can then translate the key through a simple table - lookup into the corresponding ICU time zone. - - This strategy doesn't always work because there are zones which - share an offset and rules, so more than one TZI block will match. - For example, both Tokyo and Seoul are at GMT+9 with no DST rules; - their TZI blocks are identical. For these cases, we fall back to a - name lookup. We attempt to match the display name as stored in the - registry for the current zone to the display name stored in the - registry for various Windows zones. By comparing the registry data - directly we avoid conversion complications. - - Author: Alan Liu - Since: ICU 2.6 - Based on original code by Carl Brown -*/ - -/** - * Main Windows time zone detection function. Returns the Windows - * time zone, translated to an ICU time zone, or NULL upon failure. - */ -U_CFUNC const char* U_EXPORT2 -uprv_detectWindowsTimeZone() { - UErrorCode status = U_ZERO_ERROR; - UResourceBundle* bundle = NULL; - char* icuid = NULL; - char apiStdName[MAX_LENGTH_ID]; - char regStdName[MAX_LENGTH_ID]; - char tmpid[MAX_LENGTH_ID]; - int32_t len; - int id; - int errorCode; - UChar ISOcodeW[3]; /* 2 letter iso code in UTF-16*/ - char ISOcodeA[3]; /* 2 letter iso code in ansi */ - - LONG result; - TZI tziKey; - TZI tziReg; - TIME_ZONE_INFORMATION apiTZI; - - BOOL isVistaOrHigher; - BOOL tryPreVistaFallback; - OSVERSIONINFO osVerInfo; - - /* Obtain TIME_ZONE_INFORMATION from the API, and then convert it - to TZI. We could also interrogate the registry directly; we do - this below if needed. */ - uprv_memset(&apiTZI, 0, sizeof(apiTZI)); - uprv_memset(&tziKey, 0, sizeof(tziKey)); - uprv_memset(&tziReg, 0, sizeof(tziReg)); - GetTimeZoneInformation(&apiTZI); - tziKey.bias = apiTZI.Bias; - uprv_memcpy((char *)&tziKey.standardDate, (char*)&apiTZI.StandardDate, - sizeof(apiTZI.StandardDate)); - uprv_memcpy((char *)&tziKey.daylightDate, (char*)&apiTZI.DaylightDate, - sizeof(apiTZI.DaylightDate)); - - /* Convert the wchar_t* standard name to char* */ - uprv_memset(apiStdName, 0, sizeof(apiStdName)); - wcstombs(apiStdName, apiTZI.StandardName, MAX_LENGTH_ID); - - tmpid[0] = 0; - - id = GetUserGeoID(GEOCLASS_NATION); - errorCode = GetGeoInfoW(id,GEO_ISO2,ISOcodeW,3,0); - u_strToUTF8(ISOcodeA, 3, NULL, ISOcodeW, 3, &status); - - bundle = ures_openDirect(NULL, "windowsZones", &status); - ures_getByKey(bundle, "mapTimezones", bundle, &status); - - /* - Windows Vista+ provides us with a "TimeZoneKeyName" that is not localized - and can be used to directly map a name in our bundle. Try to use that first - if we're on Vista or higher - */ - uprv_memset(&osVerInfo, 0, sizeof(osVerInfo)); - osVerInfo.dwOSVersionInfoSize = sizeof(osVerInfo); - GetVersionEx(&osVerInfo); - isVistaOrHigher = osVerInfo.dwMajorVersion >= 6; /* actually includes Windows Server 2008 as well, but don't worry about it */ - tryPreVistaFallback = TRUE; - if(isVistaOrHigher) { - result = getTZKeyName(regStdName, sizeof(regStdName)); - if(ERROR_SUCCESS == result) { - UResourceBundle* winTZ = ures_getByKey(bundle, regStdName, NULL, &status); - if(U_SUCCESS(status)) { - const UChar* icuTZ = NULL; - if (errorCode != 0) { - icuTZ = ures_getStringByKey(winTZ, ISOcodeA, &len, &status); - } - if (errorCode==0 || icuTZ==NULL) { - /* fallback to default "001" and reset status */ - status = U_ZERO_ERROR; - icuTZ = ures_getStringByKey(winTZ, "001", &len, &status); - } - - if(U_SUCCESS(status)) { - int index=0; - while (! (*icuTZ == '\0' || *icuTZ ==' ')) { - tmpid[index++]=(char)(*icuTZ++); /* safe to assume 'char' is ASCII compatible on windows */ - } - tmpid[index]='\0'; - tryPreVistaFallback = FALSE; - } - } - ures_close(winTZ); - } - } - - if(tryPreVistaFallback) { - - /* Note: We get the winid not from static tables but from resource bundle. */ - while (U_SUCCESS(status) && ures_hasNext(bundle)) { - UBool idFound = FALSE; - const char* winid; - UResourceBundle* winTZ = ures_getNextResource(bundle, NULL, &status); - if (U_FAILURE(status)) { - break; - } - winid = ures_getKey(winTZ); - result = getTZI(winid, &tziReg); - - if (result == ERROR_SUCCESS) { - /* Windows alters the DaylightBias in some situations. - Using the bias and the rules suffices, so overwrite - these unreliable fields. */ - tziKey.standardBias = tziReg.standardBias; - tziKey.daylightBias = tziReg.daylightBias; - - if (uprv_memcmp((char *)&tziKey, (char*)&tziReg, sizeof(tziKey)) == 0) { - const UChar* icuTZ = NULL; - if (errorCode != 0) { - icuTZ = ures_getStringByKey(winTZ, ISOcodeA, &len, &status); - } - if (errorCode==0 || icuTZ==NULL) { - /* fallback to default "001" and reset status */ - status = U_ZERO_ERROR; - icuTZ = ures_getStringByKey(winTZ, "001", &len, &status); - } - - if (U_SUCCESS(status)) { - /* Get the standard name from the registry key to compare with - the one from Windows API call. */ - uprv_memset(regStdName, 0, sizeof(regStdName)); - result = getSTDName(winid, regStdName, sizeof(regStdName)); - if (result == ERROR_SUCCESS) { - if (uprv_strcmp(apiStdName, regStdName) == 0) { - idFound = TRUE; - } - } - - /* tmpid buffer holds the ICU timezone ID corresponding to the timezone ID from Windows. - * If none is found, tmpid buffer will contain a fallback ID (i.e. the time zone ID matching - * the current time zone information) - */ - if (idFound || tmpid[0] == 0) { - /* if icuTZ has more than one city, take only the first (i.e. terminate icuTZ at first space) */ - int index=0; - while (! (*icuTZ == '\0' || *icuTZ ==' ')) { - tmpid[index++]=(char)(*icuTZ++); /* safe to assume 'char' is ASCII compatible on windows */ - } - tmpid[index]='\0'; - } - } - } - } - ures_close(winTZ); - if (idFound) { - break; - } - } - } - - /* - * Copy the timezone ID to icuid to be returned. - */ - if (tmpid[0] != 0) { - len = uprv_strlen(tmpid); - icuid = (char*)uprv_calloc(len + 1, sizeof(char)); - if (icuid != NULL) { - uprv_strcpy(icuid, tmpid); - } - } - - ures_close(bundle); - - return icuid; -} - -#endif /* U_PLATFORM_USES_ONLY_WIN32_API */ diff --git a/Build/source/libs/icu/icu-src/source/common/wintz.cpp b/Build/source/libs/icu/icu-src/source/common/wintz.cpp new file mode 100644 index 00000000000..10e69ca59dd --- /dev/null +++ b/Build/source/libs/icu/icu-src/source/common/wintz.cpp @@ -0,0 +1,384 @@ +// © 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html +/* +******************************************************************************** +* Copyright (C) 2005-2015, International Business Machines +* Corporation and others. All Rights Reserved. +******************************************************************************** +* +* File WINTZ.CPP +* +******************************************************************************** +*/ + +#include "unicode/utypes.h" + +// This file contains only desktop Windows behavior +// Windows UWP calls Windows::Globalization directly, so this isn't needed there. +#if U_PLATFORM_USES_ONLY_WIN32_API && (U_PLATFORM_HAS_WINUWP_API == 0) + +#include "wintz.h" +#include "cmemory.h" +#include "cstring.h" + +#include "unicode/ures.h" +#include "unicode/ustring.h" + +#ifndef WIN32_LEAN_AND_MEAN +# define WIN32_LEAN_AND_MEAN +#endif +# define VC_EXTRALEAN +# define NOUSER +# define NOSERVICE +# define NOIME +# define NOMCX +#include + +#define MAX_LENGTH_ID 40 + +/* The layout of the Tzi value in the registry */ +typedef struct +{ + int32_t bias; + int32_t standardBias; + int32_t daylightBias; + SYSTEMTIME standardDate; + SYSTEMTIME daylightDate; +} TZI; + +/** + * Various registry keys and key fragments. + */ +static const char CURRENT_ZONE_REGKEY[] = "SYSTEM\\CurrentControlSet\\Control\\TimeZoneInformation\\"; +static const char STANDARD_TIME_REGKEY[] = " Standard Time"; +static const char TZI_REGKEY[] = "TZI"; +static const char STD_REGKEY[] = "Std"; + +/** + * The time zone root keys (under HKLM) for Win7+ + */ +static const char TZ_REGKEY[] = "SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Time Zones\\"; + +static LONG openTZRegKey(HKEY *hkey, const char *winid) +{ + char subKeyName[110]; /* TODO: why 110?? */ + char *name; + LONG result; + + uprv_strcpy(subKeyName, TZ_REGKEY); + name = &subKeyName[strlen(subKeyName)]; + uprv_strcat(subKeyName, winid); + + result = RegOpenKeyExA(HKEY_LOCAL_MACHINE, + subKeyName, + 0, + KEY_QUERY_VALUE, + hkey); + return result; +} + +static LONG getTZI(const char *winid, TZI *tzi) +{ + DWORD cbData = sizeof(TZI); + LONG result; + HKEY hkey; + + result = openTZRegKey(&hkey, winid); + + if (result == ERROR_SUCCESS) + { + result = RegQueryValueExA(hkey, + TZI_REGKEY, + NULL, + NULL, + (LPBYTE)tzi, + &cbData); + RegCloseKey(hkey); + } + + return result; +} + +static LONG getSTDName(const char *winid, char *regStdName, int32_t length) +{ + DWORD cbData = length; + LONG result; + HKEY hkey; + + result = openTZRegKey(&hkey, winid); + + if (result == ERROR_SUCCESS) + { + result = RegQueryValueExA(hkey, + STD_REGKEY, + NULL, + NULL, + (LPBYTE)regStdName, + &cbData); + RegCloseKey(hkey); + } + + return result; +} + +static LONG getTZKeyName(char* tzKeyName, int32_t length) +{ + HKEY hkey; + LONG result = FALSE; + DWORD cbData = length; + + if(ERROR_SUCCESS == RegOpenKeyExA( + HKEY_LOCAL_MACHINE, + CURRENT_ZONE_REGKEY, + 0, + KEY_QUERY_VALUE, + &hkey)) + { + result = RegQueryValueExA( + hkey, + "TimeZoneKeyName", + NULL, + NULL, + (LPBYTE)tzKeyName, + &cbData); + + RegCloseKey(hkey); + } + + return result; +} + +/* + This code attempts to detect the Windows time zone directly, + as set in the Windows Date and Time control panel. It attempts + to work on versions greater than Windows Vista and on localized + installs. It works by directly interrogating the registry and + comparing the data there with the data returned by the + GetTimeZoneInformation API, along with some other strategies. The + registry contains time zone data under this key: + + HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Time Zones\ + + Under this key are several subkeys, one for each time zone. For + example these subkeys are named "Pacific Standard Time" on Vista+. + There are some other wrinkles; see the code for + details. The subkey name is NOT LOCALIZED, allowing us to support + localized installs. + + Under the subkey are data values. We care about: + + Std Standard time display name, localized + TZI Binary block of data + + The TZI data is of particular interest. It contains the offset, two + more offsets for standard and daylight time, and the start and end + rules. This is the same data returned by the GetTimeZoneInformation + API. The API may modify the data on the way out, so we have to be + careful, but essentially we do a binary comparison against the TZI + blocks of various registry keys. When we find a match, we know what + time zone Windows is set to. Since the registry key is not + localized, we can then translate the key through a simple table + lookup into the corresponding ICU time zone. + + This strategy doesn't always work because there are zones which + share an offset and rules, so more than one TZI block will match. + For example, both Tokyo and Seoul are at GMT+9 with no DST rules; + their TZI blocks are identical. For these cases, we fall back to a + name lookup. We attempt to match the display name as stored in the + registry for the current zone to the display name stored in the + registry for various Windows zones. By comparing the registry data + directly we avoid conversion complications. + + Author: Alan Liu + Since: ICU 2.6 + Based on original code by Carl Brown +*/ + +/** + * Main Windows time zone detection function. Returns the Windows + * time zone, translated to an ICU time zone, or NULL upon failure. + */ +U_CFUNC const char* U_EXPORT2 +uprv_detectWindowsTimeZone() +{ + UErrorCode status = U_ZERO_ERROR; + UResourceBundle* bundle = NULL; + char* icuid = NULL; + char apiStdName[MAX_LENGTH_ID]; + char regStdName[MAX_LENGTH_ID]; + char tmpid[MAX_LENGTH_ID]; + int32_t len; + int id; + int errorCode; + wchar_t ISOcodeW[3]; /* 2 letter iso code in UTF-16*/ + char ISOcodeA[3]; /* 2 letter iso code in ansi */ + + LONG result; + TZI tziKey; + TZI tziReg; + TIME_ZONE_INFORMATION apiTZI; + + BOOL tryPreVistaFallback; + OSVERSIONINFO osVerInfo; + + /* Obtain TIME_ZONE_INFORMATION from the API, and then convert it + to TZI. We could also interrogate the registry directly; we do + this below if needed. */ + uprv_memset(&apiTZI, 0, sizeof(apiTZI)); + uprv_memset(&tziKey, 0, sizeof(tziKey)); + uprv_memset(&tziReg, 0, sizeof(tziReg)); + GetTimeZoneInformation(&apiTZI); + tziKey.bias = apiTZI.Bias; + uprv_memcpy((char *)&tziKey.standardDate, (char*)&apiTZI.StandardDate, + sizeof(apiTZI.StandardDate)); + uprv_memcpy((char *)&tziKey.daylightDate, (char*)&apiTZI.DaylightDate, + sizeof(apiTZI.DaylightDate)); + + /* Convert the wchar_t* standard name to char* */ + uprv_memset(apiStdName, 0, sizeof(apiStdName)); + wcstombs(apiStdName, apiTZI.StandardName, MAX_LENGTH_ID); + + tmpid[0] = 0; + + id = GetUserGeoID(GEOCLASS_NATION); + errorCode = GetGeoInfoW(id, GEO_ISO2, ISOcodeW, 3, 0); + u_strToUTF8(ISOcodeA, 3, NULL, (const UChar *)ISOcodeW, 3, &status); + + bundle = ures_openDirect(NULL, "windowsZones", &status); + ures_getByKey(bundle, "mapTimezones", bundle, &status); + + /* + Windows Vista+ provides us with a "TimeZoneKeyName" that is not localized + and can be used to directly map a name in our bundle. Try to use that first + if we're on Vista or higher + */ + uprv_memset(&osVerInfo, 0, sizeof(osVerInfo)); + osVerInfo.dwOSVersionInfoSize = sizeof(osVerInfo); + tryPreVistaFallback = TRUE; + result = getTZKeyName(regStdName, sizeof(regStdName)); + if(ERROR_SUCCESS == result) + { + UResourceBundle* winTZ = ures_getByKey(bundle, regStdName, NULL, &status); + if(U_SUCCESS(status)) + { + const UChar* icuTZ = NULL; + if (errorCode != 0) + { + icuTZ = ures_getStringByKey(winTZ, ISOcodeA, &len, &status); + } + if (errorCode==0 || icuTZ==NULL) + { + /* fallback to default "001" and reset status */ + status = U_ZERO_ERROR; + icuTZ = ures_getStringByKey(winTZ, "001", &len, &status); + } + + if(U_SUCCESS(status)) + { + int index=0; + while (! (*icuTZ == '\0' || *icuTZ ==' ')) + { + tmpid[index++]=(char)(*icuTZ++); /* safe to assume 'char' is ASCII compatible on windows */ + } + tmpid[index]='\0'; + tryPreVistaFallback = FALSE; + } + } + ures_close(winTZ); + } + + if(tryPreVistaFallback) + { + /* Note: We get the winid not from static tables but from resource bundle. */ + while (U_SUCCESS(status) && ures_hasNext(bundle)) + { + UBool idFound = FALSE; + const char* winid; + UResourceBundle* winTZ = ures_getNextResource(bundle, NULL, &status); + if (U_FAILURE(status)) + { + break; + } + winid = ures_getKey(winTZ); + result = getTZI(winid, &tziReg); + + if (result == ERROR_SUCCESS) + { + /* Windows alters the DaylightBias in some situations. + Using the bias and the rules suffices, so overwrite + these unreliable fields. */ + tziKey.standardBias = tziReg.standardBias; + tziKey.daylightBias = tziReg.daylightBias; + + if (uprv_memcmp((char *)&tziKey, (char*)&tziReg, sizeof(tziKey)) == 0) + { + const UChar* icuTZ = NULL; + if (errorCode != 0) + { + icuTZ = ures_getStringByKey(winTZ, ISOcodeA, &len, &status); + } + if (errorCode==0 || icuTZ==NULL) + { + /* fallback to default "001" and reset status */ + status = U_ZERO_ERROR; + icuTZ = ures_getStringByKey(winTZ, "001", &len, &status); + } + + if (U_SUCCESS(status)) + { + /* Get the standard name from the registry key to compare with + the one from Windows API call. */ + uprv_memset(regStdName, 0, sizeof(regStdName)); + result = getSTDName(winid, regStdName, sizeof(regStdName)); + if (result == ERROR_SUCCESS) + { + if (uprv_strcmp(apiStdName, regStdName) == 0) + { + idFound = TRUE; + } + } + + /* tmpid buffer holds the ICU timezone ID corresponding to the timezone ID from Windows. + * If none is found, tmpid buffer will contain a fallback ID (i.e. the time zone ID matching + * the current time zone information) + */ + if (idFound || tmpid[0] == 0) + { + /* if icuTZ has more than one city, take only the first (i.e. terminate icuTZ at first space) */ + int index=0; + while (! (*icuTZ == '\0' || *icuTZ ==' ')) + { + tmpid[index++]=(char)(*icuTZ++); /* safe to assume 'char' is ASCII compatible on windows */ + } + tmpid[index]='\0'; + } + } + } + } + ures_close(winTZ); + if (idFound) + { + break; + } + } + } + + /* + * Copy the timezone ID to icuid to be returned. + */ + if (tmpid[0] != 0) + { + len = uprv_strlen(tmpid); + icuid = (char*)uprv_calloc(len + 1, sizeof(char)); + if (icuid != NULL) + { + uprv_strcpy(icuid, tmpid); + } + } + + ures_close(bundle); + + return icuid; +} + +#endif /* U_PLATFORM_USES_ONLY_WIN32_API && (U_PLATFORM_HAS_WINUWP_API == 0) */ diff --git a/Build/source/libs/icu/icu-src/source/common/wintz.h b/Build/source/libs/icu/icu-src/source/common/wintz.h index dff7608900f..7be30eb4470 100644 --- a/Build/source/libs/icu/icu-src/source/common/wintz.h +++ b/Build/source/libs/icu/icu-src/source/common/wintz.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************** @@ -16,7 +16,9 @@ #include "unicode/utypes.h" -#if U_PLATFORM_USES_ONLY_WIN32_API +// This file contains only desktop windows behavior +// Windows UWP calls Windows::Globalization directly, so this isn't needed there. +#if U_PLATFORM_USES_ONLY_WIN32_API && (U_PLATFORM_HAS_WINUWP_API == 0) /** * \file @@ -31,6 +33,6 @@ U_CDECL_END U_CFUNC const char* U_EXPORT2 uprv_detectWindowsTimeZone(); -#endif /* U_PLATFORM_USES_ONLY_WIN32_API */ +#endif /* U_PLATFORM_USES_ONLY_WIN32_API && (U_PLATFORM_HAS_WINUWP_API == 0) */ #endif /* __WINTZ */ diff --git a/Build/source/libs/icu/icu-src/source/config/dist.mk b/Build/source/libs/icu/icu-src/source/config/dist.mk index 442782bf73e..ccc5837a76c 100644 --- a/Build/source/libs/icu/icu-src/source/config/dist.mk +++ b/Build/source/libs/icu/icu-src/source/config/dist.mk @@ -8,22 +8,23 @@ # This is to be called from ../Makefile.in # # This will only work if subversion is installed. +# You must checkout ICU4C at the `/icu` or `/icu/icu4c` level - not just `…/source` +# also note that `make dist` does NOT reflect any local modifications - it only does a fresh SVN export. top_builddir = . include $(top_builddir)/icudefs.mk - +DISTY_DIR=dist DISTY_TMP=dist/tmp DISTY_ICU=$(DISTY_TMP)/icu DISTY_DATA=$(DISTY_ICU)/source/data -DISTY_RMV=brkitr coll curr lang locales mappings rbnf region translit xml zone +DISTY_RMV=brkitr coll curr lang locales mappings rbnf region translit xml zone misc unit DISTY_RMDIR=$(DISTY_RMV:%=$(DISTY_DATA)/%) DISTY_IN=$(DISTY_DATA)/in DOCZIP=icu-docs.zip SVNTOP=$(top_srcdir)/.. -SVNDOT=$(SVNTOP)/.svn SVNVER=$(shell svnversion $(SVNTOP) | cut -d: -f1 | tr -cd 'a-zA-Z0-9') SVNURL=$(shell svn info $(SVNTOP) | grep '^URL:' | cut -d: -f2-) DISTY_VER=$(shell echo $(VERSION) | tr '.' '_' ) @@ -33,14 +34,12 @@ DISTY_FILE_TGZ=$(DISTY_FILE_DIR)/$(DISTY_PREFIX)-src-$(DISTY_VER)-r$(SVNVER).tgz DISTY_FILE_ZIP=$(DISTY_FILE_DIR)/$(DISTY_PREFIX)-src-$(DISTY_VER)-r$(SVNVER).zip DISTY_DOC_ZIP=$(DISTY_FILE_DIR)/$(DISTY_PREFIX)-docs-$(DISTY_VER)-r$(SVNVER).zip DISTY_DATA_ZIP=$(DISTY_FILE_DIR)/$(DISTY_PREFIX)-data-$(DISTY_VER)-r$(SVNVER).zip -DISTY_DAT=$(firstword $(wildcard data/out/tmp/icudt$(SO_TARGET_VERSION_MAJOR)*.dat)) +DISTY_DAT:=$(firstword $(wildcard data/out/tmp/icudt$(SO_TARGET_VERSION_MAJOR)*.dat)) DISTY_FILES_SRC=$(DISTY_FILE_TGZ) $(DISTY_FILE_ZIP) DISTY_FILES=$(DISTY_FILES_SRC) $(DISTY_DOC_ZIP) - -$(SVNDOT): - @echo "ERROR: 'dist' will not work unless the parent of the top_srcdir ( $(SVNTOP) ) is checked out from svn, and svn is installed." - false +# colon-equals because we watn to run this once! +EXCLUDES_FILE:=$(shell mktemp) $(DISTY_FILE_DIR): $(MKINSTALLDIRS) $(DISTY_FILE_DIR) @@ -48,30 +47,43 @@ $(DISTY_FILE_DIR): $(DISTY_TMP): $(MKINSTALLDIRS) $(DISTY_TMP) -$(DISTY_DOC_ZIP): $(SVNDOT) $(DOCZIP) $(DISTY_FILE_DIR) +$(DISTY_DOC_ZIP): $(DOCZIP) $(DISTY_FILE_DIR) cp $(DOCZIP) $(DISTY_DOC_ZIP) + ln -sf $(DISTY_DOC_ZIP) $(DISTY_FILE_DIR)/icu4c-docs.zip $(DISTY_DAT): echo Missing $@ /bin/false +# make sure we get the non-lgpl docs $(DOCZIP): - $(MAKE) -C . srcdir="$(srcdir)" top_srcdir="$(top_srcdir)" builddir=. $@ + -$(RMV) "$(top_builddir)"/doc + "$(MAKE)" -C . srcdir="$(srcdir)" top_srcdir="$(top_srcdir)" builddir=. $@ -$(DISTY_FILE_TGZ) $(DISTY_FILE_ZIP) $(DISTY_DATA_ZIP): $(SVNDOT) $(DISTY_DAT) $(DISTY_TMP) +$(DISTY_FILE_TGZ) $(DISTY_FILE_ZIP) $(DISTY_DATA_ZIP): $(DISTY_DAT) $(DISTY_TMP) @echo "svnversion of $(SVNTOP) is as follows (if this fails, make sure svn is installed..)" svnversion $(SVNTOP) -$(RMV) $(DISTY_FILE) $(DISTY_TMP) $(MKINSTALLDIRS) $(DISTY_TMP) - svn export -r $(shell echo $(SVNVER) | tr -d 'a-zA-Z' ) $(SVNURL) "$(DISTY_TMP)/icu" + @echo collecting excludes to $(EXCLUDES_FILE) + (cd "$(SVNTOP)" ; svn status --no-ignore | grep '^I' | cut -c2- > "$(EXCLUDES_FILE)" ) + @echo pseudo-exporting $(SVNVER) + @#svn export -r $(shell echo $(SVNVER) | tr -d 'a-zA-Z' ) $(SVNURL) "$(DISTY_TMP)/icu" + rsync -a --exclude-from="$(EXCLUDES_FILE)" "$(SVNTOP)" "$(DISTY_TMP)/icu" ( cd $(DISTY_TMP)/icu/source ; zip -rlq $(DISTY_DATA_ZIP) data ) - $(RMV) $(DISTY_RMDIR) $(MKINSTALLDIRS) $(DISTY_IN) + echo DISTY_DAT=$(DISTY_DAT) cp $(DISTY_DAT) $(DISTY_IN) ( cd $(DISTY_TMP)/icu ; python as_is/bomlist.py > as_is/bomlist.txt || rm -f as_is/bomlist.txt ) - ( cd $(DISTY_TMP) ; tar cfpz $(DISTY_FILE_TGZ) icu ) ( cd $(DISTY_TMP) ; zip -rlq $(DISTY_FILE_ZIP) icu ) - ls -l $(DISTY_FILE) + $(RMV) $(DISTY_RMDIR) + ( cd $(DISTY_TMP)/icu ; python as_is/bomlist.py > as_is/bomlist.txt || rm -f as_is/bomlist.txt ) + ( cd $(DISTY_TMP) ; tar cfpz $(DISTY_FILE_TGZ) icu ) + ln -sf $(DISTY_FILE_ZIP) $(DISTY_FILE_DIR)/icu4c-src.zip + ln -sf $(DISTY_FILE_TGZ) $(DISTY_FILE_DIR)/icu4c-src.tgz + ln -sf $(DISTY_DATA_ZIP) $(DISTY_FILE_DIR)/icu4c-data.zip + ls -l $(DISTY_FILE_TGZ) $(DISTY_FILE_ZIP) $(DISTY_DATA_ZIP) + dist-local: $(DISTY_FILES) diff --git a/Build/source/libs/icu/icu-src/source/config/make2sh.sed b/Build/source/libs/icu/icu-src/source/config/make2sh.sed index df53e4e520c..0f488bae8d6 100644 --- a/Build/source/libs/icu/icu-src/source/config/make2sh.sed +++ b/Build/source/libs/icu/icu-src/source/config/make2sh.sed @@ -4,6 +4,7 @@ s%^\([a-zA-Z0-9\._-]*\)[ ]*+=%\1=$(\1) % s%^[A-Z]*_SO_TARG*%## &% s%^SHARED_OBJECT.*%## &% +s@^_%.*@## &@ s%^LD_SONAME.*%## &% s%$(\([^\)]*\))%${\1}%g s%^ %#M# % diff --git a/Build/source/libs/icu/icu-src/source/config/mh-aix-va b/Build/source/libs/icu/icu-src/source/config/mh-aix-va index e1b423658d4..1572466a550 100644 --- a/Build/source/libs/icu/icu-src/source/config/mh-aix-va +++ b/Build/source/libs/icu/icu-src/source/config/mh-aix-va @@ -13,8 +13,8 @@ GEN_DEPS.cc= $(CXX) -E -M $(DEFS) $(CPPFLAGS) # This helps in the data library, # -qproto assumes all functions are prototyped (for optimization) # -qrtti turns on compiler RTTI, required beginning with ICU 4.6 -CFLAGS += -qproto -qroconst -CXXFLAGS += -qproto -qroconst -qrtti +CFLAGS += -qproto -qroconst -qlanglvl=extended +CXXFLAGS += -qproto -qroconst -qrtti -qlanglvl=extended0x # If you readd this line, you must change the SO value #LDFLAGS += -brtl @@ -111,11 +111,31 @@ $(LIBDIR)/%.a : %.so %.o: $(srcdir)/%.c $(COMPILE.c) $(DYNAMICCPPFLAGS) $(DYNAMICCFLAGS) -o $@ $< -%.$(STATIC_O): $(srcdir)/%.cpp - $(COMPILE.cc) $(STATICCPPFLAGS) $(STATICCXXFLAGS) -o $@ $< + +## C++ compilation rules. + +# This causes escapesrc to be built before other ICU targets. +NEED_ESCAPING=YES + +ifneq ($(SKIP_ESCAPING),) +# no escaping - bootstrap %.o: $(srcdir)/%.cpp $(COMPILE.cc) $(DYNAMICCPPFLAGS) $(DYNAMICCXXFLAGS) -o $@ $< +else +# convert *.cpp files to _*.cpp with \u / \U escaping +CLEANFILES += _*.cpp +# the actual escaping +_%.cpp: $(srcdir)/%.cpp + @$(BINDIR)/escapesrc$(EXEEXT) $< $@ + +# compilation for static obj +%.$(STATIC_O): _%.cpp + $(COMPILE.cc) $(STATICCPPFLAGS) $(STATICCXXFLAGS) -o $@ $< +# compilation for dynamic obj +%.o: _%.cpp + $(COMPILE.cc) $(DYNAMICCPPFLAGS) $(DYNAMICCXXFLAGS) -o $@ $< +endif ## Dependency rules %.d : %.u diff --git a/Build/source/libs/icu/icu-src/source/config/mh-cygwin b/Build/source/libs/icu/icu-src/source/config/mh-cygwin index 1cc2d74c37a..c5a37179cab 100644 --- a/Build/source/libs/icu/icu-src/source/config/mh-cygwin +++ b/Build/source/libs/icu/icu-src/source/config/mh-cygwin @@ -7,7 +7,7 @@ ## Commands to generate dependency files GEN_DEPS.c= $(CC) -E -MM $(DEFS) $(CPPFLAGS) -GEN_DEPS.cc= $(CXX) -E -MM $(DEFS) $(CPPFLAGS) +GEN_DEPS.cc= $(CXX) -E -MM -std=c++11 $(DEFS) $(CPPFLAGS) ## Flags to create/use a static library ifneq ($(ENABLE_SHARED),YES) diff --git a/Build/source/libs/icu/icu-src/source/config/mh-cygwin-msvc b/Build/source/libs/icu/icu-src/source/config/mh-cygwin-msvc index 01003acfd92..4744bb949e3 100644 --- a/Build/source/libs/icu/icu-src/source/config/mh-cygwin-msvc +++ b/Build/source/libs/icu/icu-src/source/config/mh-cygwin-msvc @@ -47,8 +47,9 @@ endif # /EHsc enables exception handling # /Zc:wchar_t makes wchar_t a native type. Required for C++ ABI compatibility. # -D_CRT_SECURE_NO_DEPRECATE is needed to quiet warnings about using standard C functions. -CFLAGS+=-GF -nologo -CXXFLAGS+=-GF -nologo -EHsc -Zc:wchar_t +# -utf-8 set source file encoding to utf-8. +CFLAGS+=-GF -nologo -utf-8 +CXXFLAGS+=-GF -nologo -EHsc -Zc:wchar_t -utf-8 CPPFLAGS+=-D_CRT_SECURE_NO_DEPRECATE DEFS+=-DWIN32 -DCYGWINMSVC LDFLAGS+=-nologo diff --git a/Build/source/libs/icu/icu-src/source/config/mh-cygwin64 b/Build/source/libs/icu/icu-src/source/config/mh-cygwin64 index 0af0c88a903..dc9d1a1ab01 100644 --- a/Build/source/libs/icu/icu-src/source/config/mh-cygwin64 +++ b/Build/source/libs/icu/icu-src/source/config/mh-cygwin64 @@ -7,7 +7,7 @@ ## Commands to generate dependency files GEN_DEPS.c= $(CC) -E -MM $(DEFS) $(CPPFLAGS) -GEN_DEPS.cc= $(CXX) -E -MM $(DEFS) $(CPPFLAGS) +GEN_DEPS.cc= $(CXX) -E -MM -std=c++11 $(DEFS) $(CPPFLAGS) ## Flags to create/use a static library ifneq ($(ENABLE_SHARED),YES) diff --git a/Build/source/libs/icu/icu-src/source/config/mh-mingw b/Build/source/libs/icu/icu-src/source/config/mh-mingw index ddad1908899..ae966586fbd 100644 --- a/Build/source/libs/icu/icu-src/source/config/mh-mingw +++ b/Build/source/libs/icu/icu-src/source/config/mh-mingw @@ -28,6 +28,10 @@ else STATICCPPFLAGS = -DU_STATIC_IMPLEMENTATION endif +## ICU requires a minimum target of Windows 7, and MinGW does not set this by default. +## https://msdn.microsoft.com/en-us/library/aa383745.aspx +CPPFLAGS += -DWINVER=0x0601 -D_WIN32_WINNT=0x0601 + ## Flags for position independent code SHAREDLIBCFLAGS = SHAREDLIBCXXFLAGS = diff --git a/Build/source/libs/icu/icu-src/source/config/mh-mingw64 b/Build/source/libs/icu/icu-src/source/config/mh-mingw64 index 188d2aa7482..6d0c5575329 100644 --- a/Build/source/libs/icu/icu-src/source/config/mh-mingw64 +++ b/Build/source/libs/icu/icu-src/source/config/mh-mingw64 @@ -28,6 +28,10 @@ else STATICCPPFLAGS = -DU_STATIC_IMPLEMENTATION endif +## ICU requires a minimum target of Windows 7, and MinGW does not set this by default. +## https://msdn.microsoft.com/en-us/library/aa383745.aspx +CPPFLAGS += -DWINVER=0x0601 -D_WIN32_WINNT=0x0601 + ## Flags for position independent code SHAREDLIBCFLAGS = SHAREDLIBCXXFLAGS = diff --git a/Build/source/libs/icu/icu-src/source/config/mh-msys-msvc b/Build/source/libs/icu/icu-src/source/config/mh-msys-msvc index 6b57c26927e..05fe514ac7b 100644 --- a/Build/source/libs/icu/icu-src/source/config/mh-msys-msvc +++ b/Build/source/libs/icu/icu-src/source/config/mh-msys-msvc @@ -52,8 +52,9 @@ endif # -EHsc enables exception handling # -Zc:wchar_t makes wchar_t a native type. Required for C++ ABI compatibility. # -D_CRT_SECURE_NO_DEPRECATE is needed to quiet warnings about using standard C functions. -CFLAGS+=-GF -nologo -CXXFLAGS+=-GF -nologo -EHsc -Zc:wchar_t +# -utf-8 set source file encoding to utf-8. +CFLAGS+=-GF -nologo -utf-8 +CXXFLAGS+=-GF -nologo -EHsc -Zc:wchar_t -utf-8 CPPFLAGS+=-D_CRT_SECURE_NO_DEPRECATE DEFS+=-DWIN32 -DCYGWINMSVC LDFLAGS+=-nologo diff --git a/Build/source/libs/icu/icu-src/source/config/mh-os390 b/Build/source/libs/icu/icu-src/source/config/mh-os390 index dbc3a3a5a7a..9bd3f9bf4c9 100644 --- a/Build/source/libs/icu/icu-src/source/config/mh-os390 +++ b/Build/source/libs/icu/icu-src/source/config/mh-os390 @@ -69,7 +69,7 @@ SHAREDLIBCXXFLAGS = -Wc,expo # NOCSECT might be used as an optimization option. # -+ means accept any file extension as a C++ file. By default only .C is accepted. CFLAGS += -Wc,DLL,ROS,RENT,'ARCH(7)','LOC(POSIX)',NOANSIALIAS,'LANGLVL(EXTENDED)' $(ICU_IEEE) -CXXFLAGS += -Wc,DLL,ROS,RTTI,'ARCH(7)','LOC(POSIX)',NOANSIALIAS,'LANGLVL(EXTENDED)' $(ICU_IEEE) -+ +CXXFLAGS += -Wc,DLL,ROS,RTTI,'ARCH(7)','LOC(POSIX)',NOANSIALIAS,'LANGLVL(EXTENDED0X)' $(ICU_IEEE) -+ ARFLAGS = -cr # _MSE_PROTOS usually interacts with _XOPEN_SOURCE. It affects some standard @@ -208,10 +208,27 @@ endif %.o: $(srcdir)/%.c $(COMPILE.c) $(DYNAMICCPPFLAGS) $(DYNAMICCFLAGS) -o $@ $< +# This causes escapesrc to be built before other ICU targets. +NEED_ESCAPING=YES + +ifneq ($(SKIP_ESCAPING),) %.$(STATIC_O): $(srcdir)/%.cpp $(COMPILE.cc) $(STATICCPPFLAGS) $(STATICCXXFLAGS) -o $@ $< %.o: $(srcdir)/%.cpp $(COMPILE.cc) $(DYNAMICCPPFLAGS) $(DYNAMICCXXFLAGS) -o $@ $< +else +# convert *.cpp files to _*.cpp with \u / \U escaping +CLEANFILES += _*.cpp + +# the actual escaping +_%.cpp: $(srcdir)/%.cpp + @$(BINDIR)/escapesrc$(EXEEXT) $< $@ + +%.$(STATIC_O): _%.cpp + $(COMPILE.cc) $(STATICCPPFLAGS) $(STATICCXXFLAGS) -o $@ $< +%.o: _%.cpp + $(COMPILE.cc) $(DYNAMICCPPFLAGS) $(DYNAMICCXXFLAGS) -o $@ $< +endif ## Dependency rules %.d : %.u diff --git a/Build/source/libs/icu/icu-src/source/config/mh-solaris b/Build/source/libs/icu/icu-src/source/config/mh-solaris index 469b2100f7a..e1d4ccf900f 100644 --- a/Build/source/libs/icu/icu-src/source/config/mh-solaris +++ b/Build/source/libs/icu/icu-src/source/config/mh-solaris @@ -5,6 +5,10 @@ ## Copyright (c) 1999-2010, International Business Machines Corporation and ## others. All Rights Reserved. +## Flags for ICU 59+ +CXXFLAGS += -std=c++11 +CFLAGS += -std=c99 + ## Flags for position independent code SHAREDLIBCFLAGS = -KPIC SHAREDLIBCXXFLAGS = -KPIC @@ -59,17 +63,34 @@ SO= so ## Non-shared intermediate object suffix STATIC_O = o +# This causes escapesrc to be built before other ICU targets. +NEED_ESCAPING=YES + ## Compilation rules %.$(STATIC_O): $(srcdir)/%.c $(COMPILE.c) $(STATICCPPFLAGS) $(STATICCFLAGS) -o $@ $< %.o: $(srcdir)/%.c $(COMPILE.c) $(DYNAMICCPPFLAGS) $(DYNAMICCFLAGS) -o $@ $< -%.$(STATIC_O): $(srcdir)/%.cpp - $(COMPILE.cc) $(STATICCPPFLAGS) $(STATICCXXFLAGS) -o $@ $< +ifneq ($(SKIP_ESCAPING),) %.o: $(srcdir)/%.cpp $(COMPILE.cc) $(DYNAMICCPPFLAGS) $(DYNAMICCXXFLAGS) -o $@ $< +%.$(STATIC_O): $(srcdir)/%.cpp + $(COMPILE.cc) $(STATICCPPFLAGS) $(STATICCXXFLAGS) -o $@ $< +else +# convert *.cpp files to _*.cpp with \u / \U escaping +CLEANFILES += _*.cpp + +# the actual escaping +_%.cpp: $(srcdir)/%.cpp + @$(BINDIR)/escapesrc$(EXEEXT) $< $@ +# no escaping - bootstrap +%.$(STATIC_O): _%.cpp + $(COMPILE.cc) $(STATICCPPFLAGS) $(STATICCXXFLAGS) -o $@ $< +%.o: _%.cpp + $(COMPILE.cc) $(DYNAMICCPPFLAGS) $(DYNAMICCXXFLAGS) -o $@ $< +endif ## Dependency rules %.d : $(srcdir)/%.c diff --git a/Build/source/libs/icu/icu-src/source/configure b/Build/source/libs/icu/icu-src/source/configure index 5056265b87a..4ba9f5d982d 100755 --- a/Build/source/libs/icu/icu-src/source/configure +++ b/Build/source/libs/icu/icu-src/source/configure @@ -1,6 +1,6 @@ #! /bin/sh # Guess values for system-dependent variables and create Makefiles. -# Generated by GNU Autoconf 2.69 for ICU 58.1. +# Generated by GNU Autoconf 2.69 for ICU 60.1. # # Report bugs to . # @@ -582,8 +582,8 @@ MAKEFLAGS= # Identity of this package. PACKAGE_NAME='ICU' PACKAGE_TARNAME='International Components for Unicode' -PACKAGE_VERSION='58.1' -PACKAGE_STRING='ICU 58.1' +PACKAGE_VERSION='60.1' +PACKAGE_STRING='ICU 60.1' PACKAGE_BUGREPORT='http://icu-project.org/bugs' PACKAGE_URL='http://icu-project.org' @@ -674,7 +674,6 @@ GENCCODE_ASSEMBLY HAVE_MMAP LIB_THREAD U_HAVE_ATOMIC -U_HAVE_STD_STRING ENABLE_RPATH U_ENABLE_DYLOAD U_HAVE_PLUGINS @@ -682,6 +681,7 @@ PLUGINS_TRUE U_ENABLE_TRACING U_DISABLE_RENAMING AR +SED RANLIB U_DEFAULT_SHOW_DRAFT UCLN_NO_AUTO_CLEANUP @@ -752,6 +752,7 @@ infodir docdir oldincludedir includedir +runstatedir localstatedir sharedstatedir sysconfdir @@ -855,6 +856,7 @@ datadir='${datarootdir}' sysconfdir='${prefix}/etc' sharedstatedir='${prefix}/com' localstatedir='${prefix}/var' +runstatedir='${localstatedir}/run' includedir='${prefix}/include' oldincludedir='/usr/include' docdir='${datarootdir}/doc/${PACKAGE_TARNAME}' @@ -1107,6 +1109,15 @@ do | -silent | --silent | --silen | --sile | --sil) silent=yes ;; + -runstatedir | --runstatedir | --runstatedi | --runstated \ + | --runstate | --runstat | --runsta | --runst | --runs \ + | --run | --ru | --r) + ac_prev=runstatedir ;; + -runstatedir=* | --runstatedir=* | --runstatedi=* | --runstated=* \ + | --runstate=* | --runstat=* | --runsta=* | --runst=* | --runs=* \ + | --run=* | --ru=* | --r=*) + runstatedir=$ac_optarg ;; + -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) ac_prev=sbindir ;; -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ @@ -1244,7 +1255,7 @@ fi for ac_var in exec_prefix prefix bindir sbindir libexecdir datarootdir \ datadir sysconfdir sharedstatedir localstatedir includedir \ oldincludedir docdir infodir htmldir dvidir pdfdir psdir \ - libdir localedir mandir + libdir localedir mandir runstatedir do eval ac_val=\$$ac_var # Remove trailing slashes. @@ -1357,7 +1368,7 @@ if test "$ac_init_help" = "long"; then # Omit some internal or obsolete options to make the list less imposing. # This message is too long to be a string in the A/UX 3.1 sh. cat <<_ACEOF -\`configure' configures ICU 58.1 to adapt to many kinds of systems. +\`configure' configures ICU 60.1 to adapt to many kinds of systems. Usage: $0 [OPTION]... [VAR=VALUE]... @@ -1397,6 +1408,7 @@ Fine tuning of the installation directories: --sysconfdir=DIR read-only single-machine data [PREFIX/etc] --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com] --localstatedir=DIR modifiable single-machine data [PREFIX/var] + --runstatedir=DIR modifiable per-process data [LOCALSTATEDIR/run] --libdir=DIR object code libraries [EPREFIX/lib] --includedir=DIR C header files [PREFIX/include] --oldincludedir=DIR C header files for non-gcc [/usr/include] @@ -1423,7 +1435,7 @@ fi if test -n "$ac_init_help"; then case $ac_init_help in - short | recursive ) echo "Configuration of ICU 58.1:";; + short | recursive ) echo "Configuration of ICU 60.1:";; esac cat <<\_ACEOF @@ -1559,7 +1571,7 @@ fi test -n "$ac_init_help" && exit $ac_status if $ac_init_version; then cat <<\_ACEOF -ICU configure 58.1 +ICU configure 60.1 generated by GNU Autoconf 2.69 Copyright (C) 2012 Free Software Foundation, Inc. @@ -2251,7 +2263,7 @@ cat >config.log <<_ACEOF This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake. -It was created by ICU $as_me 58.1, which was +It was created by ICU $as_me 60.1, which was generated by GNU Autoconf 2.69. Invocation command line was $ $0 $@ @@ -5464,7 +5476,7 @@ fi $as_echo "$enabled" >&6; } # Make sure that we can use draft API in ICU. if test "$U_DEFAULT_SHOW_DRAFT" = 0; then - CONFIG_CPPFLAGS="$CONFIG_CPPFLAGS -DU_SHOW_DRAFT_API" + CONFIG_CPPFLAGS="$CONFIG_CPPFLAGS -DU_SHOW_DRAFT_API -DU_SHOW_INTERNAL_API" fi @@ -5561,6 +5573,77 @@ else fi +# need sed +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a sed that does not truncate output" >&5 +$as_echo_n "checking for a sed that does not truncate output... " >&6; } +if ${ac_cv_path_SED+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_script=s/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb/ + for ac_i in 1 2 3 4 5 6 7; do + ac_script="$ac_script$as_nl$ac_script" + done + echo "$ac_script" 2>/dev/null | sed 99q >conftest.sed + { ac_script=; unset ac_script;} + if test -z "$SED"; then + ac_path_SED_found=false + # Loop through the user's path and test for each of PROGNAME-LIST + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_prog in sed gsed; do + for ac_exec_ext in '' $ac_executable_extensions; do + ac_path_SED="$as_dir/$ac_prog$ac_exec_ext" + as_fn_executable_p "$ac_path_SED" || continue +# Check for GNU ac_path_SED and select it if it is found. + # Check for GNU $ac_path_SED +case `"$ac_path_SED" --version 2>&1` in +*GNU*) + ac_cv_path_SED="$ac_path_SED" ac_path_SED_found=:;; +*) + ac_count=0 + $as_echo_n 0123456789 >"conftest.in" + while : + do + cat "conftest.in" "conftest.in" >"conftest.tmp" + mv "conftest.tmp" "conftest.in" + cp "conftest.in" "conftest.nl" + $as_echo '' >> "conftest.nl" + "$ac_path_SED" -f conftest.sed < "conftest.nl" >"conftest.out" 2>/dev/null || break + diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break + as_fn_arith $ac_count + 1 && ac_count=$as_val + if test $ac_count -gt ${ac_path_SED_max-0}; then + # Best one so far, save it but keep looking for a better one + ac_cv_path_SED="$ac_path_SED" + ac_path_SED_max=$ac_count + fi + # 10*(2^10) chars as input seems more than enough + test $ac_count -gt 10 && break + done + rm -f conftest.in conftest.tmp conftest.nl conftest.out;; +esac + + $ac_path_SED_found && break 3 + done + done + done +IFS=$as_save_IFS + if test -z "$ac_cv_path_SED"; then + as_fn_error $? "no acceptable sed could be found in \$PATH" "$LINENO" 5 + fi +else + ac_cv_path_SED=$SED +fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_SED" >&5 +$as_echo "$ac_cv_path_SED" >&6; } + SED="$ac_cv_path_SED" + rm -f conftest.sed + + # look for 'ar' the proper way if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}ar", so it can be a program name with args. @@ -5917,11 +6000,11 @@ $as_echo "no" >&6; } fi if [ "$GXX" = yes ]; then - # if CXXFLAGS does not have a "-std=" setting, set it now to -std=c++0x, + # if CXXFLAGS does not have a "-std=" setting, set it now to -std=c++11, # and check that the compiler still works. if ! echo "$CXXFLAGS" | grep '\-std=' >/dev/null 2>&1; then OLD_CXXFLAGS="${CXXFLAGS}" - CXXFLAGS="$CXXFLAGS --std=c++0x" + CXXFLAGS="$CXXFLAGS -std=c++11" { $as_echo "$as_me:${as_lineno-$LINENO}: checking if we have a C++11 compiler" >&5 $as_echo_n "checking if we have a C++11 compiler... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext @@ -5944,9 +6027,9 @@ rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $cxx11_okay" >&5 $as_echo "$cxx11_okay" >&6; } if [ $cxx11_okay = yes ]; then - { $as_echo "$as_me:${as_lineno-$LINENO}: Adding CXXFLAGS option --std=c++0x" >&5 -$as_echo "$as_me: Adding CXXFLAGS option --std=c++0x" >&6;} - UCONFIG_CXXFLAGS="${UCONFIG_CXXFLAGS} --std=c++0x" + { $as_echo "$as_me:${as_lineno-$LINENO}: Adding CXXFLAGS option -std=c++11" >&5 +$as_echo "$as_me: Adding CXXFLAGS option -std=c++11" >&6;} + UCONFIG_CXXFLAGS="${UCONFIG_CXXFLAGS} -std=c++11" else CXXFLAGS="$OLD_CXXFLAGS" fi @@ -5958,37 +6041,6 @@ $as_echo "$as_me: Adding CXXFLAGS option --std=c++0x" >&6;} fi fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if #include works" >&5 -$as_echo_n "checking if #include works... " >&6; } -cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include -int -main () -{ - - ; - return 0; -} -_ACEOF -if ac_fn_cxx_try_compile "$LINENO"; then : - ac_cv_header_stdstring=yes -else - ac_cv_header_stdstring=no -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdstring" >&5 -$as_echo "$ac_cv_header_stdstring" >&6; } -if test $ac_cv_header_stdstring = yes -then - U_HAVE_STD_STRING=1 -else - U_HAVE_STD_STRING=0 - CONFIG_CPPFLAGS="${CONFIG_CPPFLAGS} -DU_HAVE_STD_STRING=0" -fi - - - { $as_echo "$as_me:${as_lineno-$LINENO}: checking if #include works" >&5 $as_echo_n "checking if #include works... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext @@ -7053,11 +7105,23 @@ fi if test x$ac_cv_func_strtod_l = xyes then - CONFIG_CPPFLAGS="${CONFIG_CPPFLAGS} -DU_HAVE_STRTOD_L=1" - U_HAVE_STRTOD_L=1 + U_HAVE_STRTOD_L=1 + ac_fn_c_check_header_mongrel "$LINENO" "xlocale.h" "ac_cv_header_xlocale_h" "$ac_includes_default" +if test "x$ac_cv_header_xlocale_h" = xyes; then : + +fi + + + if test "$ac_cv_header_xlocale_h" = yes; then + U_HAVE_XLOCALE_H=1 + CONFIG_CPPFLAGS="${CONFIG_CPPFLAGS} -DU_HAVE_STRTOD_L=1 -DU_HAVE_XLOCALE_H=1" + else + U_HAVE_XLOCALE_H=0 + CONFIG_CPPFLAGS="${CONFIG_CPPFLAGS} -DU_HAVE_STRTOD_L=1 -DU_HAVE_XLOCALE_H=0" + fi else - CONFIG_CPPFLAGS="${CONFIG_CPPFLAGS} -DU_HAVE_STRTOD_L=0" - U_HAVE_STRTOD_L=0 + CONFIG_CPPFLAGS="${CONFIG_CPPFLAGS} -DU_HAVE_STRTOD_L=0" + U_HAVE_STRTOD_L=0 fi @@ -7800,7 +7864,7 @@ echo "CXXFLAGS=$CXXFLAGS" # output the Makefiles -ac_config_files="$ac_config_files icudefs.mk Makefile data/pkgdataMakefile config/Makefile.inc config/icu.pc config/pkgdataMakefile data/Makefile stubdata/Makefile common/Makefile i18n/Makefile layoutex/Makefile io/Makefile extra/Makefile extra/uconv/Makefile extra/uconv/pkgdataMakefile extra/scrptrun/Makefile tools/Makefile tools/ctestfw/Makefile tools/toolutil/Makefile tools/makeconv/Makefile tools/genrb/Makefile tools/genccode/Makefile tools/gencmn/Makefile tools/gencnval/Makefile tools/gendict/Makefile tools/gentest/Makefile tools/gennorm2/Makefile tools/genbrk/Makefile tools/gensprep/Makefile tools/icuinfo/Makefile tools/icupkg/Makefile tools/icuswap/Makefile tools/pkgdata/Makefile tools/tzcode/Makefile tools/gencfu/Makefile test/Makefile test/compat/Makefile test/testdata/Makefile test/testdata/pkgdataMakefile test/hdrtst/Makefile test/intltest/Makefile test/cintltst/Makefile test/iotest/Makefile test/letest/Makefile test/perf/Makefile test/perf/collationperf/Makefile test/perf/collperf/Makefile test/perf/collperf2/Makefile test/perf/dicttrieperf/Makefile test/perf/ubrkperf/Makefile test/perf/charperf/Makefile test/perf/convperf/Makefile test/perf/normperf/Makefile test/perf/DateFmtPerf/Makefile test/perf/howExpensiveIs/Makefile test/perf/strsrchperf/Makefile test/perf/unisetperf/Makefile test/perf/usetperf/Makefile test/perf/ustrperf/Makefile test/perf/utfperf/Makefile test/perf/utrie2perf/Makefile test/perf/leperf/Makefile samples/Makefile samples/date/Makefile samples/cal/Makefile samples/layout/Makefile" +ac_config_files="$ac_config_files icudefs.mk Makefile data/pkgdataMakefile config/Makefile.inc config/icu.pc config/pkgdataMakefile data/Makefile stubdata/Makefile common/Makefile i18n/Makefile layoutex/Makefile io/Makefile extra/Makefile extra/uconv/Makefile extra/uconv/pkgdataMakefile extra/scrptrun/Makefile tools/Makefile tools/ctestfw/Makefile tools/toolutil/Makefile tools/makeconv/Makefile tools/genrb/Makefile tools/genccode/Makefile tools/gencmn/Makefile tools/gencnval/Makefile tools/gendict/Makefile tools/gentest/Makefile tools/gennorm2/Makefile tools/genbrk/Makefile tools/gensprep/Makefile tools/icuinfo/Makefile tools/icupkg/Makefile tools/icuswap/Makefile tools/pkgdata/Makefile tools/tzcode/Makefile tools/gencfu/Makefile tools/escapesrc/Makefile test/Makefile test/compat/Makefile test/testdata/Makefile test/testdata/pkgdataMakefile test/hdrtst/Makefile test/intltest/Makefile test/cintltst/Makefile test/iotest/Makefile test/letest/Makefile test/perf/Makefile test/perf/collationperf/Makefile test/perf/collperf/Makefile test/perf/collperf2/Makefile test/perf/dicttrieperf/Makefile test/perf/ubrkperf/Makefile test/perf/charperf/Makefile test/perf/convperf/Makefile test/perf/normperf/Makefile test/perf/DateFmtPerf/Makefile test/perf/howExpensiveIs/Makefile test/perf/strsrchperf/Makefile test/perf/unisetperf/Makefile test/perf/usetperf/Makefile test/perf/ustrperf/Makefile test/perf/utfperf/Makefile test/perf/utrie2perf/Makefile test/perf/leperf/Makefile samples/Makefile samples/date/Makefile samples/cal/Makefile samples/layout/Makefile" cat >confcache <<\_ACEOF # This file is a shell script that caches the results of configure @@ -8345,7 +8409,7 @@ cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # report actual input values of CONFIG_FILES etc. instead of their # values after options handling. ac_log=" -This file was extended by ICU $as_me 58.1, which was +This file was extended by ICU $as_me 60.1, which was generated by GNU Autoconf 2.69. Invocation command line was CONFIG_FILES = $CONFIG_FILES @@ -8399,7 +8463,7 @@ _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" ac_cs_version="\\ -ICU config.status 58.1 +ICU config.status 60.1 configured by $0, generated by GNU Autoconf 2.69, with options \\"\$ac_cs_config\\" @@ -8545,6 +8609,7 @@ do "tools/pkgdata/Makefile") CONFIG_FILES="$CONFIG_FILES tools/pkgdata/Makefile" ;; "tools/tzcode/Makefile") CONFIG_FILES="$CONFIG_FILES tools/tzcode/Makefile" ;; "tools/gencfu/Makefile") CONFIG_FILES="$CONFIG_FILES tools/gencfu/Makefile" ;; + "tools/escapesrc/Makefile") CONFIG_FILES="$CONFIG_FILES tools/escapesrc/Makefile" ;; "test/Makefile") CONFIG_FILES="$CONFIG_FILES test/Makefile" ;; "test/compat/Makefile") CONFIG_FILES="$CONFIG_FILES test/compat/Makefile" ;; "test/testdata/Makefile") CONFIG_FILES="$CONFIG_FILES test/testdata/Makefile" ;; diff --git a/Build/source/libs/icu/icu-src/source/configure.ac b/Build/source/libs/icu/icu-src/source/configure.ac index c07e75d0fd5..9822a060db7 100644 --- a/Build/source/libs/icu/icu-src/source/configure.ac +++ b/Build/source/libs/icu/icu-src/source/configure.ac @@ -365,12 +365,15 @@ AC_ARG_ENABLE(draft, AC_MSG_RESULT($enabled) # Make sure that we can use draft API in ICU. if test "$U_DEFAULT_SHOW_DRAFT" = 0; then - CONFIG_CPPFLAGS="$CONFIG_CPPFLAGS -DU_SHOW_DRAFT_API" + CONFIG_CPPFLAGS="$CONFIG_CPPFLAGS -DU_SHOW_DRAFT_API -DU_SHOW_INTERNAL_API" fi AC_SUBST(U_DEFAULT_SHOW_DRAFT) AC_PROG_RANLIB +# need sed +AC_PROG_SED + # look for 'ar' the proper way AC_CHECK_TOOL(AR, ar, false) @@ -492,17 +495,17 @@ else fi if [[ "$GXX" = yes ]]; then - # if CXXFLAGS does not have a "-std=" setting, set it now to -std=c++0x, + # if CXXFLAGS does not have a "-std=" setting, set it now to -std=c++11, # and check that the compiler still works. if ! echo "$CXXFLAGS" | grep '\-std=' >/dev/null 2>&1; then OLD_CXXFLAGS="${CXXFLAGS}" - CXXFLAGS="$CXXFLAGS --std=c++0x" + CXXFLAGS="$CXXFLAGS -std=c++11" AC_MSG_CHECKING([[if we have a C++11 compiler]]) AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[]],[[]])],[cxx11_okay=yes],[cxx11_okay=no]) AC_MSG_RESULT($cxx11_okay) if [[ $cxx11_okay = yes ]]; then - AC_MSG_NOTICE([Adding CXXFLAGS option --std=c++0x]) - UCONFIG_CXXFLAGS="${UCONFIG_CXXFLAGS} --std=c++0x" + AC_MSG_NOTICE([Adding CXXFLAGS option -std=c++11]) + UCONFIG_CXXFLAGS="${UCONFIG_CXXFLAGS} -std=c++11" else CXXFLAGS="$OLD_CXXFLAGS" fi @@ -514,19 +517,6 @@ if [[ "$GXX" = yes ]]; then fi fi -AC_MSG_CHECKING([[if #include works]]) -AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#include ]], [[]])], [ac_cv_header_stdstring=yes], [ac_cv_header_stdstring=no]) -AC_MSG_RESULT($ac_cv_header_stdstring) -if test $ac_cv_header_stdstring = yes -then - U_HAVE_STD_STRING=1 -else - U_HAVE_STD_STRING=0 - CONFIG_CPPFLAGS="${CONFIG_CPPFLAGS} -DU_HAVE_STD_STRING=0" -fi -AC_SUBST(U_HAVE_STD_STRING) - - AC_MSG_CHECKING([[if #include works]]) AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#include ]], [[]])], [ac_cv_header_atomic=yes], [ac_cv_header_atomic=no]) AC_MSG_RESULT($ac_cv_header_atomic) @@ -893,11 +883,18 @@ AC_SUBST(U_TIMEZONE) AC_CHECK_FUNC(strtod_l) if test x$ac_cv_func_strtod_l = xyes then - CONFIG_CPPFLAGS="${CONFIG_CPPFLAGS} -DU_HAVE_STRTOD_L=1" - U_HAVE_STRTOD_L=1 + U_HAVE_STRTOD_L=1 + AC_CHECK_HEADER(xlocale.h) + if test "$ac_cv_header_xlocale_h" = yes; then + U_HAVE_XLOCALE_H=1 + CONFIG_CPPFLAGS="${CONFIG_CPPFLAGS} -DU_HAVE_STRTOD_L=1 -DU_HAVE_XLOCALE_H=1" + else + U_HAVE_XLOCALE_H=0 + CONFIG_CPPFLAGS="${CONFIG_CPPFLAGS} -DU_HAVE_STRTOD_L=1 -DU_HAVE_XLOCALE_H=0" + fi else - CONFIG_CPPFLAGS="${CONFIG_CPPFLAGS} -DU_HAVE_STRTOD_L=0" - U_HAVE_STRTOD_L=0 + CONFIG_CPPFLAGS="${CONFIG_CPPFLAGS} -DU_HAVE_STRTOD_L=0" + U_HAVE_STRTOD_L=0 fi AC_SUBST(U_HAVE_STRTOD_L) @@ -1362,6 +1359,7 @@ AC_CONFIG_FILES([icudefs.mk \ tools/pkgdata/Makefile \ tools/tzcode/Makefile \ tools/gencfu/Makefile \ + tools/escapesrc/Makefile \ test/Makefile \ test/compat/Makefile \ test/testdata/Makefile \ diff --git a/Build/source/libs/icu/icu-src/source/data/build.xml b/Build/source/libs/icu/icu-src/source/data/build.xml index f9e44a9c5ab..efe0d3ce22f 100644 --- a/Build/source/libs/icu/icu-src/source/data/build.xml +++ b/Build/source/libs/icu/icu-src/source/data/build.xml @@ -332,6 +332,7 @@ + diff --git a/Build/source/libs/icu/icu-src/source/data/cldr-icu-readme.txt b/Build/source/libs/icu/icu-src/source/data/cldr-icu-readme.txt index 252fe4f6707..2e17b65e3f2 100644 --- a/Build/source/libs/icu/icu-src/source/data/cldr-icu-readme.txt +++ b/Build/source/libs/icu/icu-src/source/data/cldr-icu-readme.txt @@ -52,7 +52,7 @@ # # ANT_OPTS: You may want to set: # -# -Xmx1024m, to give Java more memory; otherwise it may run out +# -Xmx3072m, to give Java more memory; otherwise it may run out # of heap. # # b) CLDR-related variables @@ -124,7 +124,7 @@ # 1a. Java and ant variables, adjust for your system export JAVA_HOME=`/usr/libexec/java_home` -export ANT_OPTS="-Xmx1024m" +export ANT_OPTS="-Xmx3072m" # 1b. CLDR variables, adjust for your setup; with cygwin it might be e.g. # CLDR_DIR=`cygpath -wp /build/cldr` @@ -134,13 +134,12 @@ export CLDR_DIR=$HOME/cldr/trunk # 1c. ICU variables -export ICU4C_DIR=$HOME/icu/icu/trunk -export ICU4J_ROOT=$HOME/icu/icu4j/trunk +export ICU4C_DIR=$HOME/icu/trunk/icu4c +export ICU4J_ROOT=$HOME/icu/trunk/icu4j # 2. Build the CLDR Java tools cd $CLDR_DIR/tools/java -#cd $CLDR_DIR/cldr-tools ant jar # 3. Configure ICU4C, build and test without new data first, to verify that @@ -162,7 +161,7 @@ make check 2>&1 | tee /tmp/icu4c-oldData-makeCheck.txt cd $ICU4C_DIR/source/data ant clean -ant all 2>&1 | tee /tmp/cldrNN-buildLog.txt +ant all 2>&1 | tee /tmp/cldr-newData-buildLog.txt # 5. Check which data files have modifications, which have been added or removed # (if there are no changes, you may not need to proceed further). Make sure the @@ -220,10 +219,12 @@ cd $ICU4J_ROOT ant all 2>&1 | tee /tmp/icu4j-oldData-antAll.txt ant check 2>&1 | tee /tmp/icu4j-oldData-antCheck.txt -# 12. Now build the new data for ICU4J +# 12. Now build the new data and test data for ICU4J cd $ICU4C_DIR/source/data make icu4j-data-install +cd $ICU4C_DIR/source/test/testdata +make icu4j-data-install # 13. Now rebuild ICU4J with the new data and run tests: # Keep a log so you can investigate the errors. @@ -241,25 +242,24 @@ ant check 2>&1 | tee /tmp/icu4j-newData-antCheck.txt cd $ICU4C_DIR/source svn status -# add or remove as necessary, then commit +# add or remove as necessary cd $ICU4J_ROOT svn status -# add or remove as necessary, then commit +# add or remove as necessary + +cd $HOME/icu/trunk/ +# commit -# 16. For an official CLDR data integration into ICU, now tag the CLDR, ICU4J, -# and ICU4C sources with an appropriate CLDR milestone (you can check previous +# 16. For an official CLDR data integration into ICU, now tag the CLDR and +# ICU sources with an appropriate CLDR milestone (you can check previous # tags for format), e.g.: svn copy svn+ssh://unicode.org/repos/cldr/trunk \ svn+ssh://unicode.org/repos/cldr/tags/release-NNN \ --parents -m "cldrbug nnnn: tag cldr sources for NNN" -svn copy svn+ssh://source.icu-project.org/repos/icu/icu4j/trunk \ -svn+ssh://source.icu-project.org/repos/icu/icu4j/tags/cldr-NNN \ ---parents -m 'ticket:mmmm: tag the version used for integrating CLDR NNN' - -svn copy svn+ssh://source.icu-project.org/repos/icu/icu/trunk \ -svn+ssh://source.icu-project.org/repos/icu/icu/tags/cldr-NNN \ +svn copy svn+ssh://source.icu-project.org/repos/icu/trunk \ +svn+ssh://source.icu-project.org/repos/icu/tags/cldr-NNN \ --parents -m 'ticket:mmmm: tag the version used for integrating CLDR NNN' diff --git a/Build/source/libs/icu/icu-src/source/data/icu-coll-deprecates.xml b/Build/source/libs/icu/icu-src/source/data/icu-coll-deprecates.xml index f2802be005e..ccf978a6592 100644 --- a/Build/source/libs/icu/icu-src/source/data/icu-coll-deprecates.xml +++ b/Build/source/libs/icu/icu-src/source/data/icu-coll-deprecates.xml @@ -9,6 +9,7 @@ */ --> + @@ -26,6 +27,9 @@ + + + diff --git a/Build/source/libs/icu/icu-src/source/data/icu-config.xml b/Build/source/libs/icu/icu-src/source/data/icu-config.xml index 9c44e85af1f..3651f8bfa55 100644 --- a/Build/source/libs/icu/icu-src/source/data/icu-config.xml +++ b/Build/source/libs/icu/icu-src/source/data/icu-config.xml @@ -49,6 +49,7 @@ + @@ -94,6 +95,9 @@ + + + @@ -252,6 +256,7 @@ + @@ -396,6 +401,7 @@ + @@ -683,6 +689,8 @@ + + @@ -695,6 +703,8 @@ + + @@ -727,6 +737,8 @@ + + @@ -737,7 +749,10 @@ - + + + + diff --git a/Build/source/libs/icu/icu-src/source/data/icu-locale-deprecates.xml b/Build/source/libs/icu/icu-src/source/data/icu-locale-deprecates.xml index 566454d82b4..5ed82ede4f0 100644 --- a/Build/source/libs/icu/icu-src/source/data/icu-locale-deprecates.xml +++ b/Build/source/libs/icu/icu-src/source/data/icu-locale-deprecates.xml @@ -9,6 +9,7 @@ */ --> + @@ -45,6 +46,8 @@ + + diff --git a/Build/source/libs/icu/icu-src/source/data/icu-rbnf-deprecates.xml b/Build/source/libs/icu/icu-src/source/data/icu-rbnf-deprecates.xml index 084219f4e5c..22df252f11c 100644 --- a/Build/source/libs/icu/icu-src/source/data/icu-rbnf-deprecates.xml +++ b/Build/source/libs/icu/icu-src/source/data/icu-rbnf-deprecates.xml @@ -9,6 +9,7 @@ */ --> + diff --git a/Build/source/libs/icu/icu-src/source/data/in/coll/ucadata-implicithan.icu b/Build/source/libs/icu/icu-src/source/data/in/coll/ucadata-implicithan.icu index 38f938b20e8..7ae798c071a 100644 Binary files a/Build/source/libs/icu/icu-src/source/data/in/coll/ucadata-implicithan.icu and b/Build/source/libs/icu/icu-src/source/data/in/coll/ucadata-implicithan.icu differ diff --git a/Build/source/libs/icu/icu-src/source/data/in/coll/ucadata-unihan.icu b/Build/source/libs/icu/icu-src/source/data/in/coll/ucadata-unihan.icu index f7d82bcec81..645ef2703e9 100644 Binary files a/Build/source/libs/icu/icu-src/source/data/in/coll/ucadata-unihan.icu and b/Build/source/libs/icu/icu-src/source/data/in/coll/ucadata-unihan.icu differ diff --git a/Build/source/libs/icu/icu-src/source/data/in/icudt58l.dat b/Build/source/libs/icu/icu-src/source/data/in/icudt58l.dat deleted file mode 100644 index 636f807e328..00000000000 Binary files a/Build/source/libs/icu/icu-src/source/data/in/icudt58l.dat and /dev/null differ diff --git a/Build/source/libs/icu/icu-src/source/data/in/icudt60l.dat b/Build/source/libs/icu/icu-src/source/data/in/icudt60l.dat new file mode 100644 index 00000000000..5415d68b05b Binary files /dev/null and b/Build/source/libs/icu/icu-src/source/data/in/icudt60l.dat differ diff --git a/Build/source/libs/icu/icu-src/source/data/in/nfc.nrm b/Build/source/libs/icu/icu-src/source/data/in/nfc.nrm index bd2e90c0dc6..bb2e35639ad 100644 Binary files a/Build/source/libs/icu/icu-src/source/data/in/nfc.nrm and b/Build/source/libs/icu/icu-src/source/data/in/nfc.nrm differ diff --git a/Build/source/libs/icu/icu-src/source/data/in/nfkc.nrm b/Build/source/libs/icu/icu-src/source/data/in/nfkc.nrm index 2e19cf53a50..23411447a90 100644 Binary files a/Build/source/libs/icu/icu-src/source/data/in/nfkc.nrm and b/Build/source/libs/icu/icu-src/source/data/in/nfkc.nrm differ diff --git a/Build/source/libs/icu/icu-src/source/data/in/nfkc_cf.nrm b/Build/source/libs/icu/icu-src/source/data/in/nfkc_cf.nrm index 915d1809c6f..275fcaa4f9b 100644 Binary files a/Build/source/libs/icu/icu-src/source/data/in/nfkc_cf.nrm and b/Build/source/libs/icu/icu-src/source/data/in/nfkc_cf.nrm differ diff --git a/Build/source/libs/icu/icu-src/source/data/in/pnames.icu b/Build/source/libs/icu/icu-src/source/data/in/pnames.icu index 932d52256fd..44b0d057e01 100644 Binary files a/Build/source/libs/icu/icu-src/source/data/in/pnames.icu and b/Build/source/libs/icu/icu-src/source/data/in/pnames.icu differ diff --git a/Build/source/libs/icu/icu-src/source/data/in/ubidi.icu b/Build/source/libs/icu/icu-src/source/data/in/ubidi.icu index 6e5774c91ed..4ee237d79d8 100644 Binary files a/Build/source/libs/icu/icu-src/source/data/in/ubidi.icu and b/Build/source/libs/icu/icu-src/source/data/in/ubidi.icu differ diff --git a/Build/source/libs/icu/icu-src/source/data/in/ucase.icu b/Build/source/libs/icu/icu-src/source/data/in/ucase.icu index b920ba086e9..f678a6ccfb4 100644 Binary files a/Build/source/libs/icu/icu-src/source/data/in/ucase.icu and b/Build/source/libs/icu/icu-src/source/data/in/ucase.icu differ diff --git a/Build/source/libs/icu/icu-src/source/data/in/unames.icu b/Build/source/libs/icu/icu-src/source/data/in/unames.icu index 8932b23b31b..18daf7961c8 100644 Binary files a/Build/source/libs/icu/icu-src/source/data/in/unames.icu and b/Build/source/libs/icu/icu-src/source/data/in/unames.icu differ diff --git a/Build/source/libs/icu/icu-src/source/data/in/uprops.icu b/Build/source/libs/icu/icu-src/source/data/in/uprops.icu index 9e3ce0ee9a7..fda4cb3f823 100644 Binary files a/Build/source/libs/icu/icu-src/source/data/in/uprops.icu and b/Build/source/libs/icu/icu-src/source/data/in/uprops.icu differ diff --git a/Build/source/libs/icu/icu-src/source/data/in/uts46.nrm b/Build/source/libs/icu/icu-src/source/data/in/uts46.nrm index 49aa04d7c3c..562a67b27a4 100644 Binary files a/Build/source/libs/icu/icu-src/source/data/in/uts46.nrm and b/Build/source/libs/icu/icu-src/source/data/in/uts46.nrm differ diff --git a/Build/source/libs/icu/icu-src/source/data/makedata.mak b/Build/source/libs/icu/icu-src/source/data/makedata.mak index 1f454c84e46..6e3bde5ce8d 100644 --- a/Build/source/libs/icu/icu-src/source/data/makedata.mak +++ b/Build/source/libs/icu/icu-src/source/data/makedata.mak @@ -12,10 +12,14 @@ ############################################################################## # Keep the following in sync with the version - see common/unicode/uvernum.h -U_ICUDATA_NAME=icudt58 +U_ICUDATA_NAME=icudt60 ############################################################################## +!IF "$(UWP)" == "UWP" +# Optionally change the name of the data file for the UWP version. +U_ICUDATA_NAME=icudt60 +!ENDIF U_ICUDATA_ENDIAN_SUFFIX=l -UNICODE_VERSION=9.0 +UNICODE_VERSION=10.0 ICU_LIB_TARGET=$(DLL_OUTPUT)\$(U_ICUDATA_NAME).dll # ICUMAKE @@ -119,10 +123,14 @@ ICUDATA=$(ICUP)\source\data # This is the same place that all of the other ICU DLLs go (the code-containing DLLs) # The lib file for the data DLL goes in $(DLL_OUTPUT)/../lib/ # -!IF "$(CFG)" == "x64\Release" || "$(CFG)" == "x64\Debug" -DLL_OUTPUT=$(ICUP)\bin64 +!IF "$(CFG)" == "ARM\Release" || "$(CFG)" == "ARM\Debug" +DLL_OUTPUT=$(ICUP)\binARM$(UWP) +!ELSE IF "$(CFG)" == "x64\Release" || "$(CFG)" == "x64\Debug" +DLL_OUTPUT=$(ICUP)\bin64$(UWP) +!ELSE IF "$(UWP)" == "UWP" +DLL_OUTPUT=$(ICUP)\bin32$(UWP) !ELSE -DLL_OUTPUT=$(ICUP)\bin +DLL_OUTPUT=$(ICUP)\bin$(UWP) !ENDIF # @@ -147,14 +155,28 @@ TESTDATABLD=$(ICUP)\source\test\testdata\out\build # Directory under which all of the ICU data building tools live. # ICUTOOLS=$(ICUP)\source\tools +!MESSAGE ICU tools path is $(ICUTOOLS) + +# +# TOOLS CFG PATH +# ARM needs to use one of the other tools, so make sure to get an usable cfg path +# Since tools, particularly pkggen, have architecture built-in, we made x64 on +# Windows be machine-independent and use those tools. +# +CFGTOOLS=$(CFG) +!IF "$(CFG)" == "ARM\Release" || "$(CFG)" == "ARM\Debug" +CFGTOOLS=x64\Release +!ENDIF +!MESSAGE ICU tools CFG subpath is $(CFGTOOLS) # The current ICU tools need to be in the path first. -!IF "$(CFG)" == "x64\Release" || "$(CFG)" == "x64\Debug" -PATH = $(ICUP)\bin64;$(PATH) -ICUPBIN=$(ICUP)\bin64 -!ELSE +# x86 uses x86, x64 and arm use x64 +!IF "$(CFG)" == "x86\Release" || "$(CFG)" == "x86\Debug" PATH = $(ICUP)\bin;$(PATH) ICUPBIN=$(ICUP)\bin +!ELSE +PATH = $(ICUP)\bin64;$(PATH) +ICUPBIN=$(ICUP)\bin64 !ENDIF @@ -219,7 +241,9 @@ UCM_SOURCE_SPECIAL=$(UCM_SOURCE_EBCDIC_IGNORE_SISO) !IF EXISTS("$(ICUSRCDATA)\$(ICUUCM)\ucmlocal.mk") !INCLUDE "$(ICUSRCDATA)\$(ICUUCM)\ucmlocal.mk" +!IFDEF UCM_SOURCE_LOCAL UCM_SOURCE=$(UCM_SOURCE) $(UCM_SOURCE_LOCAL) +!ENDIF !IFDEF UCM_SOURCE_EBCDIC_IGNORE_SISO_LOCAL UCM_SOURCE_SPECIAL=$(UCM_SOURCE_SPECIAL) $(UCM_SOURCE_EBCDIC_IGNORE_SISO_LOCAL) BUILD_SPECIAL_CNV_FILES=YES @@ -237,9 +261,15 @@ CNV_FILES_SPECIAL=$(UCM_SOURCE_SPECIAL:.ucm=.cnv) !INCLUDE "$(ICUSRCDATA)\$(ICUBRK)\brkfiles.mk" !IF EXISTS("$(ICUSRCDATA)\$(ICUBRK)\brklocal.mk") !INCLUDE "$(ICUSRCDATA)\$(ICUBRK)\brklocal.mk" +!IFDEF BRK_SOURCE_LOCAL BRK_SOURCE=$(BRK_SOURCE) $(BRK_SOURCE_LOCAL) +!ENDIF +!IFDEF BRK_DICT_SOURCE_LOCAL BRK_DICT_SOURCE=$(BRK_DICT_SOURCE) $(BRK_DICT_SOURCE_LOCAL) +!ENDIF +!IFDEF BRK_RES_SOURCE_LOCAL BRK_RES_SOURCE=$(BRK_RES_SOURCE) $(BRK_RES_SOURCE_LOCAL) +!ENDIF !ELSE !MESSAGE Information: cannot find "brklocal.mk". Not building user-additional break iterator files. !ENDIF @@ -272,7 +302,9 @@ ALL_RES = $(ALL_RES) $(ICUBRK)\res_index.res !INCLUDE "$(ICUSRCDATA)\$(ICULOC)\resfiles.mk" !IF EXISTS("$(ICUSRCDATA)\$(ICULOC)\reslocal.mk") !INCLUDE "$(ICUSRCDATA)\$(ICULOC)\reslocal.mk" +!IFDEF GENRB_SOURCE_LOCAL GENRB_SOURCE=$(GENRB_SOURCE) $(GENRB_SOURCE_LOCAL) +!ENDIF !ELSE !MESSAGE Information: cannot find "reslocal.mk". Not building user-additional resource bundle files. !ENDIF @@ -291,7 +323,9 @@ ALL_RES = $(ALL_RES) res_index.res !INCLUDE "$(ICUSRCDATA)\curr\resfiles.mk" !IF EXISTS("$(ICUSRCDATA)\curr\reslocal.mk") !INCLUDE "$(ICUSRCDATA)\curr\reslocal.mk" +!IFDEF CURR_SOURCE_LOCAL CURR_SOURCE=$(CURR_SOURCE) $(CURR_SOURCE_LOCAL) +!ENDIF !ELSE !MESSAGE Information: cannot find "curr\reslocal.mk". Not building user-additional resource bundle files. !ENDIF @@ -312,7 +346,9 @@ ALL_RES = $(ALL_RES) curr\res_index.res !INCLUDE "$(ICUSRCDATA)\lang\resfiles.mk" !IF EXISTS("$(ICUSRCDATA)\lang\reslocal.mk") !INCLUDE "$(ICUSRCDATA)\lang\reslocal.mk" +!IFDEF LANG_SOURCE_LOCAL LANG_SOURCE=$(LANG_SOURCE) $(LANG_SOURCE_LOCAL) +!ENDIF !ELSE !MESSAGE Information: cannot find "lang\reslocal.mk". Not building user-additional resource bundle files. !ENDIF @@ -333,7 +369,9 @@ ALL_RES = $(ALL_RES) lang\res_index.res !INCLUDE "$(ICUSRCDATA)\region\resfiles.mk" !IF EXISTS("$(ICUSRCDATA)\region\reslocal.mk") !INCLUDE "$(ICUSRCDATA)\region\reslocal.mk" +!IFDEF REGION_SOURCE_LOCAL REGION_SOURCE=$(REGION_SOURCE) $(REGION_SOURCE_LOCAL) +!ENDIF !ELSE !MESSAGE Information: cannot find "region\reslocal.mk". Not building user-additional resource bundle files. !ENDIF @@ -354,7 +392,9 @@ ALL_RES = $(ALL_RES) region\res_index.res !INCLUDE "$(ICUSRCDATA)\zone\resfiles.mk" !IF EXISTS("$(ICUSRCDATA)\zone\reslocal.mk") !INCLUDE "$(ICUSRCDATA)\zone\reslocal.mk" +!IFDEF ZONE_SOURCE_LOCAL ZONE_SOURCE=$(ZONE_SOURCE) $(ZONE_SOURCE_LOCAL) +!ENDIF !ELSE !MESSAGE Information: cannot find "zone\reslocal.mk". Not building user-additional resource bundle files. !ENDIF @@ -376,7 +416,9 @@ ALL_RES = $(ALL_RES) zone\res_index.res !INCLUDE "$(ICUSRCDATA)\unit\resfiles.mk" !IF EXISTS("$(ICUSRCDATA)\unit\reslocal.mk") !INCLUDE "$(ICUSRCDATA)\unit\reslocal.mk" +!IFDEF UNIT_SOURCE_LOCAL UNIT_SOURCE=$(UNIT_SOURCE) $(UNIT_SOURCE_LOCAL) +!ENDIF !ELSE !MESSAGE Information: cannot find "unit\reslocal.mk". Not building user-additional resource bundle files. !ENDIF @@ -397,7 +439,9 @@ ALL_RES = $(ALL_RES) unit\res_index.res !INCLUDE "$(ICUSRCDATA)\$(ICUCOL)\colfiles.mk" !IF EXISTS("$(ICUSRCDATA)\$(ICUCOL)\collocal.mk") !INCLUDE "$(ICUSRCDATA)\$(ICUCOL)\collocal.mk" +!IFDEF COLLATION_SOURCE_LOCAL COLLATION_SOURCE=$(COLLATION_SOURCE) $(COLLATION_SOURCE_LOCAL) +!ENDIF !ELSE !MESSAGE Information: cannot find "collocal.mk". Not building user-additional resource bundle files. !ENDIF @@ -418,7 +462,9 @@ ALL_RES = $(ALL_RES) $(ICUCOL)\res_index.res !INCLUDE "$(ICUSRCDATA)\$(ICURBNF)\rbnffiles.mk" !IF EXISTS("$(ICUSRCDATA)\$(ICURBNF)\rbnflocal.mk") !INCLUDE "$(ICUSRCDATA)\$(ICURBNF)\rbnflocal.mk" +!IFDEF RBNF_SOURCE_LOCAL RBNF_SOURCE=$(RBNF_SOURCE) $(RBNF_SOURCE_LOCAL) +!ENDIF !ELSE !MESSAGE Information: cannot find "rbnflocal.mk". Not building user-additional resource bundle files. !ENDIF @@ -439,7 +485,9 @@ ALL_RES = $(ALL_RES) $(ICURBNF)\res_index.res !INCLUDE "$(ICUSRCDATA)\$(ICUTRNS)\trnsfiles.mk" !IF EXISTS("$(ICUSRCDATA)\$(ICUTRNS)\trnslocal.mk") !INCLUDE "$(ICUSRCDATA)\$(ICUTRNS)\trnslocal.mk" +!IFDEF TRANSLIT_SOURCE_LOCAL TRANSLIT_SOURCE=$(TRANSLIT_SOURCE) $(TRANSLIT_SOURCE_LOCAL) +!ENDIF !ELSE !MESSAGE Information: cannot find "trnslocal.mk". Not building user-additional transliterator files. !ENDIF @@ -460,7 +508,9 @@ TRANSLIT_RES_FILES = $(TRANSLIT_RES_FILES:translit\ =translit\) !INCLUDE "$(ICUSRCDATA)\$(ICUMISC2)\miscfiles.mk" !IF EXISTS("$(ICUSRCDATA)\$(ICUMISC2)\misclocal.mk") !INCLUDE "$(ICUSRCDATA)\$(ICUMISC2)\misclocal.mk" +!IFDEF MISC_SOURCE_LOCAL MISC_SOURCE=$(MISC_SOURCE) $(MISC_SOURCE_LOCAL) +!ENDIF !ELSE !MESSAGE Information: cannot find "misclocal.mk". Not building user-additional miscellaenous files. !ENDIF @@ -479,7 +529,9 @@ ALL_RES = $(ALL_RES) $(RB_FILES) $(MISC_FILES) !INCLUDE "$(ICUSRCDATA)\$(ICUSPREP)\sprepfiles.mk" !IF EXISTS("$(ICUSRCDATA)\$(ICUSPREP)\spreplocal.mk") !INCLUDE "$(ICUSRCDATA)\$(ICUSPREP)\spreplocal.mk" +!IFDEF SPREP_SOURCE_LOCAL SPREP_SOURCE=$(SPREP_SOURCE) $(SPREP_SOURCE_LOCAL) +!ENDIF !ELSE !MESSAGE Information: cannot find "spreplocal.mk". Not building user-additional stringprep files. !ENDIF @@ -492,6 +544,12 @@ SPREP_FILES = $(SPREP_SOURCE:.txt=.spp) # Common defines for both ways of building ICU's data library. COMMON_ICUDATA_DEPENDENCIES="$(ICUPBIN)\pkgdata.exe" "$(ICUTMP)\icudata.res" "$(ICUP)\source\stubdata\stubdatabuilt.txt" COMMON_ICUDATA_ARGUMENTS=-f -e $(U_ICUDATA_NAME) -v $(ICU_PACKAGE_MODE) -c -p $(ICUPKG) -T "$(ICUTMP)" -L $(U_ICUDATA_NAME) -d "$(ICUBLD_PKG)" -s . +!IF "$(UWP)" == "UWP" +COMMON_ICUDATA_ARGUMENTS=$(COMMON_ICUDATA_ARGUMENTS) -u +!IF "$(CFG)" == "ARM\Release" || "$(CFG)" == "ARM\Debug" +COMMON_ICUDATA_ARGUMENTS=$(COMMON_ICUDATA_ARGUMENTS) -a +!ENDIF +!ENDIF ############################################################################# # @@ -505,6 +563,11 @@ COMMON_ICUDATA_ARGUMENTS=-f -e $(U_ICUDATA_NAME) -v $(ICU_PACKAGE_MODE) -c -p $( ALL : GODATA "$(ICU_LIB_TARGET)" "$(TESTDATAOUT)\testdata.dat" @echo All targets are up to date +!IF "$(UWP)" == "UWP" + @if not exist "$(ICUMAKE)\..\..\commondata\" mkdir "$(ICUMAKE)\..\..\commondata\" + copy "$(ICUOUT)\$(U_ICUDATA_NAME)$(U_ICUDATA_ENDIAN_SUFFIX).dat" "$(ICUMAKE)\..\..\commondata\" +!ENDIF + # The core Unicode properties files (uprops.icu, ucase.icu, ubidi.icu) # are hardcoded in the common DLL and therefore not included in the data package any more. # They are not built by default but need to be built for ICU4J data and for getting the .c source files @@ -556,9 +619,9 @@ DEBUGUTILITIESDATA_DIR=main\tests\core\src\com\ibm\icu\dev\test\util DEBUGUTILITIESDATA_SRC=DebugUtilitiesData.java # Build DebugUtilitiesData.java -"$(ICUOUT)\icu4j\src\$(DEBUGUTILITIESDATA_DIR)\$(DEBUGUTILITIESDATA_SRC)" : {"$(ICUTOOLS)\gentest\$(CFG)"}gentest.exe +"$(ICUOUT)\icu4j\src\$(DEBUGUTILITIESDATA_DIR)\$(DEBUGUTILITIESDATA_SRC)" : {"$(ICUTOOLS)\gentest\$(CFGTOOLS)"}gentest.exe if not exist "$(ICUOUT)\icu4j\src\$(DEBUGUTILITIESDATA_DIR)" mkdir "$(ICUOUT)\icu4j\src\$(DEBUGUTILITIESDATA_DIR)" - "$(ICUTOOLS)\gentest\$(CFG)\gentest" -j -d"$(ICUOUT)\icu4j\src\$(DEBUGUTILITIESDATA_DIR)" + "$(ICUTOOLS)\gentest\$(CFGTOOLS)\gentest" -j -d"$(ICUOUT)\icu4j\src\$(DEBUGUTILITIESDATA_DIR)" ICU4J_DATA="$(ICUOUT)\icu4j\icudata.jar" "$(ICUOUT)\icu4j\testdata.jar" "$(ICUOUT)\icu4j\src\$(DEBUGUTILITIESDATA_DIR)\$(DEBUGUTILITIESDATA_SRC)" @@ -602,10 +665,10 @@ icu4j-data-install : # # testdata - nmake will invoke pkgdata, which will create testdata.dat # -"$(TESTDATAOUT)\testdata.dat": "$(TESTDATA)\*" "$(ICUBLD_PKG)\$(ICUCOL)\ucadata.icu" $(TRANSLIT_RES_FILES) $(MISC_FILES) $(RB_FILES) {"$(ICUTOOLS)\genrb\$(CFG)"}genrb.exe +"$(TESTDATAOUT)\testdata.dat": "$(TESTDATA)\*" "$(ICUBLD_PKG)\$(ICUCOL)\ucadata.icu" $(TRANSLIT_RES_FILES) $(MISC_FILES) $(RB_FILES) {"$(ICUTOOLS)\genrb\$(CFGTOOLS)"}genrb.exe @cd "$(TESTDATA)" @echo building testdata... - nmake /nologo /f "$(TESTDATA)\testdata.mak" TESTDATA=. ICUTOOLS="$(ICUTOOLS)" ICUPBIN="$(ICUPBIN)" ICUP="$(ICUP)" CFG=$(CFG) TESTDATAOUT="$(TESTDATAOUT)" TESTDATABLD="$(TESTDATABLD)" + nmake /nologo /f "$(TESTDATA)\testdata.mak" TESTDATA=. ICUTOOLS="$(ICUTOOLS)" ICUPBIN="$(ICUPBIN)" ICUP="$(ICUP)" CFG=$(CFGTOOLS) TESTDATAOUT="$(TESTDATAOUT)" TESTDATABLD="$(TESTDATABLD)" #invoke pkgdata for ICU common data # pkgdata will drop all output files (.dat, .dll, .lib) into the target (ICUBLD_PKG) directory. @@ -669,6 +732,7 @@ $(SPREP_FILES:.spp=.spp ) < - - - - Debug - Win32 - - - Debug - x64 - - - Release - Win32 - - - Release - x64 - - - - {D9DF7F2F-93B7-4810-B5CD-96F4F33C079B} - MakeFileProj - v140 - Makefile - false - - - - - - - - - - - - <_ProjectFileVersion>10.0.30319.1 - .\x86\Release\ - .\x86\Release\ - NMAKE /f makedata.mak ICUMAKE="$(ProjectDir)\" CFG=x86\Release - NMAKE /f makedata.mak ICUMAKE="$(ProjectDir)\" CFG=x86\Release clean all - NMAKE /f makedata.mak ICUMAKE="$(ProjectDir)\" CFG=x86\Release clean - - $(NMakePreprocessorDefinitions) - $(NMakeIncludeSearchPath) - $(NMakeForcedIncludes) - $(NMakeAssemblySearchPath) - $(NMakeForcedUsingAssemblies) - .\x86\Debug\ - .\x86\Debug\ - NMAKE /f makedata.mak ICUMAKE="$(ProjectDir)\" CFG=x86\Debug - NMAKE /f makedata.mak ICUMAKE="$(ProjectDir)\" CFG=x86\Debug clean all - NMAKE /f makedata.mak ICUMAKE="$(ProjectDir)\" CFG=x86\Debug clean - - $(NMakePreprocessorDefinitions) - $(NMakeIncludeSearchPath) - $(NMakeForcedIncludes) - $(NMakeAssemblySearchPath) - $(NMakeForcedUsingAssemblies) - .\x64\Release\ - .\x64\Release\ - NMAKE /f makedata.mak ICUMAKE="$(ProjectDir)\" CFG=x64\Release - NMAKE /f makedata.mak ICUMAKE="$(ProjectDir)\" CFG=x64\Release clean all - NMAKE /f makedata.mak ICUMAKE="$(ProjectDir)\" CFG=x64\Release clean - - $(NMakePreprocessorDefinitions) - $(NMakeIncludeSearchPath) - $(NMakeForcedIncludes) - $(NMakeAssemblySearchPath) - $(NMakeForcedUsingAssemblies) - .\x64\Debug\ - .\x64\Debug\ - NMAKE /f makedata.mak ICUMAKE="$(ProjectDir)\" CFG=x64\Debug - NMAKE /f makedata.mak ICUMAKE="$(ProjectDir)\" CFG=x64\Debug clean all - NMAKE /f makedata.mak ICUMAKE="$(ProjectDir)\" CFG=x64\Debug clean - - $(NMakePreprocessorDefinitions) - $(NMakeIncludeSearchPath) - $(NMakeForcedIncludes) - $(NMakeAssemblySearchPath) - $(NMakeForcedUsingAssemblies) - - - - .\out\tmp\x86\ReleaseBuildLog.html - - - - - .\out\tmp\x86\DebugBuildLog.html - - - - - .\out\tmp\x64\ReleaseBuildLog.html - - - - - .\out\tmp\x64\DebugBuildLog.html - - - - - - - - - - - - - - - - - - - {73c0a65b-d1f2-4de1-b3a6-15dad2c23f3d} - false - - - {dba4088d-f6f9-4f8f-8820-082a4765c16c} - false - - - {0178b127-6269-407d-b112-93877bb62776} - false - - - {c2b04507-2521-4801-bf0d-5fd79d6d518c} - false - - - {203ec78a-0531-43f0-a636-285439bde025} - false - - - {3d1246ae-1b32-479b-beca-aefa97be2321} - false - - - {73632960-b3a6-464d-83a3-4b43365f19b8} - false - - - {e4993e82-d68a-46ca-bae0-9d35e172e46f} - false - - - {eca6b435-b4fa-4f9f-bf95-f451d078fc47} - false - - - {c2be5000-7501-4e87-9724-b8d82494fae6} - false - - - {fdd3c4f2-9805-44eb-9a77-bc1c1c95b547} - false - - - {691ee0c0-dc57-4a48-8aee-8ed75eb3a057} - false - - - {a8d36f8d-09e6-4174-91c3-7beaa9c3f04f} - false - - - {8b41752b-5a52-41e4-b7e0-07921c0cc6bf} - false - - - {9d4211f7-2c77-439c-82f0-30a4e43ba569} - false - - - {c7891a65-80ab-4245-912e-5f1e17b0e6c4} - false - - - {d3065adb-8820-4cc7-9b6c-9510833961a3} - false - - - {97521d06-ec47-45d4-8bd0-9e16b3f93b2a} - false - - - {631c23ce-6c1d-4875-88f0-85e0a42b36ea} - false - - - {77c78066-746f-4ea6-b3fe-b8c8a4a97891} - false - - - {62d4b15d-7a90-4ecb-ba19-5e021d6a21bc} - false - - - {f5ad9738-1a3d-4906-b9c4-a7d9ce33dc2c} - false - - - {4c8454fe-81d3-4ca3-9927-29ba96f03dac} - false - - - {6b231032-3cb5-4eed-9210-810d666a23a0} - false - - - - - - + + + + + Debug + Win32 + + + Debug + x64 + + + Release + Win32 + + + Release + x64 + + + + {D9DF7F2F-93B7-4810-B5CD-96F4F33C079B} + MakeFileProj + v140 + 8.1 + Makefile + false + + + + + + + + + + + + <_ProjectFileVersion>10.0.30319.1 + .\data\tmp\x86\ + .\data\build\ + NMAKE /f makedata.mak ICUMAKE="$(ProjectDir)\" CFG=x86\Release + NMAKE /f makedata.mak ICUMAKE="$(ProjectDir)\" CFG=x86\Release clean all + NMAKE /f makedata.mak ICUMAKE="$(ProjectDir)\" CFG=x86\Release clean + + $(NMakePreprocessorDefinitions) + $(NMakeIncludeSearchPath) + $(NMakeForcedIncludes) + $(NMakeAssemblySearchPath) + $(NMakeForcedUsingAssemblies) + .\data\tmp\x86\ + .\data\build\ + NMAKE /f makedata.mak ICUMAKE="$(ProjectDir)\" CFG=x86\Debug + NMAKE /f makedata.mak ICUMAKE="$(ProjectDir)\" CFG=x86\Debug clean all + NMAKE /f makedata.mak ICUMAKE="$(ProjectDir)\" CFG=x86\Debug clean + + $(NMakePreprocessorDefinitions) + $(NMakeIncludeSearchPath) + $(NMakeForcedIncludes) + $(NMakeAssemblySearchPath) + $(NMakeForcedUsingAssemblies) + .\data\tmp\x64\ + .\data\build\ + NMAKE /f makedata.mak ICUMAKE="$(ProjectDir)\" CFG=x64\Release + NMAKE /f makedata.mak ICUMAKE="$(ProjectDir)\" CFG=x64\Release clean all + NMAKE /f makedata.mak ICUMAKE="$(ProjectDir)\" CFG=x64\Release clean + + $(NMakePreprocessorDefinitions) + $(NMakeIncludeSearchPath) + $(NMakeForcedIncludes) + $(NMakeAssemblySearchPath) + $(NMakeForcedUsingAssemblies) + .\data\tmp\x64\ + .\data\build\ + NMAKE /f makedata.mak ICUMAKE="$(ProjectDir)\" CFG=x64\Debug + NMAKE /f makedata.mak ICUMAKE="$(ProjectDir)\" CFG=x64\Debug clean all + NMAKE /f makedata.mak ICUMAKE="$(ProjectDir)\" CFG=x64\Debug clean + + $(NMakePreprocessorDefinitions) + $(NMakeIncludeSearchPath) + $(NMakeForcedIncludes) + $(NMakeAssemblySearchPath) + $(NMakeForcedUsingAssemblies) + + + + .\out\tmp\x86\ReleaseBuildLog.html + + + + + .\out\tmp\x86\DebugBuildLog.html + + + + + .\out\tmp\x64\ReleaseBuildLog.html + + + + + .\out\tmp\x64\DebugBuildLog.html + + + + + + + + + + + + + + + + + + + {73c0a65b-d1f2-4de1-b3a6-15dad2c23f3d} + false + + + {dba4088d-f6f9-4f8f-8820-082a4765c16c} + false + + + {0178b127-6269-407d-b112-93877bb62776} + false + + + {c2b04507-2521-4801-bf0d-5fd79d6d518c} + false + + + {203ec78a-0531-43f0-a636-285439bde025} + false + + + {3d1246ae-1b32-479b-beca-aefa97be2321} + false + + + {73632960-b3a6-464d-83a3-4b43365f19b8} + false + + + {e4993e82-d68a-46ca-bae0-9d35e172e46f} + false + + + {eca6b435-b4fa-4f9f-bf95-f451d078fc47} + false + + + {c2be5000-7501-4e87-9724-b8d82494fae6} + false + + + {fdd3c4f2-9805-44eb-9a77-bc1c1c95b547} + false + + + {691ee0c0-dc57-4a48-8aee-8ed75eb3a057} + false + + + {a8d36f8d-09e6-4174-91c3-7beaa9c3f04f} + false + + + {8b41752b-5a52-41e4-b7e0-07921c0cc6bf} + false + + + {9d4211f7-2c77-439c-82f0-30a4e43ba569} + false + + + {c7891a65-80ab-4245-912e-5f1e17b0e6c4} + false + + + {d3065adb-8820-4cc7-9b6c-9510833961a3} + false + + + {97521d06-ec47-45d4-8bd0-9e16b3f93b2a} + false + + + {631c23ce-6c1d-4875-88f0-85e0a42b36ea} + false + + + {77c78066-746f-4ea6-b3fe-b8c8a4a97891} + false + + + {62d4b15d-7a90-4ecb-ba19-5e021d6a21bc} + false + + + {f5ad9738-1a3d-4906-b9c4-a7d9ce33dc2c} + false + + + {4c8454fe-81d3-4ca3-9927-29ba96f03dac} + false + + + {6b231032-3cb5-4eed-9210-810d666a23a0} + false + + + + + + \ No newline at end of file diff --git a/Build/source/libs/icu/icu-src/source/data/makedata_uwp.vcxproj b/Build/source/libs/icu/icu-src/source/data/makedata_uwp.vcxproj new file mode 100644 index 00000000000..7baae5f4773 --- /dev/null +++ b/Build/source/libs/icu/icu-src/source/data/makedata_uwp.vcxproj @@ -0,0 +1,137 @@ + + + + + Debug + Win32 + + + Debug + x64 + + + Debug + ARM + + + Release + Win32 + + + Release + x64 + + + Release + ARM + + + + {B1D53358-37BD-48BC-B27C-68BAF1E78508} + MakeFileProj + en-US + 14.0 + true + Windows Store + 10.0.10586.0 + 10.0.10240.0 + 10.0 + Makefile + false + + + + + + + + + + + + <_ProjectFileVersion>10.0.30319.1 + .\data\tmp\x86\ + .\data\tmp\x86\ + .\data\tmp\x64\ + .\data\tmp\x64\ + .\data\tmp\arm\ + .\data\tmp\arm\ + .\data\build\ + .\data\build\ + .\data\build\ + .\data\build\ + .\data\build\ + .\data\build\ + NMAKE /f makedata.mak ICUMAKE="$(ProjectDir)\" CFG=x86\Release UWP=UWP + NMAKE /f makedata.mak ICUMAKE="$(ProjectDir)\" CFG=x86\Release UWP=UWP clean all + NMAKE /f makedata.mak ICUMAKE="$(ProjectDir)\" CFG=x86\Release UWP=UWP clean + NMAKE /f makedata.mak ICUMAKE="$(ProjectDir)\" CFG=x86\Debug UWP=UWP + NMAKE /f makedata.mak ICUMAKE="$(ProjectDir)\" CFG=x86\Debug UWP=UWP clean all + NMAKE /f makedata.mak ICUMAKE="$(ProjectDir)\" CFG=x86\Debug UWP=UWP clean + NMAKE /f makedata.mak ICUMAKE="$(ProjectDir)\" CFG=x64\Release UWP=UWP + NMAKE /f makedata.mak ICUMAKE="$(ProjectDir)\" CFG=x64\Release UWP=UWP clean all + NMAKE /f makedata.mak ICUMAKE="$(ProjectDir)\" CFG=x64\Release UWP=UWP clean + NMAKE /f makedata.mak ICUMAKE="$(ProjectDir)\" CFG=x64\Debug UWP=UWP + NMAKE /f makedata.mak ICUMAKE="$(ProjectDir)\" CFG=x64\Debug UWP=UWP clean all + NMAKE /f makedata.mak ICUMAKE="$(ProjectDir)\" CFG=x64\Debug UWP=UWP clean + NMAKE /f makedata.mak ICUMAKE="$(ProjectDir)\" CFG=ARM\Release UWP=UWP + NMAKE /f makedata.mak ICUMAKE="$(ProjectDir)\" CFG=ARM\Release UWP=UWP clean all + NMAKE /f makedata.mak ICUMAKE="$(ProjectDir)\" CFG=ARM\Release UWP=UWP clean + NMAKE /f makedata.mak ICUMAKE="$(ProjectDir)\" CFG=ARM\Debug UWP=UWP + NMAKE /f makedata.mak ICUMAKE="$(ProjectDir)\" CFG=ARM\Debug UWP=UWP clean all + NMAKE /f makedata.mak ICUMAKE="$(ProjectDir)\" CFG=ARM\Debug UWP=UWP clean + + + + .\out\tmp\x86\ReleaseUWPBuildLog.html + + + + + .\out\tmp\x86\DebugUWPBuildLog.html + + + + + .\out\tmp\x64\ReleaseUWPBuildLog.html + + + + + .\out\tmp\x64\DebugUWPBuildLog.html + + + + + .\out\tmp\arm\ReleaseUWPBuildLog.html + + + + + .\out\tmp\arm\DebugUWPBuildLog.html + + + + + + + + + + + + + + + + + + + {D9DF7F2F-93B7-4810-B5CD-96F4F33C079B} + false + + + + + + \ No newline at end of file diff --git a/Build/source/libs/icu/icu-src/source/data/misc/currencyNumericCodes.txt b/Build/source/libs/icu/icu-src/source/data/misc/currencyNumericCodes.txt deleted file mode 100644 index bb20ba02250..00000000000 --- a/Build/source/libs/icu/icu-src/source/data/misc/currencyNumericCodes.txt +++ /dev/null @@ -1,279 +0,0 @@ -//--------------------------------------------------------- -// Copyright (C) 2016 and later: Unicode, Inc. and others. -// License & terms of use: http://www.unicode.org/copyright.html -//--------------------------------------------------------- -// Copyright (C) 2013, International Business Machines -// Corporation and others. All Rights Reserved. -//--------------------------------------------------------- -// Build tool: com.ibm.icu.dev.tool.currency.NumericCodeData -// Build date: 2016-09-26T18:29:12Z -//--------------------------------------------------------- -// >> !!! >> THIS IS A MACHINE-GENERATED FILE << !!! << -// >> !!! >>> DO NOT EDIT <<< !!! << -//--------------------------------------------------------- - -currencyNumericCodes:table(nofallback){ - codeMap{ - ADP:int{20} - AED:int{784} - AFA:int{4} - AFN:int{971} - ALL:int{8} - AMD:int{51} - ANG:int{532} - AOA:int{973} - AON:int{24} - AOR:int{982} - ARA:int{32} - ARP:int{32} - ARS:int{32} - ATS:int{40} - AUD:int{36} - AWG:int{533} - AYM:int{945} - AZM:int{31} - AZN:int{944} - BAD:int{70} - BAM:int{977} - BBD:int{52} - BDT:int{50} - BEC:int{993} - BEF:int{56} - BEL:int{992} - BGL:int{100} - BGN:int{975} - BHD:int{48} - BIF:int{108} - BMD:int{60} - BND:int{96} - BOB:int{68} - BOV:int{984} - BRC:int{76} - BRE:int{76} - BRL:int{986} - BRN:int{76} - BRR:int{987} - BSD:int{44} - BTN:int{64} - BWP:int{72} - BYB:int{112} - BYN:int{933} - BYR:int{974} - BZD:int{84} - CAD:int{124} - CDF:int{976} - CHC:int{948} - CHE:int{947} - CHF:int{756} - CHW:int{948} - CLF:int{990} - CLP:int{152} - CNY:int{156} - COP:int{170} - COU:int{970} - CRC:int{188} - CSD:int{891} - CSK:int{200} - CUC:int{931} - CUP:int{192} - CVE:int{132} - CYP:int{196} - CZK:int{203} - DDM:int{278} - DEM:int{276} - DJF:int{262} - DKK:int{208} - DOP:int{214} - DZD:int{12} - ECS:int{218} - ECV:int{983} - EEK:int{233} - EGP:int{818} - ERN:int{232} - ESA:int{996} - ESB:int{995} - ESP:int{724} - ETB:int{230} - EUR:int{978} - FIM:int{246} - FJD:int{242} - FKP:int{238} - FRF:int{250} - GBP:int{826} - GEK:int{268} - GEL:int{981} - GHC:int{288} - GHP:int{939} - GHS:int{936} - GIP:int{292} - GMD:int{270} - GNF:int{324} - GQE:int{226} - GRD:int{300} - GTQ:int{320} - GWP:int{624} - GYD:int{328} - HKD:int{344} - HNL:int{340} - HRD:int{191} - HRK:int{191} - HTG:int{332} - HUF:int{348} - IDR:int{360} - IEP:int{372} - ILS:int{376} - INR:int{356} - IQD:int{368} - IRR:int{364} - ISK:int{352} - ITL:int{380} - JMD:int{388} - JOD:int{400} - JPY:int{392} - KES:int{404} - KGS:int{417} - KHR:int{116} - KMF:int{174} - KPW:int{408} - KRW:int{410} - KWD:int{414} - KYD:int{136} - KZT:int{398} - LAK:int{418} - LBP:int{422} - LKR:int{144} - LRD:int{430} - LSL:int{426} - LTL:int{440} - LTT:int{440} - LUC:int{989} - LUF:int{442} - LUL:int{988} - LVL:int{428} - LVR:int{428} - LYD:int{434} - MAD:int{504} - MDL:int{498} - MGA:int{969} - MGF:int{450} - MKD:int{807} - MLF:int{466} - MMK:int{104} - MNT:int{496} - MOP:int{446} - MRO:int{478} - MTL:int{470} - MUR:int{480} - MVR:int{462} - MWK:int{454} - MXN:int{484} - MXV:int{979} - MYR:int{458} - MZM:int{508} - MZN:int{943} - NAD:int{516} - NGN:int{566} - NIO:int{558} - NLG:int{528} - NOK:int{578} - NPR:int{524} - NZD:int{554} - OMR:int{512} - PAB:int{590} - PEI:int{604} - PEN:int{604} - PES:int{604} - PGK:int{598} - PHP:int{608} - PKR:int{586} - PLN:int{985} - PLZ:int{616} - PTE:int{620} - PYG:int{600} - QAR:int{634} - ROL:int{642} - RON:int{946} - RSD:int{941} - RUB:int{643} - RUR:int{810} - RWF:int{646} - SAR:int{682} - SBD:int{90} - SCR:int{690} - SDD:int{736} - SDG:int{938} - SEK:int{752} - SGD:int{702} - SHP:int{654} - SIT:int{705} - SKK:int{703} - SLL:int{694} - SOS:int{706} - SRD:int{968} - SRG:int{740} - SSP:int{728} - STD:int{678} - SVC:int{222} - SYP:int{760} - SZL:int{748} - THB:int{764} - TJR:int{762} - TJS:int{972} - TMM:int{795} - TMT:int{934} - TND:int{788} - TOP:int{776} - TPE:int{626} - TRL:int{792} - TRY:int{949} - TTD:int{780} - TWD:int{901} - TZS:int{834} - UAH:int{980} - UAK:int{804} - UGX:int{800} - USD:int{840} - USN:int{997} - USS:int{998} - UYI:int{940} - UYU:int{858} - UZS:int{860} - VEB:int{862} - VEF:int{937} - VND:int{704} - VUV:int{548} - WST:int{882} - XAF:int{950} - XAG:int{961} - XAU:int{959} - XBA:int{955} - XBB:int{956} - XBC:int{957} - XBD:int{958} - XCD:int{951} - XDR:int{960} - XEU:int{954} - XOF:int{952} - XPD:int{964} - XPF:int{953} - XPT:int{962} - XSU:int{994} - XTS:int{963} - XUA:int{965} - XXX:int{999} - YDD:int{720} - YER:int{886} - YUM:int{891} - YUN:int{890} - ZAL:int{991} - ZAR:int{710} - ZMK:int{894} - ZMW:int{967} - ZRN:int{180} - ZRZ:int{180} - ZWD:int{716} - ZWL:int{932} - ZWN:int{942} - ZWR:int{935} - } -} diff --git a/Build/source/libs/icu/icu-src/source/data/misc/dayPeriods.txt b/Build/source/libs/icu/icu-src/source/data/misc/dayPeriods.txt deleted file mode 100644 index 8438ee450cd..00000000000 --- a/Build/source/libs/icu/icu-src/source/data/misc/dayPeriods.txt +++ /dev/null @@ -1,3662 +0,0 @@ -// © 2016 and later: Unicode, Inc. and others. -// License & terms of use: http://www.unicode.org/copyright.html#License -dayPeriods:table(nofallback){ - locales{ - af{"set3"} - am{"set67"} - ar{"set65"} - az{"set61"} - bg{"set20"} - bn{"set33"} - bs{"set24"} - ca{"set14"} - chr{"set75"} - cs{"set26"} - da{"set6"} - de{"set5"} - ee{"set76"} - el{"set39"} - en{"set2"} - es{"set12"} - es_CO{"set13"} - et{"set48"} - eu{"set73"} - fa{"set42"} - fi{"set47"} - fil{"set59"} - fr{"set17"} - gl{"set11"} - gu{"set34"} - he{"set66"} - hi{"set32"} - hr{"set23"} - hu{"set49"} - hy{"set41"} - id{"set57"} - is{"set9"} - it{"set15"} - ja{"set52"} - ka{"set72"} - kk{"set62"} - km{"set69"} - kn{"set46"} - ko{"set53"} - ky{"set63"} - lo{"set56"} - lt{"set29"} - lv{"set30"} - mk{"set21"} - ml{"set45"} - mn{"set74"} - mr{"set35"} - ms{"set58"} - my{"set54"} - nb{"set7"} - ne{"set36"} - nl{"set4"} - pa{"set37"} - pl{"set28"} - pt{"set10"} - ro{"set16"} - root{"set1"} - ru{"set18"} - si{"set38"} - sk{"set27"} - sl{"set25"} - sq{"set40"} - sr{"set22"} - sv{"set8"} - sw{"set70"} - ta{"set43"} - te{"set44"} - th{"set55"} - tr{"set60"} - uk{"set19"} - ur{"set31"} - uz{"set64"} - vi{"set68"} - yue{"set51"} - zh{"set50"} - zu{"set71"} - } - locales_selection{ - af{"set79"} - am{"set147"} - ar{"set138"} - az{"set129"} - bg{"set101"} - bn{"set114"} - bs{"set95"} - ca{"set90"} - chr{"set151"} - cs{"set98"} - da{"set82"} - de{"set81"} - ee{"set152"} - el{"set107"} - en{"set78"} - es{"set88"} - es_CO{"set89"} - et{"set133"} - eu{"set148"} - fa{"set108"} - fi{"set134"} - fil{"set142"} - fr{"set93"} - gl{"set87"} - gu{"set115"} - he{"set139"} - hi{"set113"} - hr{"set94"} - hu{"set135"} - hy{"set109"} - id{"set140"} - is{"set85"} - it{"set91"} - ja{"set126"} - ka{"set110"} - kk{"set130"} - km{"set144"} - kn{"set123"} - ko{"set127"} - ky{"set131"} - lo{"set137"} - lt{"set105"} - lv{"set106"} - mk{"set102"} - ml{"set122"} - mn{"set149"} - mr{"set116"} - ms{"set141"} - my{"set150"} - nb{"set83"} - ne{"set117"} - nl{"set80"} - pa{"set118"} - pl{"set100"} - pt{"set86"} - ro{"set92"} - root{"set77"} - ru{"set103"} - si{"set119"} - sk{"set99"} - sl{"set97"} - sq{"set111"} - sr{"set96"} - sv{"set84"} - sw{"set145"} - ta{"set120"} - te{"set121"} - th{"set136"} - tr{"set128"} - uk{"set104"} - ur{"set112"} - uz{"set132"} - vi{"set143"} - yue{"set125"} - zh{"set124"} - zu{"set146"} - } - rules{ - set1{ - am{ - before{"12:00"} - from{"00:00"} - } - pm{ - before{"24:00"} - from{"12:00"} - } - } - set10{ - afternoon1{ - before{"19:00"} - from{"12:00"} - } - evening1{ - before{"24:00"} - from{"19:00"} - } - midnight{ - at{"00:00"} - } - morning1{ - before{"12:00"} - from{"06:00"} - } - night1{ - before{"06:00"} - from{"00:00"} - } - noon{ - at{"12:00"} - } - } - set100{ - afternoon1{ - before{"18:00"} - from{"12:00"} - } - evening1{ - before{"21:00"} - from{"18:00"} - } - morning1{ - before{"10:00"} - from{"06:00"} - } - morning2{ - before{"12:00"} - from{"10:00"} - } - night1{ - before{"06:00"} - from{"21:00"} - } - } - set101{ - afternoon1{ - before{"18:00"} - from{"14:00"} - } - evening1{ - before{"22:00"} - from{"18:00"} - } - morning1{ - before{"11:00"} - from{"04:00"} - } - morning2{ - before{"14:00"} - from{"11:00"} - } - night1{ - before{"04:00"} - from{"22:00"} - } - } - set102{ - afternoon1{ - before{"18:00"} - from{"12:00"} - } - evening1{ - before{"24:00"} - from{"18:00"} - } - morning1{ - before{"10:00"} - from{"04:00"} - } - morning2{ - before{"12:00"} - from{"10:00"} - } - night1{ - before{"04:00"} - from{"00:00"} - } - } - set103{ - afternoon1{ - before{"18:00"} - from{"12:00"} - } - evening1{ - before{"24:00"} - from{"18:00"} - } - morning1{ - before{"12:00"} - from{"04:00"} - } - night1{ - before{"04:00"} - from{"00:00"} - } - } - set104{ - afternoon1{ - before{"18:00"} - from{"12:00"} - } - evening1{ - before{"24:00"} - from{"18:00"} - } - morning1{ - before{"12:00"} - from{"04:00"} - } - night1{ - before{"04:00"} - from{"00:00"} - } - } - set105{ - afternoon1{ - before{"18:00"} - from{"12:00"} - } - evening1{ - before{"24:00"} - from{"18:00"} - } - morning1{ - before{"12:00"} - from{"06:00"} - } - night1{ - before{"06:00"} - from{"00:00"} - } - } - set106{ - afternoon1{ - before{"18:00"} - from{"12:00"} - } - evening1{ - before{"23:00"} - from{"18:00"} - } - morning1{ - before{"12:00"} - from{"06:00"} - } - night1{ - before{"06:00"} - from{"23:00"} - } - } - set107{ - afternoon1{ - before{"17:00"} - from{"12:00"} - } - evening1{ - before{"20:00"} - from{"17:00"} - } - morning1{ - before{"12:00"} - from{"04:00"} - } - night1{ - before{"04:00"} - from{"20:00"} - } - } - set108{ - afternoon1{ - before{"17:00"} - from{"12:00"} - } - evening1{ - before{"19:00"} - from{"17:00"} - } - morning1{ - before{"12:00"} - from{"04:00"} - } - night1{ - before{"04:00"} - from{"19:00"} - } - } - set109{ - afternoon1{ - before{"18:00"} - from{"12:00"} - } - evening1{ - before{"24:00"} - from{"18:00"} - } - morning1{ - before{"12:00"} - from{"06:00"} - } - night1{ - before{"06:00"} - from{"00:00"} - } - } - set11{ - afternoon1{ - before{"13:00"} - from{"12:00"} - } - evening1{ - before{"21:00"} - from{"13:00"} - } - midnight{ - at{"00:00"} - } - morning1{ - before{"06:00"} - from{"00:00"} - } - morning2{ - before{"12:00"} - from{"06:00"} - } - night1{ - before{"24:00"} - from{"21:00"} - } - } - set110{ - afternoon1{ - before{"18:00"} - from{"12:00"} - } - evening1{ - before{"21:00"} - from{"18:00"} - } - morning1{ - before{"12:00"} - from{"05:00"} - } - night1{ - before{"05:00"} - from{"21:00"} - } - } - set111{ - afternoon1{ - before{"18:00"} - from{"12:00"} - } - evening1{ - before{"24:00"} - from{"18:00"} - } - morning1{ - before{"09:00"} - from{"04:00"} - } - morning2{ - before{"12:00"} - from{"09:00"} - } - night1{ - before{"04:00"} - from{"00:00"} - } - } - set112{ - afternoon1{ - before{"16:00"} - from{"12:00"} - } - afternoon2{ - before{"18:00"} - from{"16:00"} - } - evening1{ - before{"20:00"} - from{"18:00"} - } - morning1{ - before{"12:00"} - from{"04:00"} - } - night1{ - before{"04:00"} - from{"20:00"} - } - } - set113{ - afternoon1{ - before{"16:00"} - from{"12:00"} - } - evening1{ - before{"20:00"} - from{"16:00"} - } - morning1{ - before{"12:00"} - from{"04:00"} - } - night1{ - before{"04:00"} - from{"20:00"} - } - } - set114{ - afternoon1{ - before{"16:00"} - from{"12:00"} - } - afternoon2{ - before{"18:00"} - from{"16:00"} - } - evening1{ - before{"20:00"} - from{"18:00"} - } - morning1{ - before{"06:00"} - from{"04:00"} - } - morning2{ - before{"12:00"} - from{"06:00"} - } - night1{ - before{"04:00"} - from{"20:00"} - } - } - set115{ - afternoon1{ - before{"16:00"} - from{"12:00"} - } - evening1{ - before{"20:00"} - from{"16:00"} - } - morning1{ - before{"12:00"} - from{"04:00"} - } - night1{ - before{"04:00"} - from{"20:00"} - } - } - set116{ - afternoon1{ - before{"16:00"} - from{"12:00"} - } - evening1{ - before{"18:00"} - from{"16:00"} - } - evening2{ - before{"21:00"} - from{"18:00"} - } - morning1{ - before{"06:00"} - from{"04:00"} - } - morning2{ - before{"12:00"} - from{"06:00"} - } - night1{ - before{"04:00"} - from{"21:00"} - } - } - set117{ - afternoon1{ - before{"16:00"} - from{"12:00"} - } - afternoon2{ - before{"19:00"} - from{"16:00"} - } - evening1{ - before{"22:00"} - from{"19:00"} - } - morning1{ - before{"12:00"} - from{"04:00"} - } - night1{ - before{"04:00"} - from{"22:00"} - } - } - set118{ - afternoon1{ - before{"16:00"} - from{"12:00"} - } - evening1{ - before{"21:00"} - from{"16:00"} - } - morning1{ - before{"12:00"} - from{"04:00"} - } - night1{ - before{"04:00"} - from{"21:00"} - } - } - set119{ - afternoon1{ - before{"14:00"} - from{"12:00"} - } - evening1{ - before{"18:00"} - from{"14:00"} - } - morning1{ - before{"06:00"} - from{"01:00"} - } - morning2{ - before{"12:00"} - from{"06:00"} - } - night1{ - before{"24:00"} - from{"18:00"} - } - night2{ - before{"01:00"} - from{"00:00"} - } - } - set12{ - evening1{ - before{"20:00"} - from{"12:00"} - } - morning1{ - before{"06:00"} - from{"00:00"} - } - morning2{ - before{"12:00"} - from{"06:00"} - } - night1{ - before{"24:00"} - from{"20:00"} - } - noon{ - at{"12:00"} - } - } - set120{ - afternoon1{ - before{"14:00"} - from{"12:00"} - } - afternoon2{ - before{"16:00"} - from{"14:00"} - } - evening1{ - before{"18:00"} - from{"16:00"} - } - evening2{ - before{"21:00"} - from{"18:00"} - } - morning1{ - before{"05:00"} - from{"03:00"} - } - morning2{ - before{"12:00"} - from{"05:00"} - } - night1{ - before{"03:00"} - from{"21:00"} - } - } - set121{ - afternoon1{ - before{"18:00"} - from{"12:00"} - } - evening1{ - before{"21:00"} - from{"18:00"} - } - morning1{ - before{"12:00"} - from{"06:00"} - } - night1{ - before{"06:00"} - from{"21:00"} - } - } - set122{ - afternoon1{ - before{"14:00"} - from{"12:00"} - } - afternoon2{ - before{"15:00"} - from{"14:00"} - } - evening1{ - before{"18:00"} - from{"15:00"} - } - evening2{ - before{"19:00"} - from{"18:00"} - } - morning1{ - before{"06:00"} - from{"03:00"} - } - morning2{ - before{"12:00"} - from{"06:00"} - } - night1{ - before{"03:00"} - from{"19:00"} - } - } - set123{ - afternoon1{ - before{"18:00"} - from{"12:00"} - } - evening1{ - before{"21:00"} - from{"18:00"} - } - morning1{ - before{"12:00"} - from{"06:00"} - } - night1{ - before{"06:00"} - from{"21:00"} - } - } - set124{ - afternoon1{ - before{"13:00"} - from{"12:00"} - } - afternoon2{ - before{"19:00"} - from{"13:00"} - } - evening1{ - before{"24:00"} - from{"19:00"} - } - morning1{ - before{"08:00"} - from{"05:00"} - } - morning2{ - before{"12:00"} - from{"08:00"} - } - night1{ - before{"05:00"} - from{"00:00"} - } - } - set125{ - afternoon1{ - before{"13:00"} - from{"12:00"} - } - afternoon2{ - before{"19:00"} - from{"13:00"} - } - evening1{ - before{"24:00"} - from{"19:00"} - } - morning1{ - before{"08:00"} - from{"05:00"} - } - morning2{ - before{"12:00"} - from{"08:00"} - } - night1{ - before{"05:00"} - from{"00:00"} - } - } - set126{ - afternoon1{ - before{"16:00"} - from{"12:00"} - } - evening1{ - before{"19:00"} - from{"16:00"} - } - morning1{ - before{"12:00"} - from{"04:00"} - } - night1{ - before{"23:00"} - from{"19:00"} - } - night2{ - before{"04:00"} - from{"23:00"} - } - } - set127{ - afternoon1{ - before{"18:00"} - from{"12:00"} - } - evening1{ - before{"21:00"} - from{"18:00"} - } - morning1{ - before{"06:00"} - from{"03:00"} - } - morning2{ - before{"12:00"} - from{"06:00"} - } - night1{ - before{"03:00"} - from{"21:00"} - } - } - set128{ - afternoon1{ - before{"18:00"} - from{"12:00"} - } - afternoon2{ - before{"19:00"} - from{"18:00"} - } - evening1{ - before{"21:00"} - from{"19:00"} - } - morning1{ - before{"11:00"} - from{"06:00"} - } - morning2{ - before{"12:00"} - from{"11:00"} - } - night1{ - before{"06:00"} - from{"21:00"} - } - } - set129{ - afternoon1{ - before{"17:00"} - from{"12:00"} - } - evening1{ - before{"19:00"} - from{"17:00"} - } - morning1{ - before{"06:00"} - from{"04:00"} - } - morning2{ - before{"12:00"} - from{"06:00"} - } - night1{ - before{"24:00"} - from{"19:00"} - } - night2{ - before{"04:00"} - from{"00:00"} - } - } - set13{ - evening1{ - before{"20:00"} - from{"12:00"} - } - morning2{ - before{"12:00"} - from{"00:00"} - } - night1{ - before{"24:00"} - from{"20:00"} - } - noon{ - at{"12:00"} - } - } - set130{ - afternoon1{ - before{"18:00"} - from{"12:00"} - } - evening1{ - before{"21:00"} - from{"18:00"} - } - morning1{ - before{"12:00"} - from{"06:00"} - } - night1{ - before{"06:00"} - from{"21:00"} - } - } - set131{ - afternoon1{ - before{"18:00"} - from{"12:00"} - } - evening1{ - before{"21:00"} - from{"18:00"} - } - morning1{ - before{"12:00"} - from{"06:00"} - } - night1{ - before{"06:00"} - from{"21:00"} - } - } - set132{ - afternoon1{ - before{"18:00"} - from{"11:00"} - } - evening1{ - before{"22:00"} - from{"18:00"} - } - morning1{ - before{"11:00"} - from{"06:00"} - } - night1{ - before{"06:00"} - from{"22:00"} - } - } - set133{ - afternoon1{ - before{"18:00"} - from{"12:00"} - } - evening1{ - before{"23:00"} - from{"18:00"} - } - morning1{ - before{"12:00"} - from{"05:00"} - } - night1{ - before{"05:00"} - from{"23:00"} - } - } - set134{ - afternoon1{ - before{"18:00"} - from{"12:00"} - } - evening1{ - before{"23:00"} - from{"18:00"} - } - morning1{ - before{"10:00"} - from{"05:00"} - } - morning2{ - before{"12:00"} - from{"10:00"} - } - night1{ - before{"05:00"} - from{"23:00"} - } - } - set135{ - afternoon1{ - before{"18:00"} - from{"12:00"} - } - evening1{ - before{"21:00"} - from{"18:00"} - } - morning1{ - before{"09:00"} - from{"06:00"} - } - morning2{ - before{"12:00"} - from{"09:00"} - } - night1{ - before{"04:00"} - from{"21:00"} - } - night2{ - before{"06:00"} - from{"04:00"} - } - } - set136{ - afternoon1{ - before{"13:00"} - from{"12:00"} - } - afternoon2{ - before{"16:00"} - from{"13:00"} - } - evening1{ - before{"18:00"} - from{"16:00"} - } - evening2{ - before{"21:00"} - from{"18:00"} - } - morning1{ - before{"12:00"} - from{"06:00"} - } - night1{ - before{"06:00"} - from{"21:00"} - } - } - set137{ - afternoon1{ - before{"16:00"} - from{"12:00"} - } - evening1{ - before{"20:00"} - from{"16:00"} - } - morning1{ - before{"12:00"} - from{"05:00"} - } - night1{ - before{"05:00"} - from{"20:00"} - } - } - set138{ - afternoon1{ - before{"13:00"} - from{"12:00"} - } - afternoon2{ - before{"18:00"} - from{"13:00"} - } - evening1{ - before{"24:00"} - from{"18:00"} - } - morning1{ - before{"06:00"} - from{"03:00"} - } - morning2{ - before{"12:00"} - from{"06:00"} - } - night1{ - before{"01:00"} - from{"00:00"} - } - night2{ - before{"03:00"} - from{"01:00"} - } - } - set139{ - afternoon1{ - before{"16:00"} - from{"12:00"} - } - afternoon2{ - before{"18:00"} - from{"16:00"} - } - evening1{ - before{"22:00"} - from{"18:00"} - } - morning1{ - before{"12:00"} - from{"06:00"} - } - night1{ - before{"03:00"} - from{"22:00"} - } - night2{ - before{"06:00"} - from{"03:00"} - } - } - set14{ - afternoon1{ - before{"13:00"} - from{"12:00"} - } - afternoon2{ - before{"19:00"} - from{"13:00"} - } - evening1{ - before{"21:00"} - from{"19:00"} - } - midnight{ - at{"00:00"} - } - morning1{ - before{"06:00"} - from{"00:00"} - } - morning2{ - before{"12:00"} - from{"06:00"} - } - night1{ - before{"24:00"} - from{"21:00"} - } - } - set140{ - afternoon1{ - before{"15:00"} - from{"10:00"} - } - evening1{ - before{"18:00"} - from{"15:00"} - } - morning1{ - before{"10:00"} - from{"00:00"} - } - night1{ - before{"24:00"} - from{"18:00"} - } - } - set141{ - afternoon1{ - before{"14:00"} - from{"12:00"} - } - evening1{ - before{"19:00"} - from{"14:00"} - } - morning1{ - before{"01:00"} - from{"00:00"} - } - morning2{ - before{"12:00"} - from{"01:00"} - } - night1{ - before{"24:00"} - from{"19:00"} - } - } - set142{ - afternoon1{ - before{"16:00"} - from{"12:00"} - } - evening1{ - before{"18:00"} - from{"16:00"} - } - morning1{ - before{"06:00"} - from{"00:00"} - } - morning2{ - before{"12:00"} - from{"06:00"} - } - night1{ - before{"24:00"} - from{"18:00"} - } - } - set143{ - afternoon1{ - before{"18:00"} - from{"12:00"} - } - evening1{ - before{"21:00"} - from{"18:00"} - } - morning1{ - before{"12:00"} - from{"04:00"} - } - night1{ - before{"04:00"} - from{"21:00"} - } - } - set144{ - afternoon1{ - before{"18:00"} - from{"12:00"} - } - evening1{ - before{"21:00"} - from{"18:00"} - } - morning1{ - before{"12:00"} - from{"00:00"} - } - night1{ - before{"24:00"} - from{"21:00"} - } - } - set145{ - afternoon1{ - before{"16:00"} - from{"12:00"} - } - evening1{ - before{"19:00"} - from{"16:00"} - } - morning1{ - before{"07:00"} - from{"04:00"} - } - morning2{ - before{"12:00"} - from{"07:00"} - } - night1{ - before{"04:00"} - from{"19:00"} - } - } - set146{ - afternoon1{ - before{"13:00"} - from{"10:00"} - } - evening1{ - before{"19:00"} - from{"13:00"} - } - morning1{ - before{"06:00"} - from{"00:00"} - } - morning2{ - before{"10:00"} - from{"06:00"} - } - night1{ - before{"24:00"} - from{"19:00"} - } - } - set147{ - afternoon1{ - before{"18:00"} - from{"12:00"} - } - evening1{ - before{"24:00"} - from{"18:00"} - } - morning1{ - before{"12:00"} - from{"06:00"} - } - night1{ - before{"06:00"} - from{"00:00"} - } - } - set148{ - afternoon1{ - before{"14:00"} - from{"12:00"} - } - afternoon2{ - before{"19:00"} - from{"14:00"} - } - evening1{ - before{"21:00"} - from{"19:00"} - } - morning1{ - before{"06:00"} - from{"00:00"} - } - morning2{ - before{"12:00"} - from{"06:00"} - } - night1{ - before{"24:00"} - from{"21:00"} - } - } - set149{ - afternoon1{ - before{"18:00"} - from{"12:00"} - } - evening1{ - before{"21:00"} - from{"18:00"} - } - morning1{ - before{"12:00"} - from{"06:00"} - } - night1{ - before{"06:00"} - from{"21:00"} - } - } - set15{ - afternoon1{ - before{"18:00"} - from{"12:00"} - } - evening1{ - before{"24:00"} - from{"18:00"} - } - midnight{ - at{"00:00"} - } - morning1{ - before{"12:00"} - from{"06:00"} - } - night1{ - before{"06:00"} - from{"00:00"} - } - noon{ - at{"12:00"} - } - } - set150{ - afternoon1{ - before{"16:00"} - from{"12:00"} - } - evening1{ - before{"19:00"} - from{"16:00"} - } - morning1{ - before{"12:00"} - from{"00:00"} - } - night1{ - before{"24:00"} - from{"19:00"} - } - } - set151{ - afternoon1{ - before{"24:00"} - from{"12:00"} - } - morning1{ - before{"12:00"} - from{"00:00"} - } - } - set152{ - afternoon1{ - before{"14:00"} - from{"12:00"} - } - afternoon2{ - before{"18:00"} - from{"14:00"} - } - evening1{ - before{"21:00"} - from{"18:00"} - } - morning1{ - before{"05:00"} - from{"04:00"} - } - morning2{ - before{"12:00"} - from{"05:00"} - } - night1{ - before{"04:00"} - from{"21:00"} - } - } - set16{ - afternoon1{ - before{"18:00"} - from{"12:00"} - } - evening1{ - before{"22:00"} - from{"18:00"} - } - midnight{ - at{"00:00"} - } - morning1{ - before{"12:00"} - from{"05:00"} - } - night1{ - before{"05:00"} - from{"22:00"} - } - noon{ - at{"12:00"} - } - } - set17{ - afternoon1{ - before{"18:00"} - from{"12:00"} - } - evening1{ - before{"24:00"} - from{"18:00"} - } - midnight{ - at{"00:00"} - } - morning1{ - before{"12:00"} - from{"04:00"} - } - night1{ - before{"04:00"} - from{"00:00"} - } - noon{ - at{"12:00"} - } - } - set18{ - afternoon1{ - before{"18:00"} - from{"12:00"} - } - evening1{ - before{"24:00"} - from{"18:00"} - } - midnight{ - at{"00:00"} - } - morning1{ - before{"12:00"} - from{"04:00"} - } - night1{ - before{"04:00"} - from{"00:00"} - } - noon{ - at{"12:00"} - } - } - set19{ - afternoon1{ - before{"18:00"} - from{"12:00"} - } - evening1{ - before{"24:00"} - from{"18:00"} - } - midnight{ - at{"00:00"} - } - morning1{ - before{"12:00"} - from{"04:00"} - } - night1{ - before{"04:00"} - from{"00:00"} - } - noon{ - at{"12:00"} - } - } - set2{ - afternoon1{ - before{"18:00"} - from{"12:00"} - } - evening1{ - before{"21:00"} - from{"18:00"} - } - midnight{ - at{"00:00"} - } - morning1{ - before{"12:00"} - from{"06:00"} - } - night1{ - before{"06:00"} - from{"21:00"} - } - noon{ - at{"12:00"} - } - } - set20{ - afternoon1{ - before{"18:00"} - from{"14:00"} - } - evening1{ - before{"22:00"} - from{"18:00"} - } - midnight{ - at{"00:00"} - } - morning1{ - before{"11:00"} - from{"04:00"} - } - morning2{ - before{"14:00"} - from{"11:00"} - } - night1{ - before{"04:00"} - from{"22:00"} - } - } - set21{ - afternoon1{ - before{"18:00"} - from{"12:00"} - } - evening1{ - before{"24:00"} - from{"18:00"} - } - midnight{ - at{"00:00"} - } - morning1{ - before{"10:00"} - from{"04:00"} - } - morning2{ - before{"12:00"} - from{"10:00"} - } - night1{ - before{"04:00"} - from{"00:00"} - } - noon{ - at{"12:00"} - } - } - set22{ - afternoon1{ - before{"18:00"} - from{"12:00"} - } - evening1{ - before{"21:00"} - from{"18:00"} - } - midnight{ - at{"00:00"} - } - morning1{ - before{"12:00"} - from{"06:00"} - } - night1{ - before{"06:00"} - from{"21:00"} - } - noon{ - at{"12:00"} - } - } - set23{ - afternoon1{ - before{"18:00"} - from{"12:00"} - } - evening1{ - before{"21:00"} - from{"18:00"} - } - midnight{ - at{"00:00"} - } - morning1{ - before{"12:00"} - from{"04:00"} - } - night1{ - before{"04:00"} - from{"21:00"} - } - noon{ - at{"12:00"} - } - } - set24{ - afternoon1{ - before{"18:00"} - from{"12:00"} - } - evening1{ - before{"21:00"} - from{"18:00"} - } - midnight{ - at{"00:00"} - } - morning1{ - before{"12:00"} - from{"04:00"} - } - night1{ - before{"04:00"} - from{"21:00"} - } - noon{ - at{"12:00"} - } - } - set25{ - afternoon1{ - before{"18:00"} - from{"12:00"} - } - evening1{ - before{"22:00"} - from{"18:00"} - } - midnight{ - at{"00:00"} - } - morning1{ - before{"10:00"} - from{"06:00"} - } - morning2{ - before{"12:00"} - from{"10:00"} - } - night1{ - before{"06:00"} - from{"22:00"} - } - noon{ - at{"12:00"} - } - } - set26{ - afternoon1{ - before{"18:00"} - from{"12:00"} - } - evening1{ - before{"22:00"} - from{"18:00"} - } - midnight{ - at{"00:00"} - } - morning1{ - before{"09:00"} - from{"04:00"} - } - morning2{ - before{"12:00"} - from{"09:00"} - } - night1{ - before{"04:00"} - from{"22:00"} - } - noon{ - at{"12:00"} - } - } - set27{ - afternoon1{ - before{"18:00"} - from{"12:00"} - } - evening1{ - before{"22:00"} - from{"18:00"} - } - midnight{ - at{"00:00"} - } - morning1{ - before{"09:00"} - from{"04:00"} - } - morning2{ - before{"12:00"} - from{"09:00"} - } - night1{ - before{"04:00"} - from{"22:00"} - } - noon{ - at{"12:00"} - } - } - set28{ - afternoon1{ - before{"18:00"} - from{"12:00"} - } - evening1{ - before{"21:00"} - from{"18:00"} - } - midnight{ - at{"00:00"} - } - morning1{ - before{"10:00"} - from{"06:00"} - } - morning2{ - before{"12:00"} - from{"10:00"} - } - night1{ - before{"06:00"} - from{"21:00"} - } - noon{ - at{"12:00"} - } - } - set29{ - afternoon1{ - before{"18:00"} - from{"12:00"} - } - evening1{ - before{"24:00"} - from{"18:00"} - } - midnight{ - at{"00:00"} - } - morning1{ - before{"12:00"} - from{"06:00"} - } - night1{ - before{"06:00"} - from{"00:00"} - } - noon{ - at{"12:00"} - } - } - set3{ - afternoon1{ - before{"18:00"} - from{"12:00"} - } - evening1{ - before{"24:00"} - from{"18:00"} - } - midnight{ - at{"00:00"} - } - morning1{ - before{"12:00"} - from{"05:00"} - } - night1{ - before{"05:00"} - from{"00:00"} - } - } - set30{ - afternoon1{ - before{"18:00"} - from{"12:00"} - } - evening1{ - before{"23:00"} - from{"18:00"} - } - midnight{ - at{"00:00"} - } - morning1{ - before{"12:00"} - from{"06:00"} - } - night1{ - before{"06:00"} - from{"23:00"} - } - noon{ - at{"12:00"} - } - } - set31{ - afternoon1{ - before{"16:00"} - from{"12:00"} - } - afternoon2{ - before{"18:00"} - from{"16:00"} - } - evening1{ - before{"20:00"} - from{"18:00"} - } - midnight{ - at{"00:00"} - } - morning1{ - before{"12:00"} - from{"04:00"} - } - night1{ - before{"04:00"} - from{"20:00"} - } - } - set32{ - afternoon1{ - before{"16:00"} - from{"12:00"} - } - evening1{ - before{"20:00"} - from{"16:00"} - } - midnight{ - at{"00:00"} - } - morning1{ - before{"12:00"} - from{"04:00"} - } - night1{ - before{"04:00"} - from{"20:00"} - } - } - set33{ - afternoon1{ - before{"16:00"} - from{"12:00"} - } - afternoon2{ - before{"18:00"} - from{"16:00"} - } - evening1{ - before{"20:00"} - from{"18:00"} - } - morning1{ - before{"06:00"} - from{"04:00"} - } - morning2{ - before{"12:00"} - from{"06:00"} - } - night1{ - before{"04:00"} - from{"20:00"} - } - } - set34{ - afternoon1{ - before{"16:00"} - from{"12:00"} - } - evening1{ - before{"20:00"} - from{"16:00"} - } - midnight{ - at{"00:00"} - } - morning1{ - before{"12:00"} - from{"04:00"} - } - night1{ - before{"04:00"} - from{"20:00"} - } - } - set35{ - afternoon1{ - before{"16:00"} - from{"12:00"} - } - evening1{ - before{"18:00"} - from{"16:00"} - } - evening2{ - before{"21:00"} - from{"18:00"} - } - midnight{ - at{"00:00"} - } - morning1{ - before{"06:00"} - from{"04:00"} - } - morning2{ - before{"12:00"} - from{"06:00"} - } - night1{ - before{"04:00"} - from{"21:00"} - } - noon{ - at{"12:00"} - } - } - set36{ - afternoon1{ - before{"16:00"} - from{"12:00"} - } - afternoon2{ - before{"19:00"} - from{"16:00"} - } - evening1{ - before{"22:00"} - from{"19:00"} - } - midnight{ - at{"00:00"} - } - morning1{ - before{"12:00"} - from{"04:00"} - } - night1{ - before{"04:00"} - from{"22:00"} - } - noon{ - at{"12:00"} - } - } - set37{ - afternoon1{ - before{"16:00"} - from{"12:00"} - } - evening1{ - before{"21:00"} - from{"16:00"} - } - midnight{ - at{"00:00"} - } - morning1{ - before{"12:00"} - from{"04:00"} - } - night1{ - before{"04:00"} - from{"21:00"} - } - } - set38{ - afternoon1{ - before{"14:00"} - from{"12:00"} - } - evening1{ - before{"18:00"} - from{"14:00"} - } - midnight{ - at{"00:00"} - } - morning1{ - before{"06:00"} - from{"01:00"} - } - morning2{ - before{"12:00"} - from{"06:00"} - } - night1{ - before{"24:00"} - from{"18:00"} - } - night2{ - before{"01:00"} - from{"00:00"} - } - noon{ - at{"12:00"} - } - } - set39{ - afternoon1{ - before{"17:00"} - from{"12:00"} - } - evening1{ - before{"20:00"} - from{"17:00"} - } - morning1{ - before{"12:00"} - from{"04:00"} - } - night1{ - before{"04:00"} - from{"20:00"} - } - } - set4{ - afternoon1{ - before{"18:00"} - from{"12:00"} - } - evening1{ - before{"24:00"} - from{"18:00"} - } - midnight{ - at{"00:00"} - } - morning1{ - before{"12:00"} - from{"06:00"} - } - night1{ - before{"06:00"} - from{"00:00"} - } - } - set40{ - afternoon1{ - before{"18:00"} - from{"12:00"} - } - evening1{ - before{"24:00"} - from{"18:00"} - } - midnight{ - at{"00:00"} - } - morning1{ - before{"09:00"} - from{"04:00"} - } - morning2{ - before{"12:00"} - from{"09:00"} - } - night1{ - before{"04:00"} - from{"00:00"} - } - noon{ - at{"12:00"} - } - } - set41{ - afternoon1{ - before{"18:00"} - from{"12:00"} - } - evening1{ - before{"24:00"} - from{"18:00"} - } - midnight{ - at{"00:00"} - } - morning1{ - before{"12:00"} - from{"06:00"} - } - night1{ - before{"06:00"} - from{"00:00"} - } - noon{ - at{"12:00"} - } - } - set42{ - afternoon1{ - before{"17:00"} - from{"12:00"} - } - evening1{ - before{"19:00"} - from{"17:00"} - } - midnight{ - at{"00:00"} - } - morning1{ - before{"12:00"} - from{"04:00"} - } - night1{ - before{"04:00"} - from{"19:00"} - } - noon{ - at{"12:00"} - } - } - set43{ - afternoon1{ - before{"14:00"} - from{"12:00"} - } - afternoon2{ - before{"16:00"} - from{"14:00"} - } - evening1{ - before{"18:00"} - from{"16:00"} - } - evening2{ - before{"21:00"} - from{"18:00"} - } - midnight{ - at{"00:00"} - } - morning1{ - before{"05:00"} - from{"03:00"} - } - morning2{ - before{"12:00"} - from{"05:00"} - } - night1{ - before{"03:00"} - from{"21:00"} - } - noon{ - at{"12:00"} - } - } - set44{ - afternoon1{ - before{"18:00"} - from{"12:00"} - } - evening1{ - before{"21:00"} - from{"18:00"} - } - midnight{ - at{"00:00"} - } - morning1{ - before{"12:00"} - from{"06:00"} - } - night1{ - before{"06:00"} - from{"21:00"} - } - } - set45{ - afternoon1{ - before{"14:00"} - from{"12:00"} - } - afternoon2{ - before{"15:00"} - from{"14:00"} - } - evening1{ - before{"18:00"} - from{"15:00"} - } - evening2{ - before{"19:00"} - from{"18:00"} - } - midnight{ - at{"00:00"} - } - morning1{ - before{"06:00"} - from{"03:00"} - } - morning2{ - before{"12:00"} - from{"06:00"} - } - night1{ - before{"03:00"} - from{"19:00"} - } - noon{ - at{"12:00"} - } - } - set46{ - afternoon1{ - before{"18:00"} - from{"12:00"} - } - evening1{ - before{"21:00"} - from{"18:00"} - } - midnight{ - at{"00:00"} - } - morning1{ - before{"12:00"} - from{"06:00"} - } - night1{ - before{"06:00"} - from{"21:00"} - } - } - set47{ - afternoon1{ - before{"18:00"} - from{"12:00"} - } - evening1{ - before{"23:00"} - from{"18:00"} - } - midnight{ - at{"00:00"} - } - morning1{ - before{"10:00"} - from{"05:00"} - } - morning2{ - before{"12:00"} - from{"10:00"} - } - night1{ - before{"05:00"} - from{"23:00"} - } - noon{ - at{"12:00"} - } - } - set48{ - afternoon1{ - before{"18:00"} - from{"12:00"} - } - evening1{ - before{"23:00"} - from{"18:00"} - } - midnight{ - at{"00:00"} - } - morning1{ - before{"12:00"} - from{"05:00"} - } - night1{ - before{"05:00"} - from{"23:00"} - } - noon{ - at{"12:00"} - } - } - set49{ - afternoon1{ - before{"18:00"} - from{"12:00"} - } - evening1{ - before{"21:00"} - from{"18:00"} - } - midnight{ - at{"00:00"} - } - morning1{ - before{"09:00"} - from{"06:00"} - } - morning2{ - before{"12:00"} - from{"09:00"} - } - night1{ - before{"04:00"} - from{"21:00"} - } - night2{ - before{"06:00"} - from{"04:00"} - } - noon{ - at{"12:00"} - } - } - set5{ - afternoon1{ - before{"13:00"} - from{"12:00"} - } - afternoon2{ - before{"18:00"} - from{"13:00"} - } - evening1{ - before{"24:00"} - from{"18:00"} - } - midnight{ - at{"00:00"} - } - morning1{ - before{"10:00"} - from{"05:00"} - } - morning2{ - before{"12:00"} - from{"10:00"} - } - night1{ - before{"05:00"} - from{"00:00"} - } - } - set50{ - afternoon1{ - before{"13:00"} - from{"12:00"} - } - afternoon2{ - before{"19:00"} - from{"13:00"} - } - evening1{ - before{"24:00"} - from{"19:00"} - } - midnight{ - at{"00:00"} - } - morning1{ - before{"08:00"} - from{"05:00"} - } - morning2{ - before{"12:00"} - from{"08:00"} - } - night1{ - before{"05:00"} - from{"00:00"} - } - } - set51{ - afternoon1{ - before{"13:00"} - from{"12:00"} - } - afternoon2{ - before{"19:00"} - from{"13:00"} - } - evening1{ - before{"24:00"} - from{"19:00"} - } - midnight{ - at{"00:00"} - } - morning1{ - before{"08:00"} - from{"05:00"} - } - morning2{ - before{"12:00"} - from{"08:00"} - } - night1{ - before{"05:00"} - from{"00:00"} - } - } - set52{ - afternoon1{ - before{"16:00"} - from{"12:00"} - } - evening1{ - before{"19:00"} - from{"16:00"} - } - midnight{ - at{"00:00"} - } - morning1{ - before{"12:00"} - from{"04:00"} - } - night1{ - before{"23:00"} - from{"19:00"} - } - night2{ - before{"04:00"} - from{"23:00"} - } - noon{ - at{"12:00"} - } - } - set53{ - afternoon1{ - before{"18:00"} - from{"12:00"} - } - evening1{ - before{"21:00"} - from{"18:00"} - } - midnight{ - at{"00:00"} - } - morning1{ - before{"06:00"} - from{"03:00"} - } - morning2{ - before{"12:00"} - from{"06:00"} - } - night1{ - before{"03:00"} - from{"21:00"} - } - noon{ - at{"12:00"} - } - } - set54{ - afternoon1{ - before{"16:00"} - from{"12:00"} - } - evening1{ - before{"19:00"} - from{"16:00"} - } - midnight{ - at{"00:00"} - } - morning1{ - before{"12:00"} - from{"00:00"} - } - night1{ - before{"24:00"} - from{"19:00"} - } - noon{ - at{"12:00"} - } - } - set55{ - afternoon1{ - before{"13:00"} - from{"12:00"} - } - afternoon2{ - before{"16:00"} - from{"13:00"} - } - evening1{ - before{"18:00"} - from{"16:00"} - } - evening2{ - before{"21:00"} - from{"18:00"} - } - midnight{ - at{"00:00"} - } - morning1{ - before{"12:00"} - from{"06:00"} - } - night1{ - before{"06:00"} - from{"21:00"} - } - noon{ - at{"12:00"} - } - } - set56{ - afternoon1{ - before{"16:00"} - from{"12:00"} - } - evening1{ - before{"20:00"} - from{"16:00"} - } - midnight{ - at{"00:00"} - } - morning1{ - before{"12:00"} - from{"05:00"} - } - night1{ - before{"05:00"} - from{"20:00"} - } - noon{ - at{"12:00"} - } - } - set57{ - afternoon1{ - before{"15:00"} - from{"10:00"} - } - evening1{ - before{"18:00"} - from{"15:00"} - } - midnight{ - at{"00:00"} - } - morning1{ - before{"10:00"} - from{"00:00"} - } - night1{ - before{"24:00"} - from{"18:00"} - } - noon{ - at{"12:00"} - } - } - set58{ - afternoon1{ - before{"14:00"} - from{"12:00"} - } - evening1{ - before{"19:00"} - from{"14:00"} - } - morning1{ - before{"01:00"} - from{"00:00"} - } - morning2{ - before{"12:00"} - from{"01:00"} - } - night1{ - before{"24:00"} - from{"19:00"} - } - } - set59{ - afternoon1{ - before{"16:00"} - from{"12:00"} - } - evening1{ - before{"18:00"} - from{"16:00"} - } - midnight{ - at{"00:00"} - } - morning1{ - before{"06:00"} - from{"00:00"} - } - morning2{ - before{"12:00"} - from{"06:00"} - } - night1{ - before{"24:00"} - from{"18:00"} - } - noon{ - at{"12:00"} - } - } - set6{ - afternoon1{ - before{"18:00"} - from{"12:00"} - } - evening1{ - before{"24:00"} - from{"18:00"} - } - midnight{ - at{"00:00"} - } - morning1{ - before{"10:00"} - from{"05:00"} - } - morning2{ - before{"12:00"} - from{"10:00"} - } - night1{ - before{"05:00"} - from{"00:00"} - } - } - set60{ - afternoon1{ - before{"18:00"} - from{"12:00"} - } - afternoon2{ - before{"19:00"} - from{"18:00"} - } - evening1{ - before{"21:00"} - from{"19:00"} - } - midnight{ - at{"00:00"} - } - morning1{ - before{"11:00"} - from{"06:00"} - } - morning2{ - before{"12:00"} - from{"11:00"} - } - night1{ - before{"06:00"} - from{"21:00"} - } - noon{ - at{"12:00"} - } - } - set61{ - afternoon1{ - before{"17:00"} - from{"12:00"} - } - evening1{ - before{"19:00"} - from{"17:00"} - } - midnight{ - at{"00:00"} - } - morning1{ - before{"06:00"} - from{"04:00"} - } - morning2{ - before{"12:00"} - from{"06:00"} - } - night1{ - before{"24:00"} - from{"19:00"} - } - night2{ - before{"04:00"} - from{"00:00"} - } - noon{ - at{"12:00"} - } - } - set62{ - afternoon1{ - before{"18:00"} - from{"12:00"} - } - evening1{ - before{"21:00"} - from{"18:00"} - } - midnight{ - at{"00:00"} - } - morning1{ - before{"12:00"} - from{"06:00"} - } - night1{ - before{"06:00"} - from{"21:00"} - } - noon{ - at{"12:00"} - } - } - set63{ - afternoon1{ - before{"18:00"} - from{"12:00"} - } - evening1{ - before{"21:00"} - from{"18:00"} - } - midnight{ - at{"00:00"} - } - morning1{ - before{"12:00"} - from{"06:00"} - } - night1{ - before{"06:00"} - from{"21:00"} - } - noon{ - at{"12:00"} - } - } - set64{ - afternoon1{ - before{"18:00"} - from{"11:00"} - } - evening1{ - before{"22:00"} - from{"18:00"} - } - midnight{ - at{"00:00"} - } - morning1{ - before{"11:00"} - from{"06:00"} - } - night1{ - before{"06:00"} - from{"22:00"} - } - noon{ - at{"12:00"} - } - } - set65{ - afternoon1{ - before{"13:00"} - from{"12:00"} - } - afternoon2{ - before{"18:00"} - from{"13:00"} - } - evening1{ - before{"24:00"} - from{"18:00"} - } - morning1{ - before{"06:00"} - from{"03:00"} - } - morning2{ - before{"12:00"} - from{"06:00"} - } - night1{ - before{"01:00"} - from{"00:00"} - } - night2{ - before{"03:00"} - from{"01:00"} - } - } - set66{ - afternoon1{ - before{"16:00"} - from{"12:00"} - } - afternoon2{ - before{"18:00"} - from{"16:00"} - } - evening1{ - before{"22:00"} - from{"18:00"} - } - midnight{ - at{"00:00"} - } - morning1{ - before{"12:00"} - from{"06:00"} - } - night1{ - before{"03:00"} - from{"22:00"} - } - night2{ - before{"06:00"} - from{"03:00"} - } - } - set67{ - afternoon1{ - before{"18:00"} - from{"12:00"} - } - evening1{ - before{"24:00"} - from{"18:00"} - } - midnight{ - at{"00:00"} - } - morning1{ - before{"12:00"} - from{"06:00"} - } - night1{ - before{"06:00"} - from{"00:00"} - } - noon{ - at{"12:00"} - } - } - set68{ - afternoon1{ - before{"18:00"} - from{"12:00"} - } - evening1{ - before{"21:00"} - from{"18:00"} - } - midnight{ - at{"00:00"} - } - morning1{ - before{"12:00"} - from{"04:00"} - } - night1{ - before{"04:00"} - from{"21:00"} - } - noon{ - at{"12:00"} - } - } - set69{ - afternoon1{ - before{"18:00"} - from{"12:00"} - } - evening1{ - before{"21:00"} - from{"18:00"} - } - midnight{ - at{"00:00"} - } - morning1{ - before{"12:00"} - from{"00:00"} - } - night1{ - before{"24:00"} - from{"21:00"} - } - noon{ - at{"12:00"} - } - } - set7{ - afternoon1{ - before{"18:00"} - from{"12:00"} - } - evening1{ - before{"24:00"} - from{"18:00"} - } - midnight{ - at{"00:00"} - } - morning1{ - before{"10:00"} - from{"06:00"} - } - morning2{ - before{"12:00"} - from{"10:00"} - } - night1{ - before{"06:00"} - from{"00:00"} - } - } - set70{ - afternoon1{ - before{"16:00"} - from{"12:00"} - } - evening1{ - before{"19:00"} - from{"16:00"} - } - midnight{ - at{"00:00"} - } - morning1{ - before{"07:00"} - from{"04:00"} - } - morning2{ - before{"12:00"} - from{"07:00"} - } - night1{ - before{"04:00"} - from{"19:00"} - } - noon{ - at{"12:00"} - } - } - set71{ - afternoon1{ - before{"13:00"} - from{"10:00"} - } - evening1{ - before{"19:00"} - from{"13:00"} - } - morning1{ - before{"06:00"} - from{"00:00"} - } - morning2{ - before{"10:00"} - from{"06:00"} - } - night1{ - before{"24:00"} - from{"19:00"} - } - } - set72{ - afternoon1{ - before{"18:00"} - from{"12:00"} - } - evening1{ - before{"21:00"} - from{"18:00"} - } - midnight{ - at{"00:00"} - } - morning1{ - before{"12:00"} - from{"05:00"} - } - night1{ - before{"05:00"} - from{"21:00"} - } - noon{ - at{"12:00"} - } - } - set73{ - afternoon1{ - before{"14:00"} - from{"12:00"} - } - afternoon2{ - before{"19:00"} - from{"14:00"} - } - evening1{ - before{"21:00"} - from{"19:00"} - } - midnight{ - at{"00:00"} - } - morning1{ - before{"06:00"} - from{"00:00"} - } - morning2{ - before{"12:00"} - from{"06:00"} - } - night1{ - before{"24:00"} - from{"21:00"} - } - } - set74{ - afternoon1{ - before{"18:00"} - from{"12:00"} - } - evening1{ - before{"21:00"} - from{"18:00"} - } - midnight{ - at{"00:00"} - } - morning1{ - before{"12:00"} - from{"06:00"} - } - night1{ - before{"06:00"} - from{"21:00"} - } - noon{ - at{"12:00"} - } - } - set75{ - afternoon1{ - before{"24:00"} - from{"12:00"} - } - morning1{ - before{"12:00"} - from{"00:00"} - } - noon{ - at{"12:00"} - } - } - set76{ - afternoon1{ - before{"14:00"} - from{"12:00"} - } - afternoon2{ - before{"18:00"} - from{"14:00"} - } - evening1{ - before{"21:00"} - from{"18:00"} - } - morning1{ - before{"05:00"} - from{"04:00"} - } - morning2{ - before{"12:00"} - from{"05:00"} - } - night1{ - before{"04:00"} - from{"21:00"} - } - } - set77{ - am{ - before{"12:00"} - from{"00:00"} - } - pm{ - before{"24:00"} - from{"12:00"} - } - } - set78{ - afternoon1{ - before{"18:00"} - from{"12:00"} - } - evening1{ - before{"21:00"} - from{"18:00"} - } - morning1{ - before{"12:00"} - from{"06:00"} - } - night1{ - before{"06:00"} - from{"21:00"} - } - } - set79{ - afternoon1{ - before{"18:00"} - from{"12:00"} - } - evening1{ - before{"24:00"} - from{"18:00"} - } - morning1{ - before{"12:00"} - from{"05:00"} - } - night1{ - before{"05:00"} - from{"00:00"} - } - } - set8{ - afternoon1{ - before{"18:00"} - from{"12:00"} - } - evening1{ - before{"24:00"} - from{"18:00"} - } - midnight{ - at{"00:00"} - } - morning1{ - before{"10:00"} - from{"05:00"} - } - morning2{ - before{"12:00"} - from{"10:00"} - } - night1{ - before{"05:00"} - from{"00:00"} - } - } - set80{ - afternoon1{ - before{"18:00"} - from{"12:00"} - } - evening1{ - before{"24:00"} - from{"18:00"} - } - morning1{ - before{"12:00"} - from{"06:00"} - } - night1{ - before{"06:00"} - from{"00:00"} - } - } - set81{ - afternoon1{ - before{"13:00"} - from{"12:00"} - } - afternoon2{ - before{"18:00"} - from{"13:00"} - } - evening1{ - before{"24:00"} - from{"18:00"} - } - morning1{ - before{"10:00"} - from{"05:00"} - } - morning2{ - before{"12:00"} - from{"10:00"} - } - night1{ - before{"05:00"} - from{"00:00"} - } - } - set82{ - afternoon1{ - before{"18:00"} - from{"12:00"} - } - evening1{ - before{"24:00"} - from{"18:00"} - } - morning1{ - before{"10:00"} - from{"05:00"} - } - morning2{ - before{"12:00"} - from{"10:00"} - } - night1{ - before{"05:00"} - from{"00:00"} - } - } - set83{ - afternoon1{ - before{"18:00"} - from{"12:00"} - } - evening1{ - before{"24:00"} - from{"18:00"} - } - morning1{ - before{"10:00"} - from{"06:00"} - } - morning2{ - before{"12:00"} - from{"10:00"} - } - night1{ - before{"06:00"} - from{"00:00"} - } - } - set84{ - afternoon1{ - before{"18:00"} - from{"12:00"} - } - evening1{ - before{"24:00"} - from{"18:00"} - } - morning1{ - before{"10:00"} - from{"05:00"} - } - morning2{ - before{"12:00"} - from{"10:00"} - } - night1{ - before{"05:00"} - from{"00:00"} - } - } - set85{ - afternoon1{ - before{"18:00"} - from{"12:00"} - } - evening1{ - before{"24:00"} - from{"18:00"} - } - morning1{ - before{"12:00"} - from{"06:00"} - } - night1{ - before{"06:00"} - from{"00:00"} - } - } - set86{ - afternoon1{ - before{"19:00"} - from{"12:00"} - } - evening1{ - before{"24:00"} - from{"19:00"} - } - morning1{ - before{"12:00"} - from{"06:00"} - } - night1{ - before{"06:00"} - from{"00:00"} - } - } - set87{ - afternoon1{ - before{"13:00"} - from{"12:00"} - } - evening1{ - before{"21:00"} - from{"13:00"} - } - morning1{ - before{"06:00"} - from{"00:00"} - } - morning2{ - before{"12:00"} - from{"06:00"} - } - night1{ - before{"24:00"} - from{"21:00"} - } - } - set88{ - evening1{ - before{"20:00"} - from{"12:00"} - } - morning1{ - before{"06:00"} - from{"00:00"} - } - morning2{ - before{"12:00"} - from{"06:00"} - } - night1{ - before{"24:00"} - from{"20:00"} - } - } - set89{ - evening1{ - before{"20:00"} - from{"12:00"} - } - morning2{ - before{"12:00"} - from{"00:00"} - } - night1{ - before{"24:00"} - from{"20:00"} - } - } - set9{ - afternoon1{ - before{"18:00"} - from{"12:00"} - } - evening1{ - before{"24:00"} - from{"18:00"} - } - midnight{ - at{"00:00"} - } - morning1{ - before{"12:00"} - from{"06:00"} - } - night1{ - before{"06:00"} - from{"00:00"} - } - noon{ - at{"12:00"} - } - } - set90{ - afternoon1{ - before{"13:00"} - from{"12:00"} - } - afternoon2{ - before{"19:00"} - from{"13:00"} - } - evening1{ - before{"21:00"} - from{"19:00"} - } - morning1{ - before{"06:00"} - from{"00:00"} - } - morning2{ - before{"12:00"} - from{"06:00"} - } - night1{ - before{"24:00"} - from{"21:00"} - } - } - set91{ - afternoon1{ - before{"18:00"} - from{"12:00"} - } - evening1{ - before{"24:00"} - from{"18:00"} - } - morning1{ - before{"12:00"} - from{"06:00"} - } - night1{ - before{"06:00"} - from{"00:00"} - } - } - set92{ - afternoon1{ - before{"18:00"} - from{"12:00"} - } - evening1{ - before{"22:00"} - from{"18:00"} - } - morning1{ - before{"12:00"} - from{"05:00"} - } - night1{ - before{"05:00"} - from{"22:00"} - } - } - set93{ - afternoon1{ - before{"18:00"} - from{"12:00"} - } - evening1{ - before{"24:00"} - from{"18:00"} - } - morning1{ - before{"12:00"} - from{"04:00"} - } - night1{ - before{"04:00"} - from{"00:00"} - } - } - set94{ - afternoon1{ - before{"18:00"} - from{"12:00"} - } - evening1{ - before{"21:00"} - from{"18:00"} - } - morning1{ - before{"12:00"} - from{"04:00"} - } - night1{ - before{"04:00"} - from{"21:00"} - } - } - set95{ - afternoon1{ - before{"18:00"} - from{"12:00"} - } - evening1{ - before{"21:00"} - from{"18:00"} - } - morning1{ - before{"12:00"} - from{"04:00"} - } - night1{ - before{"04:00"} - from{"21:00"} - } - } - set96{ - afternoon1{ - before{"18:00"} - from{"12:00"} - } - evening1{ - before{"21:00"} - from{"18:00"} - } - morning1{ - before{"12:00"} - from{"06:00"} - } - night1{ - before{"06:00"} - from{"21:00"} - } - } - set97{ - afternoon1{ - before{"18:00"} - from{"12:00"} - } - evening1{ - before{"22:00"} - from{"18:00"} - } - morning1{ - before{"10:00"} - from{"06:00"} - } - morning2{ - before{"12:00"} - from{"10:00"} - } - night1{ - before{"06:00"} - from{"22:00"} - } - } - set98{ - afternoon1{ - before{"18:00"} - from{"12:00"} - } - evening1{ - before{"22:00"} - from{"18:00"} - } - morning1{ - before{"09:00"} - from{"04:00"} - } - morning2{ - before{"12:00"} - from{"09:00"} - } - night1{ - before{"04:00"} - from{"22:00"} - } - } - set99{ - afternoon1{ - before{"18:00"} - from{"12:00"} - } - evening1{ - before{"22:00"} - from{"18:00"} - } - morning1{ - before{"09:00"} - from{"04:00"} - } - morning2{ - before{"12:00"} - from{"09:00"} - } - night1{ - before{"04:00"} - from{"22:00"} - } - } - } -} diff --git a/Build/source/libs/icu/icu-src/source/data/misc/genderList.txt b/Build/source/libs/icu/icu-src/source/data/misc/genderList.txt deleted file mode 100644 index e88421b0e9b..00000000000 --- a/Build/source/libs/icu/icu-src/source/data/misc/genderList.txt +++ /dev/null @@ -1,60 +0,0 @@ -// © 2016 and later: Unicode, Inc. and others. -// License & terms of use: http://www.unicode.org/copyright.html#License -genderList:table(nofallback){ - genderList{ - af{"neutral"} - ar{"maleTaints"} - bg{"neutral"} - bn{"neutral"} - ca{"maleTaints"} - cs{"maleTaints"} - da{"neutral"} - de{"neutral"} - el{"mixedNeutral"} - en{"neutral"} - es{"maleTaints"} - et{"neutral"} - eu{"neutral"} - fa{"neutral"} - fi{"neutral"} - fil{"neutral"} - fr{"maleTaints"} - gu{"neutral"} - he{"maleTaints"} - hi{"maleTaints"} - hr{"maleTaints"} - hu{"neutral"} - id{"neutral"} - is{"mixedNeutral"} - it{"maleTaints"} - ja{"neutral"} - kn{"neutral"} - ko{"neutral"} - lt{"maleTaints"} - lv{"maleTaints"} - ml{"neutral"} - mr{"maleTaints"} - ms{"neutral"} - nl{"maleTaints"} - no{"neutral"} - pl{"maleTaints"} - pt{"maleTaints"} - ro{"maleTaints"} - ru{"maleTaints"} - sk{"maleTaints"} - sl{"maleTaints"} - sr{"maleTaints"} - sv{"neutral"} - sw{"neutral"} - ta{"neutral"} - te{"neutral"} - th{"neutral"} - tr{"neutral"} - uk{"maleTaints"} - ur{"maleTaints"} - vi{"neutral"} - zh{"maleTaints"} - zh_Hant{"maleTaints"} - zu{"neutral"} - } -} diff --git a/Build/source/libs/icu/icu-src/source/data/misc/icudata.rc b/Build/source/libs/icu/icu-src/source/data/misc/icudata.rc deleted file mode 100644 index 68bf784d8b4..00000000000 --- a/Build/source/libs/icu/icu-src/source/data/misc/icudata.rc +++ /dev/null @@ -1,69 +0,0 @@ -//Do not edit with Microsoft Developer Studio because it will modify this -//script in the wrong way. -// Copyright (C) 2016 and later: Unicode, Inc. and others. -// License & terms of use: http://www.unicode.org/copyright.html -// Copyright (c) 2001-2010 International Business Machines -// Corporation and others. All Rights Reserved. -// -#define APSTUDIO_READONLY_SYMBOLS -///////////////////////////////////////////////////////////////////////////// -// -// Generated from the TEXTINCLUDE 2 resource. -// -#include "winresrc.h" - -///////////////////////////////////////////////////////////////////////////// -#undef APSTUDIO_READONLY_SYMBOLS - -///////////////////////////////////////////////////////////////////////////// -// - -LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL -#pragma code_page(1252) - -#include "msvcres.h" - -///////////////////////////////////////////////////////////////////////////// -// -// Version -// -#define STR(s) #s -#define CommaVersionString(a, b, c, d) STR(a) ", " STR(b) ", " STR(c) ", " STR(d) "\0" - -VS_VERSION_INFO VERSIONINFO - FILEVERSION U_ICU_VERSION_MAJOR_NUM, U_ICU_VERSION_MINOR_NUM, U_ICU_VERSION_PATCHLEVEL_NUM, U_ICU_VERSION_BUILDLEVEL_NUM - PRODUCTVERSION U_ICU_VERSION_MAJOR_NUM, U_ICU_VERSION_MINOR_NUM, U_ICU_VERSION_PATCHLEVEL_NUM, U_ICU_VERSION_BUILDLEVEL_NUM - FILEFLAGSMASK 0x3fL -#ifdef _DEBUG - FILEFLAGS 0x1L -#else - FILEFLAGS 0x0L -#endif - FILEOS VOS__WINDOWS32 - FILETYPE VFT_DLL - FILESUBTYPE 0x0L -BEGIN - BLOCK "StringFileInfo" - BEGIN - BLOCK "00000000" - BEGIN - VALUE "Comments", ICU_WEBSITE "\0" - VALUE "CompanyName", ICU_COMPANY "\0" - VALUE "FileDescription", ICU_PRODUCT_PREFIX " Data DLL\0" - VALUE "FileVersion", CommaVersionString(U_ICU_VERSION_MAJOR_NUM, U_ICU_VERSION_MINOR_NUM, U_ICU_VERSION_PATCHLEVEL_NUM, U_ICU_VERSION_BUILDLEVEL_NUM) - VALUE "LegalCopyright", U_COPYRIGHT_STRING "\0" - VALUE "OriginalFilename", "icudt" U_ICU_VERSION_SHORT ".dll\0" - VALUE "PrivateBuild", "\0" - VALUE "ProductName", ICU_PRODUCT "\0" - VALUE "ProductVersion", CommaVersionString(U_ICU_VERSION_MAJOR_NUM, U_ICU_VERSION_MINOR_NUM, U_ICU_VERSION_PATCHLEVEL_NUM, U_ICU_VERSION_BUILDLEVEL_NUM) - VALUE "SpecialBuild", "\0" - END - END - BLOCK "VarFileInfo" - BEGIN - VALUE "Translation", 0x000, 0000 - END -END - -///////////////////////////////////////////////////////////////////////////// - diff --git a/Build/source/libs/icu/icu-src/source/data/misc/icustd.txt b/Build/source/libs/icu/icu-src/source/data/misc/icustd.txt deleted file mode 100644 index dcbf71137a1..00000000000 --- a/Build/source/libs/icu/icu-src/source/data/misc/icustd.txt +++ /dev/null @@ -1,11 +0,0 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. -// License & terms of use: http://www.unicode.org/copyright.html -// *************************************************************************** -// * -// * Copyright (C) 2009 International Business Machines -// * Corporation and others. All Rights Reserved. -// * -// *************************************************************************** -icustd:table(nofallback){ - StandardICU{} -} diff --git a/Build/source/libs/icu/icu-src/source/data/misc/icuver.txt b/Build/source/libs/icu/icu-src/source/data/misc/icuver.txt deleted file mode 100644 index 129b439247b..00000000000 --- a/Build/source/libs/icu/icu-src/source/data/misc/icuver.txt +++ /dev/null @@ -1,13 +0,0 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. -// License & terms of use: http://www.unicode.org/copyright.html -// *************************************************************************** -// * -// * Copyright (C) 2010-2016 International Business Machines -// * Corporation and others. All Rights Reserved. -// * -// *************************************************************************** - -icuver:table(nofallback){ - DataVersion { "58.2.0.0" } - ICUVersion { "58.2.0.0" } -} diff --git a/Build/source/libs/icu/icu-src/source/data/misc/keyTypeData.txt b/Build/source/libs/icu/icu-src/source/data/misc/keyTypeData.txt deleted file mode 100644 index 4fc4ba3e705..00000000000 --- a/Build/source/libs/icu/icu-src/source/data/misc/keyTypeData.txt +++ /dev/null @@ -1,700 +0,0 @@ -// © 2016 and later: Unicode, Inc. and others. -// License & terms of use: http://www.unicode.org/copyright.html#License -keyTypeData:table(nofallback){ - bcpTypeAlias{ - ca{ - islamicc{"islamic-civil"} - } - tz:alias{"/ICUDATA/timezoneTypes/bcpTypeAlias/tz"} - } - keyInfo{ - deprecated{ - kh{"true"} - vt{"true"} - } - valueType{ - ca{"incremental"} - kr{"multiple"} - vt{"multiple"} - x0{"any"} - } - } - keyMap{ - calendar{"ca"} - cf{""} - colalternate{"ka"} - colbackwards{"kb"} - colcasefirst{"kf"} - colcaselevel{"kc"} - colhiraganaquaternary{"kh"} - collation{"co"} - colnormalization{"kk"} - colnumeric{"kn"} - colreorder{"kr"} - colstrength{"ks"} - currency{"cu"} - d0{""} - em{""} - fw{""} - hours{"hc"} - i0{""} - k0{""} - kv{""} - lb{""} - lw{""} - m0{""} - measure{"ms"} - numbers{"nu"} - rg{""} - s0{""} - sd{""} - ss{""} - t0{""} - timezone{"tz"} - va{""} - variabletop{"vt"} - x0{""} - } - typeAlias{ - colstrength{ - quarternary{"quaternary"} - } - timezone:alias{"/ICUDATA/timezoneTypes/typeAlias/timezone"} - } - typeInfo{ - deprecated{ - co{ - direct{"true"} - } - tz{ - camtr{"true"} - } - } - } - typeMap{ - calendar{ - buddhist{""} - chinese{""} - coptic{""} - dangi{""} - ethiopic{""} - ethiopic-amete-alem{"ethioaa"} - gregorian{"gregory"} - hebrew{""} - indian{""} - islamic{""} - islamic-civil{""} - islamic-rgsa{""} - islamic-tbla{""} - islamic-umalqura{""} - iso8601{""} - japanese{""} - persian{""} - roc{""} - } - cf{ - account{""} - standard{""} - } - colalternate{ - non-ignorable{"noignore"} - shifted{""} - } - colbackwards{ - no{"false"} - yes{"true"} - } - colcasefirst{ - lower{""} - no{"false"} - upper{""} - } - colcaselevel{ - no{"false"} - yes{"true"} - } - colhiraganaquaternary{ - no{"false"} - yes{"true"} - } - collation{ - big5han{""} - compat{""} - dictionary{"dict"} - direct{""} - ducet{""} - emoji{""} - eor{""} - gb2312han{"gb2312"} - phonebook{"phonebk"} - phonetic{""} - pinyin{""} - reformed{""} - search{""} - searchjl{""} - standard{""} - stroke{""} - traditional{"trad"} - unihan{""} - zhuyin{""} - } - colnormalization{ - no{"false"} - yes{"true"} - } - colnumeric{ - no{"false"} - yes{"true"} - } - colreorder{ - REORDER_CODE{""} - currency{""} - digit{""} - punct{""} - space{""} - symbol{""} - } - colstrength{ - identical{"identic"} - primary{"level1"} - quaternary{"level4"} - secondary{"level2"} - tertiary{"level3"} - } - currency{ - adp{""} - aed{""} - afa{""} - afn{""} - alk{""} - all{""} - amd{""} - ang{""} - aoa{""} - aok{""} - aon{""} - aor{""} - ara{""} - arl{""} - arm{""} - arp{""} - ars{""} - ats{""} - aud{""} - awg{""} - azm{""} - azn{""} - bad{""} - bam{""} - ban{""} - bbd{""} - bdt{""} - bec{""} - bef{""} - bel{""} - bgl{""} - bgm{""} - bgn{""} - bgo{""} - bhd{""} - bif{""} - bmd{""} - bnd{""} - bob{""} - bol{""} - bop{""} - bov{""} - brb{""} - brc{""} - bre{""} - brl{""} - brn{""} - brr{""} - brz{""} - bsd{""} - btn{""} - buk{""} - bwp{""} - byb{""} - byr{""} - bzd{""} - cad{""} - cdf{""} - che{""} - chf{""} - chw{""} - cle{""} - clf{""} - clp{""} - cnx{""} - cny{""} - cop{""} - cou{""} - crc{""} - csd{""} - csk{""} - cuc{""} - cup{""} - cve{""} - cyp{""} - czk{""} - ddm{""} - dem{""} - djf{""} - dkk{""} - dop{""} - dzd{""} - ecs{""} - ecv{""} - eek{""} - egp{""} - ern{""} - esa{""} - esb{""} - esp{""} - etb{""} - eur{""} - fim{""} - fjd{""} - fkp{""} - frf{""} - gbp{""} - gek{""} - gel{""} - ghc{""} - ghs{""} - gip{""} - gmd{""} - gnf{""} - gns{""} - gqe{""} - grd{""} - gtq{""} - gwe{""} - gwp{""} - gyd{""} - hkd{""} - hnl{""} - hrd{""} - hrk{""} - htg{""} - huf{""} - idr{""} - iep{""} - ilp{""} - ilr{""} - ils{""} - inr{""} - iqd{""} - irr{""} - isj{""} - isk{""} - itl{""} - jmd{""} - jod{""} - jpy{""} - kes{""} - kgs{""} - khr{""} - kmf{""} - kpw{""} - krh{""} - kro{""} - krw{""} - kwd{""} - kyd{""} - kzt{""} - lak{""} - lbp{""} - lkr{""} - lrd{""} - lsl{""} - ltl{""} - ltt{""} - luc{""} - luf{""} - lul{""} - lvl{""} - lvr{""} - lyd{""} - mad{""} - maf{""} - mcf{""} - mdc{""} - mdl{""} - mga{""} - mgf{""} - mkd{""} - mkn{""} - mlf{""} - mmk{""} - mnt{""} - mop{""} - mro{""} - mtl{""} - mtp{""} - mur{""} - mvp{""} - mvr{""} - mwk{""} - mxn{""} - mxp{""} - mxv{""} - myr{""} - mze{""} - mzm{""} - mzn{""} - nad{""} - ngn{""} - nic{""} - nio{""} - nlg{""} - nok{""} - npr{""} - nzd{""} - omr{""} - pab{""} - pei{""} - pen{""} - pes{""} - pgk{""} - php{""} - pkr{""} - pln{""} - plz{""} - pte{""} - pyg{""} - qar{""} - rhd{""} - rol{""} - ron{""} - rsd{""} - rub{""} - rur{""} - rwf{""} - sar{""} - sbd{""} - scr{""} - sdd{""} - sdg{""} - sdp{""} - sek{""} - sgd{""} - shp{""} - sit{""} - skk{""} - sll{""} - sos{""} - srd{""} - srg{""} - ssp{""} - std{""} - sur{""} - svc{""} - syp{""} - szl{""} - thb{""} - tjr{""} - tjs{""} - tmm{""} - tmt{""} - tnd{""} - top{""} - tpe{""} - trl{""} - try{""} - ttd{""} - twd{""} - tzs{""} - uah{""} - uak{""} - ugs{""} - ugx{""} - usd{""} - usn{""} - uss{""} - uyi{""} - uyp{""} - uyu{""} - uzs{""} - veb{""} - vef{""} - vnd{""} - vnn{""} - vuv{""} - wst{""} - xaf{""} - xag{""} - xau{""} - xba{""} - xbb{""} - xbc{""} - xbd{""} - xcd{""} - xdr{""} - xeu{""} - xfo{""} - xfu{""} - xof{""} - xpd{""} - xpf{""} - xpt{""} - xre{""} - xsu{""} - xts{""} - xua{""} - xxx{""} - ydd{""} - yer{""} - yud{""} - yum{""} - yun{""} - yur{""} - zal{""} - zar{""} - zmk{""} - zmw{""} - zrn{""} - zrz{""} - zwd{""} - zwl{""} - zwr{""} - } - d0{ - accents{""} - ascii{""} - casefold{""} - digit{""} - fcc{""} - fcd{""} - fullwidth{"fwidth"} - halfwidth{"hwidth"} - hex{""} - lower{""} - name{"charname"} - nfc{""} - nfd{""} - nfkc{""} - nfkd{""} - null{""} - numericPinyin{"npinyin"} - publishing{"publish"} - remove{""} - title{""} - upper{""} - } - em{ - default{""} - emoji{""} - text{""} - } - fw{ - fri{""} - mon{""} - sat{""} - sun{""} - thu{""} - tue{""} - wed{""} - } - hours{ - h11{""} - h12{""} - h23{""} - h24{""} - } - i0{ - handwrit{""} - pinyin{""} - und{""} - wubi{""} - } - k0{ - 101key{""} - 102key{""} - 600dpi{""} - 768dpi{""} - android{""} - azerty{""} - chromeos{""} - colemak{""} - dvorak{""} - dvorakl{""} - dvorakr{""} - el220{""} - el319{""} - extended{""} - googlevk{""} - isiri{""} - legacy{""} - lt1205{""} - lt1582{""} - nutaaq{""} - osx{""} - patta{""} - qwerty{""} - qwertz{""} - ta99{""} - und{""} - var{""} - viqr{""} - windows{""} - } - kv{ - currency{""} - punct{""} - space{""} - symbol{""} - } - lb{ - loose{""} - normal{""} - strict{""} - } - lw{ - breakall{""} - keepall{""} - normal{""} - } - m0{ - alaloc{""} - bgn{""} - buckwalt{""} - c{"c11"} - css{""} - din{""} - gost{""} - iso{""} - java{""} - mcst{""} - mns{""} - names{"prprname"} - percent{""} - perl{""} - plain{""} - satts{""} - ungegn{""} - unicode{""} - xml{""} - xml10{""} - } - measure{ - imperial{"uksystem"} - metric{""} - ussystem{""} - } - numbers{ - adlm{""} - ahom{""} - arab{""} - arabext{""} - armn{""} - armnlow{""} - bali{""} - beng{""} - bhks{""} - brah{""} - cakm{""} - cham{""} - cyrl{""} - deva{""} - ethi{""} - finance{""} - fullwide{""} - geor{""} - grek{""} - greklow{""} - gujr{""} - guru{""} - hanidays{""} - hanidec{""} - hans{""} - hansfin{""} - hant{""} - hantfin{""} - hebr{""} - hmng{""} - java{""} - jpan{""} - jpanfin{""} - kali{""} - khmr{""} - knda{""} - lana{""} - lanatham{""} - laoo{""} - latn{""} - lepc{""} - limb{""} - mathbold{""} - mathdbl{""} - mathmono{""} - mathsanb{""} - mathsans{""} - mlym{""} - modi{""} - mong{""} - mroo{""} - mtei{""} - mymr{""} - mymrshan{""} - mymrtlng{""} - native{""} - newa{""} - nkoo{""} - olck{""} - orya{""} - osma{""} - roman{""} - romanlow{""} - saur{""} - shrd{""} - sind{""} - sinh{""} - sora{""} - sund{""} - takr{""} - talu{""} - taml{""} - tamldec{""} - telu{""} - thai{""} - tibt{""} - tirh{""} - traditional{"traditio"} - vaii{""} - wara{""} - } - rg{ - RG_KEY_VALUE{""} - } - s0{ - accents{""} - ascii{""} - hex{""} - numericPinyin{"npinyin"} - publishing{"publish"} - zawgyi{""} - } - sd{ - SUBDIVISION_CODE{""} - } - ss{ - none{""} - standard{""} - } - t0{ - und{""} - } - timezone:alias{"/ICUDATA/timezoneTypes/typeMap/timezone"} - va{ - posix{""} - } - variabletop{ - CODEPOINTS{""} - } - x0{ - PRIVATE_USE{""} - } - } -} diff --git a/Build/source/libs/icu/icu-src/source/data/misc/likelySubtags.txt b/Build/source/libs/icu/icu-src/source/data/misc/likelySubtags.txt deleted file mode 100644 index 396ab5393e2..00000000000 --- a/Build/source/libs/icu/icu-src/source/data/misc/likelySubtags.txt +++ /dev/null @@ -1,1803 +0,0 @@ -// © 2016 and later: Unicode, Inc. and others. -// License & terms of use: http://www.unicode.org/copyright.html#License -likelySubtags:table(nofallback){ - aa{"aa_Latn_ET"} - aai{"aai_Latn_ZZ"} - aak{"aak_Latn_ZZ"} - aau{"aau_Latn_ZZ"} - ab{"ab_Cyrl_GE"} - abi{"abi_Latn_ZZ"} - abr{"abr_Latn_GH"} - abt{"abt_Latn_ZZ"} - aby{"aby_Latn_ZZ"} - acd{"acd_Latn_ZZ"} - ace{"ace_Latn_ID"} - ach{"ach_Latn_UG"} - ada{"ada_Latn_GH"} - ade{"ade_Latn_ZZ"} - adj{"adj_Latn_ZZ"} - ady{"ady_Cyrl_RU"} - adz{"adz_Latn_ZZ"} - ae{"ae_Avst_IR"} - aeb{"aeb_Arab_TN"} - aey{"aey_Latn_ZZ"} - af{"af_Latn_ZA"} - agc{"agc_Latn_ZZ"} - agd{"agd_Latn_ZZ"} - agg{"agg_Latn_ZZ"} - agm{"agm_Latn_ZZ"} - ago{"ago_Latn_ZZ"} - agq{"agq_Latn_CM"} - aha{"aha_Latn_ZZ"} - ahl{"ahl_Latn_ZZ"} - aho{"aho_Ahom_IN"} - ajg{"ajg_Latn_ZZ"} - ak{"ak_Latn_GH"} - akk{"akk_Xsux_IQ"} - ala{"ala_Latn_ZZ"} - ali{"ali_Latn_ZZ"} - aln{"aln_Latn_XK"} - alt{"alt_Cyrl_RU"} - am{"am_Ethi_ET"} - amm{"amm_Latn_ZZ"} - amn{"amn_Latn_ZZ"} - amo{"amo_Latn_NG"} - amp{"amp_Latn_ZZ"} - anc{"anc_Latn_ZZ"} - ank{"ank_Latn_ZZ"} - ann{"ann_Latn_ZZ"} - any{"any_Latn_ZZ"} - aoj{"aoj_Latn_ZZ"} - aom{"aom_Latn_ZZ"} - aoz{"aoz_Latn_ID"} - apc{"apc_Arab_ZZ"} - apd{"apd_Arab_TG"} - ape{"ape_Latn_ZZ"} - apr{"apr_Latn_ZZ"} - aps{"aps_Latn_ZZ"} - apz{"apz_Latn_ZZ"} - ar{"ar_Arab_EG"} - arc{"arc_Armi_IR"} - arc_Nbat{"arc_Nbat_JO"} - arc_Palm{"arc_Palm_SY"} - arh{"arh_Latn_ZZ"} - arn{"arn_Latn_CL"} - aro{"aro_Latn_BO"} - arq{"arq_Arab_DZ"} - ary{"ary_Arab_MA"} - arz{"arz_Arab_EG"} - as{"as_Beng_IN"} - asa{"asa_Latn_TZ"} - ase{"ase_Sgnw_US"} - asg{"asg_Latn_ZZ"} - aso{"aso_Latn_ZZ"} - ast{"ast_Latn_ES"} - ata{"ata_Latn_ZZ"} - atg{"atg_Latn_ZZ"} - atj{"atj_Latn_CA"} - auy{"auy_Latn_ZZ"} - av{"av_Cyrl_RU"} - avl{"avl_Arab_ZZ"} - avn{"avn_Latn_ZZ"} - avt{"avt_Latn_ZZ"} - avu{"avu_Latn_ZZ"} - awa{"awa_Deva_IN"} - awb{"awb_Latn_ZZ"} - awo{"awo_Latn_ZZ"} - awx{"awx_Latn_ZZ"} - ay{"ay_Latn_BO"} - ayb{"ayb_Latn_ZZ"} - az{"az_Latn_AZ"} - az_Arab{"az_Arab_IR"} - az_IQ{"az_Arab_IQ"} - az_IR{"az_Arab_IR"} - az_RU{"az_Cyrl_RU"} - ba{"ba_Cyrl_RU"} - bal{"bal_Arab_PK"} - ban{"ban_Latn_ID"} - bap{"bap_Deva_NP"} - bar{"bar_Latn_AT"} - bas{"bas_Latn_CM"} - bav{"bav_Latn_ZZ"} - bax{"bax_Bamu_CM"} - bba{"bba_Latn_ZZ"} - bbb{"bbb_Latn_ZZ"} - bbc{"bbc_Latn_ID"} - bbd{"bbd_Latn_ZZ"} - bbj{"bbj_Latn_CM"} - bbp{"bbp_Latn_ZZ"} - bbr{"bbr_Latn_ZZ"} - bcf{"bcf_Latn_ZZ"} - bch{"bch_Latn_ZZ"} - bci{"bci_Latn_CI"} - bcm{"bcm_Latn_ZZ"} - bcn{"bcn_Latn_ZZ"} - bco{"bco_Latn_ZZ"} - bcq{"bcq_Ethi_ZZ"} - bcu{"bcu_Latn_ZZ"} - bdd{"bdd_Latn_ZZ"} - be{"be_Cyrl_BY"} - bef{"bef_Latn_ZZ"} - beh{"beh_Latn_ZZ"} - bej{"bej_Arab_SD"} - bem{"bem_Latn_ZM"} - bet{"bet_Latn_ZZ"} - bew{"bew_Latn_ID"} - bex{"bex_Latn_ZZ"} - bez{"bez_Latn_TZ"} - bfd{"bfd_Latn_CM"} - bfq{"bfq_Taml_IN"} - bft{"bft_Arab_PK"} - bfy{"bfy_Deva_IN"} - bg{"bg_Cyrl_BG"} - bgc{"bgc_Deva_IN"} - bgn{"bgn_Arab_PK"} - bgx{"bgx_Grek_TR"} - bhb{"bhb_Deva_IN"} - bhg{"bhg_Latn_ZZ"} - bhi{"bhi_Deva_IN"} - bhk{"bhk_Latn_PH"} - bhl{"bhl_Latn_ZZ"} - bho{"bho_Deva_IN"} - bhy{"bhy_Latn_ZZ"} - bi{"bi_Latn_VU"} - bib{"bib_Latn_ZZ"} - big{"big_Latn_ZZ"} - bik{"bik_Latn_PH"} - bim{"bim_Latn_ZZ"} - bin{"bin_Latn_NG"} - bio{"bio_Latn_ZZ"} - biq{"biq_Latn_ZZ"} - bjh{"bjh_Latn_ZZ"} - bji{"bji_Ethi_ZZ"} - bjj{"bjj_Deva_IN"} - bjn{"bjn_Latn_ID"} - bjo{"bjo_Latn_ZZ"} - bjr{"bjr_Latn_ZZ"} - bjz{"bjz_Latn_ZZ"} - bkc{"bkc_Latn_ZZ"} - bkm{"bkm_Latn_CM"} - bkq{"bkq_Latn_ZZ"} - bku{"bku_Latn_PH"} - bkv{"bkv_Latn_ZZ"} - blt{"blt_Tavt_VN"} - bm{"bm_Latn_ML"} - bmh{"bmh_Latn_ZZ"} - bmk{"bmk_Latn_ZZ"} - bmq{"bmq_Latn_ML"} - bmu{"bmu_Latn_ZZ"} - bn{"bn_Beng_BD"} - bng{"bng_Latn_ZZ"} - bnm{"bnm_Latn_ZZ"} - bnp{"bnp_Latn_ZZ"} - bo{"bo_Tibt_CN"} - boj{"boj_Latn_ZZ"} - bom{"bom_Latn_ZZ"} - bon{"bon_Latn_ZZ"} - bpy{"bpy_Beng_IN"} - bqc{"bqc_Latn_ZZ"} - bqi{"bqi_Arab_IR"} - bqp{"bqp_Latn_ZZ"} - bqv{"bqv_Latn_CI"} - br{"br_Latn_FR"} - bra{"bra_Deva_IN"} - brh{"brh_Arab_PK"} - brx{"brx_Deva_IN"} - brz{"brz_Latn_ZZ"} - bs{"bs_Latn_BA"} - bsj{"bsj_Latn_ZZ"} - bsq{"bsq_Bass_LR"} - bss{"bss_Latn_CM"} - bst{"bst_Ethi_ZZ"} - bto{"bto_Latn_PH"} - btt{"btt_Latn_ZZ"} - btv{"btv_Deva_PK"} - bua{"bua_Cyrl_RU"} - buc{"buc_Latn_YT"} - bud{"bud_Latn_ZZ"} - bug{"bug_Latn_ID"} - buk{"buk_Latn_ZZ"} - bum{"bum_Latn_CM"} - buo{"buo_Latn_ZZ"} - bus{"bus_Latn_ZZ"} - buu{"buu_Latn_ZZ"} - bvb{"bvb_Latn_GQ"} - bwd{"bwd_Latn_ZZ"} - bwr{"bwr_Latn_ZZ"} - bxh{"bxh_Latn_ZZ"} - bye{"bye_Latn_ZZ"} - byn{"byn_Ethi_ER"} - byr{"byr_Latn_ZZ"} - bys{"bys_Latn_ZZ"} - byv{"byv_Latn_CM"} - byx{"byx_Latn_ZZ"} - bza{"bza_Latn_ZZ"} - bze{"bze_Latn_ML"} - bzf{"bzf_Latn_ZZ"} - bzh{"bzh_Latn_ZZ"} - bzw{"bzw_Latn_ZZ"} - ca{"ca_Latn_ES"} - can{"can_Latn_ZZ"} - cbj{"cbj_Latn_ZZ"} - cch{"cch_Latn_NG"} - ccp{"ccp_Beng_IN"} - ccp_Cakm{"ccp_Cakm_BD"} - ce{"ce_Cyrl_RU"} - ceb{"ceb_Latn_PH"} - cfa{"cfa_Latn_ZZ"} - cgg{"cgg_Latn_UG"} - ch{"ch_Latn_GU"} - chk{"chk_Latn_FM"} - chm{"chm_Cyrl_RU"} - cho{"cho_Latn_US"} - chp{"chp_Latn_CA"} - chr{"chr_Cher_US"} - cja{"cja_Arab_KH"} - cjm{"cjm_Cham_VN"} - cjv{"cjv_Latn_ZZ"} - ckb{"ckb_Arab_IQ"} - ckl{"ckl_Latn_ZZ"} - cko{"cko_Latn_ZZ"} - cky{"cky_Latn_ZZ"} - cla{"cla_Latn_ZZ"} - cme{"cme_Latn_ZZ"} - co{"co_Latn_FR"} - cop{"cop_Copt_EG"} - cps{"cps_Latn_PH"} - cr{"cr_Cans_CA"} - crj{"crj_Cans_CA"} - crk{"crk_Cans_CA"} - crl{"crl_Cans_CA"} - crm{"crm_Cans_CA"} - crs{"crs_Latn_SC"} - cs{"cs_Latn_CZ"} - csb{"csb_Latn_PL"} - csw{"csw_Cans_CA"} - ctd{"ctd_Pauc_MM"} - cu{"cu_Cyrl_RU"} - cu_Glag{"cu_Glag_BG"} - cv{"cv_Cyrl_RU"} - cy{"cy_Latn_GB"} - da{"da_Latn_DK"} - dad{"dad_Latn_ZZ"} - daf{"daf_Latn_ZZ"} - dag{"dag_Latn_ZZ"} - dah{"dah_Latn_ZZ"} - dak{"dak_Latn_US"} - dar{"dar_Cyrl_RU"} - dav{"dav_Latn_KE"} - dbd{"dbd_Latn_ZZ"} - dbq{"dbq_Latn_ZZ"} - dcc{"dcc_Arab_IN"} - ddn{"ddn_Latn_ZZ"} - de{"de_Latn_DE"} - ded{"ded_Latn_ZZ"} - den{"den_Latn_CA"} - dga{"dga_Latn_ZZ"} - dgh{"dgh_Latn_ZZ"} - dgi{"dgi_Latn_ZZ"} - dgl{"dgl_Arab_ZZ"} - dgr{"dgr_Latn_CA"} - dgz{"dgz_Latn_ZZ"} - dia{"dia_Latn_ZZ"} - dje{"dje_Latn_NE"} - dnj{"dnj_Latn_CI"} - dob{"dob_Latn_ZZ"} - doi{"doi_Arab_IN"} - dop{"dop_Latn_ZZ"} - dow{"dow_Latn_ZZ"} - dri{"dri_Latn_ZZ"} - drs{"drs_Ethi_ZZ"} - dsb{"dsb_Latn_DE"} - dtm{"dtm_Latn_ML"} - dtp{"dtp_Latn_MY"} - dts{"dts_Latn_ZZ"} - dty{"dty_Deva_NP"} - dua{"dua_Latn_CM"} - duc{"duc_Latn_ZZ"} - dud{"dud_Latn_ZZ"} - dug{"dug_Latn_ZZ"} - dv{"dv_Thaa_MV"} - dva{"dva_Latn_ZZ"} - dww{"dww_Latn_ZZ"} - dyo{"dyo_Latn_SN"} - dyu{"dyu_Latn_BF"} - dz{"dz_Tibt_BT"} - dzg{"dzg_Latn_ZZ"} - ebu{"ebu_Latn_KE"} - ee{"ee_Latn_GH"} - efi{"efi_Latn_NG"} - egl{"egl_Latn_IT"} - egy{"egy_Egyp_EG"} - eky{"eky_Kali_MM"} - el{"el_Grek_GR"} - ema{"ema_Latn_ZZ"} - emi{"emi_Latn_ZZ"} - en{"en_Latn_US"} - en_Shaw{"en_Shaw_GB"} - enn{"enn_Latn_ZZ"} - enq{"enq_Latn_ZZ"} - eo{"eo_Latn_001"} - eri{"eri_Latn_ZZ"} - es{"es_Latn_ES"} - esu{"esu_Latn_US"} - et{"et_Latn_EE"} - etr{"etr_Latn_ZZ"} - ett{"ett_Ital_IT"} - etu{"etu_Latn_ZZ"} - etx{"etx_Latn_ZZ"} - eu{"eu_Latn_ES"} - ewo{"ewo_Latn_CM"} - ext{"ext_Latn_ES"} - fa{"fa_Arab_IR"} - faa{"faa_Latn_ZZ"} - fab{"fab_Latn_ZZ"} - fag{"fag_Latn_ZZ"} - fai{"fai_Latn_ZZ"} - fan{"fan_Latn_GQ"} - ff{"ff_Latn_SN"} - ff_Adlm{"ff_Adlm_GN"} - ffi{"ffi_Latn_ZZ"} - ffm{"ffm_Latn_ML"} - fi{"fi_Latn_FI"} - fia{"fia_Arab_SD"} - fil{"fil_Latn_PH"} - fit{"fit_Latn_SE"} - fj{"fj_Latn_FJ"} - flr{"flr_Latn_ZZ"} - fmp{"fmp_Latn_ZZ"} - fo{"fo_Latn_FO"} - fod{"fod_Latn_ZZ"} - fon{"fon_Latn_BJ"} - for{"for_Latn_ZZ"} - fpe{"fpe_Latn_ZZ"} - fqs{"fqs_Latn_ZZ"} - fr{"fr_Latn_FR"} - frc{"frc_Latn_US"} - frp{"frp_Latn_FR"} - frr{"frr_Latn_DE"} - frs{"frs_Latn_DE"} - fub{"fub_Arab_CM"} - fud{"fud_Latn_WF"} - fue{"fue_Latn_ZZ"} - fuf{"fuf_Latn_GN"} - fuh{"fuh_Latn_ZZ"} - fuq{"fuq_Latn_NE"} - fur{"fur_Latn_IT"} - fuv{"fuv_Latn_NG"} - fuy{"fuy_Latn_ZZ"} - fvr{"fvr_Latn_SD"} - fy{"fy_Latn_NL"} - ga{"ga_Latn_IE"} - gaa{"gaa_Latn_GH"} - gaf{"gaf_Latn_ZZ"} - gag{"gag_Latn_MD"} - gah{"gah_Latn_ZZ"} - gaj{"gaj_Latn_ZZ"} - gam{"gam_Latn_ZZ"} - gan{"gan_Hans_CN"} - gaw{"gaw_Latn_ZZ"} - gay{"gay_Latn_ID"} - gbf{"gbf_Latn_ZZ"} - gbm{"gbm_Deva_IN"} - gby{"gby_Latn_ZZ"} - gbz{"gbz_Arab_IR"} - gcr{"gcr_Latn_GF"} - gd{"gd_Latn_GB"} - gde{"gde_Latn_ZZ"} - gdn{"gdn_Latn_ZZ"} - gdr{"gdr_Latn_ZZ"} - geb{"geb_Latn_ZZ"} - gej{"gej_Latn_ZZ"} - gel{"gel_Latn_ZZ"} - gez{"gez_Ethi_ET"} - gfk{"gfk_Latn_ZZ"} - ggn{"ggn_Deva_NP"} - ghs{"ghs_Latn_ZZ"} - gil{"gil_Latn_KI"} - gim{"gim_Latn_ZZ"} - gjk{"gjk_Arab_PK"} - gjn{"gjn_Latn_ZZ"} - gju{"gju_Arab_PK"} - gkn{"gkn_Latn_ZZ"} - gkp{"gkp_Latn_ZZ"} - gl{"gl_Latn_ES"} - glk{"glk_Arab_IR"} - gmm{"gmm_Latn_ZZ"} - gmv{"gmv_Ethi_ZZ"} - gn{"gn_Latn_PY"} - gnd{"gnd_Latn_ZZ"} - gng{"gng_Latn_ZZ"} - god{"god_Latn_ZZ"} - gof{"gof_Ethi_ZZ"} - goi{"goi_Latn_ZZ"} - gom{"gom_Deva_IN"} - gon{"gon_Telu_IN"} - gor{"gor_Latn_ID"} - gos{"gos_Latn_NL"} - got{"got_Goth_UA"} - grc{"grc_Cprt_CY"} - grc_Linb{"grc_Linb_GR"} - grt{"grt_Beng_IN"} - grw{"grw_Latn_ZZ"} - gsw{"gsw_Latn_CH"} - gu{"gu_Gujr_IN"} - gub{"gub_Latn_BR"} - guc{"guc_Latn_CO"} - gud{"gud_Latn_ZZ"} - gur{"gur_Latn_GH"} - guw{"guw_Latn_ZZ"} - gux{"gux_Latn_ZZ"} - guz{"guz_Latn_KE"} - gv{"gv_Latn_IM"} - gvf{"gvf_Latn_ZZ"} - gvr{"gvr_Deva_NP"} - gvs{"gvs_Latn_ZZ"} - gwc{"gwc_Arab_ZZ"} - gwi{"gwi_Latn_CA"} - gwt{"gwt_Arab_ZZ"} - gyi{"gyi_Latn_ZZ"} - ha{"ha_Latn_NG"} - ha_CM{"ha_Arab_CM"} - ha_SD{"ha_Arab_SD"} - hag{"hag_Latn_ZZ"} - hak{"hak_Hans_CN"} - ham{"ham_Latn_ZZ"} - haw{"haw_Latn_US"} - haz{"haz_Arab_AF"} - hbb{"hbb_Latn_ZZ"} - hdy{"hdy_Ethi_ZZ"} - he{"he_Hebr_IL"} - hhy{"hhy_Latn_ZZ"} - hi{"hi_Deva_IN"} - hia{"hia_Latn_ZZ"} - hif{"hif_Latn_FJ"} - hig{"hig_Latn_ZZ"} - hih{"hih_Latn_ZZ"} - hil{"hil_Latn_PH"} - hla{"hla_Latn_ZZ"} - hlu{"hlu_Hluw_TR"} - hmd{"hmd_Plrd_CN"} - hmt{"hmt_Latn_ZZ"} - hnd{"hnd_Arab_PK"} - hne{"hne_Deva_IN"} - hnj{"hnj_Hmng_LA"} - hnn{"hnn_Latn_PH"} - hno{"hno_Arab_PK"} - ho{"ho_Latn_PG"} - hoc{"hoc_Deva_IN"} - hoj{"hoj_Deva_IN"} - hot{"hot_Latn_ZZ"} - hr{"hr_Latn_HR"} - hsb{"hsb_Latn_DE"} - hsn{"hsn_Hans_CN"} - ht{"ht_Latn_HT"} - hu{"hu_Latn_HU"} - hui{"hui_Latn_ZZ"} - hy{"hy_Armn_AM"} - hz{"hz_Latn_NA"} - ia{"ia_Latn_FR"} - ian{"ian_Latn_ZZ"} - iar{"iar_Latn_ZZ"} - iba{"iba_Latn_MY"} - ibb{"ibb_Latn_NG"} - iby{"iby_Latn_ZZ"} - ica{"ica_Latn_ZZ"} - ich{"ich_Latn_ZZ"} - id{"id_Latn_ID"} - idd{"idd_Latn_ZZ"} - idi{"idi_Latn_ZZ"} - idu{"idu_Latn_ZZ"} - ig{"ig_Latn_NG"} - igb{"igb_Latn_ZZ"} - ige{"ige_Latn_ZZ"} - ii{"ii_Yiii_CN"} - ijj{"ijj_Latn_ZZ"} - ik{"ik_Latn_US"} - ikk{"ikk_Latn_ZZ"} - ikt{"ikt_Latn_CA"} - ikw{"ikw_Latn_ZZ"} - ikx{"ikx_Latn_ZZ"} - ilo{"ilo_Latn_PH"} - imo{"imo_Latn_ZZ"} - in{"in_Latn_ID"} - inh{"inh_Cyrl_RU"} - iou{"iou_Latn_ZZ"} - iri{"iri_Latn_ZZ"} - is{"is_Latn_IS"} - it{"it_Latn_IT"} - iu{"iu_Cans_CA"} - iw{"iw_Hebr_IL"} - iwm{"iwm_Latn_ZZ"} - iws{"iws_Latn_ZZ"} - izh{"izh_Latn_RU"} - izi{"izi_Latn_ZZ"} - ja{"ja_Jpan_JP"} - jab{"jab_Latn_ZZ"} - jam{"jam_Latn_JM"} - jbu{"jbu_Latn_ZZ"} - jen{"jen_Latn_ZZ"} - jgk{"jgk_Latn_ZZ"} - jgo{"jgo_Latn_CM"} - ji{"ji_Hebr_UA"} - jib{"jib_Latn_ZZ"} - jmc{"jmc_Latn_TZ"} - jml{"jml_Deva_NP"} - jra{"jra_Latn_ZZ"} - jut{"jut_Latn_DK"} - jv{"jv_Latn_ID"} - jw{"jw_Latn_ID"} - ka{"ka_Geor_GE"} - kaa{"kaa_Cyrl_UZ"} - kab{"kab_Latn_DZ"} - kac{"kac_Latn_MM"} - kad{"kad_Latn_ZZ"} - kai{"kai_Latn_ZZ"} - kaj{"kaj_Latn_NG"} - kam{"kam_Latn_KE"} - kao{"kao_Latn_ML"} - kbd{"kbd_Cyrl_RU"} - kbm{"kbm_Latn_ZZ"} - kbp{"kbp_Latn_ZZ"} - kbq{"kbq_Latn_ZZ"} - kbx{"kbx_Latn_ZZ"} - kby{"kby_Arab_NE"} - kcg{"kcg_Latn_NG"} - kck{"kck_Latn_ZW"} - kcl{"kcl_Latn_ZZ"} - kct{"kct_Latn_ZZ"} - kde{"kde_Latn_TZ"} - kdh{"kdh_Arab_TG"} - kdl{"kdl_Latn_ZZ"} - kdt{"kdt_Thai_TH"} - kea{"kea_Latn_CV"} - ken{"ken_Latn_CM"} - kez{"kez_Latn_ZZ"} - kfo{"kfo_Latn_CI"} - kfr{"kfr_Deva_IN"} - kfy{"kfy_Deva_IN"} - kg{"kg_Latn_CD"} - kge{"kge_Latn_ID"} - kgf{"kgf_Latn_ZZ"} - kgp{"kgp_Latn_BR"} - kha{"kha_Latn_IN"} - khb{"khb_Talu_CN"} - khn{"khn_Deva_IN"} - khq{"khq_Latn_ML"} - khs{"khs_Latn_ZZ"} - kht{"kht_Mymr_IN"} - khw{"khw_Arab_PK"} - khz{"khz_Latn_ZZ"} - ki{"ki_Latn_KE"} - kij{"kij_Latn_ZZ"} - kiu{"kiu_Latn_TR"} - kiw{"kiw_Latn_ZZ"} - kj{"kj_Latn_NA"} - kjd{"kjd_Latn_ZZ"} - kjg{"kjg_Laoo_LA"} - kjs{"kjs_Latn_ZZ"} - kjy{"kjy_Latn_ZZ"} - kk{"kk_Cyrl_KZ"} - kk_AF{"kk_Arab_AF"} - kk_Arab{"kk_Arab_CN"} - kk_CN{"kk_Arab_CN"} - kk_IR{"kk_Arab_IR"} - kk_MN{"kk_Arab_MN"} - kkc{"kkc_Latn_ZZ"} - kkj{"kkj_Latn_CM"} - kl{"kl_Latn_GL"} - kln{"kln_Latn_KE"} - klq{"klq_Latn_ZZ"} - klt{"klt_Latn_ZZ"} - klx{"klx_Latn_ZZ"} - km{"km_Khmr_KH"} - kmb{"kmb_Latn_AO"} - kmh{"kmh_Latn_ZZ"} - kmo{"kmo_Latn_ZZ"} - kms{"kms_Latn_ZZ"} - kmu{"kmu_Latn_ZZ"} - kmw{"kmw_Latn_ZZ"} - kn{"kn_Knda_IN"} - knp{"knp_Latn_ZZ"} - ko{"ko_Kore_KR"} - koi{"koi_Cyrl_RU"} - kok{"kok_Deva_IN"} - kol{"kol_Latn_ZZ"} - kos{"kos_Latn_FM"} - koz{"koz_Latn_ZZ"} - kpe{"kpe_Latn_LR"} - kpf{"kpf_Latn_ZZ"} - kpo{"kpo_Latn_ZZ"} - kpr{"kpr_Latn_ZZ"} - kpx{"kpx_Latn_ZZ"} - kqb{"kqb_Latn_ZZ"} - kqf{"kqf_Latn_ZZ"} - kqs{"kqs_Latn_ZZ"} - kqy{"kqy_Ethi_ZZ"} - krc{"krc_Cyrl_RU"} - kri{"kri_Latn_SL"} - krj{"krj_Latn_PH"} - krl{"krl_Latn_RU"} - krs{"krs_Latn_ZZ"} - kru{"kru_Deva_IN"} - ks{"ks_Arab_IN"} - ksb{"ksb_Latn_TZ"} - ksd{"ksd_Latn_ZZ"} - ksf{"ksf_Latn_CM"} - ksh{"ksh_Latn_DE"} - ksj{"ksj_Latn_ZZ"} - ksr{"ksr_Latn_ZZ"} - ktb{"ktb_Ethi_ZZ"} - ktm{"ktm_Latn_ZZ"} - kto{"kto_Latn_ZZ"} - ku{"ku_Latn_TR"} - ku_Arab{"ku_Arab_IQ"} - ku_LB{"ku_Arab_LB"} - kub{"kub_Latn_ZZ"} - kud{"kud_Latn_ZZ"} - kue{"kue_Latn_ZZ"} - kuj{"kuj_Latn_ZZ"} - kum{"kum_Cyrl_RU"} - kun{"kun_Latn_ZZ"} - kup{"kup_Latn_ZZ"} - kus{"kus_Latn_ZZ"} - kv{"kv_Cyrl_RU"} - kvg{"kvg_Latn_ZZ"} - kvr{"kvr_Latn_ID"} - kvx{"kvx_Arab_PK"} - kw{"kw_Latn_GB"} - kwj{"kwj_Latn_ZZ"} - kwo{"kwo_Latn_ZZ"} - kxa{"kxa_Latn_ZZ"} - kxc{"kxc_Ethi_ZZ"} - kxm{"kxm_Thai_TH"} - kxp{"kxp_Arab_PK"} - kxw{"kxw_Latn_ZZ"} - kxz{"kxz_Latn_ZZ"} - ky{"ky_Cyrl_KG"} - ky_Arab{"ky_Arab_CN"} - ky_CN{"ky_Arab_CN"} - ky_Latn{"ky_Latn_TR"} - ky_TR{"ky_Latn_TR"} - kye{"kye_Latn_ZZ"} - kyx{"kyx_Latn_ZZ"} - kzr{"kzr_Latn_ZZ"} - la{"la_Latn_VA"} - lab{"lab_Lina_GR"} - lad{"lad_Hebr_IL"} - lag{"lag_Latn_TZ"} - lah{"lah_Arab_PK"} - laj{"laj_Latn_UG"} - las{"las_Latn_ZZ"} - lb{"lb_Latn_LU"} - lbe{"lbe_Cyrl_RU"} - lbu{"lbu_Latn_ZZ"} - lbw{"lbw_Latn_ID"} - lcm{"lcm_Latn_ZZ"} - lcp{"lcp_Thai_CN"} - ldb{"ldb_Latn_ZZ"} - led{"led_Latn_ZZ"} - lee{"lee_Latn_ZZ"} - lem{"lem_Latn_ZZ"} - lep{"lep_Lepc_IN"} - leq{"leq_Latn_ZZ"} - leu{"leu_Latn_ZZ"} - lez{"lez_Cyrl_RU"} - lg{"lg_Latn_UG"} - lgg{"lgg_Latn_ZZ"} - li{"li_Latn_NL"} - lia{"lia_Latn_ZZ"} - lid{"lid_Latn_ZZ"} - lif{"lif_Deva_NP"} - lif_Limb{"lif_Limb_IN"} - lig{"lig_Latn_ZZ"} - lih{"lih_Latn_ZZ"} - lij{"lij_Latn_IT"} - lis{"lis_Lisu_CN"} - ljp{"ljp_Latn_ID"} - lki{"lki_Arab_IR"} - lkt{"lkt_Latn_US"} - lle{"lle_Latn_ZZ"} - lln{"lln_Latn_ZZ"} - lmn{"lmn_Telu_IN"} - lmo{"lmo_Latn_IT"} - lmp{"lmp_Latn_ZZ"} - ln{"ln_Latn_CD"} - lns{"lns_Latn_ZZ"} - lnu{"lnu_Latn_ZZ"} - lo{"lo_Laoo_LA"} - loj{"loj_Latn_ZZ"} - lok{"lok_Latn_ZZ"} - lol{"lol_Latn_CD"} - lor{"lor_Latn_ZZ"} - los{"los_Latn_ZZ"} - loz{"loz_Latn_ZM"} - lrc{"lrc_Arab_IR"} - lt{"lt_Latn_LT"} - ltg{"ltg_Latn_LV"} - lu{"lu_Latn_CD"} - lua{"lua_Latn_CD"} - luo{"luo_Latn_KE"} - luy{"luy_Latn_KE"} - luz{"luz_Arab_IR"} - lv{"lv_Latn_LV"} - lwl{"lwl_Thai_TH"} - lzh{"lzh_Hans_CN"} - lzz{"lzz_Latn_TR"} - mad{"mad_Latn_ID"} - maf{"maf_Latn_CM"} - mag{"mag_Deva_IN"} - mai{"mai_Deva_IN"} - mak{"mak_Latn_ID"} - man{"man_Latn_GM"} - man_GN{"man_Nkoo_GN"} - man_Nkoo{"man_Nkoo_GN"} - mas{"mas_Latn_KE"} - maw{"maw_Latn_ZZ"} - maz{"maz_Latn_MX"} - mbh{"mbh_Latn_ZZ"} - mbo{"mbo_Latn_ZZ"} - mbq{"mbq_Latn_ZZ"} - mbu{"mbu_Latn_ZZ"} - mbw{"mbw_Latn_ZZ"} - mci{"mci_Latn_ZZ"} - mcp{"mcp_Latn_ZZ"} - mcq{"mcq_Latn_ZZ"} - mcr{"mcr_Latn_ZZ"} - mcu{"mcu_Latn_ZZ"} - mda{"mda_Latn_ZZ"} - mde{"mde_Arab_ZZ"} - mdf{"mdf_Cyrl_RU"} - mdh{"mdh_Latn_PH"} - mdj{"mdj_Latn_ZZ"} - mdr{"mdr_Latn_ID"} - mdx{"mdx_Ethi_ZZ"} - med{"med_Latn_ZZ"} - mee{"mee_Latn_ZZ"} - mek{"mek_Latn_ZZ"} - men{"men_Latn_SL"} - mer{"mer_Latn_KE"} - met{"met_Latn_ZZ"} - meu{"meu_Latn_ZZ"} - mfa{"mfa_Arab_TH"} - mfe{"mfe_Latn_MU"} - mfn{"mfn_Latn_ZZ"} - mfo{"mfo_Latn_ZZ"} - mfq{"mfq_Latn_ZZ"} - mg{"mg_Latn_MG"} - mgh{"mgh_Latn_MZ"} - mgl{"mgl_Latn_ZZ"} - mgo{"mgo_Latn_CM"} - mgp{"mgp_Deva_NP"} - mgy{"mgy_Latn_TZ"} - mh{"mh_Latn_MH"} - mhi{"mhi_Latn_ZZ"} - mhl{"mhl_Latn_ZZ"} - mi{"mi_Latn_NZ"} - mif{"mif_Latn_ZZ"} - min{"min_Latn_ID"} - mis{"mis_Hatr_IQ"} - miw{"miw_Latn_ZZ"} - mk{"mk_Cyrl_MK"} - mki{"mki_Arab_ZZ"} - mkl{"mkl_Latn_ZZ"} - mkp{"mkp_Latn_ZZ"} - mkw{"mkw_Latn_ZZ"} - ml{"ml_Mlym_IN"} - mle{"mle_Latn_ZZ"} - mlp{"mlp_Latn_ZZ"} - mls{"mls_Latn_SD"} - mmo{"mmo_Latn_ZZ"} - mmu{"mmu_Latn_ZZ"} - mmx{"mmx_Latn_ZZ"} - mn{"mn_Cyrl_MN"} - mn_CN{"mn_Mong_CN"} - mn_Mong{"mn_Mong_CN"} - mna{"mna_Latn_ZZ"} - mnf{"mnf_Latn_ZZ"} - mni{"mni_Beng_IN"} - mnw{"mnw_Mymr_MM"} - moa{"moa_Latn_ZZ"} - moe{"moe_Latn_CA"} - moh{"moh_Latn_CA"} - mos{"mos_Latn_BF"} - mox{"mox_Latn_ZZ"} - mpp{"mpp_Latn_ZZ"} - mps{"mps_Latn_ZZ"} - mpt{"mpt_Latn_ZZ"} - mpx{"mpx_Latn_ZZ"} - mql{"mql_Latn_ZZ"} - mr{"mr_Deva_IN"} - mrd{"mrd_Deva_NP"} - mrj{"mrj_Cyrl_RU"} - mro{"mro_Mroo_BD"} - ms{"ms_Latn_MY"} - ms_CC{"ms_Arab_CC"} - ms_ID{"ms_Arab_ID"} - mt{"mt_Latn_MT"} - mtc{"mtc_Latn_ZZ"} - mtf{"mtf_Latn_ZZ"} - mti{"mti_Latn_ZZ"} - mtr{"mtr_Deva_IN"} - mua{"mua_Latn_CM"} - mur{"mur_Latn_ZZ"} - mus{"mus_Latn_US"} - mva{"mva_Latn_ZZ"} - mvn{"mvn_Latn_ZZ"} - mvy{"mvy_Arab_PK"} - mwk{"mwk_Latn_ML"} - mwr{"mwr_Deva_IN"} - mwv{"mwv_Latn_ID"} - mxc{"mxc_Latn_ZW"} - mxm{"mxm_Latn_ZZ"} - my{"my_Mymr_MM"} - myk{"myk_Latn_ZZ"} - mym{"mym_Ethi_ZZ"} - myv{"myv_Cyrl_RU"} - myw{"myw_Latn_ZZ"} - myx{"myx_Latn_UG"} - myz{"myz_Mand_IR"} - mzk{"mzk_Latn_ZZ"} - mzm{"mzm_Latn_ZZ"} - mzn{"mzn_Arab_IR"} - mzp{"mzp_Latn_ZZ"} - mzw{"mzw_Latn_ZZ"} - mzz{"mzz_Latn_ZZ"} - na{"na_Latn_NR"} - nac{"nac_Latn_ZZ"} - naf{"naf_Latn_ZZ"} - nak{"nak_Latn_ZZ"} - nan{"nan_Hans_CN"} - nap{"nap_Latn_IT"} - naq{"naq_Latn_NA"} - nas{"nas_Latn_ZZ"} - nb{"nb_Latn_NO"} - nca{"nca_Latn_ZZ"} - nce{"nce_Latn_ZZ"} - ncf{"ncf_Latn_ZZ"} - nch{"nch_Latn_MX"} - nco{"nco_Latn_ZZ"} - ncu{"ncu_Latn_ZZ"} - nd{"nd_Latn_ZW"} - ndc{"ndc_Latn_MZ"} - nds{"nds_Latn_DE"} - ne{"ne_Deva_NP"} - neb{"neb_Latn_ZZ"} - new{"new_Deva_NP"} - nex{"nex_Latn_ZZ"} - nfr{"nfr_Latn_ZZ"} - ng{"ng_Latn_NA"} - nga{"nga_Latn_ZZ"} - ngb{"ngb_Latn_ZZ"} - ngl{"ngl_Latn_MZ"} - nhb{"nhb_Latn_ZZ"} - nhe{"nhe_Latn_MX"} - nhw{"nhw_Latn_MX"} - nif{"nif_Latn_ZZ"} - nii{"nii_Latn_ZZ"} - nij{"nij_Latn_ID"} - nin{"nin_Latn_ZZ"} - niu{"niu_Latn_NU"} - niy{"niy_Latn_ZZ"} - niz{"niz_Latn_ZZ"} - njo{"njo_Latn_IN"} - nkg{"nkg_Latn_ZZ"} - nko{"nko_Latn_ZZ"} - nl{"nl_Latn_NL"} - nmg{"nmg_Latn_CM"} - nmz{"nmz_Latn_ZZ"} - nn{"nn_Latn_NO"} - nnf{"nnf_Latn_ZZ"} - nnh{"nnh_Latn_CM"} - nnk{"nnk_Latn_ZZ"} - nnm{"nnm_Latn_ZZ"} - no{"no_Latn_NO"} - nod{"nod_Lana_TH"} - noe{"noe_Deva_IN"} - non{"non_Runr_SE"} - nop{"nop_Latn_ZZ"} - nou{"nou_Latn_ZZ"} - nqo{"nqo_Nkoo_GN"} - nr{"nr_Latn_ZA"} - nrb{"nrb_Latn_ZZ"} - nsk{"nsk_Cans_CA"} - nsn{"nsn_Latn_ZZ"} - nso{"nso_Latn_ZA"} - nss{"nss_Latn_ZZ"} - ntm{"ntm_Latn_ZZ"} - ntr{"ntr_Latn_ZZ"} - nui{"nui_Latn_ZZ"} - nup{"nup_Latn_ZZ"} - nus{"nus_Latn_SS"} - nuv{"nuv_Latn_ZZ"} - nux{"nux_Latn_ZZ"} - nv{"nv_Latn_US"} - nwb{"nwb_Latn_ZZ"} - nxq{"nxq_Latn_CN"} - nxr{"nxr_Latn_ZZ"} - ny{"ny_Latn_MW"} - nym{"nym_Latn_TZ"} - nyn{"nyn_Latn_UG"} - nzi{"nzi_Latn_GH"} - oc{"oc_Latn_FR"} - ogc{"ogc_Latn_ZZ"} - okr{"okr_Latn_ZZ"} - okv{"okv_Latn_ZZ"} - om{"om_Latn_ET"} - ong{"ong_Latn_ZZ"} - onn{"onn_Latn_ZZ"} - ons{"ons_Latn_ZZ"} - opm{"opm_Latn_ZZ"} - or{"or_Orya_IN"} - oro{"oro_Latn_ZZ"} - oru{"oru_Arab_ZZ"} - os{"os_Cyrl_GE"} - osa{"osa_Osge_US"} - ota{"ota_Arab_ZZ"} - otk{"otk_Orkh_MN"} - ozm{"ozm_Latn_ZZ"} - pa{"pa_Guru_IN"} - pa_Arab{"pa_Arab_PK"} - pa_PK{"pa_Arab_PK"} - pag{"pag_Latn_PH"} - pal{"pal_Phli_IR"} - pal_Phlp{"pal_Phlp_CN"} - pam{"pam_Latn_PH"} - pap{"pap_Latn_AW"} - pau{"pau_Latn_PW"} - pbi{"pbi_Latn_ZZ"} - pcd{"pcd_Latn_FR"} - pcm{"pcm_Latn_NG"} - pdc{"pdc_Latn_US"} - pdt{"pdt_Latn_CA"} - ped{"ped_Latn_ZZ"} - peo{"peo_Xpeo_IR"} - pex{"pex_Latn_ZZ"} - pfl{"pfl_Latn_DE"} - phl{"phl_Arab_ZZ"} - phn{"phn_Phnx_LB"} - pil{"pil_Latn_ZZ"} - pip{"pip_Latn_ZZ"} - pka{"pka_Brah_IN"} - pko{"pko_Latn_KE"} - pl{"pl_Latn_PL"} - pla{"pla_Latn_ZZ"} - pms{"pms_Latn_IT"} - png{"png_Latn_ZZ"} - pnn{"pnn_Latn_ZZ"} - pnt{"pnt_Grek_GR"} - pon{"pon_Latn_FM"} - ppo{"ppo_Latn_ZZ"} - pra{"pra_Khar_PK"} - prd{"prd_Arab_IR"} - prg{"prg_Latn_001"} - ps{"ps_Arab_AF"} - pss{"pss_Latn_ZZ"} - pt{"pt_Latn_BR"} - ptp{"ptp_Latn_ZZ"} - puu{"puu_Latn_GA"} - pwa{"pwa_Latn_ZZ"} - qu{"qu_Latn_PE"} - quc{"quc_Latn_GT"} - qug{"qug_Latn_EC"} - rai{"rai_Latn_ZZ"} - raj{"raj_Deva_IN"} - rao{"rao_Latn_ZZ"} - rcf{"rcf_Latn_RE"} - rej{"rej_Latn_ID"} - rel{"rel_Latn_ZZ"} - res{"res_Latn_ZZ"} - rgn{"rgn_Latn_IT"} - rhg{"rhg_Arab_ZZ"} - ria{"ria_Latn_IN"} - rif{"rif_Tfng_MA"} - rif_NL{"rif_Latn_NL"} - rjs{"rjs_Deva_NP"} - rkt{"rkt_Beng_BD"} - rm{"rm_Latn_CH"} - rmf{"rmf_Latn_FI"} - rmo{"rmo_Latn_CH"} - rmt{"rmt_Arab_IR"} - rmu{"rmu_Latn_SE"} - rn{"rn_Latn_BI"} - rna{"rna_Latn_ZZ"} - rng{"rng_Latn_MZ"} - ro{"ro_Latn_RO"} - rob{"rob_Latn_ID"} - rof{"rof_Latn_TZ"} - roo{"roo_Latn_ZZ"} - rro{"rro_Latn_ZZ"} - rtm{"rtm_Latn_FJ"} - ru{"ru_Cyrl_RU"} - rue{"rue_Cyrl_UA"} - rug{"rug_Latn_SB"} - rw{"rw_Latn_RW"} - rwk{"rwk_Latn_TZ"} - rwo{"rwo_Latn_ZZ"} - ryu{"ryu_Kana_JP"} - sa{"sa_Deva_IN"} - saf{"saf_Latn_GH"} - sah{"sah_Cyrl_RU"} - saq{"saq_Latn_KE"} - sas{"sas_Latn_ID"} - sat{"sat_Latn_IN"} - saz{"saz_Saur_IN"} - sba{"sba_Latn_ZZ"} - sbe{"sbe_Latn_ZZ"} - sbp{"sbp_Latn_TZ"} - sc{"sc_Latn_IT"} - sck{"sck_Deva_IN"} - scl{"scl_Arab_ZZ"} - scn{"scn_Latn_IT"} - sco{"sco_Latn_GB"} - scs{"scs_Latn_CA"} - sd{"sd_Arab_PK"} - sd_Deva{"sd_Deva_IN"} - sd_Khoj{"sd_Khoj_IN"} - sd_Sind{"sd_Sind_IN"} - sdc{"sdc_Latn_IT"} - sdh{"sdh_Arab_IR"} - se{"se_Latn_NO"} - sef{"sef_Latn_CI"} - seh{"seh_Latn_MZ"} - sei{"sei_Latn_MX"} - ses{"ses_Latn_ML"} - sg{"sg_Latn_CF"} - sga{"sga_Ogam_IE"} - sgs{"sgs_Latn_LT"} - sgw{"sgw_Ethi_ZZ"} - sgz{"sgz_Latn_ZZ"} - shi{"shi_Tfng_MA"} - shk{"shk_Latn_ZZ"} - shn{"shn_Mymr_MM"} - shu{"shu_Arab_ZZ"} - si{"si_Sinh_LK"} - sid{"sid_Latn_ET"} - sig{"sig_Latn_ZZ"} - sil{"sil_Latn_ZZ"} - sim{"sim_Latn_ZZ"} - sjr{"sjr_Latn_ZZ"} - sk{"sk_Latn_SK"} - skc{"skc_Latn_ZZ"} - skr{"skr_Arab_PK"} - sks{"sks_Latn_ZZ"} - sl{"sl_Latn_SI"} - sld{"sld_Latn_ZZ"} - sli{"sli_Latn_PL"} - sll{"sll_Latn_ZZ"} - sly{"sly_Latn_ID"} - sm{"sm_Latn_WS"} - sma{"sma_Latn_SE"} - smj{"smj_Latn_SE"} - smn{"smn_Latn_FI"} - smp{"smp_Samr_IL"} - smq{"smq_Latn_ZZ"} - sms{"sms_Latn_FI"} - sn{"sn_Latn_ZW"} - snc{"snc_Latn_ZZ"} - snk{"snk_Latn_ML"} - snp{"snp_Latn_ZZ"} - snx{"snx_Latn_ZZ"} - sny{"sny_Latn_ZZ"} - so{"so_Latn_SO"} - sok{"sok_Latn_ZZ"} - soq{"soq_Latn_ZZ"} - sou{"sou_Thai_TH"} - soy{"soy_Latn_ZZ"} - spd{"spd_Latn_ZZ"} - spl{"spl_Latn_ZZ"} - sps{"sps_Latn_ZZ"} - sq{"sq_Latn_AL"} - sr{"sr_Cyrl_RS"} - sr_ME{"sr_Latn_ME"} - sr_RO{"sr_Latn_RO"} - sr_RU{"sr_Latn_RU"} - sr_TR{"sr_Latn_TR"} - srb{"srb_Sora_IN"} - srn{"srn_Latn_SR"} - srr{"srr_Latn_SN"} - srx{"srx_Deva_IN"} - ss{"ss_Latn_ZA"} - ssd{"ssd_Latn_ZZ"} - ssg{"ssg_Latn_ZZ"} - ssy{"ssy_Latn_ER"} - st{"st_Latn_ZA"} - stk{"stk_Latn_ZZ"} - stq{"stq_Latn_DE"} - su{"su_Latn_ID"} - sua{"sua_Latn_ZZ"} - sue{"sue_Latn_ZZ"} - suk{"suk_Latn_TZ"} - sur{"sur_Latn_ZZ"} - sus{"sus_Latn_GN"} - sv{"sv_Latn_SE"} - sw{"sw_Latn_TZ"} - swb{"swb_Arab_YT"} - swc{"swc_Latn_CD"} - swg{"swg_Latn_DE"} - swp{"swp_Latn_ZZ"} - swv{"swv_Deva_IN"} - sxn{"sxn_Latn_ID"} - sxw{"sxw_Latn_ZZ"} - syl{"syl_Beng_BD"} - syr{"syr_Syrc_IQ"} - szl{"szl_Latn_PL"} - ta{"ta_Taml_IN"} - taj{"taj_Deva_NP"} - tal{"tal_Latn_ZZ"} - tan{"tan_Latn_ZZ"} - taq{"taq_Latn_ZZ"} - tbc{"tbc_Latn_ZZ"} - tbd{"tbd_Latn_ZZ"} - tbf{"tbf_Latn_ZZ"} - tbg{"tbg_Latn_ZZ"} - tbo{"tbo_Latn_ZZ"} - tbw{"tbw_Latn_PH"} - tbz{"tbz_Latn_ZZ"} - tci{"tci_Latn_ZZ"} - tcy{"tcy_Knda_IN"} - tdd{"tdd_Tale_CN"} - tdg{"tdg_Deva_NP"} - tdh{"tdh_Deva_NP"} - te{"te_Telu_IN"} - ted{"ted_Latn_ZZ"} - tem{"tem_Latn_SL"} - teo{"teo_Latn_UG"} - tet{"tet_Latn_TL"} - tfi{"tfi_Latn_ZZ"} - tg{"tg_Cyrl_TJ"} - tg_Arab{"tg_Arab_PK"} - tg_PK{"tg_Arab_PK"} - tgc{"tgc_Latn_ZZ"} - tgo{"tgo_Latn_ZZ"} - tgu{"tgu_Latn_ZZ"} - th{"th_Thai_TH"} - thl{"thl_Deva_NP"} - thq{"thq_Deva_NP"} - thr{"thr_Deva_NP"} - ti{"ti_Ethi_ET"} - tif{"tif_Latn_ZZ"} - tig{"tig_Ethi_ER"} - tik{"tik_Latn_ZZ"} - tim{"tim_Latn_ZZ"} - tio{"tio_Latn_ZZ"} - tiv{"tiv_Latn_NG"} - tk{"tk_Latn_TM"} - tkl{"tkl_Latn_TK"} - tkr{"tkr_Latn_AZ"} - tkt{"tkt_Deva_NP"} - tl{"tl_Latn_PH"} - tlf{"tlf_Latn_ZZ"} - tlx{"tlx_Latn_ZZ"} - tly{"tly_Latn_AZ"} - tmh{"tmh_Latn_NE"} - tmy{"tmy_Latn_ZZ"} - tn{"tn_Latn_ZA"} - tnh{"tnh_Latn_ZZ"} - to{"to_Latn_TO"} - tof{"tof_Latn_ZZ"} - tog{"tog_Latn_MW"} - toq{"toq_Latn_ZZ"} - tpi{"tpi_Latn_PG"} - tpm{"tpm_Latn_ZZ"} - tpz{"tpz_Latn_ZZ"} - tqo{"tqo_Latn_ZZ"} - tr{"tr_Latn_TR"} - tru{"tru_Latn_TR"} - trv{"trv_Latn_TW"} - trw{"trw_Arab_ZZ"} - ts{"ts_Latn_ZA"} - tsd{"tsd_Grek_GR"} - tsf{"tsf_Deva_NP"} - tsg{"tsg_Latn_PH"} - tsj{"tsj_Tibt_BT"} - tsw{"tsw_Latn_ZZ"} - tt{"tt_Cyrl_RU"} - ttd{"ttd_Latn_ZZ"} - tte{"tte_Latn_ZZ"} - ttj{"ttj_Latn_UG"} - ttr{"ttr_Latn_ZZ"} - tts{"tts_Thai_TH"} - ttt{"ttt_Latn_AZ"} - tuh{"tuh_Latn_ZZ"} - tul{"tul_Latn_ZZ"} - tum{"tum_Latn_MW"} - tuq{"tuq_Latn_ZZ"} - tvd{"tvd_Latn_ZZ"} - tvl{"tvl_Latn_TV"} - tvu{"tvu_Latn_ZZ"} - twh{"twh_Latn_ZZ"} - twq{"twq_Latn_NE"} - txg{"txg_Tang_CN"} - ty{"ty_Latn_PF"} - tya{"tya_Latn_ZZ"} - tyv{"tyv_Cyrl_RU"} - tzm{"tzm_Latn_MA"} - ubu{"ubu_Latn_ZZ"} - udm{"udm_Cyrl_RU"} - ug{"ug_Arab_CN"} - ug_Cyrl{"ug_Cyrl_KZ"} - ug_KZ{"ug_Cyrl_KZ"} - ug_MN{"ug_Cyrl_MN"} - uga{"uga_Ugar_SY"} - uk{"uk_Cyrl_UA"} - uli{"uli_Latn_FM"} - umb{"umb_Latn_AO"} - und{"en_Latn_US"} - und_002{"en_Latn_NG"} - und_003{"en_Latn_US"} - und_005{"pt_Latn_BR"} - und_009{"en_Latn_AU"} - und_011{"en_Latn_NG"} - und_013{"es_Latn_MX"} - und_014{"sw_Latn_TZ"} - und_015{"ar_Arab_EG"} - und_017{"sw_Latn_CD"} - und_018{"en_Latn_ZA"} - und_019{"en_Latn_US"} - und_021{"en_Latn_US"} - und_029{"es_Latn_CU"} - und_030{"zh_Hans_CN"} - und_034{"hi_Deva_IN"} - und_035{"id_Latn_ID"} - und_039{"it_Latn_IT"} - und_053{"en_Latn_AU"} - und_054{"en_Latn_PG"} - und_057{"en_Latn_GU"} - und_061{"sm_Latn_WS"} - und_142{"zh_Hans_CN"} - und_143{"uz_Latn_UZ"} - und_145{"ar_Arab_SA"} - und_150{"ru_Cyrl_RU"} - und_151{"ru_Cyrl_RU"} - und_154{"en_Latn_GB"} - und_155{"de_Latn_DE"} - und_419{"es_Latn_419"} - und_AD{"ca_Latn_AD"} - und_AE{"ar_Arab_AE"} - und_AF{"fa_Arab_AF"} - und_AL{"sq_Latn_AL"} - und_AM{"hy_Armn_AM"} - und_AO{"pt_Latn_AO"} - und_AQ{"und_Latn_AQ"} - und_AR{"es_Latn_AR"} - und_AS{"sm_Latn_AS"} - und_AT{"de_Latn_AT"} - und_AW{"nl_Latn_AW"} - und_AX{"sv_Latn_AX"} - und_AZ{"az_Latn_AZ"} - und_Adlm{"ff_Adlm_GN"} - und_Aghb{"lez_Aghb_RU"} - und_Ahom{"aho_Ahom_IN"} - und_Arab{"ar_Arab_EG"} - und_Arab_CC{"ms_Arab_CC"} - und_Arab_CN{"ug_Arab_CN"} - und_Arab_GB{"ks_Arab_GB"} - und_Arab_ID{"ms_Arab_ID"} - und_Arab_IN{"ur_Arab_IN"} - und_Arab_KH{"cja_Arab_KH"} - und_Arab_MN{"kk_Arab_MN"} - und_Arab_MU{"ur_Arab_MU"} - und_Arab_NG{"ha_Arab_NG"} - und_Arab_PK{"ur_Arab_PK"} - und_Arab_TG{"apd_Arab_TG"} - und_Arab_TH{"mfa_Arab_TH"} - und_Arab_TJ{"fa_Arab_TJ"} - und_Arab_TR{"az_Arab_TR"} - und_Arab_YT{"swb_Arab_YT"} - und_Armi{"arc_Armi_IR"} - und_Armn{"hy_Armn_AM"} - und_Avst{"ae_Avst_IR"} - und_BA{"bs_Latn_BA"} - und_BD{"bn_Beng_BD"} - und_BE{"nl_Latn_BE"} - und_BF{"fr_Latn_BF"} - und_BG{"bg_Cyrl_BG"} - und_BH{"ar_Arab_BH"} - und_BI{"rn_Latn_BI"} - und_BJ{"fr_Latn_BJ"} - und_BL{"fr_Latn_BL"} - und_BN{"ms_Latn_BN"} - und_BO{"es_Latn_BO"} - und_BQ{"pap_Latn_BQ"} - und_BR{"pt_Latn_BR"} - und_BT{"dz_Tibt_BT"} - und_BV{"und_Latn_BV"} - und_BY{"be_Cyrl_BY"} - und_Bali{"ban_Bali_ID"} - und_Bamu{"bax_Bamu_CM"} - und_Bass{"bsq_Bass_LR"} - und_Batk{"bbc_Batk_ID"} - und_Beng{"bn_Beng_BD"} - und_Bhks{"sa_Bhks_IN"} - und_Bopo{"zh_Bopo_TW"} - und_Brah{"pka_Brah_IN"} - und_Brai{"fr_Brai_FR"} - und_Bugi{"bug_Bugi_ID"} - und_Buhd{"bku_Buhd_PH"} - und_CD{"sw_Latn_CD"} - und_CF{"fr_Latn_CF"} - und_CG{"fr_Latn_CG"} - und_CH{"de_Latn_CH"} - und_CI{"fr_Latn_CI"} - und_CL{"es_Latn_CL"} - und_CM{"fr_Latn_CM"} - und_CN{"zh_Hans_CN"} - und_CO{"es_Latn_CO"} - und_CP{"und_Latn_CP"} - und_CR{"es_Latn_CR"} - und_CU{"es_Latn_CU"} - und_CV{"pt_Latn_CV"} - und_CW{"pap_Latn_CW"} - und_CY{"el_Grek_CY"} - und_CZ{"cs_Latn_CZ"} - und_Cakm{"ccp_Cakm_BD"} - und_Cans{"cr_Cans_CA"} - und_Cari{"xcr_Cari_TR"} - und_Cham{"cjm_Cham_VN"} - und_Cher{"chr_Cher_US"} - und_Copt{"cop_Copt_EG"} - und_Cprt{"grc_Cprt_CY"} - und_Cyrl{"ru_Cyrl_RU"} - und_Cyrl_AL{"mk_Cyrl_AL"} - und_Cyrl_BA{"sr_Cyrl_BA"} - und_Cyrl_GE{"ab_Cyrl_GE"} - und_Cyrl_GR{"mk_Cyrl_GR"} - und_Cyrl_MD{"uk_Cyrl_MD"} - und_Cyrl_PL{"be_Cyrl_PL"} - und_Cyrl_RO{"bg_Cyrl_RO"} - und_Cyrl_SK{"uk_Cyrl_SK"} - und_Cyrl_TR{"kbd_Cyrl_TR"} - und_Cyrl_XK{"sr_Cyrl_XK"} - und_DE{"de_Latn_DE"} - und_DJ{"aa_Latn_DJ"} - und_DK{"da_Latn_DK"} - und_DO{"es_Latn_DO"} - und_DZ{"ar_Arab_DZ"} - und_Deva{"hi_Deva_IN"} - und_Deva_BT{"ne_Deva_BT"} - und_Deva_FJ{"hif_Deva_FJ"} - und_Deva_MU{"bho_Deva_MU"} - und_Deva_PK{"btv_Deva_PK"} - und_Dupl{"fr_Dupl_FR"} - und_EA{"es_Latn_EA"} - und_EC{"es_Latn_EC"} - und_EE{"et_Latn_EE"} - und_EG{"ar_Arab_EG"} - und_EH{"ar_Arab_EH"} - und_ER{"ti_Ethi_ER"} - und_ES{"es_Latn_ES"} - und_ET{"am_Ethi_ET"} - und_EU{"en_Latn_GB"} - und_EZ{"de_Latn_EZ"} - und_Egyp{"egy_Egyp_EG"} - und_Elba{"sq_Elba_AL"} - und_Ethi{"am_Ethi_ET"} - und_FI{"fi_Latn_FI"} - und_FO{"fo_Latn_FO"} - und_FR{"fr_Latn_FR"} - und_GA{"fr_Latn_GA"} - und_GE{"ka_Geor_GE"} - und_GF{"fr_Latn_GF"} - und_GH{"ak_Latn_GH"} - und_GL{"kl_Latn_GL"} - und_GN{"fr_Latn_GN"} - und_GP{"fr_Latn_GP"} - und_GQ{"es_Latn_GQ"} - und_GR{"el_Grek_GR"} - und_GS{"und_Latn_GS"} - und_GT{"es_Latn_GT"} - und_GW{"pt_Latn_GW"} - und_Geor{"ka_Geor_GE"} - und_Glag{"cu_Glag_BG"} - und_Goth{"got_Goth_UA"} - und_Gran{"sa_Gran_IN"} - und_Grek{"el_Grek_GR"} - und_Grek_TR{"bgx_Grek_TR"} - und_Gujr{"gu_Gujr_IN"} - und_Guru{"pa_Guru_IN"} - und_HK{"zh_Hant_HK"} - und_HM{"und_Latn_HM"} - und_HN{"es_Latn_HN"} - und_HR{"hr_Latn_HR"} - und_HT{"ht_Latn_HT"} - und_HU{"hu_Latn_HU"} - und_Hanb{"zh_Hanb_TW"} - und_Hang{"ko_Hang_KR"} - und_Hani{"zh_Hani_CN"} - und_Hano{"hnn_Hano_PH"} - und_Hans{"zh_Hans_CN"} - und_Hant{"zh_Hant_TW"} - und_Hant_CN{"yue_Hant_CN"} - und_Hatr{"mis_Hatr_IQ"} - und_Hebr{"he_Hebr_IL"} - und_Hebr_CA{"yi_Hebr_CA"} - und_Hebr_GB{"yi_Hebr_GB"} - und_Hebr_SE{"yi_Hebr_SE"} - und_Hebr_UA{"yi_Hebr_UA"} - und_Hebr_US{"yi_Hebr_US"} - und_Hira{"ja_Hira_JP"} - und_Hluw{"hlu_Hluw_TR"} - und_Hmng{"hnj_Hmng_LA"} - und_Hung{"hu_Hung_HU"} - und_IC{"es_Latn_IC"} - und_ID{"id_Latn_ID"} - und_IL{"he_Hebr_IL"} - und_IN{"hi_Deva_IN"} - und_IQ{"ar_Arab_IQ"} - und_IR{"fa_Arab_IR"} - und_IS{"is_Latn_IS"} - und_IT{"it_Latn_IT"} - und_Ital{"ett_Ital_IT"} - und_JO{"ar_Arab_JO"} - und_JP{"ja_Jpan_JP"} - und_Jamo{"ko_Jamo_KR"} - und_Java{"jv_Java_ID"} - und_Jpan{"ja_Jpan_JP"} - und_KE{"sw_Latn_KE"} - und_KG{"ky_Cyrl_KG"} - und_KH{"km_Khmr_KH"} - und_KM{"ar_Arab_KM"} - und_KP{"ko_Kore_KP"} - und_KR{"ko_Kore_KR"} - und_KW{"ar_Arab_KW"} - und_KZ{"ru_Cyrl_KZ"} - und_Kali{"eky_Kali_MM"} - und_Kana{"ja_Kana_JP"} - und_Khar{"pra_Khar_PK"} - und_Khmr{"km_Khmr_KH"} - und_Khoj{"sd_Khoj_IN"} - und_Knda{"kn_Knda_IN"} - und_Kore{"ko_Kore_KR"} - und_Kthi{"bho_Kthi_IN"} - und_LA{"lo_Laoo_LA"} - und_LB{"ar_Arab_LB"} - und_LI{"de_Latn_LI"} - und_LK{"si_Sinh_LK"} - und_LS{"st_Latn_LS"} - und_LT{"lt_Latn_LT"} - und_LU{"fr_Latn_LU"} - und_LV{"lv_Latn_LV"} - und_LY{"ar_Arab_LY"} - und_Lana{"nod_Lana_TH"} - und_Laoo{"lo_Laoo_LA"} - und_Latn_AF{"tk_Latn_AF"} - und_Latn_AM{"ku_Latn_AM"} - und_Latn_CN{"za_Latn_CN"} - und_Latn_CY{"tr_Latn_CY"} - und_Latn_DZ{"fr_Latn_DZ"} - und_Latn_ET{"en_Latn_ET"} - und_Latn_GE{"ku_Latn_GE"} - und_Latn_IR{"tk_Latn_IR"} - und_Latn_KM{"fr_Latn_KM"} - und_Latn_MA{"fr_Latn_MA"} - und_Latn_MK{"sq_Latn_MK"} - und_Latn_MM{"kac_Latn_MM"} - und_Latn_MO{"pt_Latn_MO"} - und_Latn_MR{"fr_Latn_MR"} - und_Latn_RU{"krl_Latn_RU"} - und_Latn_SY{"fr_Latn_SY"} - und_Latn_TN{"fr_Latn_TN"} - und_Latn_TW{"trv_Latn_TW"} - und_Latn_UA{"pl_Latn_UA"} - und_Lepc{"lep_Lepc_IN"} - und_Limb{"lif_Limb_IN"} - und_Lina{"lab_Lina_GR"} - und_Linb{"grc_Linb_GR"} - und_Lisu{"lis_Lisu_CN"} - und_Lyci{"xlc_Lyci_TR"} - und_Lydi{"xld_Lydi_TR"} - und_MA{"ar_Arab_MA"} - und_MC{"fr_Latn_MC"} - und_MD{"ro_Latn_MD"} - und_ME{"sr_Latn_ME"} - und_MF{"fr_Latn_MF"} - und_MG{"mg_Latn_MG"} - und_MK{"mk_Cyrl_MK"} - und_ML{"bm_Latn_ML"} - und_MM{"my_Mymr_MM"} - und_MN{"mn_Cyrl_MN"} - und_MO{"zh_Hant_MO"} - und_MQ{"fr_Latn_MQ"} - und_MR{"ar_Arab_MR"} - und_MT{"mt_Latn_MT"} - und_MU{"mfe_Latn_MU"} - und_MV{"dv_Thaa_MV"} - und_MX{"es_Latn_MX"} - und_MY{"ms_Latn_MY"} - und_MZ{"pt_Latn_MZ"} - und_Mahj{"hi_Mahj_IN"} - und_Mand{"myz_Mand_IR"} - und_Mani{"xmn_Mani_CN"} - und_Marc{"bo_Marc_CN"} - und_Mend{"men_Mend_SL"} - und_Merc{"xmr_Merc_SD"} - und_Mero{"xmr_Mero_SD"} - und_Mlym{"ml_Mlym_IN"} - und_Modi{"mr_Modi_IN"} - und_Mong{"mn_Mong_CN"} - und_Mroo{"mro_Mroo_BD"} - und_Mtei{"mni_Mtei_IN"} - und_Mult{"skr_Mult_PK"} - und_Mymr{"my_Mymr_MM"} - und_Mymr_IN{"kht_Mymr_IN"} - und_Mymr_TH{"mnw_Mymr_TH"} - und_NA{"af_Latn_NA"} - und_NC{"fr_Latn_NC"} - und_NE{"ha_Latn_NE"} - und_NI{"es_Latn_NI"} - und_NL{"nl_Latn_NL"} - und_NO{"nb_Latn_NO"} - und_NP{"ne_Deva_NP"} - und_Narb{"xna_Narb_SA"} - und_Nbat{"arc_Nbat_JO"} - und_Newa{"new_Newa_NP"} - und_Nkoo{"man_Nkoo_GN"} - und_OM{"ar_Arab_OM"} - und_Ogam{"sga_Ogam_IE"} - und_Olck{"sat_Olck_IN"} - und_Orkh{"otk_Orkh_MN"} - und_Orya{"or_Orya_IN"} - und_Osge{"osa_Osge_US"} - und_Osma{"so_Osma_SO"} - und_PA{"es_Latn_PA"} - und_PE{"es_Latn_PE"} - und_PF{"fr_Latn_PF"} - und_PG{"tpi_Latn_PG"} - und_PH{"fil_Latn_PH"} - und_PK{"ur_Arab_PK"} - und_PL{"pl_Latn_PL"} - und_PM{"fr_Latn_PM"} - und_PR{"es_Latn_PR"} - und_PS{"ar_Arab_PS"} - und_PT{"pt_Latn_PT"} - und_PW{"pau_Latn_PW"} - und_PY{"gn_Latn_PY"} - und_Palm{"arc_Palm_SY"} - und_Pauc{"ctd_Pauc_MM"} - und_Perm{"kv_Perm_RU"} - und_Phag{"lzh_Phag_CN"} - und_Phli{"pal_Phli_IR"} - und_Phlp{"pal_Phlp_CN"} - und_Phnx{"phn_Phnx_LB"} - und_Plrd{"hmd_Plrd_CN"} - und_Prti{"xpr_Prti_IR"} - und_QA{"ar_Arab_QA"} - und_QO{"en_Latn_IO"} - und_RE{"fr_Latn_RE"} - und_RO{"ro_Latn_RO"} - und_RS{"sr_Cyrl_RS"} - und_RU{"ru_Cyrl_RU"} - und_RW{"rw_Latn_RW"} - und_Rjng{"rej_Rjng_ID"} - und_Runr{"non_Runr_SE"} - und_SA{"ar_Arab_SA"} - und_SC{"fr_Latn_SC"} - und_SD{"ar_Arab_SD"} - und_SE{"sv_Latn_SE"} - und_SI{"sl_Latn_SI"} - und_SJ{"nb_Latn_SJ"} - und_SK{"sk_Latn_SK"} - und_SM{"it_Latn_SM"} - und_SN{"fr_Latn_SN"} - und_SO{"so_Latn_SO"} - und_SR{"nl_Latn_SR"} - und_ST{"pt_Latn_ST"} - und_SV{"es_Latn_SV"} - und_SY{"ar_Arab_SY"} - und_Samr{"smp_Samr_IL"} - und_Sarb{"xsa_Sarb_YE"} - und_Saur{"saz_Saur_IN"} - und_Sgnw{"ase_Sgnw_US"} - und_Shaw{"en_Shaw_GB"} - und_Shrd{"sa_Shrd_IN"} - und_Sidd{"sa_Sidd_IN"} - und_Sind{"sd_Sind_IN"} - und_Sinh{"si_Sinh_LK"} - und_Sora{"srb_Sora_IN"} - und_Sund{"su_Sund_ID"} - und_Sylo{"syl_Sylo_BD"} - und_Syrc{"syr_Syrc_IQ"} - und_TD{"fr_Latn_TD"} - und_TF{"fr_Latn_TF"} - und_TG{"fr_Latn_TG"} - und_TH{"th_Thai_TH"} - und_TJ{"tg_Cyrl_TJ"} - und_TK{"tkl_Latn_TK"} - und_TL{"pt_Latn_TL"} - und_TM{"tk_Latn_TM"} - und_TN{"ar_Arab_TN"} - und_TO{"to_Latn_TO"} - und_TR{"tr_Latn_TR"} - und_TV{"tvl_Latn_TV"} - und_TW{"zh_Hant_TW"} - und_TZ{"sw_Latn_TZ"} - und_Tagb{"tbw_Tagb_PH"} - und_Takr{"doi_Takr_IN"} - und_Tale{"tdd_Tale_CN"} - und_Talu{"khb_Talu_CN"} - und_Taml{"ta_Taml_IN"} - und_Tang{"txg_Tang_CN"} - und_Tavt{"blt_Tavt_VN"} - und_Telu{"te_Telu_IN"} - und_Tfng{"zgh_Tfng_MA"} - und_Tglg{"fil_Tglg_PH"} - und_Thaa{"dv_Thaa_MV"} - und_Thai{"th_Thai_TH"} - und_Thai_CN{"lcp_Thai_CN"} - und_Thai_KH{"kdt_Thai_KH"} - und_Thai_LA{"kdt_Thai_LA"} - und_Tibt{"bo_Tibt_CN"} - und_Tirh{"mai_Tirh_IN"} - und_UA{"uk_Cyrl_UA"} - und_UG{"sw_Latn_UG"} - und_UY{"es_Latn_UY"} - und_UZ{"uz_Latn_UZ"} - und_Ugar{"uga_Ugar_SY"} - und_VA{"it_Latn_VA"} - und_VE{"es_Latn_VE"} - und_VN{"vi_Latn_VN"} - und_VU{"bi_Latn_VU"} - und_Vaii{"vai_Vaii_LR"} - und_WF{"fr_Latn_WF"} - und_WS{"sm_Latn_WS"} - und_Wara{"hoc_Wara_IN"} - und_XK{"sq_Latn_XK"} - und_Xpeo{"peo_Xpeo_IR"} - und_Xsux{"akk_Xsux_IQ"} - und_YE{"ar_Arab_YE"} - und_YT{"fr_Latn_YT"} - und_Yiii{"ii_Yiii_CN"} - und_ZW{"sn_Latn_ZW"} - unr{"unr_Beng_IN"} - unr_Deva{"unr_Deva_NP"} - unr_NP{"unr_Deva_NP"} - unx{"unx_Beng_IN"} - ur{"ur_Arab_PK"} - uri{"uri_Latn_ZZ"} - urt{"urt_Latn_ZZ"} - urw{"urw_Latn_ZZ"} - usa{"usa_Latn_ZZ"} - utr{"utr_Latn_ZZ"} - uvh{"uvh_Latn_ZZ"} - uvl{"uvl_Latn_ZZ"} - uz{"uz_Latn_UZ"} - uz_AF{"uz_Arab_AF"} - uz_Arab{"uz_Arab_AF"} - uz_CN{"uz_Cyrl_CN"} - vag{"vag_Latn_ZZ"} - vai{"vai_Vaii_LR"} - van{"van_Latn_ZZ"} - ve{"ve_Latn_ZA"} - vec{"vec_Latn_IT"} - vep{"vep_Latn_RU"} - vi{"vi_Latn_VN"} - vic{"vic_Latn_SX"} - viv{"viv_Latn_ZZ"} - vls{"vls_Latn_BE"} - vmf{"vmf_Latn_DE"} - vmw{"vmw_Latn_MZ"} - vo{"vo_Latn_001"} - vot{"vot_Latn_RU"} - vro{"vro_Latn_EE"} - vun{"vun_Latn_TZ"} - vut{"vut_Latn_ZZ"} - wa{"wa_Latn_BE"} - wae{"wae_Latn_CH"} - waj{"waj_Latn_ZZ"} - wal{"wal_Ethi_ET"} - wan{"wan_Latn_ZZ"} - war{"war_Latn_PH"} - wbp{"wbp_Latn_AU"} - wbq{"wbq_Telu_IN"} - wbr{"wbr_Deva_IN"} - wci{"wci_Latn_ZZ"} - wer{"wer_Latn_ZZ"} - wgi{"wgi_Latn_ZZ"} - whg{"whg_Latn_ZZ"} - wib{"wib_Latn_ZZ"} - wiu{"wiu_Latn_ZZ"} - wiv{"wiv_Latn_ZZ"} - wja{"wja_Latn_ZZ"} - wji{"wji_Latn_ZZ"} - wls{"wls_Latn_WF"} - wmo{"wmo_Latn_ZZ"} - wnc{"wnc_Latn_ZZ"} - wni{"wni_Arab_KM"} - wnu{"wnu_Latn_ZZ"} - wo{"wo_Latn_SN"} - wob{"wob_Latn_ZZ"} - wos{"wos_Latn_ZZ"} - wrs{"wrs_Latn_ZZ"} - wsk{"wsk_Latn_ZZ"} - wtm{"wtm_Deva_IN"} - wuu{"wuu_Hans_CN"} - wuv{"wuv_Latn_ZZ"} - wwa{"wwa_Latn_ZZ"} - xav{"xav_Latn_BR"} - xbi{"xbi_Latn_ZZ"} - xcr{"xcr_Cari_TR"} - xes{"xes_Latn_ZZ"} - xh{"xh_Latn_ZA"} - xla{"xla_Latn_ZZ"} - xlc{"xlc_Lyci_TR"} - xld{"xld_Lydi_TR"} - xmf{"xmf_Geor_GE"} - xmn{"xmn_Mani_CN"} - xmr{"xmr_Merc_SD"} - xna{"xna_Narb_SA"} - xnr{"xnr_Deva_IN"} - xog{"xog_Latn_UG"} - xon{"xon_Latn_ZZ"} - xpr{"xpr_Prti_IR"} - xrb{"xrb_Latn_ZZ"} - xsa{"xsa_Sarb_YE"} - xsi{"xsi_Latn_ZZ"} - xsm{"xsm_Latn_ZZ"} - xsr{"xsr_Deva_NP"} - xwe{"xwe_Latn_ZZ"} - yam{"yam_Latn_ZZ"} - yao{"yao_Latn_MZ"} - yap{"yap_Latn_FM"} - yas{"yas_Latn_ZZ"} - yat{"yat_Latn_ZZ"} - yav{"yav_Latn_CM"} - yay{"yay_Latn_ZZ"} - yaz{"yaz_Latn_ZZ"} - yba{"yba_Latn_ZZ"} - ybb{"ybb_Latn_CM"} - yby{"yby_Latn_ZZ"} - yer{"yer_Latn_ZZ"} - ygr{"ygr_Latn_ZZ"} - ygw{"ygw_Latn_ZZ"} - yi{"yi_Hebr_001"} - yko{"yko_Latn_ZZ"} - yle{"yle_Latn_ZZ"} - ylg{"ylg_Latn_ZZ"} - yll{"yll_Latn_ZZ"} - yml{"yml_Latn_ZZ"} - yo{"yo_Latn_NG"} - yon{"yon_Latn_ZZ"} - yrb{"yrb_Latn_ZZ"} - yre{"yre_Latn_ZZ"} - yrl{"yrl_Latn_BR"} - yss{"yss_Latn_ZZ"} - yua{"yua_Latn_MX"} - yue{"yue_Hant_HK"} - yue_CN{"yue_Hans_CN"} - yue_Hans{"yue_Hans_CN"} - yuj{"yuj_Latn_ZZ"} - yut{"yut_Latn_ZZ"} - yuw{"yuw_Latn_ZZ"} - za{"za_Latn_CN"} - zag{"zag_Latn_SD"} - zdj{"zdj_Arab_KM"} - zea{"zea_Latn_NL"} - zgh{"zgh_Tfng_MA"} - zh{"zh_Hans_CN"} - zh_AU{"zh_Hant_AU"} - zh_BN{"zh_Hant_BN"} - zh_Bopo{"zh_Bopo_TW"} - zh_GB{"zh_Hant_GB"} - zh_GF{"zh_Hant_GF"} - zh_HK{"zh_Hant_HK"} - zh_Hanb{"zh_Hanb_TW"} - zh_Hant{"zh_Hant_TW"} - zh_ID{"zh_Hant_ID"} - zh_MO{"zh_Hant_MO"} - zh_MY{"zh_Hant_MY"} - zh_PA{"zh_Hant_PA"} - zh_PF{"zh_Hant_PF"} - zh_PH{"zh_Hant_PH"} - zh_SR{"zh_Hant_SR"} - zh_TH{"zh_Hant_TH"} - zh_TW{"zh_Hant_TW"} - zh_US{"zh_Hant_US"} - zh_VN{"zh_Hant_VN"} - zia{"zia_Latn_ZZ"} - zlm{"zlm_Latn_TG"} - zmi{"zmi_Latn_MY"} - zne{"zne_Latn_ZZ"} - zu{"zu_Latn_ZA"} - zza{"zza_Latn_TR"} -} diff --git a/Build/source/libs/icu/icu-src/source/data/misc/metaZones.txt b/Build/source/libs/icu/icu-src/source/data/misc/metaZones.txt deleted file mode 100644 index e63ae3cefa4..00000000000 --- a/Build/source/libs/icu/icu-src/source/data/misc/metaZones.txt +++ /dev/null @@ -1,4315 +0,0 @@ -// © 2016 and later: Unicode, Inc. and others. -// License & terms of use: http://www.unicode.org/copyright.html#License -metaZones:table(nofallback){ - mapTimezones{ - Acre{ - 001{"America/Rio_Branco"} - } - Afghanistan{ - 001{"Asia/Kabul"} - } - Africa_Central{ - 001{"Africa/Maputo"} - BI{"Africa/Bujumbura"} - BW{"Africa/Gaborone"} - CD{"Africa/Lubumbashi"} - MW{"Africa/Blantyre"} - RW{"Africa/Kigali"} - ZM{"Africa/Lusaka"} - ZW{"Africa/Harare"} - } - Africa_Eastern{ - 001{"Africa/Nairobi"} - DJ{"Africa/Djibouti"} - ER{"Africa/Asmera"} - ET{"Africa/Addis_Ababa"} - KM{"Indian/Comoro"} - MG{"Indian/Antananarivo"} - SO{"Africa/Mogadishu"} - TZ{"Africa/Dar_es_Salaam"} - UG{"Africa/Kampala"} - YT{"Indian/Mayotte"} - } - Africa_FarWestern{ - 001{"Africa/El_Aaiun"} - } - Africa_Southern{ - 001{"Africa/Johannesburg"} - LS{"Africa/Maseru"} - SZ{"Africa/Mbabane"} - } - Africa_Western{ - 001{"Africa/Lagos"} - AO{"Africa/Luanda"} - BJ{"Africa/Porto-Novo"} - CD{"Africa/Kinshasa"} - CF{"Africa/Bangui"} - CG{"Africa/Brazzaville"} - CM{"Africa/Douala"} - GA{"Africa/Libreville"} - GQ{"Africa/Malabo"} - NE{"Africa/Niamey"} - TD{"Africa/Ndjamena"} - } - Aktyubinsk{ - 001{"Asia/Aqtobe"} - } - Alaska{ - 001{"America/Juneau"} - } - Alaska_Hawaii{ - 001{"America/Anchorage"} - } - Almaty{ - 001{"Asia/Almaty"} - } - Amazon{ - 001{"America/Manaus"} - } - America_Central{ - 001{"America/Chicago"} - BZ{"America/Belize"} - CA{"America/Winnipeg"} - CR{"America/Costa_Rica"} - GT{"America/Guatemala"} - HN{"America/Tegucigalpa"} - MX{"America/Mexico_City"} - SV{"America/El_Salvador"} - } - America_Eastern{ - 001{"America/New_York"} - BS{"America/Nassau"} - CA{"America/Toronto"} - HT{"America/Port-au-Prince"} - JM{"America/Jamaica"} - KY{"America/Cayman"} - PA{"America/Panama"} - } - America_Mountain{ - 001{"America/Denver"} - CA{"America/Edmonton"} - MX{"America/Hermosillo"} - } - America_Pacific{ - 001{"America/Los_Angeles"} - CA{"America/Vancouver"} - MX{"America/Tijuana"} - } - Anadyr{ - 001{"Asia/Anadyr"} - } - Apia{ - 001{"Pacific/Apia"} - } - Aqtau{ - 001{"Asia/Aqtau"} - } - Aqtobe{ - 001{"Asia/Aqtobe"} - } - Arabian{ - 001{"Asia/Riyadh"} - BH{"Asia/Bahrain"} - IQ{"Asia/Baghdad"} - KW{"Asia/Kuwait"} - QA{"Asia/Qatar"} - YE{"Asia/Aden"} - } - Argentina{ - 001{"America/Buenos_Aires"} - } - Argentina_Western{ - 001{"America/Argentina/San_Luis"} - } - Armenia{ - 001{"Asia/Yerevan"} - } - Ashkhabad{ - 001{"Asia/Ashgabat"} - } - Atlantic{ - 001{"America/Halifax"} - AG{"America/Antigua"} - AI{"America/Anguilla"} - AN{"America/Curacao"} - AW{"America/Aruba"} - BB{"America/Barbados"} - BM{"Atlantic/Bermuda"} - BQ{"America/Kralendijk"} - DM{"America/Dominica"} - GD{"America/Grenada"} - GL{"America/Thule"} - GP{"America/Guadeloupe"} - KN{"America/St_Kitts"} - LC{"America/St_Lucia"} - MF{"America/Marigot"} - MQ{"America/Martinique"} - MS{"America/Montserrat"} - PR{"America/Puerto_Rico"} - SX{"America/Lower_Princes"} - TT{"America/Port_of_Spain"} - VC{"America/St_Vincent"} - VG{"America/Tortola"} - VI{"America/St_Thomas"} - } - Australia_Central{ - 001{"Australia/Adelaide"} - } - Australia_CentralWestern{ - 001{"Australia/Eucla"} - } - Australia_Eastern{ - 001{"Australia/Sydney"} - } - Australia_Western{ - 001{"Australia/Perth"} - } - Azerbaijan{ - 001{"Asia/Baku"} - } - Azores{ - 001{"Atlantic/Azores"} - } - Baku{ - 001{"Asia/Baku"} - } - Bangladesh{ - 001{"Asia/Dhaka"} - } - Bering{ - 001{"America/Adak"} - } - Bhutan{ - 001{"Asia/Thimphu"} - } - Bolivia{ - 001{"America/La_Paz"} - } - Borneo{ - 001{"Asia/Kuching"} - } - Brasilia{ - 001{"America/Sao_Paulo"} - } - British{ - 001{"Europe/London"} - } - Brunei{ - 001{"Asia/Brunei"} - } - Cape_Verde{ - 001{"Atlantic/Cape_Verde"} - } - Casey{ - 001{"Antarctica/Casey"} - } - Chamorro{ - 001{"Pacific/Saipan"} - GU{"Pacific/Guam"} - } - Chatham{ - 001{"Pacific/Chatham"} - } - Chile{ - 001{"America/Santiago"} - AQ{"Antarctica/Palmer"} - } - China{ - 001{"Asia/Shanghai"} - } - Choibalsan{ - 001{"Asia/Choibalsan"} - } - Christmas{ - 001{"Indian/Christmas"} - } - Cocos{ - 001{"Indian/Cocos"} - } - Colombia{ - 001{"America/Bogota"} - } - Cook{ - 001{"Pacific/Rarotonga"} - } - Cuba{ - 001{"America/Havana"} - } - Dacca{ - 001{"Asia/Dhaka"} - } - Davis{ - 001{"Antarctica/Davis"} - } - Dominican{ - 001{"America/Santo_Domingo"} - } - DumontDUrville{ - 001{"Antarctica/DumontDUrville"} - } - Dushanbe{ - 001{"Asia/Dushanbe"} - } - Dutch_Guiana{ - 001{"America/Paramaribo"} - } - East_Timor{ - 001{"Asia/Dili"} - } - Easter{ - 001{"Pacific/Easter"} - } - Ecuador{ - 001{"America/Guayaquil"} - } - Europe_Central{ - 001{"Europe/Paris"} - AD{"Europe/Andorra"} - AL{"Europe/Tirane"} - AT{"Europe/Vienna"} - BA{"Europe/Sarajevo"} - BE{"Europe/Brussels"} - CH{"Europe/Zurich"} - CZ{"Europe/Prague"} - DE{"Europe/Berlin"} - DK{"Europe/Copenhagen"} - ES{"Europe/Madrid"} - GI{"Europe/Gibraltar"} - HR{"Europe/Zagreb"} - HU{"Europe/Budapest"} - IT{"Europe/Rome"} - LI{"Europe/Vaduz"} - LU{"Europe/Luxembourg"} - MC{"Europe/Monaco"} - ME{"Europe/Podgorica"} - MK{"Europe/Skopje"} - MT{"Europe/Malta"} - NL{"Europe/Amsterdam"} - NO{"Europe/Oslo"} - PL{"Europe/Warsaw"} - RS{"Europe/Belgrade"} - SE{"Europe/Stockholm"} - SI{"Europe/Ljubljana"} - SK{"Europe/Bratislava"} - SM{"Europe/San_Marino"} - TN{"Africa/Tunis"} - VA{"Europe/Vatican"} - XK{"Europe/Belgrade"} - } - Europe_Eastern{ - 001{"Europe/Bucharest"} - AX{"Europe/Mariehamn"} - BG{"Europe/Sofia"} - CY{"Asia/Nicosia"} - EG{"Africa/Cairo"} - FI{"Europe/Helsinki"} - GR{"Europe/Athens"} - JO{"Asia/Amman"} - LB{"Asia/Beirut"} - SY{"Asia/Damascus"} - } - Europe_Further_Eastern{ - 001{"Europe/Minsk"} - RU{"Europe/Kaliningrad"} - } - Europe_Western{ - 001{"Atlantic/Canary"} - FO{"Atlantic/Faeroe"} - } - Falkland{ - 001{"Atlantic/Stanley"} - } - Fiji{ - 001{"Pacific/Fiji"} - } - French_Guiana{ - 001{"America/Cayenne"} - } - French_Southern{ - 001{"Indian/Kerguelen"} - } - Frunze{ - 001{"Asia/Bishkek"} - } - GMT{ - 001{"Atlantic/Reykjavik"} - BF{"Africa/Ouagadougou"} - CI{"Africa/Abidjan"} - GB{"Europe/London"} - GH{"Africa/Accra"} - GM{"Africa/Banjul"} - GN{"Africa/Conakry"} - IE{"Europe/Dublin"} - ML{"Africa/Bamako"} - MR{"Africa/Nouakchott"} - SH{"Atlantic/St_Helena"} - SL{"Africa/Freetown"} - SN{"Africa/Dakar"} - ST{"Africa/Sao_Tome"} - TG{"Africa/Lome"} - } - Galapagos{ - 001{"Pacific/Galapagos"} - } - Gambier{ - 001{"Pacific/Gambier"} - } - Georgia{ - 001{"Asia/Tbilisi"} - } - Gilbert_Islands{ - 001{"Pacific/Tarawa"} - } - Goose_Bay{ - 001{"America/Goose_Bay"} - } - Greenland_Central{ - 001{"America/Scoresbysund"} - } - Greenland_Eastern{ - 001{"America/Scoresbysund"} - } - Greenland_Western{ - 001{"America/Godthab"} - } - Guam{ - 001{"Pacific/Guam"} - } - Gulf{ - 001{"Asia/Dubai"} - OM{"Asia/Muscat"} - } - Guyana{ - 001{"America/Guyana"} - } - Hawaii_Aleutian{ - 001{"Pacific/Honolulu"} - } - Hong_Kong{ - 001{"Asia/Hong_Kong"} - } - Hovd{ - 001{"Asia/Hovd"} - } - India{ - 001{"Asia/Calcutta"} - LK{"Asia/Colombo"} - } - Indian_Ocean{ - 001{"Indian/Chagos"} - } - Indochina{ - 001{"Asia/Bangkok"} - KH{"Asia/Phnom_Penh"} - LA{"Asia/Vientiane"} - } - Indonesia_Central{ - 001{"Asia/Makassar"} - } - Indonesia_Eastern{ - 001{"Asia/Jayapura"} - } - Indonesia_Western{ - 001{"Asia/Jakarta"} - } - Iran{ - 001{"Asia/Tehran"} - } - Irish{ - 001{"Europe/Dublin"} - } - Irkutsk{ - 001{"Asia/Irkutsk"} - } - Israel{ - 001{"Asia/Jerusalem"} - } - Japan{ - 001{"Asia/Tokyo"} - } - Kamchatka{ - 001{"Asia/Kamchatka"} - } - Karachi{ - 001{"Asia/Karachi"} - } - Kazakhstan_Eastern{ - 001{"Asia/Almaty"} - } - Kazakhstan_Western{ - 001{"Asia/Aqtobe"} - } - Kizilorda{ - 001{"Asia/Qyzylorda"} - } - Korea{ - 001{"Asia/Seoul"} - } - Kosrae{ - 001{"Pacific/Kosrae"} - } - Krasnoyarsk{ - 001{"Asia/Krasnoyarsk"} - } - Kuybyshev{ - 001{"Europe/Samara"} - } - Kwajalein{ - 001{"Pacific/Kwajalein"} - } - Kyrgystan{ - 001{"Asia/Bishkek"} - } - Lanka{ - 001{"Asia/Colombo"} - } - Liberia{ - 001{"Africa/Monrovia"} - } - Line_Islands{ - 001{"Pacific/Kiritimati"} - } - Lord_Howe{ - 001{"Australia/Lord_Howe"} - } - Macau{ - 001{"Asia/Macau"} - } - Macquarie{ - 001{"Antarctica/Macquarie"} - } - Magadan{ - 001{"Asia/Magadan"} - } - Malaya{ - 001{"Asia/Kuala_Lumpur"} - } - Malaysia{ - 001{"Asia/Kuching"} - } - Maldives{ - 001{"Indian/Maldives"} - } - Marquesas{ - 001{"Pacific/Marquesas"} - } - Marshall_Islands{ - 001{"Pacific/Majuro"} - } - Mauritius{ - 001{"Indian/Mauritius"} - } - Mawson{ - 001{"Antarctica/Mawson"} - } - Mexico_Northwest{ - 001{"America/Santa_Isabel"} - } - Mexico_Pacific{ - 001{"America/Mazatlan"} - } - Mongolia{ - 001{"Asia/Ulaanbaatar"} - } - Moscow{ - 001{"Europe/Moscow"} - } - Myanmar{ - 001{"Asia/Rangoon"} - } - Nauru{ - 001{"Pacific/Nauru"} - } - Nepal{ - 001{"Asia/Katmandu"} - } - New_Caledonia{ - 001{"Pacific/Noumea"} - } - New_Zealand{ - 001{"Pacific/Auckland"} - AQ{"Antarctica/McMurdo"} - } - Newfoundland{ - 001{"America/St_Johns"} - } - Niue{ - 001{"Pacific/Niue"} - } - Norfolk{ - 001{"Pacific/Norfolk"} - } - Noronha{ - 001{"America/Noronha"} - } - North_Mariana{ - 001{"Pacific/Saipan"} - } - Novosibirsk{ - 001{"Asia/Novosibirsk"} - } - Omsk{ - 001{"Asia/Omsk"} - } - Oral{ - 001{"Asia/Oral"} - } - Pakistan{ - 001{"Asia/Karachi"} - } - Palau{ - 001{"Pacific/Palau"} - } - Papua_New_Guinea{ - 001{"Pacific/Port_Moresby"} - } - Paraguay{ - 001{"America/Asuncion"} - } - Peru{ - 001{"America/Lima"} - } - Philippines{ - 001{"Asia/Manila"} - } - Phoenix_Islands{ - 001{"Pacific/Enderbury"} - } - Pierre_Miquelon{ - 001{"America/Miquelon"} - } - Pitcairn{ - 001{"Pacific/Pitcairn"} - } - Ponape{ - 001{"Pacific/Ponape"} - } - Pyongyang{ - 001{"Asia/Pyongyang"} - } - Qyzylorda{ - 001{"Asia/Qyzylorda"} - } - Reunion{ - 001{"Indian/Reunion"} - } - Rothera{ - 001{"Antarctica/Rothera"} - } - Sakhalin{ - 001{"Asia/Sakhalin"} - } - Samara{ - 001{"Europe/Samara"} - } - Samarkand{ - 001{"Asia/Samarkand"} - } - Samoa{ - 001{"Pacific/Pago_Pago"} - } - Seychelles{ - 001{"Indian/Mahe"} - } - Shevchenko{ - 001{"Asia/Aqtau"} - } - Singapore{ - 001{"Asia/Singapore"} - } - Solomon{ - 001{"Pacific/Guadalcanal"} - } - South_Georgia{ - 001{"Atlantic/South_Georgia"} - } - Suriname{ - 001{"America/Paramaribo"} - } - Sverdlovsk{ - 001{"Asia/Yekaterinburg"} - } - Syowa{ - 001{"Antarctica/Syowa"} - } - Tahiti{ - 001{"Pacific/Tahiti"} - } - Taipei{ - 001{"Asia/Taipei"} - } - Tajikistan{ - 001{"Asia/Dushanbe"} - } - Tashkent{ - 001{"Asia/Tashkent"} - } - Tbilisi{ - 001{"Asia/Tbilisi"} - } - Tokelau{ - 001{"Pacific/Fakaofo"} - } - Tonga{ - 001{"Pacific/Tongatapu"} - } - Truk{ - 001{"Pacific/Truk"} - } - Turkey{ - 001{"Europe/Istanbul"} - } - Turkmenistan{ - 001{"Asia/Ashgabat"} - } - Tuvalu{ - 001{"Pacific/Funafuti"} - } - Uralsk{ - 001{"Asia/Oral"} - } - Uruguay{ - 001{"America/Montevideo"} - } - Urumqi{ - 001{"Asia/Urumqi"} - } - Uzbekistan{ - 001{"Asia/Tashkent"} - } - Vanuatu{ - 001{"Pacific/Efate"} - } - Venezuela{ - 001{"America/Caracas"} - } - Vladivostok{ - 001{"Asia/Vladivostok"} - } - Volgograd{ - 001{"Europe/Volgograd"} - } - Vostok{ - 001{"Antarctica/Vostok"} - } - Wake{ - 001{"Pacific/Wake"} - } - Wallis{ - 001{"Pacific/Wallis"} - } - Yakutsk{ - 001{"Asia/Yakutsk"} - } - Yekaterinburg{ - 001{"Asia/Yekaterinburg"} - } - Yerevan{ - 001{"Asia/Yerevan"} - } - Yukon{ - 001{"America/Yakutat"} - } - } - metazoneInfo{ - "Africa:Abidjan"{ - { - "GMT", - } - } - "Africa:Accra"{ - { - "GMT", - } - } - "Africa:Addis_Ababa"{ - { - "Africa_Eastern", - } - } - "Africa:Algiers"{ - { - "Europe_Western", - "1970-01-01 00:00", - "1977-10-20 23:00", - } - { - "Europe_Central", - "1977-10-20 23:00", - "1979-10-25 23:00", - } - { - "Europe_Western", - "1979-10-25 23:00", - "1981-05-01 00:00", - } - { - "Europe_Central", - "1981-05-01 00:00", - "9999-12-31 23:59", - } - } - "Africa:Asmera"{ - { - "Africa_Eastern", - } - } - "Africa:Bamako"{ - { - "GMT", - } - } - "Africa:Bangui"{ - { - "Africa_Western", - } - } - "Africa:Banjul"{ - { - "GMT", - } - } - "Africa:Bissau"{ - { - "Africa_FarWestern", - "1970-01-01 00:00", - "1975-01-01 01:00", - } - { - "GMT", - "1975-01-01 01:00", - "9999-12-31 23:59", - } - } - "Africa:Blantyre"{ - { - "Africa_Central", - } - } - "Africa:Brazzaville"{ - { - "Africa_Western", - } - } - "Africa:Bujumbura"{ - { - "Africa_Central", - } - } - "Africa:Cairo"{ - { - "Europe_Eastern", - } - } - "Africa:Casablanca"{ - { - "Europe_Western", - "1970-01-01 00:00", - "1984-03-16 00:00", - } - { - "Europe_Central", - "1984-03-16 00:00", - "1985-12-31 23:00", - } - { - "Europe_Western", - "1985-12-31 23:00", - "9999-12-31 23:59", - } - } - "Africa:Ceuta"{ - { - "Europe_Western", - "1970-01-01 00:00", - "1984-03-16 00:00", - } - { - "Europe_Central", - "1984-03-16 00:00", - "9999-12-31 23:59", - } - } - "Africa:Conakry"{ - { - "GMT", - } - } - "Africa:Dakar"{ - { - "GMT", - } - } - "Africa:Dar_es_Salaam"{ - { - "Africa_Eastern", - } - } - "Africa:Djibouti"{ - { - "Africa_Eastern", - } - } - "Africa:Douala"{ - { - "Africa_Western", - } - } - "Africa:El_Aaiun"{ - { - "Africa_FarWestern", - "1970-01-01 00:00", - "1976-04-14 01:00", - } - { - "Europe_Western", - "1976-04-14 01:00", - "9999-12-31 23:59", - } - } - "Africa:Freetown"{ - { - "GMT", - } - } - "Africa:Gaborone"{ - { - "Africa_Central", - } - } - "Africa:Harare"{ - { - "Africa_Central", - } - } - "Africa:Johannesburg"{ - { - "Africa_Southern", - } - } - "Africa:Juba"{ - { - "Africa_Central", - "1970-01-01 00:00", - "2000-01-15 10:00", - } - { - "Africa_Eastern", - "2000-01-15 10:00", - "9999-12-31 23:59", - } - } - "Africa:Kampala"{ - { - "Africa_Eastern", - } - } - "Africa:Khartoum"{ - { - "Africa_Central", - "1970-01-01 00:00", - "2000-01-15 10:00", - } - { - "Africa_Eastern", - "2000-01-15 10:00", - "9999-12-31 23:59", - } - } - "Africa:Kigali"{ - { - "Africa_Central", - } - } - "Africa:Kinshasa"{ - { - "Africa_Western", - } - } - "Africa:Lagos"{ - { - "Africa_Western", - } - } - "Africa:Libreville"{ - { - "Africa_Western", - } - } - "Africa:Lome"{ - { - "GMT", - } - } - "Africa:Luanda"{ - { - "Africa_Western", - } - } - "Africa:Lubumbashi"{ - { - "Africa_Central", - } - } - "Africa:Lusaka"{ - { - "Africa_Central", - } - } - "Africa:Malabo"{ - { - "Africa_Western", - } - } - "Africa:Maputo"{ - { - "Africa_Central", - } - } - "Africa:Maseru"{ - { - "Africa_Southern", - } - } - "Africa:Mbabane"{ - { - "Africa_Southern", - } - } - "Africa:Mogadishu"{ - { - "Africa_Eastern", - } - } - "Africa:Monrovia"{ - { - "Liberia", - "1970-01-01 00:00", - "1972-05-01 00:45", - } - { - "GMT", - "1972-05-01 00:45", - "9999-12-31 23:59", - } - } - "Africa:Nairobi"{ - { - "Africa_Eastern", - } - } - "Africa:Ndjamena"{ - { - "Africa_Western", - } - } - "Africa:Niamey"{ - { - "Africa_Western", - } - } - "Africa:Nouakchott"{ - { - "GMT", - } - } - "Africa:Ouagadougou"{ - { - "GMT", - } - } - "Africa:Porto-Novo"{ - { - "Africa_Western", - } - } - "Africa:Sao_Tome"{ - { - "GMT", - } - } - "Africa:Tripoli"{ - { - "Europe_Eastern", - "1970-01-01 00:00", - "1981-12-31 22:00", - } - { - "Europe_Central", - "1981-12-31 22:00", - "1990-05-03 23:00", - } - { - "Europe_Eastern", - "1990-05-03 23:00", - "1996-09-29 22:00", - } - { - "Europe_Central", - "1996-09-29 22:00", - "1997-10-03 22:00", - } - { - "Europe_Eastern", - "1997-10-03 22:00", - "2012-11-10 00:00", - } - { - "Europe_Central", - "2012-11-10 00:00", - "2013-10-25 00:00", - } - { - "Europe_Eastern", - "2013-10-25 00:00", - "9999-12-31 23:59", - } - } - "Africa:Tunis"{ - { - "Europe_Central", - } - } - "Africa:Windhoek"{ - { - "Africa_Southern", - "1970-01-01 00:00", - "1990-03-20 22:00", - } - { - "Africa_Central", - "1990-03-20 22:00", - "1994-04-02 22:00", - } - { - "Africa_Western", - "1994-04-02 22:00", - "9999-12-31 23:59", - } - } - "America:Adak"{ - { - "Bering", - "1970-01-01 00:00", - "1983-10-30 12:00", - } - { - "Hawaii_Aleutian", - "1983-11-30 10:00", - "9999-12-31 23:59", - } - } - "America:Anchorage"{ - { - "Alaska_Hawaii", - "1970-01-01 00:00", - "1983-10-30 11:00", - } - { - "Yukon", - "1983-10-30 11:00", - "1983-11-30 09:00", - } - { - "Alaska", - "1983-11-30 09:00", - "9999-12-31 23:59", - } - } - "America:Anguilla"{ - { - "Atlantic", - } - } - "America:Antigua"{ - { - "Atlantic", - } - } - "America:Araguaina"{ - { - "Brasilia", - } - } - "America:Argentina:La_Rioja"{ - { - "Argentina", - "1970-01-01 00:00", - "1991-03-01 02:00", - } - { - "Argentina_Western", - "1991-03-01 02:00", - "1991-05-07 04:00", - } - { - "Argentina", - "1991-05-07 04:00", - "2004-06-01 03:00", - } - { - "Argentina_Western", - "2004-06-01 03:00", - "2004-06-20 04:00", - } - { - "Argentina", - "2004-06-20 04:00", - "9999-12-31 23:59", - } - } - "America:Argentina:Rio_Gallegos"{ - { - "Argentina", - "1970-01-01 00:00", - "2004-06-01 03:00", - } - { - "Argentina_Western", - "2004-06-01 03:00", - "2004-06-20 04:00", - } - { - "Argentina", - "2004-06-20 04:00", - "9999-12-31 23:59", - } - } - "America:Argentina:Salta"{ - { - "Argentina", - "1970-01-01 00:00", - "1991-03-03 02:00", - } - { - "Argentina", - "1991-10-20 04:00", - "9999-12-31 23:59", - } - } - "America:Argentina:San_Juan"{ - { - "Argentina", - "1970-01-01 00:00", - "1991-03-01 02:00", - } - { - "Argentina_Western", - "1991-03-01 02:00", - "1991-05-07 04:00", - } - { - "Argentina", - "1991-05-07 04:00", - "2004-05-31 03:00", - } - { - "Argentina_Western", - "2004-05-31 03:00", - "2004-07-25 04:00", - } - { - "Argentina", - "2004-07-25 04:00", - "9999-12-31 23:59", - } - } - "America:Argentina:San_Luis"{ - { - "Argentina", - "1970-01-01 00:00", - "1990-03-14 02:00", - } - { - "Argentina_Western", - "1990-03-14 02:00", - "1991-06-01 04:00", - } - { - "Argentina", - "1991-06-01 04:00", - "1999-10-03 03:00", - } - { - "Argentina_Western", - "1999-10-03 03:00", - "2000-03-03 03:00", - } - { - "Argentina", - "2000-03-03 03:00", - "2004-05-31 03:00", - } - { - "Argentina_Western", - "2004-05-31 03:00", - "2004-07-25 04:00", - } - { - "Argentina", - "2004-07-25 04:00", - "2008-01-21 02:00", - } - { - "Argentina_Western", - "2008-01-21 02:00", - "9999-12-31 23:59", - } - } - "America:Argentina:Tucuman"{ - { - "Argentina", - "1970-01-01 00:00", - "1991-03-03 02:00", - } - { - "Argentina", - "1991-10-20 04:00", - "2004-06-01 03:00", - } - { - "Argentina_Western", - "2004-06-01 03:00", - "2004-06-13 04:00", - } - { - "Argentina", - "2004-06-13 04:00", - "9999-12-31 23:59", - } - } - "America:Argentina:Ushuaia"{ - { - "Argentina", - "1970-01-01 00:00", - "2004-05-30 03:00", - } - { - "Argentina", - "2004-06-20 04:00", - "9999-12-31 23:59", - } - } - "America:Aruba"{ - { - "Atlantic", - } - } - "America:Asuncion"{ - { - "Paraguay", - } - } - "America:Bahia"{ - { - "Brasilia", - } - } - "America:Bahia_Banderas"{ - { - "America_Pacific", - "1970-01-01 00:00", - "1970-01-01 08:00", - } - { - "America_Mountain", - "1970-01-01 08:00", - "2010-04-04 09:00", - } - { - "America_Central", - "2010-04-04 09:00", - "9999-12-31 23:59", - } - } - "America:Barbados"{ - { - "Atlantic", - } - } - "America:Belem"{ - { - "Brasilia", - } - } - "America:Belize"{ - { - "America_Central", - } - } - "America:Blanc-Sablon"{ - { - "Atlantic", - } - } - "America:Boa_Vista"{ - { - "Amazon", - } - } - "America:Bogota"{ - { - "Colombia", - } - } - "America:Boise"{ - { - "America_Mountain", - } - } - "America:Buenos_Aires"{ - { - "Argentina", - } - } - "America:Cambridge_Bay"{ - { - "America_Mountain", - "1970-01-01 00:00", - "1999-10-31 08:00", - } - { - "America_Central", - "1999-10-31 08:00", - "2000-10-29 07:00", - } - { - "America_Eastern", - "2000-10-29 07:00", - "2000-11-05 05:00", - } - { - "America_Central", - "2000-11-05 05:00", - "2001-04-01 09:00", - } - { - "America_Mountain", - "2001-04-01 09:00", - "9999-12-31 23:59", - } - } - "America:Campo_Grande"{ - { - "Amazon", - } - } - "America:Cancun"{ - { - "America_Central", - "1970-01-01 00:00", - "1981-12-23 06:00", - } - { - "America_Eastern", - "1981-12-23 06:00", - "1998-08-02 06:00", - } - { - "America_Central", - "1998-08-02 06:00", - "2015-02-01 08:00", - } - { - "America_Eastern", - "2015-02-01 08:00", - "9999-12-31 23:59", - } - } - "America:Caracas"{ - { - "Venezuela", - } - } - "America:Catamarca"{ - { - "Argentina", - "1970-01-01 00:00", - "1991-03-03 02:00", - } - { - "Argentina", - "1991-10-20 04:00", - "2004-06-01 03:00", - } - { - "Argentina_Western", - "2004-06-01 03:00", - "2004-06-20 04:00", - } - { - "Argentina", - "2004-06-20 04:00", - "9999-12-31 23:59", - } - } - "America:Cayenne"{ - { - "French_Guiana", - } - } - "America:Cayman"{ - { - "America_Eastern", - } - } - "America:Chicago"{ - { - "America_Central", - } - } - "America:Chihuahua"{ - { - "America_Central", - "1970-01-01 00:00", - "1998-04-05 09:00", - } - { - "Mexico_Pacific", - "1998-04-05 09:00", - "9999-12-31 23:59", - } - } - "America:Coral_Harbour"{ - { - "America_Eastern", - } - } - "America:Cordoba"{ - { - "Argentina", - "1970-01-01 00:00", - "1991-03-03 02:00", - } - { - "Argentina", - "1991-10-20 04:00", - "9999-12-31 23:59", - } - } - "America:Costa_Rica"{ - { - "America_Central", - } - } - "America:Creston"{ - { - "America_Mountain", - } - } - "America:Cuiaba"{ - { - "Amazon", - } - } - "America:Curacao"{ - { - "Atlantic", - } - } - "America:Danmarkshavn"{ - { - "Greenland_Western", - "1970-01-01 00:00", - "1996-01-01 03:00", - } - { - "GMT", - "1996-01-01 03:00", - "9999-12-31 23:59", - } - } - "America:Dawson"{ - { - "Yukon", - "1970-01-01 00:00", - "1973-10-28 09:00", - } - { - "America_Pacific", - "1973-10-28 09:00", - "9999-12-31 23:59", - } - } - "America:Dawson_Creek"{ - { - "America_Pacific", - "1970-01-01 00:00", - "1972-08-30 09:00", - } - { - "America_Mountain", - "1972-08-30 09:00", - "9999-12-31 23:59", - } - } - "America:Denver"{ - { - "America_Mountain", - } - } - "America:Detroit"{ - { - "America_Eastern", - } - } - "America:Dominica"{ - { - "Atlantic", - } - } - "America:Edmonton"{ - { - "America_Mountain", - } - } - "America:Eirunepe"{ - { - "Acre", - "1970-01-01 00:00", - "2008-06-24 05:00", - } - { - "Amazon", - "2008-06-24 05:00", - "2013-11-10 04:00", - } - { - "Acre", - "2013-11-10 04:00", - "9999-12-31 23:59", - } - } - "America:El_Salvador"{ - { - "America_Central", - } - } - "America:Fort_Nelson"{ - { - "America_Pacific", - "1970-01-01 00:00", - "2015-03-08 10:00", - } - { - "America_Mountain", - "2015-03-08 10:00", - "9999-12-31 23:59", - } - } - "America:Fortaleza"{ - { - "Brasilia", - } - } - "America:Glace_Bay"{ - { - "Atlantic", - } - } - "America:Godthab"{ - { - "Greenland_Western", - } - } - "America:Goose_Bay"{ - { - "Atlantic", - "1970-01-01 00:00", - "1988-04-03 04:01", - } - { - "Goose_Bay", - "1988-04-03 04:01", - "1988-10-30 02:01", - } - { - "Atlantic", - "1988-10-30 02:01", - "9999-12-31 23:59", - } - } - "America:Grand_Turk"{ - { - "America_Eastern", - "1970-01-01 00:00", - "2015-11-01 06:00", - } - { - "Atlantic", - "2015-11-01 06:00", - "9999-12-31 23:59", - } - } - "America:Grenada"{ - { - "Atlantic", - } - } - "America:Guadeloupe"{ - { - "Atlantic", - } - } - "America:Guatemala"{ - { - "America_Central", - } - } - "America:Guayaquil"{ - { - "Ecuador", - } - } - "America:Guyana"{ - { - "Guyana", - } - } - "America:Halifax"{ - { - "Atlantic", - } - } - "America:Havana"{ - { - "Cuba", - } - } - "America:Hermosillo"{ - { - "America_Pacific", - "1970-01-01 00:00", - "1970-01-01 08:00", - } - { - "Mexico_Pacific", - "1970-01-01 08:00", - "9999-12-31 23:59", - } - } - "America:Indiana:Knox"{ - { - "America_Central", - "1970-01-01 00:00", - "1991-10-27 07:00", - } - { - "America_Eastern", - "1991-10-27 07:00", - "2006-04-02 07:00", - } - { - "America_Central", - "2006-04-02 07:00", - "9999-12-31 23:59", - } - } - "America:Indiana:Marengo"{ - { - "America_Eastern", - "1970-01-01 00:00", - "1974-01-06 07:00", - } - { - "America_Central", - "1974-01-06 07:00", - "1974-10-27 07:00", - } - { - "America_Eastern", - "1974-10-27 07:00", - "9999-12-31 23:59", - } - } - "America:Indiana:Petersburg"{ - { - "America_Central", - "1970-01-01 00:00", - "1977-10-30 07:00", - } - { - "America_Eastern", - "1977-10-30 07:00", - "2006-04-02 07:00", - } - { - "America_Central", - "2006-04-02 07:00", - "2007-11-04 07:00", - } - { - "America_Eastern", - "2007-11-04 07:00", - "9999-12-31 23:59", - } - } - "America:Indiana:Tell_City"{ - { - "America_Eastern", - "1970-01-01 00:00", - "2006-04-02 07:00", - } - { - "America_Central", - "2006-04-02 07:00", - "9999-12-31 23:59", - } - } - "America:Indiana:Vevay"{ - { - "America_Eastern", - } - } - "America:Indiana:Vincennes"{ - { - "America_Eastern", - "1970-01-01 00:00", - "2006-04-02 07:00", - } - { - "America_Central", - "2006-04-02 07:00", - "2007-11-04 07:00", - } - { - "America_Eastern", - "2007-11-04 07:00", - "9999-12-31 23:59", - } - } - "America:Indiana:Winamac"{ - { - "America_Eastern", - "1970-01-01 00:00", - "2006-04-02 07:00", - } - { - "America_Central", - "2006-04-02 07:00", - "2007-03-11 08:00", - } - { - "America_Eastern", - "2007-03-11 08:00", - "9999-12-31 23:59", - } - } - "America:Indianapolis"{ - { - "America_Eastern", - } - } - "America:Inuvik"{ - { - "America_Pacific", - "1970-01-01 00:00", - "1979-04-29 10:00", - } - { - "America_Mountain", - "1979-04-29 10:00", - "9999-12-31 23:59", - } - } - "America:Iqaluit"{ - { - "America_Eastern", - "1970-01-01 00:00", - "1999-10-31 06:00", - } - { - "America_Central", - "1999-10-31 06:00", - "2000-10-29 07:00", - } - { - "America_Eastern", - "2000-10-29 07:00", - "9999-12-31 23:59", - } - } - "America:Jamaica"{ - { - "America_Eastern", - } - } - "America:Jujuy"{ - { - "Argentina", - "1970-01-01 00:00", - "1990-03-04 02:00", - } - { - "Argentina", - "1991-10-06 04:00", - "9999-12-31 23:59", - } - } - "America:Juneau"{ - { - "America_Pacific", - "1970-01-01 00:00", - "1980-04-27 10:00", - } - { - "Yukon", - "1980-04-27 10:00", - "1980-10-26 10:00", - } - { - "America_Pacific", - "1980-10-26 10:00", - "1983-10-30 09:00", - } - { - "Yukon", - "1983-10-30 09:00", - "1983-11-30 09:00", - } - { - "Alaska", - "1983-11-30 09:00", - "9999-12-31 23:59", - } - } - "America:Kentucky:Monticello"{ - { - "America_Central", - "1970-01-01 00:00", - "2000-10-29 07:00", - } - { - "America_Eastern", - "2000-10-29 07:00", - "9999-12-31 23:59", - } - } - "America:Kralendijk"{ - { - "Atlantic", - } - } - "America:La_Paz"{ - { - "Bolivia", - } - } - "America:Lima"{ - { - "Peru", - } - } - "America:Los_Angeles"{ - { - "America_Pacific", - } - } - "America:Louisville"{ - { - "America_Eastern", - "1970-01-01 00:00", - "1974-01-06 07:00", - } - { - "America_Central", - "1974-01-06 07:00", - "1974-10-27 07:00", - } - { - "America_Eastern", - "1974-10-27 07:00", - "9999-12-31 23:59", - } - } - "America:Lower_Princes"{ - { - "Atlantic", - } - } - "America:Maceio"{ - { - "Brasilia", - } - } - "America:Managua"{ - { - "America_Central", - "1970-01-01 00:00", - "1973-05-01 06:00", - } - { - "America_Eastern", - "1973-05-01 06:00", - "1975-02-16 05:00", - } - { - "America_Central", - "1975-02-16 05:00", - "1992-01-01 10:00", - } - { - "America_Eastern", - "1992-01-01 10:00", - "1992-09-24 05:00", - } - { - "America_Central", - "1992-09-24 05:00", - "1993-01-01 06:00", - } - { - "America_Eastern", - "1993-01-01 06:00", - "1997-01-01 05:00", - } - { - "America_Central", - "1997-01-01 05:00", - "9999-12-31 23:59", - } - } - "America:Manaus"{ - { - "Amazon", - } - } - "America:Marigot"{ - { - "Atlantic", - } - } - "America:Martinique"{ - { - "Atlantic", - } - } - "America:Matamoros"{ - { - "America_Central", - } - } - "America:Mazatlan"{ - { - "America_Pacific", - "1970-01-01 00:00", - "1970-01-01 08:00", - } - { - "Mexico_Pacific", - "1970-01-01 08:00", - "9999-12-31 23:59", - } - } - "America:Mendoza"{ - { - "Argentina", - "1970-01-01 00:00", - "1990-03-04 02:00", - } - { - "Argentina", - "1992-10-18 04:00", - "2004-05-23 03:00", - } - { - "Argentina", - "2004-09-26 04:00", - "9999-12-31 23:59", - } - } - "America:Menominee"{ - { - "America_Eastern", - "1970-01-01 00:00", - "1973-04-29 07:00", - } - { - "America_Central", - "1973-04-29 07:00", - "9999-12-31 23:59", - } - } - "America:Merida"{ - { - "America_Central", - "1970-01-01 00:00", - "1981-12-23 06:00", - } - { - "America_Eastern", - "1981-12-23 06:00", - "1982-12-02 05:00", - } - { - "America_Central", - "1982-12-02 05:00", - "9999-12-31 23:59", - } - } - "America:Metlakatla"{ - { - "America_Pacific", - "1970-01-01 00:00", - "2015-11-01 10:00", - } - { - "Alaska", - "2015-11-01 10:00", - "9999-12-31 23:59", - } - } - "America:Mexico_City"{ - { - "America_Central", - } - } - "America:Miquelon"{ - { - "Atlantic", - "1970-01-01 00:00", - "1980-05-01 04:00", - } - { - "Pierre_Miquelon", - "1980-05-01 04:00", - "9999-12-31 23:59", - } - } - "America:Moncton"{ - { - "Atlantic", - } - } - "America:Monterrey"{ - { - "America_Central", - } - } - "America:Montevideo"{ - { - "Uruguay", - } - } - "America:Montserrat"{ - { - "Atlantic", - } - } - "America:Nassau"{ - { - "America_Eastern", - } - } - "America:New_York"{ - { - "America_Eastern", - } - } - "America:Nipigon"{ - { - "America_Eastern", - } - } - "America:Nome"{ - { - "Bering", - "1970-01-01 00:00", - "1983-10-30 12:00", - } - { - "Yukon", - "1983-10-30 12:00", - "1983-11-30 09:00", - } - { - "Alaska", - "1983-11-30 09:00", - "9999-12-31 23:59", - } - } - "America:Noronha"{ - { - "Noronha", - } - } - "America:North_Dakota:Beulah"{ - { - "America_Mountain", - "1970-01-01 00:00", - "2010-11-07 08:00", - } - { - "America_Central", - "2010-11-07 08:00", - "9999-12-31 23:59", - } - } - "America:North_Dakota:Center"{ - { - "America_Mountain", - "1970-01-01 00:00", - "1992-10-25 08:00", - } - { - "America_Central", - "1992-10-25 08:00", - "9999-12-31 23:59", - } - } - "America:North_Dakota:New_Salem"{ - { - "America_Mountain", - "1970-01-01 00:00", - "2003-10-26 08:00", - } - { - "America_Central", - "2003-10-26 08:00", - "9999-12-31 23:59", - } - } - "America:Ojinaga"{ - { - "America_Central", - "1970-01-01 00:00", - "1998-04-05 09:00", - } - { - "America_Mountain", - "1998-04-05 09:00", - "9999-12-31 23:59", - } - } - "America:Panama"{ - { - "America_Eastern", - } - } - "America:Pangnirtung"{ - { - "Atlantic", - "1970-01-01 00:00", - "1995-04-02 06:00", - } - { - "America_Eastern", - "1995-04-02 06:00", - "1999-10-31 06:00", - } - { - "America_Central", - "1999-10-31 06:00", - "2000-10-29 07:00", - } - { - "America_Eastern", - "2000-10-29 07:00", - "9999-12-31 23:59", - } - } - "America:Paramaribo"{ - { - "Dutch_Guiana", - "1970-01-01 00:00", - "1975-11-20 03:30", - } - { - "Suriname", - "1975-11-20 03:30", - "9999-12-31 23:59", - } - } - "America:Phoenix"{ - { - "America_Mountain", - } - } - "America:Port-au-Prince"{ - { - "America_Eastern", - } - } - "America:Port_of_Spain"{ - { - "Atlantic", - } - } - "America:Porto_Velho"{ - { - "Amazon", - } - } - "America:Puerto_Rico"{ - { - "Atlantic", - } - } - "America:Rainy_River"{ - { - "America_Central", - } - } - "America:Rankin_Inlet"{ - { - "America_Central", - "1970-01-01 00:00", - "2000-10-29 07:00", - } - { - "America_Eastern", - "2000-10-29 07:00", - "2001-04-01 08:00", - } - { - "America_Central", - "2001-04-01 08:00", - "9999-12-31 23:59", - } - } - "America:Recife"{ - { - "Brasilia", - } - } - "America:Regina"{ - { - "America_Central", - } - } - "America:Resolute"{ - { - "America_Central", - "1970-01-01 00:00", - "2000-10-29 07:00", - } - { - "America_Eastern", - "2000-10-29 07:00", - "2001-04-01 08:00", - } - { - "America_Central", - "2001-04-01 08:00", - "2006-10-29 07:00", - } - { - "America_Eastern", - "2006-10-29 07:00", - "2007-03-11 08:00", - } - { - "America_Central", - "2007-03-11 08:00", - "9999-12-31 23:59", - } - } - "America:Rio_Branco"{ - { - "Acre", - "1970-01-01 00:00", - "2008-06-24 05:00", - } - { - "Amazon", - "2008-06-24 05:00", - "2013-11-10 04:00", - } - { - "Acre", - "2013-11-10 04:00", - "9999-12-31 23:59", - } - } - "America:Santa_Isabel"{ - { - "Mexico_Northwest", - } - } - "America:Santarem"{ - { - "Amazon", - "1970-01-01 00:00", - "2008-06-24 04:00", - } - { - "Brasilia", - "2008-06-24 04:00", - "9999-12-31 23:59", - } - } - "America:Santiago"{ - { - "Chile", - } - } - "America:Santo_Domingo"{ - { - "Dominican", - "1970-01-01 00:00", - "1974-10-27 05:00", - } - { - "Atlantic", - "1974-10-27 05:00", - "2000-10-29 06:00", - } - { - "America_Eastern", - "2000-10-29 06:00", - "2000-12-03 06:00", - } - { - "Atlantic", - "2000-12-03 06:00", - "9999-12-31 23:59", - } - } - "America:Sao_Paulo"{ - { - "Brasilia", - } - } - "America:Scoresbysund"{ - { - "Greenland_Central", - "1970-01-01 00:00", - "1981-03-29 02:00", - } - { - "Greenland_Eastern", - "1981-03-29 02:00", - "9999-12-31 23:59", - } - } - "America:Sitka"{ - { - "America_Pacific", - "1970-01-01 00:00", - "1983-10-30 09:00", - } - { - "Yukon", - "1983-10-30 09:00", - "1983-11-30 09:00", - } - { - "Alaska", - "1983-11-30 09:00", - "9999-12-31 23:59", - } - } - "America:St_Barthelemy"{ - { - "Atlantic", - } - } - "America:St_Johns"{ - { - "Newfoundland", - } - } - "America:St_Kitts"{ - { - "Atlantic", - } - } - "America:St_Lucia"{ - { - "Atlantic", - } - } - "America:St_Thomas"{ - { - "Atlantic", - } - } - "America:St_Vincent"{ - { - "Atlantic", - } - } - "America:Swift_Current"{ - { - "America_Mountain", - "1970-01-01 00:00", - "1972-04-30 09:00", - } - { - "America_Central", - "1972-04-30 09:00", - "9999-12-31 23:59", - } - } - "America:Tegucigalpa"{ - { - "America_Central", - } - } - "America:Thule"{ - { - "Atlantic", - } - } - "America:Thunder_Bay"{ - { - "America_Eastern", - } - } - "America:Tijuana"{ - { - "America_Pacific", - } - } - "America:Toronto"{ - { - "America_Eastern", - } - } - "America:Tortola"{ - { - "Atlantic", - } - } - "America:Vancouver"{ - { - "America_Pacific", - } - } - "America:Whitehorse"{ - { - "America_Pacific", - } - } - "America:Winnipeg"{ - { - "America_Central", - } - } - "America:Yakutat"{ - { - "Yukon", - "1970-01-01 00:00", - "1983-11-30 09:00", - } - { - "Alaska", - "1983-11-30 09:00", - "9999-12-31 23:59", - } - } - "America:Yellowknife"{ - { - "America_Mountain", - } - } - "Antarctica:Casey"{ - { - "Australia_Western", - "1970-01-01 00:00", - "2009-10-17 18:00", - } - { - "Casey", - "2009-10-17 18:00", - "2010-03-04 15:00", - } - { - "Australia_Western", - "2010-03-04 15:00", - "2011-10-27 18:00", - } - { - "Casey", - "2011-10-27 18:00", - "2012-02-21 17:00", - } - { - "Australia_Western", - "2012-02-21 17:00", - "2016-10-21 16:00", - } - { - "Casey", - "2016-10-21 16:00", - "9999-12-31 23:59", - } - } - "Antarctica:Davis"{ - { - "Davis", - } - } - "Antarctica:DumontDUrville"{ - { - "DumontDUrville", - } - } - "Antarctica:Macquarie"{ - { - "Australia_Eastern", - "1970-01-01 00:00", - "2010-04-03 16:00", - } - { - "Macquarie", - "2010-04-03 16:00", - "9999-12-31 23:59", - } - } - "Antarctica:Mawson"{ - { - "Mawson", - } - } - "Antarctica:McMurdo"{ - { - "New_Zealand", - } - } - "Antarctica:Palmer"{ - { - "Argentina", - "1970-01-01 00:00", - "1982-05-01 03:00", - } - { - "Chile", - "1982-05-01 03:00", - "9999-12-31 23:59", - } - } - "Antarctica:Rothera"{ - { - "Rothera", - } - } - "Antarctica:Syowa"{ - { - "Syowa", - } - } - "Antarctica:Troll"{ - { - "GMT", - } - } - "Antarctica:Vostok"{ - { - "Vostok", - } - } - "Arctic:Longyearbyen"{ - { - "Europe_Central", - } - } - "Asia:Aden"{ - { - "Arabian", - } - } - "Asia:Almaty"{ - { - "Almaty", - "1970-01-01 00:00", - "2004-10-30 20:00", - } - { - "Kazakhstan_Eastern", - "2004-10-30 20:00", - "9999-12-31 23:59", - } - } - "Asia:Amman"{ - { - "Europe_Eastern", - } - } - "Asia:Anadyr"{ - { - "Anadyr", - "1970-01-01 00:00", - "2010-03-27 14:00", - } - { - "Magadan", - "2010-03-27 14:00", - "2014-10-25 14:00", - } - { - "Anadyr", - "2014-10-25 14:00", - "9999-12-31 23:59", - } - } - "Asia:Aqtau"{ - { - "Shevchenko", - "1970-01-01 00:00", - "1991-12-15 19:00", - } - { - "Aqtau", - "1991-12-15 19:00", - "2004-10-30 22:00", - } - { - "Kazakhstan_Western", - "2004-10-30 22:00", - "9999-12-31 23:59", - } - } - "Asia:Aqtobe"{ - { - "Aktyubinsk", - "1970-01-01 00:00", - "1991-12-15 19:00", - } - { - "Aqtobe", - "1991-12-15 19:00", - "2004-10-30 21:00", - } - { - "Kazakhstan_Western", - "2005-10-30 21:00", - "9999-12-31 23:59", - } - } - "Asia:Ashgabat"{ - { - "Ashkhabad", - "1970-01-01 00:00", - "1991-10-26 20:00", - } - { - "Turkmenistan", - "1991-10-26 20:00", - "9999-12-31 23:59", - } - } - "Asia:Atyrau"{ - { - "Kazakhstan_Western", - "2004-10-30 22:00", - "9999-12-31 23:59", - } - } - "Asia:Baghdad"{ - { - "Arabian", - } - } - "Asia:Bahrain"{ - { - "Gulf", - "1970-01-01 00:00", - "1972-05-31 20:00", - } - { - "Arabian", - "1972-05-31 20:00", - "9999-12-31 23:59", - } - } - "Asia:Baku"{ - { - "Baku", - "1970-01-01 00:00", - "1991-08-29 20:00", - } - { - "Azerbaijan", - "1991-08-29 20:00", - "9999-12-31 23:59", - } - } - "Asia:Bangkok"{ - { - "Indochina", - } - } - "Asia:Beirut"{ - { - "Europe_Eastern", - } - } - "Asia:Bishkek"{ - { - "Frunze", - "1970-01-01 00:00", - "1991-08-30 20:00", - } - { - "Kyrgystan", - "1991-08-30 20:00", - "9999-12-31 23:59", - } - } - "Asia:Brunei"{ - { - "Brunei", - } - } - "Asia:Calcutta"{ - { - "India", - } - } - "Asia:Chita"{ - { - "Yakutsk", - "1970-01-01 00:00", - "2014-10-25 16:00", - } - { - "Irkutsk", - "2014-10-25 16:00", - "2016-03-26 18:00", - } - { - "Yakutsk", - "2016-03-26 18:00", - "9999-12-31 23:59", - } - } - "Asia:Choibalsan"{ - { - "Mongolia", - "1970-01-01 00:00", - "1983-03-31 16:00", - } - { - "Choibalsan", - "1983-03-31 16:00", - "9999-12-31 23:59", - } - } - "Asia:Colombo"{ - { - "India", - "1970-01-01 00:00", - "1996-05-24 18:30", - } - { - "Lanka", - "1996-05-24 18:30", - "2006-04-14 18:30", - } - { - "India", - "2006-04-14 18:30", - "9999-12-31 23:59", - } - } - "Asia:Damascus"{ - { - "Europe_Eastern", - } - } - "Asia:Dhaka"{ - { - "Dacca", - "1970-01-01 00:00", - "1971-03-25 18:00", - } - { - "Bangladesh", - "1971-03-25 18:00", - "9999-12-31 23:59", - } - } - "Asia:Dili"{ - { - "East_Timor", - "1970-01-01 00:00", - "1976-05-02 15:00", - } - { - "Indonesia_Central", - "1976-05-02 15:00", - "2000-09-16 16:00", - } - { - "East_Timor", - "2000-09-16 16:00", - "9999-12-31 23:59", - } - } - "Asia:Dubai"{ - { - "Gulf", - } - } - "Asia:Dushanbe"{ - { - "Dushanbe", - "1970-01-01 00:00", - "1991-09-08 21:00", - } - { - "Tajikistan", - "1991-09-08 21:00", - "9999-12-31 23:59", - } - } - "Asia:Famagusta"{ - { - "Europe_Eastern", - "1970-01-01 00:00", - "2016-09-07 21:00", - } - } - "Asia:Gaza"{ - { - "Israel", - "1970-01-01 00:00", - "1995-12-31 22:00", - } - { - "Europe_Eastern", - "1995-12-31 22:00", - "9999-12-31 23:59", - } - } - "Asia:Hebron"{ - { - "Israel", - "1970-01-01 00:00", - "1995-12-31 22:00", - } - { - "Europe_Eastern", - "1995-12-31 22:00", - "9999-12-31 23:59", - } - } - "Asia:Hong_Kong"{ - { - "Hong_Kong", - } - } - "Asia:Hovd"{ - { - "Hovd", - } - } - "Asia:Irkutsk"{ - { - "Irkutsk", - } - } - "Asia:Jakarta"{ - { - "Indonesia_Western", - } - } - "Asia:Jayapura"{ - { - "Indonesia_Eastern", - } - } - "Asia:Jerusalem"{ - { - "Israel", - } - } - "Asia:Kabul"{ - { - "Afghanistan", - } - } - "Asia:Kamchatka"{ - { - "Kamchatka", - } - } - "Asia:Karachi"{ - { - "Karachi", - "1970-01-01 00:00", - "1971-03-25 19:00", - } - { - "Pakistan", - "1971-03-25 19:00", - "9999-12-31 23:59", - } - } - "Asia:Katmandu"{ - { - "Nepal", - } - } - "Asia:Khandyga"{ - { - "Yakutsk", - "1970-01-01 00:00", - "2003-12-31 15:00", - } - { - "Vladivostok", - "2003-12-31 15:00", - "2011-09-12 13:00", - } - { - "Yakutsk", - "2011-09-12 13:00", - "9999-12-31 23:59", - } - } - "Asia:Krasnoyarsk"{ - { - "Krasnoyarsk", - } - } - "Asia:Kuala_Lumpur"{ - { - "Malaya", - "1970-01-01 00:00", - "1981-12-31 16:30", - } - { - "Malaysia", - "1981-12-31 16:30", - "9999-12-31 23:59", - } - } - "Asia:Kuching"{ - { - "Borneo", - "1970-01-01 00:00", - "1981-12-31 16:00", - } - { - "Malaysia", - "1981-12-31 16:00", - "9999-12-31 23:59", - } - } - "Asia:Kuwait"{ - { - "Arabian", - } - } - "Asia:Macau"{ - { - "Macau", - "1970-01-01 00:00", - "1999-12-19 16:00", - } - { - "China", - "1999-12-19 16:00", - "9999-12-31 23:59", - } - } - "Asia:Magadan"{ - { - "Magadan", - } - } - "Asia:Makassar"{ - { - "Indonesia_Central", - } - } - "Asia:Manila"{ - { - "Philippines", - } - } - "Asia:Muscat"{ - { - "Gulf", - } - } - "Asia:Nicosia"{ - { - "Europe_Eastern", - } - } - "Asia:Novokuznetsk"{ - { - "Krasnoyarsk", - "1970-01-01 00:00", - "2010-03-27 19:00", - } - { - "Novosibirsk", - "2010-03-27 19:00", - "2014-10-25 19:00", - } - { - "Krasnoyarsk", - "2014-10-25 19:00", - "9999-12-31 23:59", - } - } - "Asia:Novosibirsk"{ - { - "Novosibirsk", - } - } - "Asia:Omsk"{ - { - "Omsk", - } - } - "Asia:Oral"{ - { - "Uralsk", - "1970-01-01 00:00", - "1991-12-15 20:00", - } - { - "Oral", - "1991-12-15 20:00", - "2004-10-30 22:00", - } - { - "Kazakhstan_Western", - "2004-10-30 22:00", - "9999-12-31 23:59", - } - } - "Asia:Phnom_Penh"{ - { - "Indochina", - } - } - "Asia:Pontianak"{ - { - "Indonesia_Central", - "1970-01-01 00:00", - "1987-12-31 16:00", - } - { - "Indonesia_Western", - "1987-12-31 16:00", - "9999-12-31 23:59", - } - } - "Asia:Pyongyang"{ - { - "Korea", - "1970-01-01 00:00", - "2015-08-14 15:00", - } - { - "Pyongyang", - "2015-08-14 15:00", - "9999-12-31 23:59", - } - } - "Asia:Qatar"{ - { - "Gulf", - "1970-01-01 00:00", - "1972-05-31 20:00", - } - { - "Arabian", - "1972-05-31 20:00", - "9999-12-31 23:59", - } - } - "Asia:Qyzylorda"{ - { - "Kizilorda", - "1970-01-01 00:00", - "1991-12-15 19:00", - } - { - "Qyzylorda", - "1991-12-15 19:00", - "2004-10-30 21:00", - } - { - "Kazakhstan_Eastern", - "2004-10-30 21:00", - "9999-12-31 23:59", - } - } - "Asia:Rangoon"{ - { - "Myanmar", - } - } - "Asia:Riyadh"{ - { - "Arabian", - } - } - "Asia:Saigon"{ - { - "Indochina", - "1975-06-12 16:00", - "9999-12-31 23:59", - } - } - "Asia:Sakhalin"{ - { - "Sakhalin", - } - } - "Asia:Samarkand"{ - { - "Samarkand", - "1970-01-01 00:00", - "1981-09-30 18:00", - } - { - "Tashkent", - "1981-09-30 18:00", - "1982-03-31 18:00", - } - { - "Samarkand", - "1982-03-31 18:00", - "1991-08-31 18:00", - } - { - "Uzbekistan", - "1991-08-31 18:00", - "9999-12-31 23:59", - } - } - "Asia:Seoul"{ - { - "Korea", - } - } - "Asia:Shanghai"{ - { - "China", - } - } - "Asia:Singapore"{ - { - "Singapore", - } - } - "Asia:Srednekolymsk"{ - { - "Magadan", - "1970-01-01 00:00", - "2014-10-25 14:00", - } - } - "Asia:Taipei"{ - { - "Taipei", - } - } - "Asia:Tashkent"{ - { - "Tashkent", - "1970-01-01 00:00", - "1991-08-31 18:00", - } - { - "Uzbekistan", - "1991-08-31 18:00", - "9999-12-31 23:59", - } - } - "Asia:Tbilisi"{ - { - "Tbilisi", - "1970-01-01 00:00", - "1991-04-08 20:00", - } - { - "Georgia", - "1991-04-08 20:00", - "9999-12-31 23:59", - } - } - "Asia:Tehran"{ - { - "Iran", - } - } - "Asia:Thimphu"{ - { - "India", - "1970-01-01 00:00", - "1987-09-30 18:30", - } - { - "Bhutan", - "1987-09-30 18:30", - "9999-12-31 23:59", - } - } - "Asia:Tokyo"{ - { - "Japan", - } - } - "Asia:Ulaanbaatar"{ - { - "Mongolia", - } - } - "Asia:Urumqi"{ - { - "Urumqi", - } - } - "Asia:Ust-Nera"{ - { - "Yakutsk", - "1970-01-01 00:00", - "1981-03-31 15:00", - } - { - "Magadan", - "1981-03-31 15:00", - "2011-09-12 12:00", - } - { - "Vladivostok", - "2011-09-12 12:00", - "9999-12-31 23:59", - } - } - "Asia:Vientiane"{ - { - "Indochina", - } - } - "Asia:Vladivostok"{ - { - "Vladivostok", - } - } - "Asia:Yakutsk"{ - { - "Yakutsk", - } - } - "Asia:Yekaterinburg"{ - { - "Sverdlovsk", - "1970-01-01 00:00", - "1992-01-18 22:00", - } - { - "Yekaterinburg", - "1992-01-18 22:00", - "9999-12-31 23:59", - } - } - "Asia:Yerevan"{ - { - "Yerevan", - "1970-01-01 00:00", - "1991-09-22 20:00", - } - { - "Armenia", - "1991-09-22 20:00", - "9999-12-31 23:59", - } - } - "Atlantic:Azores"{ - { - "Azores", - "1970-01-01 00:00", - "1992-09-27 02:00", - } - { - "Europe_Western", - "1992-09-27 02:00", - "1993-03-28 01:00", - } - { - "Azores", - "1993-03-28 01:00", - "9999-12-31 23:59", - } - } - "Atlantic:Bermuda"{ - { - "Atlantic", - } - } - "Atlantic:Canary"{ - { - "Europe_Western", - } - } - "Atlantic:Cape_Verde"{ - { - "Cape_Verde", - } - } - "Atlantic:Faeroe"{ - { - "Europe_Western", - } - } - "Atlantic:Madeira"{ - { - "Europe_Western", - } - } - "Atlantic:Reykjavik"{ - { - "GMT", - } - } - "Atlantic:South_Georgia"{ - { - "South_Georgia", - } - } - "Atlantic:St_Helena"{ - { - "GMT", - } - } - "Atlantic:Stanley"{ - { - "Falkland", - } - } - "Australia:Adelaide"{ - { - "Australia_Central", - } - } - "Australia:Brisbane"{ - { - "Australia_Eastern", - } - } - "Australia:Broken_Hill"{ - { - "Australia_Central", - } - } - "Australia:Currie"{ - { - "Australia_Eastern", - } - } - "Australia:Darwin"{ - { - "Australia_Central", - } - } - "Australia:Eucla"{ - { - "Australia_CentralWestern", - } - } - "Australia:Hobart"{ - { - "Australia_Eastern", - } - } - "Australia:Lindeman"{ - { - "Australia_Eastern", - } - } - "Australia:Lord_Howe"{ - { - "Australia_Eastern", - "1970-01-01 00:00", - "1981-02-28 14:00", - } - { - "Lord_Howe", - "1981-02-28 14:00", - "9999-12-31 23:59", - } - } - "Australia:Melbourne"{ - { - "Australia_Eastern", - } - } - "Australia:Perth"{ - { - "Australia_Western", - } - } - "Australia:Sydney"{ - { - "Australia_Eastern", - } - } - "CST6CDT"{ - { - "America_Central", - } - } - "EST5EDT"{ - { - "America_Eastern", - } - } - "Europe:Amsterdam"{ - { - "Europe_Central", - } - } - "Europe:Andorra"{ - { - "Europe_Central", - } - } - "Europe:Astrakhan"{ - { - "Moscow", - "1992-03-28 22:00", - "2016-03-26 23:00", - } - } - "Europe:Athens"{ - { - "Europe_Eastern", - } - } - "Europe:Belgrade"{ - { - "Europe_Central", - } - } - "Europe:Berlin"{ - { - "Europe_Central", - } - } - "Europe:Bratislava"{ - { - "Europe_Central", - } - } - "Europe:Brussels"{ - { - "Europe_Central", - } - } - "Europe:Bucharest"{ - { - "Europe_Eastern", - } - } - "Europe:Budapest"{ - { - "Europe_Central", - } - } - "Europe:Busingen"{ - { - "Europe_Central", - } - } - "Europe:Chisinau"{ - { - "Moscow", - "1970-01-01 00:00", - "1990-05-05 21:00", - } - { - "Europe_Eastern", - "1990-05-05 21:00", - "9999-12-31 23:59", - } - } - "Europe:Copenhagen"{ - { - "Europe_Central", - } - } - "Europe:Dublin"{ - { - "Irish", - "1970-01-01 00:00", - "1971-10-31 02:00", - } - { - "GMT", - "1971-10-31 02:00", - "9999-12-31 23:59", - } - } - "Europe:Gibraltar"{ - { - "Europe_Central", - } - } - "Europe:Guernsey"{ - { - "British", - "1970-01-01 00:00", - "1971-10-31 02:00", - } - { - "GMT", - "1971-10-31 02:00", - "9999-12-31 23:59", - } - } - "Europe:Helsinki"{ - { - "Europe_Eastern", - } - } - "Europe:Isle_of_Man"{ - { - "British", - "1970-01-01 00:00", - "1971-10-31 02:00", - } - { - "GMT", - "1971-10-31 02:00", - "9999-12-31 23:59", - } - } - "Europe:Istanbul"{ - { - "Europe_Eastern", - "1970-01-01 00:00", - "1978-10-14 21:00", - } - { - "Turkey", - "1978-10-14 21:00", - "1985-04-19 21:00", - } - { - "Europe_Eastern", - "1985-04-19 21:00", - "2016-09-06 21:00", - } - { - "Turkey", - "2016-09-06 21:00", - "9999-12-31 23:59", - } - } - "Europe:Jersey"{ - { - "British", - "1970-01-01 00:00", - "1971-10-31 02:00", - } - { - "GMT", - "1971-10-31 02:00", - "9999-12-31 23:59", - } - } - "Europe:Kaliningrad"{ - { - "Moscow", - "1970-01-01 00:00", - "1989-03-25 23:00", - } - { - "Europe_Eastern", - "1989-03-25 23:00", - "2011-03-27 00:00", - } - { - "Europe_Further_Eastern", - "2011-03-27 00:00", - "2014-10-25 23:00", - } - { - "Europe_Eastern", - "2014-10-25 23:00", - "9999-12-31 23:59", - } - } - "Europe:Kiev"{ - { - "Moscow", - "1970-01-01 00:00", - "1990-06-30 22:00", - } - { - "Europe_Eastern", - "1990-06-30 22:00", - "9999-12-31 23:59", - } - } - "Europe:Lisbon"{ - { - "Europe_Central", - "1970-01-01 00:00", - "1976-09-26 00:00", - } - { - "Europe_Western", - "1976-09-26 00:00", - "1992-09-27 01:00", - } - { - "Europe_Central", - "1992-09-27 01:00", - "1996-03-31 01:00", - } - { - "Europe_Western", - "1996-03-31 01:00", - "9999-12-31 23:59", - } - } - "Europe:Ljubljana"{ - { - "Europe_Central", - } - } - "Europe:London"{ - { - "British", - "1970-01-01 00:00", - "1971-10-31 02:00", - } - { - "GMT", - "1971-10-31 02:00", - "9999-12-31 23:59", - } - } - "Europe:Luxembourg"{ - { - "Europe_Central", - } - } - "Europe:Madrid"{ - { - "Europe_Central", - } - } - "Europe:Malta"{ - { - "Europe_Central", - } - } - "Europe:Mariehamn"{ - { - "Europe_Eastern", - } - } - "Europe:Minsk"{ - { - "Moscow", - "1970-01-01 00:00", - "1991-03-30 23:00", - } - { - "Europe_Eastern", - "1991-03-30 23:00", - "2011-03-27 00:00", - } - { - "Europe_Further_Eastern", - "2011-03-27 00:00", - "2014-10-26 22:00", - } - { - "Moscow", - "2014-10-26 22:00", - "9999-12-31 23:59", - } - } - "Europe:Monaco"{ - { - "Europe_Central", - } - } - "Europe:Moscow"{ - { - "Moscow", - "1970-01-01 00:00", - "1991-03-30 23:00", - } - { - "Europe_Eastern", - "1991-03-30 23:00", - "1992-01-19 00:00", - } - { - "Moscow", - "1992-01-19 00:00", - "9999-12-31 23:59", - } - } - "Europe:Oslo"{ - { - "Europe_Central", - } - } - "Europe:Paris"{ - { - "Europe_Central", - } - } - "Europe:Podgorica"{ - { - "Europe_Central", - } - } - "Europe:Prague"{ - { - "Europe_Central", - } - } - "Europe:Riga"{ - { - "Moscow", - "1970-01-01 00:00", - "1989-03-25 23:00", - } - { - "Europe_Eastern", - "1989-03-25 23:00", - "9999-12-31 23:59", - } - } - "Europe:Rome"{ - { - "Europe_Central", - } - } - "Europe:Samara"{ - { - "Kuybyshev", - "1970-01-01 00:00", - "1989-03-25 22:00", - } - { - "Moscow", - "1989-03-25 22:00", - "1991-03-30 23:00", - } - { - "Europe_Eastern", - "1991-03-30 23:00", - "1991-09-29 00:00", - } - { - "Samara", - "1991-09-29 00:00", - "9999-12-31 23:59", - } - } - "Europe:San_Marino"{ - { - "Europe_Central", - } - } - "Europe:Sarajevo"{ - { - "Europe_Central", - } - } - "Europe:Saratov"{ - { - "Moscow", - "1992-03-28 22:00", - "2016-12-03 23:00", - } - } - "Europe:Simferopol"{ - { - "Moscow", - "1970-01-01 00:00", - "1990-06-30 23:00", - } - { - "Europe_Eastern", - "1990-06-30 23:00", - "1994-04-30 21:00", - } - { - "Moscow", - "1994-04-30 21:00", - "1997-03-30 01:00", - } - { - "Europe_Eastern", - "1997-03-30 01:00", - "2014-03-30 00:00", - } - { - "Moscow", - "2014-03-30 00:00", - "9999-12-31 23:59", - } - } - "Europe:Skopje"{ - { - "Europe_Central", - } - } - "Europe:Sofia"{ - { - "Europe_Eastern", - } - } - "Europe:Stockholm"{ - { - "Europe_Central", - } - } - "Europe:Tallinn"{ - { - "Moscow", - "1970-01-01 00:00", - "1989-03-25 23:00", - } - { - "Europe_Eastern", - "1989-03-25 23:00", - "9999-12-31 23:59", - } - } - "Europe:Tirane"{ - { - "Europe_Central", - } - } - "Europe:Ulyanovsk"{ - { - "Moscow", - "1992-01-19 00:00", - "2016-03-26 23:00", - } - } - "Europe:Uzhgorod"{ - { - "Moscow", - "1970-01-01 00:00", - "1990-06-30 23:00", - } - { - "Europe_Central", - "1990-06-30 23:00", - "1991-03-31 02:00", - } - { - "Europe_Eastern", - "1991-03-31 02:00", - "9999-12-31 23:59", - } - } - "Europe:Vaduz"{ - { - "Europe_Central", - } - } - "Europe:Vatican"{ - { - "Europe_Central", - } - } - "Europe:Vienna"{ - { - "Europe_Central", - } - } - "Europe:Vilnius"{ - { - "Moscow", - "1970-01-01 00:00", - "1989-03-25 23:00", - } - { - "Europe_Eastern", - "1989-03-25 23:00", - "1998-03-29 01:00", - } - { - "Europe_Central", - "1998-03-29 01:00", - "1999-10-31 01:00", - } - { - "Europe_Eastern", - "1999-10-31 01:00", - "9999-12-31 23:59", - } - } - "Europe:Volgograd"{ - { - "Volgograd", - "1970-01-01 00:00", - "1992-03-28 22:00", - } - { - "Moscow", - "1992-03-28 22:00", - "9999-12-31 23:59", - } - } - "Europe:Warsaw"{ - { - "Europe_Central", - } - } - "Europe:Zagreb"{ - { - "Europe_Central", - } - } - "Europe:Zaporozhye"{ - { - "Moscow", - "1970-01-01 00:00", - "1991-03-30 23:00", - } - { - "Europe_Eastern", - "1991-03-30 23:00", - "9999-12-31 23:59", - } - } - "Europe:Zurich"{ - { - "Europe_Central", - } - } - "Indian:Antananarivo"{ - { - "Africa_Eastern", - } - } - "Indian:Chagos"{ - { - "Indian_Ocean", - } - } - "Indian:Christmas"{ - { - "Christmas", - } - } - "Indian:Cocos"{ - { - "Cocos", - } - } - "Indian:Comoro"{ - { - "Africa_Eastern", - } - } - "Indian:Kerguelen"{ - { - "French_Southern", - } - } - "Indian:Mahe"{ - { - "Seychelles", - } - } - "Indian:Maldives"{ - { - "Maldives", - } - } - "Indian:Mauritius"{ - { - "Mauritius", - } - } - "Indian:Mayotte"{ - { - "Africa_Eastern", - } - } - "Indian:Reunion"{ - { - "Reunion", - } - } - "MST7MDT"{ - { - "America_Mountain", - } - } - "PST8PDT"{ - { - "America_Pacific", - } - } - "Pacific:Apia"{ - { - "Apia", - } - } - "Pacific:Auckland"{ - { - "New_Zealand", - } - } - "Pacific:Bougainville"{ - { - "Papua_New_Guinea", - "1970-01-01 00:00", - "2014-12-27 16:00", - } - } - "Pacific:Chatham"{ - { - "Chatham", - } - } - "Pacific:Easter"{ - { - "Easter", - } - } - "Pacific:Efate"{ - { - "Vanuatu", - } - } - "Pacific:Enderbury"{ - { - "Phoenix_Islands", - } - } - "Pacific:Fakaofo"{ - { - "Tokelau", - } - } - "Pacific:Fiji"{ - { - "Fiji", - } - } - "Pacific:Funafuti"{ - { - "Tuvalu", - } - } - "Pacific:Galapagos"{ - { - "Ecuador", - "1970-01-01 00:00", - "1986-01-01 05:00", - } - { - "Galapagos", - "1986-01-01 05:00", - "9999-12-31 23:59", - } - } - "Pacific:Gambier"{ - { - "Gambier", - } - } - "Pacific:Guadalcanal"{ - { - "Solomon", - } - } - "Pacific:Guam"{ - { - "Guam", - "1970-01-01 00:00", - "2000-12-22 14:00", - } - { - "Chamorro", - "2000-12-22 14:00", - "9999-12-31 23:59", - } - } - "Pacific:Honolulu"{ - { - "Alaska_Hawaii", - "1970-01-01 00:00", - "1983-10-30 11:00", - } - { - "Hawaii_Aleutian", - "1983-10-30 11:00", - "9999-12-31 23:59", - } - } - "Pacific:Johnston"{ - { - "Alaska_Hawaii", - "1970-01-01 00:00", - "1983-10-30 11:00", - } - { - "Hawaii_Aleutian", - "1983-10-30 11:00", - "9999-12-31 23:59", - } - } - "Pacific:Kiritimati"{ - { - "Line_Islands", - } - } - "Pacific:Kosrae"{ - { - "Kosrae", - } - } - "Pacific:Kwajalein"{ - { - "Kwajalein", - "1970-01-01 00:00", - "1993-08-20 12:00", - } - { - "Marshall_Islands", - "1993-08-20 12:00", - "9999-12-31 23:59", - } - } - "Pacific:Majuro"{ - { - "Marshall_Islands", - } - } - "Pacific:Marquesas"{ - { - "Marquesas", - } - } - "Pacific:Midway"{ - { - "Bering", - "1970-01-01 00:00", - "1983-10-30 12:00", - } - { - "Samoa", - "1983-10-30 12:00", - "9999-12-31 23:59", - } - } - "Pacific:Nauru"{ - { - "Nauru", - } - } - "Pacific:Niue"{ - { - "Niue", - } - } - "Pacific:Norfolk"{ - { - "Norfolk", - } - } - "Pacific:Noumea"{ - { - "New_Caledonia", - } - } - "Pacific:Pago_Pago"{ - { - "Bering", - "1970-01-01 00:00", - "1983-10-30 12:00", - } - { - "Samoa", - "1983-10-30 12:00", - "9999-12-31 23:59", - } - } - "Pacific:Palau"{ - { - "Palau", - } - } - "Pacific:Pitcairn"{ - { - "Pitcairn", - } - } - "Pacific:Ponape"{ - { - "Ponape", - } - } - "Pacific:Port_Moresby"{ - { - "Papua_New_Guinea", - } - } - "Pacific:Rarotonga"{ - { - "Cook", - } - } - "Pacific:Saipan"{ - { - "North_Mariana", - "1970-01-01 00:00", - "2000-12-22 14:00", - } - { - "Chamorro", - "2000-12-22 14:00", - "9999-12-31 23:59", - } - } - "Pacific:Tahiti"{ - { - "Tahiti", - } - } - "Pacific:Tarawa"{ - { - "Gilbert_Islands", - } - } - "Pacific:Tongatapu"{ - { - "Tonga", - } - } - "Pacific:Truk"{ - { - "Truk", - } - } - "Pacific:Wake"{ - { - "Wake", - } - } - "Pacific:Wallis"{ - { - "Wallis", - } - } - } - primaryZones{ - CL{"America/Santiago"} - CN{"Asia/Shanghai"} - DE{"Europe/Berlin"} - EC{"America/Guayaquil"} - ES{"Europe/Madrid"} - MH{"Pacific/Majuro"} - MY{"Asia/Kuala_Lumpur"} - NZ{"Pacific/Auckland"} - PT{"Europe/Lisbon"} - UA{"Europe/Kiev"} - UZ{"Asia/Tashkent"} - } -} diff --git a/Build/source/libs/icu/icu-src/source/data/misc/metadata.txt b/Build/source/libs/icu/icu-src/source/data/misc/metadata.txt deleted file mode 100644 index 6a05d5594a8..00000000000 --- a/Build/source/libs/icu/icu-src/source/data/misc/metadata.txt +++ /dev/null @@ -1,4363 +0,0 @@ -// © 2016 and later: Unicode, Inc. and others. -// License & terms of use: http://www.unicode.org/copyright.html#License -metadata:table(nofallback){ - alias{ - language{ - aa_SAAHO{ - reason{"deprecated"} - replacement{"ssy"} - } - aar{ - reason{"overlong"} - replacement{"aa"} - } - abk{ - reason{"overlong"} - replacement{"ab"} - } - afr{ - reason{"overlong"} - replacement{"af"} - } - aju{ - reason{"macrolanguage"} - replacement{"jrb"} - } - aka{ - reason{"overlong"} - replacement{"ak"} - } - alb{ - reason{"bibliographic"} - replacement{"sq"} - } - als{ - reason{"macrolanguage"} - replacement{"sq"} - } - amh{ - reason{"overlong"} - replacement{"am"} - } - ara{ - reason{"overlong"} - replacement{"ar"} - } - arb{ - reason{"macrolanguage"} - replacement{"ar"} - } - arg{ - reason{"overlong"} - replacement{"an"} - } - arm{ - reason{"bibliographic"} - replacement{"hy"} - } - art_lojban{ - reason{"deprecated"} - replacement{"jbo"} - } - asm{ - reason{"overlong"} - replacement{"as"} - } - ava{ - reason{"overlong"} - replacement{"av"} - } - ave{ - reason{"overlong"} - replacement{"ae"} - } - aym{ - reason{"overlong"} - replacement{"ay"} - } - ayr{ - reason{"macrolanguage"} - replacement{"ay"} - } - az_AZ{ - reason{"legacy"} - replacement{"az_Latn_AZ"} - } - aze{ - reason{"overlong"} - replacement{"az"} - } - azj{ - reason{"macrolanguage"} - replacement{"az"} - } - bak{ - reason{"overlong"} - replacement{"ba"} - } - bam{ - reason{"overlong"} - replacement{"bm"} - } - baq{ - reason{"bibliographic"} - replacement{"eu"} - } - bcc{ - reason{"macrolanguage"} - replacement{"bal"} - } - bcl{ - reason{"macrolanguage"} - replacement{"bik"} - } - bel{ - reason{"overlong"} - replacement{"be"} - } - ben{ - reason{"overlong"} - replacement{"bn"} - } - bh{ - reason{"macrolanguage"} - replacement{"bho"} - } - bih{ - reason{"overlong"} - replacement{"bho"} - } - bis{ - reason{"overlong"} - replacement{"bi"} - } - bod{ - reason{"overlong"} - replacement{"bo"} - } - bos{ - reason{"overlong"} - replacement{"bs"} - } - bre{ - reason{"overlong"} - replacement{"br"} - } - bs_BA{ - reason{"legacy"} - replacement{"bs_Latn_BA"} - } - bul{ - reason{"overlong"} - replacement{"bg"} - } - bur{ - reason{"bibliographic"} - replacement{"my"} - } - bxk{ - reason{"macrolanguage"} - replacement{"luy"} - } - bxr{ - reason{"macrolanguage"} - replacement{"bua"} - } - cat{ - reason{"overlong"} - replacement{"ca"} - } - ces{ - reason{"overlong"} - replacement{"cs"} - } - cha{ - reason{"overlong"} - replacement{"ch"} - } - che{ - reason{"overlong"} - replacement{"ce"} - } - chi{ - reason{"bibliographic"} - replacement{"zh"} - } - chu{ - reason{"overlong"} - replacement{"cu"} - } - chv{ - reason{"overlong"} - replacement{"cv"} - } - cld{ - reason{"macrolanguage"} - replacement{"syr"} - } - cmn{ - reason{"macrolanguage"} - replacement{"zh"} - } - cor{ - reason{"overlong"} - replacement{"kw"} - } - cos{ - reason{"overlong"} - replacement{"co"} - } - cre{ - reason{"overlong"} - replacement{"cr"} - } - cwd{ - reason{"macrolanguage"} - replacement{"cr"} - } - cym{ - reason{"overlong"} - replacement{"cy"} - } - cze{ - reason{"bibliographic"} - replacement{"cs"} - } - dan{ - reason{"overlong"} - replacement{"da"} - } - deu{ - reason{"overlong"} - replacement{"de"} - } - dgo{ - reason{"macrolanguage"} - replacement{"doi"} - } - dhd{ - reason{"macrolanguage"} - replacement{"mwr"} - } - dik{ - reason{"macrolanguage"} - replacement{"din"} - } - diq{ - reason{"macrolanguage"} - replacement{"zza"} - } - div{ - reason{"overlong"} - replacement{"dv"} - } - dut{ - reason{"bibliographic"} - replacement{"nl"} - } - dzo{ - reason{"overlong"} - replacement{"dz"} - } - ekk{ - reason{"macrolanguage"} - replacement{"et"} - } - ell{ - reason{"overlong"} - replacement{"el"} - } - emk{ - reason{"macrolanguage"} - replacement{"man"} - } - eng{ - reason{"overlong"} - replacement{"en"} - } - epo{ - reason{"overlong"} - replacement{"eo"} - } - esk{ - reason{"macrolanguage"} - replacement{"ik"} - } - est{ - reason{"overlong"} - replacement{"et"} - } - eus{ - reason{"overlong"} - replacement{"eu"} - } - ewe{ - reason{"overlong"} - replacement{"ee"} - } - fao{ - reason{"overlong"} - replacement{"fo"} - } - fas{ - reason{"overlong"} - replacement{"fa"} - } - fat{ - reason{"macrolanguage"} - replacement{"ak"} - } - fij{ - reason{"overlong"} - replacement{"fj"} - } - fin{ - reason{"overlong"} - replacement{"fi"} - } - fra{ - reason{"overlong"} - replacement{"fr"} - } - fre{ - reason{"bibliographic"} - replacement{"fr"} - } - fry{ - reason{"overlong"} - replacement{"fy"} - } - fuc{ - reason{"macrolanguage"} - replacement{"ff"} - } - ful{ - reason{"overlong"} - replacement{"ff"} - } - gaz{ - reason{"macrolanguage"} - replacement{"om"} - } - gbo{ - reason{"macrolanguage"} - replacement{"grb"} - } - geo{ - reason{"bibliographic"} - replacement{"ka"} - } - ger{ - reason{"bibliographic"} - replacement{"de"} - } - gla{ - reason{"overlong"} - replacement{"gd"} - } - gle{ - reason{"overlong"} - replacement{"ga"} - } - glg{ - reason{"overlong"} - replacement{"gl"} - } - glv{ - reason{"overlong"} - replacement{"gv"} - } - gno{ - reason{"macrolanguage"} - replacement{"gon"} - } - gre{ - reason{"bibliographic"} - replacement{"el"} - } - grn{ - reason{"overlong"} - replacement{"gn"} - } - gug{ - reason{"macrolanguage"} - replacement{"gn"} - } - guj{ - reason{"overlong"} - replacement{"gu"} - } - gya{ - reason{"macrolanguage"} - replacement{"gba"} - } - ha_Latn_GH{ - reason{"legacy"} - replacement{"ha_GH"} - } - ha_Latn_NE{ - reason{"legacy"} - replacement{"ha_NE"} - } - ha_Latn_NG{ - reason{"legacy"} - replacement{"ha_NG"} - } - hat{ - reason{"overlong"} - replacement{"ht"} - } - hau{ - reason{"overlong"} - replacement{"ha"} - } - hbs{ - reason{"overlong"} - replacement{"sr_Latn"} - } - hdn{ - reason{"macrolanguage"} - replacement{"hai"} - } - hea{ - reason{"macrolanguage"} - replacement{"hmn"} - } - heb{ - reason{"overlong"} - replacement{"he"} - } - her{ - reason{"overlong"} - replacement{"hz"} - } - him{ - reason{"macrolanguage"} - replacement{"srx"} - } - hin{ - reason{"overlong"} - replacement{"hi"} - } - hmo{ - reason{"overlong"} - replacement{"ho"} - } - hrv{ - reason{"overlong"} - replacement{"hr"} - } - hun{ - reason{"overlong"} - replacement{"hu"} - } - hye{ - reason{"overlong"} - replacement{"hy"} - } - i_ami{ - reason{"deprecated"} - replacement{"ami"} - } - i_bnn{ - reason{"deprecated"} - replacement{"bnn"} - } - i_hak{ - reason{"deprecated"} - replacement{"hak"} - } - i_klingon{ - reason{"deprecated"} - replacement{"tlh"} - } - i_lux{ - reason{"deprecated"} - replacement{"lb"} - } - i_navajo{ - reason{"deprecated"} - replacement{"nv"} - } - i_pwn{ - reason{"deprecated"} - replacement{"pwn"} - } - i_tao{ - reason{"deprecated"} - replacement{"tao"} - } - i_tay{ - reason{"deprecated"} - replacement{"tay"} - } - i_tsu{ - reason{"deprecated"} - replacement{"tsu"} - } - ibo{ - reason{"overlong"} - replacement{"ig"} - } - ice{ - reason{"bibliographic"} - replacement{"is"} - } - ido{ - reason{"overlong"} - replacement{"io"} - } - iii{ - reason{"overlong"} - replacement{"ii"} - } - ike{ - reason{"macrolanguage"} - replacement{"iu"} - } - iku{ - reason{"overlong"} - replacement{"iu"} - } - ile{ - reason{"overlong"} - replacement{"ie"} - } - in{ - reason{"deprecated"} - replacement{"id"} - } - ina{ - reason{"overlong"} - replacement{"ia"} - } - ind{ - reason{"overlong"} - replacement{"id"} - } - ipk{ - reason{"overlong"} - replacement{"ik"} - } - isl{ - reason{"overlong"} - replacement{"is"} - } - ita{ - reason{"overlong"} - replacement{"it"} - } - iw{ - reason{"deprecated"} - replacement{"he"} - } - jav{ - reason{"overlong"} - replacement{"jv"} - } - ji{ - reason{"deprecated"} - replacement{"yi"} - } - jpn{ - reason{"overlong"} - replacement{"ja"} - } - jw{ - reason{"deprecated"} - replacement{"jv"} - } - kal{ - reason{"overlong"} - replacement{"kl"} - } - kan{ - reason{"overlong"} - replacement{"kn"} - } - kas{ - reason{"overlong"} - replacement{"ks"} - } - kat{ - reason{"overlong"} - replacement{"ka"} - } - kau{ - reason{"overlong"} - replacement{"kr"} - } - kaz{ - reason{"overlong"} - replacement{"kk"} - } - khk{ - reason{"macrolanguage"} - replacement{"mn"} - } - khm{ - reason{"overlong"} - replacement{"km"} - } - kik{ - reason{"overlong"} - replacement{"ki"} - } - kin{ - reason{"overlong"} - replacement{"rw"} - } - kir{ - reason{"overlong"} - replacement{"ky"} - } - kk_Cyrl_KZ{ - reason{"legacy"} - replacement{"kk_KZ"} - } - kmr{ - reason{"macrolanguage"} - replacement{"ku"} - } - knc{ - reason{"macrolanguage"} - replacement{"kr"} - } - kng{ - reason{"macrolanguage"} - replacement{"kg"} - } - knn{ - reason{"macrolanguage"} - replacement{"kok"} - } - kom{ - reason{"overlong"} - replacement{"kv"} - } - kon{ - reason{"overlong"} - replacement{"kg"} - } - kor{ - reason{"overlong"} - replacement{"ko"} - } - kpv{ - reason{"macrolanguage"} - replacement{"kv"} - } - ks_Arab_IN{ - reason{"legacy"} - replacement{"ks_IN"} - } - kua{ - reason{"overlong"} - replacement{"kj"} - } - kur{ - reason{"overlong"} - replacement{"ku"} - } - ky_Cyrl_KG{ - reason{"legacy"} - replacement{"ky_KG"} - } - lao{ - reason{"overlong"} - replacement{"lo"} - } - lat{ - reason{"overlong"} - replacement{"la"} - } - lav{ - reason{"overlong"} - replacement{"lv"} - } - lbk{ - reason{"macrolanguage"} - replacement{"bnc"} - } - lim{ - reason{"overlong"} - replacement{"li"} - } - lin{ - reason{"overlong"} - replacement{"ln"} - } - lit{ - reason{"overlong"} - replacement{"lt"} - } - ltz{ - reason{"overlong"} - replacement{"lb"} - } - lub{ - reason{"overlong"} - replacement{"lu"} - } - lug{ - reason{"overlong"} - replacement{"lg"} - } - lvs{ - reason{"macrolanguage"} - replacement{"lv"} - } - mac{ - reason{"bibliographic"} - replacement{"mk"} - } - mah{ - reason{"overlong"} - replacement{"mh"} - } - mal{ - reason{"overlong"} - replacement{"ml"} - } - mao{ - reason{"bibliographic"} - replacement{"mi"} - } - mar{ - reason{"overlong"} - replacement{"mr"} - } - may{ - reason{"bibliographic"} - replacement{"ms"} - } - mhr{ - reason{"macrolanguage"} - replacement{"chm"} - } - mkd{ - reason{"overlong"} - replacement{"mk"} - } - mlg{ - reason{"overlong"} - replacement{"mg"} - } - mlt{ - reason{"overlong"} - replacement{"mt"} - } - mn_Cyrl_MN{ - reason{"legacy"} - replacement{"mn_MN"} - } - mnk{ - reason{"macrolanguage"} - replacement{"man"} - } - mo{ - reason{"deprecated"} - replacement{"ro_MD"} - } - mol{ - reason{"overlong"} - replacement{"ro_MD"} - } - mon{ - reason{"overlong"} - replacement{"mn"} - } - mri{ - reason{"overlong"} - replacement{"mi"} - } - ms_Latn_BN{ - reason{"legacy"} - replacement{"ms_BN"} - } - ms_Latn_MY{ - reason{"legacy"} - replacement{"ms_MY"} - } - ms_Latn_SG{ - reason{"legacy"} - replacement{"ms_SG"} - } - msa{ - reason{"overlong"} - replacement{"ms"} - } - mup{ - reason{"macrolanguage"} - replacement{"raj"} - } - mya{ - reason{"overlong"} - replacement{"my"} - } - nau{ - reason{"overlong"} - replacement{"na"} - } - nav{ - reason{"overlong"} - replacement{"nv"} - } - nbl{ - reason{"overlong"} - replacement{"nr"} - } - nde{ - reason{"overlong"} - replacement{"nd"} - } - ndo{ - reason{"overlong"} - replacement{"ng"} - } - nep{ - reason{"overlong"} - replacement{"ne"} - } - nld{ - reason{"overlong"} - replacement{"nl"} - } - nno{ - reason{"overlong"} - replacement{"nn"} - } - no{ - reason{"legacy"} - replacement{"nb"} - } - no_BOKMAL{ - reason{"deprecated"} - replacement{"nb"} - } - no_NYNORSK{ - reason{"deprecated"} - replacement{"nn"} - } - no_bok{ - reason{"deprecated"} - replacement{"nb"} - } - no_nyn{ - reason{"deprecated"} - replacement{"nn"} - } - nob{ - reason{"overlong"} - replacement{"nb"} - } - nor{ - reason{"overlong"} - replacement{"nb"} - } - npi{ - reason{"macrolanguage"} - replacement{"ne"} - } - nya{ - reason{"overlong"} - replacement{"ny"} - } - oci{ - reason{"overlong"} - replacement{"oc"} - } - ojg{ - reason{"macrolanguage"} - replacement{"oj"} - } - oji{ - reason{"overlong"} - replacement{"oj"} - } - ori{ - reason{"overlong"} - replacement{"or"} - } - orm{ - reason{"overlong"} - replacement{"om"} - } - ory{ - reason{"macrolanguage"} - replacement{"or"} - } - oss{ - reason{"overlong"} - replacement{"os"} - } - pa_IN{ - reason{"legacy"} - replacement{"pa_Guru_IN"} - } - pa_PK{ - reason{"legacy"} - replacement{"pa_Arab_PK"} - } - pan{ - reason{"overlong"} - replacement{"pa"} - } - pbu{ - reason{"macrolanguage"} - replacement{"ps"} - } - per{ - reason{"bibliographic"} - replacement{"fa"} - } - pes{ - reason{"macrolanguage"} - replacement{"fa"} - } - pli{ - reason{"overlong"} - replacement{"pi"} - } - plt{ - reason{"macrolanguage"} - replacement{"mg"} - } - pnb{ - reason{"macrolanguage"} - replacement{"lah"} - } - pol{ - reason{"overlong"} - replacement{"pl"} - } - por{ - reason{"overlong"} - replacement{"pt"} - } - prs{ - reason{"overlong"} - replacement{"fa_AF"} - } - pus{ - reason{"overlong"} - replacement{"ps"} - } - que{ - reason{"overlong"} - replacement{"qu"} - } - quz{ - reason{"macrolanguage"} - replacement{"qu"} - } - rmy{ - reason{"macrolanguage"} - replacement{"rom"} - } - roh{ - reason{"overlong"} - replacement{"rm"} - } - ron{ - reason{"overlong"} - replacement{"ro"} - } - rum{ - reason{"bibliographic"} - replacement{"ro"} - } - run{ - reason{"overlong"} - replacement{"rn"} - } - rus{ - reason{"overlong"} - replacement{"ru"} - } - sag{ - reason{"overlong"} - replacement{"sg"} - } - san{ - reason{"overlong"} - replacement{"sa"} - } - scc{ - reason{"deprecated"} - replacement{"sr"} - } - scr{ - reason{"deprecated"} - replacement{"hr"} - } - sgn_BE_FR{ - reason{"deprecated"} - replacement{"sfb"} - } - sgn_BE_NL{ - reason{"deprecated"} - replacement{"vgt"} - } - sgn_CH_DE{ - reason{"deprecated"} - replacement{"sgg"} - } - sh{ - reason{"legacy"} - replacement{"sr_Latn"} - } - shi_MA{ - reason{"legacy"} - replacement{"shi_Tfng_MA"} - } - sin{ - reason{"overlong"} - replacement{"si"} - } - slk{ - reason{"overlong"} - replacement{"sk"} - } - slo{ - reason{"bibliographic"} - replacement{"sk"} - } - slv{ - reason{"overlong"} - replacement{"sl"} - } - sme{ - reason{"overlong"} - replacement{"se"} - } - smo{ - reason{"overlong"} - replacement{"sm"} - } - sna{ - reason{"overlong"} - replacement{"sn"} - } - snd{ - reason{"overlong"} - replacement{"sd"} - } - som{ - reason{"overlong"} - replacement{"so"} - } - sot{ - reason{"overlong"} - replacement{"st"} - } - spa{ - reason{"overlong"} - replacement{"es"} - } - spy{ - reason{"macrolanguage"} - replacement{"kln"} - } - sqi{ - reason{"overlong"} - replacement{"sq"} - } - sr_BA{ - reason{"legacy"} - replacement{"sr_Cyrl_BA"} - } - sr_ME{ - reason{"legacy"} - replacement{"sr_Latn_ME"} - } - sr_RS{ - reason{"legacy"} - replacement{"sr_Cyrl_RS"} - } - sr_XK{ - reason{"legacy"} - replacement{"sr_Cyrl_XK"} - } - src{ - reason{"macrolanguage"} - replacement{"sc"} - } - srd{ - reason{"overlong"} - replacement{"sc"} - } - srp{ - reason{"overlong"} - replacement{"sr"} - } - ssw{ - reason{"overlong"} - replacement{"ss"} - } - sun{ - reason{"overlong"} - replacement{"su"} - } - swa{ - reason{"overlong"} - replacement{"sw"} - } - swc{ - reason{"overlong"} - replacement{"sw_CD"} - } - swe{ - reason{"overlong"} - replacement{"sv"} - } - swh{ - reason{"macrolanguage"} - replacement{"sw"} - } - tah{ - reason{"overlong"} - replacement{"ty"} - } - tam{ - reason{"overlong"} - replacement{"ta"} - } - tat{ - reason{"overlong"} - replacement{"tt"} - } - tel{ - reason{"overlong"} - replacement{"te"} - } - tgk{ - reason{"overlong"} - replacement{"tg"} - } - tgl{ - reason{"overlong"} - replacement{"fil"} - } - tha{ - reason{"overlong"} - replacement{"th"} - } - tib{ - reason{"bibliographic"} - replacement{"bo"} - } - tir{ - reason{"overlong"} - replacement{"ti"} - } - tl{ - reason{"legacy"} - replacement{"fil"} - } - ton{ - reason{"overlong"} - replacement{"to"} - } - tsn{ - reason{"overlong"} - replacement{"tn"} - } - tso{ - reason{"overlong"} - replacement{"ts"} - } - ttq{ - reason{"macrolanguage"} - replacement{"tmh"} - } - tuk{ - reason{"overlong"} - replacement{"tk"} - } - tur{ - reason{"overlong"} - replacement{"tr"} - } - tw{ - reason{"macrolanguage"} - replacement{"ak"} - } - twi{ - reason{"overlong"} - replacement{"ak"} - } - tzm_Latn_MA{ - reason{"legacy"} - replacement{"tzm_MA"} - } - ug_Arab_CN{ - reason{"legacy"} - replacement{"ug_CN"} - } - uig{ - reason{"overlong"} - replacement{"ug"} - } - ukr{ - reason{"overlong"} - replacement{"uk"} - } - umu{ - reason{"macrolanguage"} - replacement{"del"} - } - urd{ - reason{"overlong"} - replacement{"ur"} - } - uz_AF{ - reason{"legacy"} - replacement{"uz_Arab_AF"} - } - uz_UZ{ - reason{"legacy"} - replacement{"uz_Latn_UZ"} - } - uzb{ - reason{"overlong"} - replacement{"uz"} - } - uzn{ - reason{"macrolanguage"} - replacement{"uz"} - } - vai_LR{ - reason{"legacy"} - replacement{"vai_Vaii_LR"} - } - ven{ - reason{"overlong"} - replacement{"ve"} - } - vie{ - reason{"overlong"} - replacement{"vi"} - } - vol{ - reason{"overlong"} - replacement{"vo"} - } - wel{ - reason{"bibliographic"} - replacement{"cy"} - } - wln{ - reason{"overlong"} - replacement{"wa"} - } - wol{ - reason{"overlong"} - replacement{"wo"} - } - xho{ - reason{"overlong"} - replacement{"xh"} - } - xpe{ - reason{"macrolanguage"} - replacement{"kpe"} - } - xsl{ - reason{"macrolanguage"} - replacement{"den"} - } - ydd{ - reason{"macrolanguage"} - replacement{"yi"} - } - yid{ - reason{"overlong"} - replacement{"yi"} - } - yor{ - reason{"overlong"} - replacement{"yo"} - } - zai{ - reason{"macrolanguage"} - replacement{"zap"} - } - zh_CN{ - reason{"legacy"} - replacement{"zh_Hans_CN"} - } - zh_HK{ - reason{"legacy"} - replacement{"zh_Hant_HK"} - } - zh_MO{ - reason{"legacy"} - replacement{"zh_Hant_MO"} - } - zh_SG{ - reason{"legacy"} - replacement{"zh_Hans_SG"} - } - zh_TW{ - reason{"legacy"} - replacement{"zh_Hant_TW"} - } - zh_guoyu{ - reason{"deprecated"} - replacement{"zh"} - } - zh_hakka{ - reason{"deprecated"} - replacement{"hak"} - } - zh_min_nan{ - reason{"deprecated"} - replacement{"nan"} - } - zh_xiang{ - reason{"deprecated"} - replacement{"hsn"} - } - zha{ - reason{"overlong"} - replacement{"za"} - } - zho{ - reason{"overlong"} - replacement{"zh"} - } - zsm{ - reason{"macrolanguage"} - replacement{"ms"} - } - zul{ - reason{"overlong"} - replacement{"zu"} - } - zyb{ - reason{"macrolanguage"} - replacement{"za"} - } - } - script{ - Qaai{ - reason{"deprecated"} - replacement{"Zinh"} - } - } - subdivision{ - CN-71{ - reason{"overlong"} - replacement{"TW"} - } - CN-91{ - reason{"overlong"} - replacement{"HK"} - } - CN-92{ - reason{"overlong"} - replacement{"MO"} - } - FR-BL{ - reason{"overlong"} - replacement{"BL"} - } - FR-GF{ - reason{"overlong"} - replacement{"GF"} - } - FR-GP{ - reason{"overlong"} - replacement{"GP"} - } - FR-MF{ - reason{"overlong"} - replacement{"MF"} - } - FR-MQ{ - reason{"overlong"} - replacement{"MQ"} - } - FR-NC{ - reason{"overlong"} - replacement{"NC"} - } - FR-PF{ - reason{"overlong"} - replacement{"PF"} - } - FR-PM{ - reason{"overlong"} - replacement{"PM"} - } - FR-RE{ - reason{"overlong"} - replacement{"RE"} - } - FR-TF{ - reason{"overlong"} - replacement{"TF"} - } - FR-WF{ - reason{"overlong"} - replacement{"WF"} - } - FR-YT{ - reason{"overlong"} - replacement{"YT"} - } - LA-XN{ - reason{"deprecated"} - replacement{"LA-XS"} - } - LU-D{ - reason{"deprecated"} - replacement{"LU-CL LU-DI LU-RD LU-VD LU-WI"} - } - LU-G{ - reason{"deprecated"} - replacement{"LU-EC LU-GR LU-RM"} - } - LU-L{ - reason{"deprecated"} - replacement{"LU-CA LU-ES LU-LU LU-ME"} - } - MR-NKC{ - reason{"deprecated"} - replacement{"MR-13 MR-14 MR-15"} - } - NL-AW{ - reason{"overlong"} - replacement{"AW"} - } - NL-CW{ - reason{"overlong"} - replacement{"CW"} - } - NL-SX{ - reason{"overlong"} - replacement{"SX"} - } - NZ-N{ - reason{"deprecated"} - replacement{"NZ-AUK NZ-BOP NZ-GIS NZ-HKB NZ-MWT NZ-NTL NZ-TKI NZ-WGN NZ-WKO"} - } - NZ-S{ - reason{"deprecated"} - replacement{"NZ-CAN NZ-MBH NZ-NSN NZ-OTA NZ-STL NZ-TAS NZ-WTC"} - } - OM-BA{ - reason{"deprecated"} - replacement{"OM-BJ OM-BS"} - } - OM-SH{ - reason{"deprecated"} - replacement{"OM-SJ OM-SS"} - } - TT-ETO{ - reason{"deprecated"} - replacement{"TT-TOB"} - } - TT-RCM{ - reason{"deprecated"} - replacement{"TT-MRC"} - } - TT-WTO{ - reason{"deprecated"} - replacement{"TT-TOB"} - } - TW-KHQ{ - reason{"deprecated"} - replacement{"TW-KHH"} - } - TW-TNQ{ - reason{"deprecated"} - replacement{"TW-TNN"} - } - TW-TPQ{ - reason{"deprecated"} - replacement{"TW-NWT"} - } - TW-TXQ{ - reason{"deprecated"} - replacement{"TW-TXG"} - } - US-AS{ - reason{"overlong"} - replacement{"AS"} - } - US-GU{ - reason{"overlong"} - replacement{"GU"} - } - US-MP{ - reason{"overlong"} - replacement{"MP"} - } - US-PR{ - reason{"overlong"} - replacement{"PR"} - } - US-UM{ - reason{"overlong"} - replacement{"UM"} - } - US-VI{ - reason{"overlong"} - replacement{"VI"} - } - } - territory{ - 004{ - reason{"overlong"} - replacement{"AF"} - } - 008{ - reason{"overlong"} - replacement{"AL"} - } - 010{ - reason{"overlong"} - replacement{"AQ"} - } - 012{ - reason{"overlong"} - replacement{"DZ"} - } - 016{ - reason{"overlong"} - replacement{"AS"} - } - 020{ - reason{"overlong"} - replacement{"AD"} - } - 024{ - reason{"overlong"} - replacement{"AO"} - } - 028{ - reason{"overlong"} - replacement{"AG"} - } - 031{ - reason{"overlong"} - replacement{"AZ"} - } - 032{ - reason{"overlong"} - replacement{"AR"} - } - 036{ - reason{"overlong"} - replacement{"AU"} - } - 040{ - reason{"overlong"} - replacement{"AT"} - } - 044{ - reason{"overlong"} - replacement{"BS"} - } - 048{ - reason{"overlong"} - replacement{"BH"} - } - 050{ - reason{"overlong"} - replacement{"BD"} - } - 051{ - reason{"overlong"} - replacement{"AM"} - } - 052{ - reason{"overlong"} - replacement{"BB"} - } - 056{ - reason{"overlong"} - replacement{"BE"} - } - 060{ - reason{"overlong"} - replacement{"BM"} - } - 062{ - reason{"deprecated"} - replacement{"034 143"} - } - 064{ - reason{"overlong"} - replacement{"BT"} - } - 068{ - reason{"overlong"} - replacement{"BO"} - } - 070{ - reason{"overlong"} - replacement{"BA"} - } - 072{ - reason{"overlong"} - replacement{"BW"} - } - 074{ - reason{"overlong"} - replacement{"BV"} - } - 076{ - reason{"overlong"} - replacement{"BR"} - } - 084{ - reason{"overlong"} - replacement{"BZ"} - } - 086{ - reason{"overlong"} - replacement{"IO"} - } - 090{ - reason{"overlong"} - replacement{"SB"} - } - 092{ - reason{"overlong"} - replacement{"VG"} - } - 096{ - reason{"overlong"} - replacement{"BN"} - } - 100{ - reason{"overlong"} - replacement{"BG"} - } - 104{ - reason{"overlong"} - replacement{"MM"} - } - 108{ - reason{"overlong"} - replacement{"BI"} - } - 112{ - reason{"overlong"} - replacement{"BY"} - } - 116{ - reason{"overlong"} - replacement{"KH"} - } - 120{ - reason{"overlong"} - replacement{"CM"} - } - 124{ - reason{"overlong"} - replacement{"CA"} - } - 132{ - reason{"overlong"} - replacement{"CV"} - } - 136{ - reason{"overlong"} - replacement{"KY"} - } - 140{ - reason{"overlong"} - replacement{"CF"} - } - 144{ - reason{"overlong"} - replacement{"LK"} - } - 148{ - reason{"overlong"} - replacement{"TD"} - } - 152{ - reason{"overlong"} - replacement{"CL"} - } - 156{ - reason{"overlong"} - replacement{"CN"} - } - 158{ - reason{"overlong"} - replacement{"TW"} - } - 162{ - reason{"overlong"} - replacement{"CX"} - } - 166{ - reason{"overlong"} - replacement{"CC"} - } - 170{ - reason{"overlong"} - replacement{"CO"} - } - 172{ - reason{"deprecated"} - replacement{"RU AM AZ BY GE KG KZ MD TJ TM UA UZ"} - } - 174{ - reason{"overlong"} - replacement{"KM"} - } - 175{ - reason{"overlong"} - replacement{"YT"} - } - 178{ - reason{"overlong"} - replacement{"CG"} - } - 180{ - reason{"overlong"} - replacement{"CD"} - } - 184{ - reason{"overlong"} - replacement{"CK"} - } - 188{ - reason{"overlong"} - replacement{"CR"} - } - 191{ - reason{"overlong"} - replacement{"HR"} - } - 192{ - reason{"overlong"} - replacement{"CU"} - } - 196{ - reason{"overlong"} - replacement{"CY"} - } - 200{ - reason{"deprecated"} - replacement{"CZ SK"} - } - 203{ - reason{"overlong"} - replacement{"CZ"} - } - 204{ - reason{"overlong"} - replacement{"BJ"} - } - 208{ - reason{"overlong"} - replacement{"DK"} - } - 212{ - reason{"overlong"} - replacement{"DM"} - } - 214{ - reason{"overlong"} - replacement{"DO"} - } - 218{ - reason{"overlong"} - replacement{"EC"} - } - 222{ - reason{"overlong"} - replacement{"SV"} - } - 226{ - reason{"overlong"} - replacement{"GQ"} - } - 230{ - reason{"deprecated"} - replacement{"ET"} - } - 231{ - reason{"overlong"} - replacement{"ET"} - } - 232{ - reason{"overlong"} - replacement{"ER"} - } - 233{ - reason{"overlong"} - replacement{"EE"} - } - 234{ - reason{"overlong"} - replacement{"FO"} - } - 238{ - reason{"overlong"} - replacement{"FK"} - } - 239{ - reason{"overlong"} - replacement{"GS"} - } - 242{ - reason{"overlong"} - replacement{"FJ"} - } - 246{ - reason{"overlong"} - replacement{"FI"} - } - 248{ - reason{"overlong"} - replacement{"AX"} - } - 249{ - reason{"overlong"} - replacement{"FR"} - } - 250{ - reason{"overlong"} - replacement{"FR"} - } - 254{ - reason{"overlong"} - replacement{"GF"} - } - 258{ - reason{"overlong"} - replacement{"PF"} - } - 260{ - reason{"overlong"} - replacement{"TF"} - } - 262{ - reason{"overlong"} - replacement{"DJ"} - } - 266{ - reason{"overlong"} - replacement{"GA"} - } - 268{ - reason{"overlong"} - replacement{"GE"} - } - 270{ - reason{"overlong"} - replacement{"GM"} - } - 275{ - reason{"overlong"} - replacement{"PS"} - } - 276{ - reason{"overlong"} - replacement{"DE"} - } - 278{ - reason{"overlong"} - replacement{"DE"} - } - 280{ - reason{"deprecated"} - replacement{"DE"} - } - 288{ - reason{"overlong"} - replacement{"GH"} - } - 292{ - reason{"overlong"} - replacement{"GI"} - } - 296{ - reason{"overlong"} - replacement{"KI"} - } - 300{ - reason{"overlong"} - replacement{"GR"} - } - 304{ - reason{"overlong"} - replacement{"GL"} - } - 308{ - reason{"overlong"} - replacement{"GD"} - } - 312{ - reason{"overlong"} - replacement{"GP"} - } - 316{ - reason{"overlong"} - replacement{"GU"} - } - 320{ - reason{"overlong"} - replacement{"GT"} - } - 324{ - reason{"overlong"} - replacement{"GN"} - } - 328{ - reason{"overlong"} - replacement{"GY"} - } - 332{ - reason{"overlong"} - replacement{"HT"} - } - 334{ - reason{"overlong"} - replacement{"HM"} - } - 336{ - reason{"overlong"} - replacement{"VA"} - } - 340{ - reason{"overlong"} - replacement{"HN"} - } - 344{ - reason{"overlong"} - replacement{"HK"} - } - 348{ - reason{"overlong"} - replacement{"HU"} - } - 352{ - reason{"overlong"} - replacement{"IS"} - } - 356{ - reason{"overlong"} - replacement{"IN"} - } - 360{ - reason{"overlong"} - replacement{"ID"} - } - 364{ - reason{"overlong"} - replacement{"IR"} - } - 368{ - reason{"overlong"} - replacement{"IQ"} - } - 372{ - reason{"overlong"} - replacement{"IE"} - } - 376{ - reason{"overlong"} - replacement{"IL"} - } - 380{ - reason{"overlong"} - replacement{"IT"} - } - 384{ - reason{"overlong"} - replacement{"CI"} - } - 388{ - reason{"overlong"} - replacement{"JM"} - } - 392{ - reason{"overlong"} - replacement{"JP"} - } - 398{ - reason{"overlong"} - replacement{"KZ"} - } - 400{ - reason{"overlong"} - replacement{"JO"} - } - 404{ - reason{"overlong"} - replacement{"KE"} - } - 408{ - reason{"overlong"} - replacement{"KP"} - } - 410{ - reason{"overlong"} - replacement{"KR"} - } - 414{ - reason{"overlong"} - replacement{"KW"} - } - 417{ - reason{"overlong"} - replacement{"KG"} - } - 418{ - reason{"overlong"} - replacement{"LA"} - } - 422{ - reason{"overlong"} - replacement{"LB"} - } - 426{ - reason{"overlong"} - replacement{"LS"} - } - 428{ - reason{"overlong"} - replacement{"LV"} - } - 430{ - reason{"overlong"} - replacement{"LR"} - } - 434{ - reason{"overlong"} - replacement{"LY"} - } - 438{ - reason{"overlong"} - replacement{"LI"} - } - 440{ - reason{"overlong"} - replacement{"LT"} - } - 442{ - reason{"overlong"} - replacement{"LU"} - } - 446{ - reason{"overlong"} - replacement{"MO"} - } - 450{ - reason{"overlong"} - replacement{"MG"} - } - 454{ - reason{"overlong"} - replacement{"MW"} - } - 458{ - reason{"overlong"} - replacement{"MY"} - } - 462{ - reason{"overlong"} - replacement{"MV"} - } - 466{ - reason{"overlong"} - replacement{"ML"} - } - 470{ - reason{"overlong"} - replacement{"MT"} - } - 474{ - reason{"overlong"} - replacement{"MQ"} - } - 478{ - reason{"overlong"} - replacement{"MR"} - } - 480{ - reason{"overlong"} - replacement{"MU"} - } - 484{ - reason{"overlong"} - replacement{"MX"} - } - 492{ - reason{"overlong"} - replacement{"MC"} - } - 496{ - reason{"overlong"} - replacement{"MN"} - } - 498{ - reason{"overlong"} - replacement{"MD"} - } - 499{ - reason{"overlong"} - replacement{"ME"} - } - 500{ - reason{"overlong"} - replacement{"MS"} - } - 504{ - reason{"overlong"} - replacement{"MA"} - } - 508{ - reason{"overlong"} - replacement{"MZ"} - } - 512{ - reason{"overlong"} - replacement{"OM"} - } - 516{ - reason{"overlong"} - replacement{"NA"} - } - 520{ - reason{"overlong"} - replacement{"NR"} - } - 524{ - reason{"overlong"} - replacement{"NP"} - } - 528{ - reason{"overlong"} - replacement{"NL"} - } - 530{ - reason{"overlong"} - replacement{"CW SX BQ"} - } - 531{ - reason{"overlong"} - replacement{"CW"} - } - 532{ - reason{"deprecated"} - replacement{"CW SX BQ"} - } - 533{ - reason{"overlong"} - replacement{"AW"} - } - 534{ - reason{"overlong"} - replacement{"SX"} - } - 535{ - reason{"overlong"} - replacement{"BQ"} - } - 536{ - reason{"overlong"} - replacement{"SA IQ"} - } - 540{ - reason{"overlong"} - replacement{"NC"} - } - 548{ - reason{"overlong"} - replacement{"VU"} - } - 554{ - reason{"overlong"} - replacement{"NZ"} - } - 558{ - reason{"overlong"} - replacement{"NI"} - } - 562{ - reason{"overlong"} - replacement{"NE"} - } - 566{ - reason{"overlong"} - replacement{"NG"} - } - 570{ - reason{"overlong"} - replacement{"NU"} - } - 574{ - reason{"overlong"} - replacement{"NF"} - } - 578{ - reason{"overlong"} - replacement{"NO"} - } - 580{ - reason{"overlong"} - replacement{"MP"} - } - 581{ - reason{"overlong"} - replacement{"UM"} - } - 582{ - reason{"deprecated"} - replacement{"FM MH MP PW"} - } - 583{ - reason{"overlong"} - replacement{"FM"} - } - 584{ - reason{"overlong"} - replacement{"MH"} - } - 585{ - reason{"overlong"} - replacement{"PW"} - } - 586{ - reason{"overlong"} - replacement{"PK"} - } - 591{ - reason{"overlong"} - replacement{"PA"} - } - 598{ - reason{"overlong"} - replacement{"PG"} - } - 600{ - reason{"overlong"} - replacement{"PY"} - } - 604{ - reason{"overlong"} - replacement{"PE"} - } - 608{ - reason{"overlong"} - replacement{"PH"} - } - 612{ - reason{"overlong"} - replacement{"PN"} - } - 616{ - reason{"overlong"} - replacement{"PL"} - } - 620{ - reason{"overlong"} - replacement{"PT"} - } - 624{ - reason{"overlong"} - replacement{"GW"} - } - 626{ - reason{"overlong"} - replacement{"TL"} - } - 630{ - reason{"overlong"} - replacement{"PR"} - } - 634{ - reason{"overlong"} - replacement{"QA"} - } - 638{ - reason{"overlong"} - replacement{"RE"} - } - 642{ - reason{"overlong"} - replacement{"RO"} - } - 643{ - reason{"overlong"} - replacement{"RU"} - } - 646{ - reason{"overlong"} - replacement{"RW"} - } - 652{ - reason{"overlong"} - replacement{"BL"} - } - 654{ - reason{"overlong"} - replacement{"SH"} - } - 659{ - reason{"overlong"} - replacement{"KN"} - } - 660{ - reason{"overlong"} - replacement{"AI"} - } - 662{ - reason{"overlong"} - replacement{"LC"} - } - 663{ - reason{"overlong"} - replacement{"MF"} - } - 666{ - reason{"overlong"} - replacement{"PM"} - } - 670{ - reason{"overlong"} - replacement{"VC"} - } - 674{ - reason{"overlong"} - replacement{"SM"} - } - 678{ - reason{"overlong"} - replacement{"ST"} - } - 682{ - reason{"overlong"} - replacement{"SA"} - } - 686{ - reason{"overlong"} - replacement{"SN"} - } - 688{ - reason{"overlong"} - replacement{"RS"} - } - 690{ - reason{"overlong"} - replacement{"SC"} - } - 694{ - reason{"overlong"} - replacement{"SL"} - } - 702{ - reason{"overlong"} - replacement{"SG"} - } - 703{ - reason{"overlong"} - replacement{"SK"} - } - 704{ - reason{"overlong"} - replacement{"VN"} - } - 705{ - reason{"overlong"} - replacement{"SI"} - } - 706{ - reason{"overlong"} - replacement{"SO"} - } - 710{ - reason{"overlong"} - replacement{"ZA"} - } - 716{ - reason{"overlong"} - replacement{"ZW"} - } - 720{ - reason{"overlong"} - replacement{"YE"} - } - 724{ - reason{"overlong"} - replacement{"ES"} - } - 728{ - reason{"overlong"} - replacement{"SS"} - } - 729{ - reason{"overlong"} - replacement{"SD"} - } - 732{ - reason{"overlong"} - replacement{"EH"} - } - 736{ - reason{"deprecated"} - replacement{"SD"} - } - 740{ - reason{"overlong"} - replacement{"SR"} - } - 744{ - reason{"overlong"} - replacement{"SJ"} - } - 748{ - reason{"overlong"} - replacement{"SZ"} - } - 752{ - reason{"overlong"} - replacement{"SE"} - } - 756{ - reason{"overlong"} - replacement{"CH"} - } - 760{ - reason{"overlong"} - replacement{"SY"} - } - 762{ - reason{"overlong"} - replacement{"TJ"} - } - 764{ - reason{"overlong"} - replacement{"TH"} - } - 768{ - reason{"overlong"} - replacement{"TG"} - } - 772{ - reason{"overlong"} - replacement{"TK"} - } - 776{ - reason{"overlong"} - replacement{"TO"} - } - 780{ - reason{"overlong"} - replacement{"TT"} - } - 784{ - reason{"overlong"} - replacement{"AE"} - } - 788{ - reason{"overlong"} - replacement{"TN"} - } - 792{ - reason{"overlong"} - replacement{"TR"} - } - 795{ - reason{"overlong"} - replacement{"TM"} - } - 796{ - reason{"overlong"} - replacement{"TC"} - } - 798{ - reason{"overlong"} - replacement{"TV"} - } - 800{ - reason{"overlong"} - replacement{"UG"} - } - 804{ - reason{"overlong"} - replacement{"UA"} - } - 807{ - reason{"overlong"} - replacement{"MK"} - } - 810{ - reason{"overlong"} - replacement{"RU AM AZ BY EE GE KZ KG LV LT MD TJ TM UA UZ"} - } - 818{ - reason{"overlong"} - replacement{"EG"} - } - 826{ - reason{"overlong"} - replacement{"GB"} - } - 830{ - reason{"deprecated"} - replacement{"JE GG"} - } - 831{ - reason{"overlong"} - replacement{"GG"} - } - 832{ - reason{"overlong"} - replacement{"JE"} - } - 833{ - reason{"overlong"} - replacement{"IM"} - } - 834{ - reason{"overlong"} - replacement{"TZ"} - } - 840{ - reason{"overlong"} - replacement{"US"} - } - 850{ - reason{"overlong"} - replacement{"VI"} - } - 854{ - reason{"overlong"} - replacement{"BF"} - } - 858{ - reason{"overlong"} - replacement{"UY"} - } - 860{ - reason{"overlong"} - replacement{"UZ"} - } - 862{ - reason{"overlong"} - replacement{"VE"} - } - 876{ - reason{"overlong"} - replacement{"WF"} - } - 882{ - reason{"overlong"} - replacement{"WS"} - } - 886{ - reason{"deprecated"} - replacement{"YE"} - } - 887{ - reason{"overlong"} - replacement{"YE"} - } - 890{ - reason{"deprecated"} - replacement{"RS ME SI HR MK BA"} - } - 891{ - reason{"overlong"} - replacement{"RS ME"} - } - 894{ - reason{"overlong"} - replacement{"ZM"} - } - 958{ - reason{"overlong"} - replacement{"AA"} - } - 959{ - reason{"overlong"} - replacement{"QM"} - } - 960{ - reason{"overlong"} - replacement{"QN"} - } - 962{ - reason{"overlong"} - replacement{"QP"} - } - 963{ - reason{"overlong"} - replacement{"QQ"} - } - 964{ - reason{"overlong"} - replacement{"QR"} - } - 965{ - reason{"overlong"} - replacement{"QS"} - } - 966{ - reason{"overlong"} - replacement{"QT"} - } - 967{ - reason{"overlong"} - replacement{"EU"} - } - 968{ - reason{"overlong"} - replacement{"QV"} - } - 969{ - reason{"overlong"} - replacement{"QW"} - } - 970{ - reason{"overlong"} - replacement{"QX"} - } - 971{ - reason{"overlong"} - replacement{"QY"} - } - 972{ - reason{"overlong"} - replacement{"QZ"} - } - 973{ - reason{"overlong"} - replacement{"XA"} - } - 974{ - reason{"overlong"} - replacement{"XB"} - } - 975{ - reason{"overlong"} - replacement{"XC"} - } - 976{ - reason{"overlong"} - replacement{"XD"} - } - 977{ - reason{"overlong"} - replacement{"XE"} - } - 978{ - reason{"overlong"} - replacement{"XF"} - } - 979{ - reason{"overlong"} - replacement{"XG"} - } - 980{ - reason{"overlong"} - replacement{"XH"} - } - 981{ - reason{"overlong"} - replacement{"XI"} - } - 982{ - reason{"overlong"} - replacement{"XJ"} - } - 983{ - reason{"overlong"} - replacement{"XK"} - } - 984{ - reason{"overlong"} - replacement{"XL"} - } - 985{ - reason{"overlong"} - replacement{"XM"} - } - 986{ - reason{"overlong"} - replacement{"XN"} - } - 987{ - reason{"overlong"} - replacement{"XO"} - } - 988{ - reason{"overlong"} - replacement{"XP"} - } - 989{ - reason{"overlong"} - replacement{"XQ"} - } - 990{ - reason{"overlong"} - replacement{"XR"} - } - 991{ - reason{"overlong"} - replacement{"XS"} - } - 992{ - reason{"overlong"} - replacement{"XT"} - } - 993{ - reason{"overlong"} - replacement{"XU"} - } - 994{ - reason{"overlong"} - replacement{"XV"} - } - 995{ - reason{"overlong"} - replacement{"XW"} - } - 996{ - reason{"overlong"} - replacement{"XX"} - } - 997{ - reason{"overlong"} - replacement{"XY"} - } - 998{ - reason{"overlong"} - replacement{"XZ"} - } - 999{ - reason{"overlong"} - replacement{"ZZ"} - } - AAA{ - reason{"overlong"} - replacement{"AA"} - } - ABW{ - reason{"overlong"} - replacement{"AW"} - } - AFG{ - reason{"overlong"} - replacement{"AF"} - } - AGO{ - reason{"overlong"} - replacement{"AO"} - } - AIA{ - reason{"overlong"} - replacement{"AI"} - } - ALA{ - reason{"overlong"} - replacement{"AX"} - } - ALB{ - reason{"overlong"} - replacement{"AL"} - } - AN{ - reason{"deprecated"} - replacement{"CW SX BQ"} - } - AND{ - reason{"overlong"} - replacement{"AD"} - } - ANT{ - reason{"overlong"} - replacement{"CW SX BQ"} - } - ARE{ - reason{"overlong"} - replacement{"AE"} - } - ARG{ - reason{"overlong"} - replacement{"AR"} - } - ARM{ - reason{"overlong"} - replacement{"AM"} - } - ASC{ - reason{"overlong"} - replacement{"AC"} - } - ASM{ - reason{"overlong"} - replacement{"AS"} - } - ATA{ - reason{"overlong"} - replacement{"AQ"} - } - ATF{ - reason{"overlong"} - replacement{"TF"} - } - ATG{ - reason{"overlong"} - replacement{"AG"} - } - AUS{ - reason{"overlong"} - replacement{"AU"} - } - AUT{ - reason{"overlong"} - replacement{"AT"} - } - AZE{ - reason{"overlong"} - replacement{"AZ"} - } - BDI{ - reason{"overlong"} - replacement{"BI"} - } - BEL{ - reason{"overlong"} - replacement{"BE"} - } - BEN{ - reason{"overlong"} - replacement{"BJ"} - } - BES{ - reason{"overlong"} - replacement{"BQ"} - } - BFA{ - reason{"overlong"} - replacement{"BF"} - } - BGD{ - reason{"overlong"} - replacement{"BD"} - } - BGR{ - reason{"overlong"} - replacement{"BG"} - } - BHR{ - reason{"overlong"} - replacement{"BH"} - } - BHS{ - reason{"overlong"} - replacement{"BS"} - } - BIH{ - reason{"overlong"} - replacement{"BA"} - } - BLM{ - reason{"overlong"} - replacement{"BL"} - } - BLR{ - reason{"overlong"} - replacement{"BY"} - } - BLZ{ - reason{"overlong"} - replacement{"BZ"} - } - BMU{ - reason{"overlong"} - replacement{"BM"} - } - BOL{ - reason{"overlong"} - replacement{"BO"} - } - BRA{ - reason{"overlong"} - replacement{"BR"} - } - BRB{ - reason{"overlong"} - replacement{"BB"} - } - BRN{ - reason{"overlong"} - replacement{"BN"} - } - BTN{ - reason{"overlong"} - replacement{"BT"} - } - BU{ - reason{"deprecated"} - replacement{"MM"} - } - BUR{ - reason{"overlong"} - replacement{"MM"} - } - BVT{ - reason{"overlong"} - replacement{"BV"} - } - BWA{ - reason{"overlong"} - replacement{"BW"} - } - CAF{ - reason{"overlong"} - replacement{"CF"} - } - CAN{ - reason{"overlong"} - replacement{"CA"} - } - CCK{ - reason{"overlong"} - replacement{"CC"} - } - CHE{ - reason{"overlong"} - replacement{"CH"} - } - CHL{ - reason{"overlong"} - replacement{"CL"} - } - CHN{ - reason{"overlong"} - replacement{"CN"} - } - CIV{ - reason{"overlong"} - replacement{"CI"} - } - CMR{ - reason{"overlong"} - replacement{"CM"} - } - COD{ - reason{"overlong"} - replacement{"CD"} - } - COG{ - reason{"overlong"} - replacement{"CG"} - } - COK{ - reason{"overlong"} - replacement{"CK"} - } - COL{ - reason{"overlong"} - replacement{"CO"} - } - COM{ - reason{"overlong"} - replacement{"KM"} - } - CPT{ - reason{"overlong"} - replacement{"CP"} - } - CPV{ - reason{"overlong"} - replacement{"CV"} - } - CRI{ - reason{"overlong"} - replacement{"CR"} - } - CS{ - reason{"deprecated"} - replacement{"RS ME"} - } - CT{ - reason{"deprecated"} - replacement{"KI"} - } - CUB{ - reason{"overlong"} - replacement{"CU"} - } - CUW{ - reason{"overlong"} - replacement{"CW"} - } - CXR{ - reason{"overlong"} - replacement{"CX"} - } - CYM{ - reason{"overlong"} - replacement{"KY"} - } - CYP{ - reason{"overlong"} - replacement{"CY"} - } - CZE{ - reason{"overlong"} - replacement{"CZ"} - } - DD{ - reason{"deprecated"} - replacement{"DE"} - } - DDR{ - reason{"overlong"} - replacement{"DE"} - } - DEU{ - reason{"overlong"} - replacement{"DE"} - } - DGA{ - reason{"overlong"} - replacement{"DG"} - } - DJI{ - reason{"overlong"} - replacement{"DJ"} - } - DMA{ - reason{"overlong"} - replacement{"DM"} - } - DNK{ - reason{"overlong"} - replacement{"DK"} - } - DOM{ - reason{"overlong"} - replacement{"DO"} - } - DY{ - reason{"deprecated"} - replacement{"BJ"} - } - DZA{ - reason{"overlong"} - replacement{"DZ"} - } - ECU{ - reason{"overlong"} - replacement{"EC"} - } - EGY{ - reason{"overlong"} - replacement{"EG"} - } - ERI{ - reason{"overlong"} - replacement{"ER"} - } - ESH{ - reason{"overlong"} - replacement{"EH"} - } - ESP{ - reason{"overlong"} - replacement{"ES"} - } - EST{ - reason{"overlong"} - replacement{"EE"} - } - ETH{ - reason{"overlong"} - replacement{"ET"} - } - FIN{ - reason{"overlong"} - replacement{"FI"} - } - FJI{ - reason{"overlong"} - replacement{"FJ"} - } - FLK{ - reason{"overlong"} - replacement{"FK"} - } - FQ{ - reason{"deprecated"} - replacement{"AQ TF"} - } - FRA{ - reason{"overlong"} - replacement{"FR"} - } - FRO{ - reason{"overlong"} - replacement{"FO"} - } - FSM{ - reason{"overlong"} - replacement{"FM"} - } - FX{ - reason{"deprecated"} - replacement{"FR"} - } - FXX{ - reason{"overlong"} - replacement{"FR"} - } - GAB{ - reason{"overlong"} - replacement{"GA"} - } - GBR{ - reason{"overlong"} - replacement{"GB"} - } - GEO{ - reason{"overlong"} - replacement{"GE"} - } - GGY{ - reason{"overlong"} - replacement{"GG"} - } - GHA{ - reason{"overlong"} - replacement{"GH"} - } - GIB{ - reason{"overlong"} - replacement{"GI"} - } - GIN{ - reason{"overlong"} - replacement{"GN"} - } - GLP{ - reason{"overlong"} - replacement{"GP"} - } - GMB{ - reason{"overlong"} - replacement{"GM"} - } - GNB{ - reason{"overlong"} - replacement{"GW"} - } - GNQ{ - reason{"overlong"} - replacement{"GQ"} - } - GRC{ - reason{"overlong"} - replacement{"GR"} - } - GRD{ - reason{"overlong"} - replacement{"GD"} - } - GRL{ - reason{"overlong"} - replacement{"GL"} - } - GTM{ - reason{"overlong"} - replacement{"GT"} - } - GUF{ - reason{"overlong"} - replacement{"GF"} - } - GUM{ - reason{"overlong"} - replacement{"GU"} - } - GUY{ - reason{"overlong"} - replacement{"GY"} - } - HKG{ - reason{"overlong"} - replacement{"HK"} - } - HMD{ - reason{"overlong"} - replacement{"HM"} - } - HND{ - reason{"overlong"} - replacement{"HN"} - } - HRV{ - reason{"overlong"} - replacement{"HR"} - } - HTI{ - reason{"overlong"} - replacement{"HT"} - } - HUN{ - reason{"overlong"} - replacement{"HU"} - } - HV{ - reason{"deprecated"} - replacement{"BF"} - } - IDN{ - reason{"overlong"} - replacement{"ID"} - } - IMN{ - reason{"overlong"} - replacement{"IM"} - } - IND{ - reason{"overlong"} - replacement{"IN"} - } - IOT{ - reason{"overlong"} - replacement{"IO"} - } - IRL{ - reason{"overlong"} - replacement{"IE"} - } - IRN{ - reason{"overlong"} - replacement{"IR"} - } - IRQ{ - reason{"overlong"} - replacement{"IQ"} - } - ISL{ - reason{"overlong"} - replacement{"IS"} - } - ISR{ - reason{"overlong"} - replacement{"IL"} - } - ITA{ - reason{"overlong"} - replacement{"IT"} - } - JAM{ - reason{"overlong"} - replacement{"JM"} - } - JEY{ - reason{"overlong"} - replacement{"JE"} - } - JOR{ - reason{"overlong"} - replacement{"JO"} - } - JPN{ - reason{"overlong"} - replacement{"JP"} - } - JT{ - reason{"deprecated"} - replacement{"UM"} - } - KAZ{ - reason{"overlong"} - replacement{"KZ"} - } - KEN{ - reason{"overlong"} - replacement{"KE"} - } - KGZ{ - reason{"overlong"} - replacement{"KG"} - } - KHM{ - reason{"overlong"} - replacement{"KH"} - } - KIR{ - reason{"overlong"} - replacement{"KI"} - } - KNA{ - reason{"overlong"} - replacement{"KN"} - } - KOR{ - reason{"overlong"} - replacement{"KR"} - } - KWT{ - reason{"overlong"} - replacement{"KW"} - } - LAO{ - reason{"overlong"} - replacement{"LA"} - } - LBN{ - reason{"overlong"} - replacement{"LB"} - } - LBR{ - reason{"overlong"} - replacement{"LR"} - } - LBY{ - reason{"overlong"} - replacement{"LY"} - } - LCA{ - reason{"overlong"} - replacement{"LC"} - } - LIE{ - reason{"overlong"} - replacement{"LI"} - } - LKA{ - reason{"overlong"} - replacement{"LK"} - } - LSO{ - reason{"overlong"} - replacement{"LS"} - } - LTU{ - reason{"overlong"} - replacement{"LT"} - } - LUX{ - reason{"overlong"} - replacement{"LU"} - } - LVA{ - reason{"overlong"} - replacement{"LV"} - } - MAC{ - reason{"overlong"} - replacement{"MO"} - } - MAF{ - reason{"overlong"} - replacement{"MF"} - } - MAR{ - reason{"overlong"} - replacement{"MA"} - } - MCO{ - reason{"overlong"} - replacement{"MC"} - } - MDA{ - reason{"overlong"} - replacement{"MD"} - } - MDG{ - reason{"overlong"} - replacement{"MG"} - } - MDV{ - reason{"overlong"} - replacement{"MV"} - } - MEX{ - reason{"overlong"} - replacement{"MX"} - } - MHL{ - reason{"overlong"} - replacement{"MH"} - } - MI{ - reason{"deprecated"} - replacement{"UM"} - } - MKD{ - reason{"overlong"} - replacement{"MK"} - } - MLI{ - reason{"overlong"} - replacement{"ML"} - } - MLT{ - reason{"overlong"} - replacement{"MT"} - } - MMR{ - reason{"overlong"} - replacement{"MM"} - } - MNE{ - reason{"overlong"} - replacement{"ME"} - } - MNG{ - reason{"overlong"} - replacement{"MN"} - } - MNP{ - reason{"overlong"} - replacement{"MP"} - } - MOZ{ - reason{"overlong"} - replacement{"MZ"} - } - MRT{ - reason{"overlong"} - replacement{"MR"} - } - MSR{ - reason{"overlong"} - replacement{"MS"} - } - MTQ{ - reason{"overlong"} - replacement{"MQ"} - } - MUS{ - reason{"overlong"} - replacement{"MU"} - } - MWI{ - reason{"overlong"} - replacement{"MW"} - } - MYS{ - reason{"overlong"} - replacement{"MY"} - } - MYT{ - reason{"overlong"} - replacement{"YT"} - } - NAM{ - reason{"overlong"} - replacement{"NA"} - } - NCL{ - reason{"overlong"} - replacement{"NC"} - } - NER{ - reason{"overlong"} - replacement{"NE"} - } - NFK{ - reason{"overlong"} - replacement{"NF"} - } - NGA{ - reason{"overlong"} - replacement{"NG"} - } - NH{ - reason{"deprecated"} - replacement{"VU"} - } - NIC{ - reason{"overlong"} - replacement{"NI"} - } - NIU{ - reason{"overlong"} - replacement{"NU"} - } - NLD{ - reason{"overlong"} - replacement{"NL"} - } - NOR{ - reason{"overlong"} - replacement{"NO"} - } - NPL{ - reason{"overlong"} - replacement{"NP"} - } - NQ{ - reason{"deprecated"} - replacement{"AQ"} - } - NRU{ - reason{"overlong"} - replacement{"NR"} - } - NT{ - reason{"deprecated"} - replacement{"SA IQ"} - } - NTZ{ - reason{"overlong"} - replacement{"SA IQ"} - } - NZL{ - reason{"overlong"} - replacement{"NZ"} - } - OMN{ - reason{"overlong"} - replacement{"OM"} - } - PAK{ - reason{"overlong"} - replacement{"PK"} - } - PAN{ - reason{"overlong"} - replacement{"PA"} - } - PC{ - reason{"deprecated"} - replacement{"FM MH MP PW"} - } - PCN{ - reason{"overlong"} - replacement{"PN"} - } - PER{ - reason{"overlong"} - replacement{"PE"} - } - PHL{ - reason{"overlong"} - replacement{"PH"} - } - PLW{ - reason{"overlong"} - replacement{"PW"} - } - PNG{ - reason{"overlong"} - replacement{"PG"} - } - POL{ - reason{"overlong"} - replacement{"PL"} - } - PRI{ - reason{"overlong"} - replacement{"PR"} - } - PRK{ - reason{"overlong"} - replacement{"KP"} - } - PRT{ - reason{"overlong"} - replacement{"PT"} - } - PRY{ - reason{"overlong"} - replacement{"PY"} - } - PSE{ - reason{"overlong"} - replacement{"PS"} - } - PU{ - reason{"deprecated"} - replacement{"UM"} - } - PYF{ - reason{"overlong"} - replacement{"PF"} - } - PZ{ - reason{"deprecated"} - replacement{"PA"} - } - QAT{ - reason{"overlong"} - replacement{"QA"} - } - QMM{ - reason{"overlong"} - replacement{"QM"} - } - QNN{ - reason{"overlong"} - replacement{"QN"} - } - QPP{ - reason{"overlong"} - replacement{"QP"} - } - QQQ{ - reason{"overlong"} - replacement{"QQ"} - } - QRR{ - reason{"overlong"} - replacement{"QR"} - } - QSS{ - reason{"overlong"} - replacement{"QS"} - } - QTT{ - reason{"overlong"} - replacement{"QT"} - } - QU{ - reason{"deprecated"} - replacement{"EU"} - } - QUU{ - reason{"overlong"} - replacement{"EU"} - } - QVV{ - reason{"overlong"} - replacement{"QV"} - } - QWW{ - reason{"overlong"} - replacement{"QW"} - } - QXX{ - reason{"overlong"} - replacement{"QX"} - } - QYY{ - reason{"overlong"} - replacement{"QY"} - } - QZZ{ - reason{"overlong"} - replacement{"QZ"} - } - REU{ - reason{"overlong"} - replacement{"RE"} - } - RH{ - reason{"deprecated"} - replacement{"ZW"} - } - ROU{ - reason{"overlong"} - replacement{"RO"} - } - RUS{ - reason{"overlong"} - replacement{"RU"} - } - RWA{ - reason{"overlong"} - replacement{"RW"} - } - SAU{ - reason{"overlong"} - replacement{"SA"} - } - SCG{ - reason{"overlong"} - replacement{"RS ME"} - } - SDN{ - reason{"overlong"} - replacement{"SD"} - } - SEN{ - reason{"overlong"} - replacement{"SN"} - } - SGP{ - reason{"overlong"} - replacement{"SG"} - } - SGS{ - reason{"overlong"} - replacement{"GS"} - } - SHN{ - reason{"overlong"} - replacement{"SH"} - } - SJM{ - reason{"overlong"} - replacement{"SJ"} - } - SLB{ - reason{"overlong"} - replacement{"SB"} - } - SLE{ - reason{"overlong"} - replacement{"SL"} - } - SLV{ - reason{"overlong"} - replacement{"SV"} - } - SMR{ - reason{"overlong"} - replacement{"SM"} - } - SOM{ - reason{"overlong"} - replacement{"SO"} - } - SPM{ - reason{"overlong"} - replacement{"PM"} - } - SRB{ - reason{"overlong"} - replacement{"RS"} - } - SSD{ - reason{"overlong"} - replacement{"SS"} - } - STP{ - reason{"overlong"} - replacement{"ST"} - } - SU{ - reason{"deprecated"} - replacement{"RU AM AZ BY EE GE KZ KG LV LT MD TJ TM UA UZ"} - } - SUN{ - reason{"overlong"} - replacement{"RU AM AZ BY EE GE KZ KG LV LT MD TJ TM UA UZ"} - } - SUR{ - reason{"overlong"} - replacement{"SR"} - } - SVK{ - reason{"overlong"} - replacement{"SK"} - } - SVN{ - reason{"overlong"} - replacement{"SI"} - } - SWE{ - reason{"overlong"} - replacement{"SE"} - } - SWZ{ - reason{"overlong"} - replacement{"SZ"} - } - SXM{ - reason{"overlong"} - replacement{"SX"} - } - SYC{ - reason{"overlong"} - replacement{"SC"} - } - SYR{ - reason{"overlong"} - replacement{"SY"} - } - TAA{ - reason{"overlong"} - replacement{"TA"} - } - TCA{ - reason{"overlong"} - replacement{"TC"} - } - TCD{ - reason{"overlong"} - replacement{"TD"} - } - TGO{ - reason{"overlong"} - replacement{"TG"} - } - THA{ - reason{"overlong"} - replacement{"TH"} - } - TJK{ - reason{"overlong"} - replacement{"TJ"} - } - TKL{ - reason{"overlong"} - replacement{"TK"} - } - TKM{ - reason{"overlong"} - replacement{"TM"} - } - TLS{ - reason{"overlong"} - replacement{"TL"} - } - TMP{ - reason{"overlong"} - replacement{"TL"} - } - TON{ - reason{"overlong"} - replacement{"TO"} - } - TP{ - reason{"deprecated"} - replacement{"TL"} - } - TTO{ - reason{"overlong"} - replacement{"TT"} - } - TUN{ - reason{"overlong"} - replacement{"TN"} - } - TUR{ - reason{"overlong"} - replacement{"TR"} - } - TUV{ - reason{"overlong"} - replacement{"TV"} - } - TWN{ - reason{"overlong"} - replacement{"TW"} - } - TZA{ - reason{"overlong"} - replacement{"TZ"} - } - UGA{ - reason{"overlong"} - replacement{"UG"} - } - UK{ - reason{"deprecated"} - replacement{"GB"} - } - UKR{ - reason{"overlong"} - replacement{"UA"} - } - UMI{ - reason{"overlong"} - replacement{"UM"} - } - URY{ - reason{"overlong"} - replacement{"UY"} - } - USA{ - reason{"overlong"} - replacement{"US"} - } - UZB{ - reason{"overlong"} - replacement{"UZ"} - } - VAT{ - reason{"overlong"} - replacement{"VA"} - } - VCT{ - reason{"overlong"} - replacement{"VC"} - } - VD{ - reason{"deprecated"} - replacement{"VN"} - } - VEN{ - reason{"overlong"} - replacement{"VE"} - } - VGB{ - reason{"overlong"} - replacement{"VG"} - } - VIR{ - reason{"overlong"} - replacement{"VI"} - } - VNM{ - reason{"overlong"} - replacement{"VN"} - } - VUT{ - reason{"overlong"} - replacement{"VU"} - } - WK{ - reason{"deprecated"} - replacement{"UM"} - } - WLF{ - reason{"overlong"} - replacement{"WF"} - } - WSM{ - reason{"overlong"} - replacement{"WS"} - } - XAA{ - reason{"overlong"} - replacement{"XA"} - } - XBB{ - reason{"overlong"} - replacement{"XB"} - } - XCC{ - reason{"overlong"} - replacement{"XC"} - } - XDD{ - reason{"overlong"} - replacement{"XD"} - } - XEE{ - reason{"overlong"} - replacement{"XE"} - } - XFF{ - reason{"overlong"} - replacement{"XF"} - } - XGG{ - reason{"overlong"} - replacement{"XG"} - } - XHH{ - reason{"overlong"} - replacement{"XH"} - } - XII{ - reason{"overlong"} - replacement{"XI"} - } - XJJ{ - reason{"overlong"} - replacement{"XJ"} - } - XKK{ - reason{"overlong"} - replacement{"XK"} - } - XLL{ - reason{"overlong"} - replacement{"XL"} - } - XMM{ - reason{"overlong"} - replacement{"XM"} - } - XNN{ - reason{"overlong"} - replacement{"XN"} - } - XOO{ - reason{"overlong"} - replacement{"XO"} - } - XPP{ - reason{"overlong"} - replacement{"XP"} - } - XQQ{ - reason{"overlong"} - replacement{"XQ"} - } - XRR{ - reason{"overlong"} - replacement{"XR"} - } - XSS{ - reason{"overlong"} - replacement{"XS"} - } - XTT{ - reason{"overlong"} - replacement{"XT"} - } - XUU{ - reason{"overlong"} - replacement{"XU"} - } - XVV{ - reason{"overlong"} - replacement{"XV"} - } - XWW{ - reason{"overlong"} - replacement{"XW"} - } - XXX{ - reason{"overlong"} - replacement{"XX"} - } - XYY{ - reason{"overlong"} - replacement{"XY"} - } - XZZ{ - reason{"overlong"} - replacement{"XZ"} - } - YD{ - reason{"deprecated"} - replacement{"YE"} - } - YEM{ - reason{"overlong"} - replacement{"YE"} - } - YMD{ - reason{"overlong"} - replacement{"YE"} - } - YU{ - reason{"deprecated"} - replacement{"RS ME"} - } - YUG{ - reason{"overlong"} - replacement{"RS ME"} - } - ZAF{ - reason{"overlong"} - replacement{"ZA"} - } - ZAR{ - reason{"overlong"} - replacement{"CD"} - } - ZMB{ - reason{"overlong"} - replacement{"ZM"} - } - ZR{ - reason{"deprecated"} - replacement{"CD"} - } - ZWE{ - reason{"overlong"} - replacement{"ZW"} - } - ZZZ{ - reason{"overlong"} - replacement{"ZZ"} - } - } - variant{ - AALAND{ - reason{"deprecated"} - replacement{"AX"} - } - HEPLOC{ - reason{"deprecated"} - replacement{"ALALC97"} - } - POLYTONI{ - reason{"deprecated"} - replacement{"POLYTON"} - } - } - } - defaultContent{ - "aa_ET", - "af_ZA", - "agq_CM", - "ak_GH", - "am_ET", - "ar_001", - "arn_CL", - "as_IN", - "asa_TZ", - "ast_ES", - "az_Arab_IR", - "az_Cyrl_AZ", - "az_Latn", - "az_Latn_AZ", - "ba_RU", - "bas_CM", - "be_BY", - "bem_ZM", - "bez_TZ", - "bg_BG", - "bgn_PK", - "bm_ML", - "bm_Nkoo_ML", - "bn_BD", - "bo_CN", - "br_FR", - "brx_IN", - "bs_Cyrl_BA", - "bs_Latn", - "bs_Latn_BA", - "bss_CM", - "byn_ER", - "ca_ES", - "cch_NG", - "ce_RU", - "cgg_UG", - "chr_US", - "ckb_IQ", - "co_FR", - "cs_CZ", - "cu_RU", - "cv_RU", - "cy_GB", - "da_DK", - "dav_KE", - "de_DE", - "dje_NE", - "dsb_DE", - "dua_CM", - "dv_MV", - "dyo_SN", - "dz_BT", - "ebu_KE", - "ee_GH", - "el_GR", - "en_Dsrt_US", - "en_US", - "eo_001", - "es_ES", - "et_EE", - "eu_ES", - "ewo_CM", - "fa_IR", - "ff_SN", - "fi_FI", - "fil_PH", - "fo_FO", - "fr_FR", - "fur_IT", - "fy_NL", - "ga_IE", - "gaa_GH", - "gd_GB", - "gez_ET", - "gl_ES", - "gn_PY", - "gsw_CH", - "gu_IN", - "guz_KE", - "gv_IM", - "ha_Arab_NG", - "ha_NG", - "haw_US", - "he_IL", - "hi_IN", - "hr_HR", - "hsb_DE", - "hu_HU", - "hy_AM", - "ia_FR", - "id_ID", - "ig_NG", - "ii_CN", - "is_IS", - "it_IT", - "iu_CA", - "iu_Latn_CA", - "ja_JP", - "jgo_CM", - "jmc_TZ", - "jv_ID", - "ka_GE", - "kab_DZ", - "kaj_NG", - "kam_KE", - "kcg_NG", - "kde_TZ", - "kea_CV", - "ken_CM", - "khq_ML", - "ki_KE", - "kk_KZ", - "kkj_CM", - "kl_GL", - "kln_KE", - "km_KH", - "kn_IN", - "ko_KR", - "kok_IN", - "kpe_LR", - "ks_IN", - "ksb_TZ", - "ksf_CM", - "ksh_DE", - "ku_TR", - "kw_GB", - "ky_KG", - "lag_TZ", - "lb_LU", - "lg_UG", - "lkt_US", - "ln_CD", - "lo_LA", - "lrc_IR", - "lt_LT", - "lu_CD", - "luo_KE", - "luy_KE", - "lv_LV", - "mas_KE", - "mer_KE", - "mfe_MU", - "mg_MG", - "mgh_MZ", - "mgo_CM", - "mi_NZ", - "mk_MK", - "ml_IN", - "mn_MN", - "mn_Mong_CN", - "mni_IN", - "moh_CA", - "mr_IN", - "ms_Arab_MY", - "ms_MY", - "mt_MT", - "mua_CM", - "my_MM", - "mzn_IR", - "naq_NA", - "nb_NO", - "nd_ZW", - "nds_DE", - "ne_NP", - "nl_NL", - "nmg_CM", - "nn_NO", - "nnh_CM", - "nqo_GN", - "nr_ZA", - "nso_ZA", - "nus_SS", - "ny_MW", - "nyn_UG", - "oc_FR", - "om_ET", - "or_IN", - "os_GE", - "pa_Arab_PK", - "pa_Guru", - "pa_Guru_IN", - "pl_PL", - "prg_001", - "ps_AF", - "pt_BR", - "qu_PE", - "quc_GT", - "rm_CH", - "rn_BI", - "ro_RO", - "rof_TZ", - "ru_RU", - "rw_RW", - "rwk_TZ", - "sa_IN", - "sah_RU", - "saq_KE", - "sbp_TZ", - "sd_PK", - "sdh_IR", - "se_NO", - "seh_MZ", - "ses_ML", - "sg_CF", - "shi_Latn_MA", - "shi_Tfng", - "shi_Tfng_MA", - "si_LK", - "sid_ET", - "sk_SK", - "sl_SI", - "sma_SE", - "smj_SE", - "smn_FI", - "sms_FI", - "sn_ZW", - "so_SO", - "sq_AL", - "sr_Cyrl", - "sr_Cyrl_RS", - "sr_Latn_RS", - "ss_ZA", - "ssy_ER", - "st_ZA", - "sv_SE", - "sw_TZ", - "syr_IQ", - "ta_IN", - "te_IN", - "teo_UG", - "tg_TJ", - "th_TH", - "ti_ET", - "tig_ER", - "tk_TM", - "tn_ZA", - "to_TO", - "tr_TR", - "trv_TW", - "ts_ZA", - "tt_RU", - "twq_NE", - "tzm_MA", - "ug_CN", - "uk_UA", - "ur_PK", - "uz_Arab_AF", - "uz_Cyrl_UZ", - "uz_Latn", - "uz_Latn_UZ", - "vai_Latn_LR", - "vai_Vaii", - "vai_Vaii_LR", - "ve_ZA", - "vi_VN", - "vo_001", - "vun_TZ", - "wa_BE", - "wae_CH", - "wal_ET", - "wbp_AU", - "wo_SN", - "xh_ZA", - "xog_UG", - "yav_CM", - "yi_001", - "yo_NG", - "yue_HK", - "zgh_MA", - "zh_Hans", - "zh_Hans_CN", - "zh_Hant_TW", - "zu_ZA", - } -} diff --git a/Build/source/libs/icu/icu-src/source/data/misc/miscfiles.mk b/Build/source/libs/icu/icu-src/source/data/misc/miscfiles.mk deleted file mode 100644 index bd073c0f990..00000000000 --- a/Build/source/libs/icu/icu-src/source/data/misc/miscfiles.mk +++ /dev/null @@ -1,31 +0,0 @@ -# Copyright (C) 2016 and later: Unicode, Inc. and others. -# License & terms of use: http://www.unicode.org/copyright.html -# * Copyright (C) 2003-2015, International Business Machines -# * Corporation and others. All Rights Reserved. -# A list of txt's to build -# Note: -# -# If you are thinking of modifying this file, READ THIS. -# -# Instead of changing this file [unless you want to check it back in], -# you should consider creating a 'misclocal.mk' file in this same directory. -# Then, you can have your local changes remain even if you upgrade or re- -# configure ICU. -# -# Example 'misclocal.mk' files: -# -# * To add an additional file to the list: -# _____________________________________________________ -# | MISC_SOURCE_LOCAL = myFile.txt ... -# -# * To REPLACE the default list and only build a subset of files: -# _____________________________________________________ -# | MISC_SOURCE = zoneinfo.txt -# -# - -MISC_SOURCE = \ -zoneinfo64.txt supplementalData.txt likelySubtags.txt plurals.txt \ -numberingSystems.txt icuver.txt icustd.txt metadata.txt metaZones.txt \ -windowsZones.txt keyTypeData.txt timezoneTypes.txt currencyNumericCodes.txt \ -genderList.txt dayPeriods.txt diff --git a/Build/source/libs/icu/icu-src/source/data/misc/numberingSystems.txt b/Build/source/libs/icu/icu-src/source/data/misc/numberingSystems.txt deleted file mode 100644 index 7ef230a77cc..00000000000 --- a/Build/source/libs/icu/icu-src/source/data/misc/numberingSystems.txt +++ /dev/null @@ -1,391 +0,0 @@ -// © 2016 and later: Unicode, Inc. and others. -// License & terms of use: http://www.unicode.org/copyright.html#License -numberingSystems:table(nofallback){ - numberingSystems{ - adlm{ - algorithmic:int{0} - desc{"𞥐𞥑𞥒𞥓𞥔𞥕𞥖𞥗𞥘𞥙"} - radix:int{10} - } - ahom{ - algorithmic:int{0} - desc{"𑜰𑜱𑜲𑜳𑜴𑜵𑜶𑜷𑜸𑜹"} - radix:int{10} - } - arab{ - algorithmic:int{0} - desc{"٠١٢٣٤٥٦٧٨٩"} - radix:int{10} - } - arabext{ - algorithmic:int{0} - desc{"۰۱۲۳۴۵۶۷۸۹"} - radix:int{10} - } - armn{ - algorithmic:int{1} - desc{"%armenian-upper"} - radix:int{10} - } - armnlow{ - algorithmic:int{1} - desc{"%armenian-lower"} - radix:int{10} - } - bali{ - algorithmic:int{0} - desc{"᭐᭑᭒᭓᭔᭕᭖᭗᭘᭙"} - radix:int{10} - } - beng{ - algorithmic:int{0} - desc{"০১২৩৪৫৬৭৮৯"} - radix:int{10} - } - bhks{ - algorithmic:int{0} - desc{"𑱐𑱑𑱒𑱓𑱔𑱕𑱖𑱗𑱘𑱙"} - radix:int{10} - } - brah{ - algorithmic:int{0} - desc{"𑁦𑁧𑁨𑁩𑁪𑁫𑁬𑁭𑁮𑁯"} - radix:int{10} - } - cakm{ - algorithmic:int{0} - desc{"𑄶𑄷𑄸𑄹𑄺𑄻𑄼𑄽𑄾𑄿"} - radix:int{10} - } - cham{ - algorithmic:int{0} - desc{"꩐꩑꩒꩓꩔꩕꩖꩗꩘꩙"} - radix:int{10} - } - cyrl{ - algorithmic:int{1} - desc{"%cyrillic-lower"} - radix:int{10} - } - deva{ - algorithmic:int{0} - desc{"०१२३४५६७८९"} - radix:int{10} - } - ethi{ - algorithmic:int{1} - desc{"%ethiopic"} - radix:int{10} - } - fullwide{ - algorithmic:int{0} - desc{"0123456789"} - radix:int{10} - } - geor{ - algorithmic:int{1} - desc{"%georgian"} - radix:int{10} - } - grek{ - algorithmic:int{1} - desc{"%greek-upper"} - radix:int{10} - } - greklow{ - algorithmic:int{1} - desc{"%greek-lower"} - radix:int{10} - } - gujr{ - algorithmic:int{0} - desc{"૦૧૨૩૪૫૬૭૮૯"} - radix:int{10} - } - guru{ - algorithmic:int{0} - desc{"੦੧੨੩੪੫੬੭੮੯"} - radix:int{10} - } - hanidays{ - algorithmic:int{1} - desc{"zh/SpelloutRules/%spellout-numbering-days"} - radix:int{10} - } - hanidec{ - algorithmic:int{0} - desc{"〇一二三四五六七八九"} - radix:int{10} - } - hans{ - algorithmic:int{1} - desc{"zh/SpelloutRules/%spellout-cardinal"} - radix:int{10} - } - hansfin{ - algorithmic:int{1} - desc{"zh/SpelloutRules/%spellout-cardinal-financial"} - radix:int{10} - } - hant{ - algorithmic:int{1} - desc{"zh_Hant/SpelloutRules/%spellout-cardinal"} - radix:int{10} - } - hantfin{ - algorithmic:int{1} - desc{"zh_Hant/SpelloutRules/%spellout-cardinal-financial"} - radix:int{10} - } - hebr{ - algorithmic:int{1} - desc{"%hebrew"} - radix:int{10} - } - hmng{ - algorithmic:int{0} - desc{"𖭐𖭑𖭒𖭓𖭔𖭕𖭖𖭗𖭘𖭙"} - radix:int{10} - } - java{ - algorithmic:int{0} - desc{"꧐꧑꧒꧓꧔꧕꧖꧗꧘꧙"} - radix:int{10} - } - jpan{ - algorithmic:int{1} - desc{"ja/SpelloutRules/%spellout-cardinal"} - radix:int{10} - } - jpanfin{ - algorithmic:int{1} - desc{"ja/SpelloutRules/%spellout-cardinal-financial"} - radix:int{10} - } - kali{ - algorithmic:int{0} - desc{"꤀꤁꤂꤃꤄꤅꤆꤇꤈꤉"} - radix:int{10} - } - khmr{ - algorithmic:int{0} - desc{"០១២៣៤៥៦៧៨៩"} - radix:int{10} - } - knda{ - algorithmic:int{0} - desc{"೦೧೨೩೪೫೬೭೮೯"} - radix:int{10} - } - lana{ - algorithmic:int{0} - desc{"᪀᪁᪂᪃᪄᪅᪆᪇᪈᪉"} - radix:int{10} - } - lanatham{ - algorithmic:int{0} - desc{"᪐᪑᪒᪓᪔᪕᪖᪗᪘᪙"} - radix:int{10} - } - laoo{ - algorithmic:int{0} - desc{"໐໑໒໓໔໕໖໗໘໙"} - radix:int{10} - } - latn{ - algorithmic:int{0} - desc{"0123456789"} - radix:int{10} - } - lepc{ - algorithmic:int{0} - desc{"᱀᱁᱂᱃᱄᱅᱆᱇᱈᱉"} - radix:int{10} - } - limb{ - algorithmic:int{0} - desc{"᥆᥇᥈᥉᥊᥋᥌᥍᥎᥏"} - radix:int{10} - } - mathbold{ - algorithmic:int{0} - desc{"𝟎𝟏𝟐𝟑𝟒𝟓𝟔𝟕𝟖𝟗"} - radix:int{10} - } - mathdbl{ - algorithmic:int{0} - desc{"𝟘𝟙𝟚𝟛𝟜𝟝𝟞𝟟𝟠𝟡"} - radix:int{10} - } - mathmono{ - algorithmic:int{0} - desc{"𝟶𝟷𝟸𝟹𝟺𝟻𝟼𝟽𝟾𝟿"} - radix:int{10} - } - mathsanb{ - algorithmic:int{0} - desc{"𝟬𝟭𝟮𝟯𝟰𝟱𝟲𝟳𝟴𝟵"} - radix:int{10} - } - mathsans{ - algorithmic:int{0} - desc{"𝟢𝟣𝟤𝟥𝟦𝟧𝟨𝟩𝟪𝟫"} - radix:int{10} - } - mlym{ - algorithmic:int{0} - desc{"൦൧൨൩൪൫൬൭൮൯"} - radix:int{10} - } - modi{ - algorithmic:int{0} - desc{"𑙐𑙑𑙒𑙓𑙔𑙕𑙖𑙗𑙘𑙙"} - radix:int{10} - } - mong{ - algorithmic:int{0} - desc{"᠐᠑᠒᠓᠔᠕᠖᠗᠘᠙"} - radix:int{10} - } - mroo{ - algorithmic:int{0} - desc{"𖩠𖩡𖩢𖩣𖩤𖩥𖩦𖩧𖩨𖩩"} - radix:int{10} - } - mtei{ - algorithmic:int{0} - desc{"꯰꯱꯲꯳꯴꯵꯶꯷꯸꯹"} - radix:int{10} - } - mymr{ - algorithmic:int{0} - desc{"၀၁၂၃၄၅၆၇၈၉"} - radix:int{10} - } - mymrshan{ - algorithmic:int{0} - desc{"႐႑႒႓႔႕႖႗႘႙"} - radix:int{10} - } - mymrtlng{ - algorithmic:int{0} - desc{"꧰꧱꧲꧳꧴꧵꧶꧷꧸꧹"} - radix:int{10} - } - newa{ - algorithmic:int{0} - desc{"𑑐𑑑𑑒𑑓𑑔𑑕𑑖𑑗𑑘𑑙"} - radix:int{10} - } - nkoo{ - algorithmic:int{0} - desc{"߀߁߂߃߄߅߆߇߈߉"} - radix:int{10} - } - olck{ - algorithmic:int{0} - desc{"᱐᱑᱒᱓᱔᱕᱖᱗᱘᱙"} - radix:int{10} - } - orya{ - algorithmic:int{0} - desc{"୦୧୨୩୪୫୬୭୮୯"} - radix:int{10} - } - osma{ - algorithmic:int{0} - desc{"𐒠𐒡𐒢𐒣𐒤𐒥𐒦𐒧𐒨𐒩"} - radix:int{10} - } - roman{ - algorithmic:int{1} - desc{"%roman-upper"} - radix:int{10} - } - romanlow{ - algorithmic:int{1} - desc{"%roman-lower"} - radix:int{10} - } - saur{ - algorithmic:int{0} - desc{"꣐꣑꣒꣓꣔꣕꣖꣗꣘꣙"} - radix:int{10} - } - shrd{ - algorithmic:int{0} - desc{"𑇐𑇑𑇒𑇓𑇔𑇕𑇖𑇗𑇘𑇙"} - radix:int{10} - } - sind{ - algorithmic:int{0} - desc{"𑋰𑋱𑋲𑋳𑋴𑋵𑋶𑋷𑋸𑋹"} - radix:int{10} - } - sinh{ - algorithmic:int{0} - desc{"෦෧෨෩෪෫෬෭෮෯"} - radix:int{10} - } - sora{ - algorithmic:int{0} - desc{"𑃰𑃱𑃲𑃳𑃴𑃵𑃶𑃷𑃸𑃹"} - radix:int{10} - } - sund{ - algorithmic:int{0} - desc{"᮰᮱᮲᮳᮴᮵᮶᮷᮸᮹"} - radix:int{10} - } - takr{ - algorithmic:int{0} - desc{"𑛀𑛁𑛂𑛃𑛄𑛅𑛆𑛇𑛈𑛉"} - radix:int{10} - } - talu{ - algorithmic:int{0} - desc{"᧐᧑᧒᧓᧔᧕᧖᧗᧘᧙"} - radix:int{10} - } - taml{ - algorithmic:int{1} - desc{"%tamil"} - radix:int{10} - } - tamldec{ - algorithmic:int{0} - desc{"௦௧௨௩௪௫௬௭௮௯"} - radix:int{10} - } - telu{ - algorithmic:int{0} - desc{"౦౧౨౩౪౫౬౭౮౯"} - radix:int{10} - } - thai{ - algorithmic:int{0} - desc{"๐๑๒๓๔๕๖๗๘๙"} - radix:int{10} - } - tibt{ - algorithmic:int{0} - desc{"༠༡༢༣༤༥༦༧༨༩"} - radix:int{10} - } - tirh{ - algorithmic:int{0} - desc{"𑓐𑓑𑓒𑓓𑓔𑓕𑓖𑓗𑓘𑓙"} - radix:int{10} - } - vaii{ - algorithmic:int{0} - desc{"꘠꘡꘢꘣꘤꘥꘦꘧꘨꘩"} - radix:int{10} - } - wara{ - algorithmic:int{0} - desc{"𑣠𑣡𑣢𑣣𑣤𑣥𑣦𑣧𑣨𑣩"} - radix:int{10} - } - } -} diff --git a/Build/source/libs/icu/icu-src/source/data/misc/plurals.txt b/Build/source/libs/icu/icu-src/source/data/misc/plurals.txt deleted file mode 100644 index 1d80c06e7c1..00000000000 --- a/Build/source/libs/icu/icu-src/source/data/misc/plurals.txt +++ /dev/null @@ -1,903 +0,0 @@ -// © 2016 and later: Unicode, Inc. and others. -// License & terms of use: http://www.unicode.org/copyright.html#License -plurals:table(nofallback){ - locales{ - af{"set8"} - ak{"set5"} - am{"set1"} - ar{"set34"} - ars{"set34"} - as{"set1"} - asa{"set8"} - ast{"set3"} - az{"set8"} - be{"set27"} - bem{"set8"} - bez{"set8"} - bg{"set8"} - bh{"set5"} - bm{"set0"} - bn{"set1"} - bo{"set0"} - br{"set31"} - brx{"set8"} - bs{"set20"} - ca{"set3"} - ce{"set8"} - cgg{"set8"} - chr{"set8"} - ckb{"set8"} - cs{"set25"} - cy{"set35"} - da{"set10"} - de{"set3"} - dsb{"set23"} - dv{"set8"} - dz{"set0"} - ee{"set8"} - el{"set8"} - en{"set3"} - eo{"set8"} - es{"set8"} - et{"set3"} - eu{"set8"} - fa{"set1"} - ff{"set2"} - fi{"set3"} - fil{"set13"} - fo{"set8"} - fr{"set2"} - fur{"set8"} - fy{"set3"} - ga{"set32"} - gd{"set21"} - gl{"set3"} - gsw{"set8"} - gu{"set1"} - guw{"set5"} - gv{"set33"} - ha{"set8"} - haw{"set8"} - he{"set24"} - hi{"set1"} - hr{"set20"} - hsb{"set23"} - hu{"set8"} - hy{"set2"} - id{"set0"} - ig{"set0"} - ii{"set0"} - in{"set0"} - is{"set11"} - it{"set3"} - iu{"set17"} - iw{"set24"} - ja{"set0"} - jbo{"set0"} - jgo{"set8"} - ji{"set3"} - jmc{"set8"} - jv{"set0"} - jw{"set0"} - ka{"set8"} - kab{"set2"} - kaj{"set8"} - kcg{"set8"} - kde{"set0"} - kea{"set0"} - kk{"set8"} - kkj{"set8"} - kl{"set8"} - km{"set0"} - kn{"set1"} - ko{"set0"} - ks{"set8"} - ksb{"set8"} - ksh{"set16"} - ku{"set8"} - kw{"set17"} - ky{"set8"} - lag{"set15"} - lb{"set8"} - lg{"set8"} - lkt{"set0"} - ln{"set5"} - lo{"set0"} - lt{"set28"} - lv{"set14"} - mas{"set8"} - mg{"set5"} - mgo{"set8"} - mk{"set12"} - ml{"set8"} - mn{"set8"} - mo{"set19"} - mr{"set1"} - ms{"set0"} - mt{"set29"} - my{"set0"} - nah{"set8"} - naq{"set17"} - nb{"set8"} - nd{"set8"} - ne{"set8"} - nl{"set3"} - nn{"set8"} - nnh{"set8"} - no{"set8"} - nqo{"set0"} - nr{"set8"} - nso{"set5"} - ny{"set8"} - nyn{"set8"} - om{"set8"} - or{"set8"} - os{"set8"} - pa{"set5"} - pap{"set8"} - pl{"set26"} - prg{"set14"} - ps{"set8"} - pt{"set7"} - pt_PT{"set9"} - rm{"set8"} - ro{"set19"} - rof{"set8"} - root{"set0"} - ru{"set30"} - rwk{"set8"} - sah{"set0"} - saq{"set8"} - sdh{"set8"} - se{"set17"} - seh{"set8"} - ses{"set0"} - sg{"set0"} - sh{"set20"} - shi{"set18"} - si{"set4"} - sk{"set25"} - sl{"set22"} - sma{"set17"} - smi{"set17"} - smj{"set17"} - smn{"set17"} - sms{"set17"} - sn{"set8"} - so{"set8"} - sq{"set8"} - sr{"set20"} - ss{"set8"} - ssy{"set8"} - st{"set8"} - sv{"set3"} - sw{"set3"} - syr{"set8"} - ta{"set8"} - te{"set8"} - teo{"set8"} - th{"set0"} - ti{"set5"} - tig{"set8"} - tk{"set8"} - tl{"set13"} - tn{"set8"} - to{"set0"} - tr{"set8"} - ts{"set8"} - tzm{"set6"} - ug{"set8"} - uk{"set30"} - ur{"set3"} - uz{"set8"} - ve{"set8"} - vi{"set0"} - vo{"set8"} - vun{"set8"} - wa{"set5"} - wae{"set8"} - wo{"set0"} - xh{"set8"} - xog{"set8"} - yi{"set3"} - yo{"set0"} - yue{"set0"} - zh{"set0"} - zu{"set1"} - } - locales_ordinals{ - af{"set36"} - am{"set36"} - ar{"set36"} - as{"set53"} - az{"set51"} - be{"set41"} - bg{"set36"} - bn{"set53"} - bs{"set36"} - ca{"set49"} - ce{"set36"} - cs{"set36"} - cy{"set54"} - da{"set36"} - de{"set36"} - dsb{"set36"} - el{"set36"} - en{"set47"} - es{"set36"} - et{"set36"} - eu{"set36"} - fa{"set36"} - fi{"set36"} - fil{"set38"} - fr{"set38"} - fy{"set36"} - ga{"set38"} - gl{"set36"} - gu{"set52"} - he{"set36"} - hi{"set52"} - hr{"set36"} - hsb{"set36"} - hu{"set39"} - hy{"set38"} - id{"set36"} - in{"set36"} - is{"set36"} - it{"set44"} - iw{"set36"} - ja{"set36"} - ka{"set45"} - kk{"set43"} - km{"set36"} - kn{"set36"} - ko{"set36"} - ky{"set36"} - lo{"set38"} - lt{"set36"} - lv{"set36"} - mk{"set50"} - ml{"set36"} - mn{"set36"} - mo{"set38"} - mr{"set48"} - ms{"set38"} - my{"set36"} - nb{"set36"} - ne{"set40"} - nl{"set36"} - pa{"set36"} - pl{"set36"} - prg{"set36"} - pt{"set36"} - ro{"set38"} - root{"set36"} - ru{"set36"} - sh{"set36"} - si{"set36"} - sk{"set36"} - sl{"set36"} - sq{"set46"} - sr{"set36"} - sv{"set37"} - sw{"set36"} - ta{"set36"} - te{"set36"} - th{"set36"} - tl{"set38"} - tr{"set36"} - uk{"set42"} - ur{"set36"} - uz{"set36"} - vi{"set38"} - yue{"set36"} - zh{"set36"} - zu{"set36"} - } - rules{ - set0{ - other{ - " @integer 0~15, 100, 1000, 10000, 100000, 1000000, … @decimal 0.0~1." - "5, 10.0, 100.0, 1000.0, 10000.0, 100000.0, 1000000.0, …" - } - } - set1{ - one{"i = 0 or n = 1 @integer 0, 1 @decimal 0.0~1.0, 0.00~0.04"} - other{ - " @integer 2~17, 100, 1000, 10000, 100000, 1000000, … @decimal 1.1~2." - "6, 10.0, 100.0, 1000.0, 10000.0, 100000.0, 1000000.0, …" - } - } - set10{ - one{"n = 1 or t != 0 and i = 0,1 @integer 1 @decimal 0.1~1.6"} - other{ - " @integer 0, 2~16, 100, 1000, 10000, 100000, 1000000, … @decimal 0.0" - ", 2.0~3.4, 10.0, 100.0, 1000.0, 10000.0, 100000.0, 1000000.0, …" - } - } - set11{ - one{ - "t = 0 and i % 10 = 1 and i % 100 != 11 or t != 0 @integer 1, 21, 31," - " 41, 51, 61, 71, 81, 101, 1001, … @decimal 0.1~1.6, 10.1, 100.1, 100" - "0.1, …" - } - other{ - " @integer 0, 2~16, 100, 1000, 10000, 100000, 1000000, … @decimal 0.0" - ", 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 10.0, 100.0, 1000.0, 10000.0, 1" - "00000.0, 1000000.0, …" - } - } - set12{ - one{ - "v = 0 and i % 10 = 1 or f % 10 = 1 @integer 1, 11, 21, 31, 41, 51, 6" - "1, 71, 101, 1001, … @decimal 0.1, 1.1, 2.1, 3.1, 4.1, 5.1, 6.1, 7.1," - " 10.1, 100.1, 1000.1, …" - } - other{ - " @integer 0, 2~10, 12~17, 100, 1000, 10000, 100000, 1000000, … @deci" - "mal 0.0, 0.2~1.0, 1.2~1.7, 10.0, 100.0, 1000.0, 10000.0, 100000.0, 1" - "000000.0, …" - } - } - set13{ - one{ - "v = 0 and i = 1,2,3 or v = 0 and i % 10 != 4,6,9 or v != 0 and f % 1" - "0 != 4,6,9 @integer 0~3, 5, 7, 8, 10~13, 15, 17, 18, 20, 21, 100, 10" - "00, 10000, 100000, 1000000, … @decimal 0.0~0.3, 0.5, 0.7, 0.8, 1.0~1" - ".3, 1.5, 1.7, 1.8, 2.0, 2.1, 10.0, 100.0, 1000.0, 10000.0, 100000.0," - " 1000000.0, …" - } - other{ - " @integer 4, 6, 9, 14, 16, 19, 24, 26, 104, 1004, … @decimal 0.4, 0." - "6, 0.9, 1.4, 1.6, 1.9, 2.4, 2.6, 10.4, 100.4, 1000.4, …" - } - } - set14{ - one{ - "n % 10 = 1 and n % 100 != 11 or v = 2 and f % 10 = 1 and f % 100 != " - "11 or v != 2 and f % 10 = 1 @integer 1, 21, 31, 41, 51, 61, 71, 81, " - "101, 1001, … @decimal 0.1, 1.0, 1.1, 2.1, 3.1, 4.1, 5.1, 6.1, 7.1, 1" - "0.1, 100.1, 1000.1, …" - } - other{ - " @integer 2~9, 22~29, 102, 1002, … @decimal 0.2~0.9, 1.2~1.9, 10.2, " - "100.2, 1000.2, …" - } - zero{ - "n % 10 = 0 or n % 100 = 11..19 or v = 2 and f % 100 = 11..19 @intege" - "r 0, 10~20, 30, 40, 50, 60, 100, 1000, 10000, 100000, 1000000, … @de" - "cimal 0.0, 10.0, 11.0, 12.0, 13.0, 14.0, 15.0, 16.0, 100.0, 1000.0, " - "10000.0, 100000.0, 1000000.0, …" - } - } - set15{ - one{"i = 0,1 and n != 0 @integer 1 @decimal 0.1~1.6"} - other{ - " @integer 2~17, 100, 1000, 10000, 100000, 1000000, … @decimal 2.0~3." - "5, 10.0, 100.0, 1000.0, 10000.0, 100000.0, 1000000.0, …" - } - zero{"n = 0 @integer 0 @decimal 0.0, 0.00, 0.000, 0.0000"} - } - set16{ - one{"n = 1 @integer 1 @decimal 1.0, 1.00, 1.000, 1.0000"} - other{ - " @integer 2~17, 100, 1000, 10000, 100000, 1000000, … @decimal 0.1~0." - "9, 1.1~1.7, 10.0, 100.0, 1000.0, 10000.0, 100000.0, 1000000.0, …" - } - zero{"n = 0 @integer 0 @decimal 0.0, 0.00, 0.000, 0.0000"} - } - set17{ - one{"n = 1 @integer 1 @decimal 1.0, 1.00, 1.000, 1.0000"} - other{ - " @integer 0, 3~17, 100, 1000, 10000, 100000, 1000000, … @decimal 0.0" - "~0.9, 1.1~1.6, 10.0, 100.0, 1000.0, 10000.0, 100000.0, 1000000.0, …" - } - two{"n = 2 @integer 2 @decimal 2.0, 2.00, 2.000, 2.0000"} - } - set18{ - few{ - "n = 2..10 @integer 2~10 @decimal 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, " - "9.0, 10.0, 2.00, 3.00, 4.00, 5.00, 6.00, 7.00, 8.00" - } - one{"i = 0 or n = 1 @integer 0, 1 @decimal 0.0~1.0, 0.00~0.04"} - other{ - " @integer 11~26, 100, 1000, 10000, 100000, 1000000, … @decimal 1.1~1" - ".9, 2.1~2.7, 10.1, 100.0, 1000.0, 10000.0, 100000.0, 1000000.0, …" - } - } - set19{ - few{ - "v != 0 or n = 0 or n != 1 and n % 100 = 1..19 @integer 0, 2~16, 101," - " 1001, … @decimal 0.0~1.5, 10.0, 100.0, 1000.0, 10000.0, 100000.0, 1" - "000000.0, …" - } - one{"i = 1 and v = 0 @integer 1"} - other{" @integer 20~35, 100, 1000, 10000, 100000, 1000000, …"} - } - set2{ - one{"i = 0,1 @integer 0, 1 @decimal 0.0~1.5"} - other{ - " @integer 2~17, 100, 1000, 10000, 100000, 1000000, … @decimal 2.0~3." - "5, 10.0, 100.0, 1000.0, 10000.0, 100000.0, 1000000.0, …" - } - } - set20{ - few{ - "v = 0 and i % 10 = 2..4 and i % 100 != 12..14 or f % 10 = 2..4 and f" - " % 100 != 12..14 @integer 2~4, 22~24, 32~34, 42~44, 52~54, 62, 102, " - "1002, … @decimal 0.2~0.4, 1.2~1.4, 2.2~2.4, 3.2~3.4, 4.2~4.4, 5.2, 1" - "0.2, 100.2, 1000.2, …" - } - one{ - "v = 0 and i % 10 = 1 and i % 100 != 11 or f % 10 = 1 and f % 100 != " - "11 @integer 1, 21, 31, 41, 51, 61, 71, 81, 101, 1001, … @decimal 0.1" - ", 1.1, 2.1, 3.1, 4.1, 5.1, 6.1, 7.1, 10.1, 100.1, 1000.1, …" - } - other{ - " @integer 0, 5~19, 100, 1000, 10000, 100000, 1000000, … @decimal 0.0" - ", 0.5~1.0, 1.5~2.0, 2.5~2.7, 10.0, 100.0, 1000.0, 10000.0, 100000.0," - " 1000000.0, …" - } - } - set21{ - few{ - "n = 3..10,13..19 @integer 3~10, 13~19 @decimal 3.0, 4.0, 5.0, 6.0, 7" - ".0, 8.0, 9.0, 10.0, 13.0, 14.0, 15.0, 16.0, 17.0, 18.0, 19.0, 3.00" - } - one{ - "n = 1,11 @integer 1, 11 @decimal 1.0, 11.0, 1.00, 11.00, 1.000, 11.0" - "00, 1.0000" - } - other{ - " @integer 0, 20~34, 100, 1000, 10000, 100000, 1000000, … @decimal 0." - "0~0.9, 1.1~1.6, 10.1, 100.0, 1000.0, 10000.0, 100000.0, 1000000.0, …" - } - two{ - "n = 2,12 @integer 2, 12 @decimal 2.0, 12.0, 2.00, 12.00, 2.000, 12.0" - "00, 2.0000" - } - } - set22{ - few{ - "v = 0 and i % 100 = 3..4 or v != 0 @integer 3, 4, 103, 104, 203, 204" - ", 303, 304, 403, 404, 503, 504, 603, 604, 703, 704, 1003, … @decimal" - " 0.0~1.5, 10.0, 100.0, 1000.0, 10000.0, 100000.0, 1000000.0, …" - } - one{ - "v = 0 and i % 100 = 1 @integer 1, 101, 201, 301, 401, 501, 601, 701," - " 1001, …" - } - other{" @integer 0, 5~19, 100, 1000, 10000, 100000, 1000000, …"} - two{ - "v = 0 and i % 100 = 2 @integer 2, 102, 202, 302, 402, 502, 602, 702," - " 1002, …" - } - } - set23{ - few{ - "v = 0 and i % 100 = 3..4 or f % 100 = 3..4 @integer 3, 4, 103, 104, " - "203, 204, 303, 304, 403, 404, 503, 504, 603, 604, 703, 704, 1003, … " - "@decimal 0.3, 0.4, 1.3, 1.4, 2.3, 2.4, 3.3, 3.4, 4.3, 4.4, 5.3, 5.4," - " 6.3, 6.4, 7.3, 7.4, 10.3, 100.3, 1000.3, …" - } - one{ - "v = 0 and i % 100 = 1 or f % 100 = 1 @integer 1, 101, 201, 301, 401," - " 501, 601, 701, 1001, … @decimal 0.1, 1.1, 2.1, 3.1, 4.1, 5.1, 6.1, " - "7.1, 10.1, 100.1, 1000.1, …" - } - other{ - " @integer 0, 5~19, 100, 1000, 10000, 100000, 1000000, … @decimal 0.0" - ", 0.5~1.0, 1.5~2.0, 2.5~2.7, 10.0, 100.0, 1000.0, 10000.0, 100000.0," - " 1000000.0, …" - } - two{ - "v = 0 and i % 100 = 2 or f % 100 = 2 @integer 2, 102, 202, 302, 402," - " 502, 602, 702, 1002, … @decimal 0.2, 1.2, 2.2, 3.2, 4.2, 5.2, 6.2, " - "7.2, 10.2, 100.2, 1000.2, …" - } - } - set24{ - many{ - "v = 0 and n != 0..10 and n % 10 = 0 @integer 20, 30, 40, 50, 60, 70," - " 80, 90, 100, 1000, 10000, 100000, 1000000, …" - } - one{"i = 1 and v = 0 @integer 1"} - other{ - " @integer 0, 3~17, 101, 1001, … @decimal 0.0~1.5, 10.0, 100.0, 1000." - "0, 10000.0, 100000.0, 1000000.0, …" - } - two{"i = 2 and v = 0 @integer 2"} - } - set25{ - few{"i = 2..4 and v = 0 @integer 2~4"} - many{ - "v != 0 @decimal 0.0~1.5, 10.0, 100.0, 1000.0, 10000.0, 100000.0, 1" - "000000.0, …" - } - one{"i = 1 and v = 0 @integer 1"} - other{" @integer 0, 5~19, 100, 1000, 10000, 100000, 1000000, …"} - } - set26{ - few{ - "v = 0 and i % 10 = 2..4 and i % 100 != 12..14 @integer 2~4, 22~24, 3" - "2~34, 42~44, 52~54, 62, 102, 1002, …" - } - many{ - "v = 0 and i != 1 and i % 10 = 0..1 or v = 0 and i % 10 = 5..9 or v =" - " 0 and i % 100 = 12..14 @integer 0, 5~19, 100, 1000, 10000, 100000, " - "1000000, …" - } - one{"i = 1 and v = 0 @integer 1"} - other{ - " @decimal 0.0~1.5, 10.0, 100.0, 1000.0, 10000.0, 100000.0, 1000000" - ".0, …" - } - } - set27{ - few{ - "n % 10 = 2..4 and n % 100 != 12..14 @integer 2~4, 22~24, 32~34, 42~4" - "4, 52~54, 62, 102, 1002, … @decimal 2.0, 3.0, 4.0, 22.0, 23.0, 24.0," - " 32.0, 33.0, 102.0, 1002.0, …" - } - many{ - "n % 10 = 0 or n % 10 = 5..9 or n % 100 = 11..14 @integer 0, 5~19, 10" - "0, 1000, 10000, 100000, 1000000, … @decimal 0.0, 5.0, 6.0, 7.0, 8.0," - " 9.0, 10.0, 11.0, 100.0, 1000.0, 10000.0, 100000.0, 1000000.0, …" - } - one{ - "n % 10 = 1 and n % 100 != 11 @integer 1, 21, 31, 41, 51, 61, 71, 81," - " 101, 1001, … @decimal 1.0, 21.0, 31.0, 41.0, 51.0, 61.0, 71.0, 81.0" - ", 101.0, 1001.0, …" - } - other{" @decimal 0.1~0.9, 1.1~1.7, 10.1, 100.1, 1000.1, …"} - } - set28{ - few{ - "n % 10 = 2..9 and n % 100 != 11..19 @integer 2~9, 22~29, 102, 1002, " - "… @decimal 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 22.0, 102.0, 1002" - ".0, …" - } - many{"f != 0 @decimal 0.1~0.9, 1.1~1.7, 10.1, 100.1, 1000.1, …"} - one{ - "n % 10 = 1 and n % 100 != 11..19 @integer 1, 21, 31, 41, 51, 61, 71," - " 81, 101, 1001, … @decimal 1.0, 21.0, 31.0, 41.0, 51.0, 61.0, 71.0, " - "81.0, 101.0, 1001.0, …" - } - other{ - " @integer 0, 10~20, 30, 40, 50, 60, 100, 1000, 10000, 100000, 100000" - "0, … @decimal 0.0, 10.0, 11.0, 12.0, 13.0, 14.0, 15.0, 16.0, 100.0, " - "1000.0, 10000.0, 100000.0, 1000000.0, …" - } - } - set29{ - few{ - "n = 0 or n % 100 = 2..10 @integer 0, 2~10, 102~107, 1002, … @decimal" - " 0.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 10.0, 102.0, 1002.0, …" - } - many{ - "n % 100 = 11..19 @integer 11~19, 111~117, 1011, … @decimal 11.0, 12." - "0, 13.0, 14.0, 15.0, 16.0, 17.0, 18.0, 111.0, 1011.0, …" - } - one{"n = 1 @integer 1 @decimal 1.0, 1.00, 1.000, 1.0000"} - other{ - " @integer 20~35, 100, 1000, 10000, 100000, 1000000, … @decimal 0.1~0" - ".9, 1.1~1.7, 10.1, 100.0, 1000.0, 10000.0, 100000.0, 1000000.0, …" - } - } - set3{ - one{"i = 1 and v = 0 @integer 1"} - other{ - " @integer 0, 2~16, 100, 1000, 10000, 100000, 1000000, … @decimal 0.0" - "~1.5, 10.0, 100.0, 1000.0, 10000.0, 100000.0, 1000000.0, …" - } - } - set30{ - few{ - "v = 0 and i % 10 = 2..4 and i % 100 != 12..14 @integer 2~4, 22~24, 3" - "2~34, 42~44, 52~54, 62, 102, 1002, …" - } - many{ - "v = 0 and i % 10 = 0 or v = 0 and i % 10 = 5..9 or v = 0 and i % 100" - " = 11..14 @integer 0, 5~19, 100, 1000, 10000, 100000, 1000000, …" - } - one{ - "v = 0 and i % 10 = 1 and i % 100 != 11 @integer 1, 21, 31, 41, 51, 6" - "1, 71, 81, 101, 1001, …" - } - other{ - " @decimal 0.0~1.5, 10.0, 100.0, 1000.0, 10000.0, 100000.0, 1000000" - ".0, …" - } - } - set31{ - few{ - "n % 10 = 3..4,9 and n % 100 != 10..19,70..79,90..99 @integer 3, 4, 9" - ", 23, 24, 29, 33, 34, 39, 43, 44, 49, 103, 1003, … @decimal 3.0, 4.0" - ", 9.0, 23.0, 24.0, 29.0, 33.0, 34.0, 103.0, 1003.0, …" - } - many{ - "n != 0 and n % 1000000 = 0 @integer 1000000, … @decimal 1000000.0, 1" - "000000.00, 1000000.000, …" - } - one{ - "n % 10 = 1 and n % 100 != 11,71,91 @integer 1, 21, 31, 41, 51, 61, 8" - "1, 101, 1001, … @decimal 1.0, 21.0, 31.0, 41.0, 51.0, 61.0, 81.0, 10" - "1.0, 1001.0, …" - } - other{ - " @integer 0, 5~8, 10~20, 100, 1000, 10000, 100000, … @decimal 0.0~0." - "9, 1.1~1.6, 10.0, 100.0, 1000.0, 10000.0, 100000.0, …" - } - two{ - "n % 10 = 2 and n % 100 != 12,72,92 @integer 2, 22, 32, 42, 52, 62, 8" - "2, 102, 1002, … @decimal 2.0, 22.0, 32.0, 42.0, 52.0, 62.0, 82.0, 10" - "2.0, 1002.0, …" - } - } - set32{ - few{ - "n = 3..6 @integer 3~6 @decimal 3.0, 4.0, 5.0, 6.0, 3.00, 4.00, 5.00," - " 6.00, 3.000, 4.000, 5.000, 6.000, 3.0000, 4.0000, 5.0000, 6.0000" - } - many{ - "n = 7..10 @integer 7~10 @decimal 7.0, 8.0, 9.0, 10.0, 7.00, 8.00, 9." - "00, 10.00, 7.000, 8.000, 9.000, 10.000, 7.0000, 8.0000, 9.0000, 10.0" - "000" - } - one{"n = 1 @integer 1 @decimal 1.0, 1.00, 1.000, 1.0000"} - other{ - " @integer 0, 11~25, 100, 1000, 10000, 100000, 1000000, … @decimal 0." - "0~0.9, 1.1~1.6, 10.1, 100.0, 1000.0, 10000.0, 100000.0, 1000000.0, …" - } - two{"n = 2 @integer 2 @decimal 2.0, 2.00, 2.000, 2.0000"} - } - set33{ - few{ - "v = 0 and i % 100 = 0,20,40,60,80 @integer 0, 20, 40, 60, 80, 100, 1" - "20, 140, 1000, 10000, 100000, 1000000, …" - } - many{ - "v != 0 @decimal 0.0~1.5, 10.0, 100.0, 1000.0, 10000.0, 100000.0, 1" - "000000.0, …" - } - one{ - "v = 0 and i % 10 = 1 @integer 1, 11, 21, 31, 41, 51, 61, 71, 101, 10" - "01, …" - } - other{" @integer 3~10, 13~19, 23, 103, 1003, …"} - two{ - "v = 0 and i % 10 = 2 @integer 2, 12, 22, 32, 42, 52, 62, 72, 102, 10" - "02, …" - } - } - set34{ - few{ - "n % 100 = 3..10 @integer 3~10, 103~110, 1003, … @decimal 3.0, 4.0, 5" - ".0, 6.0, 7.0, 8.0, 9.0, 10.0, 103.0, 1003.0, …" - } - many{ - "n % 100 = 11..99 @integer 11~26, 111, 1011, … @decimal 11.0, 12.0, 1" - "3.0, 14.0, 15.0, 16.0, 17.0, 18.0, 111.0, 1011.0, …" - } - one{"n = 1 @integer 1 @decimal 1.0, 1.00, 1.000, 1.0000"} - other{ - " @integer 100~102, 200~202, 300~302, 400~402, 500~502, 600, 1000, 10" - "000, 100000, 1000000, … @decimal 0.1~0.9, 1.1~1.7, 10.1, 100.0, 1000" - ".0, 10000.0, 100000.0, 1000000.0, …" - } - two{"n = 2 @integer 2 @decimal 2.0, 2.00, 2.000, 2.0000"} - zero{"n = 0 @integer 0 @decimal 0.0, 0.00, 0.000, 0.0000"} - } - set35{ - few{"n = 3 @integer 3 @decimal 3.0, 3.00, 3.000, 3.0000"} - many{"n = 6 @integer 6 @decimal 6.0, 6.00, 6.000, 6.0000"} - one{"n = 1 @integer 1 @decimal 1.0, 1.00, 1.000, 1.0000"} - other{ - " @integer 4, 5, 7~20, 100, 1000, 10000, 100000, 1000000, … @decimal " - "0.1~0.9, 1.1~1.7, 10.0, 100.0, 1000.0, 10000.0, 100000.0, 1000000.0," - " …" - } - two{"n = 2 @integer 2 @decimal 2.0, 2.00, 2.000, 2.0000"} - zero{"n = 0 @integer 0 @decimal 0.0, 0.00, 0.000, 0.0000"} - } - set36{ - other{" @integer 0~15, 100, 1000, 10000, 100000, 1000000, …"} - } - set37{ - one{ - "n % 10 = 1,2 and n % 100 != 11,12 @integer 1, 2, 21, 22, 31, 32, 41," - " 42, 51, 52, 61, 62, 71, 72, 81, 82, 101, 1001, …" - } - other{" @integer 0, 3~17, 100, 1000, 10000, 100000, 1000000, …"} - } - set38{ - one{"n = 1 @integer 1"} - other{" @integer 0, 2~16, 100, 1000, 10000, 100000, 1000000, …"} - } - set39{ - one{"n = 1,5 @integer 1, 5"} - other{" @integer 0, 2~4, 6~17, 100, 1000, 10000, 100000, 1000000, …"} - } - set4{ - one{ - "n = 0,1 or i = 0 and f = 1 @integer 0, 1 @decimal 0.0, 0.1, 1.0, 0.0" - "0, 0.01, 1.00, 0.000, 0.001, 1.000, 0.0000, 0.0001, 1.0000" - } - other{ - " @integer 2~17, 100, 1000, 10000, 100000, 1000000, … @decimal 0.2~0." - "9, 1.1~1.8, 10.0, 100.0, 1000.0, 10000.0, 100000.0, 1000000.0, …" - } - } - set40{ - one{"n = 1..4 @integer 1~4"} - other{" @integer 0, 5~19, 100, 1000, 10000, 100000, 1000000, …"} - } - set41{ - few{ - "n % 10 = 2,3 and n % 100 != 12,13 @integer 2, 3, 22, 23, 32, 33, 42," - " 43, 52, 53, 62, 63, 72, 73, 82, 83, 102, 1002, …" - } - other{" @integer 0, 1, 4~17, 100, 1000, 10000, 100000, 1000000, …"} - } - set42{ - few{ - "n % 10 = 3 and n % 100 != 13 @integer 3, 23, 33, 43, 53, 63, 73, 83," - " 103, 1003, …" - } - other{" @integer 0~2, 4~16, 100, 1000, 10000, 100000, 1000000, …"} - } - set43{ - many{ - "n % 10 = 6 or n % 10 = 9 or n % 10 = 0 and n != 0 @integer 6, 9, 10," - " 16, 19, 20, 26, 29, 30, 36, 39, 40, 100, 1000, 10000, 100000, 10000" - "00, …" - } - other{" @integer 0~5, 7, 8, 11~15, 17, 18, 21, 101, 1001, …"} - } - set44{ - many{"n = 11,8,80,800 @integer 8, 11, 80, 800"} - other{" @integer 0~7, 9, 10, 12~17, 100, 1000, 10000, 100000, 1000000, …"} - } - set45{ - many{"i = 0 or i % 100 = 2..20,40,60,80 @integer 0, 2~16, 102, 1002, …"} - one{"i = 1 @integer 1"} - other{" @integer 21~36, 100, 1000, 10000, 100000, 1000000, …"} - } - set46{ - many{ - "n % 10 = 4 and n % 100 != 14 @integer 4, 24, 34, 44, 54, 64, 74, 84," - " 104, 1004, …" - } - one{"n = 1 @integer 1"} - other{" @integer 0, 2, 3, 5~17, 100, 1000, 10000, 100000, 1000000, …"} - } - set47{ - few{ - "n % 10 = 3 and n % 100 != 13 @integer 3, 23, 33, 43, 53, 63, 73, 83," - " 103, 1003, …" - } - one{ - "n % 10 = 1 and n % 100 != 11 @integer 1, 21, 31, 41, 51, 61, 71, 81," - " 101, 1001, …" - } - other{" @integer 0, 4~18, 100, 1000, 10000, 100000, 1000000, …"} - two{ - "n % 10 = 2 and n % 100 != 12 @integer 2, 22, 32, 42, 52, 62, 72, 82," - " 102, 1002, …" - } - } - set48{ - few{"n = 4 @integer 4"} - one{"n = 1 @integer 1"} - other{" @integer 0, 5~19, 100, 1000, 10000, 100000, 1000000, …"} - two{"n = 2,3 @integer 2, 3"} - } - set49{ - few{"n = 4 @integer 4"} - one{"n = 1,3 @integer 1, 3"} - other{" @integer 0, 5~19, 100, 1000, 10000, 100000, 1000000, …"} - two{"n = 2 @integer 2"} - } - set5{ - one{ - "n = 0..1 @integer 0, 1 @decimal 0.0, 1.0, 0.00, 1.00, 0.000, 1.000, " - "0.0000, 1.0000" - } - other{ - " @integer 2~17, 100, 1000, 10000, 100000, 1000000, … @decimal 0.1~0." - "9, 1.1~1.7, 10.0, 100.0, 1000.0, 10000.0, 100000.0, 1000000.0, …" - } - } - set50{ - many{ - "i % 10 = 7,8 and i % 100 != 17,18 @integer 7, 8, 27, 28, 37, 38, 47," - " 48, 57, 58, 67, 68, 77, 78, 87, 88, 107, 1007, …" - } - one{ - "i % 10 = 1 and i % 100 != 11 @integer 1, 21, 31, 41, 51, 61, 71, 81," - " 101, 1001, …" - } - other{" @integer 0, 3~6, 9~19, 100, 1000, 10000, 100000, 1000000, …"} - two{ - "i % 10 = 2 and i % 100 != 12 @integer 2, 22, 32, 42, 52, 62, 72, 82," - " 102, 1002, …" - } - } - set51{ - few{ - "i % 10 = 3,4 or i % 1000 = 100,200,300,400,500,600,700,800,900 @inte" - "ger 3, 4, 13, 14, 23, 24, 33, 34, 43, 44, 53, 54, 63, 64, 73, 74, 10" - "0, 1003, …" - } - many{ - "i = 0 or i % 10 = 6 or i % 100 = 40,60,90 @integer 0, 6, 16, 26, 36," - " 40, 46, 56, 106, 1006, …" - } - one{ - "i % 10 = 1,2,5,7,8 or i % 100 = 20,50,70,80 @integer 1, 2, 5, 7, 8, " - "11, 12, 15, 17, 18, 20~22, 25, 101, 1001, …" - } - other{ - " @integer 9, 10, 19, 29, 30, 39, 49, 59, 69, 79, 109, 1000, 10000, 1" - "00000, 1000000, …" - } - } - set52{ - few{"n = 4 @integer 4"} - many{"n = 6 @integer 6"} - one{"n = 1 @integer 1"} - other{" @integer 0, 5, 7~20, 100, 1000, 10000, 100000, 1000000, …"} - two{"n = 2,3 @integer 2, 3"} - } - set53{ - few{"n = 4 @integer 4"} - many{"n = 6 @integer 6"} - one{"n = 1,5,7,8,9,10 @integer 1, 5, 7~10"} - other{" @integer 0, 11~25, 100, 1000, 10000, 100000, 1000000, …"} - two{"n = 2,3 @integer 2, 3"} - } - set54{ - few{"n = 3,4 @integer 3, 4"} - many{"n = 5,6 @integer 5, 6"} - one{"n = 1 @integer 1"} - other{" @integer 10~25, 100, 1000, 10000, 100000, 1000000, …"} - two{"n = 2 @integer 2"} - zero{"n = 0,7,8,9 @integer 0, 7~9"} - } - set6{ - one{ - "n = 0..1 or n = 11..99 @integer 0, 1, 11~24 @decimal 0.0, 1.0, 11.0," - " 12.0, 13.0, 14.0, 15.0, 16.0, 17.0, 18.0, 19.0, 20.0, 21.0, 22.0, 2" - "3.0, 24.0" - } - other{ - " @integer 2~10, 100~106, 1000, 10000, 100000, 1000000, … @decimal 0." - "1~0.9, 1.1~1.7, 10.0, 100.0, 1000.0, 10000.0, 100000.0, 1000000.0, …" - } - } - set7{ - one{ - "n = 0..2 and n != 2 @integer 0, 1 @decimal 0.0, 1.0, 0.00, 1.00, 0.0" - "00, 1.000, 0.0000, 1.0000" - } - other{ - " @integer 2~17, 100, 1000, 10000, 100000, 1000000, … @decimal 0.1~0." - "9, 1.1~1.7, 10.0, 100.0, 1000.0, 10000.0, 100000.0, 1000000.0, …" - } - } - set8{ - one{"n = 1 @integer 1 @decimal 1.0, 1.00, 1.000, 1.0000"} - other{ - " @integer 0, 2~16, 100, 1000, 10000, 100000, 1000000, … @decimal 0.0" - "~0.9, 1.1~1.6, 10.0, 100.0, 1000.0, 10000.0, 100000.0, 1000000.0, …" - } - } - set9{ - one{"n = 1 and v = 0 @integer 1"} - other{ - " @integer 0, 2~16, 100, 1000, 10000, 100000, 1000000, … @decimal 0.0" - "~1.5, 10.0, 100.0, 1000.0, 10000.0, 100000.0, 1000000.0, …" - } - } - } -} diff --git a/Build/source/libs/icu/icu-src/source/data/misc/supplementalData.txt b/Build/source/libs/icu/icu-src/source/data/misc/supplementalData.txt deleted file mode 100644 index c5f90353f90..00000000000 --- a/Build/source/libs/icu/icu-src/source/data/misc/supplementalData.txt +++ /dev/null @@ -1,35552 +0,0 @@ -// © 2016 and later: Unicode, Inc. and others. -// License & terms of use: http://www.unicode.org/copyright.html#License -supplementalData:table(nofallback){ - calendarData{ - buddhist{ - eras{ - 0{ - start:intvector{ - -18457, - 643382272, - } - } - } - system{"solar"} - } - chinese{ - eras{ - 0{ - start:intvector{ - -33843, - 1352598528, - } - } - } - system{"lunisolar"} - } - coptic{ - eras{ - 0{ - end:intvector{ - -12383, - 368826367, - } - } - 1{ - start:intvector{ - -12383, - 368826368, - } - } - } - system{"other"} - } - dangi{ - eras{ - 0{ - start:intvector{ - -31610, - -93940736, - } - } - } - system{"lunisolar"} - } - ethiopic{ - eras{ - 0{ - end:intvector{ - -14411, - 664902655, - } - } - 1{ - start:intvector{ - -14411, - 664902656, - } - } - } - system{"other"} - } - ethiopic-amete-alem{ - eras{ - 0{ - end:intvector{ - -54823, - -2125298689, - } - } - } - } - gregorian{ - eras{ - 0{ - end:intvector{ - -14468, - -477728769, - } - } - 1{ - start:intvector{ - -14468, - -477728768, - } - } - } - system{"solar"} - } - hebrew{ - eras{ - 0{ - start:intvector{ - -42096, - 1167292416, - } - } - } - system{"lunisolar"} - } - indian{ - eras{ - 0{ - start:intvector{ - -13895, - -44389376, - } - } - } - } - islamic{ - eras{ - 0{ - start:intvector{ - -9901, - -1497369600, - } - } - } - system{"lunar"} - } - islamic-civil{ - eras{ - 0{ - start:intvector{ - -9901, - -1410969600, - } - } - } - system{"lunar"} - } - islamic-rgsa{ - eras{ - 0{ - start:intvector{ - -9901, - -1497369600, - } - } - } - system{"lunar"} - } - islamic-tbla{ - eras{ - 0{ - start:intvector{ - -9901, - -1497369600, - } - } - } - system{"lunar"} - } - islamic-umalqura{ - eras{ - 0{ - start:intvector{ - -9901, - -1497369600, - } - } - } - system{"lunar"} - } - japanese{ - eras{ - 0{ - start:intvector{ - -9732, - 548124672, - } - } - 1{ - start:intvector{ - -9698, - 1572036608, - } - } - 10{ - start:intvector{ - -9114, - 1157535744, - } - } - 100{ - start:intvector{ - -5884, - -819397632, - } - } - 101{ - start:intvector{ - -5869, - -1048707072, - } - } - 102{ - start:intvector{ - -5837, - 504906752, - } - } - 103{ - start:intvector{ - -5823, - -156402688, - } - } - 104{ - start:intvector{ - -5794, - -294454272, - } - } - 105{ - start:intvector{ - -5787, - 1324541952, - } - } - 106{ - start:intvector{ - -5773, - 810999808, - } - } - 107{ - start:intvector{ - -5764, - -234673152, - } - } - 108{ - start:intvector{ - -5729, - 702838784, - } - } - 109{ - start:intvector{ - -5663, - -1680770048, - } - } - 11{ - start:intvector{ - -8970, - -223922176, - } - } - 110{ - start:intvector{ - -5650, - -664144896, - } - } - 111{ - start:intvector{ - -5627, - 59374592, - } - } - 112{ - start:intvector{ - -5611, - 200697856, - } - } - 113{ - start:intvector{ - -5600, - 130457600, - } - } - 114{ - start:intvector{ - -5576, - -885324800, - } - } - 115{ - start:intvector{ - -5556, - -125470720, - } - } - 116{ - start:intvector{ - -5516, - 1110004736, - } - } - 117{ - start:intvector{ - -5494, - 1401524224, - } - } - 118{ - start:intvector{ - -5475, - 2049945600, - } - } - 119{ - start:intvector{ - -5472, - -2083523584, - } - } - 12{ - start:intvector{ - -8968, - -1988256768, - } - } - 120{ - start:intvector{ - -5453, - -398302208, - } - } - 121{ - start:intvector{ - -5444, - -86607872, - } - } - 122{ - start:intvector{ - -5421, - -1757255680, - } - } - 123{ - start:intvector{ - -5413, - 837173248, - } - } - 124{ - start:intvector{ - -5402, - -1540834304, - } - } - 125{ - start:intvector{ - -5395, - 164561920, - } - } - 126{ - start:intvector{ - -5372, - 1690714112, - } - } - 127{ - start:intvector{ - -5371, - -332820480, - } - } - 128{ - start:intvector{ - -5360, - 2077506560, - } - } - 129{ - start:intvector{ - -5341, - -1309839360, - } - } - 13{ - start:intvector{ - -8908, - 1130272768, - } - } - 130{ - start:intvector{ - -5311, - 539309056, - } - } - 131{ - start:intvector{ - -5296, - 828399616, - } - } - 132{ - start:intvector{ - -5241, - -1398568960, - } - } - 133{ - start:intvector{ - -5238, - -459470848, - } - } - 134{ - start:intvector{ - -5223, - -775180288, - } - } - 135{ - start:intvector{ - -5215, - -1957318656, - } - } - 136{ - start:intvector{ - -5209, - -683922432, - } - } - 137{ - start:intvector{ - -5186, - 125997056, - } - } - 138{ - start:intvector{ - -5105, - -67721216, - } - } - 139{ - start:intvector{ - -5084, - -319634432, - } - } - 14{ - start:intvector{ - -8854, - -1899328512, - } - } - 140{ - start:intvector{ - -5009, - -1811781632, - } - } - 141{ - start:intvector{ - -4969, - 1324493824, - } - } - 142{ - start:intvector{ - -4928, - 1400434688, - } - } - 143{ - start:intvector{ - -4902, - -1725282304, - } - } - 144{ - start:intvector{ - -4897, - -995318784, - } - } - 145{ - start:intvector{ - -4872, - 1938266112, - } - } - 146{ - start:intvector{ - -4859, - -735276032, - } - } - 147{ - start:intvector{ - -4840, - -1901254656, - } - } - 148{ - start:intvector{ - -4833, - 581741568, - } - } - 149{ - start:intvector{ - -4798, - -158681088, - } - } - 15{ - start:intvector{ - -8835, - -1337307136, - } - } - 150{ - start:intvector{ - -4781, - 1451442176, - } - } - 151{ - start:intvector{ - -4768, - -1049299968, - } - } - 152{ - start:intvector{ - -4740, - -1644384256, - } - } - 153{ - start:intvector{ - -4730, - -1134857216, - } - } - 154{ - start:intvector{ - -4705, - 1280327680, - } - } - 155{ - start:intvector{ - -4691, - -1800181760, - } - } - 156{ - start:intvector{ - -4673, - -1003993088, - } - } - 157{ - start:intvector{ - -4657, - 321897472, - } - } - 158{ - start:intvector{ - -4627, - -1494088704, - } - } - 159{ - start:intvector{ - -4578, - 1003481088, - } - } - 16{ - start:intvector{ - -8812, - -1452754944, - } - } - 160{ - start:intvector{ - -4405, - -775228416, - } - } - 161{ - start:intvector{ - -4392, - 993964032, - } - } - 162{ - start:intvector{ - -4369, - 1656116224, - } - } - 163{ - start:intvector{ - -4341, - 1925031936, - } - } - 164{ - start:intvector{ - -4327, - 1497889792, - } - } - 165{ - start:intvector{ - -4304, - -234125312, - } - } - 166{ - start:intvector{ - -4305, - -1209558016, - } - } - 167{ - start:intvector{ - -4279, - 1403459584, - } - } - 168{ - start:intvector{ - -4268, - 469219328, - } - } - 169{ - start:intvector{ - -4260, - 1533480960, - } - } - 17{ - start:intvector{ - -8737, - -7302144, - } - } - 170{ - start:intvector{ - -4229, - -948672512, - } - } - 171{ - start:intvector{ - -3980, - 939438080, - } - } - 172{ - start:intvector{ - -3970, - 844165120, - } - } - 173{ - start:intvector{ - -3886, - 1478112256, - } - } - 174{ - start:intvector{ - -3864, - 560031744, - } - } - 175{ - start:intvector{ - -3824, - 1561339904, - } - } - 176{ - start:intvector{ - -3802, - 1507259392, - } - } - 177{ - start:intvector{ - -3780, - 1625978880, - } - } - 178{ - start:intvector{ - -3764, - 1680902144, - } - } - 179{ - start:intvector{ - -3740, - 553687040, - } - } - 18{ - start:intvector{ - -8725, - -138909696, - } - } - 180{ - start:intvector{ - -3702, - 1072929792, - } - } - 181{ - start:intvector{ - -3695, - -1491608576, - } - } - 182{ - start:intvector{ - -3679, - 2080681984, - } - } - 183{ - start:intvector{ - -3545, - -1797502976, - } - } - 184{ - start:intvector{ - -3530, - -1076412416, - } - } - 185{ - start:intvector{ - -3508, - 572474368, - } - } - 186{ - start:intvector{ - -3445, - 1890334720, - } - } - 187{ - start:intvector{ - -3423, - 2095454208, - } - } - 188{ - start:intvector{ - -3295, - -377726976, - } - } - 189{ - start:intvector{ - -3243, - 1244540928, - } - } - 19{ - start:intvector{ - -8550, - 1883980800, - } - } - 190{ - start:intvector{ - -3214, - 1020089344, - } - } - 191{ - start:intvector{ - -3044, - -228918272, - } - } - 192{ - start:intvector{ - -3026, - 974237696, - } - } - 193{ - start:intvector{ - -2937, - 2078948352, - } - } - 194{ - start:intvector{ - -2913, - 1988533248, - } - } - 195{ - start:intvector{ - -2771, - -1948590080, - } - } - 196{ - start:intvector{ - -2742, - 393925632, - } - } - 197{ - start:intvector{ - -2605, - -1940361216, - } - } - 198{ - start:intvector{ - -2542, - -17700864, - } - } - 199{ - start:intvector{ - -2389, - -939697152, - } - } - 2{ - start:intvector{ - -9537, - 418301952, - } - } - 20{ - start:intvector{ - -8518, - 1389027328, - } - } - 200{ - start:intvector{ - -2365, - 154455040, - } - } - 201{ - start:intvector{ - -2332, - -981633024, - } - } - 202{ - start:intvector{ - -2313, - -1629211648, - } - } - 203{ - start:intvector{ - -2289, - -1287626752, - } - } - 204{ - start:intvector{ - -2269, - -182172672, - } - } - 205{ - start:intvector{ - -2177, - 540603392, - } - } - 206{ - start:intvector{ - -2118, - 289532928, - } - } - 207{ - start:intvector{ - -2101, - -1419878400, - } - } - 208{ - start:intvector{ - -2067, - -2037566464, - } - } - 209{ - start:intvector{ - -1953, - 99929088, - } - } - 21{ - start:intvector{ - -8420, - 40632320, - } - } - 210{ - start:intvector{ - -1901, - 1315229696, - } - } - 211{ - start:intvector{ - -1863, - 970472448, - } - } - 212{ - start:intvector{ - -1717, - 305247232, - } - } - 213{ - start:intvector{ - -1682, - -1731175424, - } - } - 214{ - start:intvector{ - -1660, - -2130855936, - } - } - 215{ - start:intvector{ - -1628, - -1070609408, - } - } - 216{ - start:intvector{ - -1604, - -297024512, - } - } - 217{ - start:intvector{ - -1511, - -2116183040, - } - } - 218{ - start:intvector{ - -1449, - -1514555392, - } - } - 219{ - start:intvector{ - -1387, - 790039552, - } - } - 22{ - start:intvector{ - -8347, - 1954419712, - } - } - 220{ - start:intvector{ - -1330, - -1646063616, - } - } - 221{ - start:intvector{ - -1242, - -47985664, - } - } - 222{ - start:intvector{ - -1219, - 589133824, - } - } - 223{ - start:intvector{ - -1115, - 1810135040, - } - } - 224{ - start:intvector{ - -1022, - 1114176512, - } - } - 225{ - start:intvector{ - -920, - -109054976, - } - } - 226{ - start:intvector{ - -896, - -977070080, - } - } - 227{ - start:intvector{ - -846, - 1459132416, - } - } - 228{ - start:intvector{ - -807, - 1398607872, - } - } - 229{ - start:intvector{ - -800, - 537036800, - } - } - 23{ - start:intvector{ - -8241, - -1847080960, - } - } - 230{ - start:intvector{ - -778, - 742156288, - } - } - 231{ - start:intvector{ - -770, - 1979217920, - } - } - 232{ - start:intvector{ - -745, - -1689931776, - } - } - 233{ - start:intvector{ - -422, - 322598912, - } - } - 234{ - start:intvector{ - -317, - -393534464, - } - } - 235{ - start:intvector{ - 139, - -1074621440, - } - } - 24{ - start:intvector{ - -8220, - -1407794176, - } - } - 25{ - start:intvector{ - -8193, - 279856128, - } - } - 26{ - start:intvector{ - -8177, - 1889979392, - } - } - 27{ - start:intvector{ - -8161, - 821702656, - } - } - 28{ - start:intvector{ - -8029, - 2052419584, - } - } - 29{ - start:intvector{ - -7971, - 739516416, - } - } - 3{ - start:intvector{ - -9431, - -13598720, - } - } - 30{ - start:intvector{ - -7941, - -558069760, - } - } - 31{ - start:intvector{ - -7875, - -115511296, - } - } - 32{ - start:intvector{ - -7851, - -1588326400, - } - } - 33{ - start:intvector{ - -7691, - 1527873536, - } - } - 34{ - start:intvector{ - -7632, - 1881603072, - } - } - 35{ - start:intvector{ - -7580, - 1714503680, - } - } - 36{ - start:intvector{ - -7515, - -348537856, - } - } - 37{ - start:intvector{ - -7437, - 801380352, - } - } - 38{ - start:intvector{ - -7413, - 2093365248, - } - } - 39{ - start:intvector{ - -7388, - 1855182848, - } - } - 4{ - start:intvector{ - -9323, - -938866688, - } - } - 40{ - start:intvector{ - -7358, - -2120803328, - } - } - 41{ - start:intvector{ - -7346, - 1524156416, - } - } - 42{ - start:intvector{ - -7319, - -712527872, - } - } - 43{ - start:intvector{ - -7300, - -1446506496, - } - } - 44{ - start:intvector{ - -7282, - 620649472, - } - } - 45{ - start:intvector{ - -7250, - 1248896000, - } - } - 46{ - start:intvector{ - -7235, - 1019586560, - } - } - 47{ - start:intvector{ - -7221, - 2061244416, - } - } - 48{ - start:intvector{ - -7204, - -1289766912, - } - } - 49{ - start:intvector{ - -7195, - -546072576, - } - } - 5{ - start:intvector{ - -9300, - -708714496, - } - } - 50{ - start:intvector{ - -7163, - 1785141248, - } - } - 51{ - start:intvector{ - -7134, - 5489664, - } - } - 52{ - start:intvector{ - -7094, - -1992169472, - } - } - 53{ - start:intvector{ - -7032, - 2126825472, - } - } - 54{ - start:intvector{ - -7000, - 1199872000, - } - } - 55{ - start:intvector{ - -6972, - 259187712, - } - } - 56{ - start:intvector{ - -6947, - 1489805312, - } - } - 57{ - start:intvector{ - -6918, - -92013568, - } - } - 58{ - start:intvector{ - -6853, - 818879488, - } - } - 59{ - start:intvector{ - -6827, - 1383329792, - } - } - 6{ - start:intvector{ - -9273, - -810431488, - } - } - 60{ - start:intvector{ - -6798, - -25689088, - } - } - 61{ - start:intvector{ - -6787, - 743037952, - } - } - 62{ - start:intvector{ - -6738, - -1115726848, - } - } - 63{ - start:intvector{ - -6696, - 429014016, - } - } - 64{ - start:intvector{ - -6646, - -22318080, - } - } - 65{ - start:intvector{ - -6618, - 653564928, - } - } - 66{ - start:intvector{ - -6579, - -1973926912, - } - } - 67{ - start:intvector{ - -6555, - 1366625280, - } - } - 68{ - start:intvector{ - -6531, - 325810176, - } - } - 69{ - start:intvector{ - -6509, - 185329664, - } - } - 7{ - start:intvector{ - -9217, - -186200064, - } - } - 70{ - start:intvector{ - -6486, - 1193081856, - } - } - 71{ - start:intvector{ - -6430, - -922454016, - } - } - 72{ - start:intvector{ - -6415, - -2015763456, - } - } - 73{ - start:intvector{ - -6408, - 1504032768, - } - } - 74{ - start:intvector{ - -6395, - 1397457920, - } - } - 75{ - start:intvector{ - -6362, - 236337152, - } - } - 76{ - start:intvector{ - -6347, - -313539584, - } - } - 77{ - start:intvector{ - -6330, - -147183616, - } - } - 78{ - start:intvector{ - -6315, - 980874240, - } - } - 79{ - start:intvector{ - -6293, - 1185993728, - } - } - 8{ - start:intvector{ - -9200, - 819123200, - } - } - 80{ - start:intvector{ - -6259, - -97861632, - } - } - 81{ - start:intvector{ - -6244, - -759171072, - } - } - 82{ - start:intvector{ - -6214, - 312377344, - } - } - 83{ - start:intvector{ - -6201, - 1415402496, - } - } - 84{ - start:intvector{ - -6164, - 872812544, - } - } - 85{ - start:intvector{ - -6153, - 2012172288, - } - } - 86{ - start:intvector{ - -6133, - 1562426368, - } - } - 87{ - start:intvector{ - -6088, - -223669248, - } - } - 88{ - start:intvector{ - -6082, - -764673024, - } - } - 89{ - start:intvector{ - -6068, - 943152128, - } - } - 9{ - start:intvector{ - -9155, - -621372416, - } - } - 90{ - start:intvector{ - -6058, - -1805488128, - } - } - 91{ - start:intvector{ - -6017, - 405420032, - } - } - 92{ - start:intvector{ - -5990, - -1399264256, - } - } - 93{ - start:intvector{ - -5979, - -1383104512, - } - } - 94{ - start:intvector{ - -5957, - -1869185024, - } - } - 95{ - start:intvector{ - -5952, - -448021504, - } - } - 96{ - start:intvector{ - -5939, - 111570944, - } - } - 97{ - start:intvector{ - -5928, - -2093636608, - } - } - 98{ - start:intvector{ - -5912, - -1779513344, - } - } - 99{ - start:intvector{ - -5903, - -1727019008, - } - } - } - system{"solar"} - } - persian{ - eras{ - 0{ - start:intvector{ - -9905, - -1165500416, - } - } - } - system{"solar"} - } - roc{ - eras{ - 0{ - end:intvector{ - -427, - -727931905, - } - } - 1{ - start:intvector{ - -427, - -727931904, - } - } - } - } - } - calendarPreferenceData{ - 001{ - "gregorian", - } - AE{ - "gregorian", - "islamic-umalqura", - "islamic", - "islamic-civil", - "islamic-tbla", - } - AF{ - "persian", - "gregorian", - "islamic", - "islamic-civil", - "islamic-tbla", - } - BH{ - "gregorian", - "islamic-umalqura", - "islamic", - "islamic-civil", - "islamic-tbla", - } - CN{ - "gregorian", - "chinese", - } - CX{ - "gregorian", - "chinese", - } - DJ{ - "gregorian", - "islamic", - "islamic-civil", - "islamic-tbla", - } - DZ{ - "gregorian", - "islamic", - "islamic-civil", - "islamic-tbla", - } - EG{ - "gregorian", - "coptic", - "islamic", - "islamic-civil", - "islamic-tbla", - } - EH{ - "gregorian", - "islamic", - "islamic-civil", - "islamic-tbla", - } - ER{ - "gregorian", - "islamic", - "islamic-civil", - "islamic-tbla", - } - ET{ - "gregorian", - "ethiopic", - } - HK{ - "gregorian", - "chinese", - } - IL{ - "gregorian", - "hebrew", - "islamic", - "islamic-civil", - "islamic-tbla", - } - IN{ - "gregorian", - "indian", - } - IQ{ - "gregorian", - "islamic", - "islamic-civil", - "islamic-tbla", - } - IR{ - "persian", - "gregorian", - "islamic", - "islamic-civil", - "islamic-tbla", - } - JO{ - "gregorian", - "islamic", - "islamic-civil", - "islamic-tbla", - } - JP{ - "gregorian", - "japanese", - } - KM{ - "gregorian", - "islamic", - "islamic-civil", - "islamic-tbla", - } - KR{ - "gregorian", - "dangi", - } - KW{ - "gregorian", - "islamic-umalqura", - "islamic", - "islamic-civil", - "islamic-tbla", - } - LB{ - "gregorian", - "islamic", - "islamic-civil", - "islamic-tbla", - } - LY{ - "gregorian", - "islamic", - "islamic-civil", - "islamic-tbla", - } - MA{ - "gregorian", - "islamic", - "islamic-civil", - "islamic-tbla", - } - MO{ - "gregorian", - "chinese", - } - MR{ - "gregorian", - "islamic", - "islamic-civil", - "islamic-tbla", - } - OM{ - "gregorian", - "islamic", - "islamic-civil", - "islamic-tbla", - } - PS{ - "gregorian", - "islamic", - "islamic-civil", - "islamic-tbla", - } - QA{ - "gregorian", - "islamic-umalqura", - "islamic", - "islamic-civil", - "islamic-tbla", - } - SA{ - "islamic-umalqura", - "gregorian", - "islamic", - "islamic-rgsa", - } - SD{ - "gregorian", - "islamic", - "islamic-civil", - "islamic-tbla", - } - SG{ - "gregorian", - "chinese", - } - SY{ - "gregorian", - "islamic", - "islamic-civil", - "islamic-tbla", - } - TD{ - "gregorian", - "islamic", - "islamic-civil", - "islamic-tbla", - } - TH{ - "buddhist", - "gregorian", - } - TN{ - "gregorian", - "islamic", - "islamic-civil", - "islamic-tbla", - } - TW{ - "gregorian", - "roc", - "chinese", - } - YE{ - "gregorian", - "islamic", - "islamic-civil", - "islamic-tbla", - } - } - cldrVersion{"30.0.3"} - codeMappings{ - { - "AA", - "958", - "AAA", - } - { - "AD", - "020", - "AND", - } - { - "AE", - "784", - "ARE", - } - { - "AF", - "004", - "AFG", - } - { - "AG", - "028", - "ATG", - } - { - "AI", - "660", - "AIA", - } - { - "AL", - "008", - "ALB", - } - { - "AM", - "051", - "ARM", - } - { - "AN", - "530", - "ANT", - } - { - "AO", - "024", - "AGO", - } - { - "AQ", - "010", - "ATA", - } - { - "AR", - "032", - "ARG", - } - { - "AS", - "016", - "ASM", - } - { - "AT", - "040", - "AUT", - } - { - "AU", - "036", - "AUS", - } - { - "AW", - "533", - "ABW", - } - { - "AX", - "248", - "ALA", - } - { - "AZ", - "031", - "AZE", - } - { - "BA", - "070", - "BIH", - } - { - "BB", - "052", - "BRB", - } - { - "BD", - "050", - "BGD", - } - { - "BE", - "056", - "BEL", - } - { - "BF", - "854", - "BFA", - } - { - "BG", - "100", - "BGR", - } - { - "BH", - "048", - "BHR", - } - { - "BI", - "108", - "BDI", - } - { - "BJ", - "204", - "BEN", - } - { - "BL", - "652", - "BLM", - } - { - "BM", - "060", - "BMU", - } - { - "BN", - "096", - "BRN", - } - { - "BO", - "068", - "BOL", - } - { - "BQ", - "535", - "BES", - } - { - "BR", - "076", - "BRA", - } - { - "BS", - "044", - "BHS", - } - { - "BT", - "064", - "BTN", - } - { - "BU", - "104", - "BUR", - } - { - "BV", - "074", - "BVT", - } - { - "BW", - "072", - "BWA", - } - { - "BY", - "112", - "BLR", - } - { - "BZ", - "084", - "BLZ", - } - { - "CA", - "124", - "CAN", - } - { - "CC", - "166", - "CCK", - } - { - "CD", - "180", - "COD", - } - { - "CF", - "140", - "CAF", - } - { - "CG", - "178", - "COG", - } - { - "CH", - "756", - "CHE", - } - { - "CI", - "384", - "CIV", - } - { - "CK", - "184", - "COK", - } - { - "CL", - "152", - "CHL", - } - { - "CM", - "120", - "CMR", - } - { - "CN", - "156", - "CHN", - } - { - "CO", - "170", - "COL", - } - { - "CR", - "188", - "CRI", - } - { - "CS", - "891", - "SCG", - } - { - "CU", - "192", - "CUB", - } - { - "CV", - "132", - "CPV", - } - { - "CW", - "531", - "CUW", - } - { - "CX", - "162", - "CXR", - } - { - "CY", - "196", - "CYP", - } - { - "CZ", - "203", - "CZE", - } - { - "DD", - "278", - "DDR", - } - { - "DE", - "276", - "DEU", - } - { - "DJ", - "262", - "DJI", - } - { - "DK", - "208", - "DNK", - } - { - "DM", - "212", - "DMA", - } - { - "DO", - "214", - "DOM", - } - { - "DZ", - "012", - "DZA", - } - { - "EC", - "218", - "ECU", - } - { - "EE", - "233", - "EST", - } - { - "EG", - "818", - "EGY", - } - { - "EH", - "732", - "ESH", - } - { - "ER", - "232", - "ERI", - } - { - "ES", - "724", - "ESP", - } - { - "ET", - "231", - "ETH", - } - { - "EU", - "967", - "QUU", - } - { - "FI", - "246", - "FIN", - } - { - "FJ", - "242", - "FJI", - } - { - "FK", - "238", - "FLK", - } - { - "FM", - "583", - "FSM", - } - { - "FO", - "234", - "FRO", - } - { - "FR", - "250", - "FRA", - } - { - "FX", - "249", - "FXX", - } - { - "GA", - "266", - "GAB", - } - { - "GB", - "826", - "GBR", - } - { - "GD", - "308", - "GRD", - } - { - "GE", - "268", - "GEO", - } - { - "GF", - "254", - "GUF", - } - { - "GG", - "831", - "GGY", - } - { - "GH", - "288", - "GHA", - } - { - "GI", - "292", - "GIB", - } - { - "GL", - "304", - "GRL", - } - { - "GM", - "270", - "GMB", - } - { - "GN", - "324", - "GIN", - } - { - "GP", - "312", - "GLP", - } - { - "GQ", - "226", - "GNQ", - } - { - "GR", - "300", - "GRC", - } - { - "GS", - "239", - "SGS", - } - { - "GT", - "320", - "GTM", - } - { - "GU", - "316", - "GUM", - } - { - "GW", - "624", - "GNB", - } - { - "GY", - "328", - "GUY", - } - { - "HK", - "344", - "HKG", - } - { - "HM", - "334", - "HMD", - } - { - "HN", - "340", - "HND", - } - { - "HR", - "191", - "HRV", - } - { - "HT", - "332", - "HTI", - } - { - "HU", - "348", - "HUN", - } - { - "ID", - "360", - "IDN", - } - { - "IE", - "372", - "IRL", - } - { - "IL", - "376", - "ISR", - } - { - "IM", - "833", - "IMN", - } - { - "IN", - "356", - "IND", - } - { - "IO", - "086", - "IOT", - } - { - "IQ", - "368", - "IRQ", - } - { - "IR", - "364", - "IRN", - } - { - "IS", - "352", - "ISL", - } - { - "IT", - "380", - "ITA", - } - { - "JE", - "832", - "JEY", - } - { - "JM", - "388", - "JAM", - } - { - "JO", - "400", - "JOR", - } - { - "JP", - "392", - "JPN", - } - { - "KE", - "404", - "KEN", - } - { - "KG", - "417", - "KGZ", - } - { - "KH", - "116", - "KHM", - } - { - "KI", - "296", - "KIR", - } - { - "KM", - "174", - "COM", - } - { - "KN", - "659", - "KNA", - } - { - "KP", - "408", - "PRK", - } - { - "KR", - "410", - "KOR", - } - { - "KW", - "414", - "KWT", - } - { - "KY", - "136", - "CYM", - } - { - "KZ", - "398", - "KAZ", - } - { - "LA", - "418", - "LAO", - } - { - "LB", - "422", - "LBN", - } - { - "LC", - "662", - "LCA", - } - { - "LI", - "438", - "LIE", - } - { - "LK", - "144", - "LKA", - } - { - "LR", - "430", - "LBR", - } - { - "LS", - "426", - "LSO", - } - { - "LT", - "440", - "LTU", - } - { - "LU", - "442", - "LUX", - } - { - "LV", - "428", - "LVA", - } - { - "LY", - "434", - "LBY", - } - { - "MA", - "504", - "MAR", - } - { - "MC", - "492", - "MCO", - } - { - "MD", - "498", - "MDA", - } - { - "ME", - "499", - "MNE", - } - { - "MF", - "663", - "MAF", - } - { - "MG", - "450", - "MDG", - } - { - "MH", - "584", - "MHL", - } - { - "MK", - "807", - "MKD", - } - { - "ML", - "466", - "MLI", - } - { - "MM", - "104", - "MMR", - } - { - "MN", - "496", - "MNG", - } - { - "MO", - "446", - "MAC", - } - { - "MP", - "580", - "MNP", - } - { - "MQ", - "474", - "MTQ", - } - { - "MR", - "478", - "MRT", - } - { - "MS", - "500", - "MSR", - } - { - "MT", - "470", - "MLT", - } - { - "MU", - "480", - "MUS", - } - { - "MV", - "462", - "MDV", - } - { - "MW", - "454", - "MWI", - } - { - "MX", - "484", - "MEX", - } - { - "MY", - "458", - "MYS", - } - { - "MZ", - "508", - "MOZ", - } - { - "NA", - "516", - "NAM", - } - { - "NC", - "540", - "NCL", - } - { - "NE", - "562", - "NER", - } - { - "NF", - "574", - "NFK", - } - { - "NG", - "566", - "NGA", - } - { - "NI", - "558", - "NIC", - } - { - "NL", - "528", - "NLD", - } - { - "NO", - "578", - "NOR", - } - { - "NP", - "524", - "NPL", - } - { - "NR", - "520", - "NRU", - } - { - "NT", - "536", - "NTZ", - } - { - "NU", - "570", - "NIU", - } - { - "NZ", - "554", - "NZL", - } - { - "OM", - "512", - "OMN", - } - { - "PA", - "591", - "PAN", - } - { - "PE", - "604", - "PER", - } - { - "PF", - "258", - "PYF", - } - { - "PG", - "598", - "PNG", - } - { - "PH", - "608", - "PHL", - } - { - "PK", - "586", - "PAK", - } - { - "PL", - "616", - "POL", - } - { - "PM", - "666", - "SPM", - } - { - "PN", - "612", - "PCN", - } - { - "PR", - "630", - "PRI", - } - { - "PS", - "275", - "PSE", - } - { - "PT", - "620", - "PRT", - } - { - "PW", - "585", - "PLW", - } - { - "PY", - "600", - "PRY", - } - { - "QA", - "634", - "QAT", - } - { - "QM", - "959", - "QMM", - } - { - "QN", - "960", - "QNN", - } - { - "QO", - "961", - "QOO", - } - { - "QP", - "962", - "QPP", - } - { - "QQ", - "963", - "QQQ", - } - { - "QR", - "964", - "QRR", - } - { - "QS", - "965", - "QSS", - } - { - "QT", - "966", - "QTT", - } - { - "QU", - "967", - "QUU", - } - { - "QV", - "968", - "QVV", - } - { - "QW", - "969", - "QWW", - } - { - "QX", - "970", - "QXX", - } - { - "QY", - "971", - "QYY", - } - { - "QZ", - "972", - "QZZ", - } - { - "RE", - "638", - "REU", - } - { - "RO", - "642", - "ROU", - } - { - "RS", - "688", - "SRB", - } - { - "RU", - "643", - "RUS", - } - { - "RW", - "646", - "RWA", - } - { - "SA", - "682", - "SAU", - } - { - "SB", - "090", - "SLB", - } - { - "SC", - "690", - "SYC", - } - { - "SD", - "729", - "SDN", - } - { - "SE", - "752", - "SWE", - } - { - "SG", - "702", - "SGP", - } - { - "SH", - "654", - "SHN", - } - { - "SI", - "705", - "SVN", - } - { - "SJ", - "744", - "SJM", - } - { - "SK", - "703", - "SVK", - } - { - "SL", - "694", - "SLE", - } - { - "SM", - "674", - "SMR", - } - { - "SN", - "686", - "SEN", - } - { - "SO", - "706", - "SOM", - } - { - "SR", - "740", - "SUR", - } - { - "SS", - "728", - "SSD", - } - { - "ST", - "678", - "STP", - } - { - "SU", - "810", - "SUN", - } - { - "SV", - "222", - "SLV", - } - { - "SX", - "534", - "SXM", - } - { - "SY", - "760", - "SYR", - } - { - "SZ", - "748", - "SWZ", - } - { - "TC", - "796", - "TCA", - } - { - "TD", - "148", - "TCD", - } - { - "TF", - "260", - "ATF", - } - { - "TG", - "768", - "TGO", - } - { - "TH", - "764", - "THA", - } - { - "TJ", - "762", - "TJK", - } - { - "TK", - "772", - "TKL", - } - { - "TL", - "626", - "TLS", - } - { - "TM", - "795", - "TKM", - } - { - "TN", - "788", - "TUN", - } - { - "TO", - "776", - "TON", - } - { - "TP", - "626", - "TMP", - } - { - "TR", - "792", - "TUR", - } - { - "TT", - "780", - "TTO", - } - { - "TV", - "798", - "TUV", - } - { - "TW", - "158", - "TWN", - } - { - "TZ", - "834", - "TZA", - } - { - "UA", - "804", - "UKR", - } - { - "UG", - "800", - "UGA", - } - { - "UM", - "581", - "UMI", - } - { - "US", - "840", - "USA", - } - { - "UY", - "858", - "URY", - } - { - "UZ", - "860", - "UZB", - } - { - "VA", - "336", - "VAT", - } - { - "VC", - "670", - "VCT", - } - { - "VE", - "862", - "VEN", - } - { - "VG", - "092", - "VGB", - } - { - "VI", - "850", - "VIR", - } - { - "VN", - "704", - "VNM", - } - { - "VU", - "548", - "VUT", - } - { - "WF", - "876", - "WLF", - } - { - "WS", - "882", - "WSM", - } - { - "XA", - "973", - "XAA", - } - { - "XB", - "974", - "XBB", - } - { - "XC", - "975", - "XCC", - } - { - "XD", - "976", - "XDD", - } - { - "XE", - "977", - "XEE", - } - { - "XF", - "978", - "XFF", - } - { - "XG", - "979", - "XGG", - } - { - "XH", - "980", - "XHH", - } - { - "XI", - "981", - "XII", - } - { - "XJ", - "982", - "XJJ", - } - { - "XK", - "983", - "XKK", - } - { - "XL", - "984", - "XLL", - } - { - "XM", - "985", - "XMM", - } - { - "XN", - "986", - "XNN", - } - { - "XO", - "987", - "XOO", - } - { - "XP", - "988", - "XPP", - } - { - "XQ", - "989", - "XQQ", - } - { - "XR", - "990", - "XRR", - } - { - "XS", - "991", - "XSS", - } - { - "XT", - "992", - "XTT", - } - { - "XU", - "993", - "XUU", - } - { - "XV", - "994", - "XVV", - } - { - "XW", - "995", - "XWW", - } - { - "XX", - "996", - "XXX", - } - { - "XY", - "997", - "XYY", - } - { - "XZ", - "998", - "XZZ", - } - { - "YD", - "720", - "YMD", - } - { - "YE", - "887", - "YEM", - } - { - "YT", - "175", - "MYT", - } - { - "YU", - "891", - "YUG", - } - { - "ZA", - "710", - "ZAF", - } - { - "ZM", - "894", - "ZMB", - } - { - "ZR", - "180", - "ZAR", - } - { - "ZW", - "716", - "ZWE", - } - { - "ZZ", - "999", - "ZZZ", - } - } - codeMappingsCurrency{ - { - "AED", - "784", - } - { - "AFN", - "971", - } - { - "ALL", - "8", - } - { - "AMD", - "51", - } - { - "ANG", - "532", - } - { - "AOA", - "973", - } - { - "ARS", - "32", - } - { - "AUD", - "36", - } - { - "AWG", - "533", - } - { - "AZN", - "944", - } - { - "BAM", - "977", - } - { - "BBD", - "52", - } - { - "BDT", - "50", - } - { - "BGN", - "975", - } - { - "BHD", - "48", - } - { - "BIF", - "108", - } - { - "BMD", - "60", - } - { - "BND", - "96", - } - { - "BOB", - "68", - } - { - "BOV", - "984", - } - { - "BRL", - "986", - } - { - "BSD", - "44", - } - { - "BTN", - "64", - } - { - "BWP", - "72", - } - { - "BYR", - "974", - } - { - "BZD", - "84", - } - { - "CAD", - "124", - } - { - "CDF", - "976", - } - { - "CHE", - "947", - } - { - "CHF", - "756", - } - { - "CHW", - "948", - } - { - "CLF", - "990", - } - { - "CLP", - "152", - } - { - "CNY", - "156", - } - { - "COP", - "170", - } - { - "COU", - "970", - } - { - "CRC", - "188", - } - { - "CUC", - "931", - } - { - "CUP", - "192", - } - { - "CVE", - "132", - } - { - "CZK", - "203", - } - { - "DJF", - "262", - } - { - "DKK", - "208", - } - { - "DOP", - "214", - } - { - "DZD", - "12", - } - { - "EGP", - "818", - } - { - "ERN", - "232", - } - { - "ETB", - "230", - } - { - "EUR", - "978", - } - { - "FJD", - "242", - } - { - "FKP", - "238", - } - { - "GBP", - "826", - } - { - "GEL", - "981", - } - { - "GHS", - "936", - } - { - "GIP", - "292", - } - { - "GMD", - "270", - } - { - "GNF", - "324", - } - { - "GTQ", - "320", - } - { - "GYD", - "328", - } - { - "HKD", - "344", - } - { - "HNL", - "340", - } - { - "HRK", - "191", - } - { - "HTG", - "332", - } - { - "HUF", - "348", - } - { - "IDR", - "360", - } - { - "ILS", - "376", - } - { - "INR", - "356", - } - { - "IQD", - "368", - } - { - "IRR", - "364", - } - { - "ISK", - "352", - } - { - "JMD", - "388", - } - { - "JOD", - "400", - } - { - "JPY", - "392", - } - { - "KES", - "404", - } - { - "KGS", - "417", - } - { - "KHR", - "116", - } - { - "KMF", - "174", - } - { - "KPW", - "408", - } - { - "KRW", - "410", - } - { - "KWD", - "414", - } - { - "KYD", - "136", - } - { - "KZT", - "398", - } - { - "LAK", - "418", - } - { - "LBP", - "422", - } - { - "LKR", - "144", - } - { - "LRD", - "430", - } - { - "LSL", - "426", - } - { - "LTL", - "440", - } - { - "LYD", - "434", - } - { - "MAD", - "504", - } - { - "MDL", - "498", - } - { - "MGA", - "969", - } - { - "MKD", - "807", - } - { - "MMK", - "104", - } - { - "MNT", - "496", - } - { - "MOP", - "446", - } - { - "MRO", - "478", - } - { - "MUR", - "480", - } - { - "MVR", - "462", - } - { - "MWK", - "454", - } - { - "MXN", - "484", - } - { - "MXV", - "979", - } - { - "MYR", - "458", - } - { - "MZN", - "943", - } - { - "NAD", - "516", - } - { - "NGN", - "566", - } - { - "NIO", - "558", - } - { - "NOK", - "578", - } - { - "NPR", - "524", - } - { - "NZD", - "554", - } - { - "OMR", - "512", - } - { - "PAB", - "590", - } - { - "PEN", - "604", - } - { - "PGK", - "598", - } - { - "PHP", - "608", - } - { - "PKR", - "586", - } - { - "PLN", - "985", - } - { - "PYG", - "600", - } - { - "QAR", - "634", - } - { - "RON", - "946", - } - { - "RSD", - "941", - } - { - "RUB", - "643", - } - { - "RWF", - "646", - } - { - "SAR", - "682", - } - { - "SBD", - "90", - } - { - "SCR", - "690", - } - { - "SDG", - "938", - } - { - "SEK", - "752", - } - { - "SGD", - "702", - } - { - "SHP", - "654", - } - { - "SLL", - "694", - } - { - "SOS", - "706", - } - { - "SRD", - "968", - } - { - "SSP", - "728", - } - { - "STD", - "678", - } - { - "SYP", - "760", - } - { - "SZL", - "748", - } - { - "THB", - "764", - } - { - "TJS", - "972", - } - { - "TMT", - "934", - } - { - "TND", - "788", - } - { - "TOP", - "776", - } - { - "TRY", - "949", - } - { - "TTD", - "780", - } - { - "TWD", - "901", - } - { - "TZS", - "834", - } - { - "UAH", - "980", - } - { - "UGX", - "800", - } - { - "USD", - "840", - } - { - "USN", - "997", - } - { - "UYI", - "940", - } - { - "UYU", - "858", - } - { - "UZS", - "860", - } - { - "VEF", - "937", - } - { - "VND", - "704", - } - { - "VUV", - "548", - } - { - "WST", - "882", - } - { - "XAF", - "950", - } - { - "XAG", - "961", - } - { - "XAU", - "959", - } - { - "XBA", - "955", - } - { - "XBB", - "956", - } - { - "XBC", - "957", - } - { - "XBD", - "958", - } - { - "XCD", - "951", - } - { - "XDR", - "960", - } - { - "XOF", - "952", - } - { - "XPD", - "964", - } - { - "XPF", - "953", - } - { - "XPT", - "962", - } - { - "XSU", - "994", - } - { - "XTS", - "963", - } - { - "XUA", - "965", - } - { - "XXX", - "999", - } - { - "YER", - "886", - } - { - "ZAR", - "710", - } - { - "ZMW", - "967", - } - } - idValidity{ - currency{ - deprecated{ - "ADP", - "AFA", - "ALK", - "AOK", - "AON", - "AOR", - "ARA", - "ARL~M", - "ARP", - "ATS", - "AZM", - "BAD", - "BAN", - "BEC", - "BEF", - "BEL", - "BGL~M", - "BGO", - "BOL", - "BOP", - "BOV", - "BRB~C", - "BRE", - "BRN", - "BRR", - "BRZ", - "BUK", - "BYB", - "CHE", - "CHW", - "CLE~F", - "CNX", - "COU", - "CSD", - "CSK", - "CYP", - "DDM", - "DEM", - "ECS", - "ECV", - "EEK", - "ESA~B", - "ESP", - "FIM", - "FRF", - "GEK", - "GHC", - "GNS", - "GQE", - "GRD", - "GWE", - "GWP", - "HRD", - "IEP", - "ILP", - "ILR", - "ISJ", - "ITL", - "KRH", - "KRO", - "LTL", - "LTT", - "LUC", - "LUF", - "LUL", - "LVL", - "LVR", - "MAF", - "MCF", - "MDC", - "MGF", - "MKN", - "MLF", - "MTL", - "MTP", - "MXP", - "MXV", - "MZE", - "MZM", - "NIC", - "NLG", - "PEI", - "PES", - "PLZ", - "PTE", - "RHD", - "ROL", - "RUR", - "SDD", - "SDP", - "SIT", - "SKK", - "SRG", - "SUR", - "SVC", - "TJR", - "TMM", - "TPE", - "TRL", - "UAK", - "UGS", - "USN", - "USS", - "UYI", - "UYP", - "VEB", - "VNN", - "XAG", - "XAU", - "XBA~D", - "XDR", - "XEU", - "XFO", - "XFU", - "XPD", - "XPT", - "XRE", - "XSU", - "XTS", - "XUA", - "YDD", - "YUD", - "YUM~N", - "YUR", - "ZAL", - "ZMK", - "ZRN", - "ZRZ", - "ZWD", - "ZWL", - "ZWR", - } - regular{ - "AED", - "AFN", - "ALL", - "AMD", - "ANG", - "AOA", - "ARS", - "AUD", - "AWG", - "AZN", - "BAM", - "BBD", - "BDT", - "BGN", - "BHD", - "BIF", - "BMD", - "BND", - "BOB", - "BRL", - "BSD", - "BTN", - "BWP", - "BYN", - "BYR", - "BZD", - "CAD", - "CDF", - "CHF", - "CLP", - "CNY", - "COP", - "CRC", - "CUC", - "CUP", - "CVE", - "CZK", - "DJF", - "DKK", - "DOP", - "DZD", - "EGP", - "ERN", - "ETB", - "EUR", - "FJD", - "FKP", - "GBP", - "GEL", - "GHS", - "GIP", - "GMD", - "GNF", - "GTQ", - "GYD", - "HKD", - "HNL", - "HRK", - "HTG", - "HUF", - "IDR", - "ILS", - "INR", - "IQD", - "IRR", - "ISK", - "JMD", - "JOD", - "JPY", - "KES", - "KGS", - "KHR", - "KMF", - "KPW", - "KRW", - "KWD", - "KYD", - "KZT", - "LAK", - "LBP", - "LKR", - "LRD", - "LSL", - "LYD", - "MAD", - "MDL", - "MGA", - "MKD", - "MMK", - "MNT", - "MOP", - "MRO", - "MUR", - "MVR", - "MWK", - "MXN", - "MYR", - "MZN", - "NAD", - "NGN", - "NIO", - "NOK", - "NPR", - "NZD", - "OMR", - "PAB", - "PEN", - "PGK", - "PHP", - "PKR", - "PLN", - "PYG", - "QAR", - "RON", - "RSD", - "RUB", - "RWF", - "SAR", - "SBD", - "SCR", - "SDG", - "SEK", - "SGD", - "SHP", - "SLL", - "SOS", - "SRD", - "SSP", - "STD", - "SYP", - "SZL", - "THB", - "TJS", - "TMT", - "TND", - "TOP", - "TRY", - "TTD", - "TWD", - "TZS", - "UAH", - "UGX", - "USD", - "UYU", - "UZS", - "VEF", - "VND", - "VUV", - "WST", - "XAF", - "XCD", - "XOF", - "XPF", - "YER", - "ZAR", - "ZMW", - } - unknown{"XXX"} - } - language{ - deprecated{ - "aju", - "als", - "arb", - "ayr", - "azj", - "bcc", - "bcl", - "bh", - "bxk", - "bxr", - "cld", - "cmn", - "cwd", - "dgo", - "dhd", - "dik", - "diq", - "ekk", - "emk", - "esk", - "fat", - "fuc", - "gaz", - "gbo", - "gno", - "gug", - "gya", - "hdn", - "hea", - "him", - "ike", - "in", - "iw", - "ji", - "jw", - "khk", - "kmr", - "knc", - "kng", - "knn", - "kpv", - "lbk", - "lvs", - "mhr", - "mnk", - "mo", - "mup", - "no", - "npi", - "ojg", - "ory", - "pbu", - "pes", - "plt", - "pnb", - "prs", - "quz", - "rmy", - "sh", - "spy", - "src", - "swc", - "swh", - "tl", - "ttq", - "tw", - "umu", - "uzn", - "xpe", - "xsl", - "ydd", - "zai", - "zsm", - "zyb", - } - private_use{ - "qaa~z", - "qba~z", - "qca~z", - "qda~z", - "qea~z", - "qfa~z", - "qga~z", - "qha~z", - "qia~z", - "qja~z", - "qka~z", - "qla~z", - "qma~z", - "qna~z", - "qoa~z", - "qpa~z", - "qqa~z", - "qra~z", - "qsa~z", - "qta~z", - } - regular{ - "aa", - "aaa~i", - "aak~q", - "aas~x", - "aaz", - "ab", - "aba~j", - "abl~z", - "aca~b", - "acd~f", - "ach~i", - "ack~n", - "acp~z", - "ada~b", - "add~j", - "adl", - "adn~u", - "adw~z", - "ae", - "aea~e", - "aek~n", - "aeq~s", - "aeu", - "aew", - "aey~z", - "af", - "afa~b", - "afd~e", - "afg~i", - "afk", - "afn~p", - "afs~u", - "afz", - "aga~z", - "aha~b", - "ahg~i", - "ahk~p", - "ahr~t", - "aia~t", - "aiw~y", - "aja", - "ajg", - "aji", - "ajn", - "ajp", - "ajt", - "ajw", - "ajz", - "ak", - "akb~m", - "ako~z", - "ala", - "alc~r", - "alt~z", - "am", - "ama~c", - "ame~g", - "ami~z", - "an", - "ana~z", - "aoa~n", - "aor~u", - "aox", - "aoz", - "apa~z", - "aqa", - "aqc~d", - "aqg", - "aql~n", - "aqp", - "aqr", - "aqt", - "aqz", - "ar", - "arc~e", - "arh~l", - "arn~z", - "as", - "asa~l", - "asn~z", - "ata~e", - "atg~z", - "aua~u", - "auw~z", - "av", - "avb", - "avd", - "avi", - "avk~o", - "avs~v", - "awa~e", - "awg~i", - "awk", - "awm~o", - "awr~y", - "axb", - "axe", - "axg", - "axk~m", - "axx", - "ay", - "aya~e", - "ayg~i", - "ayk~l", - "ayn~q", - "ays~u", - "ayx~z", - "az", - "aza~d", - "azg", - "azm~o", - "azt", - "azz", - "ba", - "baa~j", - "bal", - "ban~p", - "bar~z", - "bba~z", - "bca~b", - "bcd~k", - "bcm~w", - "bcy~z", - "bda~z", - "be", - "bea~k", - "bem", - "beo~z", - "bfa~u", - "bfw~z", - "bg", - "bga~g", - "bgi~z", - "bha~z", - "bi", - "bia~g", - "bij~r", - "bit~z", - "bja~z", - "bka~d", - "bkf~z", - "bla~t", - "blv~z", - "bm", - "bma~z", - "bn", - "bna~g", - "bni~z", - "bo", - "boa~b", - "boe~r", - "bot~z", - "bpa~b", - "bpd", - "bpg~z", - "bqa~d", - "bqf~z", - "br", - "bra~d", - "brf~z", - "bs", - "bsa~c", - "bse~y", - "bta~z", - "bua~k", - "bum~q", - "bus~z", - "bva~r", - "bvt~z", - "bwa~u", - "bww~z", - "bxa~j", - "bxl~q", - "bxs", - "bxu~x", - "bxz", - "bya~t", - "byv~z", - "bza~z", - "ca", - "caa~s", - "cau~z", - "cba~e", - "cbg~l", - "cbn~o", - "cbq~w", - "cby", - "cca", - "ccc~e", - "ccg~h", - "ccj", - "ccl~s", - "cda", - "cdc~j", - "cdm~o", - "cdr~s", - "cdy~z", - "ce", - "cea~b", - "ceg", - "cek~l", - "cen", - "cet", - "cfa", - "cfd", - "cfg", - "cfm", - "cga", - "cgc", - "cgg", - "cgk", - "ch", - "chb~d", - "chf~h", - "chj~r", - "cht", - "chw~z", - "cia~e", - "cih", - "cik", - "cim~n", - "cip", - "cir", - "ciw", - "ciy", - "cja", - "cje", - "cjh~i", - "cjk", - "cjm~p", - "cjr~s", - "cjv", - "cjy", - "cka~b", - "ckh", - "ckl", - "ckn~o", - "ckq~v", - "ckx~z", - "cla", - "clc", - "cle", - "clh~m", - "clo", - "clt~u", - "clw", - "cly", - "cma", - "cmc", - "cme", - "cmg", - "cmi", - "cmk~m", - "cmo", - "cmr~t", - "cna~c", - "cng~i", - "cnk~l", - "cno", - "cns~u", - "cnw~x", - "co", - "coa~h", - "coj~q", - "cot~z", - "cpa~c", - "cpe~g", - "cpi", - "cpn~p", - "cps", - "cpu", - "cpx~y", - "cqd", - "cqu", - "cr", - "cra~d", - "crf~t", - "crv~z", - "cs", - "csa~o", - "csq~w", - "csy~z", - "cta", - "ctc~e", - "ctg~h", - "ctl~p", - "cts~u", - "ctz", - "cu", - "cua~c", - "cug~m", - "cuo~x", - "cv", - "cvg", - "cvn", - "cwa~b", - "cwe", - "cwg", - "cwt", - "cy", - "cya~b", - "cyo", - "czh", - "czk", - "czn~o", - "czt", - "da", - "daa", - "dac~m", - "dao~s", - "dau~z", - "dba~b", - "dbd~g", - "dbi~j", - "dbl~r", - "dbt~w", - "dby", - "dcc", - "dcr", - "dda", - "ddd~e", - "ddg", - "ddi~j", - "ddn~o", - "ddr~s", - "ddw", - "de", - "dec~i", - "dek~n", - "dep~s", - "dev", - "dez", - "dga~e", - "dgg~i", - "dgk~l", - "dgn", - "dgr~u", - "dgw~x", - "dgz", - "dha", - "dhg", - "dhi", - "dhl~o", - "dhr~s", - "dhu~x", - "dia~d", - "dif~j", - "dil~p", - "dir~u", - "diw~z", - "dja~f", - "dji~o", - "djr", - "dju", - "djw", - "dka", - "dkk~l", - "dkr~s", - "dkx", - "dlg", - "dlk", - "dlm~n", - "dma~e", - "dmg", - "dmk~o", - "dmr~s", - "dmu~y", - "dna", - "dnd~e", - "dng", - "dni~k", - "dnn", - "dnr", - "dnt~w", - "dny", - "doa~c", - "doe~f", - "doh~i", - "dok~l", - "don~t", - "dov~z", - "dpp", - "dra~e", - "drg~i", - "drl", - "drn~o", - "drq~u", - "drw", - "dry", - "dsb", - "dse", - "dsh~i", - "dsl", - "dsn~o", - "dsq", - "dta~b", - "dtd", - "dth~i", - "dtk", - "dtm~p", - "dtr~u", - "dty", - "dua~s", - "duu~z", - "dv", - "dva", - "dwa", - "dwl", - "dwr~s", - "dwu", - "dww", - "dwy", - "dya~b", - "dyd", - "dyg", - "dyi", - "dym~o", - "dyu", - "dyy", - "dz", - "dza", - "dzd~e", - "dzg", - "dzl", - "dzn", - "eaa", - "ebg", - "ebk", - "ebo", - "ebr", - "ebu", - "ecr~s", - "ecy", - "ee", - "eee", - "efa", - "efe", - "efi", - "ega", - "egl", - "ego", - "egx~y", - "ehu", - "eip", - "eit", - "eiv", - "eja", - "eka", - "ekc", - "eke", - "ekg", - "eki", - "ekl~m", - "eko~p", - "ekr", - "eky", - "el", - "ele", - "elh~i", - "elk", - "elm", - "elo~p", - "elu", - "elx", - "ema~b", - "eme", - "emg", - "emi", - "emm~p", - "ems", - "emu", - "emw~y", - "en", - "ena~d", - "enf", - "enh", - "enl~o", - "enq~r", - "enu~x", - "eo", - "eot", - "epi", - "era", - "erg~i", - "erk", - "ero", - "err~t", - "erw", - "es", - "ese", - "esg~i", - "esl~o", - "esq", - "ess", - "esu", - "esx~y", - "et", - "etb~c", - "eth", - "etn~o", - "etr~u", - "etx", - "etz", - "eu", - "euq", - "eve", - "evh", - "evn", - "ewo", - "ext", - "eya", - "eyo", - "eza", - "eze", - "fa", - "faa~b", - "fad", - "faf~n", - "fap", - "far", - "fau", - "fax~z", - "fbl", - "fcs", - "fer", - "ff", - "ffi", - "ffm", - "fgr", - "fi", - "fia", - "fie", - "fil", - "fip", - "fir", - "fit~u", - "fiw", - "fj", - "fkk", - "fkv", - "fla", - "flh~i", - "fll", - "fln", - "flr", - "fly", - "fmp", - "fmu", - "fnb", - "fng", - "fni", - "fo", - "fod", - "foi", - "fom~n", - "for~s", - "fox", - "fpe", - "fqs", - "fr", - "frc~d", - "frk", - "frm", - "fro~t", - "fse", - "fsl", - "fss", - "fub", - "fud~f", - "fuh~j", - "fum~n", - "fuq~r", - "fut~v", - "fuy", - "fvr", - "fwa", - "fwe", - "fy", - "ga", - "gaa~y", - "gba~n", - "gbp~s", - "gbu~z", - "gcc~f", - "gcl", - "gcn", - "gcr", - "gct", - "gd", - "gda~o", - "gdq~u", - "gdx", - "gea~d", - "geg~m", - "geq", - "ges", - "gev~z", - "gfk", - "gft", - "gfx", - "gga~b", - "ggd~e", - "ggg", - "ggk~l", - "ggn~o", - "ggr", - "ggt~u", - "ggw", - "gha", - "ghc", - "ghe", - "ghh", - "ghk~l", - "ghn~o", - "ghr~t", - "gia~d", - "gig~h", - "gil~u", - "giw~z", - "gji", - "gjk", - "gjm~n", - "gjr", - "gju", - "gka", - "gke", - "gkn~p", - "gku", - "gl", - "glc~d", - "glh~l", - "glo", - "glr", - "glu", - "glw", - "gly", - "gma~b", - "gmd~e", - "gmg~h", - "gml~n", - "gmq", - "gmu~z", - "gn", - "gna~e", - "gng~i", - "gnk~n", - "gnq~r", - "gnt~u", - "gnw", - "gnz", - "goa~u", - "gow~z", - "gpa", - "gpe", - "gpn", - "gqa", - "gqi", - "gqn", - "gqr", - "gqu", - "gra~d", - "grg~k", - "grm", - "gro", - "grq~z", - "gse", - "gsg", - "gsl~p", - "gss", - "gsw", - "gta", - "gti", - "gtu", - "gu", - "gua~f", - "guh~i", - "guk~x", - "guz", - "gv", - "gva", - "gvc", - "gve~f", - "gvj", - "gvl~p", - "gvr~s", - "gvy", - "gwa~g", - "gwi~j", - "gwm~n", - "gwr", - "gwt~u", - "gww~x", - "gxx", - "gyb", - "gyd~g", - "gyi", - "gyl~n", - "gyr", - "gyy", - "gza", - "gzi", - "gzn", - "ha", - "haa~s", - "hav~z", - "hba~b", - "hbn~o", - "hbu", - "hca", - "hch", - "hds", - "hdy", - "he", - "hed", - "heg~i", - "hem", - "hgm", - "hgw", - "hhi", - "hhr", - "hhy", - "hi", - "hia~b", - "hid", - "hif~l", - "hio", - "hir", - "hit", - "hiw~x", - "hji", - "hka", - "hke", - "hkk", - "hks", - "hla~b", - "hld~e", - "hlt~u", - "hma~n", - "hmp~z", - "hna", - "hnd~e", - "hnh~j", - "hnn~o", - "hns", - "hnu", - "ho", - "hoa~e", - "hoh~m", - "hoo~p", - "hor~t", - "hov~w", - "hoy~z", - "hpo", - "hps", - "hr", - "hra", - "hrc", - "hre", - "hrk", - "hrm", - "hro~p", - "hrr", - "hrt~u", - "hrw~x", - "hrz", - "hsb", - "hsh", - "hsl", - "hsn", - "hss", - "ht", - "hti", - "hto", - "hts", - "htu", - "htx", - "hu", - "hub~m", - "huo~z", - "hvc", - "hve", - "hvk", - "hvn", - "hvv", - "hwa", - "hwc", - "hwo", - "hy", - "hya", - "hyx", - "hz", - "ia", - "iai", - "ian", - "iap", - "iar", - "iba~b", - "ibd~e", - "ibg", - "ibi", - "ibl~n", - "ibr", - "ibu", - "iby", - "ica", - "ich", - "icl", - "icr", - "id", - "ida~e", - "idi", - "idr~u", - "ie", - "ifa~b", - "ife~f", - "ifk", - "ifm", - "ifu", - "ify", - "ig", - "igb", - "ige", - "igg", - "igl~o", - "igs", - "igw", - "ihb", - "ihi", - "ihp", - "ihw", - "ii", - "iin", - "iir", - "ijc", - "ije", - "ijj", - "ijn~o", - "ijs", - "ik", - "iki", - "ikk~l", - "iko~p", - "ikr~t", - "ikv~x", - "ikz", - "ila~b", - "ilg", - "ili", - "ilk~m", - "ilo~p", - "ils", - "ilu~w", - "ima", - "ime", - "imi", - "iml", - "imn~o", - "imr~s", - "imy", - "inb~c", - "ine", - "ing~h", - "inj", - "inl~p", - "ins~t", - "inz", - "io", - "ior", - "iou", - "iow", - "ipi", - "ipo", - "iqu", - "iqw", - "ira", - "ire", - "irh~i", - "irk", - "irn~o", - "irr", - "iru", - "irx~y", - "is", - "isa", - "isc~e", - "isg~i", - "isk", - "ism~o", - "isr", - "ist~u", - "it", - "itb~e", - "iti", - "itk~m", - "ito", - "itr~t", - "itv~z", - "iu", - "ium", - "ivb", - "ivv", - "iwk", - "iwm", - "iwo", - "iws", - "ixc", - "ixl", - "iya", - "iyo", - "iyx", - "izh~i", - "izr", - "izz", - "ja", - "jaa~f", - "jah", - "jaj~o", - "jaq~u", - "jax~z", - "jbe", - "jbi~k", - "jbn~o", - "jbr", - "jbt~u", - "jbw", - "jcs~t", - "jda", - "jdg", - "jdt", - "jeb", - "jee", - "jeg~i", - "jek~l", - "jen", - "jer", - "jet~u", - "jgb", - "jge", - "jgk", - "jgo", - "jhi", - "jhs", - "jia~e", - "jig~i", - "jil~m", - "jio", - "jiq", - "jit~v", - "jiy", - "jje", - "jjr", - "jka", - "jkm", - "jko~p", - "jkr", - "jku", - "jle", - "jls", - "jma~d", - "jmi", - "jml", - "jmn", - "jmr~s", - "jmw~x", - "jna", - "jnd", - "jng", - "jni~j", - "jnl", - "jns", - "job", - "jod", - "jog", - "jor~s", - "jow", - "jpa", - "jpr", - "jpx", - "jqr", - "jra~b", - "jrr", - "jrt~u", - "jsl", - "jua~d", - "juh~i", - "juk~p", - "jur~u", - "juw", - "juy", - "jv", - "jvd", - "jvn", - "jwi", - "jya", - "jye", - "jyy", - "ka", - "kaa~k", - "kam", - "kao~r", - "kav~y", - "kba~z", - "kca~z", - "kda", - "kdc~r", - "kdt~z", - "kea~z", - "kfa~z", - "kg", - "kga~y", - "kha~j", - "khl", - "khn~z", - "ki", - "kia~j", - "kil~m", - "kio~q", - "kis~z", - "kj", - "kja~v", - "kjx~z", - "kk", - "kka~z", - "kl", - "kla~z", - "km", - "kma~q", - "kms~z", - "kn", - "kna~b", - "knd~f", - "kni~m", - "kno~z", - "ko", - "koa", - "koc~l", - "koo~q", - "kos~z", - "kpa~u", - "kpw~z", - "kqa~z", - "kr", - "kra~f", - "krh~p", - "krr~z", - "ks", - "ksa~z", - "kta~z", - "ku", - "kub~q", - "kus~z", - "kv", - "kva~z", - "kw", - "kwa~z", - "kxa~f", - "kxh~z", - "ky", - "kya~z", - "kza~z", - "la", - "laa~n", - "lap~s", - "lau", - "law~z", - "lb", - "lba~c", - "lbe~g", - "lbi~j", - "lbl~o", - "lbq~z", - "lcc~f", - "lch", - "lcl~m", - "lcp~q", - "lcs", - "lda~b", - "ldd", - "ldg~q", - "lea~z", - "lfa", - "lfn", - "lg", - "lga~b", - "lgg~i", - "lgk~n", - "lgq~r", - "lgt~u", - "lgz", - "lha", - "lhh~i", - "lhl~n", - "lhp", - "lhs~u", - "li", - "lia~l", - "lio~s", - "liu~z", - "lja", - "lje", - "lji", - "ljl", - "ljp", - "ljw~x", - "lka~e", - "lkh~j", - "lkl~o", - "lkr~u", - "lky", - "lla~q", - "lls", - "llu", - "llx", - "lma~r", - "lmu~z", - "ln", - "lna~b", - "lnd", - "lng~j", - "lnl~o", - "lns", - "lnu", - "lnw", - "lnz", - "lo", - "loa~c", - "loe~z", - "lpa", - "lpe", - "lpn~o", - "lpx", - "lra", - "lrc", - "lre", - "lrg", - "lri", - "lrk~o", - "lrr", - "lrt", - "lrv", - "lrz", - "lsa", - "lsd~e", - "lsg~i", - "lsl~m", - "lso~p", - "lsr~t", - "lsy", - "lt", - "ltc", - "ltg", - "lti", - "ltn~o", - "lts", - "ltu", - "lu", - "lua", - "luc~f", - "lui~w", - "luy~z", - "lv", - "lva", - "lvk", - "lvu", - "lwa", - "lwe", - "lwg~h", - "lwl~m", - "lwo", - "lwt~u", - "lww", - "lya", - "lyg", - "lyn", - "lzh", - "lzl", - "lzn", - "lzz", - "maa~b", - "mad~g", - "mai~k", - "mam~n", - "map~q", - "mas~x", - "maz", - "mba~f", - "mbh~z", - "mca~z", - "mda~n", - "mdp~z", - "mea~w", - "mey~z", - "mfa~z", - "mg", - "mga~z", - "mh", - "mha~q", - "mhs~u", - "mhw~z", - "mi", - "mia~r", - "mit~u", - "miw~z", - "mja~e", - "mjg~z", - "mk", - "mka~c", - "mke~z", - "ml", - "mla~f", - "mlh~s", - "mlu~x", - "mlz", - "mma~r", - "mmt~z", - "mn", - "mna~j", - "mnl~z", - "moa", - "moc~k", - "mom", - "moo~z", - "mpa~e", - "mpg~z", - "mqa~c", - "mqe~z", - "mr", - "mra~h", - "mrj~z", - "ms", - "msb~z", - "mt", - "mta~y", - "mua~e", - "mug~k", - "mum~o", - "muq~v", - "mux~z", - "mva~b", - "mvd~i", - "mvk~z", - "mwa~z", - "mxa~z", - "my", - "myb~z", - "mza~e", - "mzg~z", - "na", - "naa~t", - "naw~z", - "nb", - "nba~k", - "nbm~y", - "nca~p", - "ncr~u", - "ncx", - "ncz", - "nd", - "nda~d", - "ndf~n", - "ndp~z", - "ne", - "nea~k", - "nem~o", - "neq~z", - "nfa", - "nfd", - "nfl", - "nfr", - "nfu", - "ng", - "nga~z", - "nha~i", - "nhk", - "nhm~r", - "nht~z", - "nia~o", - "niq~z", - "nja~b", - "njd", - "njh~j", - "njl~o", - "njr~u", - "njx~z", - "nka~k", - "nkm~x", - "nkz", - "nl", - "nla", - "nlc", - "nle", - "nlg", - "nli~l", - "nln~o", - "nlq~r", - "nlu~z", - "nma~z", - "nn", - "nna~n", - "nnp~z", - "noa", - "noc~q", - "nos~w", - "noy~z", - "npa~b", - "npg~h", - "npl", - "npn~o", - "nps", - "npu", - "npy", - "nqg", - "nqk", - "nqm~o", - "nqq", - "nqy", - "nr", - "nra~c", - "nre~g", - "nri", - "nrk~n", - "nrp", - "nrr", - "nrt~u", - "nrx", - "nrz", - "nsa", - "nsc~i", - "nsk~z", - "ntd~e", - "ntg", - "nti~k", - "ntm", - "nto~p", - "ntr~s", - "ntu", - "ntw~z", - "nua~z", - "nv", - "nvh", - "nvm", - "nvo", - "nwa~c", - "nwe", - "nwg", - "nwi", - "nwm", - "nwo", - "nwr", - "nwx~y", - "nxa", - "nxd~e", - "nxg", - "nxi", - "nxk~o", - "nxq~r", - "nxu", - "nxx", - "ny", - "nyb~y", - "nza~b", - "nzi", - "nzk", - "nzm", - "nzs", - "nzu", - "nzy~z", - "oaa", - "oac", - "oar", - "oav", - "obi", - "obk~m", - "obo", - "obr", - "obt~u", - "oc", - "oca", - "och", - "oco", - "ocu", - "oda", - "odk", - "odt~u", - "ofo", - "ofs", - "ofu", - "ogb~c", - "oge", - "ogg", - "ogo", - "ogu", - "oht~u", - "oia", - "oin", - "oj", - "ojb~c", - "ojp", - "ojs", - "ojv~w", - "oka~b", - "okd~e", - "okg~o", - "okr~s", - "oku~v", - "okx", - "ola", - "old~e", - "olk", - "olm", - "olo", - "olr", - "olt~u", - "om", - "oma~c", - "ome", - "omg", - "omi", - "omk~l", - "omn~r", - "omt~x", - "ona~b", - "one", - "ong", - "oni~k", - "onn~p", - "onr~u", - "onw~x", - "ood", - "oog", - "oon", - "oor~s", - "opa", - "opk", - "opm", - "opo", - "opt", - "opy", - "or", - "ora", - "orc", - "ore", - "org~h", - "orn~o", - "orr~x", - "orz", - "os", - "osa", - "osc", - "osi", - "oso~p", - "ost~u", - "osx", - "ota~b", - "otd~e", - "oti", - "otk~o", - "otq~u", - "otw~z", - "oua~b", - "oue", - "oui", - "oum~n", - "ovd", - "owi", - "owl", - "oyb", - "oyd", - "oym", - "oyy", - "ozm", - "pa", - "paa~i", - "pak~m", - "pao~z", - "pbb~c", - "pbe~i", - "pbl", - "pbn~p", - "pbr~t", - "pbv", - "pby~z", - "pca~n", - "pcp", - "pcr", - "pcw", - "pda", - "pdc", - "pdi", - "pdn~o", - "pdt~u", - "pea~b", - "ped~m", - "peo~q", - "pev", - "pex~z", - "pfa", - "pfe", - "pfl", - "pga", - "pgd", - "pgg", - "pgi", - "pgk~l", - "pgn", - "pgs", - "pgu", - "pgy~z", - "pha", - "phd", - "phg~i", - "phk~o", - "phq~r", - "pht~w", - "pi", - "pia~j", - "pil~p", - "pir~z", - "pjt", - "pka~c", - "pkg~h", - "pkn~p", - "pkr~u", - "pl", - "pla~h", - "plj~l", - "pln~s", - "plu~w", - "ply~z", - "pma~f", - "pmh~o", - "pmq~u", - "pmw~z", - "pna", - "pnc", - "pne", - "png~z", - "poc~i", - "pok", - "pom~q", - "pos~t", - "pov~z", - "ppa", - "ppe", - "ppi", - "ppk~u", - "pqa", - "pqe", - "pqm", - "pqw", - "pra~i", - "prk~r", - "prt~u", - "prw~z", - "ps", - "psa", - "psc~e", - "psg~i", - "psl~u", - "psw", - "psy", - "pt", - "pta", - "pth~i", - "ptn~r", - "ptt~w", - "pty", - "pua~g", - "pui~k", - "pum", - "puo~r", - "put~u", - "puw~z", - "pwa~b", - "pwg", - "pwi", - "pwm~o", - "pwr", - "pww", - "pxm", - "pye", - "pym~n", - "pys", - "pyu", - "pyx~y", - "pzn", - "qu", - "qua~d", - "quf~i", - "quk~n", - "qup~s", - "quv~y", - "qva", - "qvc", - "qve", - "qvh~j", - "qvl~p", - "qvs", - "qvw", - "qvy~z", - "qwa", - "qwc", - "qwe", - "qwh", - "qwm", - "qws~t", - "qxa", - "qxc", - "qxh", - "qxl", - "qxn~u", - "qxw", - "qya", - "qyp", - "raa~d", - "raf~z", - "rbb", - "rbk~l", - "rbp", - "rcf", - "rdb", - "rea~b", - "ree", - "reg", - "rei~j", - "rel~n", - "rer~t", - "rey", - "rga", - "rge", - "rgk", - "rgn", - "rgr~s", - "rgu", - "rhg", - "rhp", - "ria", - "rie~f", - "ril~n", - "rir", - "rit~u", - "rjg", - "rji", - "rjs", - "rka~b", - "rkh~i", - "rkm", - "rkt", - "rkw", - "rm", - "rma~i", - "rmk~x", - "rmz", - "rn", - "rna", - "rnd", - "rng", - "rnl", - "rnn", - "rnp", - "rnr", - "rnw", - "ro", - "roa~g", - "rol~m", - "roo~p", - "ror", - "rou", - "row", - "rpn", - "rpt", - "rri", - "rro", - "rrt", - "rsb", - "rsi", - "rsl~m", - "rtc", - "rth", - "rtm", - "rts", - "rtw", - "ru", - "rub~c", - "rue~i", - "ruk", - "ruo~q", - "rut~u", - "ruy~z", - "rw", - "rwa", - "rwk", - "rwm", - "rwo", - "rwr", - "rxd", - "rxw", - "ryn", - "rys", - "ryu", - "rzh", - "sa", - "saa~f", - "sah~m", - "sao~z", - "sba~z", - "sc", - "sca~b", - "sce~i", - "sck~l", - "scn~q", - "scs", - "scu~x", - "sd", - "sda~c", - "sde~h", - "sdj~p", - "sdr~v", - "sdx", - "sdz", - "se", - "sea~w", - "sey~z", - "sfb", - "sfe", - "sfm", - "sfs", - "sfw", - "sg", - "sga~e", - "sgg~p", - "sgr~u", - "sgw~z", - "sha~e", - "shg~z", - "si", - "sia~b", - "sid~m", - "sio~z", - "sja~b", - "sjd~e", - "sjg", - "sjk~p", - "sjr~u", - "sjw", - "sk", - "ska~k", - "skm~z", - "sl", - "sla", - "slc~j", - "sll~n", - "slp~u", - "slw~z", - "sm", - "sma~d", - "smf~n", - "smp~z", - "sn", - "snb~c", - "sne~s", - "snu~z", - "so", - "soa~e", - "sog~l", - "son~s", - "sou~z", - "spb~e", - "spg", - "spi", - "spk~v", - "spx", - "sq", - "sqa", - "sqh", - "sqj~k", - "sqm~o", - "sqq~u", - "sr", - "sra~b", - "sre~i", - "srk~o", - "srq~z", - "ss", - "ssa~v", - "ssx~z", - "st", - "sta~b", - "std~w", - "sty", - "su", - "sua~c", - "sue", - "sug", - "sui~m", - "suq~t", - "suv~z", - "sv", - "sva~c", - "sve", - "svk", - "svm", - "svr~s", - "svx", - "sw", - "swb", - "swf~g", - "swi~y", - "sxb~c", - "sxe", - "sxg", - "sxk~o", - "sxr~s", - "sxu", - "sxw", - "sya~d", - "syi", - "syk~o", - "syr~s", - "syw~y", - "sza~e", - "szg", - "szl", - "szn", - "szp", - "szv~w", - "ta", - "taa~g", - "tai~l", - "tan~s", - "tau~z", - "tba~z", - "tca~i", - "tck~q", - "tcs~u", - "tcw~z", - "tda~o", - "tdq~v", - "tdx~y", - "te", - "tea~i", - "tek", - "tem~y", - "tfi", - "tfn~o", - "tfr", - "tft", - "tg", - "tga~j", - "tgn~z", - "th", - "thc~f", - "thh~i", - "thk~n", - "thp~z", - "ti", - "tia", - "tic~q", - "tis~z", - "tja", - "tjg", - "tji", - "tjl~o", - "tjs", - "tju", - "tjw", - "tk", - "tka~b", - "tkd~g", - "tkk~n", - "tkp~x", - "tkz", - "tla~d", - "tlf~y", - "tma~w", - "tmy~z", - "tn", - "tna~i", - "tnk~z", - "to", - "tob~j", - "tol~m", - "too~s", - "tou~z", - "tpa", - "tpc", - "tpe~g", - "tpi~r", - "tpt~z", - "tqb", - "tql~r", - "tqt~u", - "tqw", - "tr", - "tra~z", - "ts", - "tsa~m", - "tsp~z", - "tt", - "tta~p", - "ttr~w", - "tty~z", - "tua~j", - "tul~q", - "tus~z", - "tva", - "tvd~e", - "tvk~o", - "tvs~u", - "tvw", - "tvy", - "twa~h", - "twl~r", - "twt~u", - "tww~y", - "txa~c", - "txe", - "txg~j", - "txm~o", - "txq~u", - "txx~y", - "ty", - "tya", - "tye", - "tyh~j", - "tyl", - "tyn", - "typ", - "tyr~v", - "tyx", - "tyz", - "tza", - "tzh", - "tzj", - "tzl~o", - "tzx", - "uam~n", - "uar", - "uba", - "ubi", - "ubl", - "ubr", - "ubu", - "uby", - "uda", - "ude", - "udg", - "udi~j", - "udl~m", - "udu", - "ues", - "ufi", - "ug", - "uga~b", - "uge", - "ugn~o", - "ugy", - "uha", - "uhn", - "uis", - "uiv", - "uji", - "uk", - "uka", - "ukg~h", - "ukl", - "ukp~q", - "uks", - "uku", - "ukw", - "uky", - "ula~c", - "ule~f", - "uli", - "ulk~n", - "ulu", - "ulw", - "uma~d", - "umg", - "umi", - "umm~p", - "umr~s", - "una", - "une", - "ung", - "unk", - "unm~n", - "unp", - "unr", - "unu", - "unx", - "unz", - "uok", - "upi", - "upv", - "ur", - "ura~c", - "ure~p", - "urr", - "urt~z", - "usa", - "ush~i", - "usk", - "usp", - "usu", - "uta", - "ute", - "utp", - "utr", - "utu", - "uum~n", - "uur", - "uuu", - "uve", - "uvh", - "uvl", - "uwa", - "uya", - "uz", - "uzs", - "vaa", - "vae~j", - "val~p", - "var~s", - "vau~v", - "vay", - "vbb", - "vbk", - "ve", - "vec~d", - "vel~m", - "veo~p", - "ver", - "vgr", - "vgt", - "vi", - "vic~d", - "vif~g", - "vil", - "vin", - "vis~t", - "viv", - "vka", - "vki~m", - "vko~p", - "vkt~u", - "vlp", - "vls", - "vma~m", - "vmp~s", - "vmu~z", - "vnk", - "vnm", - "vnp", - "vo", - "vor", - "vot", - "vra", - "vro", - "vrs~t", - "vsi", - "vsl", - "vsv", - "vto", - "vum~n", - "vut", - "vwa", - "wa", - "waa~z", - "wba~b", - "wbe~f", - "wbh~m", - "wbp~r", - "wbt", - "wbv~w", - "wca", - "wci", - "wdd", - "wdg", - "wdj~k", - "wdu", - "wdy", - "wea", - "wec~d", - "weg~i", - "wem~p", - "wer~u", - "wew", - "wfg", - "wga~b", - "wgg", - "wgi", - "wgo", - "wgu", - "wgw", - "wgy", - "wha", - "whg", - "whk", - "whu", - "wib~c", - "wie~n", - "wir", - "wit~w", - "wiy", - "wja", - "wji", - "wka~b", - "wkd", - "wkl", - "wku", - "wkw", - "wky", - "wla", - "wlc", - "wle", - "wlg", - "wli", - "wlk~m", - "wlo", - "wlr~s", - "wlu~y", - "wma~e", - "wmh~i", - "wmm~o", - "wms~t", - "wmw~x", - "wnb~e", - "wng", - "wni", - "wnk", - "wnm~p", - "wnu", - "wnw", - "wny", - "wo", - "woa~g", - "woi", - "wok", - "wom~o", - "wor~s", - "wow", - "woy", - "wpc", - "wra~b", - "wrd", - "wrg~i", - "wrk~p", - "wrr~s", - "wru~z", - "wsa", - "wsg", - "wsi", - "wsk", - "wsr~s", - "wsu~v", - "wtf", - "wth~i", - "wtk", - "wtm", - "wtw", - "wua~b", - "wud", - "wuh", - "wul~n", - "wur", - "wut~v", - "wux~y", - "wwa~b", - "wwo", - "wwr", - "www", - "wxa", - "wxw", - "wya~b", - "wyi", - "wym", - "wyr", - "wyy", - "xaa~e", - "xag", - "xai~w", - "xay", - "xba~e", - "xbg", - "xbi~j", - "xbm~p", - "xbr", - "xbw~y", - "xcb~c", - "xce", - "xcg~h", - "xcl~o", - "xcr", - "xct~w", - "xcy", - "xda", - "xdc", - "xdk", - "xdm", - "xdy", - "xeb", - "xed", - "xeg", - "xel~m", - "xep", - "xer~u", - "xfa", - "xga~b", - "xgd", - "xgf~g", - "xgi", - "xgl~n", - "xgr", - "xgu", - "xgw", - "xh", - "xha", - "xhc~e", - "xhr", - "xht~v", - "xia~b", - "xii", - "xil", - "xin", - "xip", - "xir~s", - "xiv", - "xiy", - "xjb", - "xjt", - "xka~l", - "xkn~z", - "xla~e", - "xlg", - "xli", - "xln~p", - "xls", - "xlu", - "xly", - "xma~h", - "xmj~z", - "xna~b", - "xnd", - "xng~i", - "xnk", - "xnn~o", - "xnr~u", - "xny~z", - "xoc~d", - "xog", - "xoi", - "xok", - "xom~p", - "xor", - "xow", - "xpa", - "xpc", - "xpg", - "xpi~k", - "xpm~u", - "xpy", - "xqa", - "xqt", - "xra~b", - "xrd~e", - "xrg", - "xri", - "xrm~n", - "xrq~r", - "xrt~u", - "xrw", - "xsa~e", - "xsh~j", - "xsm~s", - "xsu~v", - "xsy", - "xta~e", - "xtg~j", - "xtl~w", - "xty~z", - "xua~b", - "xud", - "xug", - "xuj", - "xul~p", - "xur", - "xut~u", - "xve", - "xvi", - "xvn~o", - "xvs", - "xwa", - "xwc~e", - "xwg", - "xwj~l", - "xwo", - "xwr", - "xwt", - "xww", - "xxb", - "xxk", - "xxm", - "xxr", - "xxt", - "xya~b", - "xyj~l", - "xyt", - "xyy", - "xzh", - "xzm", - "xzp", - "yaa~z", - "yba~b", - "ybd~e", - "ybh~o", - "ybx~y", - "ych", - "ycl", - "ycn", - "ycp", - "yda", - "yde", - "ydg", - "ydk", - "yds", - "yea", - "yec", - "yee", - "yei~j", - "yel", - "yen", - "yer~v", - "yey", - "yga", - "ygi", - "ygl~m", - "ygp", - "ygr~s", - "ygu", - "ygw", - "yha", - "yhd", - "yhl", - "yhs", - "yi", - "yia", - "yif~n", - "yip~v", - "yix~z", - "yka", - "ykg", - "yki", - "ykk~o", - "ykr", - "ykt~u", - "yky", - "yla~b", - "yle", - "ylg", - "yli", - "yll~o", - "ylr", - "ylu", - "yly", - "yma~e", - "ymg~i", - "ymk~t", - "ymx", - "ymz", - "yna", - "ynd~e", - "yng~h", - "ynk~l", - "ynn~o", - "ynq", - "yns", - "ynu", - "yo", - "yob", - "yog", - "yoi", - "yok~n", - "yos~t", - "yox~y", - "ypa~b", - "ypg~h", - "ypk", - "ypm~p", - "ypz", - "yra~b", - "yre", - "yri", - "yrk~o", - "yrs", - "yrw", - "yry", - "ysc~d", - "ysg", - "ysl", - "ysn~p", - "ysr~s", - "ysy", - "yta", - "ytl", - "ytp", - "ytw", - "yty", - "yua~g", - "yui~n", - "yup~r", - "yut~u", - "yuw~z", - "yva", - "yvt", - "ywa", - "ywg", - "ywl", - "ywn", - "ywq~r", - "ywt~u", - "yww", - "yxa", - "yxg", - "yxl~m", - "yxu", - "yxy", - "yyr", - "yyu", - "yyz", - "yzg", - "yzk", - "za", - "zaa~h", - "zaj~m", - "zao~z", - "zbc", - "zbe", - "zbl", - "zbt", - "zbw", - "zca", - "zch", - "zdj", - "zea", - "zeg~h", - "zen", - "zga~b", - "zgh", - "zgm~n", - "zgr", - "zh", - "zhb", - "zhd", - "zhi", - "zhn", - "zhw~x", - "zia~b", - "zik~n", - "zir", - "ziw", - "ziz", - "zka~b", - "zkd", - "zkg~h", - "zkk", - "zkn~p", - "zkr", - "zkt~v", - "zkz", - "zle", - "zlj", - "zlm~n", - "zlq", - "zls", - "zlw", - "zma~z", - "zna", - "znd~e", - "zng", - "znk", - "zns", - "zoc", - "zoh", - "zom", - "zoo", - "zoq~s", - "zpa~z", - "zqe", - "zra", - "zrg", - "zrn~p", - "zrs", - "zsa", - "zsk~l", - "zsr", - "zsu", - "zte", - "ztg", - "ztl~n", - "ztp~q", - "zts~u", - "ztx~y", - "zu", - "zua", - "zuh", - "zum~n", - "zuy", - "zwa", - "zyg", - "zyj", - "zyn", - "zyp", - "zza", - "zzj", - } - special{ - "mis", - "mul", - "zxx", - } - unknown{"und"} - } - region{ - deprecated{ - "AN", - "BU", - "CS", - "DD", - "FX", - "NT", - "QU", - "SU", - "TP", - "YD", - "YU", - "ZR", - } - macroregion{ - "001~3", - "005", - "009", - "011", - "013~5", - "017~9", - "021", - "029", - "030", - "034~5", - "039", - "053~4", - "057", - "061", - "142~3", - "145", - "150~1", - "154~5", - "419", - "EU", - "EZ", - "QO", - "UN", - } - private_use{ - "AA", - "QM~N", - "QP~T", - "QV~Z", - "XA~J", - "XL~Z", - } - regular{ - "AC~G", - "AI", - "AL~M", - "AO", - "AQ~U", - "AW~X", - "AZ", - "BA~B", - "BD~J", - "BL~O", - "BQ~T", - "BV~W", - "BY~Z", - "CA", - "CC~D", - "CF~I", - "CK~P", - "CR", - "CU~Z", - "DE", - "DG", - "DJ~K", - "DM", - "DO", - "DZ", - "EA", - "EC", - "EE", - "EG~H", - "ER~T", - "FI~K", - "FM", - "FO", - "FR", - "GA~B", - "GD~I", - "GL~N", - "GP~U", - "GW", - "GY", - "HK", - "HM~N", - "HR", - "HT~U", - "IC~E", - "IL~O", - "IQ~T", - "JE", - "JM", - "JO~P", - "KE", - "KG~I", - "KM~N", - "KP", - "KR", - "KW", - "KY~Z", - "LA~C", - "LI", - "LK", - "LR~V", - "LY", - "MA", - "MC~H", - "MK~Z", - "NA", - "NC", - "NE~G", - "NI", - "NL", - "NO~P", - "NR", - "NU", - "NZ", - "OM", - "PA", - "PE~H", - "PK~N", - "PR~T", - "PW", - "PY", - "QA", - "RE", - "RO", - "RS", - "RU", - "RW", - "SA~E", - "SG~O", - "SR~T", - "SV", - "SX~Z", - "TA", - "TC~D", - "TF~H", - "TJ~O", - "TR", - "TT", - "TV~W", - "TZ", - "UA", - "UG", - "UM", - "US", - "UY~Z", - "VA", - "VC", - "VE", - "VG", - "VI", - "VN", - "VU", - "WF", - "WS", - "XK", - "YE", - "YT", - "ZA", - "ZM", - "ZW", - } - unknown{"ZZ"} - } - script{ - deprecated{"Qaai"} - private_use{ - "Qaaa~h", - "Qaaj~z", - "Qaba~x", - } - regular{ - "Adlm", - "Aghb", - "Ahom", - "Arab", - "Armi", - "Armn", - "Avst", - "Bali", - "Bamu", - "Bass", - "Batk", - "Beng", - "Bhks", - "Bopo", - "Brah~i", - "Bugi", - "Buhd", - "Cakm", - "Cans", - "Cari", - "Cham", - "Cher", - "Copt", - "Cprt", - "Cyrl", - "Deva", - "Dsrt", - "Dupl", - "Egyp", - "Elba", - "Ethi", - "Geor", - "Glag", - "Goth", - "Gran", - "Grek", - "Gujr", - "Guru", - "Hanb", - "Hang", - "Hani", - "Hano", - "Hans~t", - "Hatr", - "Hebr", - "Hira", - "Hluw", - "Hmng", - "Hrkt", - "Hung", - "Ital", - "Jamo", - "Java", - "Jpan", - "Kali", - "Kana", - "Khar", - "Khmr", - "Khoj", - "Knda", - "Kore", - "Kthi", - "Lana", - "Laoo", - "Latn", - "Lepc", - "Limb", - "Lina~b", - "Lisu", - "Lyci", - "Lydi", - "Mahj", - "Mand", - "Mani", - "Marc", - "Mend", - "Merc", - "Mero", - "Mlym", - "Modi", - "Mong", - "Mroo", - "Mtei", - "Mult", - "Mymr", - "Narb", - "Nbat", - "Newa", - "Nkoo", - "Ogam", - "Olck", - "Orkh", - "Orya", - "Osge", - "Osma", - "Palm", - "Pauc", - "Perm", - "Phag", - "Phli", - "Phlp", - "Phnx", - "Plrd", - "Prti", - "Rjng", - "Runr", - "Samr", - "Sarb", - "Saur", - "Sgnw", - "Shaw", - "Shrd", - "Sidd", - "Sind", - "Sinh", - "Sora", - "Sund", - "Sylo", - "Syrc", - "Tagb", - "Takr", - "Tale", - "Talu", - "Taml", - "Tang", - "Tavt", - "Telu", - "Tfng", - "Tglg", - "Thaa", - "Thai", - "Tibt", - "Tirh", - "Ugar", - "Vaii", - "Wara", - "Xpeo", - "Xsux", - "Yiii", - "Zinh", - "Zyyy", - } - special{ - "Zmth", - "Zsye", - "Zsym", - "Zxxx", - } - unknown{"Zzzz"} - } - subdivision{ - deprecated{ - "albr", - "albu", - "aldi", - "aldl", - "aldr", - "aldv", - "alel", - "aler", - "alfr", - "algj", - "algr", - "alha", - "alka~c", - "alko", - "alkr", - "alku", - "allb", - "alle", - "allu", - "almk", - "almm", - "almr", - "almt", - "alpg", - "alpq~r", - "alpu", - "alsh", - "alsk", - "alsr", - "alte", - "altp", - "altr", - "alvl", - "ba01~9", - "ba10", - "bh16", - "ci01~9", - "ci10~9", - "cn71", - "cn91~2", - "frbl", - "frgf", - "frgp", - "frmf", - "frmq", - "frnc", - "frpf", - "frpm", - "frre", - "frtf", - "frwf", - "fryt", - "gbant", - "gbard", - "gbarm", - "gbbla", - "gbbly", - "gbbnb", - "gbcgv", - "gbckf", - "gbckt", - "gbclr", - "gbcsr", - "gbdgn", - "gbdow", - "gbdry", - "gbfer", - "gblmv", - "gblrn", - "gblsb", - "gbmft", - "gbmyl", - "gbndn", - "gbnta", - "gbnym", - "gbomh", - "gbstb", - "is0", - "laxn", - "lud", - "lug", - "lul", - "mk01", - "mk09", - "mk15", - "mk17", - "mk28~9", - "mk31", - "mk38~9", - "mk57", - "mk68", - "mk77", - "mk79", - "mk84", - "mrnkc", - "nlaw", - "nlcw", - "nlsx", - "nzn", - "nzs", - "omba", - "omsh", - "tteto", - "ttrcm", - "ttwto", - "twkhq", - "twtnq", - "twtpq", - "twtxq", - "usas", - "usgu", - "usmp", - "uspr", - "usum", - "usvi", - } - regular{ - "ad02~8", - "aeaj", - "aeaz", - "aedu", - "aefu", - "aerk", - "aesh", - "aeuq", - "afbal~m", - "afbdg", - "afbds", - "afbgl", - "afday", - "affra", - "affyb", - "afgha", - "afgho", - "afhel", - "afher", - "afjow", - "afkab", - "afkan", - "afkap", - "afkdz", - "afkho", - "afknr", - "aflag", - "aflog", - "afnan", - "afnim", - "afnur", - "afpan", - "afpar", - "afpia", - "afpka", - "afsam", - "afsar", - "aftak", - "afuru", - "afwar", - "afzab", - "ag03~8", - "ag10~1", - "al01~9", - "al10~2", - "amag", - "amar", - "amav", - "amer", - "amgr", - "amkt", - "amlo", - "amsh", - "amsu", - "amtv", - "amvd", - "aobgo", - "aobgu", - "aobie", - "aocab", - "aoccu", - "aocnn~o", - "aocus", - "aohua", - "aohui", - "aolno", - "aolsu", - "aolua", - "aomal", - "aomox", - "aonam", - "aouig", - "aozai", - "ara~h", - "arj~n", - "arp~z", - "at1~9", - "auact", - "aunsw", - "aunt", - "auqld", - "ausa", - "autas", - "auvic", - "auwa", - "azabs", - "azaga", - "azagc", - "azagm", - "azags", - "azagu", - "azast", - "azba", - "azbab", - "azbal", - "azbar", - "azbey", - "azbil", - "azcab", - "azcal", - "azcul", - "azdas", - "azfuz", - "azga", - "azgad", - "azgor", - "azgoy", - "azgyg", - "azhac", - "azimi", - "azism", - "azkal", - "azkan", - "azkur", - "azla", - "azlac", - "azlan", - "azler", - "azmas", - "azmi", - "azna", - "aznef", - "aznv", - "aznx", - "azogu", - "azord", - "azqab", - "azqax", - "azqaz", - "azqba", - "azqbi", - "azqob", - "azqus", - "azsa", - "azsab", - "azsad", - "azsah", - "azsak~l", - "azsar", - "azsat", - "azsbn", - "azsiy", - "azskr", - "azsm", - "azsmi", - "azsmx", - "azsr", - "azsus", - "aztar", - "aztov", - "azuca", - "azxa", - "azxac", - "azxci", - "azxiz", - "azxvd", - "azyar", - "azye", - "azyev", - "azzan", - "azzaq~r", - "babih", - "babrc", - "basrp", - "bb01~9", - "bb10~1", - "bd01~9", - "bd10~9", - "bd20~9", - "bd30~9", - "bd40~9", - "bd50~9", - "bd60~4", - "bda~g", - "bebru", - "bevan", - "bevbr", - "bevlg", - "bevli", - "bevov", - "bevwv", - "bewal", - "bewbr", - "bewht", - "bewlg", - "bewlx", - "bewna", - "bf01~9", - "bf10~3", - "bfbal~n", - "bfbaz", - "bfbgr", - "bfblg", - "bfblk", - "bfcom", - "bfgan", - "bfgna", - "bfgou", - "bfhou", - "bfiob", - "bfkad", - "bfken", - "bfkmd", - "bfkmp", - "bfkop", - "bfkos~t", - "bfkow", - "bfler", - "bflor", - "bfmou", - "bfnam", - "bfnao", - "bfnay", - "bfnou", - "bfoub", - "bfoud", - "bfpas", - "bfpon", - "bfsen", - "bfsis", - "bfsmt", - "bfsng", - "bfsom", - "bfsor", - "bftap", - "bftui", - "bfyag", - "bfyat", - "bfzir", - "bfzon", - "bfzou", - "bg01~9", - "bg10~9", - "bg20~8", - "bh13~5", - "bh17", - "bibb", - "bibl~m", - "bibr", - "bica", - "bici", - "bigi", - "biki", - "bikr", - "biky", - "bima", - "bimu", - "bimw", - "bimy", - "bing", - "birm", - "birt", - "biry", - "bjak~l", - "bjaq", - "bjbo", - "bjco", - "bjdo", - "bjko", - "bjli", - "bjmo", - "bjou", - "bjpl", - "bjzo", - "bnbe", - "bnbm", - "bnte", - "bntu", - "bob~c", - "boh", - "bol", - "bon~p", - "bos~t", - "bqbo", - "bqsa", - "bqse", - "brac", - "bral~m", - "brap", - "brba", - "brce", - "brdf", - "bres", - "brgo", - "brma", - "brmg", - "brms~t", - "brpa~b", - "brpe", - "brpi", - "brpr", - "brrj", - "brrn~o", - "brrr~s", - "brsc", - "brse", - "brsp", - "brto", - "bsak", - "bsbi", - "bsbp", - "bsby", - "bsce", - "bsci", - "bsck", - "bsco", - "bscs", - "bseg", - "bsex", - "bsfp", - "bsgc", - "bshi", - "bsht", - "bsin", - "bsli", - "bsmc", - "bsmg", - "bsmi", - "bsne", - "bsno", - "bsns", - "bsrc", - "bsri", - "bssa", - "bsse", - "bsso", - "bsss", - "bssw", - "bswg", - "bt11~5", - "bt21~4", - "bt31~4", - "bt41~5", - "btga", - "btty", - "bwce", - "bwch", - "bwfr", - "bwga", - "bwgh", - "bwjw", - "bwkg", - "bwkl", - "bwkw", - "bwlo", - "bwne", - "bwnw", - "bwse", - "bwso~p", - "bwst", - "bybr", - "byhm", - "byho", - "byhr", - "byma", - "bymi", - "byvi", - "bzbz", - "bzcy", - "bzczl", - "bzow", - "bzsc", - "bztol", - "caab", - "cabc", - "camb", - "canb", - "canl", - "cans~u", - "caon", - "cape", - "caqc", - "cask", - "cayt", - "cdbc", - "cdbn", - "cdeq", - "cdka", - "cdke", - "cdkn", - "cdkw", - "cdma", - "cdnk", - "cdor", - "cdsk", - "cfac", - "cfbb", - "cfbgf", - "cfbk", - "cfhk", - "cfhm", - "cfhs", - "cfkb", - "cfkg", - "cflb", - "cfmb", - "cfmp", - "cfnm", - "cfop", - "cfse", - "cfuk", - "cfvk", - "cg11~6", - "cg2", - "cg5", - "cg7~9", - "cgbzv", - "chag", - "chai", - "char", - "chbe", - "chbl", - "chbs", - "chfr", - "chge", - "chgl", - "chgr", - "chju", - "chlu", - "chne", - "chnw", - "chow", - "chsg~h", - "chso", - "chsz", - "chtg", - "chti", - "chur", - "chvd", - "chvs", - "chzg~h", - "ciab", - "cibs", - "cicm", - "cidn", - "cigd", - "cilc", - "cilg", - "cimg", - "cism", - "cisv", - "civb", - "ciwr", - "ciym", - "cizz", - "clai", - "clan", - "clap", - "clar", - "clat", - "clbi", - "clco", - "clli", - "clll", - "cllr", - "clma", - "clml", - "clrm", - "clta", - "clvs", - "cmad", - "cmce", - "cmen", - "cmes", - "cmlt", - "cmno", - "cmnw", - "cmou", - "cmsu", - "cmsw", - "cn11~5", - "cn21~3", - "cn31~7", - "cn41~6", - "cn50~4", - "cn61~5", - "coama", - "coant", - "coara", - "coatl", - "cobol", - "coboy", - "cocal", - "cocaq", - "cocas", - "cocau", - "coces", - "cocho", - "cocor", - "cocun", - "codc", - "cogua", - "coguv", - "cohui", - "colag", - "comag", - "comet", - "conar", - "consa", - "coput", - "coqui", - "coris", - "cosan", - "cosap", - "cosuc", - "cotol", - "covac", - "covau", - "covid", - "cra", - "crc", - "crg~h", - "crl", - "crp", - "crsj", - "cu01", - "cu03~9", - "cu10~6", - "cu99", - "cvb", - "cvbr", - "cvbv", - "cvca", - "cvcf", - "cvcr", - "cvma", - "cvmo", - "cvpa", - "cvpn", - "cvpr", - "cvrb", - "cvrg", - "cvrs", - "cvs", - "cvsd", - "cvsf", - "cvsl~m", - "cvso", - "cvss", - "cvsv", - "cvta", - "cvts", - "cy01~6", - "cz101~9", - "cz10a~f", - "cz201~9", - "cz20a~c", - "cz311~7", - "cz321~7", - "cz411~3", - "cz421~7", - "cz511~4", - "cz521~5", - "cz531~4", - "cz611~5", - "cz621~7", - "cz711~5", - "cz721~4", - "cz801~6", - "czjc", - "czjm", - "czka", - "czkr", - "czli", - "czmo", - "czol", - "czpa", - "czpl", - "czpr", - "czst", - "czus", - "czvy", - "czzl", - "debb", - "debe", - "debw", - "deby", - "dehb", - "dehe", - "dehh", - "demv", - "deni", - "denw", - "derp", - "desh", - "desl", - "desn", - "dest", - "deth", - "djar~s", - "djdi~j", - "djob", - "djta", - "dk81~5", - "dm02~9", - "dm10~1", - "do01~9", - "do10~9", - "do20~9", - "do30~9", - "do40~2", - "dz01~9", - "dz10~9", - "dz20~9", - "dz30~9", - "dz40~8", - "eca~i", - "ecl~p", - "ecr~s", - "ecsd~e", - "ect~u", - "ecw~z", - "ee37", - "ee39", - "ee44", - "ee49", - "ee51", - "ee57", - "ee59", - "ee65", - "ee67", - "ee70", - "ee74", - "ee78", - "ee82", - "ee84", - "ee86", - "egalx", - "egasn", - "egast", - "egba", - "egbh", - "egbns", - "egc", - "egdk", - "egdt", - "egfym", - "eggh", - "eggz", - "egis", - "egjs", - "egkb", - "egkfs", - "egkn", - "eglx", - "egmn", - "egmnf", - "egmt", - "egpts", - "egshg", - "egshr", - "egsin", - "egsuz", - "egwad", - "eran", - "erdk", - "erdu", - "ergb", - "erma", - "ersk", - "esa", - "esab", - "esal", - "esan", - "esar~s", - "esav", - "esb", - "esba", - "esbi", - "esbu", - "esc", - "esca~c", - "esce", - "escl~o", - "escr~u", - "esex", - "esga", - "esgc", - "esgi", - "esgr", - "esgu", - "esh", - "eshu", - "esib", - "esj", - "esl", - "esle", - "eslo", - "eslu", - "esm", - "esma", - "esmc~d", - "esml", - "esmu", - "esna", - "esnc", - "eso", - "esor", - "esp", - "espm", - "espo", - "espv", - "esri", - "ess", - "essa", - "esse", - "essg", - "esso", - "esss", - "est", - "este~f", - "esto", - "esv", - "esva", - "esvc", - "esvi", - "esz", - "esza", - "etaa", - "etaf", - "etam", - "etbe", - "etdd", - "etga", - "etha", - "etor", - "etsn~o", - "etti", - "fi01~9", - "fi10~9", - "fj01~9", - "fj10~4", - "fjc", - "fje", - "fjn", - "fjr", - "fjw", - "fmksa", - "fmpni", - "fmtrk", - "fmyap", - "fr01~9", - "fr10~9", - "fr21~9", - "fr2a~b", - "fr30~9", - "fr40~9", - "fr50~9", - "fr60~9", - "fr70~9", - "fr80~9", - "fr90~5", - "fra~c", - "frcp", - "frd~v", - "ga1~9", - "gbabc~e", - "gbagb", - "gbagy", - "gband", - "gbann", - "gbans", - "gbbas", - "gbbbd", - "gbbdf~g", - "gbben", - "gbbex", - "gbbfs", - "gbbge", - "gbbgw", - "gbbir", - "gbbkm", - "gbbmh", - "gbbne", - "gbbnh", - "gbbns", - "gbbol", - "gbbpl", - "gbbrc~d", - "gbbry", - "gbbst", - "gbbur", - "gbcam", - "gbcay", - "gbcbf", - "gbccg", - "gbcgn", - "gbche", - "gbchw", - "gbcld", - "gbclk", - "gbcma", - "gbcmd", - "gbcmn", - "gbcon", - "gbcov", - "gbcrf", - "gbcry", - "gbcwy", - "gbdal", - "gbdby", - "gbden", - "gbder", - "gbdev", - "gbdgy", - "gbdnc~d", - "gbdor", - "gbdrs", - "gbdud", - "gbdur", - "gbeal", - "gbeaw", - "gbeay", - "gbedh", - "gbedu", - "gbeln", - "gbels", - "gbenf~g", - "gberw", - "gbery", - "gbess", - "gbesx", - "gbfal", - "gbfif", - "gbfln", - "gbfmo", - "gbgat", - "gbgbn", - "gbglg", - "gbgls", - "gbgre", - "gbgwn", - "gbhal~m", - "gbhav", - "gbhck", - "gbhef", - "gbhil", - "gbhld", - "gbhmf", - "gbhns", - "gbhpl", - "gbhrt", - "gbhrw", - "gbhry", - "gbios", - "gbiow", - "gbisl", - "gbivc", - "gbkec", - "gbken", - "gbkhl", - "gbkir", - "gbktt", - "gbkwl", - "gblan", - "gblbc", - "gblbh", - "gblce", - "gblds", - "gblec", - "gblew", - "gblin", - "gbliv", - "gblnd", - "gblut", - "gbman", - "gbmdb", - "gbmdw", - "gbmea", - "gbmik", - "gbmln", - "gbmon", - "gbmrt", - "gbmry", - "gbmty", - "gbmul", - "gbnay", - "gbnbl", - "gbnel", - "gbnet", - "gbnfk", - "gbngm", - "gbnir", - "gbnlk", - "gbnln", - "gbnmd", - "gbnsm", - "gbnth", - "gbntl", - "gbntt", - "gbnty", - "gbnwm", - "gbnwp", - "gbnyk", - "gbold", - "gbork", - "gboxf", - "gbpem", - "gbpkn", - "gbply", - "gbpol", - "gbpor", - "gbpow", - "gbpte", - "gbrcc", - "gbrch", - "gbrct", - "gbrdb", - "gbrdg", - "gbrfw", - "gbric", - "gbrot", - "gbrut", - "gbsaw", - "gbsay", - "gbscb", - "gbsct", - "gbsfk", - "gbsft", - "gbsgc", - "gbshf", - "gbshn", - "gbshr", - "gbskp", - "gbslf~g", - "gbslk", - "gbsnd", - "gbsol~m", - "gbsos", - "gbsry", - "gbste", - "gbstg~h", - "gbstn", - "gbsts~t", - "gbsty", - "gbswa", - "gbswd", - "gbswk", - "gbtam", - "gbtfw", - "gbthr", - "gbtob", - "gbtof", - "gbtrf", - "gbtwh", - "gbukm", - "gbvgl", - "gbwar", - "gbwbk", - "gbwdu", - "gbwft", - "gbwgn", - "gbwil", - "gbwkf", - "gbwll", - "gbwln", - "gbwls", - "gbwlv", - "gbwnd", - "gbwnm", - "gbwok", - "gbwor", - "gbwrl", - "gbwrt", - "gbwrx", - "gbwsm", - "gbwsx", - "gbyor", - "gbzet", - "gd01~6", - "gd10", - "geab", - "geaj", - "gegu", - "geim", - "geka", - "gekk", - "gemm", - "gerl", - "gesj~k", - "gesz", - "getb", - "ghaa", - "ghah", - "ghba", - "ghcp", - "ghep", - "ghnp", - "ghtv", - "ghue", - "ghuw", - "ghwp", - "glku", - "glqa", - "glqe", - "glsm", - "gmb", - "gml~n", - "gmu", - "gmw", - "gnb", - "gnbe~f", - "gnbk", - "gnc", - "gnco", - "gnd", - "gndb", - "gndi", - "gndl", - "gndu", - "gnf", - "gnfa", - "gnfo", - "gnfr", - "gnga", - "gngu", - "gnk", - "gnka~b", - "gnkd~e", - "gnkn~o", - "gnks", - "gnl", - "gnla", - "gnle", - "gnlo", - "gnm", - "gnmc~d", - "gnml~m", - "gnn", - "gnnz", - "gnpi", - "gnsi", - "gnte", - "gnto", - "gnyo", - "gqan", - "gqbn", - "gqbs", - "gqc", - "gqcs", - "gqi", - "gqkn", - "gqli", - "gqwn", - "gr01", - "gr03~7", - "gr11~7", - "gr21~4", - "gr31~4", - "gr41~4", - "gr51~9", - "gr61~4", - "gr69", - "gr71~3", - "gr81~5", - "gr91~4", - "gra", - "gra1", - "grb~m", - "gtav", - "gtbv", - "gtcm", - "gtcq", - "gtes", - "gtgu", - "gthu", - "gtiz", - "gtja", - "gtju", - "gtpe", - "gtpr", - "gtqc", - "gtqz", - "gtre", - "gtsa", - "gtsm", - "gtso", - "gtsr", - "gtsu", - "gtto", - "gtza", - "gwba", - "gwbl~m", - "gwbs", - "gwca", - "gwga", - "gwl", - "gwn", - "gwoi", - "gwqu", - "gws", - "gwto", - "gyba", - "gycu", - "gyde", - "gyeb", - "gyes", - "gyma", - "gypm", - "gypt", - "gyud", - "gyut", - "hnat", - "hnch", - "hncl~m", - "hncp", - "hncr", - "hnep", - "hnfm", - "hngd", - "hnib", - "hnin", - "hnle", - "hnlp", - "hnoc", - "hnol", - "hnsb", - "hnva", - "hnyo", - "hr01~9", - "hr10~9", - "hr20~1", - "htar", - "htce", - "htga", - "htnd~e", - "htni", - "htno", - "htou", - "htsd~e", - "huba", - "hubc", - "hube", - "hubk", - "hubu", - "hubz", - "hucs", - "hude", - "hudu", - "hueg", - "huer", - "hufe", - "hugs", - "hugy", - "huhb", - "huhe", - "huhv", - "hujn", - "huke", - "hukm", - "hukv", - "humi", - "hunk", - "huno", - "huny", - "hupe", - "hups", - "husd", - "husf", - "hush", - "husk", - "husn~o", - "huss~t", - "husz", - "hutb", - "huto", - "huva", - "huve", - "huvm", - "huza", - "huze", - "idac", - "idba~b", - "idbe", - "idbt", - "idgo", - "idja~b", - "idji", - "idjk", - "idjt", - "idjw", - "idka~b", - "idki", - "idkr~u", - "idla", - "idma", - "idml", - "idmu", - "idnb", - "idnt~u", - "idpa~b", - "idpp", - "idri", - "idsa~b", - "idsg", - "idsl~n", - "idsr~u", - "idyo", - "iec", - "iece", - "iecn~o", - "iecw", - "ied", - "iedl", - "ieg", - "ieke", - "iekk", - "ieky", - "iel", - "ield", - "ielh", - "ielk", - "ielm", - "iels", - "iem", - "iemh", - "iemn~o", - "ieoy", - "iern", - "ieso", - "ieta", - "ieu", - "iewd", - "iewh", - "ieww~x", - "ild", - "ilha", - "iljm", - "ilm", - "ilta", - "ilz", - "inan", - "inap", - "inar~s", - "inbr", - "inch", - "inct", - "indd", - "indl", - "indn", - "inga", - "ingj", - "inhp", - "inhr", - "injh", - "injk", - "inka", - "inkl", - "inld", - "inmh", - "inml", - "inmn", - "inmp", - "inmz", - "innl", - "inor", - "inpb", - "inpy", - "inrj", - "insk", - "intg", - "intn", - "intr", - "inup", - "inut", - "inwb", - "iqan", - "iqar", - "iqba~b", - "iqbg", - "iqda", - "iqdi", - "iqdq", - "iqka", - "iqki", - "iqma", - "iqmu", - "iqna", - "iqni", - "iqqa", - "iqsd", - "iqsu", - "iqwa", - "ir01~8", - "ir10~9", - "ir20~9", - "ir30~2", - "is1~8", - "it21", - "it23", - "it25", - "it32", - "it34", - "it36", - "it42", - "it45", - "it52", - "it55", - "it57", - "it62", - "it65", - "it67", - "it72", - "it75", - "it77~8", - "it82", - "it88", - "itag", - "ital", - "itan~r", - "itat", - "itav", - "itba", - "itbg", - "itbi", - "itbl", - "itbn~o", - "itbr~t", - "itbz", - "itca~b", - "itce", - "itch~i", - "itcl", - "itcn~o", - "itcr~t", - "itcz", - "iten", - "itfc", - "itfe", - "itfg", - "itfi", - "itfm", - "itfr", - "itge", - "itgo", - "itgr", - "itim", - "itis", - "itkr", - "itlc", - "itle", - "itli", - "itlo", - "itlt~u", - "itmb~c", - "itme", - "itmi", - "itmn~o", - "itms~t", - "itna", - "itno", - "itnu", - "itog", - "itor", - "itot", - "itpa", - "itpc~e", - "itpg", - "itpi", - "itpn~o", - "itpr", - "itpt~v", - "itpz", - "itra", - "itrc", - "itre", - "itrg", - "itri", - "itrm~o", - "itsa", - "itsi", - "itso~p", - "itsr~s", - "itsv", - "itta", - "itte", - "ittn~p", - "ittr~s", - "ittv", - "itud", - "itva~c", - "itve", - "itvi", - "itvr~t", - "itvv", - "jm01~9", - "jm10~4", - "joaj", - "joam", - "joaq", - "joat", - "joaz", - "joba", - "joir", - "joja", - "joka", - "joma", - "jomd", - "jomn", - "jp01~9", - "jp10~9", - "jp20~9", - "jp30~9", - "jp40~7", - "ke01~9", - "ke10~9", - "ke20~9", - "ke30~9", - "ke40~7", - "kgb~c", - "kggb", - "kggo", - "kgj", - "kgn~o", - "kgt", - "kgy", - "kh1", - "kh10~9", - "kh2", - "kh20~5", - "kh3~9", - "kig", - "kil", - "kip", - "kma", - "kmg", - "kmm", - "kn01~9", - "kn10~3", - "kn15", - "knk", - "knn", - "kp01~9", - "kp10", - "kp13", - "kr11", - "kr26~9", - "kr30~1", - "kr41~9", - "kr50", - "kwah", - "kwfa", - "kwha", - "kwja", - "kwku", - "kwmu", - "kzakm", - "kzakt", - "kzala", - "kzalm", - "kzast", - "kzaty", - "kzkar", - "kzkus", - "kzkzy", - "kzman", - "kzpav", - "kzsev", - "kzvos", - "kzyuz", - "kzzap", - "kzzha", - "laat", - "labk~l", - "lach", - "laho", - "lakh", - "lalm", - "lalp", - "laou", - "laph", - "lasl", - "lasv", - "lavi", - "lavt", - "laxa", - "laxe", - "laxi", - "laxs", - "lbak", - "lbas", - "lbba", - "lbbh~i", - "lbja", - "lbjl", - "lbna", - "lc01~3", - "lc05~8", - "lc10~2", - "li01~9", - "li10~1", - "lk1", - "lk11~3", - "lk2", - "lk21~3", - "lk3", - "lk31~3", - "lk4", - "lk41~5", - "lk5", - "lk51~3", - "lk6", - "lk61~2", - "lk7", - "lk71~2", - "lk8", - "lk81~2", - "lk9", - "lk91~2", - "lrbg", - "lrbm", - "lrcm", - "lrgb", - "lrgg", - "lrgk", - "lrgp", - "lrlo", - "lrmg", - "lrmo", - "lrmy", - "lrni", - "lrrg", - "lrri", - "lrsi", - "lsa~h", - "lsj~k", - "lt01~9", - "lt10~9", - "lt20~9", - "lt30~9", - "lt40~9", - "lt50~9", - "lt60", - "ltal", - "ltkl", - "ltku", - "ltmr", - "ltpn", - "ltsa", - "ltta", - "ltte", - "ltut", - "ltvl", - "luca", - "lucl", - "ludi", - "luec", - "lues", - "lugr", - "lulu", - "lume", - "lurd", - "lurm", - "luvd", - "luwi", - "lv001~9", - "lv010~9", - "lv020~9", - "lv030~9", - "lv040~9", - "lv050~9", - "lv060~9", - "lv070~9", - "lv080~9", - "lv090~9", - "lv100~9", - "lv110", - "lvdgv", - "lvjel", - "lvjkb", - "lvjur", - "lvlpx", - "lvrez", - "lvrix", - "lvven", - "lvvmr", - "lyba", - "lybu", - "lydr", - "lygt", - "lyja", - "lyjg", - "lyji", - "lyju", - "lykf", - "lymb", - "lymi~j", - "lymq", - "lynl", - "lynq", - "lysb", - "lysr", - "lytb", - "lywa", - "lywd", - "lyws", - "lyza", - "ma01~9", - "ma10~6", - "maagd", - "maaou", - "maasz", - "maazi", - "mabem", - "maber~s", - "mabod", - "mabom", - "macas", - "mache", - "machi", - "macht", - "maerr", - "maesi", - "maesm", - "mafah", - "mafes", - "mafig", - "mague", - "mahaj", - "mahao", - "mahoc", - "maifr", - "maine", - "majdi", - "majra", - "maken", - "makes", - "makhe", - "makhn~o", - "malaa", - "malar", - "mamed", - "mamek", - "mammd", - "mammn", - "mamoh", - "mamou", - "manad", - "manou", - "maoua", - "maoud", - "maouj", - "marab", - "masaf", - "masal", - "masef", - "maset", - "masik", - "maskh", - "masyb", - "matai", - "matao", - "matar", - "matat", - "mataz", - "matet", - "matiz", - "matng", - "matnt", - "mazag", - "mccl", - "mcco", - "mcfo", - "mcga", - "mcje", - "mcla", - "mcma", - "mcmc", - "mcmg", - "mcmo", - "mcmu", - "mcph", - "mcsd", - "mcso~p", - "mcsr", - "mcvr", - "mdan", - "mdba", - "mdbd", - "mdbr~s", - "mdca", - "mdcl~m", - "mdcr~u", - "mddo", - "mddr", - "mddu", - "mded", - "mdfa", - "mdfl", - "mdga", - "mdgl", - "mdhi", - "mdia", - "mdle", - "mdni", - "mdoc", - "mdor", - "mdre", - "mdri", - "mdsd", - "mdsi", - "mdsn~o", - "mdst", - "mdsv", - "mdta", - "mdte", - "mdun", - "me01~9", - "me10~9", - "me20~3", - "mga", - "mgd", - "mgf", - "mgm", - "mgt~u", - "mhalk~l", - "mharn", - "mhaur", - "mhebo", - "mheni", - "mhjab", - "mhjal", - "mhkil", - "mhkwa", - "mhl", - "mhlae", - "mhlib", - "mhlik", - "mhmaj", - "mhmal", - "mhmej", - "mhmil", - "mhnmk", - "mhnmu", - "mhron", - "mht", - "mhuja", - "mhuti", - "mhwth", - "mhwtj", - "mk02~8", - "mk10~4", - "mk16", - "mk18~9", - "mk20~7", - "mk30", - "mk32~7", - "mk40~9", - "mk50~6", - "mk58~9", - "mk60~7", - "mk69", - "mk70~6", - "mk78", - "mk80~3", - "mk85", - "ml1~8", - "mlbko", - "mm01~7", - "mm11~8", - "mn035", - "mn037", - "mn039", - "mn041", - "mn043", - "mn046~7", - "mn049", - "mn051", - "mn053", - "mn055", - "mn057", - "mn059", - "mn061", - "mn063~5", - "mn067", - "mn069", - "mn071", - "mn073", - "mn1", - "mr01~9", - "mr10~5", - "mt01~9", - "mt10~9", - "mt20~9", - "mt30~9", - "mt40~9", - "mt50~9", - "mt60~8", - "muag", - "mubl", - "mubr", - "mucc", - "mucu", - "mufl", - "mugp", - "mumo", - "mupa", - "mupl", - "mupu", - "mupw", - "muqb", - "muro", - "murr", - "musa", - "muvp", - "mv00~5", - "mv07~8", - "mv12~4", - "mv17", - "mv20", - "mv23~9", - "mvce", - "mvmle", - "mvnc", - "mvno", - "mvsc", - "mvsu", - "mvun", - "mvus", - "mwba", - "mwbl", - "mwc", - "mwck", - "mwcr", - "mwct", - "mwde", - "mwdo", - "mwkr~s", - "mwli", - "mwlk", - "mwmc", - "mwmg~h", - "mwmu", - "mwmw", - "mwmz", - "mwn", - "mwnb", - "mwne", - "mwni", - "mwnk", - "mwns", - "mwnu", - "mwph", - "mwru", - "mws", - "mwsa", - "mwth", - "mwzo", - "mxagu", - "mxbcn", - "mxbcs", - "mxcam", - "mxchh", - "mxchp", - "mxcoa", - "mxcol", - "mxdif", - "mxdur", - "mxgro", - "mxgua", - "mxhid", - "mxjal", - "mxmex", - "mxmic", - "mxmor", - "mxnay", - "mxnle", - "mxoax", - "mxpue", - "mxque", - "mxroo", - "mxsin", - "mxslp", - "mxson", - "mxtab", - "mxtam", - "mxtla", - "mxver", - "mxyuc", - "mxzac", - "my01~9", - "my10~6", - "mza~b", - "mzg", - "mzi", - "mzl", - "mzmpm", - "mzn", - "mzp~q", - "mzs~t", - "naca", - "naer", - "naha", - "naka", - "nake", - "nakh", - "naku", - "nakw", - "naod", - "naoh", - "naon", - "naos~t", - "naow", - "ne1~8", - "ngab", - "ngad", - "ngak", - "ngan", - "ngba", - "ngbe", - "ngbo", - "ngby", - "ngcr", - "ngde", - "ngeb", - "nged", - "ngek", - "ngen", - "ngfc", - "nggo", - "ngim", - "ngji", - "ngkd~e", - "ngkn~o", - "ngkt", - "ngkw", - "ngla", - "ngna", - "ngni", - "ngog", - "ngon", - "ngos", - "ngoy", - "ngpl", - "ngri", - "ngso", - "ngta", - "ngyo", - "ngza", - "nian", - "nias", - "nibo", - "nica", - "nici", - "nico", - "nies", - "nigr", - "niji", - "nile", - "nimd", - "nimn", - "nims~t", - "nins", - "niri", - "nisj", - "nlbq1~3", - "nldr", - "nlfl", - "nlfr", - "nlge", - "nlgr", - "nlli", - "nlnb", - "nlnh", - "nlov", - "nlut", - "nlze", - "nlzh", - "no01~9", - "no10~2", - "no14~9", - "no20~2", - "np1~5", - "npba", - "npbh", - "npdh", - "npga", - "npja", - "npka", - "npko", - "nplu", - "npma", - "npme", - "npna", - "npra", - "npsa", - "npse", - "nr01~9", - "nr10~4", - "nzauk", - "nzbop", - "nzcan", - "nzcit", - "nzgis", - "nzhkb", - "nzmbh", - "nzmwt", - "nznsn", - "nzntl", - "nzota", - "nzstl", - "nztas", - "nztki", - "nzwgn", - "nzwko", - "nzwtc", - "ombj", - "ombs", - "ombu", - "omda", - "omma", - "ommu", - "omsj", - "omss", - "omwu", - "omza", - "omzu", - "pa1", - "pa10", - "pa2~9", - "paem", - "paky", - "panb", - "peama", - "peanc", - "peapu", - "peare", - "peaya", - "pecaj", - "pecal", - "pecus", - "pehuc", - "pehuv", - "peica", - "pejun", - "pelal~m", - "pelim", - "pelma", - "pelor", - "pemdd", - "pemoq", - "pepas", - "pepiu", - "pepun", - "pesam", - "petac", - "petum", - "peuca", - "pgcpk", - "pgcpm", - "pgebr", - "pgehg", - "pgepw", - "pgesw", - "pggpk", - "pghla", - "pgjwk", - "pgmba", - "pgmpl~m", - "pgmrl", - "pgncd", - "pgnik", - "pgnpp", - "pgnsb", - "pgsan", - "pgshm", - "pgwbk", - "pgwhm", - "pgwpd", - "ph00~3", - "ph05~9", - "ph10~5", - "ph40~1", - "phabr", - "phagn", - "phags", - "phakl", - "phalb", - "phant", - "phapa", - "phaur", - "phban", - "phbas", - "phben", - "phbil", - "phboh", - "phbtg", - "phbtn", - "phbuk~l", - "phcag", - "phcam~n", - "phcap", - "phcas~t", - "phcav", - "phceb", - "phcom", - "phdao", - "phdas", - "phdav", - "phdin", - "phdvo", - "pheas", - "phgui", - "phifu", - "phili", - "philn", - "phils", - "phisa", - "phkal", - "phlag", - "phlan", - "phlas", - "phley", - "phlun", - "phmad", - "phmag", - "phmas", - "phmdc", - "phmdr", - "phmou", - "phmsc", - "phmsr", - "phnco", - "phnec", - "phner", - "phnsa", - "phnue", - "phnuv", - "phpam~n", - "phplw", - "phque", - "phqui", - "phriz", - "phrom", - "phsar", - "phsco", - "phsig", - "phsle", - "phslu", - "phsor", - "phsuk", - "phsun", - "phsur", - "phtar", - "phtaw", - "phwsa", - "phzan", - "phzas", - "phzmb", - "phzsi", - "pkba", - "pkgb", - "pkis", - "pkjk", - "pkkp", - "pkpb", - "pksd", - "pkta", - "plds", - "plkp", - "pllb", - "plld", - "pllu", - "plma", - "plmz", - "plop", - "plpd", - "plpk", - "plpm", - "plsk~l", - "plwn", - "plwp", - "plzp", - "psbth", - "psdeb", - "psgza", - "pshbn", - "psjem~n", - "psjrh", - "pskys", - "psnbs", - "psngz", - "psqqa", - "psrbh", - "psrfh", - "psslt", - "pstbs", - "pstkm", - "pt01~9", - "pt10~8", - "pt20", - "pt30", - "pw002", - "pw004", - "pw010", - "pw050", - "pw100", - "pw150", - "pw212", - "pw214", - "pw218", - "pw222", - "pw224", - "pw226~8", - "pw350", - "pw370", - "py1", - "py10~6", - "py19", - "py2~9", - "pyasu", - "qada", - "qakh", - "qams", - "qara", - "qaus", - "qawa", - "qaza", - "roab", - "roag", - "roar", - "rob", - "robc", - "robh", - "robn", - "robr", - "robt", - "robv", - "robz", - "rocj", - "rocl", - "rocs~t", - "rocv", - "rodb", - "rodj", - "rogj", - "rogl", - "rogr", - "rohd", - "rohr", - "roif", - "roil", - "rois", - "romh", - "romm", - "roms", - "ront", - "root", - "roph", - "rosb", - "rosj", - "rosm", - "rosv", - "rotl~m", - "rotr", - "rovl", - "rovn", - "rovs", - "rs00~9", - "rs10~9", - "rs20~9", - "rskm", - "rsvo", - "ruad", - "rual", - "rualt", - "ruamu", - "ruark", - "ruast", - "ruba", - "rubel", - "rubry", - "rubu", - "ruce", - "ruche", - "ruchu", - "rucu", - "ruda", - "ruin", - "ruirk", - "ruiva", - "rukam", - "rukb~c", - "rukda", - "rukem", - "rukgd", - "rukgn", - "rukha", - "rukhm", - "rukir", - "rukk~l", - "ruklu", - "ruko", - "rukos", - "rukr", - "rukrs", - "rukya", - "rulen", - "rulip", - "rumag", - "rume", - "rumo", - "rumos", - "rumow", - "rumur", - "runen", - "rungr", - "runiz", - "runvs", - "ruoms", - "ruore", - "ruorl", - "ruper", - "rupnz", - "rupri", - "rupsk", - "ruros", - "rurya", - "rusa", - "rusak", - "rusam", - "rusar", - "ruse", - "rusmo", - "ruspe", - "rusta", - "rusve", - "ruta", - "rutam", - "rutom", - "rutul", - "rutve", - "ruty", - "rutyu", - "ruud", - "ruuly", - "ruvgg", - "ruvla", - "ruvlg", - "ruvor", - "ruyan", - "ruyar", - "ruyev", - "ruzab", - "rw01~5", - "sa01~9", - "sa10~2", - "sa14", - "sbce", - "sbch", - "sbct", - "sbgu", - "sbis", - "sbmk~l", - "sbrb", - "sbte", - "sbwe", - "sc01~9", - "sc10~9", - "sc20~5", - "sddc", - "sdde", - "sddn", - "sdds", - "sddw", - "sdgd", - "sdgk", - "sdgz", - "sdka", - "sdkh", - "sdkn", - "sdks", - "sdnb", - "sdno", - "sdnr", - "sdnw", - "sdrs", - "sdsi", - "seab~c", - "sebd", - "sec~i", - "sek", - "sem~o", - "ses~u", - "sew~z", - "sg01~5", - "shac", - "shhl", - "shta", - "si001~9", - "si010~9", - "si020~9", - "si030~9", - "si040~9", - "si050~9", - "si060~9", - "si070~9", - "si080~9", - "si090~9", - "si100~9", - "si110~9", - "si120~9", - "si130~9", - "si140~4", - "si146~9", - "si150~9", - "si160~9", - "si170~9", - "si180~9", - "si190~9", - "si200~9", - "si210~2", - "skbc", - "skbl", - "skki", - "skni", - "skpv", - "skta", - "sktc", - "skzi", - "sle", - "sln", - "sls", - "slw", - "sm01~9", - "sndb", - "sndk", - "snfk", - "snka", - "snkd~e", - "snkl", - "snlg", - "snmt", - "snse", - "snsl", - "sntc", - "snth", - "snzg", - "soaw", - "sobk", - "sobn", - "sobr", - "soby", - "soga", - "soge", - "sohi", - "sojd", - "sojh", - "somu", - "sonu", - "sosa", - "sosd", - "sosh", - "soso", - "soto", - "sowo", - "srbr", - "srcm", - "srcr", - "srma", - "srni", - "srpm", - "srpr", - "srsa", - "srsi", - "srwa", - "ssbn", - "ssbw", - "ssec", - "ssee", - "ssew", - "ssjg", - "sslk", - "ssnu", - "ssuy", - "sswr", - "stp", - "sts", - "svah", - "svca", - "svch", - "svcu", - "svli", - "svmo", - "svpa", - "svsa", - "svsm", - "svso", - "svss", - "svsv", - "svun", - "svus", - "sydi", - "sydr", - "sydy", - "syha", - "syhi", - "syhl~m", - "syid", - "syla", - "syqu", - "syra", - "syrd", - "sysu", - "syta", - "szhh", - "szlu", - "szma", - "szsh", - "tdba", - "tdbg", - "tdbo", - "tdcb", - "tdee", - "tdeo", - "tdgr", - "tdhl", - "tdka", - "tdlc", - "tdlo", - "tdlr", - "tdma", - "tdmc", - "tdme", - "tdmo", - "tdnd", - "tdod", - "tdsa", - "tdsi", - "tdta", - "tdti", - "tdwf", - "tgc", - "tgk", - "tgm", - "tgp", - "tgs", - "th10~9", - "th20~7", - "th30~9", - "th40~9", - "th50~8", - "th60~7", - "th70~7", - "th80~6", - "th90~6", - "ths", - "tjdu", - "tjgb", - "tjkt", - "tjsu", - "tlal", - "tlan", - "tlba", - "tlbo", - "tlco", - "tldi", - "tler", - "tlla", - "tlli", - "tlmf", - "tlmt", - "tloe", - "tlvi", - "tma~b", - "tmd", - "tml~m", - "tms", - "tn11~4", - "tn21~3", - "tn31~4", - "tn41~3", - "tn51~3", - "tn61", - "tn71~3", - "tn81~3", - "to01~5", - "tr01~9", - "tr10~9", - "tr20~9", - "tr30~9", - "tr40~9", - "tr50~9", - "tr60~9", - "tr70~9", - "tr80~1", - "ttari", - "ttcha", - "ttctt", - "ttdmn", - "ttmrc", - "ttped", - "ttpos", - "ttprt", - "ttptf", - "ttsfo", - "ttsge", - "ttsip", - "ttsjl", - "tttob", - "tttup", - "tvfun", - "tvnit", - "tvnkf", - "tvnkl", - "tvnma", - "tvnmg", - "tvnui", - "tvvai", - "twcha", - "twcyi", - "twcyq", - "twhsq", - "twhsz", - "twhua", - "twila", - "twkee", - "twkhh", - "twkin", - "twlie", - "twmia", - "twnan", - "twnwt", - "twpen", - "twpif", - "twtao", - "twtnn", - "twtpe", - "twttt", - "twtxg", - "twyun", - "tz01~9", - "tz10~9", - "tz20~9", - "tz30", - "ua05", - "ua07", - "ua09", - "ua12", - "ua14", - "ua18", - "ua21", - "ua23", - "ua26", - "ua30", - "ua32", - "ua35", - "ua40", - "ua43", - "ua46", - "ua48", - "ua51", - "ua53", - "ua56", - "ua59", - "ua61", - "ua63", - "ua65", - "ua68", - "ua71", - "ua74", - "ua77", - "ug101~9", - "ug110~9", - "ug120~4", - "ug201~9", - "ug210~9", - "ug220~9", - "ug230~2", - "ug301~9", - "ug310~9", - "ug320~9", - "ug330~1", - "ug401~9", - "ug410~9", - "ug420~5", - "ugc", - "uge", - "ugn", - "ugw", - "um67", - "um71", - "um76", - "um79", - "um81", - "um84", - "um86", - "um89", - "um95", - "usak~l", - "usar", - "usaz", - "usca", - "usco", - "usct", - "usdc", - "usde", - "usfl", - "usga", - "ushi", - "usia", - "usid", - "usil", - "usin", - "usks", - "usky", - "usla", - "usma", - "usmd~e", - "usmi", - "usmn~o", - "usms~t", - "usnc~e", - "usnh", - "usnj", - "usnm", - "usnv", - "usny", - "usoh", - "usok", - "usor", - "uspa", - "usri", - "ussc~d", - "ustn", - "ustx", - "usut", - "usva", - "usvt", - "uswa", - "uswi", - "uswv", - "uswy", - "uyar", - "uyca", - "uycl", - "uyco", - "uydu", - "uyfd", - "uyfs", - "uyla", - "uyma", - "uymo", - "uypa", - "uyrn~o", - "uyrv", - "uysa", - "uysj", - "uyso", - "uyta", - "uytt", - "uzan", - "uzbu", - "uzfa", - "uzji", - "uzng", - "uznw", - "uzqa", - "uzqr", - "uzsa", - "uzsi", - "uzsu", - "uztk", - "uzto", - "uzxo", - "vc01~6", - "vea~p", - "ver~z", - "vn01~7", - "vn09", - "vn13~4", - "vn18", - "vn20~9", - "vn30~7", - "vn39", - "vn40~1", - "vn43~7", - "vn49", - "vn50~9", - "vn61", - "vn63", - "vn66~9", - "vn70~3", - "vnct", - "vndn", - "vnhn", - "vnhp", - "vnsg", - "vumap", - "vupam", - "vusam", - "vusee", - "vutae", - "vutob", - "wfal", - "wfsg", - "wfuv", - "wsaa", - "wsal", - "wsat", - "wsfa", - "wsge", - "wsgi", - "wspa", - "wssa", - "wstu", - "wsvf", - "wsvs", - "yeab", - "yead", - "yeam", - "yeba", - "yeda", - "yedh", - "yehd", - "yehj", - "yehu", - "yeib", - "yeja", - "yela", - "yema", - "yemr", - "yemw", - "yera", - "yesa", - "yesd", - "yesh", - "yesn", - "yesu", - "yeta", - "zaec", - "zafs", - "zagt", - "zalp", - "zamp", - "zanc", - "zanl", - "zanw", - "zawc", - "zm01~9", - "zm10", - "zwbu", - "zwha", - "zwma", - "zwmc", - "zwme", - "zwmi", - "zwmn", - "zwms", - "zwmv~w", - } - unknown{ - "aczzzz", - "adzzzz", - "aezzzz", - "afzzzz", - "agzzzz", - "aizzzz", - "alzzzz", - "amzzzz", - "aozzzz", - "aqzzzz", - "arzzzz", - "aszzzz", - "atzzzz", - "auzzzz", - "awzzzz", - "axzzzz", - "azzzzz", - "bazzzz", - "bbzzzz", - "bdzzzz", - "bezzzz", - "bfzzzz", - "bgzzzz", - "bhzzzz", - "bizzzz", - "bjzzzz", - "blzzzz", - "bmzzzz", - "bnzzzz", - "bozzzz", - "bqzzzz", - "brzzzz", - "bszzzz", - "btzzzz", - "bvzzzz", - "bwzzzz", - "byzzzz", - "bzzzzz", - "cazzzz", - "cczzzz", - "cdzzzz", - "cfzzzz", - "cgzzzz", - "chzzzz", - "cizzzz", - "ckzzzz", - "clzzzz", - "cmzzzz", - "cnzzzz", - "cozzzz", - "cpzzzz", - "crzzzz", - "cuzzzz", - "cvzzzz", - "cwzzzz", - "cxzzzz", - "cyzzzz", - "czzzzz", - "dezzzz", - "dgzzzz", - "djzzzz", - "dkzzzz", - "dmzzzz", - "dozzzz", - "dzzzzz", - "eazzzz", - "eczzzz", - "eezzzz", - "egzzzz", - "ehzzzz", - "erzzzz", - "eszzzz", - "etzzzz", - "fizzzz", - "fjzzzz", - "fkzzzz", - "fmzzzz", - "fozzzz", - "frzzzz", - "gazzzz", - "gbzzzz", - "gdzzzz", - "gezzzz", - "gfzzzz", - "ggzzzz", - "ghzzzz", - "gizzzz", - "glzzzz", - "gmzzzz", - "gnzzzz", - "gpzzzz", - "gqzzzz", - "grzzzz", - "gszzzz", - "gtzzzz", - "guzzzz", - "gwzzzz", - "gyzzzz", - "hkzzzz", - "hmzzzz", - "hnzzzz", - "hrzzzz", - "htzzzz", - "huzzzz", - "iczzzz", - "idzzzz", - "iezzzz", - "ilzzzz", - "imzzzz", - "inzzzz", - "iozzzz", - "iqzzzz", - "irzzzz", - "iszzzz", - "itzzzz", - "jezzzz", - "jmzzzz", - "jozzzz", - "jpzzzz", - "kezzzz", - "kgzzzz", - "khzzzz", - "kizzzz", - "kmzzzz", - "knzzzz", - "kpzzzz", - "krzzzz", - "kwzzzz", - "kyzzzz", - "kzzzzz", - "lazzzz", - "lbzzzz", - "lczzzz", - "lizzzz", - "lkzzzz", - "lrzzzz", - "lszzzz", - "ltzzzz", - "luzzzz", - "lvzzzz", - "lyzzzz", - "mazzzz", - "mczzzz", - "mdzzzz", - "mezzzz", - "mfzzzz", - "mgzzzz", - "mhzzzz", - "mkzzzz", - "mlzzzz", - "mmzzzz", - "mnzzzz", - "mozzzz", - "mpzzzz", - "mqzzzz", - "mrzzzz", - "mszzzz", - "mtzzzz", - "muzzzz", - "mvzzzz", - "mwzzzz", - "mxzzzz", - "myzzzz", - "mzzzzz", - "nazzzz", - "nczzzz", - "nezzzz", - "nfzzzz", - "ngzzzz", - "nizzzz", - "nlzzzz", - "nozzzz", - "npzzzz", - "nrzzzz", - "nuzzzz", - "nzzzzz", - "omzzzz", - "pazzzz", - "pezzzz", - "pfzzzz", - "pgzzzz", - "phzzzz", - "pkzzzz", - "plzzzz", - "pmzzzz", - "pnzzzz", - "przzzz", - "pszzzz", - "ptzzzz", - "pwzzzz", - "pyzzzz", - "qazzzz", - "rezzzz", - "rozzzz", - "rszzzz", - "ruzzzz", - "rwzzzz", - "sazzzz", - "sbzzzz", - "sczzzz", - "sdzzzz", - "sezzzz", - "sgzzzz", - "shzzzz", - "sizzzz", - "sjzzzz", - "skzzzz", - "slzzzz", - "smzzzz", - "snzzzz", - "sozzzz", - "srzzzz", - "sszzzz", - "stzzzz", - "svzzzz", - "sxzzzz", - "syzzzz", - "szzzzz", - "tazzzz", - "tczzzz", - "tdzzzz", - "tfzzzz", - "tgzzzz", - "thzzzz", - "tjzzzz", - "tkzzzz", - "tlzzzz", - "tmzzzz", - "tnzzzz", - "tozzzz", - "trzzzz", - "ttzzzz", - "tvzzzz", - "twzzzz", - "tzzzzz", - "uazzzz", - "ugzzzz", - "umzzzz", - "uszzzz", - "uyzzzz", - "uzzzzz", - "vazzzz", - "vczzzz", - "vezzzz", - "vgzzzz", - "vizzzz", - "vnzzzz", - "vuzzzz", - "wfzzzz", - "wszzzz", - "xkzzzz", - "yezzzz", - "ytzzzz", - "zazzzz", - "zmzzzz", - "zwzzzz", - } - } - unit{ - regular{ - "acceleration-g-force", - "acceleration-meter-per-second-squared", - "angle-arc-minute", - "angle-arc-second", - "angle-degree", - "angle-radian", - "angle-revolution", - "area-acre", - "area-hectare", - "area-square-centimeter", - "area-square-foot", - "area-square-inch", - "area-square-kilometer", - "area-square-meter", - "area-square-mile", - "area-square-yard", - "concentr-karat", - "concentr-milligram-per-deciliter", - "concentr-millimole-per-liter", - "concentr-part-per-million", - "consumption-liter-per-100kilometers", - "consumption-liter-per-kilometer", - "consumption-mile-per-gallon", - "consumption-mile-per-gallon-imperial", - "digital-bit", - "digital-byte", - "digital-gigabit", - "digital-gigabyte", - "digital-kilobit", - "digital-kilobyte", - "digital-megabit", - "digital-megabyte", - "digital-terabit", - "digital-terabyte", - "duration-century", - "duration-day", - "duration-day-person", - "duration-hour", - "duration-microsecond", - "duration-millisecond", - "duration-minute", - "duration-month", - "duration-month-person", - "duration-nanosecond", - "duration-second", - "duration-week", - "duration-week-person", - "duration-year", - "duration-year-person", - "electric-ampere", - "electric-milliampere", - "electric-ohm", - "electric-volt", - "energy-calorie", - "energy-foodcalorie", - "energy-joule", - "energy-kilocalorie", - "energy-kilojoule", - "energy-kilowatt-hour", - "frequency-gigahertz", - "frequency-hertz", - "frequency-kilohertz", - "frequency-megahertz", - "length-astronomical-unit", - "length-centimeter", - "length-decimeter", - "length-fathom", - "length-foot", - "length-furlong", - "length-inch", - "length-kilometer", - "length-light-year", - "length-meter", - "length-micrometer", - "length-mile", - "length-mile-scandinavian", - "length-millimeter", - "length-nanometer", - "length-nautical-mile", - "length-parsec", - "length-picometer", - "length-yard", - "light-lux", - "mass-carat", - "mass-gram", - "mass-kilogram", - "mass-metric-ton", - "mass-microgram", - "mass-milligram", - "mass-ounce", - "mass-ounce-troy", - "mass-pound", - "mass-stone", - "mass-ton", - "power-gigawatt", - "power-horsepower", - "power-kilowatt", - "power-megawatt", - "power-milliwatt", - "power-watt", - "pressure-hectopascal", - "pressure-inch-hg", - "pressure-millibar", - "pressure-millimeter-of-mercury", - "pressure-pound-per-square-inch", - "speed-kilometer-per-hour", - "speed-knot", - "speed-meter-per-second", - "speed-mile-per-hour", - "temperature-celsius", - "temperature-fahrenheit", - "temperature-generic", - "temperature-kelvin", - "volume-acre-foot", - "volume-bushel", - "volume-centiliter", - "volume-cubic-centimeter", - "volume-cubic-foot", - "volume-cubic-inch", - "volume-cubic-kilometer", - "volume-cubic-meter", - "volume-cubic-mile", - "volume-cubic-yard", - "volume-cup", - "volume-cup-metric", - "volume-deciliter", - "volume-fluid-ounce", - "volume-gallon", - "volume-gallon-imperial", - "volume-hectoliter", - "volume-liter", - "volume-megaliter", - "volume-milliliter", - "volume-pint", - "volume-pint-metric", - "volume-quart", - "volume-tablespoon", - "volume-teaspoon", - } - } - variant{ - regular{ - "1606nict", - "1694acad", - "1901", - "1959acad", - "1994", - "1996", - "abl1943", - "alalc97", - "aluku", - "ao1990", - "arevela", - "arevmda", - "baku1926", - "balanka", - "barla", - "basiceng", - "bauddha", - "biscayan", - "biske", - "bohoric", - "boont", - "colb1945", - "cornu", - "dajnko", - "ekavsk", - "emodeng", - "fonipa", - "fonnapa", - "fonupa", - "fonxsamp", - "hepburn", - "heploc", - "hognorsk", - "ijekavsk", - "itihasa", - "jauer", - "jyutping", - "kkcor", - "kociewie", - "kscor", - "laukika", - "lipaw", - "luna1918", - "metelko", - "monoton", - "ndyuka", - "nedis", - "newfound", - "njiva", - "nulik", - "osojs", - "oxendict", - "pamaka", - "petr1708", - "pinyin", - "polyton", - "puter", - "rigik", - "rozaj", - "rumgr", - "scotland", - "scouse", - "simple", - "solba", - "sotav", - "surmiran", - "sursilv", - "sutsilv", - "tarask", - "uccor", - "ucrcor", - "ulster", - "unifon", - "vaidika", - "valencia", - "vallader", - "wadegile", - } - } - } - languageData{ - aa{ - primary{ - scripts{"Latn"} - } - secondary{ - territories{ - "DJ", - "ET", - } - } - } - ab{ - primary{ - scripts{"Cyrl"} - } - secondary{ - territories{"GE"} - } - } - abq{ - primary{ - scripts{"Cyrl"} - } - } - abr{ - primary{ - scripts{"Latn"} - } - secondary{ - territories{"GH"} - } - } - ace{ - primary{ - scripts{"Latn"} - } - secondary{ - territories{"ID"} - } - } - ach{ - primary{ - scripts{"Latn"} - } - secondary{ - territories{"UG"} - } - } - ada{ - primary{ - scripts{"Latn"} - } - } - ady{ - primary{ - scripts{"Cyrl"} - } - secondary{ - territories{"RU"} - } - } - ae{ - secondary{ - scripts{"Avst"} - } - } - aeb{ - primary{ - scripts{"Arab"} - } - secondary{ - territories{"TN"} - } - } - af{ - primary{ - scripts{"Latn"} - } - secondary{ - territories{ - "NA", - "ZA", - } - } - } - agq{ - primary{ - scripts{"Latn"} - } - } - aii{ - primary{ - scripts{"Cyrl"} - } - secondary{ - scripts{"Syrc"} - } - } - ain{ - secondary{ - scripts{ - "Kana", - "Latn", - } - } - } - ak{ - primary{ - scripts{"Latn"} - } - secondary{ - territories{"GH"} - } - } - akk{ - secondary{ - scripts{"Xsux"} - } - } - akz{ - primary{ - scripts{"Latn"} - } - } - ale{ - primary{ - scripts{"Latn"} - } - } - aln{ - primary{ - scripts{"Latn"} - } - secondary{ - territories{"XK"} - } - } - alt{ - primary{ - scripts{"Cyrl"} - } - } - am{ - primary{ - scripts{"Ethi"} - territories{"ET"} - } - } - amo{ - primary{ - scripts{"Latn"} - } - } - an{ - primary{ - scripts{"Latn"} - } - } - ang{ - secondary{ - scripts{"Latn"} - } - } - anp{ - primary{ - scripts{"Deva"} - } - } - aoz{ - primary{ - scripts{"Latn"} - } - } - ar{ - primary{ - scripts{"Arab"} - territories{ - "AE", - "BH", - "DJ", - "DZ", - "EG", - "EH", - "ER", - "IL", - "IQ", - "JO", - "KM", - "KW", - "LB", - "LY", - "MA", - "MR", - "OM", - "PS", - "QA", - "SA", - "SD", - "SO", - "SY", - "TD", - "TN", - "YE", - } - } - secondary{ - scripts{"Syrc"} - territories{ - "IR", - "SS", - } - } - } - arc{ - secondary{ - scripts{ - "Armi", - "Nbat", - "Palm", - } - } - } - arn{ - primary{ - scripts{"Latn"} - } - } - aro{ - primary{ - scripts{"Latn"} - } - } - arp{ - primary{ - scripts{"Latn"} - } - } - arq{ - primary{ - scripts{"Arab"} - } - secondary{ - territories{"DZ"} - } - } - arw{ - secondary{ - scripts{"Latn"} - } - } - ary{ - primary{ - scripts{"Arab"} - } - secondary{ - territories{"MA"} - } - } - arz{ - primary{ - scripts{"Arab"} - } - secondary{ - territories{"EG"} - } - } - as{ - primary{ - scripts{"Beng"} - } - secondary{ - territories{"IN"} - } - } - asa{ - primary{ - scripts{"Latn"} - } - } - ast{ - primary{ - scripts{"Latn"} - } - secondary{ - territories{"ES"} - } - } - atj{ - primary{ - scripts{"Latn"} - } - } - av{ - primary{ - scripts{"Cyrl"} - } - secondary{ - territories{"RU"} - } - } - avk{ - secondary{ - scripts{"Latn"} - } - } - awa{ - primary{ - scripts{"Deva"} - } - secondary{ - territories{"IN"} - } - } - ay{ - primary{ - scripts{"Latn"} - territories{"BO"} - } - } - az{ - primary{ - scripts{ - "Arab", - "Cyrl", - "Latn", - } - territories{"AZ"} - } - secondary{ - territories{ - "IQ", - "IR", - "RU", - } - } - } - ba{ - primary{ - scripts{"Cyrl"} - } - secondary{ - territories{"RU"} - } - } - bal{ - primary{ - scripts{"Arab"} - } - secondary{ - scripts{"Latn"} - territories{ - "AF", - "IR", - "PK", - } - } - } - ban{ - primary{ - scripts{"Latn"} - } - secondary{ - scripts{"Bali"} - territories{"ID"} - } - } - bap{ - primary{ - scripts{"Deva"} - } - } - bar{ - primary{ - scripts{"Latn"} - } - secondary{ - territories{ - "AT", - "DE", - } - } - } - bas{ - primary{ - scripts{"Latn"} - } - } - bax{ - primary{ - scripts{"Bamu"} - } - } - bbc{ - primary{ - scripts{"Latn"} - } - secondary{ - scripts{"Batk"} - territories{"ID"} - } - } - bbj{ - primary{ - scripts{"Latn"} - } - } - bci{ - primary{ - scripts{"Latn"} - } - secondary{ - territories{"CI"} - } - } - be{ - primary{ - scripts{"Cyrl"} - territories{"BY"} - } - } - bej{ - primary{ - scripts{"Arab"} - } - secondary{ - territories{"SD"} - } - } - bem{ - primary{ - scripts{"Latn"} - } - secondary{ - territories{"ZM"} - } - } - bew{ - primary{ - scripts{"Latn"} - } - secondary{ - territories{"ID"} - } - } - bez{ - primary{ - scripts{"Latn"} - } - } - bfd{ - primary{ - scripts{"Latn"} - } - } - bfq{ - primary{ - scripts{"Taml"} - } - } - bft{ - primary{ - scripts{"Arab"} - } - secondary{ - scripts{"Tibt"} - } - } - bfy{ - primary{ - scripts{"Deva"} - } - } - bg{ - primary{ - scripts{"Cyrl"} - territories{"BG"} - } - } - bgc{ - primary{ - scripts{"Deva"} - } - secondary{ - territories{"IN"} - } - } - bgn{ - primary{ - scripts{"Arab"} - } - secondary{ - territories{"PK"} - } - } - bgx{ - primary{ - scripts{"Grek"} - } - } - bhb{ - primary{ - scripts{"Deva"} - } - secondary{ - territories{"IN"} - } - } - bhi{ - primary{ - scripts{"Deva"} - } - secondary{ - territories{"IN"} - } - } - bhk{ - primary{ - scripts{"Latn"} - } - secondary{ - territories{"PH"} - } - } - bho{ - primary{ - scripts{"Deva"} - } - secondary{ - territories{ - "IN", - "MU", - "NP", - } - } - } - bi{ - primary{ - scripts{"Latn"} - territories{"VU"} - } - } - bik{ - primary{ - scripts{"Latn"} - } - secondary{ - territories{"PH"} - } - } - bin{ - primary{ - scripts{"Latn"} - } - secondary{ - territories{"NG"} - } - } - bjj{ - primary{ - scripts{"Deva"} - } - secondary{ - territories{"IN"} - } - } - bjn{ - primary{ - scripts{"Latn"} - } - secondary{ - territories{"ID"} - } - } - bjt{ - secondary{ - territories{"SN"} - } - } - bkm{ - primary{ - scripts{"Latn"} - } - } - bku{ - primary{ - scripts{"Latn"} - } - secondary{ - scripts{"Buhd"} - } - } - bla{ - primary{ - scripts{"Latn"} - } - } - blt{ - primary{ - scripts{"Tavt"} - } - } - bm{ - primary{ - scripts{ - "Latn", - "Nkoo", - } - } - secondary{ - territories{"ML"} - } - } - bmq{ - primary{ - scripts{"Latn"} - } - } - bn{ - primary{ - scripts{"Beng"} - territories{"BD"} - } - secondary{ - territories{"IN"} - } - } - bo{ - primary{ - scripts{"Tibt"} - } - secondary{ - territories{"CN"} - } - } - bpy{ - primary{ - scripts{"Beng"} - } - } - bqi{ - primary{ - scripts{"Arab"} - } - secondary{ - territories{"IR"} - } - } - bqv{ - primary{ - scripts{"Latn"} - } - } - br{ - primary{ - scripts{"Latn"} - } - } - bra{ - primary{ - scripts{"Deva"} - } - } - brh{ - primary{ - scripts{"Arab"} - } - secondary{ - scripts{"Latn"} - territories{"PK"} - } - } - brx{ - primary{ - scripts{"Deva"} - } - secondary{ - territories{"IN"} - } - } - bs{ - primary{ - scripts{ - "Cyrl", - "Latn", - } - territories{"BA"} - } - } - bsc{ - secondary{ - territories{"SN"} - } - } - bss{ - primary{ - scripts{"Latn"} - } - } - bto{ - primary{ - scripts{"Latn"} - } - } - btv{ - primary{ - scripts{"Deva"} - } - } - bua{ - primary{ - scripts{"Cyrl"} - } - } - buc{ - primary{ - scripts{"Latn"} - } - secondary{ - territories{"YT"} - } - } - bug{ - primary{ - scripts{"Latn"} - } - secondary{ - scripts{"Bugi"} - territories{"ID"} - } - } - bum{ - primary{ - scripts{"Latn"} - } - secondary{ - territories{"CM"} - } - } - bvb{ - primary{ - scripts{"Latn"} - } - } - byn{ - primary{ - scripts{"Ethi"} - } - } - byv{ - primary{ - scripts{"Latn"} - } - } - bze{ - primary{ - scripts{"Latn"} - } - } - bzx{ - primary{ - scripts{"Latn"} - } - } - ca{ - primary{ - scripts{"Latn"} - territories{"AD"} - } - secondary{ - territories{"ES"} - } - } - cad{ - primary{ - scripts{"Latn"} - } - } - car{ - primary{ - scripts{"Latn"} - } - } - cay{ - primary{ - scripts{"Latn"} - } - } - cch{ - primary{ - scripts{"Latn"} - } - } - ccp{ - primary{ - scripts{"Beng"} - } - secondary{ - scripts{"Cakm"} - } - } - ce{ - primary{ - scripts{"Cyrl"} - } - secondary{ - territories{"RU"} - } - } - ceb{ - primary{ - scripts{"Latn"} - } - secondary{ - territories{"PH"} - } - } - cgg{ - primary{ - scripts{"Latn"} - } - secondary{ - territories{"UG"} - } - } - ch{ - primary{ - scripts{"Latn"} - territories{"GU"} - } - } - chk{ - primary{ - scripts{"Latn"} - } - secondary{ - territories{"FM"} - } - } - chm{ - primary{ - scripts{"Cyrl"} - } - } - chn{ - secondary{ - scripts{"Latn"} - } - } - cho{ - primary{ - scripts{"Latn"} - } - } - chp{ - primary{ - scripts{"Latn"} - } - secondary{ - scripts{"Cans"} - } - } - chr{ - primary{ - scripts{"Cher"} - } - } - chy{ - primary{ - scripts{"Latn"} - } - } - cja{ - primary{ - scripts{"Arab"} - } - secondary{ - scripts{"Cham"} - } - } - cjm{ - primary{ - scripts{"Cham"} - } - secondary{ - scripts{"Arab"} - } - } - cjs{ - primary{ - scripts{"Cyrl"} - } - } - ckb{ - primary{ - scripts{"Arab"} - } - secondary{ - territories{ - "IQ", - "IR", - } - } - } - ckt{ - primary{ - scripts{"Cyrl"} - } - } - co{ - primary{ - scripts{"Latn"} - } - } - cop{ - secondary{ - scripts{ - "Arab", - "Copt", - "Grek", - } - } - } - cps{ - primary{ - scripts{"Latn"} - } - } - cr{ - primary{ - scripts{ - "Cans", - "Latn", - } - } - } - crh{ - primary{ - scripts{"Cyrl"} - } - } - crj{ - primary{ - scripts{"Cans"} - } - secondary{ - scripts{"Latn"} - } - } - crk{ - primary{ - scripts{"Cans"} - } - } - crl{ - primary{ - scripts{"Cans"} - } - secondary{ - scripts{"Latn"} - } - } - crm{ - primary{ - scripts{"Cans"} - } - } - crs{ - primary{ - scripts{"Latn"} - } - secondary{ - territories{"SC"} - } - } - cs{ - primary{ - scripts{"Latn"} - territories{"CZ"} - } - secondary{ - territories{"SK"} - } - } - csb{ - secondary{ - scripts{"Latn"} - territories{"PL"} - } - } - csw{ - primary{ - scripts{"Cans"} - } - } - ctd{ - primary{ - scripts{"Latn"} - } - } - cu{ - secondary{ - scripts{"Cyrl"} - } - } - cv{ - primary{ - scripts{"Cyrl"} - } - secondary{ - territories{"RU"} - } - } - cy{ - primary{ - scripts{"Latn"} - } - secondary{ - territories{"GB"} - } - } - da{ - primary{ - scripts{"Latn"} - territories{"DK"} - } - secondary{ - territories{"DE"} - } - } - dak{ - primary{ - scripts{"Latn"} - } - } - dar{ - primary{ - scripts{"Cyrl"} - } - } - dav{ - primary{ - scripts{"Latn"} - } - } - dcc{ - primary{ - scripts{"Arab"} - } - secondary{ - territories{"IN"} - } - } - de{ - primary{ - scripts{"Latn"} - territories{ - "AT", - "BE", - "CH", - "DE", - "IT", - "LI", - "LU", - } - } - secondary{ - scripts{"Runr"} - territories{ - "BR", - "CZ", - "DK", - "FR", - "GB", - "HU", - "KZ", - "NL", - "PL", - "SI", - "SK", - "US", - } - } - } - del{ - primary{ - scripts{"Latn"} - } - } - den{ - primary{ - scripts{"Latn"} - } - secondary{ - scripts{"Cans"} - } - } - dgr{ - primary{ - scripts{"Latn"} - } - } - din{ - primary{ - scripts{"Latn"} - } - } - dje{ - primary{ - scripts{"Latn"} - } - secondary{ - territories{"NE"} - } - } - dng{ - primary{ - scripts{"Cyrl"} - } - } - dnj{ - primary{ - scripts{"Latn"} - } - } - doi{ - primary{ - scripts{"Arab"} - } - secondary{ - scripts{"Takr"} - territories{"IN"} - } - } - dsb{ - primary{ - scripts{"Latn"} - } - } - dtm{ - primary{ - scripts{"Latn"} - } - } - dtp{ - primary{ - scripts{"Latn"} - } - } - dty{ - primary{ - scripts{"Deva"} - } - } - dua{ - primary{ - scripts{"Latn"} - } - } - dum{ - secondary{ - scripts{"Latn"} - } - } - dv{ - primary{ - scripts{"Thaa"} - territories{"MV"} - } - } - dyo{ - primary{ - scripts{"Latn"} - } - secondary{ - scripts{"Arab"} - territories{"SN"} - } - } - dyu{ - primary{ - scripts{"Latn"} - } - secondary{ - territories{"BF"} - } - } - dz{ - primary{ - scripts{"Tibt"} - territories{"BT"} - } - } - ebu{ - primary{ - scripts{"Latn"} - } - } - ee{ - primary{ - scripts{"Latn"} - } - secondary{ - territories{ - "GH", - "TG", - } - } - } - efi{ - primary{ - scripts{"Latn"} - } - secondary{ - territories{"NG"} - } - } - egl{ - primary{ - scripts{"Latn"} - } - } - egy{ - secondary{ - scripts{"Egyp"} - } - } - eka{ - primary{ - scripts{"Latn"} - } - } - eky{ - primary{ - scripts{"Kali"} - } - } - el{ - primary{ - scripts{"Grek"} - territories{ - "CY", - "GR", - } - } - } - en{ - primary{ - scripts{"Latn"} - territories{ - "AG", - "AI", - "AS", - "AU", - "BB", - "BI", - "BM", - "BS", - "BW", - "BZ", - "CA", - "CC", - "CK", - "CM", - "CX", - "DG", - "DM", - "ER", - "FJ", - "FK", - "FM", - "GB", - "GD", - "GG", - "GH", - "GI", - "GM", - "GU", - "GY", - "HK", - "IE", - "IM", - "IN", - "IO", - "JE", - "JM", - "KE", - "KI", - "KN", - "KY", - "LC", - "LR", - "LS", - "MG", - "MH", - "MP", - "MS", - "MT", - "MU", - "MW", - "NA", - "NF", - "NG", - "NR", - "NU", - "NZ", - "PG", - "PH", - "PK", - "PN", - "PR", - "PW", - "RW", - "SB", - "SC", - "SD", - "SG", - "SH", - "SL", - "SS", - "SX", - "SZ", - "TC", - "TK", - "TO", - "TT", - "TV", - "TZ", - "UG", - "UM", - "US", - "VC", - "VG", - "VI", - "VU", - "WS", - "ZA", - "ZM", - "ZW", - } - } - secondary{ - scripts{ - "Dsrt", - "Shaw", - } - territories{ - "AC", - "AR", - "AT", - "BA", - "BD", - "BE", - "BG", - "BR", - "CH", - "CL", - "CY", - "CZ", - "DE", - "DK", - "DZ", - "EE", - "EG", - "ES", - "ET", - "FI", - "FR", - "GR", - "HR", - "HU", - "IL", - "IQ", - "IT", - "JO", - "KZ", - "LB", - "LK", - "LT", - "LU", - "LV", - "MA", - "MX", - "MY", - "NL", - "PL", - "PT", - "RO", - "SE", - "SI", - "SK", - "TA", - "TH", - "TR", - "YE", - } - } - } - enm{ - secondary{ - scripts{"Latn"} - } - } - eo{ - primary{ - scripts{"Latn"} - } - } - es{ - primary{ - scripts{"Latn"} - territories{ - "AR", - "BO", - "CL", - "CO", - "CR", - "CU", - "DO", - "EA", - "EC", - "ES", - "GQ", - "GT", - "HN", - "IC", - "MX", - "NI", - "PA", - "PE", - "PR", - "PY", - "SV", - "UY", - "VE", - } - } - secondary{ - territories{ - "AD", - "BZ", - "DE", - "FR", - "GI", - "PH", - "PT", - "RO", - "US", - } - } - } - esu{ - primary{ - scripts{"Latn"} - } - } - et{ - primary{ - scripts{"Latn"} - territories{"EE"} - } - } - ett{ - secondary{ - scripts{ - "Ital", - "Latn", - } - } - } - eu{ - primary{ - scripts{"Latn"} - } - secondary{ - territories{"ES"} - } - } - evn{ - primary{ - scripts{"Cyrl"} - } - } - ewo{ - primary{ - scripts{"Latn"} - } - } - ext{ - primary{ - scripts{"Latn"} - } - } - fa{ - primary{ - scripts{"Arab"} - territories{ - "AF", - "IR", - } - } - secondary{ - territories{"PK"} - } - } - fan{ - primary{ - scripts{"Latn"} - } - secondary{ - territories{"GQ"} - } - } - ff{ - primary{ - scripts{"Latn"} - } - secondary{ - territories{ - "GN", - "SN", - } - } - } - ffm{ - primary{ - scripts{"Latn"} - } - secondary{ - territories{"ML"} - } - } - fi{ - primary{ - scripts{"Latn"} - territories{"FI"} - } - secondary{ - territories{ - "EE", - "SE", - } - } - } - fia{ - primary{ - scripts{"Arab"} - } - } - fil{ - primary{ - scripts{"Latn"} - territories{"PH"} - } - secondary{ - scripts{"Tglg"} - territories{"US"} - } - } - fit{ - primary{ - scripts{"Latn"} - } - } - fj{ - primary{ - scripts{"Latn"} - territories{"FJ"} - } - } - fo{ - primary{ - scripts{"Latn"} - territories{"FO"} - } - } - fon{ - primary{ - scripts{"Latn"} - } - secondary{ - territories{"BJ"} - } - } - fr{ - primary{ - scripts{"Latn"} - territories{ - "BE", - "BF", - "BI", - "BJ", - "BL", - "CA", - "CD", - "CF", - "CG", - "CH", - "CI", - "CM", - "DJ", - "DZ", - "FR", - "GA", - "GF", - "GN", - "GP", - "GQ", - "HT", - "KM", - "LU", - "MA", - "MC", - "MF", - "MG", - "ML", - "MQ", - "MU", - "NC", - "NE", - "PF", - "PM", - "RE", - "RW", - "SC", - "SN", - "SY", - "TD", - "TG", - "TN", - "VU", - "WF", - "YT", - } - } - secondary{ - scripts{"Dupl"} - territories{ - "DE", - "GB", - "IT", - "NL", - "PT", - "RO", - "TF", - "US", - } - } - } - frc{ - primary{ - scripts{"Latn"} - } - } - frm{ - secondary{ - scripts{"Latn"} - } - } - fro{ - secondary{ - scripts{"Latn"} - } - } - frp{ - primary{ - scripts{"Latn"} - } - } - frr{ - primary{ - scripts{"Latn"} - } - } - frs{ - primary{ - scripts{"Latn"} - } - } - fud{ - primary{ - scripts{"Latn"} - } - secondary{ - territories{"WF"} - } - } - fuq{ - primary{ - scripts{"Latn"} - } - secondary{ - territories{"NE"} - } - } - fur{ - primary{ - scripts{"Latn"} - } - } - fuv{ - primary{ - scripts{"Latn"} - } - secondary{ - territories{"NG"} - } - } - fvr{ - primary{ - scripts{"Latn"} - } - } - fy{ - primary{ - scripts{"Latn"} - } - secondary{ - territories{"NL"} - } - } - ga{ - primary{ - scripts{"Latn"} - territories{"IE"} - } - secondary{ - territories{"GB"} - } - } - gaa{ - primary{ - scripts{"Latn"} - } - secondary{ - territories{"GH"} - } - } - gag{ - primary{ - scripts{"Latn"} - } - secondary{ - scripts{"Cyrl"} - } - } - gan{ - primary{ - scripts{"Hans"} - } - secondary{ - territories{"CN"} - } - } - gay{ - primary{ - scripts{"Latn"} - } - } - gba{ - primary{ - scripts{"Arab"} - } - } - gbm{ - primary{ - scripts{"Deva"} - } - secondary{ - territories{"IN"} - } - } - gbz{ - primary{ - scripts{"Arab"} - } - } - gcr{ - primary{ - scripts{"Latn"} - } - secondary{ - territories{"GF"} - } - } - gd{ - primary{ - scripts{"Latn"} - } - secondary{ - territories{"GB"} - } - } - gez{ - secondary{ - scripts{"Ethi"} - } - } - ggn{ - primary{ - scripts{"Deva"} - } - secondary{ - scripts{"Latn"} - } - } - gil{ - primary{ - scripts{"Latn"} - territories{"KI"} - } - } - gjk{ - primary{ - scripts{"Arab"} - } - } - gju{ - primary{ - scripts{"Arab"} - } - } - gl{ - primary{ - scripts{"Latn"} - } - secondary{ - territories{"ES"} - } - } - gld{ - primary{ - scripts{"Cyrl"} - } - } - glk{ - primary{ - scripts{"Arab"} - } - secondary{ - territories{"IR"} - } - } - gmh{ - secondary{ - scripts{"Latn"} - } - } - gn{ - primary{ - scripts{"Latn"} - territories{"PY"} - } - } - goh{ - secondary{ - scripts{"Latn"} - } - } - gom{ - primary{ - scripts{"Deva"} - } - secondary{ - territories{"IN"} - } - } - gon{ - primary{ - scripts{ - "Deva", - "Telu", - } - } - secondary{ - territories{"IN"} - } - } - gor{ - primary{ - scripts{"Latn"} - } - secondary{ - territories{"ID"} - } - } - gos{ - primary{ - scripts{"Latn"} - } - } - got{ - secondary{ - scripts{"Goth"} - } - } - grb{ - primary{ - scripts{"Latn"} - } - } - grc{ - secondary{ - scripts{ - "Cprt", - "Grek", - "Linb", - } - } - } - grt{ - primary{ - scripts{"Beng"} - } - } - gsw{ - primary{ - scripts{"Latn"} - territories{ - "CH", - "LI", - } - } - secondary{ - territories{"DE"} - } - } - gu{ - primary{ - scripts{"Gujr"} - } - secondary{ - territories{"IN"} - } - } - gub{ - primary{ - scripts{"Latn"} - } - } - guc{ - primary{ - scripts{"Latn"} - } - } - gur{ - primary{ - scripts{"Latn"} - } - } - guz{ - primary{ - scripts{"Latn"} - } - secondary{ - territories{"KE"} - } - } - gv{ - primary{ - scripts{"Latn"} - territories{"IM"} - } - } - gvr{ - primary{ - scripts{"Deva"} - } - } - gwi{ - primary{ - scripts{"Latn"} - } - } - ha{ - primary{ - scripts{ - "Arab", - "Latn", - } - } - secondary{ - territories{ - "NE", - "NG", - } - } - } - hai{ - primary{ - scripts{"Latn"} - } - } - hak{ - primary{ - scripts{"Hans"} - } - secondary{ - territories{"CN"} - } - } - haw{ - primary{ - scripts{"Latn"} - } - secondary{ - territories{"US"} - } - } - haz{ - primary{ - scripts{"Arab"} - } - secondary{ - territories{"AF"} - } - } - he{ - primary{ - scripts{"Hebr"} - territories{"IL"} - } - } - hi{ - primary{ - scripts{"Deva"} - territories{"IN"} - } - secondary{ - scripts{"Mahj"} - territories{ - "FJ", - "ZA", - } - } - } - hif{ - primary{ - scripts{ - "Deva", - "Latn", - } - territories{"FJ"} - } - } - hil{ - primary{ - scripts{"Latn"} - } - secondary{ - territories{"PH"} - } - } - hit{ - secondary{ - scripts{"Xsux"} - } - } - hmd{ - primary{ - scripts{"Plrd"} - } - } - hmn{ - primary{ - scripts{"Latn"} - } - secondary{ - scripts{"Hmng"} - } - } - hnd{ - primary{ - scripts{"Arab"} - } - } - hne{ - primary{ - scripts{"Deva"} - } - secondary{ - territories{"IN"} - } - } - hnj{ - primary{ - scripts{"Laoo"} - } - } - hnn{ - primary{ - scripts{"Latn"} - } - secondary{ - scripts{"Hano"} - } - } - hno{ - primary{ - scripts{"Arab"} - } - secondary{ - territories{"PK"} - } - } - ho{ - primary{ - scripts{"Latn"} - territories{"PG"} - } - } - hoc{ - primary{ - scripts{"Deva"} - } - secondary{ - scripts{"Wara"} - territories{"IN"} - } - } - hoj{ - primary{ - scripts{"Deva"} - } - secondary{ - territories{"IN"} - } - } - hop{ - primary{ - scripts{"Latn"} - } - } - hr{ - primary{ - scripts{"Latn"} - territories{ - "BA", - "HR", - } - } - secondary{ - territories{ - "AT", - "RS", - "SI", - } - } - } - hsb{ - primary{ - scripts{"Latn"} - } - } - hsn{ - primary{ - scripts{"Hans"} - } - secondary{ - territories{"CN"} - } - } - ht{ - primary{ - scripts{"Latn"} - territories{"HT"} - } - } - hu{ - primary{ - scripts{"Latn"} - territories{"HU"} - } - secondary{ - territories{ - "AT", - "RO", - "RS", - } - } - } - hup{ - primary{ - scripts{"Latn"} - } - } - hy{ - primary{ - scripts{"Armn"} - territories{"AM"} - } - secondary{ - territories{"RU"} - } - } - hz{ - primary{ - scripts{"Latn"} - } - } - ia{ - secondary{ - scripts{"Latn"} - } - } - iba{ - primary{ - scripts{"Latn"} - } - } - ibb{ - primary{ - scripts{"Latn"} - } - secondary{ - territories{"NG"} - } - } - id{ - primary{ - scripts{"Latn"} - territories{"ID"} - } - secondary{ - scripts{"Arab"} - } - } - ig{ - primary{ - scripts{"Latn"} - } - secondary{ - territories{"NG"} - } - } - ii{ - primary{ - scripts{"Yiii"} - } - secondary{ - scripts{"Latn"} - territories{"CN"} - } - } - ik{ - primary{ - scripts{"Latn"} - } - } - ikt{ - primary{ - scripts{"Latn"} - } - secondary{ - territories{"CA"} - } - } - ilo{ - primary{ - scripts{"Latn"} - } - secondary{ - territories{"PH"} - } - } - inh{ - primary{ - scripts{"Cyrl"} - } - secondary{ - scripts{ - "Arab", - "Latn", - } - territories{"RU"} - } - } - is{ - primary{ - scripts{"Latn"} - territories{"IS"} - } - } - it{ - primary{ - scripts{"Latn"} - territories{ - "CH", - "IT", - "SM", - } - } - secondary{ - territories{ - "DE", - "FR", - "HR", - "MT", - "US", - "VA", - } - } - } - iu{ - primary{ - scripts{ - "Cans", - "Latn", - } - } - secondary{ - territories{"CA"} - } - } - izh{ - primary{ - scripts{"Latn"} - } - } - ja{ - primary{ - scripts{"Jpan"} - territories{"JP"} - } - } - jam{ - primary{ - scripts{"Latn"} - } - secondary{ - territories{"JM"} - } - } - jgo{ - primary{ - scripts{"Latn"} - } - } - jmc{ - primary{ - scripts{"Latn"} - } - } - jml{ - primary{ - scripts{"Deva"} - } - secondary{ - territories{"NP"} - } - } - jpr{ - primary{ - scripts{"Hebr"} - } - } - jrb{ - primary{ - scripts{"Hebr"} - } - } - jut{ - secondary{ - scripts{"Latn"} - } - } - jv{ - primary{ - scripts{"Latn"} - } - secondary{ - scripts{"Java"} - territories{"ID"} - } - } - ka{ - primary{ - scripts{"Geor"} - territories{"GE"} - } - } - kaa{ - primary{ - scripts{"Cyrl"} - } - } - kab{ - primary{ - scripts{"Latn"} - } - secondary{ - territories{"DZ"} - } - } - kac{ - primary{ - scripts{"Latn"} - } - } - kaj{ - primary{ - scripts{"Latn"} - } - } - kam{ - primary{ - scripts{"Latn"} - } - secondary{ - territories{"KE"} - } - } - kao{ - primary{ - scripts{"Latn"} - } - } - kbd{ - primary{ - scripts{"Cyrl"} - } - secondary{ - territories{"RU"} - } - } - kca{ - primary{ - scripts{"Cyrl"} - } - } - kcg{ - primary{ - scripts{"Latn"} - } - } - kck{ - primary{ - scripts{"Latn"} - } - } - kde{ - primary{ - scripts{"Latn"} - } - secondary{ - territories{"TZ"} - } - } - kdt{ - primary{ - scripts{"Thai"} - } - } - kea{ - primary{ - scripts{"Latn"} - } - secondary{ - territories{"CV"} - } - } - kfo{ - primary{ - scripts{"Latn"} - } - } - kfr{ - primary{ - scripts{"Deva"} - } - } - kfy{ - primary{ - scripts{"Deva"} - } - secondary{ - territories{"IN"} - } - } - kg{ - primary{ - scripts{"Latn"} - } - secondary{ - territories{"CD"} - } - } - kge{ - primary{ - scripts{"Latn"} - } - } - kgp{ - primary{ - scripts{"Latn"} - } - } - kha{ - primary{ - scripts{"Latn"} - } - secondary{ - scripts{"Beng"} - territories{"IN"} - } - } - khb{ - primary{ - scripts{"Talu"} - } - } - khn{ - primary{ - scripts{"Deva"} - } - secondary{ - territories{"IN"} - } - } - khq{ - primary{ - scripts{"Latn"} - } - } - kht{ - primary{ - scripts{"Mymr"} - } - } - khw{ - primary{ - scripts{"Arab"} - } - } - ki{ - primary{ - scripts{"Latn"} - } - secondary{ - territories{"KE"} - } - } - kiu{ - primary{ - scripts{"Latn"} - } - } - kj{ - primary{ - scripts{"Latn"} - } - secondary{ - territories{"NA"} - } - } - kjg{ - primary{ - scripts{"Laoo"} - } - secondary{ - scripts{"Latn"} - } - } - kjh{ - primary{ - scripts{"Cyrl"} - } - } - kk{ - primary{ - scripts{ - "Arab", - "Cyrl", - } - territories{"KZ"} - } - secondary{ - territories{"CN"} - } - } - kkj{ - primary{ - scripts{"Latn"} - } - } - kl{ - primary{ - scripts{"Latn"} - territories{"GL"} - } - secondary{ - territories{"DK"} - } - } - kln{ - primary{ - scripts{"Latn"} - } - secondary{ - territories{"KE"} - } - } - km{ - primary{ - scripts{"Khmr"} - territories{"KH"} - } - } - kmb{ - primary{ - scripts{"Latn"} - } - secondary{ - territories{"AO"} - } - } - kn{ - primary{ - scripts{"Knda"} - } - secondary{ - territories{"IN"} - } - } - knf{ - secondary{ - territories{"SN"} - } - } - ko{ - primary{ - scripts{"Kore"} - territories{ - "KP", - "KR", - } - } - secondary{ - territories{"CN"} - } - } - koi{ - primary{ - scripts{"Cyrl"} - } - secondary{ - territories{"RU"} - } - } - kok{ - primary{ - scripts{"Deva"} - } - secondary{ - territories{"IN"} - } - } - kos{ - primary{ - scripts{"Latn"} - } - } - kpe{ - primary{ - scripts{"Latn"} - } - } - kpy{ - primary{ - scripts{"Cyrl"} - } - } - kr{ - primary{ - scripts{"Latn"} - } - } - krc{ - primary{ - scripts{"Cyrl"} - } - secondary{ - territories{"RU"} - } - } - kri{ - primary{ - scripts{"Latn"} - } - secondary{ - territories{"SL"} - } - } - krj{ - primary{ - scripts{"Latn"} - } - } - krl{ - primary{ - scripts{"Latn"} - } - } - kru{ - primary{ - scripts{"Deva"} - } - secondary{ - territories{"IN"} - } - } - ks{ - primary{ - scripts{ - "Arab", - "Deva", - } - } - secondary{ - territories{"IN"} - } - } - ksb{ - primary{ - scripts{"Latn"} - } - } - ksf{ - primary{ - scripts{"Latn"} - } - } - ksh{ - primary{ - scripts{"Latn"} - } - } - ku{ - primary{ - scripts{ - "Arab", - "Cyrl", - "Latn", - } - } - secondary{ - territories{ - "SY", - "TR", - } - } - } - kum{ - primary{ - scripts{"Cyrl"} - } - secondary{ - territories{"RU"} - } - } - kut{ - primary{ - scripts{"Latn"} - } - } - kv{ - primary{ - scripts{"Cyrl"} - } - secondary{ - scripts{"Perm"} - territories{"RU"} - } - } - kvr{ - primary{ - scripts{"Latn"} - } - } - kvx{ - primary{ - scripts{"Arab"} - } - } - kw{ - primary{ - scripts{"Latn"} - } - } - kxm{ - primary{ - scripts{"Thai"} - } - secondary{ - territories{"TH"} - } - } - kxp{ - primary{ - scripts{"Arab"} - } - } - ky{ - primary{ - scripts{ - "Arab", - "Cyrl", - "Latn", - } - territories{"KG"} - } - } - kyu{ - primary{ - scripts{"Kali"} - } - } - la{ - secondary{ - scripts{"Latn"} - territories{"VA"} - } - } - lab{ - secondary{ - scripts{"Lina"} - } - } - lad{ - primary{ - scripts{"Hebr"} - } - } - lag{ - primary{ - scripts{"Latn"} - } - } - lah{ - primary{ - scripts{"Arab"} - } - secondary{ - territories{"PK"} - } - } - laj{ - primary{ - scripts{"Latn"} - } - secondary{ - territories{"UG"} - } - } - lam{ - primary{ - scripts{"Latn"} - } - } - lb{ - primary{ - scripts{"Latn"} - territories{"LU"} - } - } - lbe{ - primary{ - scripts{"Cyrl"} - } - secondary{ - territories{"RU"} - } - } - lbw{ - primary{ - scripts{"Latn"} - } - } - lcp{ - primary{ - scripts{"Thai"} - } - } - lep{ - primary{ - scripts{"Lepc"} - } - } - lez{ - primary{ - scripts{"Cyrl"} - } - secondary{ - scripts{"Aghb"} - territories{"RU"} - } - } - lfn{ - secondary{ - scripts{ - "Cyrl", - "Latn", - } - } - } - lg{ - primary{ - scripts{"Latn"} - } - secondary{ - territories{"UG"} - } - } - li{ - primary{ - scripts{"Latn"} - } - } - lif{ - primary{ - scripts{ - "Deva", - "Limb", - } - } - } - lij{ - primary{ - scripts{"Latn"} - } - } - lis{ - primary{ - scripts{"Lisu"} - } - } - liv{ - secondary{ - scripts{"Latn"} - } - } - ljp{ - primary{ - scripts{"Latn"} - } - secondary{ - territories{"ID"} - } - } - lki{ - primary{ - scripts{"Arab"} - } - } - lkt{ - primary{ - scripts{"Latn"} - } - } - lmn{ - primary{ - scripts{"Telu"} - } - secondary{ - territories{"IN"} - } - } - lmo{ - primary{ - scripts{"Latn"} - } - } - ln{ - primary{ - scripts{"Latn"} - } - secondary{ - territories{"CD"} - } - } - lo{ - primary{ - scripts{"Laoo"} - territories{"LA"} - } - } - lol{ - primary{ - scripts{"Latn"} - } - } - loz{ - primary{ - scripts{"Latn"} - } - } - lrc{ - primary{ - scripts{"Arab"} - } - secondary{ - territories{"IR"} - } - } - lt{ - primary{ - scripts{"Latn"} - territories{"LT"} - } - secondary{ - territories{"PL"} - } - } - ltg{ - primary{ - scripts{"Latn"} - } - } - lu{ - primary{ - scripts{"Latn"} - } - secondary{ - territories{"CD"} - } - } - lua{ - primary{ - scripts{"Latn"} - } - secondary{ - territories{"CD"} - } - } - lui{ - primary{ - scripts{"Latn"} - } - } - lun{ - primary{ - scripts{"Latn"} - } - } - luo{ - primary{ - scripts{"Latn"} - } - secondary{ - territories{"KE"} - } - } - lus{ - primary{ - scripts{"Beng"} - } - } - lut{ - secondary{ - scripts{"Latn"} - } - } - luy{ - primary{ - scripts{"Latn"} - } - secondary{ - territories{"KE"} - } - } - luz{ - primary{ - scripts{"Arab"} - } - secondary{ - territories{"IR"} - } - } - lv{ - primary{ - scripts{"Latn"} - territories{"LV"} - } - } - lwl{ - primary{ - scripts{"Thai"} - } - } - lzh{ - secondary{ - scripts{"Hans"} - } - } - lzz{ - primary{ - scripts{ - "Geor", - "Latn", - } - } - } - mad{ - primary{ - scripts{"Latn"} - } - secondary{ - territories{"ID"} - } - } - maf{ - primary{ - scripts{"Latn"} - } - } - mag{ - primary{ - scripts{"Deva"} - } - secondary{ - territories{"IN"} - } - } - mai{ - primary{ - scripts{"Deva"} - } - secondary{ - scripts{"Tirh"} - territories{ - "IN", - "NP", - } - } - } - mak{ - primary{ - scripts{"Latn"} - } - secondary{ - scripts{"Bugi"} - territories{"ID"} - } - } - man{ - primary{ - scripts{ - "Latn", - "Nkoo", - } - } - secondary{ - territories{ - "GM", - "GN", - } - } - } - mas{ - primary{ - scripts{"Latn"} - } - } - maz{ - primary{ - scripts{"Latn"} - } - } - mdf{ - primary{ - scripts{"Cyrl"} - } - secondary{ - territories{"RU"} - } - } - mdh{ - primary{ - scripts{"Latn"} - } - secondary{ - territories{"PH"} - } - } - mdr{ - primary{ - scripts{"Latn"} - } - secondary{ - scripts{"Bugi"} - } - } - mdt{ - primary{ - scripts{"Latn"} - } - } - men{ - primary{ - scripts{"Latn"} - } - secondary{ - scripts{"Mend"} - territories{"SL"} - } - } - mer{ - primary{ - scripts{"Latn"} - } - secondary{ - territories{"KE"} - } - } - mey{ - secondary{ - territories{"SN"} - } - } - mfa{ - primary{ - scripts{"Arab"} - } - secondary{ - territories{"TH"} - } - } - mfe{ - primary{ - scripts{"Latn"} - } - secondary{ - territories{"MU"} - } - } - mfv{ - secondary{ - territories{"SN"} - } - } - mg{ - primary{ - scripts{"Latn"} - territories{"MG"} - } - } - mgh{ - primary{ - scripts{"Latn"} - } - secondary{ - territories{"MZ"} - } - } - mgo{ - primary{ - scripts{"Latn"} - } - } - mgp{ - primary{ - scripts{"Deva"} - } - } - mgy{ - primary{ - scripts{"Latn"} - } - } - mh{ - primary{ - scripts{"Latn"} - territories{"MH"} - } - } - mi{ - primary{ - scripts{"Latn"} - territories{"NZ"} - } - } - mic{ - primary{ - scripts{"Latn"} - } - } - min{ - primary{ - scripts{"Latn"} - } - secondary{ - territories{"ID"} - } - } - mk{ - primary{ - scripts{"Cyrl"} - territories{"MK"} - } - } - ml{ - primary{ - scripts{"Mlym"} - } - secondary{ - territories{"IN"} - } - } - mls{ - primary{ - scripts{"Latn"} - } - } - mn{ - primary{ - scripts{ - "Cyrl", - "Mong", - } - territories{"MN"} - } - secondary{ - scripts{"Phag"} - territories{"CN"} - } - } - mnc{ - secondary{ - scripts{"Mong"} - } - } - mni{ - primary{ - scripts{"Beng"} - } - secondary{ - scripts{"Mtei"} - territories{"IN"} - } - } - mns{ - primary{ - scripts{"Cyrl"} - } - } - mnw{ - primary{ - scripts{"Mymr"} - } - } - moe{ - primary{ - scripts{"Latn"} - } - } - moh{ - primary{ - scripts{"Latn"} - } - } - mos{ - primary{ - scripts{"Latn"} - } - secondary{ - territories{"BF"} - } - } - mr{ - primary{ - scripts{"Deva"} - } - secondary{ - scripts{"Modi"} - territories{"IN"} - } - } - mrd{ - primary{ - scripts{"Deva"} - } - } - mrj{ - primary{ - scripts{"Cyrl"} - } - } - mro{ - primary{ - scripts{"Latn"} - } - secondary{ - scripts{"Mroo"} - } - } - ms{ - primary{ - scripts{ - "Arab", - "Latn", - } - territories{ - "BN", - "MY", - "SG", - } - } - secondary{ - territories{ - "CC", - "ID", - } - } - } - mt{ - primary{ - scripts{"Latn"} - territories{"MT"} - } - } - mtr{ - primary{ - scripts{"Deva"} - } - secondary{ - territories{"IN"} - } - } - mua{ - primary{ - scripts{"Latn"} - } - } - mus{ - primary{ - scripts{"Latn"} - } - } - mvy{ - primary{ - scripts{"Arab"} - } - } - mwk{ - primary{ - scripts{"Latn"} - } - } - mwl{ - primary{ - scripts{"Latn"} - } - } - mwr{ - primary{ - scripts{"Deva"} - } - secondary{ - territories{"IN"} - } - } - mwv{ - primary{ - scripts{"Latn"} - } - } - mxc{ - primary{ - scripts{"Latn"} - } - } - my{ - primary{ - scripts{"Mymr"} - territories{"MM"} - } - } - myv{ - primary{ - scripts{"Cyrl"} - } - secondary{ - territories{"RU"} - } - } - myx{ - primary{ - scripts{"Latn"} - } - secondary{ - territories{"UG"} - } - } - myz{ - secondary{ - scripts{"Mand"} - } - } - mzn{ - primary{ - scripts{"Arab"} - } - secondary{ - territories{"IR"} - } - } - na{ - primary{ - scripts{"Latn"} - territories{"NR"} - } - } - nan{ - primary{ - scripts{"Hans"} - } - secondary{ - territories{"CN"} - } - } - nap{ - primary{ - scripts{"Latn"} - } - } - naq{ - primary{ - scripts{"Latn"} - } - } - nb{ - primary{ - scripts{"Latn"} - territories{ - "NO", - "SJ", - } - } - } - nch{ - primary{ - scripts{"Latn"} - } - } - nd{ - primary{ - scripts{"Latn"} - territories{"ZW"} - } - } - ndc{ - primary{ - scripts{"Latn"} - } - secondary{ - territories{"MZ"} - } - } - nds{ - primary{ - scripts{"Latn"} - } - secondary{ - territories{ - "DE", - "NL", - } - } - } - ne{ - primary{ - scripts{"Deva"} - territories{"NP"} - } - secondary{ - territories{"IN"} - } - } - new{ - primary{ - scripts{"Deva"} - } - secondary{ - territories{"NP"} - } - } - ng{ - primary{ - scripts{"Latn"} - } - secondary{ - territories{"NA"} - } - } - ngl{ - primary{ - scripts{"Latn"} - } - secondary{ - territories{"MZ"} - } - } - nhe{ - primary{ - scripts{"Latn"} - } - } - nhw{ - primary{ - scripts{"Latn"} - } - } - nia{ - primary{ - scripts{"Latn"} - } - } - nij{ - primary{ - scripts{"Latn"} - } - } - niu{ - primary{ - scripts{"Latn"} - territories{"NU"} - } - } - njo{ - primary{ - scripts{"Latn"} - } - } - nl{ - primary{ - scripts{"Latn"} - territories{ - "AW", - "BE", - "BQ", - "CW", - "NL", - "SR", - "SX", - } - } - secondary{ - territories{"DE"} - } - } - nmg{ - primary{ - scripts{"Latn"} - } - } - nn{ - primary{ - scripts{"Latn"} - territories{"NO"} - } - } - nnh{ - primary{ - scripts{"Latn"} - } - } - nod{ - primary{ - scripts{"Lana"} - } - secondary{ - territories{"TH"} - } - } - noe{ - primary{ - scripts{"Deva"} - } - secondary{ - territories{"IN"} - } - } - nog{ - primary{ - scripts{"Cyrl"} - } - } - non{ - secondary{ - scripts{"Runr"} - } - } - nov{ - secondary{ - scripts{"Latn"} - } - } - nqo{ - primary{ - scripts{"Nkoo"} - } - } - nr{ - primary{ - scripts{"Latn"} - } - secondary{ - territories{"ZA"} - } - } - nsk{ - primary{ - scripts{"Cans"} - } - secondary{ - scripts{"Latn"} - } - } - nso{ - primary{ - scripts{"Latn"} - } - secondary{ - territories{"ZA"} - } - } - nus{ - primary{ - scripts{"Latn"} - } - } - nv{ - primary{ - scripts{"Latn"} - } - } - nxq{ - primary{ - scripts{"Latn"} - } - } - ny{ - primary{ - scripts{"Latn"} - territories{"MW"} - } - secondary{ - territories{"ZM"} - } - } - nym{ - primary{ - scripts{"Latn"} - } - secondary{ - territories{"TZ"} - } - } - nyn{ - primary{ - scripts{"Latn"} - } - secondary{ - territories{"UG"} - } - } - nyo{ - primary{ - scripts{"Latn"} - } - } - nzi{ - primary{ - scripts{"Latn"} - } - } - oc{ - primary{ - scripts{"Latn"} - } - secondary{ - territories{"FR"} - } - } - oj{ - primary{ - scripts{"Cans"} - } - secondary{ - scripts{"Latn"} - } - } - om{ - primary{ - scripts{"Latn"} - } - secondary{ - scripts{"Ethi"} - territories{"ET"} - } - } - or{ - primary{ - scripts{"Orya"} - } - secondary{ - territories{"IN"} - } - } - os{ - primary{ - scripts{"Cyrl"} - } - secondary{ - territories{"GE"} - } - } - osa{ - primary{ - scripts{"Latn"} - } - } - osc{ - secondary{ - scripts{ - "Ital", - "Latn", - } - } - } - otk{ - secondary{ - scripts{"Orkh"} - } - } - pa{ - primary{ - scripts{ - "Arab", - "Guru", - } - } - secondary{ - territories{ - "IN", - "PK", - } - } - } - pag{ - primary{ - scripts{"Latn"} - } - secondary{ - territories{"PH"} - } - } - pal{ - secondary{ - scripts{ - "Phli", - "Phlp", - } - } - } - pam{ - primary{ - scripts{"Latn"} - } - secondary{ - territories{"PH"} - } - } - pap{ - primary{ - scripts{"Latn"} - territories{ - "AW", - "CW", - } - } - secondary{ - territories{"BQ"} - } - } - pau{ - primary{ - scripts{"Latn"} - territories{"PW"} - } - } - pcd{ - primary{ - scripts{"Latn"} - } - } - pcm{ - primary{ - scripts{"Latn"} - } - secondary{ - territories{"NG"} - } - } - pdc{ - primary{ - scripts{"Latn"} - } - } - pdt{ - primary{ - scripts{"Latn"} - } - } - peo{ - secondary{ - scripts{"Xpeo"} - } - } - pfl{ - primary{ - scripts{"Latn"} - } - } - phn{ - secondary{ - scripts{"Phnx"} - } - } - pi{ - secondary{ - scripts{ - "Deva", - "Sinh", - "Thai", - } - } - } - pko{ - primary{ - scripts{"Latn"} - } - } - pl{ - primary{ - scripts{"Latn"} - territories{"PL"} - } - secondary{ - territories{"UA"} - } - } - pms{ - primary{ - scripts{"Latn"} - } - } - pnt{ - primary{ - scripts{ - "Cyrl", - "Grek", - "Latn", - } - } - } - pon{ - primary{ - scripts{"Latn"} - } - secondary{ - territories{"FM"} - } - } - prd{ - primary{ - scripts{"Arab"} - } - } - prg{ - secondary{ - scripts{"Latn"} - } - } - pro{ - secondary{ - scripts{"Latn"} - } - } - ps{ - primary{ - scripts{"Arab"} - territories{"AF"} - } - secondary{ - territories{"PK"} - } - } - pt{ - primary{ - scripts{"Latn"} - territories{ - "AO", - "BR", - "CV", - "GQ", - "GW", - "MO", - "MZ", - "PT", - "ST", - "TL", - } - } - } - puu{ - primary{ - scripts{"Latn"} - } - } - qu{ - primary{ - scripts{"Latn"} - territories{ - "BO", - "EC", - "PE", - } - } - } - quc{ - primary{ - scripts{"Latn"} - } - secondary{ - territories{"GT"} - } - } - qug{ - primary{ - scripts{"Latn"} - } - } - raj{ - primary{ - scripts{"Deva"} - } - secondary{ - territories{"IN"} - } - } - rap{ - primary{ - scripts{"Latn"} - } - } - rar{ - primary{ - scripts{"Latn"} - } - } - rcf{ - primary{ - scripts{"Latn"} - } - secondary{ - territories{"RE"} - } - } - rej{ - primary{ - scripts{"Latn"} - } - secondary{ - scripts{"Rjng"} - territories{"ID"} - } - } - rgn{ - primary{ - scripts{"Latn"} - } - } - ria{ - primary{ - scripts{"Latn"} - } - } - rif{ - primary{ - scripts{ - "Latn", - "Tfng", - } - } - secondary{ - territories{"MA"} - } - } - rjs{ - primary{ - scripts{"Deva"} - } - } - rkt{ - primary{ - scripts{"Beng"} - } - secondary{ - territories{ - "BD", - "IN", - } - } - } - rm{ - primary{ - scripts{"Latn"} - } - secondary{ - territories{"CH"} - } - } - rmf{ - primary{ - scripts{"Latn"} - } - } - rmo{ - primary{ - scripts{"Latn"} - } - } - rmt{ - primary{ - scripts{"Arab"} - } - secondary{ - territories{"IR"} - } - } - rmu{ - primary{ - scripts{"Latn"} - } - } - rn{ - primary{ - scripts{"Latn"} - territories{"BI"} - } - } - rng{ - primary{ - scripts{"Latn"} - } - } - ro{ - primary{ - scripts{"Latn"} - territories{ - "MD", - "RO", - } - } - secondary{ - scripts{"Cyrl"} - territories{"RS"} - } - } - rob{ - primary{ - scripts{"Latn"} - } - } - rof{ - primary{ - scripts{"Latn"} - } - } - rom{ - primary{ - scripts{"Latn"} - } - secondary{ - scripts{"Cyrl"} - } - } - rtm{ - primary{ - scripts{"Latn"} - } - } - ru{ - primary{ - scripts{"Cyrl"} - territories{ - "BY", - "KG", - "KZ", - "RU", - "UA", - } - } - secondary{ - territories{ - "BG", - "DE", - "EE", - "LT", - "LV", - "PL", - "SJ", - "UZ", - } - } - } - rue{ - primary{ - scripts{"Cyrl"} - } - } - rug{ - primary{ - scripts{"Latn"} - } - } - rup{ - primary{ - scripts{"Latn"} - } - } - rw{ - primary{ - scripts{"Latn"} - territories{"RW"} - } - } - rwk{ - primary{ - scripts{"Latn"} - } - } - ryu{ - primary{ - scripts{"Kana"} - } - } - sa{ - secondary{ - scripts{ - "Deva", - "Gran", - "Shrd", - "Sidd", - "Sinh", - } - territories{"IN"} - } - } - sad{ - primary{ - scripts{"Latn"} - } - } - saf{ - primary{ - scripts{"Latn"} - } - } - sah{ - primary{ - scripts{"Cyrl"} - } - secondary{ - territories{"RU"} - } - } - sam{ - secondary{ - scripts{ - "Hebr", - "Samr", - } - } - } - saq{ - primary{ - scripts{"Latn"} - } - } - sas{ - primary{ - scripts{"Latn"} - } - secondary{ - territories{"ID"} - } - } - sat{ - primary{ - scripts{"Latn"} - } - secondary{ - scripts{ - "Beng", - "Deva", - "Olck", - "Orya", - } - territories{"IN"} - } - } - sav{ - secondary{ - territories{"SN"} - } - } - saz{ - primary{ - scripts{"Saur"} - } - } - sbp{ - primary{ - scripts{"Latn"} - } - } - sc{ - primary{ - scripts{"Latn"} - } - secondary{ - territories{"IT"} - } - } - sck{ - primary{ - scripts{"Deva"} - } - secondary{ - territories{"IN"} - } - } - scn{ - primary{ - scripts{"Latn"} - } - } - sco{ - primary{ - scripts{"Latn"} - } - secondary{ - territories{"GB"} - } - } - scs{ - primary{ - scripts{"Latn"} - } - } - sd{ - primary{ - scripts{ - "Arab", - "Deva", - } - } - secondary{ - scripts{ - "Khoj", - "Sind", - } - territories{ - "IN", - "PK", - } - } - } - sdc{ - primary{ - scripts{"Latn"} - } - } - sdh{ - primary{ - scripts{"Arab"} - } - secondary{ - territories{"IR"} - } - } - se{ - primary{ - scripts{"Latn"} - } - secondary{ - scripts{"Cyrl"} - territories{"NO"} - } - } - see{ - primary{ - scripts{"Latn"} - } - } - sef{ - primary{ - scripts{"Latn"} - } - secondary{ - territories{"CI"} - } - } - seh{ - primary{ - scripts{"Latn"} - } - secondary{ - territories{"MZ"} - } - } - sei{ - primary{ - scripts{"Latn"} - } - } - sel{ - secondary{ - scripts{"Cyrl"} - } - } - ses{ - primary{ - scripts{"Latn"} - } - } - sg{ - primary{ - scripts{"Latn"} - territories{"CF"} - } - } - sga{ - secondary{ - scripts{ - "Latn", - "Ogam", - } - } - } - sgs{ - primary{ - scripts{"Latn"} - } - } - shi{ - primary{ - scripts{ - "Arab", - "Latn", - "Tfng", - } - } - secondary{ - territories{"MA"} - } - } - shn{ - primary{ - scripts{"Mymr"} - } - secondary{ - territories{"MM"} - } - } - si{ - primary{ - scripts{"Sinh"} - territories{"LK"} - } - } - sid{ - primary{ - scripts{"Latn"} - } - secondary{ - territories{"ET"} - } - } - sk{ - primary{ - scripts{"Latn"} - territories{"SK"} - } - secondary{ - territories{ - "CZ", - "RS", - } - } - } - skr{ - primary{ - scripts{"Arab"} - } - secondary{ - territories{"PK"} - } - } - sl{ - primary{ - scripts{"Latn"} - territories{"SI"} - } - secondary{ - territories{"AT"} - } - } - sli{ - primary{ - scripts{"Latn"} - } - } - sly{ - primary{ - scripts{"Latn"} - } - } - sm{ - primary{ - scripts{"Latn"} - territories{ - "AS", - "WS", - } - } - } - sma{ - primary{ - scripts{"Latn"} - } - } - smj{ - primary{ - scripts{"Latn"} - } - } - smn{ - primary{ - scripts{"Latn"} - } - } - smp{ - secondary{ - scripts{"Samr"} - } - } - sms{ - primary{ - scripts{"Latn"} - } - } - sn{ - primary{ - scripts{"Latn"} - territories{"ZW"} - } - } - snf{ - secondary{ - territories{"SN"} - } - } - snk{ - primary{ - scripts{"Latn"} - } - secondary{ - territories{"ML"} - } - } - so{ - primary{ - scripts{"Latn"} - territories{"SO"} - } - secondary{ - scripts{ - "Arab", - "Osma", - } - territories{ - "DJ", - "ET", - } - } - } - sou{ - primary{ - scripts{"Thai"} - } - secondary{ - territories{"TH"} - } - } - sq{ - primary{ - scripts{"Latn"} - territories{ - "AL", - "XK", - } - } - secondary{ - scripts{"Elba"} - territories{ - "MK", - "RS", - } - } - } - sr{ - primary{ - scripts{ - "Cyrl", - "Latn", - } - territories{ - "BA", - "ME", - "RS", - "XK", - } - } - } - srb{ - primary{ - scripts{"Latn"} - } - secondary{ - scripts{"Sora"} - } - } - srn{ - primary{ - scripts{"Latn"} - } - secondary{ - territories{"SR"} - } - } - srr{ - primary{ - scripts{"Latn"} - } - secondary{ - territories{"SN"} - } - } - srx{ - primary{ - scripts{"Deva"} - } - } - ss{ - primary{ - scripts{"Latn"} - territories{"SZ"} - } - secondary{ - territories{"ZA"} - } - } - ssy{ - primary{ - scripts{"Latn"} - } - } - st{ - primary{ - scripts{"Latn"} - territories{"LS"} - } - secondary{ - territories{"ZA"} - } - } - stq{ - primary{ - scripts{"Latn"} - } - } - su{ - primary{ - scripts{"Latn"} - } - secondary{ - scripts{"Sund"} - territories{"ID"} - } - } - suk{ - primary{ - scripts{"Latn"} - } - secondary{ - territories{"TZ"} - } - } - sus{ - primary{ - scripts{"Latn"} - } - secondary{ - scripts{"Arab"} - territories{"GN"} - } - } - sv{ - primary{ - scripts{"Latn"} - territories{ - "AX", - "FI", - "SE", - } - } - } - sw{ - primary{ - scripts{"Latn"} - territories{ - "KE", - "TZ", - "UG", - } - } - secondary{ - territories{"CD"} - } - } - swb{ - primary{ - scripts{"Arab"} - } - secondary{ - scripts{"Latn"} - territories{"YT"} - } - } - swg{ - primary{ - scripts{"Latn"} - } - } - swv{ - primary{ - scripts{"Deva"} - } - secondary{ - territories{"IN"} - } - } - sxn{ - primary{ - scripts{"Latn"} - } - } - syi{ - primary{ - scripts{"Latn"} - } - } - syl{ - primary{ - scripts{"Beng"} - } - secondary{ - scripts{"Sylo"} - territories{"BD"} - } - } - syr{ - secondary{ - scripts{"Syrc"} - } - } - szl{ - primary{ - scripts{"Latn"} - } - } - ta{ - primary{ - scripts{"Taml"} - territories{ - "LK", - "SG", - } - } - secondary{ - territories{ - "IN", - "MY", - } - } - } - tab{ - primary{ - scripts{"Cyrl"} - } - } - taj{ - primary{ - scripts{"Deva"} - } - secondary{ - scripts{"Tibt"} - } - } - tbw{ - primary{ - scripts{"Latn"} - } - secondary{ - scripts{"Tagb"} - } - } - tcy{ - primary{ - scripts{"Knda"} - } - secondary{ - territories{"IN"} - } - } - tdd{ - primary{ - scripts{"Tale"} - } - } - tdg{ - primary{ - scripts{"Deva"} - } - secondary{ - scripts{"Tibt"} - } - } - tdh{ - primary{ - scripts{"Deva"} - } - } - te{ - primary{ - scripts{"Telu"} - } - secondary{ - territories{"IN"} - } - } - tem{ - primary{ - scripts{"Latn"} - } - secondary{ - territories{"SL"} - } - } - teo{ - primary{ - scripts{"Latn"} - } - secondary{ - territories{"UG"} - } - } - ter{ - primary{ - scripts{"Latn"} - } - } - tet{ - primary{ - scripts{"Latn"} - territories{"TL"} - } - } - tg{ - primary{ - scripts{ - "Arab", - "Cyrl", - "Latn", - } - territories{"TJ"} - } - } - th{ - primary{ - scripts{"Thai"} - territories{"TH"} - } - } - thl{ - primary{ - scripts{"Deva"} - } - } - thq{ - primary{ - scripts{"Deva"} - } - } - thr{ - primary{ - scripts{"Deva"} - } - } - ti{ - primary{ - scripts{"Ethi"} - territories{"ER"} - } - secondary{ - territories{"ET"} - } - } - tig{ - primary{ - scripts{"Ethi"} - } - secondary{ - territories{"ER"} - } - } - tiv{ - primary{ - scripts{"Latn"} - } - secondary{ - territories{"NG"} - } - } - tk{ - primary{ - scripts{ - "Arab", - "Cyrl", - "Latn", - } - territories{"TM"} - } - secondary{ - territories{ - "AF", - "IR", - } - } - } - tkl{ - primary{ - scripts{"Latn"} - territories{"TK"} - } - } - tkr{ - primary{ - scripts{ - "Cyrl", - "Latn", - } - } - } - tkt{ - primary{ - scripts{"Deva"} - } - } - tli{ - primary{ - scripts{"Latn"} - } - } - tly{ - primary{ - scripts{ - "Arab", - "Cyrl", - "Latn", - } - } - } - tmh{ - primary{ - scripts{"Latn"} - } - secondary{ - territories{"NE"} - } - } - tn{ - primary{ - scripts{"Latn"} - territories{"BW"} - } - secondary{ - territories{"ZA"} - } - } - tnr{ - secondary{ - territories{"SN"} - } - } - to{ - primary{ - scripts{"Latn"} - territories{"TO"} - } - } - tog{ - primary{ - scripts{"Latn"} - } - } - tpi{ - primary{ - scripts{"Latn"} - territories{"PG"} - } - } - tr{ - primary{ - scripts{"Latn"} - territories{ - "CY", - "TR", - } - } - secondary{ - scripts{"Arab"} - territories{"DE"} - } - } - tru{ - primary{ - scripts{"Latn"} - } - secondary{ - scripts{"Syrc"} - } - } - trv{ - primary{ - scripts{"Latn"} - } - } - ts{ - primary{ - scripts{"Latn"} - } - secondary{ - territories{ - "MZ", - "ZA", - } - } - } - tsd{ - primary{ - scripts{"Grek"} - } - } - tsf{ - primary{ - scripts{"Deva"} - } - } - tsg{ - primary{ - scripts{"Latn"} - } - secondary{ - territories{"PH"} - } - } - tsi{ - primary{ - scripts{"Latn"} - } - } - tsj{ - primary{ - scripts{"Tibt"} - } - } - tt{ - primary{ - scripts{"Cyrl"} - } - secondary{ - territories{"RU"} - } - } - ttj{ - primary{ - scripts{"Latn"} - } - } - tts{ - primary{ - scripts{"Thai"} - } - secondary{ - territories{"TH"} - } - } - ttt{ - primary{ - scripts{ - "Cyrl", - "Latn", - } - } - secondary{ - scripts{"Arab"} - } - } - tum{ - primary{ - scripts{"Latn"} - } - secondary{ - territories{"MW"} - } - } - tvl{ - primary{ - scripts{"Latn"} - territories{"TV"} - } - } - twq{ - primary{ - scripts{"Latn"} - } - } - ty{ - primary{ - scripts{"Latn"} - territories{"PF"} - } - } - tyv{ - primary{ - scripts{"Cyrl"} - } - secondary{ - territories{"RU"} - } - } - tzm{ - primary{ - scripts{ - "Latn", - "Tfng", - } - territories{"MA"} - } - } - ude{ - primary{ - scripts{"Cyrl"} - } - } - udm{ - primary{ - scripts{"Cyrl"} - } - secondary{ - scripts{"Latn"} - territories{"RU"} - } - } - ug{ - primary{ - scripts{ - "Arab", - "Cyrl", - } - } - secondary{ - scripts{"Latn"} - territories{"CN"} - } - } - uga{ - secondary{ - scripts{"Ugar"} - } - } - uk{ - primary{ - scripts{"Cyrl"} - territories{"UA"} - } - secondary{ - territories{"RS"} - } - } - uli{ - primary{ - scripts{"Latn"} - } - } - umb{ - primary{ - scripts{"Latn"} - } - secondary{ - territories{"AO"} - } - } - und{ - secondary{ - territories{ - "AQ", - "BV", - "CP", - "GS", - "HM", - } - } - } - unr{ - primary{ - scripts{ - "Beng", - "Deva", - } - } - secondary{ - territories{"IN"} - } - } - unx{ - primary{ - scripts{ - "Beng", - "Deva", - } - } - } - ur{ - primary{ - scripts{"Arab"} - territories{"PK"} - } - secondary{ - territories{"IN"} - } - } - uz{ - primary{ - scripts{ - "Arab", - "Cyrl", - "Latn", - } - territories{"UZ"} - } - secondary{ - territories{"AF"} - } - } - vai{ - primary{ - scripts{ - "Latn", - "Vaii", - } - } - } - ve{ - primary{ - scripts{"Latn"} - } - secondary{ - territories{"ZA"} - } - } - vec{ - primary{ - scripts{"Latn"} - } - } - vep{ - primary{ - scripts{"Latn"} - } - } - vi{ - primary{ - scripts{"Latn"} - territories{"VN"} - } - secondary{ - scripts{"Hani"} - territories{"US"} - } - } - vic{ - primary{ - scripts{"Latn"} - } - } - vls{ - primary{ - scripts{"Latn"} - } - secondary{ - territories{"BE"} - } - } - vmf{ - primary{ - scripts{"Latn"} - } - secondary{ - territories{"DE"} - } - } - vmw{ - primary{ - scripts{"Latn"} - } - secondary{ - territories{"MZ"} - } - } - vo{ - secondary{ - scripts{"Latn"} - } - } - vot{ - secondary{ - scripts{"Latn"} - } - } - vro{ - primary{ - scripts{"Latn"} - } - } - vun{ - primary{ - scripts{"Latn"} - } - } - wa{ - primary{ - scripts{"Latn"} - } - } - wae{ - primary{ - scripts{"Latn"} - } - } - wal{ - primary{ - scripts{"Ethi"} - } - secondary{ - territories{"ET"} - } - } - war{ - primary{ - scripts{"Latn"} - } - secondary{ - territories{"PH"} - } - } - was{ - primary{ - scripts{"Latn"} - } - } - wbp{ - primary{ - scripts{"Latn"} - } - } - wbq{ - primary{ - scripts{"Telu"} - } - secondary{ - territories{"IN"} - } - } - wbr{ - primary{ - scripts{"Deva"} - } - secondary{ - territories{"IN"} - } - } - wls{ - primary{ - scripts{"Latn"} - } - secondary{ - territories{"WF"} - } - } - wni{ - primary{ - scripts{"Arab"} - territories{"KM"} - } - } - wo{ - primary{ - scripts{"Latn"} - territories{"SN"} - } - secondary{ - scripts{"Arab"} - } - } - wtm{ - primary{ - scripts{"Deva"} - } - secondary{ - territories{"IN"} - } - } - wuu{ - primary{ - scripts{"Hans"} - } - secondary{ - territories{"CN"} - } - } - xal{ - primary{ - scripts{"Cyrl"} - } - } - xav{ - primary{ - scripts{"Latn"} - } - } - xcr{ - secondary{ - scripts{"Cari"} - } - } - xh{ - primary{ - scripts{"Latn"} - } - secondary{ - territories{"ZA"} - } - } - xlc{ - secondary{ - scripts{"Lyci"} - } - } - xld{ - secondary{ - scripts{"Lydi"} - } - } - xmf{ - primary{ - scripts{"Geor"} - } - } - xmn{ - secondary{ - scripts{"Mani"} - } - } - xmr{ - secondary{ - scripts{"Merc"} - } - } - xna{ - secondary{ - scripts{"Narb"} - } - } - xnr{ - primary{ - scripts{"Deva"} - } - secondary{ - territories{"IN"} - } - } - xog{ - primary{ - scripts{"Latn"} - } - secondary{ - territories{"UG"} - } - } - xpr{ - secondary{ - scripts{"Prti"} - } - } - xsa{ - secondary{ - scripts{"Sarb"} - } - } - xsr{ - primary{ - scripts{"Deva"} - } - } - xum{ - secondary{ - scripts{ - "Ital", - "Latn", - } - } - } - yao{ - primary{ - scripts{"Latn"} - } - } - yap{ - primary{ - scripts{"Latn"} - } - } - yav{ - primary{ - scripts{"Latn"} - } - } - ybb{ - primary{ - scripts{"Latn"} - } - } - yi{ - primary{ - scripts{"Hebr"} - } - } - yo{ - primary{ - scripts{"Latn"} - territories{"NG"} - } - } - yrk{ - primary{ - scripts{"Cyrl"} - } - } - yrl{ - primary{ - scripts{"Latn"} - } - } - yua{ - primary{ - scripts{"Latn"} - } - } - yue{ - primary{ - scripts{"Hant"} - } - secondary{ - scripts{"Hans"} - territories{ - "CN", - "HK", - } - } - } - za{ - primary{ - scripts{"Latn"} - } - secondary{ - scripts{"Hans"} - territories{"CN"} - } - } - zag{ - primary{ - scripts{"Latn"} - } - } - zap{ - primary{ - scripts{"Latn"} - } - } - zdj{ - primary{ - scripts{"Arab"} - territories{"KM"} - } - } - zea{ - primary{ - scripts{"Latn"} - } - } - zen{ - secondary{ - scripts{"Tfng"} - } - } - zgh{ - primary{ - scripts{"Tfng"} - } - secondary{ - territories{"MA"} - } - } - zh{ - primary{ - scripts{ - "Hans", - "Hant", - } - territories{ - "CN", - "HK", - "MO", - "SG", - "TW", - } - } - secondary{ - scripts{ - "Bopo", - "Phag", - } - territories{ - "ID", - "MY", - "TH", - "US", - } - } - } - zmi{ - primary{ - scripts{"Latn"} - } - } - zu{ - primary{ - scripts{"Latn"} - } - secondary{ - territories{"ZA"} - } - } - zun{ - primary{ - scripts{"Latn"} - } - } - zza{ - primary{ - scripts{"Latn"} - } - secondary{ - territories{"TR"} - } - } - } - languageMatching{ - written{ - { - "ab", - "ru", - "90", - "1", - } - { - "ach", - "en", - "90", - "1", - } - { - "af", - "nl", - "90", - "1", - } - { - "ak", - "en", - "90", - "1", - } - { - "am_*_*", - "en_*_GB", - "90", - "1", - } - { - "ay", - "es", - "90", - "1", - } - { - "az_Latn", - "ru_Cyrl", - "90", - "1", - } - { - "az", - "ru", - "90", - "1", - } - { - "bem", - "en", - "90", - "1", - } - { - "be", - "ru", - "90", - "1", - } - { - "bh", - "hi", - "90", - "1", - } - { - "bn_Beng", - "en_Latn", - "90", - "1", - } - { - "bn", - "en", - "90", - "1", - } - { - "br", - "fr", - "90", - "1", - } - { - "ceb", - "fil", - "90", - "1", - } - { - "chr", - "en", - "90", - "1", - } - { - "ckb", - "ar", - "90", - "1", - } - { - "ckb", - "ku", - "92", - "0", - } - { - "co", - "fr", - "90", - "1", - } - { - "crs", - "fr", - "90", - "1", - } - { - "cy", - "en", - "90", - "1", - } - { - "da", - "nb", - "92", - "0", - } - { - "da", - "no", - "92", - "0", - } - { - "ee", - "en", - "90", - "1", - } - { - "en_*_001", - "en_*_*", - "96", - "0", - } - { - "en_*_GB", - "en_*_*", - "96", - "0", - } - { - "en_*_US", - "en_*_*", - "94", - "0", - } - { - "en_*_*", - "en_*_*", - "95", - "0", - } - { - "eo", - "en", - "90", - "1", - } - { - "es_*_419", - "es_*_*", - "96", - "0", - } - { - "es_*_ES", - "es_*_*", - "92", - "0", - } - { - "es_*_*", - "es_*_*", - "95", - "0", - } - { - "et", - "fi", - "90", - "1", - } - { - "eu", - "es", - "90", - "1", - } - { - "fo", - "da", - "90", - "1", - } - { - "fy", - "nl", - "90", - "1", - } - { - "gaa", - "en", - "90", - "1", - } - { - "ga", - "en", - "90", - "1", - } - { - "gd", - "en", - "90", - "1", - } - { - "gl", - "es", - "90", - "1", - } - { - "gn", - "es", - "90", - "1", - } - { - "gsw", - "de", - "96", - "1", - } - { - "gu", - "hi", - "90", - "1", - } - { - "ha", - "en", - "90", - "1", - } - { - "haw", - "en", - "90", - "1", - } - { - "hr", - "bs", - "96", - "0", - } - { - "ht", - "fr", - "90", - "1", - } - { - "hy_Armn", - "ru_Cyrl", - "90", - "1", - } - { - "hy", - "ru", - "90", - "1", - } - { - "ia", - "en", - "90", - "1", - } - { - "ig", - "en", - "90", - "1", - } - { - "is", - "en", - "90", - "1", - } - { - "jv", - "id", - "90", - "1", - } - { - "ka_Geor", - "en_Latn", - "90", - "1", - } - { - "ka", - "en", - "90", - "1", - } - { - "kg", - "fr", - "90", - "1", - } - { - "kk", - "ru", - "90", - "1", - } - { - "km_Khmr", - "en_Latn", - "90", - "1", - } - { - "km", - "en", - "90", - "1", - } - { - "kn_Knda", - "en_Latn", - "90", - "1", - } - { - "kn", - "en", - "90", - "1", - } - { - "kri", - "en", - "90", - "1", - } - { - "ku", - "ckb", - "96", - "0", - } - { - "ku", - "tr", - "90", - "1", - } - { - "ky", - "ru", - "90", - "1", - } - { - "la", - "it", - "90", - "1", - } - { - "lb", - "de", - "96", - "1", - } - { - "lg", - "en", - "90", - "1", - } - { - "ln", - "fr", - "90", - "1", - } - { - "lo_Laoo", - "en_Latn", - "90", - "1", - } - { - "lo", - "en", - "90", - "1", - } - { - "loz", - "en", - "90", - "1", - } - { - "lua", - "fr", - "90", - "1", - } - { - "mfe", - "en", - "90", - "1", - } - { - "mg", - "fr", - "90", - "1", - } - { - "mi", - "en", - "90", - "1", - } - { - "mk", - "bg", - "90", - "1", - } - { - "ml_Mlym", - "en_Latn", - "90", - "1", - } - { - "ml", - "en", - "90", - "1", - } - { - "mn", - "ru", - "90", - "1", - } - { - "mr", - "hi", - "90", - "1", - } - { - "ms", - "id", - "90", - "1", - } - { - "mt", - "en", - "90", - "1", - } - { - "my_Mymr", - "en_Latn", - "90", - "1", - } - { - "my", - "en", - "90", - "1", - } - { - "ne_Deva", - "en_Latn", - "90", - "1", - } - { - "ne", - "en", - "90", - "1", - } - { - "nn", - "nb", - "90", - "0", - } - { - "nn", - "no", - "90", - "1", - } - { - "no", - "nb", - "99", - "0", - } - { - "nso", - "en", - "90", - "1", - } - { - "ny", - "en", - "90", - "1", - } - { - "nyn", - "en", - "90", - "1", - } - { - "oc", - "fr", - "90", - "1", - } - { - "om", - "en", - "90", - "1", - } - { - "or_Orya", - "en_Latn", - "90", - "1", - } - { - "or", - "en", - "90", - "1", - } - { - "pa_Guru", - "en_Latn", - "90", - "1", - } - { - "pa", - "en", - "90", - "1", - } - { - "pcm", - "en", - "90", - "1", - } - { - "ps_Arab", - "en_Latn", - "90", - "1", - } - { - "ps", - "en", - "90", - "1", - } - { - "pt_*_BR", - "pt_*_US", - "96", - "0", - } - { - "pt_*_BR", - "pt_*_*", - "92", - "0", - } - { - "pt_*_US", - "pt_*_*", - "92", - "0", - } - { - "pt_*_*", - "pt_*_*", - "96", - "0", - } - { - "qu", - "es", - "90", - "1", - } - { - "rm", - "de", - "90", - "1", - } - { - "rn", - "en", - "90", - "1", - } - { - "rw", - "fr", - "90", - "1", - } - { - "sa", - "hi", - "90", - "1", - } - { - "sd_Arab", - "en_Latn", - "90", - "1", - } - { - "sd", - "en", - "90", - "1", - } - { - "sh", - "bs", - "96", - "0", - } - { - "sh", - "hr", - "96", - "0", - } - { - "sh", - "sr", - "96", - "0", - } - { - "si_Sinh", - "en_Latn", - "90", - "1", - } - { - "si", - "en", - "90", - "1", - } - { - "sn", - "en", - "90", - "1", - } - { - "so", - "en", - "90", - "1", - } - { - "sq", - "en", - "90", - "1", - } - { - "sr_Latn", - "sr_Cyrl", - "95", - "0", - } - { - "sr", - "bs", - "96", - "0", - } - { - "sr", - "hr", - "96", - "0", - } - { - "ssy", - "aa", - "96", - "0", - } - { - "st", - "en", - "90", - "1", - } - { - "su", - "id", - "90", - "1", - } - { - "sw", - "en", - "90", - "1", - } - { - "ta_Taml", - "en_Latn", - "90", - "1", - } - { - "ta", - "en", - "90", - "1", - } - { - "te_Telu", - "en_Latn", - "90", - "1", - } - { - "te", - "en", - "90", - "1", - } - { - "tg", - "ru", - "90", - "1", - } - { - "ti_Ethi", - "en_Latn", - "90", - "1", - } - { - "ti", - "en", - "90", - "1", - } - { - "tk_Latn", - "ru_Cyrl", - "90", - "1", - } - { - "tk", - "ru", - "90", - "1", - } - { - "tlh", - "en", - "90", - "1", - } - { - "tn", - "en", - "90", - "1", - } - { - "to", - "en", - "90", - "1", - } - { - "tt", - "ru", - "90", - "1", - } - { - "tum", - "en", - "90", - "1", - } - { - "ug", - "zh", - "90", - "1", - } - { - "ur_Arab", - "en_Latn", - "90", - "1", - } - { - "ur", - "en", - "90", - "1", - } - { - "uz_Latn", - "ru_Cyrl", - "90", - "1", - } - { - "uz", - "ru", - "90", - "1", - } - { - "wo", - "fr", - "90", - "1", - } - { - "xh", - "en", - "90", - "1", - } - { - "yi_Hebr", - "en_Latn", - "90", - "1", - } - { - "yi", - "en", - "90", - "1", - } - { - "yo", - "en", - "90", - "1", - } - { - "zh_Hant_HK", - "zh_Hant_MO", - "97", - "0", - } - { - "zu", - "en", - "90", - "1", - } - { - "*_Hans", - "*_Hant", - "85", - "1", - } - { - "*_Hant", - "*_Hans", - "81", - "1", - } - { - "*_*_*", - "*_*_*", - "96", - "0", - } - { - "*_*", - "*_*", - "60", - "0", - } - { - "*", - "*", - "20", - "0", - } - } - } - measurementData{ - 001{ - MeasurementSystem:int{0} - PaperSize:intvector{ - 297, - 210, - } - } - BS{ - MeasurementSystemCategory{ - temperature:int{1} - } - } - BZ{ - MeasurementSystemCategory{ - temperature:int{1} - } - PaperSize:intvector{ - 279, - 216, - } - } - CA{ - PaperSize:intvector{ - 279, - 216, - } - } - CL{ - PaperSize:intvector{ - 279, - 216, - } - } - CO{ - PaperSize:intvector{ - 279, - 216, - } - } - CR{ - PaperSize:intvector{ - 279, - 216, - } - } - GB{ - MeasurementSystem:int{2} - } - GT{ - PaperSize:intvector{ - 279, - 216, - } - } - KY{ - MeasurementSystemCategory{ - temperature:int{1} - } - } - LR{ - MeasurementSystem:int{1} - MeasurementSystemCategory{ - temperature:int{0} - } - } - MM{ - MeasurementSystem:int{1} - MeasurementSystemCategory{ - temperature:int{0} - } - } - MX{ - PaperSize:intvector{ - 279, - 216, - } - } - NI{ - PaperSize:intvector{ - 279, - 216, - } - } - PA{ - PaperSize:intvector{ - 279, - 216, - } - } - PH{ - PaperSize:intvector{ - 279, - 216, - } - } - PR{ - MeasurementSystemCategory{ - temperature:int{1} - } - PaperSize:intvector{ - 279, - 216, - } - } - PW{ - MeasurementSystemCategory{ - temperature:int{1} - } - } - SV{ - PaperSize:intvector{ - 279, - 216, - } - } - US{ - MeasurementSystem:int{1} - PaperSize:intvector{ - 279, - 216, - } - } - VE{ - PaperSize:intvector{ - 279, - 216, - } - } - } - parentLocales{ - en_001{ - "en_150", - "en_AG", - "en_AI", - "en_AU", - "en_BB", - "en_BE", - "en_BM", - "en_BS", - "en_BW", - "en_BZ", - "en_CA", - "en_CC", - "en_CK", - "en_CM", - "en_CX", - "en_CY", - "en_DG", - "en_DM", - "en_ER", - "en_FJ", - "en_FK", - "en_FM", - "en_GB", - "en_GD", - "en_GG", - "en_GH", - "en_GI", - "en_GM", - "en_GY", - "en_HK", - "en_IE", - "en_IL", - "en_IM", - "en_IN", - "en_IO", - "en_JE", - "en_JM", - "en_KE", - "en_KI", - "en_KN", - "en_KY", - "en_LC", - "en_LR", - "en_LS", - "en_MG", - "en_MO", - "en_MS", - "en_MT", - "en_MU", - "en_MW", - "en_MY", - "en_NA", - "en_NF", - "en_NG", - "en_NR", - "en_NU", - "en_NZ", - "en_PG", - "en_PH", - "en_PK", - "en_PN", - "en_PW", - "en_RW", - "en_SB", - "en_SC", - "en_SD", - "en_SG", - "en_SH", - "en_SL", - "en_SS", - "en_SX", - "en_SZ", - "en_TC", - "en_TK", - "en_TO", - "en_TT", - "en_TV", - "en_TZ", - "en_UG", - "en_VC", - "en_VG", - "en_VU", - "en_WS", - "en_ZA", - "en_ZM", - "en_ZW", - } - en_150{ - "en_AT", - "en_CH", - "en_DE", - "en_DK", - "en_FI", - "en_NL", - "en_SE", - "en_SI", - } - es_419{ - "es_AR", - "es_BO", - "es_BR", - "es_CL", - "es_CO", - "es_CR", - "es_CU", - "es_DO", - "es_EC", - "es_GT", - "es_HN", - "es_MX", - "es_NI", - "es_PA", - "es_PE", - "es_PR", - "es_PY", - "es_SV", - "es_US", - "es_UY", - "es_VE", - } - pt_PT{ - "pt_AO", - "pt_CH", - "pt_CV", - "pt_GQ", - "pt_GW", - "pt_LU", - "pt_MO", - "pt_MZ", - "pt_ST", - "pt_TL", - } - root{ - "az_Arab", - "az_Cyrl", - "bm_Nkoo", - "bs_Cyrl", - "en_Dsrt", - "en_Shaw", - "ha_Arab", - "iu_Latn", - "mn_Mong", - "ms_Arab", - "pa_Arab", - "shi_Latn", - "sr_Latn", - "uz_Arab", - "uz_Cyrl", - "vai_Latn", - "zh_Hant", - "yue_Hans", - } - zh_Hant_HK{"zh_Hant_MO"} - } - subdivisionContainment{ - AD{ - "02", - "03", - "04", - "05", - "06", - "07", - "08", - } - AE{ - "AJ", - "AZ", - "DU", - "FU", - "RK", - "SH", - "UQ", - } - AF{ - "BAL", - "BAM", - "BDG", - "BDS", - "BGL", - "DAY", - "FRA", - "FYB", - "GHA", - "GHO", - "HEL", - "HER", - "JOW", - "KAB", - "KAN", - "KAP", - "KDZ", - "KHO", - "KNR", - "LAG", - "LOG", - "NAN", - "NIM", - "NUR", - "PAN", - "PAR", - "PIA", - "PKA", - "SAM", - "SAR", - "TAK", - "URU", - "WAR", - "ZAB", - } - AG{ - "03", - "04", - "05", - "06", - "07", - "08", - "10", - "11", - } - AL{ - "01", - "02", - "03", - "04", - "05", - "06", - "07", - "08", - "09", - "10", - "11", - "12", - } - AM{ - "AG", - "AR", - "AV", - "ER", - "GR", - "KT", - "LO", - "SH", - "SU", - "TV", - "VD", - } - AO{ - "BGO", - "BGU", - "BIE", - "CAB", - "CCU", - "CNN", - "CNO", - "CUS", - "HUA", - "HUI", - "LNO", - "LSU", - "LUA", - "MAL", - "MOX", - "NAM", - "UIG", - "ZAI", - } - AR{ - "A", - "B", - "C", - "D", - "E", - "F", - "G", - "H", - "J", - "K", - "L", - "M", - "N", - "P", - "Q", - "R", - "S", - "T", - "U", - "V", - "W", - "X", - "Y", - "Z", - } - AT{ - "1", - "2", - "3", - "4", - "5", - "6", - "7", - "8", - "9", - } - AU{ - "ACT", - "NSW", - "NT", - "QLD", - "SA", - "TAS", - "VIC", - "WA", - } - AZ{ - "ABS", - "AGA", - "AGC", - "AGM", - "AGS", - "AGU", - "AST", - "BA", - "BAL", - "BAR", - "BEY", - "BIL", - "CAB", - "CAL", - "DAS", - "FUZ", - "GA", - "GAD", - "GOR", - "GOY", - "GYG", - "HAC", - "IMI", - "ISM", - "KAL", - "KUR", - "LA", - "LAC", - "LAN", - "LER", - "MAS", - "MI", - "NA", - "NEF", - "NX", - "OGU", - "QAB", - "QAX", - "QAZ", - "QBA", - "QBI", - "QOB", - "QUS", - "SA", - "SAB", - "SAK", - "SAL", - "SAT", - "SBN", - "SIY", - "SKR", - "SM", - "SMI", - "SMX", - "SR", - "SUS", - "TAR", - "TOV", - "UCA", - "XA", - "XAC", - "XCI", - "XIZ", - "XVD", - "YAR", - "YE", - "YEV", - "ZAN", - "ZAQ", - "ZAR", - } - AZ-NX{ - "BAB", - "CUL", - "KAN", - "NV", - "ORD", - "SAD", - "SAH", - "SAR", - } - BA{ - "BIH", - "BRC", - "SRP", - } - BB{ - "01", - "02", - "03", - "04", - "05", - "06", - "07", - "08", - "09", - "10", - "11", - } - BD{ - "A", - "B", - "C", - "D", - "E", - "F", - "G", - } - BD-A{ - "02", - "06", - "07", - "25", - "50", - "51", - } - BD-B{ - "01", - "04", - "08", - "09", - "10", - "11", - "16", - "29", - "31", - "47", - "56", - } - BD-C{ - "13", - "15", - "17", - "18", - "21", - "26", - "33", - "34", - "35", - "36", - "40", - "41", - "42", - "53", - "57", - "62", - "63", - } - BD-D{ - "05", - "12", - "22", - "23", - "27", - "30", - "37", - "39", - "43", - "58", - } - BD-E{ - "03", - "24", - "44", - "45", - "48", - "49", - "54", - "55", - "59", - } - BD-F{ - "14", - "19", - "28", - "32", - "46", - "52", - "64", - } - BD-G{ - "20", - "38", - "60", - "61", - } - BE{ - "BRU", - "VLG", - "WAL", - } - BE-VLG{ - "VAN", - "VBR", - "VLI", - "VOV", - "VWV", - } - BE-WAL{ - "WBR", - "WHT", - "WLG", - "WLX", - "WNA", - } - BF{ - "01", - "02", - "03", - "04", - "05", - "06", - "07", - "08", - "09", - "10", - "11", - "12", - "13", - } - BF-01{ - "BAL", - "BAN", - "KOS", - "MOU", - "NAY", - "SOR", - } - BF-02{ - "COM", - "LER", - } - BF-03{"KAD"} - BF-04{ - "BLG", - "KOP", - "KOT", - } - BF-05{ - "BAM", - "NAM", - "SMT", - } - BF-06{ - "BLK", - "SIS", - "SNG", - "ZIR", - } - BF-07{ - "BAZ", - "NAO", - "ZOU", - } - BF-08{ - "GNA", - "GOU", - "KMD", - "KMP", - "TAP", - } - BF-09{ - "HOU", - "KEN", - "TUI", - } - BF-10{ - "LOR", - "PAS", - "YAT", - "ZON", - } - BF-11{ - "GAN", - "KOW", - "OUB", - } - BF-12{ - "OUD", - "SEN", - "SOM", - "YAG", - } - BF-13{ - "BGR", - "IOB", - "NOU", - "PON", - } - BG{ - "01", - "02", - "03", - "04", - "05", - "06", - "07", - "08", - "09", - "10", - "11", - "12", - "13", - "14", - "15", - "16", - "17", - "18", - "19", - "20", - "21", - "22", - "23", - "24", - "25", - "26", - "27", - "28", - } - BH{ - "13", - "14", - "15", - "17", - } - BI{ - "BB", - "BL", - "BM", - "BR", - "CA", - "CI", - "GI", - "KI", - "KR", - "KY", - "MA", - "MU", - "MW", - "MY", - "NG", - "RM", - "RT", - "RY", - } - BJ{ - "AK", - "AL", - "AQ", - "BO", - "CO", - "DO", - "KO", - "LI", - "MO", - "OU", - "PL", - "ZO", - } - BN{ - "BE", - "BM", - "TE", - "TU", - } - BO{ - "B", - "C", - "H", - "L", - "N", - "O", - "P", - "S", - "T", - } - BQ{ - "BO", - "SA", - "SE", - } - BR{ - "AC", - "AL", - "AM", - "AP", - "BA", - "CE", - "DF", - "ES", - "GO", - "MA", - "MG", - "MS", - "MT", - "PA", - "PB", - "PE", - "PI", - "PR", - "RJ", - "RN", - "RO", - "RR", - "RS", - "SC", - "SE", - "SP", - "TO", - } - BS{ - "AK", - "BI", - "BP", - "BY", - "CE", - "CI", - "CK", - "CO", - "CS", - "EG", - "EX", - "FP", - "GC", - "HI", - "HT", - "IN", - "LI", - "MC", - "MG", - "MI", - "NE", - "NO", - "NS", - "RC", - "RI", - "SA", - "SE", - "SO", - "SS", - "SW", - "WG", - } - BT{ - "11", - "12", - "13", - "14", - "15", - "21", - "22", - "23", - "24", - "31", - "32", - "33", - "34", - "41", - "42", - "43", - "44", - "45", - "GA", - "TY", - } - BW{ - "CE", - "CH", - "FR", - "GA", - "GH", - "JW", - "KG", - "KL", - "KW", - "LO", - "NE", - "NW", - "SE", - "SO", - "SP", - "ST", - } - BY{ - "BR", - "HM", - "HO", - "HR", - "MA", - "MI", - "VI", - } - BZ{ - "BZ", - "CY", - "CZL", - "OW", - "SC", - "TOL", - } - CA{ - "AB", - "BC", - "MB", - "NB", - "NL", - "NS", - "NT", - "NU", - "ON", - "PE", - "QC", - "SK", - "YT", - } - CD{ - "BC", - "BN", - "EQ", - "KA", - "KE", - "KN", - "KW", - "MA", - "NK", - "OR", - "SK", - } - CF{ - "AC", - "BB", - "BGF", - "BK", - "HK", - "HM", - "HS", - "KB", - "KG", - "LB", - "MB", - "MP", - "NM", - "OP", - "SE", - "UK", - "VK", - } - CG{ - "2", - "5", - "7", - "8", - "9", - "11", - "12", - "13", - "14", - "15", - "16", - "BZV", - } - CH{ - "AG", - "AI", - "AR", - "BE", - "BL", - "BS", - "FR", - "GE", - "GL", - "GR", - "JU", - "LU", - "NE", - "NW", - "OW", - "SG", - "SH", - "SO", - "SZ", - "TG", - "TI", - "UR", - "VD", - "VS", - "ZG", - "ZH", - } - CI{ - "AB", - "BS", - "CM", - "DN", - "GD", - "LC", - "LG", - "MG", - "SM", - "SV", - "VB", - "WR", - "YM", - "ZZ", - } - CL{ - "AI", - "AN", - "AP", - "AR", - "AT", - "BI", - "CO", - "LI", - "LL", - "LR", - "MA", - "ML", - "RM", - "TA", - "VS", - } - CM{ - "AD", - "CE", - "EN", - "ES", - "LT", - "NO", - "NW", - "OU", - "SU", - "SW", - } - CN{ - "11", - "12", - "13", - "14", - "15", - "21", - "22", - "23", - "31", - "32", - "33", - "34", - "35", - "36", - "37", - "41", - "42", - "43", - "44", - "45", - "46", - "50", - "51", - "52", - "53", - "54", - "61", - "62", - "63", - "64", - "65", - "71", - "91", - "92", - } - CO{ - "AMA", - "ANT", - "ARA", - "ATL", - "BOL", - "BOY", - "CAL", - "CAQ", - "CAS", - "CAU", - "CES", - "CHO", - "COR", - "CUN", - "DC", - "GUA", - "GUV", - "HUI", - "LAG", - "MAG", - "MET", - "NAR", - "NSA", - "PUT", - "QUI", - "RIS", - "SAN", - "SAP", - "SUC", - "TOL", - "VAC", - "VAU", - "VID", - } - CR{ - "A", - "C", - "G", - "H", - "L", - "P", - "SJ", - } - CU{ - "01", - "03", - "04", - "05", - "06", - "07", - "08", - "09", - "10", - "11", - "12", - "13", - "14", - "15", - "16", - "99", - } - CV{ - "B", - "S", - } - CV-B{ - "BV", - "PA", - "PN", - "RB", - "RG", - "SL", - "SV", - "TS", - } - CV-S{ - "BR", - "CA", - "CF", - "CR", - "MA", - "MO", - "PR", - "RS", - "SD", - "SF", - "SM", - "SO", - "SS", - "TA", - } - CY{ - "01", - "02", - "03", - "04", - "05", - "06", - } - CZ{ - "JC", - "JM", - "KA", - "KR", - "LI", - "MO", - "OL", - "PA", - "PL", - "PR", - "ST", - "US", - "VY", - "ZL", - } - CZ-JC{ - "311", - "312", - "313", - "314", - "315", - "316", - "317", - } - CZ-JM{ - "621", - "622", - "623", - "624", - "625", - "626", - "627", - } - CZ-KA{ - "411", - "412", - "413", - } - CZ-KR{ - "521", - "522", - "523", - "524", - "525", - } - CZ-LI{ - "511", - "512", - "513", - "514", - } - CZ-MO{ - "801", - "802", - "803", - "804", - "805", - "806", - } - CZ-OL{ - "711", - "712", - "713", - "714", - "715", - } - CZ-PA{ - "531", - "532", - "533", - "534", - } - CZ-PL{ - "321", - "322", - "323", - "324", - "325", - "326", - "327", - } - CZ-PR{ - "10A", - "10B", - "10C", - "10D", - "10E", - "10F", - "101", - "102", - "103", - "104", - "105", - "106", - "107", - "108", - "109", - } - CZ-ST{ - "20A", - "20B", - "20C", - "201", - "202", - "203", - "204", - "205", - "206", - "207", - "208", - "209", - } - CZ-US{ - "421", - "422", - "423", - "424", - "425", - "426", - "427", - } - CZ-VY{ - "611", - "612", - "613", - "614", - "615", - } - CZ-ZL{ - "721", - "722", - "723", - "724", - } - DE{ - "BB", - "BE", - "BW", - "BY", - "HB", - "HE", - "HH", - "MV", - "NI", - "NW", - "RP", - "SH", - "SL", - "SN", - "ST", - "TH", - } - DJ{ - "AR", - "AS", - "DI", - "DJ", - "OB", - "TA", - } - DK{ - "81", - "82", - "83", - "84", - "85", - } - DM{ - "02", - "03", - "04", - "05", - "06", - "07", - "08", - "09", - "10", - "11", - } - DO{ - "33", - "34", - "35", - "36", - "37", - "38", - "39", - "40", - "41", - "42", - } - DO-33{ - "06", - "14", - "19", - "20", - } - DO-34{ - "05", - "15", - "26", - "27", - } - DO-35{ - "09", - "18", - "25", - } - DO-36{ - "13", - "24", - "28", - } - DO-37{ - "07", - "22", - } - DO-38{ - "03", - "04", - "10", - "16", - } - DO-39{ - "23", - "29", - "30", - } - DO-40{ - "01", - "32", - } - DO-41{ - "02", - "17", - "21", - "31", - } - DO-42{ - "08", - "11", - "12", - } - DZ{ - "01", - "02", - "03", - "04", - "05", - "06", - "07", - "08", - "09", - "10", - "11", - "12", - "13", - "14", - "15", - "16", - "17", - "18", - "19", - "20", - "21", - "22", - "23", - "24", - "25", - "26", - "27", - "28", - "29", - "30", - "31", - "32", - "33", - "34", - "35", - "36", - "37", - "38", - "39", - "40", - "41", - "42", - "43", - "44", - "45", - "46", - "47", - "48", - } - EC{ - "A", - "B", - "C", - "D", - "E", - "F", - "G", - "H", - "I", - "L", - "M", - "N", - "O", - "P", - "R", - "S", - "SD", - "SE", - "T", - "U", - "W", - "X", - "Y", - "Z", - } - EE{ - "37", - "39", - "44", - "49", - "51", - "57", - "59", - "65", - "67", - "70", - "74", - "78", - "82", - "84", - "86", - } - EG{ - "ALX", - "ASN", - "AST", - "BA", - "BH", - "BNS", - "C", - "DK", - "DT", - "FYM", - "GH", - "GZ", - "IS", - "JS", - "KB", - "KFS", - "KN", - "LX", - "MN", - "MNF", - "MT", - "PTS", - "SHG", - "SHR", - "SIN", - "SUZ", - "WAD", - } - ER{ - "AN", - "DK", - "DU", - "GB", - "MA", - "SK", - } - ES{ - "AN", - "AR", - "AS", - "CB", - "CE", - "CL", - "CM", - "CN", - "CT", - "EX", - "GA", - "IB", - "MC", - "MD", - "ML", - "NC", - "PV", - "RI", - "VC", - } - ES-AN{ - "AL", - "CA", - "CO", - "GR", - "H", - "J", - "MA", - "SE", - } - ES-AR{ - "HU", - "TE", - "Z", - } - ES-AS{"O"} - ES-CB{"S"} - ES-CL{ - "AV", - "BU", - "LE", - "P", - "SA", - "SG", - "SO", - "VA", - "ZA", - } - ES-CM{ - "AB", - "CR", - "CU", - "GU", - "TO", - } - ES-CN{ - "GC", - "TF", - } - ES-CT{ - "B", - "GI", - "L", - "T", - } - ES-EX{ - "BA", - "CC", - } - ES-GA{ - "C", - "LU", - "OR", - "PO", - } - ES-IB{"PM"} - ES-MC{"MU"} - ES-MD{"M"} - ES-NC{"NA"} - ES-PV{ - "BI", - "SS", - "VI", - } - ES-RI{"LO"} - ES-VC{ - "A", - "CS", - "V", - } - ET{ - "AA", - "AF", - "AM", - "BE", - "DD", - "GA", - "HA", - "OR", - "SN", - "SO", - "TI", - } - FI{ - "01", - "02", - "03", - "04", - "05", - "06", - "07", - "08", - "09", - "10", - "11", - "12", - "13", - "14", - "15", - "16", - "17", - "18", - "19", - } - FJ{ - "01", - "02", - "03", - "04", - "05", - "06", - "07", - "08", - "09", - "10", - "11", - "12", - "13", - "14", - "C", - "E", - "N", - "R", - "W", - } - FM{ - "KSA", - "PNI", - "TRK", - "YAP", - } - FR{ - "A", - "B", - "BL", - "C", - "CP", - "D", - "E", - "F", - "G", - "GF", - "GP", - "H", - "I", - "J", - "K", - "L", - "M", - "MF", - "MQ", - "N", - "NC", - "O", - "P", - "PF", - "PM", - "Q", - "R", - "RE", - "S", - "T", - "TF", - "U", - "V", - "WF", - "YT", - } - FR-A{ - "67", - "68", - } - FR-B{ - "24", - "33", - "40", - "47", - "64", - } - FR-C{ - "03", - "15", - "43", - "63", - } - FR-D{ - "21", - "58", - "71", - "89", - } - FR-E{ - "22", - "29", - "35", - "56", - } - FR-F{ - "18", - "28", - "36", - "37", - "41", - "45", - } - FR-G{ - "08", - "10", - "51", - "52", - } - FR-H{ - "2A", - "2B", - } - FR-I{ - "25", - "39", - "70", - "90", - } - FR-J{ - "75", - "77", - "78", - "91", - "92", - "93", - "94", - "95", - } - FR-K{ - "11", - "30", - "34", - "48", - "66", - } - FR-L{ - "19", - "23", - "87", - } - FR-M{ - "54", - "55", - "57", - "88", - } - FR-N{ - "09", - "12", - "31", - "32", - "46", - "65", - "81", - "82", - } - FR-O{ - "59", - "62", - } - FR-P{ - "14", - "50", - "61", - } - FR-Q{ - "27", - "76", - } - FR-R{ - "44", - "49", - "53", - "72", - "85", - } - FR-S{ - "02", - "60", - "80", - } - FR-T{ - "16", - "17", - "79", - "86", - } - FR-U{ - "04", - "05", - "06", - "13", - "83", - "84", - } - FR-V{ - "01", - "07", - "26", - "38", - "42", - "69", - "73", - "74", - } - GA{ - "1", - "2", - "3", - "4", - "5", - "6", - "7", - "8", - "9", - } - GB{ - "EAW", - "ENG", - "GBN", - "NIR", - "SCT", - "UKM", - "WLS", - } - GB-ENG{ - "BAS", - "BBD", - "BDF", - "BDG", - "BEN", - "BEX", - "BIR", - "BKM", - "BMH", - "BNE", - "BNH", - "BNS", - "BOL", - "BPL", - "BRC", - "BRD", - "BRY", - "BST", - "BUR", - "CAM", - "CBF", - "CHE", - "CHW", - "CLD", - "CMA", - "CMD", - "CON", - "COV", - "CRY", - "DAL", - "DBY", - "DER", - "DEV", - "DNC", - "DOR", - "DUD", - "DUR", - "EAL", - "ENF", - "ERY", - "ESS", - "ESX", - "GAT", - "GLS", - "GRE", - "HAL", - "HAM", - "HAV", - "HCK", - "HEF", - "HIL", - "HMF", - "HNS", - "HPL", - "HRT", - "HRW", - "HRY", - "IOS", - "IOW", - "ISL", - "KEC", - "KEN", - "KHL", - "KIR", - "KTT", - "KWL", - "LAN", - "LBH", - "LCE", - "LDS", - "LEC", - "LEW", - "LIN", - "LIV", - "LND", - "LUT", - "MAN", - "MDB", - "MDW", - "MIK", - "MRT", - "NBL", - "NEL", - "NET", - "NFK", - "NGM", - "NLN", - "NSM", - "NTH", - "NTT", - "NTY", - "NWM", - "NYK", - "OLD", - "OXF", - "PLY", - "POL", - "POR", - "PTE", - "RCC", - "RCH", - "RDB", - "RDG", - "RIC", - "ROT", - "RUT", - "SAW", - "SFK", - "SFT", - "SGC", - "SHF", - "SHN", - "SHR", - "SKP", - "SLF", - "SLG", - "SND", - "SOL", - "SOM", - "SOS", - "SRY", - "STE", - "STH", - "STN", - "STS", - "STT", - "STY", - "SWD", - "SWK", - "TAM", - "TFW", - "THR", - "TOB", - "TRF", - "TWH", - "WAR", - "WBK", - "WFT", - "WGN", - "WIL", - "WKF", - "WLL", - "WLV", - "WND", - "WNM", - "WOK", - "WOR", - "WRL", - "WRT", - "WSM", - "WSX", - "YOR", - } - GB-NIR{ - "ABC", - "AND", - "ANN", - "BFS", - "CCG", - "DRS", - "FMO", - "LBC", - "MEA", - "MUL", - "NMD", - } - GB-SCT{ - "ABD", - "ABE", - "AGB", - "ANS", - "CLK", - "DGY", - "DND", - "EAY", - "EDH", - "EDU", - "ELN", - "ELS", - "ERW", - "FAL", - "FIF", - "GLG", - "HLD", - "IVC", - "MLN", - "MRY", - "NAY", - "NLK", - "ORK", - "PKN", - "RFW", - "SAY", - "SCB", - "SLK", - "STG", - "WDU", - "WLN", - "ZET", - } - GB-WLS{ - "AGY", - "BGE", - "BGW", - "CAY", - "CGN", - "CMN", - "CRF", - "CWY", - "DEN", - "FLN", - "GWN", - "MON", - "MTY", - "NTL", - "NWP", - "PEM", - "POW", - "RCT", - "SWA", - "TOF", - "VGL", - "WRX", - } - GD{ - "01", - "02", - "03", - "04", - "05", - "06", - "10", - } - GE{ - "AB", - "AJ", - "GU", - "IM", - "KA", - "KK", - "MM", - "RL", - "SJ", - "SK", - "SZ", - "TB", - } - GH{ - "AA", - "AH", - "BA", - "CP", - "EP", - "NP", - "TV", - "UE", - "UW", - "WP", - } - GL{ - "KU", - "QA", - "QE", - "SM", - } - GM{ - "B", - "L", - "M", - "N", - "U", - "W", - } - GN{ - "B", - "C", - "D", - "F", - "K", - "L", - "M", - "N", - } - GN-B{ - "BF", - "BK", - "FR", - "GA", - "KN", - } - GN-D{ - "CO", - "DU", - "FO", - "KD", - "TE", - } - GN-F{ - "DB", - "DI", - "FA", - "KS", - } - GN-K{ - "KA", - "KE", - "KO", - "MD", - "SI", - } - GN-L{ - "KB", - "LA", - "LE", - "ML", - "TO", - } - GN-M{ - "DL", - "MM", - "PI", - } - GN-N{ - "BE", - "GU", - "LO", - "MC", - "NZ", - "YO", - } - GQ{ - "C", - "I", - } - GQ-C{ - "CS", - "KN", - "LI", - "WN", - } - GQ-I{ - "AN", - "BN", - "BS", - } - GR{ - "69", - "A", - "B", - "C", - "D", - "E", - "F", - "G", - "H", - "I", - "J", - "K", - "L", - "M", - } - GR-A{ - "52", - "55", - "71", - "72", - "73", - } - GR-B{ - "53", - "54", - "57", - "59", - "61", - "62", - "64", - } - GR-C{ - "51", - "56", - "58", - "63", - } - GR-D{ - "31", - "32", - "33", - "34", - } - GR-E{ - "41", - "42", - "43", - "44", - } - GR-F{ - "21", - "22", - "23", - "24", - } - GR-G{ - "01", - "13", - "14", - } - GR-H{ - "03", - "04", - "05", - "06", - "07", - } - GR-I{"A1"} - GR-J{ - "11", - "12", - "15", - "16", - "17", - } - GR-K{ - "83", - "84", - "85", - } - GR-L{ - "81", - "82", - } - GR-M{ - "91", - "92", - "93", - "94", - } - GT{ - "AV", - "BV", - "CM", - "CQ", - "ES", - "GU", - "HU", - "IZ", - "JA", - "JU", - "PE", - "PR", - "QC", - "QZ", - "RE", - "SA", - "SM", - "SO", - "SR", - "SU", - "TO", - "ZA", - } - GW{ - "BS", - "L", - "N", - "S", - } - GW-L{ - "BA", - "GA", - } - GW-N{ - "BM", - "CA", - "OI", - } - GW-S{ - "BL", - "QU", - "TO", - } - GY{ - "BA", - "CU", - "DE", - "EB", - "ES", - "MA", - "PM", - "PT", - "UD", - "UT", - } - HN{ - "AT", - "CH", - "CL", - "CM", - "CP", - "CR", - "EP", - "FM", - "GD", - "IB", - "IN", - "LE", - "LP", - "OC", - "OL", - "SB", - "VA", - "YO", - } - HR{ - "01", - "02", - "03", - "04", - "05", - "06", - "07", - "08", - "09", - "10", - "11", - "12", - "13", - "14", - "15", - "16", - "17", - "18", - "19", - "20", - "21", - } - HT{ - "AR", - "CE", - "GA", - "ND", - "NE", - "NI", - "NO", - "OU", - "SD", - "SE", - } - HU{ - "BA", - "BC", - "BE", - "BK", - "BU", - "BZ", - "CS", - "DE", - "DU", - "EG", - "ER", - "FE", - "GS", - "GY", - "HB", - "HE", - "HV", - "JN", - "KE", - "KM", - "KV", - "MI", - "NK", - "NO", - "NY", - "PE", - "PS", - "SD", - "SF", - "SH", - "SK", - "SN", - "SO", - "SS", - "ST", - "SZ", - "TB", - "TO", - "VA", - "VE", - "VM", - "ZA", - "ZE", - } - ID{ - "JW", - "KA", - "ML", - "NU", - "PP", - "SL", - "SM", - } - ID-JW{ - "BT", - "JB", - "JI", - "JK", - "JT", - "YO", - } - ID-KA{ - "KB", - "KI", - "KS", - "KT", - "KU", - } - ID-ML{ - "MA", - "MU", - } - ID-NU{ - "BA", - "NB", - "NT", - } - ID-PP{ - "PA", - "PB", - } - ID-SL{ - "GO", - "SA", - "SG", - "SN", - "SR", - "ST", - } - ID-SM{ - "AC", - "BB", - "BE", - "JA", - "KR", - "LA", - "RI", - "SB", - "SS", - "SU", - } - IE{ - "C", - "L", - "M", - "U", - } - IE-C{ - "G", - "LM", - "MO", - "RN", - "SO", - } - IE-L{ - "CW", - "D", - "KE", - "KK", - "LD", - "LH", - "LS", - "MH", - "OY", - "WH", - "WW", - "WX", - } - IE-M{ - "CE", - "CO", - "KY", - "LK", - "TA", - "WD", - } - IE-U{ - "CN", - "DL", - "MN", - } - IL{ - "D", - "HA", - "JM", - "M", - "TA", - "Z", - } - IN{ - "AN", - "AP", - "AR", - "AS", - "BR", - "CH", - "CT", - "DD", - "DL", - "DN", - "GA", - "GJ", - "HP", - "HR", - "JH", - "JK", - "KA", - "KL", - "LD", - "MH", - "ML", - "MN", - "MP", - "MZ", - "NL", - "OR", - "PB", - "PY", - "RJ", - "SK", - "TG", - "TN", - "TR", - "UP", - "UT", - "WB", - } - IQ{ - "AN", - "AR", - "BA", - "BB", - "BG", - "DA", - "DI", - "DQ", - "KA", - "KI", - "MA", - "MU", - "NA", - "NI", - "QA", - "SD", - "SU", - "WA", - } - IR{ - "01", - "02", - "03", - "04", - "05", - "06", - "07", - "08", - "10", - "11", - "12", - "13", - "14", - "15", - "16", - "17", - "18", - "19", - "20", - "21", - "22", - "23", - "24", - "25", - "26", - "27", - "28", - "29", - "30", - "31", - "32", - } - IS{ - "1", - "2", - "3", - "4", - "5", - "6", - "7", - "8", - } - IT{ - "21", - "23", - "25", - "32", - "34", - "36", - "42", - "45", - "52", - "55", - "57", - "62", - "65", - "67", - "72", - "75", - "77", - "78", - "82", - "88", - } - IT-21{ - "AL", - "AT", - "BI", - "CN", - "NO", - "TO", - "VB", - "VC", - } - IT-23{"AO"} - IT-25{ - "BG", - "BS", - "CO", - "CR", - "LC", - "LO", - "MB", - "MI", - "MN", - "PV", - "SO", - "VA", - } - IT-32{ - "BZ", - "TN", - } - IT-34{ - "BL", - "PD", - "RO", - "TV", - "VE", - "VI", - "VR", - } - IT-36{ - "GO", - "PN", - "TS", - "UD", - } - IT-42{ - "GE", - "IM", - "SP", - "SV", - } - IT-45{ - "BO", - "FC", - "FE", - "MO", - "PC", - "PR", - "RA", - "RE", - "RN", - } - IT-52{ - "AR", - "FI", - "GR", - "LI", - "LU", - "MS", - "PI", - "PO", - "PT", - "SI", - } - IT-55{ - "PG", - "TR", - } - IT-57{ - "AN", - "AP", - "FM", - "MC", - "PU", - } - IT-62{ - "FR", - "LT", - "RI", - "RM", - "VT", - } - IT-65{ - "AQ", - "CH", - "PE", - "TE", - } - IT-67{ - "CB", - "IS", - } - IT-72{ - "AV", - "BN", - "CE", - "NA", - "SA", - } - IT-75{ - "BA", - "BR", - "BT", - "FG", - "LE", - "TA", - } - IT-77{ - "MT", - "PZ", - } - IT-78{ - "CS", - "CZ", - "KR", - "RC", - "VV", - } - IT-82{ - "AG", - "CL", - "CT", - "EN", - "ME", - "PA", - "RG", - "SR", - "TP", - } - IT-88{ - "CA", - "CI", - "NU", - "OG", - "OR", - "OT", - "SS", - "VS", - } - JM{ - "01", - "02", - "03", - "04", - "05", - "06", - "07", - "08", - "09", - "10", - "11", - "12", - "13", - "14", - } - JO{ - "AJ", - "AM", - "AQ", - "AT", - "AZ", - "BA", - "IR", - "JA", - "KA", - "MA", - "MD", - "MN", - } - JP{ - "01", - "02", - "03", - "04", - "05", - "06", - "07", - "08", - "09", - "10", - "11", - "12", - "13", - "14", - "15", - "16", - "17", - "18", - "19", - "20", - "21", - "22", - "23", - "24", - "25", - "26", - "27", - "28", - "29", - "30", - "31", - "32", - "33", - "34", - "35", - "36", - "37", - "38", - "39", - "40", - "41", - "42", - "43", - "44", - "45", - "46", - "47", - } - KE{ - "01", - "02", - "03", - "04", - "05", - "06", - "07", - "08", - "09", - "10", - "11", - "12", - "13", - "14", - "15", - "16", - "17", - "18", - "19", - "20", - "21", - "22", - "23", - "24", - "25", - "26", - "27", - "28", - "29", - "30", - "31", - "32", - "33", - "34", - "35", - "36", - "37", - "38", - "39", - "40", - "41", - "42", - "43", - "44", - "45", - "46", - "47", - } - KG{ - "B", - "C", - "GB", - "GO", - "J", - "N", - "O", - "T", - "Y", - } - KH{ - "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", - } - KI{ - "G", - "L", - "P", - } - KM{ - "A", - "G", - "M", - } - KN{ - "K", - "N", - } - KN-K{ - "01", - "02", - "03", - "06", - "08", - "09", - "11", - "13", - "15", - } - KN-N{ - "04", - "05", - "07", - "10", - "12", - } - KP{ - "01", - "02", - "03", - "04", - "05", - "06", - "07", - "08", - "09", - "10", - "13", - } - KR{ - "11", - "26", - "27", - "28", - "29", - "30", - "31", - "41", - "42", - "43", - "44", - "45", - "46", - "47", - "48", - "49", - "50", - } - KW{ - "AH", - "FA", - "HA", - "JA", - "KU", - "MU", - } - KZ{ - "AKM", - "AKT", - "ALA", - "ALM", - "AST", - "ATY", - "KAR", - "KUS", - "KZY", - "MAN", - "PAV", - "SEV", - "VOS", - "YUZ", - "ZAP", - "ZHA", - } - LA{ - "AT", - "BK", - "BL", - "CH", - "HO", - "KH", - "LM", - "LP", - "OU", - "PH", - "SL", - "SV", - "VI", - "VT", - "XA", - "XE", - "XI", - "XS", - } - LB{ - "AK", - "AS", - "BA", - "BH", - "BI", - "JA", - "JL", - "NA", - } - LC{ - "01", - "02", - "03", - "05", - "06", - "07", - "08", - "10", - "11", - "12", - } - LI{ - "01", - "02", - "03", - "04", - "05", - "06", - "07", - "08", - "09", - "10", - "11", - } - LK{ - "1", - "2", - "3", - "4", - "5", - "6", - "7", - "8", - "9", - } - LK-1{ - "52", - "71", - "81", - } - LK-2{ - "11", - "31", - "51", - } - LK-3{ - "12", - "33", - "41", - } - LK-4{ - "13", - "21", - "42", - "61", - "92", - } - LK-5{ - "22", - "32", - "43", - } - LK-6{ - "45", - "82", - } - LK-7{ - "23", - "72", - } - LK-8{ - "62", - "91", - } - LK-9{ - "44", - "53", - } - LR{ - "BG", - "BM", - "CM", - "GB", - "GG", - "GK", - "GP", - "LO", - "MG", - "MO", - "MY", - "NI", - "RG", - "RI", - "SI", - } - LS{ - "A", - "B", - "C", - "D", - "E", - "F", - "G", - "H", - "J", - "K", - } - LT{ - "01", - "02", - "03", - "04", - "05", - "06", - "07", - "08", - "09", - "10", - "11", - "12", - "13", - "14", - "15", - "16", - "17", - "18", - "19", - "20", - "21", - "22", - "23", - "24", - "25", - "26", - "27", - "28", - "29", - "30", - "31", - "32", - "33", - "34", - "35", - "36", - "37", - "38", - "39", - "40", - "41", - "42", - "43", - "44", - "45", - "46", - "47", - "48", - "49", - "50", - "51", - "52", - "53", - "54", - "55", - "56", - "57", - "58", - "59", - "60", - "AL", - "KL", - "KU", - "MR", - "PN", - "SA", - "TA", - "TE", - "UT", - "VL", - } - LU{ - "CA", - "CL", - "DI", - "EC", - "ES", - "GR", - "LU", - "ME", - "RD", - "RM", - "VD", - "WI", - } - LV{ - "001", - "002", - "003", - "004", - "005", - "006", - "007", - "008", - "009", - "010", - "011", - "012", - "013", - "014", - "015", - "016", - "017", - "018", - "019", - "020", - "021", - "022", - "023", - "024", - "025", - "026", - "027", - "028", - "029", - "030", - "031", - "032", - "033", - "034", - "035", - "036", - "037", - "038", - "039", - "040", - "041", - "042", - "043", - "044", - "045", - "046", - "047", - "048", - "049", - "050", - "051", - "052", - "053", - "054", - "055", - "056", - "057", - "058", - "059", - "060", - "061", - "062", - "063", - "064", - "065", - "066", - "067", - "068", - "069", - "070", - "071", - "072", - "073", - "074", - "075", - "076", - "077", - "078", - "079", - "080", - "081", - "082", - "083", - "084", - "085", - "086", - "087", - "088", - "089", - "090", - "091", - "092", - "093", - "094", - "095", - "096", - "097", - "098", - "099", - "100", - "101", - "102", - "103", - "104", - "105", - "106", - "107", - "108", - "109", - "110", - "DGV", - "JEL", - "JKB", - "JUR", - "LPX", - "REZ", - "RIX", - "VEN", - "VMR", - } - LY{ - "BA", - "BU", - "DR", - "GT", - "JA", - "JG", - "JI", - "JU", - "KF", - "MB", - "MI", - "MJ", - "MQ", - "NL", - "NQ", - "SB", - "SR", - "TB", - "WA", - "WD", - "WS", - "ZA", - } - MA{ - "01", - "02", - "03", - "04", - "05", - "06", - "07", - "08", - "09", - "10", - "11", - "12", - "13", - "14", - "15", - "16", - } - MA-01{ - "CHE", - "FAH", - "LAR", - "TET", - "TNG", - } - MA-02{ - "KEN", - "SIK", - } - MA-03{ - "HOC", - "TAO", - "TAZ", - } - MA-04{ - "BER", - "FIG", - "JRA", - "NAD", - "OUJ", - "TAI", - } - MA-05{ - "BOM", - "FES", - "MOU", - "SEF", - } - MA-06{ - "ERR", - "HAJ", - "IFR", - "KHN", - "MEK", - } - MA-07{ - "KHE", - "RAB", - "SAL", - "SKH", - } - MA-08{ - "CAS", - "MED", - "MOH", - "NOU", - } - MA-09{ - "BES", - "KHO", - "SET", - } - MA-10{ - "JDI", - "SAF", - } - MA-11{ - "CHI", - "ESI", - "HAO", - "KES", - "MMD", - "MMN", - "SYB", - } - MA-12{ - "AZI", - "BEM", - } - MA-13{ - "AGD", - "CHT", - "INE", - "OUA", - "TAR", - "TIZ", - "ZAG", - } - MA-14{ - "ASZ", - "ESM", - "GUE", - "TAT", - "TNT", - } - MA-15{ - "BOD", - "LAA", - } - MA-16{ - "AOU", - "OUD", - } - MC{ - "CL", - "CO", - "FO", - "GA", - "JE", - "LA", - "MA", - "MC", - "MG", - "MO", - "MU", - "PH", - "SD", - "SO", - "SP", - "SR", - "VR", - } - MD{ - "AN", - "BA", - "BD", - "BR", - "BS", - "CA", - "CL", - "CM", - "CR", - "CS", - "CT", - "CU", - "DO", - "DR", - "DU", - "ED", - "FA", - "FL", - "GA", - "GL", - "HI", - "IA", - "LE", - "NI", - "OC", - "OR", - "RE", - "RI", - "SD", - "SI", - "SN", - "SO", - "ST", - "SV", - "TA", - "TE", - "UN", - } - ME{ - "01", - "02", - "03", - "04", - "05", - "06", - "07", - "08", - "09", - "10", - "11", - "12", - "13", - "14", - "15", - "16", - "17", - "18", - "19", - "20", - "21", - "22", - "23", - } - MG{ - "A", - "D", - "F", - "M", - "T", - "U", - } - MH{ - "L", - "T", - } - MH-L{ - "ALL", - "EBO", - "ENI", - "JAB", - "JAL", - "KIL", - "KWA", - "LAE", - "LIB", - "NMK", - "NMU", - "RON", - "UJA", - "WTH", - } - MH-T{ - "ALK", - "ARN", - "AUR", - "LIK", - "MAJ", - "MAL", - "MEJ", - "MIL", - "UTI", - "WTJ", - } - MK{ - "02", - "03", - "04", - "05", - "06", - "07", - "08", - "10", - "11", - "12", - "13", - "14", - "16", - "18", - "19", - "20", - "21", - "22", - "23", - "24", - "25", - "26", - "27", - "30", - "32", - "33", - "34", - "35", - "36", - "37", - "40", - "41", - "42", - "43", - "44", - "45", - "46", - "47", - "48", - "49", - "50", - "51", - "52", - "53", - "54", - "55", - "56", - "58", - "59", - "60", - "61", - "62", - "63", - "64", - "65", - "66", - "67", - "69", - "70", - "71", - "72", - "73", - "74", - "75", - "76", - "78", - "80", - "81", - "82", - "83", - "85", - } - ML{ - "1", - "2", - "3", - "4", - "5", - "6", - "7", - "8", - "BKO", - } - MM{ - "01", - "02", - "03", - "04", - "05", - "06", - "07", - "11", - "12", - "13", - "14", - "15", - "16", - "17", - "18", - } - MN{ - "1", - "035", - "037", - "039", - "041", - "043", - "046", - "047", - "049", - "051", - "053", - "055", - "057", - "059", - "061", - "063", - "064", - "065", - "067", - "069", - "071", - "073", - } - MR{ - "01", - "02", - "03", - "04", - "05", - "06", - "07", - "08", - "09", - "10", - "11", - "12", - "13", - "14", - "15", - } - MT{ - "01", - "02", - "03", - "04", - "05", - "06", - "07", - "08", - "09", - "10", - "11", - "12", - "13", - "14", - "15", - "16", - "17", - "18", - "19", - "20", - "21", - "22", - "23", - "24", - "25", - "26", - "27", - "28", - "29", - "30", - "31", - "32", - "33", - "34", - "35", - "36", - "37", - "38", - "39", - "40", - "41", - "42", - "43", - "44", - "45", - "46", - "47", - "48", - "49", - "50", - "51", - "52", - "53", - "54", - "55", - "56", - "57", - "58", - "59", - "60", - "61", - "62", - "63", - "64", - "65", - "66", - "67", - "68", - } - MU{ - "AG", - "BL", - "BR", - "CC", - "CU", - "FL", - "GP", - "MO", - "PA", - "PL", - "PU", - "PW", - "QB", - "RO", - "RR", - "SA", - "VP", - } - MV{ - "CE", - "MLE", - "NC", - "NO", - "SC", - "SU", - "UN", - "US", - } - MV-CE{ - "12", - "14", - "17", - } - MV-NC{ - "00", - "02", - "04", - "26", - } - MV-NO{ - "03", - "13", - "20", - "25", - } - MV-SC{ - "27", - "28", - } - MV-SU{ - "01", - "29", - } - MV-UN{ - "07", - "23", - "24", - } - MV-US{ - "05", - "08", - } - MW{ - "C", - "N", - "S", - } - MW-C{ - "DE", - "DO", - "KS", - "LI", - "MC", - "NI", - "NK", - "NU", - "SA", - } - MW-N{ - "CT", - "KR", - "LK", - "MZ", - "NB", - "RU", - } - MW-S{ - "BA", - "BL", - "CK", - "CR", - "MG", - "MH", - "MU", - "MW", - "NE", - "NS", - "PH", - "TH", - "ZO", - } - MX{ - "AGU", - "BCN", - "BCS", - "CAM", - "CHH", - "CHP", - "COA", - "COL", - "DIF", - "DUR", - "GRO", - "GUA", - "HID", - "JAL", - "MEX", - "MIC", - "MOR", - "NAY", - "NLE", - "OAX", - "PUE", - "QUE", - "ROO", - "SIN", - "SLP", - "SON", - "TAB", - "TAM", - "TLA", - "VER", - "YUC", - "ZAC", - } - MY{ - "01", - "02", - "03", - "04", - "05", - "06", - "07", - "08", - "09", - "10", - "11", - "12", - "13", - "14", - "15", - "16", - } - MZ{ - "A", - "B", - "G", - "I", - "L", - "MPM", - "N", - "P", - "Q", - "S", - "T", - } - NA{ - "CA", - "ER", - "HA", - "KA", - "KE", - "KH", - "KU", - "KW", - "OD", - "OH", - "ON", - "OS", - "OT", - "OW", - } - NE{ - "1", - "2", - "3", - "4", - "5", - "6", - "7", - "8", - } - NG{ - "AB", - "AD", - "AK", - "AN", - "BA", - "BE", - "BO", - "BY", - "CR", - "DE", - "EB", - "ED", - "EK", - "EN", - "FC", - "GO", - "IM", - "JI", - "KD", - "KE", - "KN", - "KO", - "KT", - "KW", - "LA", - "NA", - "NI", - "OG", - "ON", - "OS", - "OY", - "PL", - "RI", - "SO", - "TA", - "YO", - "ZA", - } - NI{ - "AN", - "AS", - "BO", - "CA", - "CI", - "CO", - "ES", - "GR", - "JI", - "LE", - "MD", - "MN", - "MS", - "MT", - "NS", - "RI", - "SJ", - } - NL{ - "AW", - "BQ1", - "BQ2", - "BQ3", - "CW", - "DR", - "FL", - "FR", - "GE", - "GR", - "LI", - "NB", - "NH", - "OV", - "SX", - "UT", - "ZE", - "ZH", - } - NO{ - "01", - "02", - "03", - "04", - "05", - "06", - "07", - "08", - "09", - "10", - "11", - "12", - "14", - "15", - "16", - "17", - "18", - "19", - "20", - "21", - "22", - } - NP{ - "1", - "2", - "3", - "4", - "5", - } - NP-1{ - "BA", - "JA", - "NA", - } - NP-2{ - "BH", - "KA", - "RA", - } - NP-3{ - "DH", - "GA", - "LU", - } - NP-4{ - "KO", - "ME", - "SA", - } - NP-5{ - "MA", - "SE", - } - NR{ - "01", - "02", - "03", - "04", - "05", - "06", - "07", - "08", - "09", - "10", - "11", - "12", - "13", - "14", - } - NZ{ - "AUK", - "BOP", - "CAN", - "CIT", - "GIS", - "HKB", - "MBH", - "MWT", - "NSN", - "NTL", - "OTA", - "STL", - "TAS", - "TKI", - "WGN", - "WKO", - "WTC", - } - OM{ - "BJ", - "BS", - "BU", - "DA", - "MA", - "MU", - "SJ", - "SS", - "WU", - "ZA", - "ZU", - } - PA{ - "1", - "2", - "3", - "4", - "5", - "6", - "7", - "8", - "9", - "10", - "EM", - "KY", - "NB", - } - PE{ - "AMA", - "ANC", - "APU", - "ARE", - "AYA", - "CAJ", - "CAL", - "CUS", - "HUC", - "HUV", - "ICA", - "JUN", - "LAL", - "LAM", - "LIM", - "LMA", - "LOR", - "MDD", - "MOQ", - "PAS", - "PIU", - "PUN", - "SAM", - "TAC", - "TUM", - "UCA", - } - PG{ - "CPK", - "CPM", - "EBR", - "EHG", - "EPW", - "ESW", - "GPK", - "HLA", - "JWK", - "MBA", - "MPL", - "MPM", - "MRL", - "NCD", - "NIK", - "NPP", - "NSB", - "SAN", - "SHM", - "WBK", - "WHM", - "WPD", - } - PH{ - "00", - "01", - "02", - "03", - "05", - "06", - "07", - "08", - "09", - "10", - "11", - "12", - "13", - "14", - "15", - "40", - "41", - } - PH-01{ - "ILN", - "ILS", - "LUN", - "PAN", - } - PH-02{ - "BTN", - "CAG", - "ISA", - "NUV", - "QUI", - } - PH-03{ - "AUR", - "BAN", - "BUL", - "NUE", - "PAM", - "TAR", - "ZMB", - } - PH-05{ - "ALB", - "CAN", - "CAS", - "CAT", - "MAS", - "SOR", - } - PH-06{ - "AKL", - "ANT", - "CAP", - "GUI", - "ILI", - "NEC", - } - PH-07{ - "BOH", - "CEB", - "NER", - "SIG", - } - PH-08{ - "BIL", - "EAS", - "LEY", - "NSA", - "SLE", - "WSA", - } - PH-09{ - "BAS", - "ZAN", - "ZAS", - "ZSI", - } - PH-10{ - "BUK", - "CAM", - "MSC", - "MSR", - } - PH-11{ - "COM", - "DAO", - "DAS", - "DAV", - "DVO", - "SAR", - "SCO", - } - PH-12{ - "LAN", - "NCO", - "SUK", - } - PH-13{ - "AGN", - "AGS", - "DIN", - "SUN", - "SUR", - } - PH-14{ - "LAS", - "MAG", - "SLU", - "TAW", - } - PH-15{ - "ABR", - "APA", - "BEN", - "IFU", - "KAL", - "MOU", - } - PH-40{ - "BTG", - "CAV", - "LAG", - "QUE", - "RIZ", - } - PH-41{ - "MAD", - "MDC", - "MDR", - "PLW", - "ROM", - } - PK{ - "BA", - "GB", - "IS", - "JK", - "KP", - "PB", - "SD", - "TA", - } - PL{ - "DS", - "KP", - "LB", - "LD", - "LU", - "MA", - "MZ", - "OP", - "PD", - "PK", - "PM", - "SK", - "SL", - "WN", - "WP", - "ZP", - } - PS{ - "BTH", - "DEB", - "GZA", - "HBN", - "JEM", - "JEN", - "JRH", - "KYS", - "NBS", - "NGZ", - "QQA", - "RBH", - "RFH", - "SLT", - "TBS", - "TKM", - } - PT{ - "01", - "02", - "03", - "04", - "05", - "06", - "07", - "08", - "09", - "10", - "11", - "12", - "13", - "14", - "15", - "16", - "17", - "18", - "20", - "30", - } - PW{ - "002", - "004", - "010", - "050", - "100", - "150", - "212", - "214", - "218", - "222", - "224", - "226", - "227", - "228", - "350", - "370", - } - PY{ - "1", - "2", - "3", - "4", - "5", - "6", - "7", - "8", - "9", - "10", - "11", - "12", - "13", - "14", - "15", - "16", - "19", - "ASU", - } - QA{ - "DA", - "KH", - "MS", - "RA", - "US", - "WA", - "ZA", - } - RO{ - "AB", - "AG", - "AR", - "B", - "BC", - "BH", - "BN", - "BR", - "BT", - "BV", - "BZ", - "CJ", - "CL", - "CS", - "CT", - "CV", - "DB", - "DJ", - "GJ", - "GL", - "GR", - "HD", - "HR", - "IF", - "IL", - "IS", - "MH", - "MM", - "MS", - "NT", - "OT", - "PH", - "SB", - "SJ", - "SM", - "SV", - "TL", - "TM", - "TR", - "VL", - "VN", - "VS", - } - RS{ - "00", - "08", - "09", - "10", - "11", - "12", - "13", - "14", - "15", - "16", - "17", - "18", - "19", - "20", - "21", - "22", - "23", - "24", - "KM", - "VO", - } - RS-KM{ - "25", - "26", - "27", - "28", - "29", - } - RS-VO{ - "01", - "02", - "03", - "04", - "05", - "06", - "07", - } - RU{ - "AD", - "AL", - "ALT", - "AMU", - "ARK", - "AST", - "BA", - "BEL", - "BRY", - "BU", - "CE", - "CHE", - "CHU", - "CU", - "DA", - "IN", - "IRK", - "IVA", - "KAM", - "KB", - "KC", - "KDA", - "KEM", - "KGD", - "KGN", - "KHA", - "KHM", - "KIR", - "KK", - "KL", - "KLU", - "KO", - "KOS", - "KR", - "KRS", - "KYA", - "LEN", - "LIP", - "MAG", - "ME", - "MO", - "MOS", - "MOW", - "MUR", - "NEN", - "NGR", - "NIZ", - "NVS", - "OMS", - "ORE", - "ORL", - "PER", - "PNZ", - "PRI", - "PSK", - "ROS", - "RYA", - "SA", - "SAK", - "SAM", - "SAR", - "SE", - "SMO", - "SPE", - "STA", - "SVE", - "TA", - "TAM", - "TOM", - "TUL", - "TVE", - "TY", - "TYU", - "UD", - "ULY", - "VGG", - "VLA", - "VLG", - "VOR", - "YAN", - "YAR", - "YEV", - "ZAB", - } - RW{ - "01", - "02", - "03", - "04", - "05", - } - SA{ - "01", - "02", - "03", - "04", - "05", - "06", - "07", - "08", - "09", - "10", - "11", - "12", - "14", - } - SB{ - "CE", - "CH", - "CT", - "GU", - "IS", - "MK", - "ML", - "RB", - "TE", - "WE", - } - SC{ - "01", - "02", - "03", - "04", - "05", - "06", - "07", - "08", - "09", - "10", - "11", - "12", - "13", - "14", - "15", - "16", - "17", - "18", - "19", - "20", - "21", - "22", - "23", - "24", - "25", - } - SD{ - "DC", - "DE", - "DN", - "DS", - "DW", - "GD", - "GK", - "GZ", - "KA", - "KH", - "KN", - "KS", - "NB", - "NO", - "NR", - "NW", - "RS", - "SI", - } - SE{ - "AB", - "AC", - "BD", - "C", - "D", - "E", - "F", - "G", - "H", - "I", - "K", - "M", - "N", - "O", - "S", - "T", - "U", - "W", - "X", - "Y", - "Z", - } - SG{ - "01", - "02", - "03", - "04", - "05", - } - SH{ - "AC", - "HL", - "TA", - } - SI{ - "001", - "002", - "003", - "004", - "005", - "006", - "007", - "008", - "009", - "010", - "011", - "012", - "013", - "014", - "015", - "016", - "017", - "018", - "019", - "020", - "021", - "022", - "023", - "024", - "025", - "026", - "027", - "028", - "029", - "030", - "031", - "032", - "033", - "034", - "035", - "036", - "037", - "038", - "039", - "040", - "041", - "042", - "043", - "044", - "045", - "046", - "047", - "048", - "049", - "050", - "051", - "052", - "053", - "054", - "055", - "056", - "057", - "058", - "059", - "060", - "061", - "062", - "063", - "064", - "065", - "066", - "067", - "068", - "069", - "070", - "071", - "072", - "073", - "074", - "075", - "076", - "077", - "078", - "079", - "080", - "081", - "082", - "083", - "084", - "085", - "086", - "087", - "088", - "089", - "090", - "091", - "092", - "093", - "094", - "095", - "096", - "097", - "098", - "099", - "100", - "101", - "102", - "103", - "104", - "105", - "106", - "107", - "108", - "109", - "110", - "111", - "112", - "113", - "114", - "115", - "116", - "117", - "118", - "119", - "120", - "121", - "122", - "123", - "124", - "125", - "126", - "127", - "128", - "129", - "130", - "131", - "132", - "133", - "134", - "135", - "136", - "137", - "138", - "139", - "140", - "141", - "142", - "143", - "144", - "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", - "191", - "192", - "193", - "194", - "195", - "196", - "197", - "198", - "199", - "200", - "201", - "202", - "203", - "204", - "205", - "206", - "207", - "208", - "209", - "210", - "211", - "212", - } - SK{ - "BC", - "BL", - "KI", - "NI", - "PV", - "TA", - "TC", - "ZI", - } - SL{ - "E", - "N", - "S", - "W", - } - SM{ - "01", - "02", - "03", - "04", - "05", - "06", - "07", - "08", - "09", - } - SN{ - "DB", - "DK", - "FK", - "KA", - "KD", - "KE", - "KL", - "LG", - "MT", - "SE", - "SL", - "TC", - "TH", - "ZG", - } - SO{ - "AW", - "BK", - "BN", - "BR", - "BY", - "GA", - "GE", - "HI", - "JD", - "JH", - "MU", - "NU", - "SA", - "SD", - "SH", - "SO", - "TO", - "WO", - } - SR{ - "BR", - "CM", - "CR", - "MA", - "NI", - "PM", - "PR", - "SA", - "SI", - "WA", - } - SS{ - "BN", - "BW", - "EC", - "EE", - "EW", - "JG", - "LK", - "NU", - "UY", - "WR", - } - ST{ - "P", - "S", - } - SV{ - "AH", - "CA", - "CH", - "CU", - "LI", - "MO", - "PA", - "SA", - "SM", - "SO", - "SS", - "SV", - "UN", - "US", - } - SY{ - "DI", - "DR", - "DY", - "HA", - "HI", - "HL", - "HM", - "ID", - "LA", - "QU", - "RA", - "RD", - "SU", - "TA", - } - SZ{ - "HH", - "LU", - "MA", - "SH", - } - TD{ - "BA", - "BG", - "BO", - "CB", - "EE", - "EO", - "GR", - "HL", - "KA", - "LC", - "LO", - "LR", - "MA", - "MC", - "ME", - "MO", - "ND", - "OD", - "SA", - "SI", - "TA", - "TI", - "WF", - } - TG{ - "C", - "K", - "M", - "P", - "S", - } - TH{ - "10", - "11", - "12", - "13", - "14", - "15", - "16", - "17", - "18", - "19", - "20", - "21", - "22", - "23", - "24", - "25", - "26", - "27", - "30", - "31", - "32", - "33", - "34", - "35", - "36", - "37", - "38", - "39", - "40", - "41", - "42", - "43", - "44", - "45", - "46", - "47", - "48", - "49", - "50", - "51", - "52", - "53", - "54", - "55", - "56", - "57", - "58", - "60", - "61", - "62", - "63", - "64", - "65", - "66", - "67", - "70", - "71", - "72", - "73", - "74", - "75", - "76", - "77", - "80", - "81", - "82", - "83", - "84", - "85", - "86", - "90", - "91", - "92", - "93", - "94", - "95", - "96", - "S", - } - TJ{ - "DU", - "GB", - "KT", - "SU", - } - TL{ - "AL", - "AN", - "BA", - "BO", - "CO", - "DI", - "ER", - "LA", - "LI", - "MF", - "MT", - "OE", - "VI", - } - TM{ - "A", - "B", - "D", - "L", - "M", - "S", - } - TN{ - "11", - "12", - "13", - "14", - "21", - "22", - "23", - "31", - "32", - "33", - "34", - "41", - "42", - "43", - "51", - "52", - "53", - "61", - "71", - "72", - "73", - "81", - "82", - "83", - } - TO{ - "01", - "02", - "03", - "04", - "05", - } - TR{ - "01", - "02", - "03", - "04", - "05", - "06", - "07", - "08", - "09", - "10", - "11", - "12", - "13", - "14", - "15", - "16", - "17", - "18", - "19", - "20", - "21", - "22", - "23", - "24", - "25", - "26", - "27", - "28", - "29", - "30", - "31", - "32", - "33", - "34", - "35", - "36", - "37", - "38", - "39", - "40", - "41", - "42", - "43", - "44", - "45", - "46", - "47", - "48", - "49", - "50", - "51", - "52", - "53", - "54", - "55", - "56", - "57", - "58", - "59", - "60", - "61", - "62", - "63", - "64", - "65", - "66", - "67", - "68", - "69", - "70", - "71", - "72", - "73", - "74", - "75", - "76", - "77", - "78", - "79", - "80", - "81", - } - TT{ - "ARI", - "CHA", - "CTT", - "DMN", - "MRC", - "PED", - "POS", - "PRT", - "PTF", - "SFO", - "SGE", - "SIP", - "SJL", - "TOB", - "TUP", - } - TV{ - "FUN", - "NIT", - "NKF", - "NKL", - "NMA", - "NMG", - "NUI", - "VAI", - } - TW{ - "CHA", - "CYI", - "CYQ", - "HSQ", - "HSZ", - "HUA", - "ILA", - "KEE", - "KHH", - "KIN", - "LIE", - "MIA", - "NAN", - "NWT", - "PEN", - "PIF", - "TAO", - "TNN", - "TPE", - "TTT", - "TXG", - "YUN", - } - TZ{ - "01", - "02", - "03", - "04", - "05", - "06", - "07", - "08", - "09", - "10", - "11", - "12", - "13", - "14", - "15", - "16", - "17", - "18", - "19", - "20", - "21", - "22", - "23", - "24", - "25", - "26", - "27", - "28", - "29", - "30", - } - UA{ - "05", - "07", - "09", - "12", - "14", - "18", - "21", - "23", - "26", - "30", - "32", - "35", - "40", - "43", - "46", - "48", - "51", - "53", - "56", - "59", - "61", - "63", - "65", - "68", - "71", - "74", - "77", - } - UG{ - "C", - "E", - "N", - "W", - } - UG-C{ - "101", - "102", - "103", - "104", - "105", - "106", - "107", - "108", - "109", - "110", - "111", - "112", - "113", - "114", - "115", - "116", - "117", - "118", - "119", - "120", - "121", - "122", - "123", - "124", - } - UG-E{ - "201", - "202", - "203", - "204", - "205", - "206", - "207", - "208", - "209", - "210", - "211", - "212", - "213", - "214", - "215", - "216", - "217", - "218", - "219", - "220", - "221", - "222", - "223", - "224", - "225", - "226", - "227", - "228", - "229", - "230", - "231", - "232", - } - UG-N{ - "301", - "302", - "303", - "304", - "305", - "306", - "307", - "308", - "309", - "310", - "311", - "312", - "313", - "314", - "315", - "316", - "317", - "318", - "319", - "320", - "321", - "322", - "323", - "324", - "325", - "326", - "327", - "328", - "329", - "330", - "331", - } - UG-W{ - "401", - "402", - "403", - "404", - "405", - "406", - "407", - "408", - "409", - "410", - "411", - "412", - "413", - "414", - "415", - "416", - "417", - "418", - "419", - "420", - "421", - "422", - "423", - "424", - "425", - } - UM{ - "67", - "71", - "76", - "79", - "81", - "84", - "86", - "89", - "95", - } - US{ - "AK", - "AL", - "AR", - "AS", - "AZ", - "CA", - "CO", - "CT", - "DC", - "DE", - "FL", - "GA", - "GU", - "HI", - "IA", - "ID", - "IL", - "IN", - "KS", - "KY", - "LA", - "MA", - "MD", - "ME", - "MI", - "MN", - "MO", - "MP", - "MS", - "MT", - "NC", - "ND", - "NE", - "NH", - "NJ", - "NM", - "NV", - "NY", - "OH", - "OK", - "OR", - "PA", - "PR", - "RI", - "SC", - "SD", - "TN", - "TX", - "UM", - "UT", - "VA", - "VI", - "VT", - "WA", - "WI", - "WV", - "WY", - } - UY{ - "AR", - "CA", - "CL", - "CO", - "DU", - "FD", - "FS", - "LA", - "MA", - "MO", - "PA", - "RN", - "RO", - "RV", - "SA", - "SJ", - "SO", - "TA", - "TT", - } - UZ{ - "AN", - "BU", - "FA", - "JI", - "NG", - "NW", - "QA", - "QR", - "SA", - "SI", - "SU", - "TK", - "TO", - "XO", - } - VC{ - "01", - "02", - "03", - "04", - "05", - "06", - } - VE{ - "A", - "B", - "C", - "D", - "E", - "F", - "G", - "H", - "I", - "J", - "K", - "L", - "M", - "N", - "O", - "P", - "R", - "S", - "T", - "U", - "V", - "W", - "X", - "Y", - "Z", - } - VN{ - "01", - "02", - "03", - "04", - "05", - "06", - "07", - "09", - "13", - "14", - "18", - "20", - "21", - "22", - "23", - "24", - "25", - "26", - "27", - "28", - "29", - "30", - "31", - "32", - "33", - "34", - "35", - "36", - "37", - "39", - "40", - "41", - "43", - "44", - "45", - "46", - "47", - "49", - "50", - "51", - "52", - "53", - "54", - "55", - "56", - "57", - "58", - "59", - "61", - "63", - "66", - "67", - "68", - "69", - "70", - "71", - "72", - "73", - "CT", - "DN", - "HN", - "HP", - "SG", - } - VU{ - "MAP", - "PAM", - "SAM", - "SEE", - "TAE", - "TOB", - } - WF{ - "AL", - "SG", - "UV", - } - WS{ - "AA", - "AL", - "AT", - "FA", - "GE", - "GI", - "PA", - "SA", - "TU", - "VF", - "VS", - } - YE{ - "AB", - "AD", - "AM", - "BA", - "DA", - "DH", - "HD", - "HJ", - "HU", - "IB", - "JA", - "LA", - "MA", - "MR", - "MW", - "RA", - "SA", - "SD", - "SH", - "SN", - "SU", - "TA", - } - ZA{ - "EC", - "FS", - "GT", - "LP", - "MP", - "NC", - "NL", - "NW", - "WC", - } - ZM{ - "01", - "02", - "03", - "04", - "05", - "06", - "07", - "08", - "09", - "10", - } - ZW{ - "BU", - "HA", - "MA", - "MC", - "ME", - "MI", - "MN", - "MS", - "MV", - "MW", - } - } - telephoneCodeData{ - 001{ - { - code{"388"} - } - { - code{"800"} - } - { - code{"808"} - } - { - code{"870"} - } - { - code{"871"} - } - { - code{"872"} - } - { - code{"873"} - } - { - code{"874"} - } - { - code{"878"} - } - { - code{"881"} - } - { - code{"882"} - } - { - code{"883"} - } - { - code{"888"} - } - { - code{"979"} - } - { - code{"991"} - } - } - AC{ - { - code{"247"} - } - } - AD{ - { - code{"376"} - } - } - AE{ - { - code{"971"} - } - } - AF{ - { - code{"93"} - } - } - AG{ - { - code{"1"} - } - } - AI{ - { - code{"1"} - } - } - AL{ - { - code{"355"} - } - } - AM{ - { - code{"374"} - } - } - AO{ - { - code{"244"} - } - } - AQ{ - { - code{"672"} - } - } - AR{ - { - code{"54"} - } - } - AS{ - { - code{"1"} - } - } - AT{ - { - code{"43"} - } - } - AU{ - { - code{"61"} - } - } - AW{ - { - code{"297"} - } - } - AX{ - { - code{"358"} - } - } - AZ{ - { - code{"994"} - } - } - BA{ - { - code{"387"} - } - } - BB{ - { - code{"1"} - } - } - BD{ - { - code{"880"} - } - } - BE{ - { - code{"32"} - } - } - BF{ - { - code{"226"} - } - } - BG{ - { - code{"359"} - } - } - BH{ - { - code{"973"} - } - } - BI{ - { - code{"257"} - } - } - BJ{ - { - code{"229"} - } - } - BL{ - { - code{"590"} - } - } - BM{ - { - code{"1"} - } - } - BN{ - { - code{"673"} - } - } - BO{ - { - code{"591"} - } - } - BQ{ - { - code{"599"} - } - } - BR{ - { - code{"55"} - } - } - BS{ - { - code{"1"} - } - } - BT{ - { - code{"975"} - } - } - BW{ - { - code{"267"} - } - } - BY{ - { - code{"375"} - } - } - BZ{ - { - code{"501"} - } - } - CA{ - { - code{"1"} - } - } - CC{ - { - code{"61"} - } - } - CD{ - { - code{"243"} - } - } - CF{ - { - code{"236"} - } - } - CG{ - { - code{"242"} - } - } - CH{ - { - code{"41"} - } - } - CI{ - { - code{"225"} - } - } - CK{ - { - code{"682"} - } - } - CL{ - { - code{"56"} - } - } - CM{ - { - code{"237"} - } - } - CN{ - { - code{"86"} - } - } - CO{ - { - code{"57"} - } - } - CR{ - { - code{"506"} - } - } - CU{ - { - code{"53"} - } - } - CV{ - { - code{"238"} - } - } - CW{ - { - code{"599"} - } - } - CX{ - { - code{"61"} - } - } - CY{ - { - code{"357"} - } - } - CZ{ - { - code{"420"} - } - } - DE{ - { - code{"49"} - } - } - DJ{ - { - code{"253"} - } - } - DK{ - { - code{"45"} - } - } - DM{ - { - code{"1"} - } - } - DO{ - { - code{"1"} - } - } - DZ{ - { - code{"213"} - } - } - EC{ - { - code{"593"} - } - } - EE{ - { - code{"372"} - } - } - EG{ - { - code{"20"} - } - } - EH{ - { - code{"212"} - } - } - ER{ - { - code{"291"} - } - } - ES{ - { - code{"34"} - } - } - ET{ - { - code{"251"} - } - } - FI{ - { - code{"358"} - } - } - FJ{ - { - code{"679"} - } - } - FK{ - { - code{"500"} - } - } - FM{ - { - code{"691"} - } - } - FO{ - { - code{"298"} - } - } - FR{ - { - code{"33"} - } - } - GA{ - { - code{"241"} - } - } - GB{ - { - code{"44"} - } - } - GD{ - { - code{"1"} - } - } - GE{ - { - code{"995"} - } - } - GF{ - { - code{"594"} - } - } - GG{ - { - code{"44"} - } - } - GH{ - { - code{"233"} - } - } - GI{ - { - code{"350"} - } - } - GL{ - { - code{"299"} - } - } - GM{ - { - code{"220"} - } - } - GN{ - { - code{"224"} - } - } - GP{ - { - code{"590"} - } - } - GQ{ - { - code{"240"} - } - } - GR{ - { - code{"30"} - } - } - GS{ - { - code{"500"} - } - } - GT{ - { - code{"502"} - } - } - GU{ - { - code{"1"} - } - } - GW{ - { - code{"245"} - } - } - GY{ - { - code{"592"} - } - } - HK{ - { - code{"852"} - } - } - HN{ - { - code{"504"} - } - } - HR{ - { - code{"385"} - } - } - HT{ - { - code{"509"} - } - } - HU{ - { - code{"36"} - } - } - ID{ - { - code{"62"} - } - } - IE{ - { - code{"353"} - } - } - IL{ - { - code{"972"} - } - } - IM{ - { - code{"44"} - } - } - IN{ - { - code{"91"} - } - } - IO{ - { - code{"246"} - } - } - IQ{ - { - code{"964"} - } - } - IR{ - { - code{"98"} - } - } - IS{ - { - code{"354"} - } - } - IT{ - { - code{"39"} - } - } - JE{ - { - code{"44"} - } - } - JM{ - { - code{"1"} - } - } - JO{ - { - code{"962"} - } - } - JP{ - { - code{"81"} - } - } - KE{ - { - code{"254"} - } - } - KG{ - { - code{"996"} - } - } - KH{ - { - code{"855"} - } - } - KI{ - { - code{"686"} - } - } - KM{ - { - code{"269"} - } - } - KN{ - { - code{"1"} - } - } - KP{ - { - code{"850"} - } - } - KR{ - { - code{"82"} - } - } - KW{ - { - code{"965"} - } - } - KY{ - { - code{"1"} - } - } - KZ{ - { - code{"7"} - } - } - LA{ - { - code{"856"} - } - } - LB{ - { - code{"961"} - } - } - LC{ - { - code{"1"} - } - } - LI{ - { - code{"423"} - } - } - LK{ - { - code{"94"} - } - } - LR{ - { - code{"231"} - } - } - LS{ - { - code{"266"} - } - } - LT{ - { - code{"370"} - } - } - LU{ - { - code{"352"} - } - } - LV{ - { - code{"371"} - } - } - LY{ - { - code{"218"} - } - } - MA{ - { - code{"212"} - } - } - MC{ - { - code{"377"} - } - } - MD{ - { - code{"373"} - } - } - ME{ - { - code{"382"} - } - } - MF{ - { - code{"590"} - } - } - MG{ - { - code{"261"} - } - } - MH{ - { - code{"692"} - } - } - MK{ - { - code{"389"} - } - } - ML{ - { - code{"223"} - } - } - MM{ - { - code{"95"} - } - } - MN{ - { - code{"976"} - } - } - MO{ - { - code{"853"} - } - } - MP{ - { - code{"1"} - } - } - MQ{ - { - code{"596"} - } - } - MR{ - { - code{"222"} - } - } - MS{ - { - code{"1"} - } - } - MT{ - { - code{"356"} - } - } - MU{ - { - code{"230"} - } - } - MV{ - { - code{"960"} - } - } - MW{ - { - code{"265"} - } - } - MX{ - { - code{"52"} - } - } - MY{ - { - code{"60"} - } - } - MZ{ - { - code{"258"} - } - } - NA{ - { - code{"264"} - } - } - NC{ - { - code{"687"} - } - } - NE{ - { - code{"227"} - } - } - NF{ - { - code{"672"} - } - } - NG{ - { - code{"234"} - } - } - NI{ - { - code{"505"} - } - } - NL{ - { - code{"31"} - } - } - NO{ - { - code{"47"} - } - } - NP{ - { - code{"977"} - } - } - NR{ - { - code{"674"} - } - } - NU{ - { - code{"683"} - } - } - NZ{ - { - code{"64"} - } - } - OM{ - { - code{"968"} - } - } - PA{ - { - code{"507"} - } - } - PE{ - { - code{"51"} - } - } - PF{ - { - code{"689"} - } - } - PG{ - { - code{"675"} - } - } - PH{ - { - code{"63"} - } - } - PK{ - { - code{"92"} - } - } - PL{ - { - code{"48"} - } - } - PM{ - { - code{"508"} - } - } - PN{ - { - code{"870"} - } - } - PR{ - { - code{"1"} - } - } - PS{ - { - code%limitedAvailability{"970"} - } - { - code{"972"} - } - } - PT{ - { - code{"351"} - } - } - PW{ - { - code{"680"} - } - } - PY{ - { - code{"595"} - } - } - QA{ - { - code{"974"} - } - } - RE{ - { - code{"262"} - } - } - RO{ - { - code{"40"} - } - } - RS{ - { - code{"381"} - } - } - RU{ - { - code{"7"} - } - } - RW{ - { - code{"250"} - } - } - SA{ - { - code{"966"} - } - } - SB{ - { - code{"677"} - } - } - SC{ - { - code{"248"} - } - } - SD{ - { - code{"249"} - } - } - SE{ - { - code{"46"} - } - } - SG{ - { - code{"65"} - } - } - SH{ - { - code{"290"} - } - } - SI{ - { - code{"386"} - } - } - SJ{ - { - code{"47"} - } - } - SK{ - { - code{"421"} - } - } - SL{ - { - code{"232"} - } - } - SM{ - { - code{"378"} - } - } - SN{ - { - code{"221"} - } - } - SO{ - { - code{"252"} - } - } - SR{ - { - code{"597"} - } - } - SS{ - { - code{"211"} - } - } - ST{ - { - code{"239"} - } - } - SV{ - { - code{"503"} - } - } - SX{ - { - code{"1"} - } - } - SY{ - { - code{"963"} - } - } - SZ{ - { - code{"268"} - } - } - TC{ - { - code{"1"} - } - } - TD{ - { - code{"235"} - } - } - TF{ - { - code{"262"} - } - } - TG{ - { - code{"228"} - } - } - TH{ - { - code{"66"} - } - } - TJ{ - { - code{"992"} - } - } - TK{ - { - code{"690"} - } - } - TL{ - { - code{"670"} - } - } - TM{ - { - code{"993"} - } - } - TN{ - { - code{"216"} - } - } - TO{ - { - code{"676"} - } - } - TR{ - { - code{"90"} - } - } - TT{ - { - code{"1"} - } - } - TV{ - { - code{"688"} - } - } - TW{ - { - code{"886"} - } - } - TZ{ - { - code{"255"} - } - } - UA{ - { - code{"380"} - } - } - UG{ - { - code{"256"} - } - } - UM{ - { - code{"1"} - } - } - US{ - { - code{"1"} - } - } - UY{ - { - code{"598"} - } - } - UZ{ - { - code{"998"} - } - } - VA{ - { - code{"39"} - } - } - VC{ - { - code{"1"} - } - } - VE{ - { - code{"58"} - } - } - VG{ - { - code{"1"} - } - } - VI{ - { - code{"1"} - } - } - VN{ - { - code{"84"} - } - } - VU{ - { - code{"678"} - } - } - WF{ - { - code{"681"} - } - } - WS{ - { - code{"685"} - } - } - XK{ - { - code{"377"} - } - { - code{"381"} - } - { - code{"386"} - } - } - YE{ - { - code{"967"} - } - } - YT{ - { - code{"262"} - } - } - ZA{ - { - code{"27"} - } - } - ZM{ - { - code{"260"} - } - } - ZW{ - { - code{"263"} - } - } - } - territoryContainment{ - 001{ - "019", - "002", - "150", - "142", - "009", - } - 002{ - "015", - "011", - "017", - "014", - "018", - } - 005{ - "AR", - "BO", - "BR", - "CL", - "CO", - "EC", - "FK", - "GF", - "GY", - "PE", - "PY", - "SR", - "UY", - "VE", - } - 009{ - "053", - "054", - "057", - "061", - "QO", - } - 011{ - "BF", - "BJ", - "CI", - "CV", - "GH", - "GM", - "GN", - "GW", - "LR", - "ML", - "MR", - "NE", - "NG", - "SH", - "SL", - "SN", - "TG", - } - 013{ - "BZ", - "CR", - "GT", - "HN", - "MX", - "NI", - "PA", - "SV", - } - 014{ - "BI", - "DJ", - "ER", - "ET", - "KE", - "KM", - "MG", - "MU", - "MW", - "MZ", - "RE", - "RW", - "SC", - "SO", - "SS", - "TZ", - "UG", - "YT", - "ZM", - "ZW", - } - 015{ - "DZ", - "EG", - "EH", - "LY", - "MA", - "SD", - "TN", - "EA", - "IC", - } - 017{ - "AO", - "CD", - "CF", - "CG", - "CM", - "GA", - "GQ", - "ST", - "TD", - } - 018{ - "BW", - "LS", - "NA", - "SZ", - "ZA", - } - 019{ - "021", - "013", - "029", - "005", - } - 021{ - "BM", - "CA", - "GL", - "PM", - "US", - } - 029{ - "AG", - "AI", - "AW", - "BB", - "BL", - "BQ", - "BS", - "CU", - "CW", - "DM", - "DO", - "GD", - "GP", - "HT", - "JM", - "KN", - "KY", - "LC", - "MF", - "MQ", - "MS", - "PR", - "SX", - "TC", - "TT", - "VC", - "VG", - "VI", - } - 030{ - "CN", - "HK", - "JP", - "KP", - "KR", - "MN", - "MO", - "TW", - } - 034{ - "AF", - "BD", - "BT", - "IN", - "IR", - "LK", - "MV", - "NP", - "PK", - } - 035{ - "BN", - "ID", - "KH", - "LA", - "MM", - "MY", - "PH", - "SG", - "TH", - "TL", - "VN", - } - 039{ - "AD", - "AL", - "BA", - "ES", - "GI", - "GR", - "HR", - "IT", - "ME", - "MK", - "MT", - "RS", - "PT", - "SI", - "SM", - "VA", - "XK", - } - 053{ - "AU", - "NF", - "NZ", - } - 054{ - "FJ", - "NC", - "PG", - "SB", - "VU", - } - 057{ - "FM", - "GU", - "KI", - "MH", - "MP", - "NR", - "PW", - } - 061{ - "AS", - "CK", - "NU", - "PF", - "PN", - "TK", - "TO", - "TV", - "WF", - "WS", - } - 142{ - "145", - "143", - "030", - "034", - "035", - } - 143{ - "TM", - "TJ", - "KG", - "KZ", - "UZ", - } - 145{ - "AE", - "AM", - "AZ", - "BH", - "CY", - "GE", - "IL", - "IQ", - "JO", - "KW", - "LB", - "OM", - "PS", - "QA", - "SA", - "SY", - "TR", - "YE", - } - 150{ - "154", - "155", - "151", - "039", - } - 151{ - "BG", - "BY", - "CZ", - "HU", - "MD", - "PL", - "RO", - "RU", - "SK", - "UA", - } - 154{ - "GG", - "IM", - "JE", - "AX", - "DK", - "EE", - "FI", - "FO", - "GB", - "IE", - "IS", - "LT", - "LV", - "NO", - "SE", - "SJ", - } - 155{ - "AT", - "BE", - "CH", - "DE", - "FR", - "LI", - "LU", - "MC", - "NL", - } - QO{ - "AQ", - "BV", - "CC", - "CX", - "GS", - "HM", - "IO", - "TF", - "UM", - "AC", - "CP", - "DG", - "TA", - } - containedGroupings{ - 001{ - "EU", - "EZ", - "UN", - } - 019{ - "003", - "419", - } - } - deprecated{ - 001{"QU"} - 017{"ZR"} - 029{"AN"} - 035{ - "BU", - "TP", - } - 039{ - "CS", - "YU", - } - 145{ - "NT", - "YD", - } - 151{"SU"} - 155{ - "DD", - "FX", - } - } - grouping{ - "003", - "419", - "EU", - "EZ", - "UN", - } - } - territoryInfo{ - AC{ - en{ - populationShareF:int{49990000} - } - territoryF:intvector{ - 57376800, - 49990000, - 52940000, - } - } - AD{ - ca{ - officialStatus{"official"} - populationShareF:int{49510000} - } - es{ - populationShareF:int{49430000} - } - fr{ - populationShareF:int{48680000} - } - territoryF:intvector{ - 59316300, - 50100000, - 54855800, - } - } - AE{ - ar{ - officialStatus{"official"} - populationShareF:int{49780000} - } - bal{ - populationShareF:int{48230000} - } - fa{ - populationShareF:int{48190000} - } - ml{ - populationShareF:int{48700000} - } - ps{ - populationShareF:int{48290000} - } - territoryF:intvector{ - 61617100, - 49900000, - 56577976, - } - } - AF{ - bal{ - officialStatus{"official_regional"} - populationShareF:int{47670000} - } - bgn{ - populationShareF:int{47630000} - writingShareF:int{48500000} - } - fa{ - officialStatus{"official"} - populationShareF:int{49500000} - } - haz{ - populationShareF:int{48590000} - } - kk_Arab{ - populationShareF:int{45610000} - } - prd{ - populationShareF:int{48120000} - } - ps{ - officialStatus{"official"} - populationShareF:int{49430000} - } - territoryF:intvector{ - 60608100, - 49281000, - 57325643, - } - tk_Latn{ - officialStatus{"official_regional"} - populationShareF:int{48170000} - } - ug_Arab{ - populationShareF:int{45920000} - } - uz_Arab{ - officialStatus{"official_regional"} - populationShareF:int{48470000} - } - } - AG{ - en{ - officialStatus{"official"} - populationShareF:int{49860000} - } - pt{ - populationShareF:int{48170000} - } - territoryF:intvector{ - 59203200, - 49990000, - 54924360, - } - } - AI{ - en{ - officialStatus{"official"} - populationShareF:int{49950000} - } - territoryF:intvector{ - 58175400, - 49950000, - 54164180, - } - } - AL{ - el{ - populationShareF:int{48190000} - } - mk{ - populationShareF:int{47470000} - } - sq{ - officialStatus{"official"} - populationShareF:int{50100000} - } - territoryF:intvector{ - 60315900, - 49968000, - 56302928, - } - } - AM{ - az_Latn{ - populationShareF:int{0} - } - hy{ - officialStatus{"official"} - populationShareF:int{49980000} - } - ku_Latn{ - populationShareF:int{48330000} - } - territoryF:intvector{ - 60243700, - 49996000, - 56305638, - } - } - AO{ - kmb{ - populationShareF:int{49250000} - writingShareF:int{49100000} - } - ln{ - populationShareF:int{47670000} - } - pt{ - officialStatus{"official"} - populationShareF:int{49670000} - } - territoryF:intvector{ - 61177300, - 49704000, - 57196254, - } - umb{ - populationShareF:int{49290000} - } - } - AQ{ - territoryF:intvector{ - 57162000, - 49990000, - 52300000, - } - und{ - populationShareF:int{50100000} - } - } - AR{ - cy{ - populationShareF:int{46660000} - } - en{ - populationShareF:int{48700000} - } - es{ - officialStatus{"official"} - populationShareF:int{50100000} - } - gn{ - populationShareF:int{46470000} - } - territoryF:intvector{ - 61951000, - 49979000, - 57434319, - } - } - AS{ - en{ - officialStatus{"de_facto_official"} - populationShareF:int{49970000} - } - sm{ - officialStatus{"official"} - populationShareF:int{49990000} - } - territoryF:intvector{ - 58711000, - 49970000, - 54543430, - } - } - AT{ - bar{ - populationShareF:int{49950000} - } - de{ - officialStatus{"official"} - populationShareF:int{49970000} - } - en{ - populationShareF:int{49730000} - } - hr{ - officialStatus{"official_regional"} - populationShareF:int{48120000} - } - hu{ - officialStatus{"official_regional"} - populationShareF:int{47270000} - } - sl{ - officialStatus{"official_regional"} - populationShareF:int{47370000} - } - territoryF:intvector{ - 61396800, - 49980000, - 56866555, - } - } - AU{ - en{ - officialStatus{"de_facto_official"} - populationShareF:int{49960000} - } - it{ - populationShareF:int{48190000} - } - territoryF:intvector{ - 62110000, - 49990000, - 57227510, - } - wbp{ - populationShareF:int{46110000} - } - zh_Hant{ - populationShareF:int{48210000} - } - } - AW{ - en{ - populationShareF:int{48270000} - } - nl{ - officialStatus{"official"} - populationShareF:int{49970000} - } - pap{ - officialStatus{"official"} - populationShareF:int{49610000} - } - territoryF:intvector{ - 59251600, - 49968000, - 55112162, - } - } - AX{ - sv{ - officialStatus{"official"} - populationShareF:int{49990000} - } - territoryF:intvector{ - 58929800, - 50100000, - 54262000, - } - } - AZ{ - az_Cyrl{ - officialStatus{"official"} - populationShareF:int{48990000} - } - az_Latn{ - officialStatus{"official"} - populationShareF:int{49890000} - } - ku_Latn{ - populationShareF:int{47240000} - } - territoryF:intvector{ - 61165900, - 49998000, - 56978078, - } - tkr_Latn{ - populationShareF:int{47160000} - } - tly_Latn{ - populationShareF:int{48980000} - } - ttt_Latn{ - populationShareF:int{47220000} - } - } - BA{ - bs_Cyrl{ - officialStatus{"official"} - populationShareF:int{49990000} - writingShareF:int{48500000} - } - bs_Latn{ - officialStatus{"official"} - populationShareF:int{49990000} - } - en{ - populationShareF:int{49450000} - } - hr{ - officialStatus{"official"} - populationShareF:int{49120000} - } - sr_Cyrl{ - officialStatus{"official"} - populationShareF:int{49100000} - } - sr_Latn{ - officialStatus{"official"} - populationShareF:int{49100000} - writingShareF:int{48500000} - } - territoryF:intvector{ - 60382900, - 49980000, - 56386706, - } - } - BB{ - en{ - officialStatus{"official"} - populationShareF:int{50100000} - } - territoryF:intvector{ - 59456700, - 49997000, - 55290604, - } - } - BD{ - bn{ - officialStatus{"official"} - populationShareF:int{49980000} - } - ccp{ - populationShareF:int{47220000} - } - en{ - populationShareF:int{49180000} - } - grt{ - populationShareF:int{46730000} - } - mni{ - populationShareF:int{46110000} - } - mro{ - populationShareF:int{46180000} - } - my{ - populationShareF:int{47210000} - } - rkt{ - populationShareF:int{48650000} - writingShareF:int{49200000} - } - syl{ - populationShareF:int{48500000} - writingShareF:int{49350000} - } - territoryF:intvector{ - 61536500, - 49577000, - 58168958, - } - } - BE{ - de{ - officialStatus{"official"} - populationShareF:int{48140000} - } - en{ - populationShareF:int{49590000} - } - fr{ - officialStatus{"official"} - populationShareF:int{49380000} - } - nl{ - officialStatus{"official"} - populationShareF:int{49550000} - } - territoryF:intvector{ - 61483300, - 49990000, - 57113240, - } - vls{ - populationShareF:int{49100000} - } - wa{ - populationShareF:int{48580000} - writingShareF:int{48500000} - } - } - BF{ - dyu{ - populationShareF:int{49320000} - } - fr{ - officialStatus{"official"} - populationShareF:int{49220000} - } - mos{ - populationShareF:int{49400000} - } - territoryF:intvector{ - 60294200, - 49287000, - 57189317, - } - } - BG{ - bg{ - officialStatus{"official"} - populationShareF:int{50100000} - } - en{ - populationShareF:int{49250000} - } - territoryF:intvector{ - 61129100, - 49984000, - 56718689, - } - tr{ - populationShareF:int{49110000} - } - } - BH{ - ar{ - officialStatus{"official"} - populationShareF:int{49870000} - } - ml{ - populationShareF:int{48330000} - } - territoryF:intvector{ - 60621700, - 49946000, - 56134661, - } - } - BI{ - en{ - officialStatus{"official"} - populationShareF:int{46580000} - } - fr{ - officialStatus{"official"} - populationShareF:int{49590000} - } - rn{ - officialStatus{"official"} - populationShareF:int{49630000} - } - sw{ - populationShareF:int{46590000} - } - territoryF:intvector{ - 59840900, - 49672000, - 57107423, - } - } - BJ{ - fon{ - populationShareF:int{49250000} - } - fr{ - officialStatus{"official"} - populationShareF:int{49350000} - } - territoryF:intvector{ - 60198600, - 49424000, - 57104486, - } - yo{ - populationShareF:int{48670000} - } - } - BL{ - fr{ - officialStatus{"official"} - populationShareF:int{49950000} - } - territoryF:intvector{ - 58255000, - 49990000, - 53723700, - } - } - BM{ - en{ - officialStatus{"official"} - populationShareF:int{49920000} - } - territoryF:intvector{ - 59519800, - 49980000, - 54701960, - } - } - BN{ - en{ - populationShareF:int{48190000} - } - ms_Arab{ - officialStatus{"official"} - populationShareF:int{48500000} - } - ms_Latn{ - officialStatus{"official"} - populationShareF:int{49930000} - } - territoryF:intvector{ - 60329600, - 49954000, - 55429646, - } - zh_Hant{ - populationShareF:int{49110000} - } - } - BO{ - aro{ - populationShareF:int{45100000} - } - ay{ - officialStatus{"official"} - populationShareF:int{49200000} - } - es{ - officialStatus{"official"} - populationShareF:int{49610000} - } - gn{ - populationShareF:int{47450000} - } - qu{ - officialStatus{"official"} - populationShareF:int{49320000} - } - territoryF:intvector{ - 60702800, - 49912000, - 57108009, - } - } - BQ{ - nl{ - officialStatus{"official"} - populationShareF:int{48800000} - } - pap{ - populationShareF:int{49810000} - } - territoryF:intvector{ - 58426100, - 49965000, - 54200000, - } - } - BR{ - de{ - populationShareF:int{47840000} - } - en{ - populationShareF:int{48800000} - } - es{ - populationShareF:int{46370000} - } - gub{ - populationShareF:int{45840000} - } - it{ - populationShareF:int{47280000} - } - ja{ - populationShareF:int{47210000} - } - kgp{ - populationShareF:int{46100000} - } - ko{ - populationShareF:int{46210000} - } - pt{ - officialStatus{"official"} - populationShareF:int{49910000} - } - territoryF:intvector{ - 62327600, - 49904000, - 58204260, - } - xav{ - populationShareF:int{45490000} - } - yrl{ - populationShareF:int{45520000} - } - } - BS{ - en{ - officialStatus{"official"} - populationShareF:int{50100000} - } - territoryF:intvector{ - 59903100, - 49956000, - 55324597, - } - } - BT{ - dz{ - officialStatus{"official"} - populationShareF:int{49470000} - } - en{ - populationShareF:int{49110000} - } - lep{ - populationShareF:int{48390000} - } - ne{ - populationShareF:int{49170000} - } - territoryF:intvector{ - 59587100, - 49528000, - 55741919, - } - tsj{ - populationShareF:int{49150000} - } - } - BV{ - territoryF:intvector{ - 54400900, - 49990000, - 50100000, - } - und{ - populationShareF:int{50100000} - } - } - BW{ - af{ - populationShareF:int{47270000} - } - en{ - officialStatus{"official"} - populationShareF:int{49810000} - } - territoryF:intvector{ - 60358700, - 49851000, - 56218272, - } - tn{ - officialStatus{"official"} - populationShareF:int{49620000} - } - } - BY{ - be{ - officialStatus{"official"} - populationShareF:int{50100000} - } - ru{ - officialStatus{"official"} - populationShareF:int{49120000} - } - territoryF:intvector{ - 61172800, - 49996000, - 56958969, - } - } - BZ{ - en{ - officialStatus{"official"} - populationShareF:int{50100000} - } - es{ - populationShareF:int{49280000} - } - territoryF:intvector{ - 59297500, - 49769000, - 55347369, - } - } - CA{ - atj{ - populationShareF:int{46160000} - } - chp{ - populationShareF:int{45220000} - } - cr_Cans{ - populationShareF:int{47110000} - } - crj{ - populationShareF:int{46210000} - } - crk{ - populationShareF:int{47110000} - } - crl{ - populationShareF:int{46150000} - } - crm{ - populationShareF:int{46130000} - } - csw{ - populationShareF:int{46140000} - } - de{ - populationShareF:int{48190000} - } - den{ - populationShareF:int{45660000} - } - dgr{ - populationShareF:int{45750000} - } - en{ - officialStatus{"official"} - populationShareF:int{49860000} - } - fr{ - officialStatus{"official"} - populationShareF:int{49220000} - } - gwi{ - populationShareF:int{45160000} - } - ikt{ - officialStatus{"official_regional"} - populationShareF:int{46110000} - writingShareF:int{49300000} - } - it{ - populationShareF:int{48200000} - } - iu_Cans{ - officialStatus{"official_regional"} - populationShareF:int{46420000} - writingShareF:int{49300000} - } - iu_Latn{ - officialStatus{"official_regional"} - populationShareF:int{46420000} - writingShareF:int{49300000} - } - moe{ - populationShareF:int{46330000} - } - moh{ - populationShareF:int{46100000} - } - nsk{ - populationShareF:int{45340000} - } - pdt{ - populationShareF:int{47240000} - } - scs{ - populationShareF:int{45350000} - } - territoryF:intvector{ - 62159600, - 49990000, - 57350998, - } - yi{ - populationShareF:int{46450000} - } - } - CC{ - en{ - officialStatus{"de_facto_official"} - populationShareF:int{49170000} - } - ms_Arab{ - populationShareF:int{49830000} - } - territoryF:intvector{ - 57288200, - 49990000, - 52596000, - } - } - CD{ - fr{ - officialStatus{"official"} - populationShareF:int{48380000} - } - kg{ - officialStatus{"official_regional"} - populationShareF:int{48150000} - } - ln{ - officialStatus{"official_regional"} - populationShareF:int{48310000} - } - lol{ - populationShareF:int{47610000} - } - lu{ - populationShareF:int{48230000} - } - lua{ - officialStatus{"official_regional"} - populationShareF:int{48960000} - } - rw{ - populationShareF:int{47380000} - } - sw{ - officialStatus{"official_regional"} - populationShareF:int{49500000} - } - territoryF:intvector{ - 60577800, - 49668000, - 57793751, - } - } - CF{ - fr{ - officialStatus{"official"} - populationShareF:int{49490000} - } - ln{ - populationShareF:int{47240000} - } - sg{ - officialStatus{"official"} - populationShareF:int{49490000} - } - territoryF:intvector{ - 59286500, - 49566000, - 56539154, - } - } - CG{ - fr{ - officialStatus{"official"} - populationShareF:int{49840000} - } - ln{ - populationShareF:int{48240000} - } - territoryF:intvector{ - 60283600, - 49838000, - 56475510, - } - } - CH{ - de{ - officialStatus{"official"} - populationShareF:int{49730000} - } - en{ - populationShareF:int{49610000} - } - fr{ - officialStatus{"official"} - populationShareF:int{49210000} - } - gsw{ - officialStatus{"de_facto_official"} - populationShareF:int{49650000} - writingShareF:int{48500000} - } - it{ - officialStatus{"official"} - populationShareF:int{48430000} - } - lmo{ - populationShareF:int{48410000} - writingShareF:int{48500000} - } - pt{ - populationShareF:int{48340000} - } - rm{ - officialStatus{"official_regional"} - populationShareF:int{47500000} - } - rmo{ - populationShareF:int{47290000} - } - territoryF:intvector{ - 61473300, - 49990000, - 56812183, - } - wae{ - populationShareF:int{47120000} - } - } - CI{ - bci{ - populationShareF:int{49110000} - writingShareF:int{49100000} - } - bqv{ - populationShareF:int{47170000} - writingShareF:int{49100000} - } - dnj{ - populationShareF:int{48400000} - writingShareF:int{48100000} - } - fr{ - officialStatus{"official"} - populationShareF:int{49490000} - } - kfo{ - populationShareF:int{47230000} - } - sef{ - populationShareF:int{48430000} - writingShareF:int{48500000} - } - territoryF:intvector{ - 60716700, - 49569000, - 57232953, - } - } - CK{ - en{ - officialStatus{"official"} - populationShareF:int{49980000} - } - territoryF:intvector{ - 58183200, - 49950000, - 53983800, - } - } - CL{ - arn{ - populationShareF:int{48150000} - } - en{ - populationShareF:int{48950000} - } - es{ - officialStatus{"official"} - populationShareF:int{49980000} - } - territoryF:intvector{ - 61410900, - 49986000, - 57175083, - } - } - CM{ - agq{ - populationShareF:int{47140000} - writingShareF:int{49200000} - } - ar{ - populationShareF:int{47390000} - } - bas{ - populationShareF:int{48120000} - writingShareF:int{49250000} - } - bax{ - populationShareF:int{48120000} - } - bbj{ - populationShareF:int{48140000} - writingShareF:int{49250000} - } - bfd{ - populationShareF:int{47570000} - writingShareF:int{49300000} - } - bkm{ - populationShareF:int{48130000} - writingShareF:int{48500000} - } - bss{ - populationShareF:int{47540000} - writingShareF:int{49300000} - } - bum{ - populationShareF:int{48460000} - } - byv{ - populationShareF:int{48110000} - writingShareF:int{49150000} - } - dua{ - populationShareF:int{47480000} - writingShareF:int{49250000} - } - en{ - officialStatus{"official"} - populationShareF:int{49380000} - } - ewo{ - populationShareF:int{48310000} - writingShareF:int{49150000} - } - ff{ - populationShareF:int{48360000} - } - fr{ - officialStatus{"official"} - populationShareF:int{49680000} - } - ha_Arab{ - populationShareF:int{47140000} - } - jgo{ - populationShareF:int{47340000} - writingShareF:int{49300000} - } - kkj{ - populationShareF:int{47540000} - } - ksf{ - populationShareF:int{47320000} - } - maf{ - populationShareF:int{47730000} - } - mgo{ - populationShareF:int{47470000} - writingShareF:int{48500000} - } - mua{ - populationShareF:int{48100000} - } - nmg{ - populationShareF:int{46380000} - writingShareF:int{49100000} - } - nnh{ - populationShareF:int{48140000} - writingShareF:int{48800000} - } - territoryF:intvector{ - 60677800, - 49713000, - 57237392, - } - yav{ - populationShareF:int{45970000} - } - ybb{ - populationShareF:int{48160000} - writingShareF:int{48200000} - } - } - CN{ - bo{ - officialStatus{"official_regional"} - populationShareF:int{47200000} - } - en{ - populationShareF:int{45450000} - } - gan{ - populationShareF:int{48170000} - } - hak{ - populationShareF:int{48230000} - } - hsn{ - populationShareF:int{48290000} - } - ii{ - populationShareF:int{47600000} - writingShareF:int{49600000} - } - khb{ - populationShareF:int{46190000} - } - kk_Arab{ - populationShareF:int{46860000} - } - ko{ - officialStatus{"official_regional"} - populationShareF:int{47150000} - } - ky_Arab{ - populationShareF:int{46340000} - } - lcp{ - populationShareF:int{45580000} - } - lis{ - populationShareF:int{46450000} - } - lzh{ - populationShareF:int{0} - } - mn_Mong{ - officialStatus{"official_regional"} - populationShareF:int{47260000} - } - nan{ - populationShareF:int{48190000} - } - nxq{ - populationShareF:int{46240000} - } - ru{ - populationShareF:int{45100000} - } - tdd{ - populationShareF:int{46190000} - } - territoryF:intvector{ - 63180900, - 49951000, - 59136749, - } - ug_Arab{ - officialStatus{"official_regional"} - populationShareF:int{47550000} - } - uz_Cyrl{ - populationShareF:int{44400000} - } - vi{ - populationShareF:int{44500000} - } - wuu{ - populationShareF:int{48600000} - } - yue{ - populationShareF:int{48520000} - } - za{ - officialStatus{"official_regional"} - populationShareF:int{47310000} - } - zh_Hans{ - officialStatus{"official"} - populationShareF:int{49900000} - } - } - CO{ - es{ - officialStatus{"official"} - populationShareF:int{49930000} - } - guc{ - populationShareF:int{47270000} - } - territoryF:intvector{ - 61642500, - 49936000, - 57467367, - } - } - CP{ - territoryF:intvector{ - 54389300, - 49990000, - 50100000, - } - und{ - populationShareF:int{50100000} - } - } - CR{ - es{ - officialStatus{"official"} - populationShareF:int{49950000} - } - territoryF:intvector{ - 60712300, - 49963000, - 56481414, - } - } - CU{ - es{ - officialStatus{"official"} - populationShareF:int{50100000} - } - territoryF:intvector{ - 61128500, - 49998000, - 57110314, - } - } - CV{ - kea{ - populationShareF:int{49910000} - } - pt{ - officialStatus{"official"} - populationShareF:int{49760000} - } - territoryF:intvector{ - 59333000, - 49849000, - 55545993, - } - } - CW{ - es{ - populationShareF:int{48390000} - } - nl{ - officialStatus{"official"} - populationShareF:int{48800000} - } - pap{ - officialStatus{"de_facto_official"} - populationShareF:int{49810000} - } - territoryF:intvector{ - 59312800, - 49965000, - 55146836, - } - } - CX{ - en{ - officialStatus{"official"} - populationShareF:int{49920000} - } - territoryF:intvector{ - 57739700, - 49990000, - 53153000, - } - } - CY{ - ar{ - populationShareF:int{47110000} - } - el{ - officialStatus{"official"} - populationShareF:int{49750000} - } - en{ - populationShareF:int{49730000} - } - hy{ - populationShareF:int{47230000} - } - territoryF:intvector{ - 60275200, - 49987000, - 56118920, - } - tr{ - officialStatus{"official"} - populationShareF:int{49230000} - } - } - CZ{ - cs{ - officialStatus{"official"} - populationShareF:int{49980000} - } - de{ - populationShareF:int{47490000} - } - en{ - populationShareF:int{49270000} - } - pl{ - populationShareF:int{47490000} - } - territoryF:intvector{ - 61315900, - 49990000, - 57106448, - } - } - DE{ - bar{ - populationShareF:int{49170000} - writingShareF:int{48500000} - } - da{ - populationShareF:int{48200000} - } - de{ - officialStatus{"official"} - populationShareF:int{49910000} - } - dsb{ - populationShareF:int{45870000} - writingShareF:int{48500000} - } - el{ - populationShareF:int{47380000} - } - en{ - populationShareF:int{49640000} - } - es{ - populationShareF:int{48600000} - } - fr{ - populationShareF:int{49180000} - } - frr{ - populationShareF:int{46120000} - } - frs{ - populationShareF:int{45250000} - } - hr{ - populationShareF:int{47790000} - } - hsb{ - populationShareF:int{46160000} - writingShareF:int{48500000} - } - it{ - populationShareF:int{48700000} - } - ksh{ - populationShareF:int{47300000} - } - ku_Latn{ - populationShareF:int{47660000} - } - nds{ - populationShareF:int{49120000} - writingShareF:int{48500000} - } - nl{ - populationShareF:int{48900000} - } - pfl{ - populationShareF:int{0} - } - pl{ - populationShareF:int{47290000} - } - ru{ - populationShareF:int{48600000} - } - stq{ - populationShareF:int{45120000} - } - swg{ - populationShareF:int{48100000} - writingShareF:int{48500000} - } - territoryF:intvector{ - 62374800, - 49990000, - 57808544, - } - tr{ - populationShareF:int{48250000} - } - vmf{ - populationShareF:int{48600000} - } - } - DG{ - en{ - officialStatus{"de_facto_official"} - populationShareF:int{49990000} - } - territoryF:intvector{ - 57200400, - 49990000, - 52500000, - } - } - DJ{ - aa{ - populationShareF:int{49420000} - } - ar{ - officialStatus{"official"} - populationShareF:int{48730000} - } - fr{ - officialStatus{"official"} - populationShareF:int{48210000} - } - so{ - populationShareF:int{49410000} - } - territoryF:intvector{ - 59287600, - 49679000, - 55828324, - } - } - DK{ - da{ - officialStatus{"official"} - populationShareF:int{49930000} - } - de{ - officialStatus{"official_regional"} - populationShareF:int{47430000} - } - en{ - populationShareF:int{49860000} - } - fo{ - populationShareF:int{47380000} - } - jut{ - populationShareF:int{0} - } - kl{ - officialStatus{"official_regional"} - populationShareF:int{47130000} - } - territoryF:intvector{ - 61250700, - 49990000, - 56558150, - } - } - DM{ - en{ - officialStatus{"official"} - populationShareF:int{49940000} - } - territoryF:intvector{ - 58790000, - 49940000, - 54736070, - } - } - DO{ - en{ - populationShareF:int{46760000} - } - es{ - officialStatus{"official"} - populationShareF:int{49780000} - } - territoryF:intvector{ - 61138500, - 49901000, - 57104788, - } - } - DZ{ - ar{ - officialStatus{"official"} - populationShareF:int{49740000} - } - arq{ - populationShareF:int{49830000} - } - en{ - populationShareF:int{48700000} - } - fr{ - officialStatus{"official"} - populationShareF:int{49200000} - } - kab{ - populationShareF:int{48780000} - writingShareF:int{49100000} - } - territoryF:intvector{ - 61548600, - 49726000, - 57395422, - } - } - EA{ - es{ - officialStatus{"official"} - populationShareF:int{49980000} - } - territoryF:intvector{ - 59489800, - 49977000, - 55150000, - } - } - EC{ - es{ - officialStatus{"official"} - populationShareF:int{49960000} - } - qu{ - officialStatus{"official"} - populationShareF:int{49170000} - } - qug{ - populationShareF:int{48570000} - } - territoryF:intvector{ - 61181200, - 49916000, - 57158684, - } - } - EE{ - et{ - officialStatus{"official"} - populationShareF:int{49710000} - } - ru{ - populationShareF:int{49300000} - } - territoryF:intvector{ - 60367800, - 49998000, - 56126542, - } - vro{ - populationShareF:int{48570000} - } - } - EG{ - ar{ - officialStatus{"official"} - populationShareF:int{49940000} - } - arz{ - populationShareF:int{49640000} - } - el{ - populationShareF:int{46610000} - } - en{ - populationShareF:int{49350000} - } - territoryF:intvector{ - 61946600, - 49739000, - 57884874, - } - } - EH{ - ar{ - officialStatus{"official"} - populationShareF:int{50100000} - } - territoryF:intvector{ - 58906500, - 49500000, - 55570866, - } - } - ER{ - aa{ - populationShareF:int{48360000} - } - ar{ - officialStatus{"official"} - populationShareF:int{48490000} - writingShareF:int{48500000} - } - byn{ - populationShareF:int{48130000} - } - en{ - officialStatus{"official"} - populationShareF:int{49590000} - } - ssy{ - populationShareF:int{48360000} - } - territoryF:intvector{ - 59784200, - 49689000, - 56652769, - } - ti{ - officialStatus{"de_facto_official"} - populationShareF:int{49600000} - } - tig{ - populationShareF:int{49180000} - } - } - ES{ - ast{ - officialStatus{"official_regional"} - populationShareF:int{48130000} - } - ca{ - officialStatus{"official_regional"} - populationShareF:int{49170000} - } - en{ - populationShareF:int{49240000} - } - es{ - officialStatus{"official"} - populationShareF:int{49990000} - } - eu{ - officialStatus{"official_regional"} - populationShareF:int{48200000} - } - ext{ - populationShareF:int{47490000} - } - gl{ - officialStatus{"official_regional"} - populationShareF:int{48700000} - } - territoryF:intvector{ - 62157200, - 49977000, - 57481461, - } - } - ET{ - aa{ - populationShareF:int{48140000} - } - am{ - officialStatus{"official"} - populationShareF:int{49330000} - } - en{ - populationShareF:int{49430000} - } - om{ - populationShareF:int{49320000} - } - sid{ - populationShareF:int{48350000} - } - so{ - populationShareF:int{48600000} - } - territoryF:intvector{ - 61145100, - 49390000, - 57994658, - } - ti{ - populationShareF:int{48600000} - } - wal{ - populationShareF:int{48180000} - } - } - FI{ - en{ - populationShareF:int{49700000} - } - et{ - populationShareF:int{47110000} - } - fi{ - officialStatus{"official"} - populationShareF:int{49940000} - } - rmf{ - populationShareF:int{46910000} - } - ru{ - populationShareF:int{47810000} - } - se{ - populationShareF:int{46370000} - } - smn{ - populationShareF:int{46110000} - } - sms{ - populationShareF:int{46110000} - } - sv{ - officialStatus{"official"} - populationShareF:int{48570000} - } - territoryF:intvector{ - 61221700, - 50100000, - 56547692, - } - } - FJ{ - en{ - officialStatus{"official"} - populationShareF:int{49940000} - } - fj{ - officialStatus{"official"} - populationShareF:int{49390000} - } - hi{ - populationShareF:int{49440000} - } - hif_Latn{ - officialStatus{"official"} - populationShareF:int{49410000} - } - rtm{ - populationShareF:int{47270000} - } - territoryF:intvector{ - 59740400, - 49937000, - 55909389, - } - } - FK{ - en{ - officialStatus{"official"} - populationShareF:int{49840000} - } - territoryF:intvector{ - 58164500, - 49990000, - 53336100, - } - } - FM{ - chk{ - populationShareF:int{49300000} - } - en{ - officialStatus{"official"} - populationShareF:int{49570000} - } - kos{ - populationShareF:int{48760000} - } - pon{ - populationShareF:int{49230000} - } - territoryF:intvector{ - 58308000, - 49890000, - 55105216, - } - uli{ - populationShareF:int{48290000} - } - yap{ - populationShareF:int{48630000} - } - } - FO{ - fo{ - officialStatus{"official"} - populationShareF:int{49950000} - } - territoryF:intvector{ - 59147100, - 49990000, - 54501960, - } - } - FR{ - br{ - populationShareF:int{47830000} - writingShareF:int{48300000} - } - ca{ - populationShareF:int{47170000} - } - co{ - populationShareF:int{47570000} - writingShareF:int{48500000} - } - en{ - populationShareF:int{49390000} - } - eu{ - populationShareF:int{47130000} - } - fr{ - officialStatus{"official"} - populationShareF:int{49990000} - } - frp{ - populationShareF:int{46940000} - } - gsw{ - populationShareF:int{47910000} - writingShareF:int{48500000} - } - ia{ - populationShareF:int{44200000} - } - it{ - populationShareF:int{48170000} - } - nl{ - populationShareF:int{47130000} - } - oc{ - populationShareF:int{48300000} - writingShareF:int{48500000} - } - pcd{ - populationShareF:int{48110000} - } - pt{ - populationShareF:int{48130000} - } - territoryF:intvector{ - 62259100, - 49990000, - 57665538, - } - } - GA{ - fr{ - officialStatus{"official"} - populationShareF:int{49630000} - } - puu{ - populationShareF:int{48900000} - } - territoryF:intvector{ - 60329100, - 49890000, - 56170534, - } - } - GB{ - bn{ - populationShareF:int{47670000} - } - cy{ - officialStatus{"official_regional"} - populationShareF:int{47770000} - } - el{ - populationShareF:int{47340000} - } - en{ - officialStatus{"official"} - populationShareF:int{49990000} - } - fr{ - populationShareF:int{46240000} - } - ga{ - officialStatus{"official_regional"} - populationShareF:int{46260000} - } - gd{ - officialStatus{"official_regional"} - populationShareF:int{46990000} - writingShareF:int{48500000} - } - it{ - populationShareF:int{47340000} - } - ks_Arab{ - populationShareF:int{47190000} - } - kw{ - populationShareF:int{45310000} - } - ml{ - populationShareF:int{46350000} - } - pa_Guru{ - populationShareF:int{47790000} - } - sco{ - populationShareF:int{48270000} - writingShareF:int{48500000} - } - syl{ - populationShareF:int{47510000} - } - territoryF:intvector{ - 62256900, - 49990000, - 57640882, - } - yi{ - populationShareF:int{46490000} - } - zh_Hant{ - populationShareF:int{47540000} - } - } - GD{ - en{ - officialStatus{"official"} - populationShareF:int{49960000} - } - territoryF:intvector{ - 59132600, - 49960000, - 55110694, - } - } - GE{ - ab{ - officialStatus{"official_regional"} - populationShareF:int{48220000} - } - hy{ - populationShareF:int{48700000} - } - ka{ - officialStatus{"official"} - populationShareF:int{49860000} - } - ku_Latn{ - populationShareF:int{47890000} - } - os{ - officialStatus{"official_regional"} - populationShareF:int{48220000} - } - ru{ - populationShareF:int{48900000} - } - territoryF:intvector{ - 60343500, - 49997000, - 56493123, - } - xmf{ - populationShareF:int{49110000} - } - } - GF{ - fr{ - officialStatus{"official"} - populationShareF:int{49770000} - } - gcr{ - populationShareF:int{49260000} - } - territoryF:intvector{ - 59155100, - 49830000, - 55199509, - } - zh_Hant{ - populationShareF:int{48250000} - } - } - GG{ - en{ - officialStatus{"official"} - populationShareF:int{50100000} - } - territoryF:intvector{ - 59342000, - 50100000, - 54660800, - } - } - GH{ - abr{ - populationShareF:int{48500000} - } - ada{ - populationShareF:int{48300000} - } - ak{ - officialStatus{"official_regional"} - populationShareF:int{49390000} - } - ee{ - officialStatus{"official_regional"} - populationShareF:int{49110000} - } - en{ - officialStatus{"official"} - populationShareF:int{49210000} - } - gaa{ - officialStatus{"official_regional"} - populationShareF:int{48280000} - } - gur{ - populationShareF:int{48350000} - } - ha_Latn{ - populationShareF:int{47870000} - } - nzi{ - populationShareF:int{48100000} - } - saf{ - populationShareF:int{46150000} - } - territoryF:intvector{ - 61108500, - 49715000, - 57263276, - } - } - GI{ - en{ - officialStatus{"official"} - populationShareF:int{49800000} - } - es{ - populationShareF:int{49500000} - } - territoryF:intvector{ - 59185000, - 49800000, - 54292580, - } - } - GL{ - da{ - populationShareF:int{49140000} - } - kl{ - officialStatus{"official"} - populationShareF:int{49840000} - } - territoryF:intvector{ - 59213300, - 50100000, - 54577330, - } - } - GM{ - en{ - officialStatus{"official"} - populationShareF:int{49400000} - } - man_Latn{ - populationShareF:int{49290000} - } - territoryF:intvector{ - 59309300, - 49511000, - 56196771, - } - } - GN{ - ff{ - populationShareF:int{49260000} - } - fr{ - officialStatus{"official"} - populationShareF:int{49290000} - } - kpe{ - populationShareF:int{48380000} - } - man_Nkoo{ - populationShareF:int{49230000} - } - nqo{ - populationShareF:int{48500000} - } - sus{ - populationShareF:int{49110000} - } - territoryF:intvector{ - 60151300, - 49410000, - 57117802, - } - } - GP{ - fr{ - officialStatus{"official"} - populationShareF:int{49900000} - } - territoryF:intvector{ - 59351300, - 49900000, - 55452776, - } - } - GQ{ - bvb{ - populationShareF:int{48790000} - } - es{ - officialStatus{"official"} - populationShareF:int{49870000} - } - fan{ - populationShareF:int{49510000} - } - fr{ - officialStatus{"official"} - populationShareF:int{48880000} - } - pt{ - officialStatus{"official"} - populationShareF:int{44100000} - } - territoryF:intvector{ - 60286200, - 49942000, - 55740743, - } - } - GR{ - bg{ - populationShareF:int{47270000} - } - el{ - officialStatus{"official"} - populationShareF:int{49990000} - } - en{ - populationShareF:int{49510000} - } - mk{ - populationShareF:int{48160000} - } - pnt_Grek{ - populationShareF:int{48370000} - } - sq{ - populationShareF:int{46930000} - } - territoryF:intvector{ - 61285300, - 49973000, - 57107756, - } - tr{ - populationShareF:int{48120000} - } - tsd{ - populationShareF:int{45190000} - } - } - GS{ - territoryF:intvector{ - 55801700, - 49990000, - 51200000, - } - und{ - populationShareF:int{50100000} - writingShareF:int{50100000} - } - } - GT{ - es{ - officialStatus{"official"} - populationShareF:int{49930000} - } - quc{ - officialStatus{"official_regional"} - populationShareF:int{48700000} - } - territoryF:intvector{ - 61119800, - 49759000, - 57149190, - } - } - GU{ - ch{ - officialStatus{"official"} - populationShareF:int{49220000} - } - en{ - officialStatus{"de_facto_official"} - populationShareF:int{49910000} - } - territoryF:intvector{ - 59488200, - 49990000, - 55161785, - } - } - GW{ - pt{ - officialStatus{"official"} - populationShareF:int{50100000} - } - territoryF:intvector{ - 59253200, - 49553000, - 56172617, - } - } - GY{ - en{ - officialStatus{"official"} - populationShareF:int{50100000} - } - territoryF:intvector{ - 59553400, - 49918000, - 55735222, - } - } - HK{ - en{ - officialStatus{"official"} - populationShareF:int{49510000} - } - territoryF:intvector{ - 61400400, - 49935000, - 56714111, - } - yue{ - populationShareF:int{49890000} - } - zh_Hans{ - populationShareF:int{48500000} - } - zh_Hant{ - officialStatus{"official"} - populationShareF:int{49950000} - } - } - HM{ - territoryF:intvector{ - 54483500, - 49990000, - 50100000, - } - und{ - populationShareF:int{50100000} - writingShareF:int{50100000} - } - } - HN{ - en{ - populationShareF:int{47440000} - } - es{ - officialStatus{"official"} - populationShareF:int{49780000} - } - territoryF:intvector{ - 60392200, - 49851000, - 56874667, - } - } - HR{ - en{ - populationShareF:int{49490000} - } - hr{ - officialStatus{"official"} - populationShareF:int{49990000} - } - it{ - officialStatus{"official_regional"} - populationShareF:int{48160000} - } - territoryF:intvector{ - 60887300, - 49989000, - 56446484, - } - } - HT{ - fr{ - officialStatus{"official"} - populationShareF:int{48470000} - writingShareF:int{50100000} - } - ht{ - officialStatus{"official"} - populationShareF:int{49810000} - } - territoryF:intvector{ - 60183800, - 49487000, - 57101100, - } - } - HU{ - de{ - populationShareF:int{48250000} - } - en{ - populationShareF:int{49200000} - } - hr{ - populationShareF:int{47320000} - } - hu{ - officialStatus{"official"} - populationShareF:int{50100000} - } - ro{ - populationShareF:int{47990000} - } - sk{ - populationShareF:int{47110000} - } - sl{ - populationShareF:int{46500000} - } - territoryF:intvector{ - 61247100, - 49990000, - 56989754, - } - } - IC{ - es{ - officialStatus{"official"} - populationShareF:int{49980000} - } - territoryF:intvector{ - 60685200, - 49977000, - 56209859, - } - } - ID{ - ace{ - populationShareF:int{48140000} - } - aoz{ - populationShareF:int{47270000} - } - ban{ - populationShareF:int{48180000} - writingShareF:int{49100000} - } - bbc{ - populationShareF:int{47920000} - } - bew{ - populationShareF:int{48210000} - } - bjn{ - populationShareF:int{48150000} - writingShareF:int{49100000} - } - bug{ - populationShareF:int{48160000} - writingShareF:int{49100000} - } - gay{ - populationShareF:int{47120000} - } - gor{ - populationShareF:int{47410000} - } - id{ - officialStatus{"official"} - populationShareF:int{49640000} - } - jv{ - populationShareF:int{49340000} - writingShareF:int{49100000} - } - kge{ - populationShareF:int{47320000} - } - kvr{ - populationShareF:int{47140000} - } - lbw{ - populationShareF:int{47130000} - } - ljp{ - populationShareF:int{47690000} - } - mad{ - populationShareF:int{48630000} - writingShareF:int{49400000} - } - mak{ - populationShareF:int{47730000} - } - mdr{ - populationShareF:int{46920000} - } - min{ - populationShareF:int{48300000} - writingShareF:int{49100000} - } - ms_Arab{ - populationShareF:int{48460000} - } - mwv{ - populationShareF:int{46240000} - } - nij{ - populationShareF:int{47370000} - } - rej{ - populationShareF:int{47460000} - } - rob{ - populationShareF:int{47110000} - } - sas{ - populationShareF:int{47970000} - } - sly{ - populationShareF:int{46540000} - } - su{ - populationShareF:int{49120000} - } - sxn{ - populationShareF:int{46920000} - } - territoryF:intvector{ - 62268600, - 49928000, - 58255994, - } - zh_Hant{ - populationShareF:int{47920000} - } - } - IE{ - en{ - officialStatus{"official"} - populationShareF:int{49980000} - } - ga{ - officialStatus{"official"} - populationShareF:int{49110000} - } - territoryF:intvector{ - 61236400, - 49990000, - 56489231, - } - } - IL{ - am{ - populationShareF:int{47590000} - } - ar{ - officialStatus{"official"} - populationShareF:int{49200000} - } - en{ - populationShareF:int{49850000} - } - he{ - officialStatus{"official"} - populationShareF:int{50100000} - } - hu{ - populationShareF:int{48100000} - } - lad{ - populationShareF:int{48130000} - } - ml{ - populationShareF:int{46990000} - } - pl{ - populationShareF:int{48150000} - } - ro{ - populationShareF:int{48370000} - } - ru{ - populationShareF:int{49110000} - } - territoryF:intvector{ - 61272100, - 49971000, - 56804931, - } - ti{ - populationShareF:int{47120000} - } - yi{ - populationShareF:int{48300000} - } - } - IM{ - en{ - officialStatus{"official"} - populationShareF:int{50100000} - } - gv{ - officialStatus{"official"} - populationShareF:int{48190000} - } - territoryF:intvector{ - 59629800, - 49990000, - 54875450, - } - } - IN{ - as{ - officialStatus{"official_regional"} - populationShareF:int{48130000} - } - awa{ - populationShareF:int{48190000} - writingShareF:int{48500000} - } - bfq{ - populationShareF:int{46230000} - } - bft{ - populationShareF:int{45620000} - } - bfy{ - populationShareF:int{46370000} - } - bgc{ - populationShareF:int{48120000} - writingShareF:int{49550000} - } - bhb{ - populationShareF:int{47120000} - } - bhi{ - populationShareF:int{46920000} - } - bho{ - populationShareF:int{48230000} - writingShareF:int{49300000} - } - bjj{ - populationShareF:int{47560000} - writingShareF:int{49600000} - } - bn{ - officialStatus{"official_regional"} - populationShareF:int{48810000} - } - bo{ - populationShareF:int{46110000} - } - bpy{ - populationShareF:int{45680000} - } - bra{ - populationShareF:int{45410000} - } - brx{ - populationShareF:int{47140000} - } - btv{ - populationShareF:int{45260000} - } - ccp{ - populationShareF:int{46280000} - } - dcc{ - populationShareF:int{47990000} - } - doi{ - populationShareF:int{47190000} - } - dv{ - populationShareF:int{44400000} - } - dz{ - populationShareF:int{44200000} - } - en{ - officialStatus{"official"} - populationShareF:int{49190000} - } - gbm{ - populationShareF:int{47270000} - } - gom{ - populationShareF:int{47320000} - } - gon_Telu{ - populationShareF:int{47240000} - } - grt{ - populationShareF:int{46530000} - } - gu{ - officialStatus{"official_regional"} - populationShareF:int{48450000} - } - hi{ - officialStatus{"official"} - populationShareF:int{49410000} - } - hne{ - populationShareF:int{48110000} - } - hoc{ - populationShareF:int{46990000} - } - hoj{ - populationShareF:int{46820000} - } - kfr{ - populationShareF:int{46750000} - } - kfy{ - populationShareF:int{47220000} - } - kha{ - officialStatus{"official_regional"} - populationShareF:int{46800000} - writingShareF:int{49290000} - } - khn{ - populationShareF:int{47150000} - } - kht{ - populationShareF:int{44700000} - } - kn{ - officialStatus{"official_regional"} - populationShareF:int{48370000} - } - kok{ - officialStatus{"official_regional"} - populationShareF:int{47370000} - } - kru{ - populationShareF:int{47190000} - } - ks_Arab{ - officialStatus{"official_regional"} - populationShareF:int{47410000} - } - lah{ - populationShareF:int{45250000} - } - lep{ - populationShareF:int{45350000} - } - lif_Deva{ - populationShareF:int{45260000} - } - lmn{ - populationShareF:int{47270000} - } - mag{ - populationShareF:int{48120000} - writingShareF:int{49300000} - } - mai{ - officialStatus{"official_regional"} - populationShareF:int{48120000} - } - ml{ - officialStatus{"official_regional"} - populationShareF:int{48320000} - } - mni{ - populationShareF:int{47110000} - } - mr{ - officialStatus{"official_regional"} - populationShareF:int{48700000} - } - mtr{ - populationShareF:int{46980000} - } - mwr{ - populationShareF:int{48120000} - } - ne{ - officialStatus{"official_regional"} - populationShareF:int{47560000} - } - njo{ - populationShareF:int{46230000} - } - noe{ - populationShareF:int{47130000} - } - or{ - officialStatus{"official_regional"} - populationShareF:int{48320000} - } - pa_Guru{ - officialStatus{"official_regional"} - populationShareF:int{48280000} - } - raj{ - populationShareF:int{47100000} - } - ria{ - populationShareF:int{46130000} - } - rkt{ - populationShareF:int{47440000} - writingShareF:int{49200000} - } - sa{ - officialStatus{"official_regional"} - populationShareF:int{45120000} - } - sat{ - officialStatus{"official_regional"} - populationShareF:int{47550000} - } - saz{ - populationShareF:int{46290000} - } - sck{ - populationShareF:int{47180000} - } - sd_Arab{ - officialStatus{"official_regional"} - populationShareF:int{47260000} - } - sd_Deva{ - officialStatus{"official_regional"} - populationShareF:int{46260000} - } - srx{ - populationShareF:int{46350000} - } - swv{ - populationShareF:int{47280000} - } - ta{ - officialStatus{"official_regional"} - populationShareF:int{48590000} - } - tcy{ - populationShareF:int{47150000} - } - te{ - officialStatus{"official_regional"} - populationShareF:int{48720000} - } - territoryF:intvector{ - 62741100, - 49628000, - 59125170, - } - unr_Beng{ - populationShareF:int{46950000} - } - unx_Beng{ - populationShareF:int{46480000} - } - ur{ - officialStatus{"official_regional"} - populationShareF:int{48500000} - } - wbq{ - populationShareF:int{47180000} - } - wbr{ - populationShareF:int{47150000} - } - wtm{ - populationShareF:int{47460000} - writingShareF:int{49250000} - } - xnr{ - populationShareF:int{47160000} - } - } - IO{ - en{ - officialStatus{"official"} - populationShareF:int{50100000} - writingShareF:int{50100000} - } - territoryF:intvector{ - 58140300, - 49990000, - 53350000, - } - } - IQ{ - ar{ - officialStatus{"official"} - populationShareF:int{49680000} - } - az_Arab{ - officialStatus{"official_regional"} - populationShareF:int{48180000} - } - ckb{ - officialStatus{"official_regional"} - populationShareF:int{49200000} - } - en{ - populationShareF:int{49350000} - } - fa{ - populationShareF:int{47870000} - } - lrc{ - populationShareF:int{47610000} - } - syr{ - populationShareF:int{47500000} - } - territoryF:intvector{ - 61526100, - 49785000, - 57370562, - } - } - IR{ - ar{ - populationShareF:int{48200000} - } - az_Arab{ - populationShareF:int{49240000} - } - bal{ - populationShareF:int{48200000} - } - bgn{ - populationShareF:int{47560000} - writingShareF:int{48500000} - } - bqi{ - populationShareF:int{48140000} - } - ckb{ - populationShareF:int{48390000} - } - fa{ - officialStatus{"official"} - populationShareF:int{49750000} - } - gbz{ - populationShareF:int{45980000} - } - glk{ - populationShareF:int{48460000} - } - hy{ - populationShareF:int{47240000} - } - ka{ - populationShareF:int{46710000} - } - kk_Arab{ - populationShareF:int{45370000} - } - lki{ - populationShareF:int{47760000} - } - lrc{ - populationShareF:int{48210000} - writingShareF:int{49100000} - } - luz{ - populationShareF:int{48120000} - } - mzn{ - populationShareF:int{48500000} - } - prd{ - populationShareF:int{47500000} - } - ps{ - populationShareF:int{47160000} - } - rmt{ - populationShareF:int{48190000} - writingShareF:int{48100000} - } - sdh{ - populationShareF:int{48370000} - } - territoryF:intvector{ - 62135700, - 49850000, - 57818243, - } - tk_Latn{ - populationShareF:int{48280000} - } - } - IS{ - da{ - populationShareF:int{47680000} - } - is{ - officialStatus{"official"} - populationShareF:int{50100000} - } - territoryF:intvector{ - 60143400, - 49990000, - 55331918, - } - } - IT{ - ca{ - populationShareF:int{46350000} - } - de{ - populationShareF:int{48160000} - } - egl{ - populationShareF:int{46500000} - } - el{ - populationShareF:int{46350000} - } - en{ - populationShareF:int{49340000} - } - fr{ - officialStatus{"official_regional"} - populationShareF:int{48630000} - } - fur{ - populationShareF:int{46600000} - writingShareF:int{48500000} - } - hr{ - populationShareF:int{45570000} - } - it{ - officialStatus{"official"} - populationShareF:int{49950000} - } - lij{ - populationShareF:int{47860000} - } - lmo{ - populationShareF:int{46300000} - } - nap{ - populationShareF:int{47970000} - writingShareF:int{48500000} - } - pms{ - populationShareF:int{46100000} - } - rgn{ - populationShareF:int{0} - } - sc{ - populationShareF:int{48170000} - } - scn{ - populationShareF:int{47820000} - writingShareF:int{48500000} - } - sdc{ - populationShareF:int{47170000} - } - sl{ - populationShareF:int{47170000} - } - territoryF:intvector{ - 62213500, - 49990000, - 57618551, - } - vec{ - populationShareF:int{48130000} - } - } - JE{ - en{ - officialStatus{"official"} - populationShareF:int{49950000} - } - territoryF:intvector{ - 59577100, - 49990000, - 54972940, - } - } - JM{ - en{ - officialStatus{"official"} - populationShareF:int{49980000} - } - jam{ - populationShareF:int{49950000} - } - territoryF:intvector{ - 60241000, - 49870000, - 56295021, - } - } - JO{ - ar{ - officialStatus{"official"} - populationShareF:int{50100000} - } - en{ - populationShareF:int{49450000} - } - territoryF:intvector{ - 60799100, - 49959000, - 56811756, - } - } - JP{ - ja{ - officialStatus{"official"} - populationShareF:int{49950000} - } - ko{ - populationShareF:int{47520000} - } - ryu{ - populationShareF:int{47770000} - writingShareF:int{48500000} - } - territoryF:intvector{ - 62476700, - 49990000, - 58126920, - } - } - KE{ - ar{ - populationShareF:int{46460000} - } - dav{ - populationShareF:int{47820000} - writingShareF:int{48500000} - } - ebu{ - populationShareF:int{48150000} - writingShareF:int{48100000} - } - en{ - officialStatus{"official"} - populationShareF:int{49190000} - } - gu{ - populationShareF:int{46110000} - } - guz{ - populationShareF:int{48490000} - } - kam{ - populationShareF:int{48760000} - } - ki{ - populationShareF:int{49170000} - } - kln{ - populationShareF:int{48760000} - } - luo{ - populationShareF:int{48980000} - } - luy{ - populationShareF:int{49110000} - } - mas{ - populationShareF:int{48160000} - writingShareF:int{49500000} - } - mer{ - populationShareF:int{48400000} - } - om{ - populationShareF:int{47470000} - } - pa_Guru{ - populationShareF:int{46220000} - } - pko{ - populationShareF:int{47700000} - writingShareF:int{48100000} - } - saq{ - populationShareF:int{47460000} - writingShareF:int{48100000} - } - so{ - populationShareF:int{48130000} - } - sw{ - officialStatus{"official"} - populationShareF:int{49660000} - } - teo{ - populationShareF:int{47740000} - } - territoryF:intvector{ - 61133000, - 49874000, - 57459253, - } - } - KG{ - ky_Cyrl{ - officialStatus{"official"} - populationShareF:int{49480000} - } - ru{ - officialStatus{"official"} - populationShareF:int{49360000} - } - territoryF:intvector{ - 60192300, - 49992000, - 56566494, - } - } - KH{ - cja{ - populationShareF:int{48160000} - } - kdt{ - populationShareF:int{47110000} - } - km{ - officialStatus{"official"} - populationShareF:int{49890000} - } - territoryF:intvector{ - 60501600, - 49739000, - 57157088, - } - } - KI{ - en{ - officialStatus{"official"} - populationShareF:int{50100000} - } - gil{ - officialStatus{"official"} - populationShareF:int{49600000} - } - territoryF:intvector{ - 58189000, - 49900000, - 55105711, - } - } - KM{ - ar{ - officialStatus{"official"} - populationShareF:int{49660000} - } - fr{ - officialStatus{"official"} - populationShareF:int{49560000} - } - territoryF:intvector{ - 59119000, - 49755000, - 55780971, - } - wni{ - officialStatus{"official"} - populationShareF:int{49340000} - } - zdj{ - officialStatus{"official"} - populationShareF:int{49370000} - } - } - KN{ - en{ - officialStatus{"official"} - populationShareF:int{49980000} - } - territoryF:intvector{ - 59128100, - 49978000, - 54519360, - } - } - KP{ - ko{ - officialStatus{"official"} - populationShareF:int{49880000} - } - territoryF:intvector{ - 60400000, - 50100000, - 57249832, - } - } - KR{ - ko{ - officialStatus{"official"} - populationShareF:int{50100000} - } - territoryF:intvector{ - 62178400, - 49979000, - 57491152, - } - } - KW{ - ar{ - officialStatus{"official"} - populationShareF:int{50100000} - } - territoryF:intvector{ - 61282600, - 49939000, - 56278853, - } - } - KY{ - en{ - officialStatus{"official"} - populationShareF:int{49980000} - } - territoryF:intvector{ - 59250700, - 49989000, - 54560920, - } - } - KZ{ - de{ - populationShareF:int{48640000} - } - en{ - populationShareF:int{49150000} - } - kk_Cyrl{ - officialStatus{"official"} - populationShareF:int{49640000} - } - ru{ - officialStatus{"official"} - populationShareF:int{49720000} - } - territoryF:intvector{ - 61420000, - 49997000, - 57181571, - } - ug_Cyrl{ - populationShareF:int{48200000} - } - } - LA{ - kdt{ - populationShareF:int{47960000} - } - kjg{ - populationShareF:int{48580000} - } - lo{ - officialStatus{"official"} - populationShareF:int{49690000} - } - territoryF:intvector{ - 60345300, - 49727000, - 56691154, - } - } - LB{ - ar{ - officialStatus{"official"} - populationShareF:int{49860000} - } - en{ - populationShareF:int{49400000} - } - fr{ - populationShareF:int{47370000} - } - hy{ - populationShareF:int{48520000} - } - ku_Arab{ - populationShareF:int{48160000} - } - territoryF:intvector{ - 60814200, - 49896000, - 56618470, - } - } - LC{ - en{ - officialStatus{"official"} - populationShareF:int{49900000} - } - territoryF:intvector{ - 59197800, - 49901000, - 55163922, - } - } - LI{ - de{ - officialStatus{"official"} - populationShareF:int{50100000} - } - gsw{ - officialStatus{"de_facto_official"} - populationShareF:int{49850000} - writingShareF:int{48500000} - } - territoryF:intvector{ - 59320000, - 50100000, - 54376240, - } - wae{ - populationShareF:int{48350000} - } - } - LK{ - en{ - populationShareF:int{49100000} - } - si{ - officialStatus{"official"} - populationShareF:int{49680000} - } - ta{ - officialStatus{"official"} - populationShareF:int{49150000} - } - territoryF:intvector{ - 61218200, - 49912000, - 57220535, - } - } - LR{ - en{ - officialStatus{"official"} - populationShareF:int{49830000} - } - kpe{ - populationShareF:int{49140000} - } - men{ - populationShareF:int{47480000} - } - territoryF:intvector{ - 59371100, - 49608000, - 56419567, - } - vai_Latn{ - populationShareF:int{0} - } - vai_Vaii{ - populationShareF:int{48260000} - } - } - LS{ - en{ - officialStatus{"official"} - populationShareF:int{49270000} - } - ss{ - populationShareF:int{48240000} - } - st{ - officialStatus{"official"} - populationShareF:int{49980000} - } - territoryF:intvector{ - 59557500, - 49896000, - 56194770, - } - xh{ - populationShareF:int{47990000} - } - zu{ - populationShareF:int{49140000} - } - } - LT{ - en{ - populationShareF:int{49380000} - } - lt{ - officialStatus{"official"} - populationShareF:int{49860000} - } - ru{ - populationShareF:int{48800000} - } - sgs{ - populationShareF:int{0} - } - territoryF:intvector{ - 60799300, - 49997000, - 56288443, - } - } - LU{ - de{ - officialStatus{"official"} - populationShareF:int{49630000} - } - fr{ - officialStatus{"official"} - populationShareF:int{49870000} - } - lb{ - officialStatus{"official"} - populationShareF:int{49670000} - writingShareF:int{48500000} - } - pt{ - populationShareF:int{49160000} - } - territoryF:intvector{ - 60536700, - 50100000, - 55570252, - } - } - LV{ - ltg{ - populationShareF:int{48890000} - } - lv{ - officialStatus{"official"} - populationShareF:int{49610000} - } - ru{ - populationShareF:int{49380000} - } - territoryF:intvector{ - 60483600, - 49998000, - 56198671, - } - } - LY{ - ar{ - officialStatus{"official"} - populationShareF:int{49740000} - } - territoryF:intvector{ - 60979400, - 49895000, - 56641178, - } - } - MA{ - ar{ - officialStatus{"official"} - populationShareF:int{49620000} - } - ary{ - populationShareF:int{49870000} - } - en{ - populationShareF:int{49140000} - } - es{ - populationShareF:int{46650000} - } - fr{ - officialStatus{"de_facto_official"} - populationShareF:int{49200000} - } - rif_Latn{ - populationShareF:int{48490000} - writingShareF:int{48500000} - } - rif_Tfng{ - populationShareF:int{48490000} - writingShareF:int{48500000} - } - shi_Latn{ - populationShareF:int{48870000} - } - shi_Tfng{ - populationShareF:int{48870000} - } - territoryF:intvector{ - 61259200, - 49671000, - 57333227, - } - tzm_Latn{ - officialStatus{"official"} - populationShareF:int{48980000} - writingShareF:int{49250000} - } - zgh{ - populationShareF:int{49220000} - } - } - MC{ - fr{ - officialStatus{"official"} - populationShareF:int{49990000} - } - territoryF:intvector{ - 59679000, - 49990000, - 54305350, - } - } - MD{ - bg{ - populationShareF:int{48940000} - } - gag{ - populationShareF:int{48330000} - } - ro{ - officialStatus{"official"} - populationShareF:int{49630000} - } - ru{ - populationShareF:int{48300000} - } - territoryF:intvector{ - 60177800, - 49990000, - 56354685, - } - uk{ - populationShareF:int{49140000} - } - } - ME{ - sq{ - populationShareF:int{48790000} - } - sr_Cyrl{ - populationShareF:int{48500000} - } - sr_Latn{ - officialStatus{"official"} - populationShareF:int{50100000} - } - territoryF:intvector{ - 59942800, - 49985000, - 55647073, - } - } - MF{ - fr{ - officialStatus{"official"} - populationShareF:int{50100000} - } - territoryF:intvector{ - 58561500, - 49990000, - 54317540, - } - } - MG{ - en{ - officialStatus{"official"} - populationShareF:int{49180000} - } - fr{ - officialStatus{"official"} - populationShareF:int{49690000} - } - mg{ - officialStatus{"official"} - populationShareF:int{49900000} - } - territoryF:intvector{ - 60340500, - 49645000, - 57238127, - } - } - MH{ - en{ - officialStatus{"official"} - populationShareF:int{49930000} - } - mh{ - officialStatus{"official"} - populationShareF:int{49730000} - } - territoryF:intvector{ - 58182000, - 49937000, - 54721910, - } - } - MK{ - mk{ - officialStatus{"official"} - populationShareF:int{49670000} - } - sq{ - officialStatus{"official_regional"} - populationShareF:int{49250000} - } - territoryF:intvector{ - 60277200, - 49974000, - 56209602, - } - tr{ - populationShareF:int{48350000} - } - } - ML{ - ar{ - populationShareF:int{47890000} - } - bm_Latn{ - populationShareF:int{49460000} - } - bm_Nkoo{ - populationShareF:int{48200000} - } - bmq{ - populationShareF:int{47860000} - } - bze{ - populationShareF:int{47840000} - } - dtm{ - populationShareF:int{48110000} - } - ffm{ - populationShareF:int{48770000} - } - fr{ - officialStatus{"official"} - populationShareF:int{49460000} - } - kao{ - populationShareF:int{48100000} - } - khq{ - populationShareF:int{48170000} - } - mwk{ - populationShareF:int{48500000} - } - ses{ - populationShareF:int{48340000} - } - snk{ - populationShareF:int{48590000} - } - territoryF:intvector{ - 60275000, - 49334000, - 57169555, - } - tmh{ - populationShareF:int{48210000} - } - } - MM{ - kac{ - populationShareF:int{48170000} - } - kht{ - populationShareF:int{45750000} - } - mnw{ - populationShareF:int{48150000} - } - my{ - officialStatus{"official"} - populationShareF:int{49640000} - } - shn{ - populationShareF:int{48640000} - } - territoryF:intvector{ - 61244400, - 49927000, - 57563202, - } - } - MN{ - kk_Arab{ - populationShareF:int{48720000} - } - mn_Cyrl{ - officialStatus{"official"} - populationShareF:int{49930000} - } - ru{ - populationShareF:int{47130000} - } - territoryF:intvector{ - 60348700, - 49974000, - 56299291, - } - ug_Cyrl{ - populationShareF:int{46330000} - } - zh_Hans{ - populationShareF:int{48140000} - } - } - MO{ - en{ - populationShareF:int{48230000} - } - pt{ - officialStatus{"official"} - populationShareF:int{48500000} - } - territoryF:intvector{ - 60516800, - 49956000, - 55592731, - } - zh_Hans{ - populationShareF:int{48500000} - } - zh_Hant{ - officialStatus{"official"} - populationShareF:int{49980000} - } - } - MP{ - ch{ - populationShareF:int{49180000} - } - en{ - officialStatus{"de_facto_official"} - populationShareF:int{49970000} - } - territoryF:intvector{ - 58682000, - 49970000, - 54523440, - } - } - MQ{ - fr{ - officialStatus{"official"} - populationShareF:int{49980000} - } - territoryF:intvector{ - 59611700, - 49980000, - 55436131, - } - } - MR{ - ar{ - officialStatus{"official"} - populationShareF:int{49850000} - } - ff{ - populationShareF:int{48570000} - } - fr{ - populationShareF:int{49170000} - } - territoryF:intvector{ - 60156200, - 49586000, - 56359670, - } - wo{ - populationShareF:int{47280000} - } - } - MS{ - en{ - officialStatus{"official"} - populationShareF:int{49670000} - } - territoryF:intvector{ - 57437800, - 49970000, - 53524100, - } - } - MT{ - en{ - officialStatus{"official"} - populationShareF:int{49880000} - } - mt{ - officialStatus{"official"} - populationShareF:int{50100000} - } - territoryF:intvector{ - 60141200, - 49924000, - 55413965, - } - } - MU{ - bho{ - populationShareF:int{49270000} - } - en{ - officialStatus{"official"} - populationShareF:int{49720000} - } - fr{ - officialStatus{"official"} - populationShareF:int{48300000} - } - mfe{ - populationShareF:int{49900000} - } - ta{ - populationShareF:int{48250000} - } - territoryF:intvector{ - 60235300, - 49888000, - 56133983, - } - ur{ - populationShareF:int{48520000} - } - } - MV{ - dv{ - officialStatus{"official"} - populationShareF:int{49940000} - } - territoryF:intvector{ - 59455400, - 49984000, - 55393253, - } - } - MW{ - en{ - officialStatus{"official"} - populationShareF:int{49630000} - } - ny{ - officialStatus{"official"} - populationShareF:int{49630000} - } - territoryF:intvector{ - 60195800, - 49748000, - 57179647, - } - tog{ - populationShareF:int{47980000} - } - tum{ - populationShareF:int{48840000} - } - zu{ - populationShareF:int{47330000} - } - } - MX{ - en{ - populationShareF:int{49130000} - } - es{ - officialStatus{"de_facto_official"} - populationShareF:int{49830000} - } - maz{ - populationShareF:int{47340000} - } - nch{ - populationShareF:int{47190000} - } - nhe{ - populationShareF:int{47390000} - } - nhw{ - populationShareF:int{47380000} - } - sei{ - populationShareF:int{44700000} - } - territoryF:intvector{ - 62214900, - 49935000, - 58121737, - } - yua{ - populationShareF:int{47670000} - } - } - MY{ - bjn{ - populationShareF:int{46160000} - } - bug{ - populationShareF:int{46790000} - } - dtp{ - populationShareF:int{47560000} - } - en{ - populationShareF:int{49210000} - } - iba{ - populationShareF:int{48250000} - } - jv{ - populationShareF:int{48120000} - } - ml{ - populationShareF:int{47150000} - } - ms_Latn{ - officialStatus{"official"} - populationShareF:int{49750000} - } - ta{ - populationShareF:int{48420000} - } - territoryF:intvector{ - 61769400, - 49931000, - 57305138, - } - zh_Hant{ - populationShareF:int{49170000} - } - zmi{ - populationShareF:int{48120000} - } - } - MZ{ - mgh{ - populationShareF:int{48450000} - } - ndc{ - populationShareF:int{48990000} - } - ngl{ - populationShareF:int{48680000} - } - ny{ - populationShareF:int{48260000} - } - pt{ - officialStatus{"official"} - populationShareF:int{49270000} - } - rng{ - populationShareF:int{48340000} - } - seh{ - populationShareF:int{48460000} - } - sw{ - populationShareF:int{46360000} - } - territoryF:intvector{ - 60312100, - 49561000, - 57253031, - } - ts{ - populationShareF:int{48790000} - } - vmw{ - populationShareF:int{49130000} - } - yao{ - populationShareF:int{48240000} - } - zu{ - populationShareF:int{45710000} - } - } - NA{ - af{ - populationShareF:int{49750000} - } - de{ - populationShareF:int{47900000} - } - en{ - officialStatus{"official"} - populationShareF:int{48700000} - } - hz{ - populationShareF:int{48910000} - } - kj{ - populationShareF:int{49350000} - } - naq{ - populationShareF:int{49110000} - } - ng{ - populationShareF:int{49210000} - } - territoryF:intvector{ - 60234800, - 49888000, - 56221231, - } - tn{ - populationShareF:int{47560000} - } - } - NC{ - fr{ - officialStatus{"official"} - populationShareF:int{49960000} - } - territoryF:intvector{ - 60111000, - 49962000, - 55271615, - } - } - NE{ - ar{ - populationShareF:int{47210000} - } - dje{ - populationShareF:int{49170000} - } - fr{ - officialStatus{"official"} - populationShareF:int{49290000} - } - fuq{ - populationShareF:int{48700000} - } - ha_Latn{ - populationShareF:int{49410000} - } - territoryF:intvector{ - 60180000, - 49287000, - 57180457, - } - tmh{ - populationShareF:int{48600000} - } - twq{ - populationShareF:int{46440000} - } - } - NF{ - en{ - officialStatus{"official"} - populationShareF:int{49760000} - } - territoryF:intvector{ - 58106900, - 49990000, - 53221000, - } - } - NG{ - amo{ - populationShareF:int{45870000} - } - ar{ - populationShareF:int{46710000} - } - bin{ - populationShareF:int{47710000} - } - cch{ - populationShareF:int{46210000} - } - efi{ - populationShareF:int{48140000} - } - en{ - officialStatus{"official"} - populationShareF:int{49530000} - } - fuv{ - populationShareF:int{48670000} - writingShareF:int{49200000} - } - ha_Arab{ - populationShareF:int{48100000} - } - ha_Latn{ - populationShareF:int{49130000} - } - ibb{ - populationShareF:int{48140000} - } - ig{ - populationShareF:int{49130000} - } - kaj{ - populationShareF:int{47210000} - } - kcg{ - populationShareF:int{46930000} - } - pcm{ - populationShareF:int{49210000} - } - territoryF:intvector{ - 62105300, - 49613000, - 58181562, - } - tiv{ - populationShareF:int{48160000} - writingShareF:int{49250000} - } - yo{ - officialStatus{"official"} - populationShareF:int{49130000} - } - } - NI{ - es{ - officialStatus{"official"} - populationShareF:int{49780000} - } - territoryF:intvector{ - 60296900, - 49780000, - 56590788, - } - } - NL{ - de{ - populationShareF:int{49710000} - writingShareF:int{48500000} - } - en{ - populationShareF:int{49900000} - } - fr{ - populationShareF:int{49290000} - } - fy{ - officialStatus{"official_regional"} - populationShareF:int{48430000} - } - gos{ - populationShareF:int{48360000} - writingShareF:int{48500000} - } - id{ - populationShareF:int{48180000} - } - li{ - populationShareF:int{48550000} - writingShareF:int{48500000} - } - nds{ - populationShareF:int{49110000} - writingShareF:int{48500000} - } - nl{ - officialStatus{"official"} - populationShareF:int{50100000} - } - rif_Latn{ - populationShareF:int{48120000} - } - territoryF:intvector{ - 61808800, - 49990000, - 57169479, - } - tr{ - populationShareF:int{48120000} - } - zea{ - populationShareF:int{48140000} - } - } - NO{ - nb{ - officialStatus{"official"} - populationShareF:int{50100000} - } - nn{ - officialStatus{"official"} - populationShareF:int{49250000} - } - se{ - officialStatus{"official_regional"} - populationShareF:int{48330000} - } - territoryF:intvector{ - 61346300, - 50100000, - 56520769, - } - } - NP{ - awa{ - populationShareF:int{48220000} - } - bap{ - populationShareF:int{48150000} - } - bfy{ - populationShareF:int{47540000} - } - bho{ - populationShareF:int{48680000} - } - bn{ - populationShareF:int{46940000} - } - bo{ - populationShareF:int{47240000} - } - dty{ - populationShareF:int{48250000} - } - en{ - populationShareF:int{48300000} - } - ggn{ - populationShareF:int{47420000} - } - gvr{ - populationShareF:int{47290000} - } - hi{ - populationShareF:int{47420000} - } - jml{ - populationShareF:int{48320000} - } - lep{ - populationShareF:int{45900000} - } - lif_Deva{ - populationShareF:int{48110000} - } - mai{ - populationShareF:int{49110000} - } - mgp{ - populationShareF:int{48110000} - } - mrd{ - populationShareF:int{47830000} - } - ne{ - officialStatus{"official"} - populationShareF:int{49440000} - } - new{ - populationShareF:int{48330000} - } - rjs{ - populationShareF:int{47440000} - writingShareF:int{49670000} - } - taj{ - populationShareF:int{48300000} - } - tdg{ - populationShareF:int{48130000} - } - tdh{ - populationShareF:int{47120000} - } - territoryF:intvector{ - 60671400, - 49574000, - 57315513, - } - thl{ - populationShareF:int{48200000} - } - thq{ - populationShareF:int{48100000} - } - thr{ - populationShareF:int{48120000} - } - tkt{ - populationShareF:int{47240000} - } - tsf{ - populationShareF:int{47430000} - } - unr_Deva{ - populationShareF:int{46180000} - } - xsr{ - populationShareF:int{47520000} - } - } - NR{ - en{ - officialStatus{"official"} - populationShareF:int{49980000} - } - na{ - officialStatus{"official"} - populationShareF:int{49720000} - } - territoryF:intvector{ - 58150800, - 49990000, - 53954000, - } - } - NU{ - en{ - officialStatus{"official"} - populationShareF:int{49950000} - } - niu{ - officialStatus{"official"} - populationShareF:int{49950000} - } - territoryF:intvector{ - 57100100, - 49950000, - 53119000, - } - } - NZ{ - en{ - officialStatus{"de_facto_official"} - populationShareF:int{49980000} - } - mi{ - officialStatus{"official"} - populationShareF:int{48250000} - } - territoryF:intvector{ - 61160800, - 49990000, - 56443839, - } - } - OM{ - ar{ - officialStatus{"official"} - populationShareF:int{49810000} - } - bal{ - populationShareF:int{48490000} - } - fa{ - populationShareF:int{47940000} - } - territoryF:intvector{ - 61163000, - 49869000, - 56328694, - } - } - PA{ - en{ - populationShareF:int{49140000} - } - es{ - officialStatus{"official"} - populationShareF:int{49690000} - } - territoryF:intvector{ - 60767700, - 49941000, - 56365702, - } - zh_Hant{ - populationShareF:int{47160000} - } - } - PE{ - ay{ - populationShareF:int{48160000} - } - es{ - officialStatus{"official"} - populationShareF:int{49730000} - } - qu{ - officialStatus{"official"} - populationShareF:int{49150000} - } - territoryF:intvector{ - 61372700, - 49896000, - 57304450, - } - } - PF{ - fr{ - officialStatus{"official"} - populationShareF:int{49610000} - } - territoryF:intvector{ - 59715000, - 49980000, - 55282703, - } - ty{ - officialStatus{"official"} - populationShareF:int{49310000} - } - zh_Hant{ - populationShareF:int{48780000} - } - } - PG{ - en{ - officialStatus{"official"} - populationShareF:int{49500000} - } - ho{ - officialStatus{"official"} - populationShareF:int{48210000} - writingShareF:int{48500000} - } - territoryF:intvector{ - 60186000, - 49624000, - 56667243, - } - tpi{ - officialStatus{"official"} - populationShareF:int{49710000} - writingShareF:int{49450000} - } - } - PH{ - bhk{ - populationShareF:int{48230000} - } - bik{ - populationShareF:int{48300000} - } - bku{ - populationShareF:int{45790000} - } - bto{ - populationShareF:int{47280000} - } - ceb{ - officialStatus{"official_regional"} - populationShareF:int{49240000} - writingShareF:int{49130000} - } - cps{ - populationShareF:int{47670000} - } - en{ - officialStatus{"official"} - populationShareF:int{49640000} - } - es{ - populationShareF:int{49310000} - } - fil{ - officialStatus{"official"} - populationShareF:int{49600000} - } - hil{ - officialStatus{"official_regional"} - populationShareF:int{48840000} - writingShareF:int{48800000} - } - hnn{ - populationShareF:int{46160000} - } - ilo{ - officialStatus{"official_regional"} - populationShareF:int{48960000} - writingShareF:int{49100000} - } - krj{ - populationShareF:int{47390000} - } - mdh{ - officialStatus{"official_regional"} - populationShareF:int{48120000} - } - pag{ - officialStatus{"official_regional"} - populationShareF:int{48140000} - } - pam{ - populationShareF:int{48230000} - } - tbw{ - populationShareF:int{45990000} - writingShareF:int{49360000} - } - territoryF:intvector{ - 61693400, - 49954000, - 58100998, - } - tsg{ - officialStatus{"official_regional"} - populationShareF:int{48110000} - } - war{ - officialStatus{"official_regional"} - populationShareF:int{48290000} - } - zh_Hant{ - populationShareF:int{47730000} - } - } - PK{ - bal{ - populationShareF:int{48370000} - } - bft{ - populationShareF:int{47180000} - } - bgn{ - populationShareF:int{47570000} - writingShareF:int{48500000} - } - brh{ - populationShareF:int{48130000} - } - btv{ - populationShareF:int{46190000} - } - en{ - officialStatus{"official"} - populationShareF:int{49500000} - } - fa{ - populationShareF:int{47660000} - } - gjk{ - populationShareF:int{47110000} - } - gju{ - populationShareF:int{47200000} - } - hnd{ - populationShareF:int{47410000} - } - hno{ - populationShareF:int{48120000} - } - khw{ - populationShareF:int{47150000} - } - ks_Arab{ - populationShareF:int{46690000} - } - kvx{ - populationShareF:int{47160000} - } - kxp{ - populationShareF:int{47120000} - } - lah{ - populationShareF:int{49400000} - } - mvy{ - populationShareF:int{47140000} - } - pa_Arab{ - populationShareF:int{49700000} - } - ps{ - populationShareF:int{49150000} - } - sd_Arab{ - populationShareF:int{49120000} - } - skr{ - populationShareF:int{48910000} - writingShareF:int{48100000} - } - territoryF:intvector{ - 61884200, - 49549000, - 58199086, - } - tg_Arab{ - populationShareF:int{47330000} - } - ur{ - officialStatus{"official"} - populationShareF:int{49950000} - } - } - PL{ - be{ - populationShareF:int{47580000} - } - csb{ - officialStatus{"official_regional"} - populationShareF:int{47130000} - } - de{ - officialStatus{"official_regional"} - populationShareF:int{46960000} - } - en{ - populationShareF:int{49330000} - } - lt{ - officialStatus{"official_regional"} - populationShareF:int{46210000} - } - pl{ - officialStatus{"official"} - populationShareF:int{49960000} - } - sli{ - populationShareF:int{46310000} - } - szl{ - populationShareF:int{48130000} - } - territoryF:intvector{ - 61959800, - 49997000, - 57385622, - } - uk{ - populationShareF:int{47390000} - } - } - PM{ - en{ - populationShareF:int{48330000} - } - fr{ - officialStatus{"official"} - populationShareF:int{49900000} - } - territoryF:intvector{ - 58215300, - 49990000, - 53565700, - } - } - PN{ - en{ - officialStatus{"official"} - populationShareF:int{49960000} - } - territoryF:intvector{ - 56192400, - 49990000, - 51480000, - } - } - PR{ - en{ - officialStatus{"de_facto_official"} - populationShareF:int{49490000} - } - es{ - officialStatus{"official"} - populationShareF:int{49870000} - } - territoryF:intvector{ - 60614600, - 49903000, - 56359836, - } - } - PS{ - ar{ - officialStatus{"official"} - populationShareF:int{50100000} - } - territoryF:intvector{ - 60201200, - 49953000, - 56465442, - } - } - PT{ - en{ - populationShareF:int{49270000} - } - es{ - populationShareF:int{46970000} - } - gl{ - populationShareF:int{47140000} - } - pt{ - officialStatus{"official"} - populationShareF:int{49960000} - } - territoryF:intvector{ - 61281400, - 49954000, - 57108253, - } - } - PW{ - en{ - officialStatus{"official"} - populationShareF:int{48880000} - } - pau{ - officialStatus{"official"} - populationShareF:int{49740000} - } - territoryF:intvector{ - 58250000, - 49920000, - 54212650, - } - } - PY{ - de{ - populationShareF:int{48290000} - } - es{ - officialStatus{"official"} - populationShareF:int{48320000} - } - gn{ - officialStatus{"official"} - populationShareF:int{49800000} - } - territoryF:intvector{ - 60584900, - 49939000, - 56678327, - } - } - QA{ - ar{ - officialStatus{"official"} - populationShareF:int{49890000} - } - fa{ - populationShareF:int{49110000} - } - ml{ - populationShareF:int{47300000} - } - territoryF:intvector{ - 61306600, - 49963000, - 56219482, - } - } - RE{ - fr{ - officialStatus{"official"} - populationShareF:int{49890000} - } - rcf{ - populationShareF:int{49710000} - } - ta{ - populationShareF:int{49150000} - } - territoryF:intvector{ - 59479100, - 49880000, - 55787584, - } - } - RO{ - bg{ - populationShareF:int{46310000} - } - de{ - populationShareF:int{47210000} - } - el{ - populationShareF:int{46190000} - } - en{ - populationShareF:int{49310000} - } - hu{ - populationShareF:int{48660000} - } - pl{ - populationShareF:int{46130000} - } - ro{ - officialStatus{"official"} - populationShareF:int{49900000} - } - sr_Latn{ - populationShareF:int{47120000} - } - territoryF:intvector{ - 61393800, - 49977000, - 57216664, - } - tr{ - populationShareF:int{47130000} - } - } - RS{ - hr{ - officialStatus{"official_regional"} - populationShareF:int{47930000} - } - hu{ - officialStatus{"official_regional"} - populationShareF:int{48480000} - } - ro{ - officialStatus{"official_regional"} - populationShareF:int{48210000} - } - sk{ - officialStatus{"official_regional"} - populationShareF:int{47850000} - } - sq{ - populationShareF:int{49190000} - } - sr_Cyrl{ - officialStatus{"official"} - populationShareF:int{49990000} - } - sr_Latn{ - officialStatus{"official"} - populationShareF:int{49990000} - writingShareF:int{48500000} - } - territoryF:intvector{ - 60958400, - 49980000, - 56717679, - } - uk{ - officialStatus{"official_regional"} - populationShareF:int{0} - } - } - RU{ - ady{ - officialStatus{"official_regional"} - populationShareF:int{46880000} - } - alt{ - populationShareF:int{46140000} - } - av{ - officialStatus{"official_regional"} - populationShareF:int{47390000} - } - az_Cyrl{ - officialStatus{"official_regional"} - populationShareF:int{46930000} - } - ba{ - officialStatus{"official_regional"} - populationShareF:int{48130000} - } - bua{ - populationShareF:int{47220000} - } - ce{ - officialStatus{"official_regional"} - populationShareF:int{47660000} - } - chm{ - populationShareF:int{47370000} - } - cu{ - populationShareF:int{0} - } - cv{ - populationShareF:int{48130000} - } - dar{ - populationShareF:int{47260000} - } - fi{ - populationShareF:int{46120000} - } - hy{ - populationShareF:int{47840000} - writingShareF:int{49500000} - } - inh{ - officialStatus{"official_regional"} - populationShareF:int{47160000} - } - izh{ - populationShareF:int{44100000} - } - kbd{ - officialStatus{"official_regional"} - populationShareF:int{47310000} - } - koi{ - officialStatus{"official_regional"} - populationShareF:int{46450000} - } - krc{ - officialStatus{"official_regional"} - populationShareF:int{47160000} - } - krl{ - populationShareF:int{46820000} - } - kum{ - officialStatus{"official_regional"} - populationShareF:int{47200000} - } - kv{ - officialStatus{"official_regional"} - populationShareF:int{47180000} - } - lbe{ - officialStatus{"official_regional"} - populationShareF:int{46780000} - } - lez{ - officialStatus{"official_regional"} - populationShareF:int{47180000} - } - mdf{ - officialStatus{"official_regional"} - populationShareF:int{47210000} - } - mn_Cyrl{ - populationShareF:int{45150000} - } - mrj{ - populationShareF:int{46210000} - } - myv{ - officialStatus{"official_regional"} - populationShareF:int{47310000} - } - os{ - populationShareF:int{47320000} - } - ru{ - officialStatus{"official"} - populationShareF:int{49940000} - } - sah{ - officialStatus{"official_regional"} - populationShareF:int{47320000} - } - sr_Latn{ - populationShareF:int{45350000} - } - territoryF:intvector{ - 62357700, - 49997000, - 58142424, - } - tt{ - officialStatus{"official_regional"} - populationShareF:int{48140000} - } - tyv{ - officialStatus{"official_regional"} - populationShareF:int{47130000} - } - udm{ - officialStatus{"official_regional"} - populationShareF:int{47380000} - } - vep{ - populationShareF:int{45250000} - } - vot{ - populationShareF:int{0} - } - } - RW{ - en{ - officialStatus{"official"} - populationShareF:int{49150000} - } - fr{ - officialStatus{"official"} - populationShareF:int{46180000} - } - rw{ - officialStatus{"official"} - populationShareF:int{49770000} - } - territoryF:intvector{ - 60189000, - 49711000, - 57126617, - } - } - SA{ - ar{ - officialStatus{"official"} - populationShareF:int{50100000} - } - territoryF:intvector{ - 62161000, - 49872000, - 57277523, - } - } - SB{ - en{ - officialStatus{"official"} - populationShareF:int{50100000} - } - rug{ - populationShareF:int{48160000} - } - territoryF:intvector{ - 59109400, - 49841000, - 55622469, - } - } - SC{ - crs{ - populationShareF:int{49980000} - } - en{ - officialStatus{"official"} - populationShareF:int{49380000} - } - fr{ - officialStatus{"official"} - populationShareF:int{49600000} - } - territoryF:intvector{ - 59242400, - 49918000, - 54924300, - } - } - SD{ - ar{ - officialStatus{"official"} - populationShareF:int{49610000} - } - bej{ - populationShareF:int{48540000} - } - en{ - officialStatus{"official"} - populationShareF:int{49610000} - } - fia{ - populationShareF:int{47830000} - } - fvr{ - populationShareF:int{48270000} - } - ha_Arab{ - populationShareF:int{48180000} - } - mls{ - populationShareF:int{47990000} - } - territoryF:intvector{ - 61160200, - 49719000, - 57361089, - } - zag{ - populationShareF:int{47510000} - } - } - SE{ - en{ - populationShareF:int{49860000} - } - fi{ - officialStatus{"official_regional"} - populationShareF:int{48220000} - } - fit{ - populationShareF:int{47550000} - } - ia{ - populationShareF:int{0} - } - rmu{ - populationShareF:int{46970000} - } - se{ - populationShareF:int{47330000} - } - sma{ - populationShareF:int{45310000} - writingShareF:int{49750000} - } - smj{ - populationShareF:int{46150000} - } - sv{ - officialStatus{"official"} - populationShareF:int{49950000} - } - territoryF:intvector{ - 61450500, - 49990000, - 56980162, - } - yi{ - populationShareF:int{46310000} - } - } - SG{ - en{ - officialStatus{"official"} - populationShareF:int{49930000} - } - ml{ - populationShareF:int{47180000} - } - ms_Latn{ - officialStatus{"official"} - populationShareF:int{49140000} - } - pa_Guru{ - populationShareF:int{47170000} - } - ta{ - officialStatus{"official"} - populationShareF:int{48210000} - } - territoryF:intvector{ - 61454300, - 49959000, - 56567447, - } - zh_Hans{ - officialStatus{"official"} - populationShareF:int{49770000} - } - } - SH{ - en{ - officialStatus{"official"} - populationShareF:int{49690000} - } - territoryF:intvector{ - 57311000, - 49970000, - 53779500, - } - } - SI{ - en{ - populationShareF:int{49590000} - } - hu{ - populationShareF:int{47470000} - } - it{ - populationShareF:int{47200000} - } - sl{ - officialStatus{"official"} - populationShareF:int{49870000} - } - territoryF:intvector{ - 60615600, - 49997000, - 56198341, - } - } - SJ{ - nb{ - officialStatus{"official"} - populationShareF:int{49800000} - } - ru{ - populationShareF:int{49640000} - } - territoryF:intvector{ - 58124500, - 50100000, - 53187200, - } - } - SK{ - de{ - populationShareF:int{47280000} - } - en{ - populationShareF:int{49260000} - } - hu{ - populationShareF:int{49110000} - } - pl{ - populationShareF:int{47930000} - } - sk{ - officialStatus{"official"} - populationShareF:int{49900000} - } - territoryF:intvector{ - 61153200, - 49996000, - 56544503, - } - uk{ - populationShareF:int{48190000} - } - } - SL{ - en{ - officialStatus{"official"} - populationShareF:int{49350000} - } - kri{ - populationShareF:int{49950000} - } - men{ - populationShareF:int{49270000} - } - tem{ - populationShareF:int{49260000} - writingShareF:int{48600000} - } - territoryF:intvector{ - 60128000, - 49433000, - 56587910, - } - } - SM{ - eo{ - populationShareF:int{47910000} - } - it{ - officialStatus{"official"} - populationShareF:int{49890000} - } - territoryF:intvector{ - 59191400, - 49960000, - 54330200, - } - } - SN{ - bjt{ - officialStatus{"official_regional"} - populationShareF:int{47610000} - writingShareF:int{50100000} - } - bsc{ - officialStatus{"official_regional"} - populationShareF:int{46980000} - writingShareF:int{49100000} - } - dyo{ - officialStatus{"official_regional"} - populationShareF:int{48260000} - writingShareF:int{49100000} - } - ff{ - officialStatus{"official_regional"} - populationShareF:int{49210000} - } - fr{ - officialStatus{"official"} - populationShareF:int{49390000} - writingShareF:int{50100000} - } - knf{ - officialStatus{"official_regional"} - populationShareF:int{47210000} - writingShareF:int{49100000} - } - mey{ - officialStatus{"official_regional"} - populationShareF:int{46510000} - writingShareF:int{49100000} - } - mfv{ - officialStatus{"official_regional"} - populationShareF:int{47770000} - writingShareF:int{49100000} - } - sav{ - officialStatus{"official_regional"} - populationShareF:int{48150000} - } - snf{ - officialStatus{"official_regional"} - populationShareF:int{47240000} - writingShareF:int{49100000} - } - srr{ - officialStatus{"official_regional"} - populationShareF:int{49110000} - } - territoryF:intvector{ - 60342000, - 49497000, - 57139758, - } - tnr{ - officialStatus{"official_regional"} - populationShareF:int{46240000} - writingShareF:int{49100000} - } - wo{ - officialStatus{"de_facto_official"} - populationShareF:int{49700000} - } - } - SO{ - ar{ - officialStatus{"official"} - populationShareF:int{49340000} - writingShareF:int{49990000} - } - om{ - populationShareF:int{47420000} - } - so{ - officialStatus{"official"} - populationShareF:int{49780000} - } - sw{ - populationShareF:int{48200000} - } - territoryF:intvector{ - 59589600, - 49378000, - 57106164, - } - } - SR{ - nl{ - officialStatus{"official"} - populationShareF:int{49900000} - } - srn{ - populationShareF:int{49680000} - writingShareF:int{49750000} - } - territoryF:intvector{ - 59898700, - 49947000, - 55579633, - } - zh_Hant{ - populationShareF:int{48120000} - } - } - SS{ - ar{ - populationShareF:int{49270000} - } - en{ - officialStatus{"official"} - populationShareF:int{49270000} - } - nus{ - populationShareF:int{48560000} - } - territoryF:intvector{ - 60235000, - 49270000, - 57120429, - } - } - ST{ - pt{ - officialStatus{"official"} - populationShareF:int{49850000} - } - territoryF:intvector{ - 58626000, - 49695000, - 55194006, - } - } - SV{ - es{ - officialStatus{"official"} - populationShareF:int{49890000} - } - territoryF:intvector{ - 60511900, - 49845000, - 56614135, - } - } - SX{ - en{ - officialStatus{"official"} - populationShareF:int{49680000} - } - es{ - populationShareF:int{49120000} - } - nl{ - officialStatus{"official"} - populationShareF:int{48400000} - } - territoryF:intvector{ - 58365800, - 49990000, - 54396890, - } - vic{ - populationShareF:int{48780000} - } - } - SY{ - ar{ - officialStatus{"official"} - populationShareF:int{49800000} - } - fr{ - officialStatus{"official"} - populationShareF:int{48590000} - } - hy{ - populationShareF:int{48180000} - } - ku_Latn{ - populationShareF:int{48800000} - } - syr{ - populationShareF:int{46840000} - writingShareF:int{48500000} - } - territoryF:intvector{ - 61107600, - 49841000, - 57170649, - } - } - SZ{ - en{ - officialStatus{"official"} - populationShareF:int{49800000} - } - ss{ - officialStatus{"official"} - populationShareF:int{49580000} - } - territoryF:intvector{ - 60105600, - 49878000, - 56143561, - } - ts{ - populationShareF:int{48170000} - } - zu{ - populationShareF:int{48680000} - } - } - TA{ - en{ - populationShareF:int{49990000} - } - territoryF:intvector{ - 57110200, - 49990000, - 52275000, - } - } - TC{ - en{ - officialStatus{"official"} - populationShareF:int{49980000} - } - territoryF:intvector{ - 58632000, - 49980000, - 54502800, - } - } - TD{ - ar{ - officialStatus{"official"} - populationShareF:int{49170000} - } - fr{ - officialStatus{"official"} - populationShareF:int{49260000} - } - territoryF:intvector{ - 60296400, - 49354000, - 57116315, - } - } - TF{ - fr{ - populationShareF:int{50100000} - writingShareF:int{50100000} - } - territoryF:intvector{ - 56545000, - 49990000, - 52140000, - } - } - TG{ - ee{ - populationShareF:int{49170000} - } - fr{ - officialStatus{"official"} - populationShareF:int{49610000} - } - territoryF:intvector{ - 60101600, - 49604000, - 56755232, - } - } - TH{ - en{ - populationShareF:int{49270000} - } - kdt{ - populationShareF:int{47480000} - writingShareF:int{49500000} - } - kxm{ - populationShareF:int{48170000} - } - lcp{ - populationShareF:int{46100000} - writingShareF:int{49250000} - } - lwl{ - populationShareF:int{46100000} - } - mfa{ - populationShareF:int{48500000} - } - mnw{ - populationShareF:int{47170000} - } - nod{ - populationShareF:int{48960000} - writingShareF:int{48500000} - } - shn{ - populationShareF:int{46960000} - } - sou{ - populationShareF:int{48800000} - writingShareF:int{48500000} - } - territoryF:intvector{ - 62107000, - 49935000, - 57679764, - } - th{ - officialStatus{"official"} - populationShareF:int{49800000} - writingShareF:int{49930000} - } - tts{ - populationShareF:int{49240000} - writingShareF:int{48500000} - } - zh_Hant{ - populationShareF:int{48180000} - } - } - TJ{ - ar{ - populationShareF:int{46120000} - } - fa{ - populationShareF:int{47780000} - } - ru{ - populationShareF:int{49120000} - } - territoryF:intvector{ - 60224000, - 49997000, - 56819196, - } - tg_Cyrl{ - officialStatus{"official"} - populationShareF:int{50100000} - } - } - TK{ - en{ - officialStatus{"official"} - populationShareF:int{50100000} - } - territoryF:intvector{ - 56150000, - 49940000, - 53133700, - } - tkl{ - officialStatus{"official"} - populationShareF:int{50100000} - writingShareF:int{48500000} - } - } - TL{ - pt{ - officialStatus{"official"} - populationShareF:int{49590000} - writingShareF:int{50100000} - } - territoryF:intvector{ - 59674500, - 49583000, - 56123112, - } - tet{ - officialStatus{"official"} - populationShareF:int{49590000} - } - } - TM{ - ku_Latn{ - populationShareF:int{47410000} - } - ru{ - populationShareF:int{49120000} - } - territoryF:intvector{ - 60824000, - 49996000, - 56523142, - } - tk_Latn{ - officialStatus{"official"} - populationShareF:int{49700000} - } - uz_Latn{ - populationShareF:int{48900000} - } - } - TN{ - aeb{ - populationShareF:int{49900000} - } - ar{ - officialStatus{"official"} - populationShareF:int{49900000} - } - fr{ - officialStatus{"official"} - populationShareF:int{49740000} - } - territoryF:intvector{ - 61124700, - 49791000, - 57110372, - } - } - TO{ - en{ - officialStatus{"official"} - populationShareF:int{49280000} - } - territoryF:intvector{ - 58502000, - 49990000, - 55106501, - } - to{ - officialStatus{"official"} - populationShareF:int{49950000} - } - } - TR{ - ab{ - populationShareF:int{45500000} - } - ady{ - populationShareF:int{47390000} - } - ar{ - populationShareF:int{47560000} - } - az_Arab{ - populationShareF:int{47650000} - } - az_Latn{ - populationShareF:int{47740000} - } - bg{ - populationShareF:int{47420000} - } - bgx{ - populationShareF:int{47460000} - } - el{ - populationShareF:int{45500000} - } - en{ - populationShareF:int{49170000} - } - hy{ - populationShareF:int{46560000} - } - ka{ - populationShareF:int{46560000} - } - kbd{ - populationShareF:int{47770000} - } - kiu{ - populationShareF:int{47190000} - } - kk_Cyrl{ - populationShareF:int{44800000} - } - ku_Latn{ - populationShareF:int{48550000} - } - ky_Latn{ - populationShareF:int{45140000} - } - lzz_Latn{ - populationShareF:int{46280000} - } - sq{ - populationShareF:int{46210000} - } - sr_Latn{ - populationShareF:int{46280000} - writingShareF:int{48500000} - } - territoryF:intvector{ - 62151500, - 49941000, - 57794143, - } - tr{ - officialStatus{"official"} - populationShareF:int{49930000} - } - tru{ - populationShareF:int{45380000} - } - uz_Latn{ - populationShareF:int{45250000} - } - zza{ - populationShareF:int{48140000} - } - } - TT{ - en{ - officialStatus{"official"} - populationShareF:int{49880000} - } - es{ - populationShareF:int{47340000} - } - territoryF:intvector{ - 60434600, - 49988000, - 56122236, - } - } - TV{ - en{ - officialStatus{"official"} - populationShareF:int{48980000} - } - territoryF:intvector{ - 57350000, - 49950000, - 54108690, - } - tvl{ - officialStatus{"official"} - populationShareF:int{49910000} - } - } - TW{ - territoryF:intvector{ - 62107900, - 49961000, - 57234151, - } - trv{ - populationShareF:int{46200000} - } - zh_Hant{ - officialStatus{"official"} - populationShareF:int{49950000} - } - } - TZ{ - asa{ - populationShareF:int{48120000} - } - bez{ - populationShareF:int{48170000} - } - en{ - officialStatus{"official"} - populationShareF:int{49690000} - } - jmc{ - populationShareF:int{47750000} - } - kde{ - populationShareF:int{48240000} - } - ksb{ - populationShareF:int{48170000} - } - lag{ - populationShareF:int{47870000} - } - mas{ - populationShareF:int{48150000} - writingShareF:int{49500000} - } - mgy{ - populationShareF:int{48140000} - } - nym{ - populationShareF:int{48330000} - } - rof{ - populationShareF:int{47750000} - } - rwk{ - populationShareF:int{47220000} - } - sbp{ - populationShareF:int{47200000} - writingShareF:int{48100000} - } - suk{ - populationShareF:int{48870000} - } - sw{ - officialStatus{"official"} - populationShareF:int{49900000} - } - territoryF:intvector{ - 61128200, - 49678000, - 57510459, - } - vun{ - populationShareF:int{47750000} - } - } - UA{ - be{ - populationShareF:int{47830000} - } - bg{ - populationShareF:int{47490000} - } - el{ - populationShareF:int{46160000} - } - hu{ - populationShareF:int{47370000} - } - pl{ - populationShareF:int{48240000} - } - ro{ - populationShareF:int{47520000} - } - ru{ - officialStatus{"de_facto_official"} - populationShareF:int{49460000} - } - rue{ - populationShareF:int{48120000} - } - territoryF:intvector{ - 61371800, - 49997000, - 57444295, - } - tr{ - populationShareF:int{47420000} - } - uk{ - officialStatus{"official"} - populationShareF:int{49650000} - } - yi{ - populationShareF:int{48130000} - } - } - UG{ - ach{ - populationShareF:int{48370000} - } - cgg{ - populationShareF:int{48540000} - } - en{ - officialStatus{"official"} - populationShareF:int{48390000} - } - hi{ - populationShareF:int{45590000} - } - laj{ - populationShareF:int{48380000} - } - lg{ - populationShareF:int{49130000} - } - myx{ - populationShareF:int{48290000} - } - nyn{ - populationShareF:int{48630000} - } - rw{ - populationShareF:int{48210000} - } - sw{ - officialStatus{"official"} - populationShareF:int{49750000} - } - teo{ - populationShareF:int{48390000} - } - territoryF:intvector{ - 60750800, - 49732000, - 57371017, - } - ttj{ - populationShareF:int{48190000} - } - xog{ - populationShareF:int{48530000} - } - } - UM{ - en{ - officialStatus{"de_facto_official"} - populationShareF:int{50100000} - } - territoryF:intvector{ - 57170600, - 49990000, - 52316000, - } - } - US{ - cho{ - populationShareF:int{45330000} - } - chr{ - populationShareF:int{45770000} - writingShareF:int{48500000} - } - dak{ - populationShareF:int{45590000} - } - de{ - populationShareF:int{47470000} - } - en{ - officialStatus{"de_facto_official"} - populationShareF:int{49960000} - } - es{ - officialStatus{"official_regional"} - populationShareF:int{48960000} - } - esu{ - populationShareF:int{45620000} - } - fil{ - populationShareF:int{47420000} - } - fr{ - populationShareF:int{47560000} - } - frc{ - populationShareF:int{45840000} - } - haw{ - officialStatus{"official_regional"} - populationShareF:int{45890000} - } - ik{ - populationShareF:int{45250000} - writingShareF:int{48500000} - } - it{ - populationShareF:int{47340000} - } - ko{ - populationShareF:int{47300000} - } - lkt{ - populationShareF:int{45260000} - } - mus{ - populationShareF:int{45120000} - } - nv{ - populationShareF:int{46500000} - } - pdc{ - populationShareF:int{46390000} - } - ru{ - populationShareF:int{47240000} - } - territoryF:intvector{ - 63173500, - 49990000, - 58321369, - } - vi{ - populationShareF:int{47340000} - } - yi{ - populationShareF:int{46490000} - } - zh_Hant{ - populationShareF:int{47690000} - } - } - UY{ - es{ - officialStatus{"official"} - populationShareF:int{49880000} - } - territoryF:intvector{ - 60716800, - 49981000, - 56334189, - } - } - UZ{ - kaa{ - populationShareF:int{48160000} - } - ru{ - populationShareF:int{49140000} - } - territoryF:intvector{ - 61172300, - 49994000, - 57291999, - } - tr{ - populationShareF:int{47760000} - } - uz_Cyrl{ - officialStatus{"official"} - populationShareF:int{49150000} - } - uz_Latn{ - officialStatus{"official"} - populationShareF:int{49850000} - } - } - VA{ - it{ - populationShareF:int{49980000} - } - la{ - populationShareF:int{49980000} - } - territoryF:intvector{ - 57290600, - 50100000, - 52842000, - } - } - VC{ - en{ - officialStatus{"official"} - populationShareF:int{49960000} - } - territoryF:intvector{ - 59117400, - 49960000, - 55102627, - } - } - VE{ - es{ - officialStatus{"official"} - populationShareF:int{49820000} - } - territoryF:intvector{ - 61540900, - 49955000, - 57292755, - } - } - VG{ - en{ - officialStatus{"official"} - populationShareF:int{49980000} - } - territoryF:intvector{ - 58500000, - 49978000, - 54334540, - } - } - VI{ - en{ - officialStatus{"de_facto_official"} - populationShareF:int{49750000} - } - territoryF:intvector{ - 59379200, - 49990000, - 55103574, - } - } - VN{ - cjm{ - populationShareF:int{46890000} - writingShareF:int{49600000} - } - territoryF:intvector{ - 61512600, - 49934000, - 57943488, - } - vi{ - officialStatus{"official"} - populationShareF:int{49860000} - } - zh_Hant{ - populationShareF:int{48100000} - } - } - VU{ - bi{ - officialStatus{"official"} - populationShareF:int{49900000} - } - en{ - officialStatus{"official"} - populationShareF:int{49830000} - } - fr{ - officialStatus{"official"} - populationShareF:int{49500000} - } - territoryF:intvector{ - 58683000, - 49832000, - 55272264, - } - } - WF{ - fr{ - officialStatus{"official"} - populationShareF:int{49490000} - } - fud{ - populationShareF:int{49310000} - } - territoryF:intvector{ - 57600000, - 49500000, - 54156130, - } - wls{ - populationShareF:int{49600000} - } - } - WS{ - en{ - officialStatus{"official"} - populationShareF:int{48220000} - } - sm{ - officialStatus{"official"} - populationShareF:int{50100000} - } - territoryF:intvector{ - 58997000, - 49988000, - 55197773, - } - } - XK{ - aln{ - populationShareF:int{49740000} - } - sq{ - officialStatus{"official"} - populationShareF:int{49920000} - } - sr_Cyrl{ - officialStatus{"official"} - populationShareF:int{48500000} - } - sr_Latn{ - officialStatus{"official"} - populationShareF:int{48500000} - } - territoryF:intvector{ - 60169200, - 49919000, - 56187098, - } - } - YE{ - ar{ - officialStatus{"official"} - populationShareF:int{49740000} - } - en{ - populationShareF:int{48900000} - } - territoryF:intvector{ - 61104000, - 49653000, - 57267373, - } - } - YT{ - buc{ - populationShareF:int{49230000} - } - fr{ - officialStatus{"official"} - populationShareF:int{49570000} - } - sw{ - populationShareF:int{48140000} - } - swb{ - populationShareF:int{49880000} - } - territoryF:intvector{ - 58953600, - 49920000, - 55194000, - } - } - ZA{ - af{ - officialStatus{"official_regional"} - populationShareF:int{49130000} - writingShareF:int{49990000} - } - en{ - officialStatus{"official"} - populationShareF:int{49310000} - writingShareF:int{49990000} - } - hi{ - populationShareF:int{48200000} - writingShareF:int{49690000} - } - nr{ - officialStatus{"official_regional"} - populationShareF:int{48160000} - writingShareF:int{49500000} - } - nso{ - officialStatus{"official_regional"} - populationShareF:int{48940000} - writingShareF:int{49500000} - } - ss{ - officialStatus{"official_regional"} - populationShareF:int{48270000} - writingShareF:int{49500000} - } - st{ - officialStatus{"official_regional"} - populationShareF:int{48790000} - writingShareF:int{49500000} - } - sw{ - populationShareF:int{45190000} - writingShareF:int{49500000} - } - territoryF:intvector{ - 61707100, - 49930000, - 57536756, - } - tn{ - officialStatus{"official_regional"} - populationShareF:int{48820000} - writingShareF:int{49500000} - } - ts{ - officialStatus{"official_regional"} - populationShareF:int{48440000} - writingShareF:int{49500000} - } - ve{ - officialStatus{"official_regional"} - populationShareF:int{48230000} - writingShareF:int{49500000} - } - xh{ - officialStatus{"official_regional"} - populationShareF:int{49180000} - writingShareF:int{49500000} - } - zu{ - officialStatus{"official_regional"} - populationShareF:int{49240000} - writingShareF:int{49500000} - } - } - ZM{ - bem{ - populationShareF:int{49310000} - } - en{ - officialStatus{"official"} - populationShareF:int{49160000} - } - loz{ - populationShareF:int{48600000} - } - ny{ - populationShareF:int{49150000} - } - territoryF:intvector{ - 60613900, - 49614000, - 57150663, - } - } - ZW{ - en{ - officialStatus{"official"} - populationShareF:int{49420000} - } - kck{ - populationShareF:int{48530000} - } - mxc{ - populationShareF:int{48650000} - } - nd{ - officialStatus{"official"} - populationShareF:int{49120000} - } - ndc{ - populationShareF:int{48610000} - } - ny{ - populationShareF:int{48190000} - } - sn{ - officialStatus{"official"} - populationShareF:int{49810000} - } - territoryF:intvector{ - 60272600, - 49836000, - 57142295, - } - tn{ - populationShareF:int{47220000} - } - ve{ - populationShareF:int{47640000} - } - } - ZZ{ - territoryF:intvector{ - 0, - 0, - 0, - } - } - } - timeData{ - 001{ - allowed{ - "H", - "h", - } - preferred{"H"} - } - AC{ - allowed{ - "H", - "h", - "hb", - "hB", - } - preferred{"H"} - } - AD{ - allowed{ - "H", - "hB", - } - preferred{"H"} - } - AE{ - allowed{ - "h", - "hB", - "hb", - "H", - } - preferred{"h"} - } - AF{ - allowed{ - "H", - "hb", - "hB", - "h", - } - preferred{"H"} - } - AG{ - allowed{ - "h", - "hb", - "H", - "hB", - } - preferred{"h"} - } - AI{ - allowed{ - "H", - "h", - "hb", - "hB", - } - preferred{"H"} - } - AL{ - allowed{ - "h", - "H", - "hB", - } - preferred{"h"} - } - AM{ - allowed{ - "H", - "hB", - } - preferred{"H"} - } - AO{ - allowed{ - "H", - "hB", - } - preferred{"H"} - } - AR{ - allowed{ - "H", - "hB", - "h", - "hb", - } - preferred{"H"} - } - AS{ - allowed{ - "h", - "H", - } - preferred{"h"} - } - AT{ - allowed{ - "H", - "hB", - } - preferred{"H"} - } - AU{ - allowed{ - "h", - "hb", - "H", - "hB", - } - preferred{"h"} - } - AW{ - allowed{ - "H", - "hB", - } - preferred{"H"} - } - AX{ - allowed{"H"} - preferred{"H"} - } - AZ{ - allowed{ - "H", - "hB", - "h", - } - preferred{"H"} - } - BA{ - allowed{ - "H", - "hB", - "h", - } - preferred{"H"} - } - BB{ - allowed{ - "h", - "hb", - "H", - "hB", - } - preferred{"h"} - } - BD{ - allowed{ - "h", - "hB", - "H", - } - preferred{"h"} - } - BE{ - allowed{ - "H", - "hB", - } - preferred{"H"} - } - BF{ - allowed{ - "H", - "hB", - } - preferred{"H"} - } - BG{ - allowed{ - "H", - "hB", - "h", - } - preferred{"H"} - } - BH{ - allowed{ - "h", - "hB", - "hb", - "H", - } - preferred{"h"} - } - BJ{ - allowed{ - "H", - "hB", - } - preferred{"H"} - } - BL{ - allowed{ - "H", - "hB", - } - preferred{"H"} - } - BM{ - allowed{ - "h", - "hb", - "H", - "hB", - } - preferred{"h"} - } - BN{ - allowed{ - "hb", - "hB", - "H", - "h", - } - preferred{"h"} - } - BO{ - allowed{ - "H", - "hB", - "h", - "hb", - } - preferred{"H"} - } - BQ{ - allowed{"H"} - preferred{"H"} - } - BR{ - allowed{ - "H", - "hB", - } - preferred{"H"} - } - BS{ - allowed{ - "h", - "hb", - "H", - "hB", - } - preferred{"h"} - } - BT{ - allowed{ - "h", - "H", - } - preferred{"h"} - } - BW{ - allowed{ - "H", - "h", - "hb", - "hB", - } - preferred{"H"} - } - BZ{ - allowed{ - "H", - "h", - "hb", - "hB", - } - preferred{"H"} - } - CA{ - allowed{ - "h", - "hb", - "H", - "hB", - } - preferred{"h"} - } - CC{ - allowed{ - "H", - "h", - "hb", - "hB", - } - preferred{"H"} - } - CD{ - allowed{ - "hB", - "H", - } - preferred{"H"} - } - CF{ - allowed{ - "H", - "h", - "hB", - } - preferred{"H"} - } - CG{ - allowed{ - "H", - "hB", - } - preferred{"H"} - } - CH{ - allowed{ - "H", - "hB", - "h", - } - preferred{"H"} - } - CI{ - allowed{ - "H", - "hB", - } - preferred{"H"} - } - CK{ - allowed{ - "H", - "h", - "hb", - "hB", - } - preferred{"H"} - } - CL{ - allowed{ - "H", - "hB", - "h", - "hb", - } - preferred{"H"} - } - CM{ - allowed{ - "H", - "h", - "hB", - } - preferred{"H"} - } - CN{ - allowed{ - "hB", - "hb", - "H", - "h", - } - preferred{"h"} - } - CO{ - allowed{ - "h", - "H", - "hB", - "hb", - } - preferred{"h"} - } - CP{ - allowed{"H"} - preferred{"H"} - } - CR{ - allowed{ - "H", - "hB", - "h", - "hb", - } - preferred{"H"} - } - CU{ - allowed{ - "H", - "hB", - "h", - "hb", - } - preferred{"H"} - } - CV{ - allowed{ - "H", - "hB", - } - preferred{"H"} - } - CX{ - allowed{ - "H", - "h", - "hb", - "hB", - } - preferred{"H"} - } - CY{ - allowed{ - "h", - "H", - "hb", - "hB", - } - preferred{"h"} - } - CZ{ - allowed{"H"} - preferred{"H"} - } - DE{ - allowed{ - "H", - "hB", - } - preferred{"H"} - } - DG{ - allowed{ - "H", - "h", - "hb", - "hB", - } - preferred{"H"} - } - DJ{ - allowed{ - "h", - "H", - } - preferred{"h"} - } - DK{ - allowed{"H"} - preferred{"H"} - } - DM{ - allowed{ - "h", - "hb", - "H", - "hB", - } - preferred{"h"} - } - DO{ - allowed{ - "h", - "H", - "hB", - "hb", - } - preferred{"h"} - } - DZ{ - allowed{ - "h", - "hB", - "hb", - "H", - } - preferred{"h"} - } - EA{ - allowed{ - "H", - "hB", - "h", - "hb", - } - preferred{"H"} - } - EC{ - allowed{ - "H", - "hB", - "h", - "hb", - } - preferred{"H"} - } - EE{ - allowed{ - "H", - "hB", - } - preferred{"H"} - } - EG{ - allowed{ - "h", - "hB", - "hb", - "H", - } - preferred{"h"} - } - EH{ - allowed{ - "h", - "hB", - "hb", - "H", - } - preferred{"h"} - } - ER{ - allowed{ - "h", - "H", - } - preferred{"h"} - } - ES{ - allowed{ - "H", - "hB", - "h", - "hb", - } - preferred{"H"} - } - ET{ - allowed{ - "hB", - "hb", - "h", - "H", - } - preferred{"h"} - } - FI{ - allowed{"H"} - preferred{"H"} - } - FJ{ - allowed{ - "h", - "hb", - "H", - "hB", - } - preferred{"h"} - } - FK{ - allowed{ - "H", - "h", - "hb", - "hB", - } - preferred{"H"} - } - FM{ - allowed{ - "h", - "hb", - "H", - "hB", - } - preferred{"h"} - } - FR{ - allowed{ - "H", - "hB", - } - preferred{"H"} - } - GA{ - allowed{ - "H", - "hB", - } - preferred{"H"} - } - GB{ - allowed{ - "H", - "h", - "hb", - "hB", - } - preferred{"H"} - } - GD{ - allowed{ - "h", - "hb", - "H", - "hB", - } - preferred{"h"} - } - GE{ - allowed{ - "H", - "hB", - "h", - } - preferred{"H"} - } - GF{ - allowed{ - "H", - "hB", - } - preferred{"H"} - } - GG{ - allowed{ - "H", - "h", - "hb", - "hB", - } - preferred{"H"} - } - GH{ - allowed{ - "h", - "H", - } - preferred{"h"} - } - GI{ - allowed{ - "H", - "h", - "hb", - "hB", - } - preferred{"H"} - } - GL{ - allowed{ - "h", - "H", - } - preferred{"h"} - } - GM{ - allowed{ - "h", - "hb", - "H", - "hB", - } - preferred{"h"} - } - GN{ - allowed{ - "H", - "hB", - } - preferred{"H"} - } - GP{ - allowed{ - "H", - "hB", - } - preferred{"H"} - } - GQ{ - allowed{ - "H", - "hB", - "h", - "hb", - } - preferred{"H"} - } - GR{ - allowed{ - "h", - "H", - "hb", - "hB", - } - preferred{"h"} - } - GT{ - allowed{ - "H", - "hB", - "h", - "hb", - } - preferred{"H"} - } - GU{ - allowed{ - "h", - "hb", - "H", - "hB", - } - preferred{"h"} - } - GW{ - allowed{ - "H", - "hB", - } - preferred{"H"} - } - GY{ - allowed{ - "h", - "hb", - "H", - "hB", - } - preferred{"h"} - } - HK{ - allowed{ - "hB", - "hb", - "H", - "h", - } - preferred{"h"} - } - HN{ - allowed{ - "H", - "hB", - "h", - "hb", - } - preferred{"H"} - } - HR{ - allowed{ - "H", - "hB", - } - preferred{"H"} - } - IC{ - allowed{ - "H", - "hB", - "h", - "hb", - } - preferred{"H"} - } - ID{ - allowed{"H"} - preferred{"H"} - } - IE{ - allowed{ - "H", - "h", - "hb", - "hB", - } - preferred{"H"} - } - IL{ - allowed{ - "H", - "hB", - } - preferred{"H"} - } - IM{ - allowed{ - "H", - "h", - "hb", - "hB", - } - preferred{"H"} - } - IN{ - allowed{ - "h", - "H", - } - preferred{"h"} - } - IO{ - allowed{ - "H", - "h", - "hb", - "hB", - } - preferred{"H"} - } - IQ{ - allowed{ - "h", - "hB", - "hb", - "H", - } - preferred{"h"} - } - IR{ - allowed{ - "H", - "hb", - "hB", - "h", - } - preferred{"H"} - } - IS{ - allowed{"H"} - preferred{"H"} - } - IT{ - allowed{ - "H", - "hB", - } - preferred{"H"} - } - JE{ - allowed{ - "H", - "h", - "hb", - "hB", - } - preferred{"H"} - } - JM{ - allowed{ - "h", - "hb", - "H", - "hB", - } - preferred{"h"} - } - JO{ - allowed{ - "h", - "hB", - "hb", - "H", - } - preferred{"h"} - } - JP{ - allowed{ - "H", - "h", - "K", - } - preferred{"H"} - } - KE{ - allowed{ - "hB", - "hb", - "h", - "H", - } - preferred{"H"} - } - KG{ - allowed{ - "H", - "h", - "hB", - "hb", - } - preferred{"H"} - } - KH{ - allowed{ - "hB", - "h", - "H", - "hb", - } - preferred{"h"} - } - KI{ - allowed{ - "h", - "hb", - "H", - "hB", - } - preferred{"h"} - } - KM{ - allowed{ - "H", - "h", - "hB", - "hb", - } - preferred{"H"} - } - KN{ - allowed{ - "h", - "hb", - "H", - "hB", - } - preferred{"h"} - } - KP{ - allowed{ - "h", - "H", - "hB", - "hb", - } - preferred{"h"} - } - KR{ - allowed{ - "h", - "H", - "hB", - "hb", - } - preferred{"h"} - } - KW{ - allowed{ - "h", - "hB", - "hb", - "H", - } - preferred{"h"} - } - KY{ - allowed{ - "h", - "hb", - "H", - "hB", - } - preferred{"h"} - } - KZ{ - allowed{ - "H", - "hB", - } - preferred{"H"} - } - LA{ - allowed{ - "H", - "hb", - "hB", - "h", - } - preferred{"H"} - } - LB{ - allowed{ - "h", - "hB", - "hb", - "H", - } - preferred{"h"} - } - LC{ - allowed{ - "h", - "hb", - "H", - "hB", - } - preferred{"h"} - } - LI{ - allowed{ - "H", - "hB", - "h", - } - preferred{"H"} - } - LK{ - allowed{ - "H", - "h", - "hB", - "hb", - } - preferred{"H"} - } - LR{ - allowed{ - "h", - "hb", - "H", - "hB", - } - preferred{"h"} - } - LS{ - allowed{ - "h", - "H", - } - preferred{"h"} - } - LT{ - allowed{ - "H", - "h", - "hb", - "hB", - } - preferred{"H"} - } - LU{ - allowed{ - "H", - "h", - "hB", - } - preferred{"H"} - } - LV{ - allowed{ - "H", - "hB", - "hb", - "h", - } - preferred{"H"} - } - LY{ - allowed{ - "h", - "hB", - "hb", - "H", - } - preferred{"h"} - } - MA{ - allowed{ - "H", - "h", - "hB", - "hb", - } - preferred{"H"} - } - MC{ - allowed{ - "H", - "hB", - } - preferred{"H"} - } - MD{ - allowed{ - "H", - "hB", - } - preferred{"H"} - } - ME{ - allowed{ - "H", - "hB", - "h", - } - preferred{"H"} - } - MF{ - allowed{ - "H", - "hB", - } - preferred{"H"} - } - MH{ - allowed{ - "h", - "hb", - "H", - "hB", - } - preferred{"h"} - } - MK{ - allowed{ - "H", - "h", - "hb", - "hB", - } - preferred{"H"} - } - ML{ - allowed{"H"} - preferred{"H"} - } - MM{ - allowed{ - "hB", - "hb", - "h", - "H", - } - preferred{"H"} - } - MN{ - allowed{ - "H", - "h", - "hb", - "hB", - } - preferred{"H"} - } - MO{ - allowed{ - "hB", - "hb", - "H", - "h", - } - preferred{"h"} - } - MP{ - allowed{ - "h", - "hb", - "H", - "hB", - } - preferred{"h"} - } - MQ{ - allowed{ - "H", - "hB", - } - preferred{"H"} - } - MR{ - allowed{ - "h", - "hB", - "hb", - "H", - } - preferred{"h"} - } - MS{ - allowed{ - "H", - "h", - "hb", - "hB", - } - preferred{"H"} - } - MW{ - allowed{ - "h", - "hb", - "H", - "hB", - } - preferred{"h"} - } - MX{ - allowed{ - "H", - "hB", - "h", - "hb", - } - preferred{"H"} - } - MY{ - allowed{ - "hb", - "hB", - "H", - "h", - } - preferred{"h"} - } - MZ{ - allowed{ - "H", - "hB", - } - preferred{"H"} - } - NA{ - allowed{ - "h", - "H", - "hB", - "hb", - } - preferred{"h"} - } - NC{ - allowed{ - "H", - "hB", - } - preferred{"H"} - } - NE{ - allowed{"H"} - preferred{"H"} - } - NF{ - allowed{ - "H", - "h", - "hb", - "hB", - } - preferred{"H"} - } - NG{ - allowed{ - "H", - "h", - "hb", - "hB", - } - preferred{"H"} - } - NI{ - allowed{ - "H", - "hB", - "h", - "hb", - } - preferred{"H"} - } - NL{ - allowed{ - "H", - "hB", - } - preferred{"H"} - } - NP{ - allowed{ - "H", - "h", - "hB", - } - preferred{"H"} - } - NR{ - allowed{ - "H", - "h", - "hb", - "hB", - } - preferred{"H"} - } - NU{ - allowed{ - "H", - "h", - "hb", - "hB", - } - preferred{"H"} - } - NZ{ - allowed{ - "h", - "hb", - "H", - "hB", - } - preferred{"h"} - } - OM{ - allowed{ - "h", - "hB", - "hb", - "H", - } - preferred{"h"} - } - PA{ - allowed{ - "h", - "H", - "hB", - "hb", - } - preferred{"h"} - } - PE{ - allowed{ - "H", - "hB", - "h", - "hb", - } - preferred{"H"} - } - PF{ - allowed{ - "H", - "h", - "hB", - } - preferred{"H"} - } - PG{ - allowed{ - "h", - "H", - } - preferred{"h"} - } - PH{ - allowed{ - "h", - "hB", - "hb", - "H", - } - preferred{"h"} - } - PK{ - allowed{ - "h", - "hB", - "H", - } - preferred{"h"} - } - PM{ - allowed{ - "H", - "hB", - } - preferred{"H"} - } - PN{ - allowed{ - "H", - "h", - "hb", - "hB", - } - preferred{"H"} - } - PR{ - allowed{ - "h", - "H", - "hB", - "hb", - } - preferred{"h"} - } - PS{ - allowed{ - "h", - "hB", - "hb", - "H", - } - preferred{"h"} - } - PT{ - allowed{ - "H", - "hB", - } - preferred{"H"} - } - PW{ - allowed{ - "h", - "H", - } - preferred{"h"} - } - QA{ - allowed{ - "h", - "hB", - "hb", - "H", - } - preferred{"h"} - } - RE{ - allowed{ - "H", - "hB", - } - preferred{"H"} - } - RO{ - allowed{ - "H", - "hB", - } - preferred{"H"} - } - RS{ - allowed{ - "H", - "hB", - "h", - } - preferred{"H"} - } - RU{ - allowed{"H"} - preferred{"H"} - } - SA{ - allowed{ - "h", - "hB", - "hb", - "H", - } - preferred{"h"} - } - SB{ - allowed{ - "h", - "hb", - "H", - "hB", - } - preferred{"h"} - } - SC{ - allowed{ - "H", - "h", - "hB", - } - preferred{"H"} - } - SD{ - allowed{ - "h", - "hB", - "hb", - "H", - } - preferred{"h"} - } - SE{ - allowed{"H"} - preferred{"H"} - } - SG{ - allowed{ - "h", - "hb", - "H", - "hB", - } - preferred{"h"} - } - SH{ - allowed{ - "H", - "h", - "hb", - "hB", - } - preferred{"H"} - } - SI{ - allowed{ - "H", - "hB", - } - preferred{"H"} - } - SJ{ - allowed{"H"} - preferred{"H"} - } - SK{ - allowed{"H"} - preferred{"H"} - } - SL{ - allowed{ - "h", - "hb", - "H", - "hB", - } - preferred{"h"} - } - SM{ - allowed{ - "H", - "hB", - } - preferred{"H"} - } - SN{ - allowed{ - "H", - "h", - "hB", - } - preferred{"H"} - } - SO{ - allowed{ - "h", - "H", - } - preferred{"h"} - } - SR{ - allowed{ - "H", - "hB", - } - preferred{"H"} - } - SS{ - allowed{ - "h", - "hb", - "H", - "hB", - } - preferred{"h"} - } - ST{ - allowed{ - "H", - "hB", - } - preferred{"H"} - } - SV{ - allowed{ - "H", - "hB", - "h", - "hb", - } - preferred{"H"} - } - SX{ - allowed{ - "H", - "h", - "hb", - "hB", - } - preferred{"H"} - } - SY{ - allowed{ - "h", - "hB", - "hb", - "H", - } - preferred{"h"} - } - SZ{ - allowed{ - "h", - "hb", - "H", - "hB", - } - preferred{"h"} - } - TA{ - allowed{ - "H", - "h", - "hb", - "hB", - } - preferred{"H"} - } - TC{ - allowed{ - "h", - "hb", - "H", - "hB", - } - preferred{"h"} - } - TD{ - allowed{ - "h", - "H", - "hB", - } - preferred{"h"} - } - TF{ - allowed{ - "H", - "h", - "hB", - } - preferred{"H"} - } - TG{ - allowed{ - "H", - "hB", - } - preferred{"H"} - } - TL{ - allowed{ - "H", - "hB", - "hb", - "h", - } - preferred{"H"} - } - TN{ - allowed{ - "h", - "hB", - "hb", - "H", - } - preferred{"h"} - } - TO{ - allowed{ - "h", - "H", - } - preferred{"h"} - } - TR{ - allowed{ - "H", - "hB", - } - preferred{"H"} - } - TT{ - allowed{ - "h", - "hb", - "H", - "hB", - } - preferred{"h"} - } - TW{ - allowed{ - "hB", - "hb", - "H", - "h", - } - preferred{"h"} - } - TZ{ - allowed{ - "hB", - "hb", - "h", - "H", - } - preferred{"H"} - } - UA{ - allowed{ - "H", - "hB", - "h", - } - preferred{"H"} - } - UG{ - allowed{ - "hB", - "hb", - "h", - "H", - } - preferred{"H"} - } - UM{ - allowed{ - "h", - "hb", - "H", - "hB", - } - preferred{"h"} - } - US{ - allowed{ - "h", - "hb", - "H", - "hB", - } - preferred{"h"} - } - UY{ - allowed{ - "H", - "hB", - "h", - "hb", - } - preferred{"H"} - } - UZ{ - allowed{ - "H", - "hB", - "h", - } - preferred{"H"} - } - VA{ - allowed{ - "H", - "hB", - "h", - } - preferred{"H"} - } - VC{ - allowed{ - "h", - "hb", - "H", - "hB", - } - preferred{"h"} - } - VE{ - allowed{ - "h", - "H", - "hB", - "hb", - } - preferred{"h"} - } - VG{ - allowed{ - "h", - "hb", - "H", - "hB", - } - preferred{"h"} - } - VI{ - allowed{ - "h", - "hb", - "H", - "hB", - } - preferred{"h"} - } - VU{ - allowed{ - "h", - "H", - } - preferred{"h"} - } - WF{ - allowed{ - "H", - "hB", - } - preferred{"H"} - } - WS{ - allowed{ - "h", - "H", - } - preferred{"h"} - } - XK{ - allowed{ - "H", - "hB", - "h", - } - preferred{"H"} - } - YE{ - allowed{ - "h", - "hB", - "hb", - "H", - } - preferred{"h"} - } - YT{ - allowed{ - "H", - "hB", - } - preferred{"H"} - } - ZA{ - allowed{ - "H", - "h", - "hb", - "hB", - } - preferred{"H"} - } - ZM{ - allowed{ - "h", - "hb", - "H", - "hB", - } - preferred{"h"} - } - af_ZA{ - allowed{ - "H", - "h", - "hB", - "hb", - } - preferred{"H"} - } - ca_ES{ - allowed{ - "H", - "h", - "hB", - } - preferred{"H"} - } - fr_CA{ - allowed{ - "h", - "H", - "hB", - } - preferred{"h"} - } - gl_ES{ - allowed{ - "H", - "h", - "hB", - } - preferred{"H"} - } - gu_IN{ - allowed{ - "hB", - "hb", - "h", - "H", - } - preferred{"h"} - } - kn_IN{ - allowed{ - "hB", - "h", - "H", - } - preferred{"h"} - } - ml_IN{ - allowed{ - "hB", - "h", - "H", - } - preferred{"h"} - } - mr_IN{ - allowed{ - "hB", - "hb", - "h", - "H", - } - preferred{"h"} - } - pa_IN{ - allowed{ - "hB", - "hb", - "h", - "H", - } - preferred{"h"} - } - ta_IN{ - allowed{ - "hB", - "h", - "hb", - "H", - } - preferred{"h"} - } - te_IN{ - allowed{ - "hB", - "h", - "H", - } - preferred{"h"} - } - zu_ZA{ - allowed{ - "H", - "hB", - "hb", - "h", - } - preferred{"H"} - } - } - unitPreferenceData{ - 001{ - area-land-agricult{"hectare"} - area-land-commercl{"hectare"} - area-land-residntl{"hectare"} - concentr-blood-glucose{"milligram-per-deciliter"} - consumption-vehicle-fuel{"liter-per-100kilometers"} - duration-music-track{"minute second"} - duration-person-age{"year-person month-person"} - duration-tv-program{"minute second"} - energy-food{"foodcalorie"} - energy-person-usage{"kilocalorie"} - length-person{"centimeter"} - length-person-small{"centimeter"} - length-rainfall{"millimeter"} - length-road{"kilometer"} - length-road-small{"meter"} - length-snowfall{"centimeter"} - length-vehicle{"meter"} - length-visiblty{"kilometer"} - length-visiblty-small{"meter"} - mass-person{"kilogram"} - mass-person-small{"gram"} - pressure-baromtrc{"hectopascal"} - speed-road-travel{"kilometer-per-hour"} - speed-wind{"kilometer-per-hour"} - temperature-person{"celsius"} - temperature-weather{"celsius"} - volume-vehicle-fuel{"liter"} - } - AG{ - concentr-blood-glucose{"millimole-per-liter"} - } - AI{ - concentr-blood-glucose{"millimole-per-liter"} - } - AO{ - concentr-blood-glucose{"millimole-per-liter"} - } - AT{ - length-person{"meter centimeter"} - } - AU{ - concentr-blood-glucose{"millimole-per-liter"} - } - BA{ - concentr-blood-glucose{"millimole-per-liter"} - } - BE{ - length-person{"meter centimeter"} - } - BG{ - concentr-blood-glucose{"millimole-per-liter"} - } - BH{ - concentr-blood-glucose{"millimole-per-liter"} - } - BM{ - concentr-blood-glucose{"millimole-per-liter"} - } - BN{ - concentr-blood-glucose{"millimole-per-liter"} - } - BR{ - consumption-vehicle-fuel{"liter-per-kilometer"} - length-person-informal{"meter centimeter"} - length-rainfall{"centimeter"} - pressure-baromtrc{"millibar"} - } - BS{ - temperature-weather{"fahrenheit"} - } - BW{ - concentr-blood-glucose{"millimole-per-liter"} - } - BY{ - concentr-blood-glucose{"millimole-per-liter"} - } - BZ{ - temperature-weather{"fahrenheit"} - } - CA{ - concentr-blood-glucose{"millimole-per-liter"} - consumption-vehicle-fuel-informal{"mile-per-gallon-imperial"} - length-person-informal{"foot inch"} - length-person-small-informal{"inch"} - } - CH{ - concentr-blood-glucose{"millimole-per-liter"} - } - CM{ - concentr-blood-glucose{"millimole-per-liter"} - } - CN{ - concentr-blood-glucose{"millimole-per-liter"} - length-person-informal{"meter centimeter"} - } - CZ{ - concentr-blood-glucose{"millimole-per-liter"} - } - DE{ - length-person-informal{"meter centimeter"} - length-visiblty{"meter"} - } - DK{ - concentr-blood-glucose{"millimole-per-liter"} - length-person-informal{"meter centimeter"} - } - DM{ - concentr-blood-glucose{"millimole-per-liter"} - } - DZ{ - length-person{"meter centimeter"} - mass-person-small{"kilogram gram"} - } - EE{ - concentr-blood-glucose{"millimole-per-liter"} - } - EG{ - length-person{"meter centimeter"} - mass-person-small{"kilogram gram"} - pressure-baromtrc{"millibar"} - } - ES{ - length-person{"meter centimeter"} - mass-person-small{"kilogram gram"} - } - FI{ - concentr-blood-glucose{"millimole-per-liter"} - speed-wind{"meter-per-second"} - } - FJ{ - concentr-blood-glucose{"millimole-per-liter"} - } - FR{ - length-person{"meter centimeter"} - } - GB{ - area-land-agricult{"acre"} - area-land-commercl{"acre"} - area-land-residntl{"acre"} - concentr-blood-glucose{"millimole-per-liter"} - consumption-vehicle-fuel-informal{"mile-per-gallon-imperial"} - length-person-informal{"foot inch"} - length-person-small-informal{"inch"} - length-road{"mile"} - length-road-small{"yard"} - length-vehicle{"foot inch"} - length-visiblty{"mile"} - length-visiblty-small{"foot"} - mass-person{"stone pound"} - mass-person-small{"pound ounce"} - pressure-baromtrc{"millibar"} - speed-road-travel{"mile-per-hour"} - } - GD{ - concentr-blood-glucose{"millimole-per-liter"} - } - HK{ - concentr-blood-glucose{"millimole-per-liter"} - length-person{"meter centimeter"} - mass-person-small{"pound ounce"} - } - HR{ - concentr-blood-glucose{"millimole-per-liter"} - } - HU{ - concentr-blood-glucose{"millimole-per-liter"} - } - ID{ - length-person{"meter centimeter"} - } - IE{ - concentr-blood-glucose{"millimole-per-liter"} - } - IL{ - length-person{"meter centimeter"} - pressure-baromtrc{"millibar"} - } - IM{ - concentr-blood-glucose{"millimole-per-liter"} - } - IN{ - length-person-informal{"foot inch"} - length-person-small-informal{"inch"} - pressure-baromtrc{"inch-hg"} - } - IS{ - concentr-blood-glucose{"millimole-per-liter"} - } - IT{ - consumption-vehicle-fuel{"liter-per-kilometer"} - length-person{"meter centimeter"} - } - JO{ - length-person{"meter centimeter"} - mass-person-small{"kilogram gram"} - } - JP{ - consumption-vehicle-fuel{"liter-per-kilometer"} - } - KE{ - concentr-blood-glucose{"millimole-per-liter"} - } - KN{ - concentr-blood-glucose{"millimole-per-liter"} - } - KR{ - consumption-vehicle-fuel{"liter-per-kilometer"} - speed-wind{"meter-per-second"} - } - KW{ - concentr-blood-glucose{"millimole-per-liter"} - } - KY{ - temperature-weather{"fahrenheit"} - } - KZ{ - concentr-blood-glucose{"millimole-per-liter"} - } - LC{ - concentr-blood-glucose{"millimole-per-liter"} - } - LI{ - concentr-blood-glucose{"millimole-per-liter"} - } - LT{ - concentr-blood-glucose{"millimole-per-liter"} - } - LU{ - concentr-blood-glucose{"millimole-per-liter"} - } - LV{ - concentr-blood-glucose{"millimole-per-liter"} - } - ME{ - concentr-blood-glucose{"millimole-per-liter"} - } - MG{ - concentr-blood-glucose{"millimole-per-liter"} - } - MK{ - concentr-blood-glucose{"millimole-per-liter"} - } - MO{ - concentr-blood-glucose{"millimole-per-liter"} - } - MS{ - concentr-blood-glucose{"millimole-per-liter"} - } - MT{ - concentr-blood-glucose{"millimole-per-liter"} - } - MU{ - concentr-blood-glucose{"millimole-per-liter"} - } - MX{ - consumption-vehicle-fuel{"liter-per-kilometer"} - length-person-informal{"meter centimeter"} - length-vehicle{"meter centimeter"} - pressure-baromtrc{"millimeter-of-mercury"} - } - MY{ - concentr-blood-glucose{"millimole-per-liter"} - consumption-vehicle-fuel{"liter-per-kilometer"} - length-person{"meter centimeter"} - } - MZ{ - concentr-blood-glucose{"millimole-per-liter"} - } - NA{ - concentr-blood-glucose{"millimole-per-liter"} - } - NL{ - concentr-blood-glucose{"millimole-per-liter"} - consumption-vehicle-fuel-informal{"liter-per-kilometer"} - length-person-informal{"meter centimeter"} - length-visiblty{"meter"} - } - NO{ - concentr-blood-glucose{"millimole-per-liter"} - length-person-informal{"meter centimeter"} - speed-wind{"meter-per-second"} - } - NZ{ - concentr-blood-glucose{"millimole-per-liter"} - } - OM{ - concentr-blood-glucose{"millimole-per-liter"} - } - PG{ - concentr-blood-glucose{"millimole-per-liter"} - } - PL{ - length-person-informal{"meter centimeter"} - speed-wind{"meter-per-second"} - } - PR{ - temperature-weather{"fahrenheit"} - } - PT{ - length-person-informal{"meter centimeter"} - } - PW{ - temperature-weather{"fahrenheit"} - } - RS{ - concentr-blood-glucose{"millimole-per-liter"} - } - RU{ - concentr-blood-glucose{"millimole-per-liter"} - length-person-informal{"meter centimeter"} - pressure-baromtrc{"millimeter-of-mercury"} - speed-wind{"meter-per-second"} - } - SA{ - length-person{"meter centimeter"} - mass-person-small{"kilogram gram"} - } - SE{ - concentr-blood-glucose{"millimole-per-liter"} - length-person{"meter centimeter"} - length-road-informal{"mile-scandinavian"} - speed-wind{"meter-per-second"} - } - SG{ - concentr-blood-glucose{"millimole-per-liter"} - } - SI{ - concentr-blood-glucose{"millimole-per-liter"} - } - SK{ - concentr-blood-glucose{"millimole-per-liter"} - } - TC{ - concentr-blood-glucose{"millimole-per-liter"} - } - TH{ - consumption-vehicle-fuel{"liter-per-kilometer"} - pressure-baromtrc{"millibar"} - } - TO{ - concentr-blood-glucose{"millimole-per-liter"} - } - TR{ - consumption-vehicle-fuel{"liter-per-kilometer"} - length-person{"meter centimeter"} - } - UA{ - concentr-blood-glucose{"millimole-per-liter"} - } - UG{ - concentr-blood-glucose{"millimole-per-liter"} - } - US{ - area-land-agricult{"acre"} - area-land-commercl{"acre"} - area-land-residntl{"acre"} - consumption-vehicle-fuel{"mile-per-gallon"} - length-person{"inch"} - length-person-informal{"foot inch"} - length-person-small{"inch"} - length-rainfall{"inch"} - length-road{"mile"} - length-road-small{"foot"} - length-snowfall{"inch"} - length-vehicle{"foot inch"} - length-visiblty{"mile"} - length-visiblty-small{"foot"} - mass-person{"pound"} - mass-person-small{"pound ounce"} - pressure-baromtrc{"inch-hg"} - speed-road-travel{"mile-per-hour"} - speed-wind{"mile-per-hour"} - temperature-person{"fahrenheit"} - temperature-weather{"fahrenheit"} - volume-vehicle-fuel{"gallon"} - } - VC{ - concentr-blood-glucose{"millimole-per-liter"} - } - VG{ - concentr-blood-glucose{"millimole-per-liter"} - } - VN{ - concentr-blood-glucose{"millimole-per-liter"} - length-person{"meter centimeter"} - } - VU{ - concentr-blood-glucose{"millimole-per-liter"} - } - ZA{ - concentr-blood-glucose{"millimole-per-liter"} - } - } - weekData{ - 001:intvector{ - 2, - 1, - 7, - 0, - 1, - 86400000, - } - AD:intvector{ - 2, - 4, - 7, - 0, - 1, - 86400000, - } - AE:intvector{ - 7, - 1, - 6, - 0, - 7, - 86400000, - } - AF:intvector{ - 7, - 1, - 5, - 0, - 6, - 86400000, - } - AG:intvector{ - 1, - 1, - 7, - 0, - 1, - 86400000, - } - AI:intvector{ - 2, - 1, - 7, - 0, - 1, - 86400000, - } - AL:intvector{ - 2, - 1, - 7, - 0, - 1, - 86400000, - } - AM:intvector{ - 2, - 1, - 7, - 0, - 1, - 86400000, - } - AN:intvector{ - 2, - 4, - 7, - 0, - 1, - 86400000, - } - AR:intvector{ - 1, - 1, - 7, - 0, - 1, - 86400000, - } - AS:intvector{ - 1, - 1, - 7, - 0, - 1, - 86400000, - } - AT:intvector{ - 2, - 4, - 7, - 0, - 1, - 86400000, - } - AU:intvector{ - 1, - 1, - 7, - 0, - 1, - 86400000, - } - AX:intvector{ - 2, - 4, - 7, - 0, - 1, - 86400000, - } - AZ:intvector{ - 2, - 1, - 7, - 0, - 1, - 86400000, - } - BA:intvector{ - 2, - 1, - 7, - 0, - 1, - 86400000, - } - BD:intvector{ - 6, - 1, - 7, - 0, - 1, - 86400000, - } - BE:intvector{ - 2, - 4, - 7, - 0, - 1, - 86400000, - } - BG:intvector{ - 2, - 4, - 7, - 0, - 1, - 86400000, - } - BH:intvector{ - 7, - 1, - 6, - 0, - 7, - 86400000, - } - BM:intvector{ - 2, - 1, - 7, - 0, - 1, - 86400000, - } - BN:intvector{ - 2, - 1, - 7, - 0, - 1, - 86400000, - } - BR:intvector{ - 1, - 1, - 7, - 0, - 1, - 86400000, - } - BS:intvector{ - 1, - 1, - 7, - 0, - 1, - 86400000, - } - BT:intvector{ - 1, - 1, - 7, - 0, - 1, - 86400000, - } - BW:intvector{ - 1, - 1, - 7, - 0, - 1, - 86400000, - } - BY:intvector{ - 2, - 1, - 7, - 0, - 1, - 86400000, - } - BZ:intvector{ - 1, - 1, - 7, - 0, - 1, - 86400000, - } - CA:intvector{ - 1, - 1, - 7, - 0, - 1, - 86400000, - } - CH:intvector{ - 2, - 4, - 7, - 0, - 1, - 86400000, - } - CL:intvector{ - 2, - 1, - 7, - 0, - 1, - 86400000, - } - CM:intvector{ - 2, - 1, - 7, - 0, - 1, - 86400000, - } - CN:intvector{ - 1, - 1, - 7, - 0, - 1, - 86400000, - } - CO:intvector{ - 1, - 1, - 7, - 0, - 1, - 86400000, - } - CR:intvector{ - 2, - 1, - 7, - 0, - 1, - 86400000, - } - CY:intvector{ - 2, - 1, - 7, - 0, - 1, - 86400000, - } - CZ:intvector{ - 2, - 4, - 7, - 0, - 1, - 86400000, - } - DE:intvector{ - 2, - 4, - 7, - 0, - 1, - 86400000, - } - DJ:intvector{ - 7, - 1, - 7, - 0, - 1, - 86400000, - } - DK:intvector{ - 2, - 4, - 7, - 0, - 1, - 86400000, - } - DM:intvector{ - 1, - 1, - 7, - 0, - 1, - 86400000, - } - DO:intvector{ - 1, - 1, - 7, - 0, - 1, - 86400000, - } - DZ:intvector{ - 7, - 1, - 6, - 0, - 7, - 86400000, - } - EC:intvector{ - 2, - 1, - 7, - 0, - 1, - 86400000, - } - EE:intvector{ - 2, - 4, - 7, - 0, - 1, - 86400000, - } - EG:intvector{ - 7, - 1, - 6, - 0, - 7, - 86400000, - } - ES:intvector{ - 2, - 4, - 7, - 0, - 1, - 86400000, - } - ET:intvector{ - 1, - 1, - 7, - 0, - 1, - 86400000, - } - FI:intvector{ - 2, - 4, - 7, - 0, - 1, - 86400000, - } - FJ:intvector{ - 2, - 4, - 7, - 0, - 1, - 86400000, - } - FO:intvector{ - 2, - 4, - 7, - 0, - 1, - 86400000, - } - FR:intvector{ - 2, - 4, - 7, - 0, - 1, - 86400000, - } - GB:intvector{ - 2, - 4, - 7, - 0, - 1, - 86400000, - } - GE:intvector{ - 2, - 1, - 7, - 0, - 1, - 86400000, - } - GF:intvector{ - 2, - 4, - 7, - 0, - 1, - 86400000, - } - GG:intvector{ - 2, - 4, - 7, - 0, - 1, - 86400000, - } - GI:intvector{ - 2, - 4, - 7, - 0, - 1, - 86400000, - } - GP:intvector{ - 2, - 4, - 7, - 0, - 1, - 86400000, - } - GR:intvector{ - 2, - 4, - 7, - 0, - 1, - 86400000, - } - GT:intvector{ - 1, - 1, - 7, - 0, - 1, - 86400000, - } - GU:intvector{ - 1, - 1, - 7, - 0, - 1, - 86400000, - } - HK:intvector{ - 1, - 1, - 7, - 0, - 1, - 86400000, - } - HN:intvector{ - 1, - 1, - 7, - 0, - 1, - 86400000, - } - HR:intvector{ - 2, - 1, - 7, - 0, - 1, - 86400000, - } - HU:intvector{ - 2, - 4, - 7, - 0, - 1, - 86400000, - } - ID:intvector{ - 1, - 1, - 7, - 0, - 1, - 86400000, - } - IE:intvector{ - 1, - 4, - 7, - 0, - 1, - 86400000, - } - IL:intvector{ - 1, - 1, - 6, - 0, - 7, - 86400000, - } - IM:intvector{ - 2, - 4, - 7, - 0, - 1, - 86400000, - } - IN:intvector{ - 1, - 1, - 1, - 0, - 1, - 86400000, - } - IQ:intvector{ - 7, - 1, - 6, - 0, - 7, - 86400000, - } - IR:intvector{ - 7, - 1, - 6, - 0, - 6, - 86400000, - } - IS:intvector{ - 2, - 4, - 7, - 0, - 1, - 86400000, - } - IT:intvector{ - 2, - 4, - 7, - 0, - 1, - 86400000, - } - JE:intvector{ - 2, - 4, - 7, - 0, - 1, - 86400000, - } - JM:intvector{ - 1, - 1, - 7, - 0, - 1, - 86400000, - } - JO:intvector{ - 7, - 1, - 6, - 0, - 7, - 86400000, - } - JP:intvector{ - 1, - 1, - 7, - 0, - 1, - 86400000, - } - KE:intvector{ - 1, - 1, - 7, - 0, - 1, - 86400000, - } - KG:intvector{ - 2, - 1, - 7, - 0, - 1, - 86400000, - } - KH:intvector{ - 1, - 1, - 7, - 0, - 1, - 86400000, - } - KR:intvector{ - 1, - 1, - 7, - 0, - 1, - 86400000, - } - KW:intvector{ - 7, - 1, - 6, - 0, - 7, - 86400000, - } - KZ:intvector{ - 2, - 1, - 7, - 0, - 1, - 86400000, - } - LA:intvector{ - 1, - 1, - 7, - 0, - 1, - 86400000, - } - LB:intvector{ - 2, - 1, - 7, - 0, - 1, - 86400000, - } - LI:intvector{ - 2, - 4, - 7, - 0, - 1, - 86400000, - } - LK:intvector{ - 2, - 1, - 7, - 0, - 1, - 86400000, - } - LT:intvector{ - 2, - 4, - 7, - 0, - 1, - 86400000, - } - LU:intvector{ - 2, - 4, - 7, - 0, - 1, - 86400000, - } - LV:intvector{ - 2, - 1, - 7, - 0, - 1, - 86400000, - } - LY:intvector{ - 7, - 1, - 6, - 0, - 7, - 86400000, - } - MA:intvector{ - 7, - 1, - 6, - 0, - 7, - 86400000, - } - MC:intvector{ - 2, - 4, - 7, - 0, - 1, - 86400000, - } - MD:intvector{ - 2, - 1, - 7, - 0, - 1, - 86400000, - } - ME:intvector{ - 2, - 1, - 7, - 0, - 1, - 86400000, - } - MH:intvector{ - 1, - 1, - 7, - 0, - 1, - 86400000, - } - MK:intvector{ - 2, - 1, - 7, - 0, - 1, - 86400000, - } - MM:intvector{ - 1, - 1, - 7, - 0, - 1, - 86400000, - } - MN:intvector{ - 2, - 1, - 7, - 0, - 1, - 86400000, - } - MO:intvector{ - 1, - 1, - 7, - 0, - 1, - 86400000, - } - MQ:intvector{ - 2, - 4, - 7, - 0, - 1, - 86400000, - } - MT:intvector{ - 1, - 1, - 7, - 0, - 1, - 86400000, - } - MV:intvector{ - 6, - 1, - 7, - 0, - 1, - 86400000, - } - MX:intvector{ - 1, - 1, - 7, - 0, - 1, - 86400000, - } - MY:intvector{ - 2, - 1, - 7, - 0, - 1, - 86400000, - } - MZ:intvector{ - 1, - 1, - 7, - 0, - 1, - 86400000, - } - NI:intvector{ - 1, - 1, - 7, - 0, - 1, - 86400000, - } - NL:intvector{ - 2, - 4, - 7, - 0, - 1, - 86400000, - } - NO:intvector{ - 2, - 4, - 7, - 0, - 1, - 86400000, - } - NP:intvector{ - 1, - 1, - 7, - 0, - 1, - 86400000, - } - NZ:intvector{ - 1, - 1, - 7, - 0, - 1, - 86400000, - } - OM:intvector{ - 7, - 1, - 6, - 0, - 7, - 86400000, - } - PA:intvector{ - 1, - 1, - 7, - 0, - 1, - 86400000, - } - PE:intvector{ - 1, - 1, - 7, - 0, - 1, - 86400000, - } - PH:intvector{ - 1, - 1, - 7, - 0, - 1, - 86400000, - } - PK:intvector{ - 1, - 1, - 7, - 0, - 1, - 86400000, - } - PL:intvector{ - 2, - 4, - 7, - 0, - 1, - 86400000, - } - PR:intvector{ - 1, - 1, - 7, - 0, - 1, - 86400000, - } - PT:intvector{ - 2, - 4, - 7, - 0, - 1, - 86400000, - } - PY:intvector{ - 1, - 1, - 7, - 0, - 1, - 86400000, - } - QA:intvector{ - 7, - 1, - 6, - 0, - 7, - 86400000, - } - RE:intvector{ - 2, - 4, - 7, - 0, - 1, - 86400000, - } - RO:intvector{ - 2, - 1, - 7, - 0, - 1, - 86400000, - } - RS:intvector{ - 2, - 1, - 7, - 0, - 1, - 86400000, - } - RU:intvector{ - 2, - 1, - 7, - 0, - 1, - 86400000, - } - SA:intvector{ - 1, - 1, - 6, - 0, - 7, - 86400000, - } - SD:intvector{ - 7, - 1, - 6, - 0, - 7, - 86400000, - } - SE:intvector{ - 2, - 4, - 7, - 0, - 1, - 86400000, - } - SG:intvector{ - 1, - 1, - 7, - 0, - 1, - 86400000, - } - SI:intvector{ - 2, - 1, - 7, - 0, - 1, - 86400000, - } - SJ:intvector{ - 2, - 4, - 7, - 0, - 1, - 86400000, - } - SK:intvector{ - 2, - 4, - 7, - 0, - 1, - 86400000, - } - SM:intvector{ - 2, - 4, - 7, - 0, - 1, - 86400000, - } - SV:intvector{ - 1, - 1, - 7, - 0, - 1, - 86400000, - } - SY:intvector{ - 7, - 1, - 6, - 0, - 7, - 86400000, - } - TH:intvector{ - 1, - 1, - 7, - 0, - 1, - 86400000, - } - TJ:intvector{ - 2, - 1, - 7, - 0, - 1, - 86400000, - } - TM:intvector{ - 2, - 1, - 7, - 0, - 1, - 86400000, - } - TN:intvector{ - 1, - 1, - 6, - 0, - 7, - 86400000, - } - TR:intvector{ - 2, - 1, - 7, - 0, - 1, - 86400000, - } - TT:intvector{ - 1, - 1, - 7, - 0, - 1, - 86400000, - } - TW:intvector{ - 1, - 1, - 7, - 0, - 1, - 86400000, - } - UA:intvector{ - 2, - 1, - 7, - 0, - 1, - 86400000, - } - UM:intvector{ - 1, - 1, - 7, - 0, - 1, - 86400000, - } - US:intvector{ - 1, - 1, - 7, - 0, - 1, - 86400000, - } - UY:intvector{ - 2, - 1, - 7, - 0, - 1, - 86400000, - } - UZ:intvector{ - 2, - 1, - 7, - 0, - 1, - 86400000, - } - VA:intvector{ - 2, - 4, - 7, - 0, - 1, - 86400000, - } - VE:intvector{ - 1, - 1, - 7, - 0, - 1, - 86400000, - } - VI:intvector{ - 1, - 1, - 7, - 0, - 1, - 86400000, - } - VN:intvector{ - 2, - 1, - 7, - 0, - 1, - 86400000, - } - WS:intvector{ - 1, - 1, - 7, - 0, - 1, - 86400000, - } - XK:intvector{ - 2, - 1, - 7, - 0, - 1, - 86400000, - } - YE:intvector{ - 1, - 1, - 6, - 0, - 7, - 86400000, - } - ZA:intvector{ - 1, - 1, - 7, - 0, - 1, - 86400000, - } - ZW:intvector{ - 1, - 1, - 7, - 0, - 1, - 86400000, - } - } - weekData%variant{ - GB:intvector{1} - } - weekOfPreference{ - af{ - "weekOfDate", - "weekOfInterval", - "weekOfMonth", - } - am{ - "weekOfYear", - "weekOfMonth", - } - ar{"weekOfMonth"} - az{ - "weekOfYear", - "weekOfMonth", - } - be{ - "weekOfInterval", - "weekOfMonth", - } - bg{ - "weekOfDate", - "weekOfMonth", - "weekOfInterval", - } - bn{ - "weekOfDate", - "weekOfMonth", - } - bs{ - "weekOfYear", - "weekOfMonth", - } - ca{"weekOfDate"} - cs{ - "weekOfYear", - "weekOfMonth", - } - cy{ - "weekOfYear", - "weekOfMonth", - } - da{ - "weekOfYear", - "weekOfMonth", - } - de{ - "weekOfDate", - "weekOfMonth", - "weekOfInterval", - } - el{ - "weekOfYear", - "weekOfMonth", - } - en{ - "weekOfDate", - "weekOfMonth", - } - es{"weekOfDate"} - et{ - "weekOfYear", - "weekOfMonth", - } - eu{ - "weekOfMonth", - "weekOfDate", - } - fa{ - "weekOfMonth", - "weekOfInterval", - } - fi{ - "weekOfYear", - "weekOfDate", - "weekOfMonth", - } - fil{"weekOfMonth"} - fr{"weekOfDate"} - gl{"weekOfDate"} - gu{"weekOfMonth"} - hi{ - "weekOfYear", - "weekOfMonth", - } - hr{ - "weekOfMonth", - "weekOfInterval", - } - hu{"weekOfMonth"} - hy{"weekOfMonth"} - id{"weekOfMonth"} - is{ - "weekOfYear", - "weekOfMonth", - "weekOfInterval", - } - it{ - "weekOfMonth", - "weekOfInterval", - } - iw{ - "weekOfDate", - "weekOfMonth", - "weekOfInterval", - } - ja{ - "weekOfDate", - "weekOfMonth", - } - ka{ - "weekOfDate", - "weekOfMonth", - } - kk{"weekOfMonth"} - km{ - "weekOfMonth", - "weekOfYear", - } - kn{ - "weekOfMonth", - "weekOfDate", - "weekOfYear", - } - ko{"weekOfMonth"} - ky{ - "weekOfYear", - "weekOfMonth", - } - lo{ - "weekOfMonth", - "weekOfInterval", - "weekOfDate", - "weekOfYear", - } - lt{ - "weekOfYear", - "weekOfMonth", - } - lv{ - "weekOfMonth", - "weekOfInterval", - } - mk{ - "weekOfYear", - "weekOfMonth", - } - ml{ - "weekOfMonth", - "weekOfDate", - "weekOfYear", - } - mn{ - "weekOfYear", - "weekOfMonth", - "weekOfInterval", - } - mr{ - "weekOfMonth", - "weekOfYear", - } - ms{ - "weekOfMonth", - "weekOfYear", - "weekOfInterval", - "weekOfDate", - } - nl{ - "weekOfDate", - "weekOfYear", - "weekOfMonth", - } - no{ - "weekOfYear", - "weekOfMonth", - "weekOfInterval", - } - pa{ - "weekOfMonth", - "weekOfDate", - "weekOfYear", - } - pl{ - "weekOfMonth", - "weekOfInterval", - } - pt{ - "weekOfDate", - "weekOfMonth", - "weekOfInterval", - } - ro{ - "weekOfInterval", - "weekOfMonth", - } - ru{ - "weekOfInterval", - "weekOfMonth", - } - si{ - "weekOfMonth", - "weekOfInterval", - } - sk{ - "weekOfYear", - "weekOfMonth", - } - sl{"weekOfInterval"} - sq{ - "weekOfMonth", - "weekOfInterval", - "weekOfDate", - "weekOfYear", - } - sr{ - "weekOfMonth", - "weekOfInterval", - } - sv{ - "weekOfYear", - "weekOfMonth", - "weekOfInterval", - } - sw{ - "weekOfMonth", - "weekOfInterval", - "weekOfYear", - } - ta{ - "weekOfYear", - "weekOfMonth", - } - te{ - "weekOfMonth", - "weekOfInterval", - "weekOfYear", - } - th{ - "weekOfYear", - "weekOfMonth", - } - tr{ - "weekOfMonth", - "weekOfYear", - "weekOfInterval", - "weekOfDate", - } - uk{ - "weekOfMonth", - "weekOfInterval", - } - und{"weekOfYear"} - ur{ - "weekOfDate", - "weekOfMonth", - "weekOfInterval", - } - uz{ - "weekOfMonth", - "weekOfInterval", - } - vi{ - "weekOfYear", - "weekOfMonth", - "weekOfInterval", - } - zh{ - "weekOfDate", - "weekOfMonth", - "weekOfInterval", - } - zh-TW{ - "weekOfYear", - "weekOfDate", - "weekOfMonth", - } - zu{ - "weekOfYear", - "weekOfInterval", - } - } -} diff --git a/Build/source/libs/icu/icu-src/source/data/misc/timezoneTypes.txt b/Build/source/libs/icu/icu-src/source/data/misc/timezoneTypes.txt deleted file mode 100644 index 07a4ac4b5c4..00000000000 --- a/Build/source/libs/icu/icu-src/source/data/misc/timezoneTypes.txt +++ /dev/null @@ -1,610 +0,0 @@ -// © 2016 and later: Unicode, Inc. and others. -// License & terms of use: http://www.unicode.org/copyright.html#License -timezoneTypes:table(nofallback){ - bcpTypeAlias{ - tz{ - aqams{"nzakl"} - cnckg{"cnsha"} - cnhrb{"cnsha"} - cnkhg{"cnurc"} - usnavajo{"usden"} - } - } - typeAlias{ - timezone{ - "Africa:Asmara"{"Africa/Asmera"} - "Africa:Timbuktu"{"Africa/Bamako"} - "America:Argentina:Buenos_Aires"{"America/Buenos_Aires"} - "America:Argentina:Catamarca"{"America/Catamarca"} - "America:Argentina:ComodRivadavia"{"America/Catamarca"} - "America:Argentina:Cordoba"{"America/Cordoba"} - "America:Argentina:Jujuy"{"America/Jujuy"} - "America:Argentina:Mendoza"{"America/Mendoza"} - "America:Atikokan"{"America/Coral_Harbour"} - "America:Atka"{"America/Adak"} - "America:Ensenada"{"America/Tijuana"} - "America:Fort_Wayne"{"America/Indianapolis"} - "America:Indiana:Indianapolis"{"America/Indianapolis"} - "America:Kentucky:Louisville"{"America/Louisville"} - "America:Knox_IN"{"America/Indiana/Knox"} - "America:Porto_Acre"{"America/Rio_Branco"} - "America:Rosario"{"America/Cordoba"} - "America:Shiprock"{"America/Denver"} - "America:Virgin"{"America/St_Thomas"} - "Antarctica:South_Pole"{"Pacific/Auckland"} - "Asia:Ashkhabad"{"Asia/Ashgabat"} - "Asia:Chongqing"{"Asia/Shanghai"} - "Asia:Chungking"{"Asia/Shanghai"} - "Asia:Dacca"{"Asia/Dhaka"} - "Asia:Harbin"{"Asia/Shanghai"} - "Asia:Ho_Chi_Minh"{"Asia/Saigon"} - "Asia:Istanbul"{"Europe/Istanbul"} - "Asia:Kashgar"{"Asia/Urumqi"} - "Asia:Kathmandu"{"Asia/Katmandu"} - "Asia:Kolkata"{"Asia/Calcutta"} - "Asia:Macao"{"Asia/Macau"} - "Asia:Tel_Aviv"{"Asia/Jerusalem"} - "Asia:Thimbu"{"Asia/Thimphu"} - "Asia:Ujung_Pandang"{"Asia/Makassar"} - "Asia:Ulan_Bator"{"Asia/Ulaanbaatar"} - "Asia:Yangon"{"Asia/Rangoon"} - "Atlantic:Faroe"{"Atlantic/Faeroe"} - "Atlantic:Jan_Mayen"{"Arctic/Longyearbyen"} - "Australia:ACT"{"Australia/Sydney"} - "Australia:Canberra"{"Australia/Sydney"} - "Australia:LHI"{"Australia/Lord_Howe"} - "Australia:NSW"{"Australia/Sydney"} - "Australia:North"{"Australia/Darwin"} - "Australia:Queensland"{"Australia/Brisbane"} - "Australia:South"{"Australia/Adelaide"} - "Australia:Tasmania"{"Australia/Hobart"} - "Australia:Victoria"{"Australia/Melbourne"} - "Australia:West"{"Australia/Perth"} - "Australia:Yancowinna"{"Australia/Broken_Hill"} - "Brazil:Acre"{"America/Rio_Branco"} - "Brazil:DeNoronha"{"America/Noronha"} - "Brazil:East"{"America/Sao_Paulo"} - "Brazil:West"{"America/Manaus"} - "Canada:Atlantic"{"America/Halifax"} - "Canada:Central"{"America/Winnipeg"} - "Canada:East-Saskatchewan"{"America/Regina"} - "Canada:Eastern"{"America/Toronto"} - "Canada:Mountain"{"America/Edmonton"} - "Canada:Newfoundland"{"America/St_Johns"} - "Canada:Pacific"{"America/Vancouver"} - "Canada:Saskatchewan"{"America/Regina"} - "Canada:Yukon"{"America/Whitehorse"} - "Chile:Continental"{"America/Santiago"} - "Chile:EasterIsland"{"Pacific/Easter"} - "Etc:GMT+0"{"Etc/GMT"} - "Etc:GMT-0"{"Etc/GMT"} - "Etc:GMT0"{"Etc/GMT"} - "Etc:Greenwich"{"Etc/GMT"} - "Etc:UCT"{"Etc/GMT"} - "Etc:UTC"{"Etc/GMT"} - "Etc:Universal"{"Etc/GMT"} - "Etc:Zulu"{"Etc/GMT"} - "Europe:Belfast"{"Europe/London"} - "Europe:Nicosia"{"Asia/Nicosia"} - "Europe:Tiraspol"{"Europe/Chisinau"} - "Mexico:BajaNorte"{"America/Tijuana"} - "Mexico:BajaSur"{"America/Mazatlan"} - "Mexico:General"{"America/Mexico_City"} - "Pacific:Chuuk"{"Pacific/Truk"} - "Pacific:Pohnpei"{"Pacific/Ponape"} - "Pacific:Samoa"{"Pacific/Pago_Pago"} - "Pacific:Yap"{"Pacific/Truk"} - "US:Alaska"{"America/Anchorage"} - "US:Aleutian"{"America/Adak"} - "US:Arizona"{"America/Phoenix"} - "US:Central"{"America/Chicago"} - "US:East-Indiana"{"America/Indianapolis"} - "US:Eastern"{"America/New_York"} - "US:Hawaii"{"Pacific/Honolulu"} - "US:Indiana-Starke"{"America/Indiana/Knox"} - "US:Michigan"{"America/Detroit"} - "US:Mountain"{"America/Denver"} - "US:Pacific"{"America/Los_Angeles"} - "US:Pacific-New"{"America/Los_Angeles"} - "US:Samoa"{"Pacific/Pago_Pago"} - Cuba{"America/Havana"} - EST{"Etc/GMT+5"} - Egypt{"Africa/Cairo"} - Eire{"Europe/Dublin"} - GB{"Europe/London"} - GB-Eire{"Europe/London"} - GMT{"Etc/GMT"} - GMT+0{"Etc/GMT"} - GMT-0{"Etc/GMT"} - GMT0{"Etc/GMT"} - Greenwich{"Etc/GMT"} - HST{"Etc/GMT+10"} - Hongkong{"Asia/Hong_Kong"} - Iceland{"Atlantic/Reykjavik"} - Iran{"Asia/Tehran"} - Israel{"Asia/Jerusalem"} - Jamaica{"America/Jamaica"} - Japan{"Asia/Tokyo"} - Kwajalein{"Pacific/Kwajalein"} - Libya{"Africa/Tripoli"} - MST{"Etc/GMT+7"} - NZ{"Pacific/Auckland"} - NZ-CHAT{"Pacific/Chatham"} - Navajo{"America/Denver"} - PRC{"Asia/Shanghai"} - Poland{"Europe/Warsaw"} - Portugal{"Europe/Lisbon"} - ROC{"Asia/Taipei"} - ROK{"Asia/Seoul"} - Singapore{"Asia/Singapore"} - Turkey{"Europe/Istanbul"} - UCT{"Etc/GMT"} - UTC{"Etc/GMT"} - Universal{"Etc/GMT"} - W-SU{"Europe/Moscow"} - Zulu{"Etc/GMT"} - } - } - typeMap{ - timezone{ - "Africa:Abidjan"{"ciabj"} - "Africa:Accra"{"ghacc"} - "Africa:Addis_Ababa"{"etadd"} - "Africa:Algiers"{"dzalg"} - "Africa:Asmera"{"erasm"} - "Africa:Bamako"{"mlbko"} - "Africa:Bangui"{"cfbgf"} - "Africa:Banjul"{"gmbjl"} - "Africa:Bissau"{"gwoxb"} - "Africa:Blantyre"{"mwblz"} - "Africa:Brazzaville"{"cgbzv"} - "Africa:Bujumbura"{"bibjm"} - "Africa:Cairo"{"egcai"} - "Africa:Casablanca"{"macas"} - "Africa:Ceuta"{"esceu"} - "Africa:Conakry"{"gncky"} - "Africa:Dakar"{"sndkr"} - "Africa:Dar_es_Salaam"{"tzdar"} - "Africa:Djibouti"{"djjib"} - "Africa:Douala"{"cmdla"} - "Africa:El_Aaiun"{"eheai"} - "Africa:Freetown"{"slfna"} - "Africa:Gaborone"{"bwgbe"} - "Africa:Harare"{"zwhre"} - "Africa:Johannesburg"{"zajnb"} - "Africa:Juba"{"ssjub"} - "Africa:Kampala"{"ugkla"} - "Africa:Khartoum"{"sdkrt"} - "Africa:Kigali"{"rwkgl"} - "Africa:Kinshasa"{"cdfih"} - "Africa:Lagos"{"nglos"} - "Africa:Libreville"{"galbv"} - "Africa:Lome"{"tglfw"} - "Africa:Luanda"{"aolad"} - "Africa:Lubumbashi"{"cdfbm"} - "Africa:Lusaka"{"zmlun"} - "Africa:Malabo"{"gqssg"} - "Africa:Maputo"{"mzmpm"} - "Africa:Maseru"{"lsmsu"} - "Africa:Mbabane"{"szqmn"} - "Africa:Mogadishu"{"somgq"} - "Africa:Monrovia"{"lrmlw"} - "Africa:Nairobi"{"kenbo"} - "Africa:Ndjamena"{"tdndj"} - "Africa:Niamey"{"nenim"} - "Africa:Nouakchott"{"mrnkc"} - "Africa:Ouagadougou"{"bfoua"} - "Africa:Porto-Novo"{"bjptn"} - "Africa:Sao_Tome"{"sttms"} - "Africa:Tripoli"{"lytip"} - "Africa:Tunis"{"tntun"} - "Africa:Windhoek"{"nawdh"} - "America:Adak"{"usadk"} - "America:Anchorage"{"usanc"} - "America:Anguilla"{"aiaxa"} - "America:Antigua"{"aganu"} - "America:Araguaina"{"braux"} - "America:Argentina:La_Rioja"{"arirj"} - "America:Argentina:Rio_Gallegos"{"arrgl"} - "America:Argentina:Salta"{"arsla"} - "America:Argentina:San_Juan"{"aruaq"} - "America:Argentina:San_Luis"{"arluq"} - "America:Argentina:Tucuman"{"artuc"} - "America:Argentina:Ushuaia"{"arush"} - "America:Aruba"{"awaua"} - "America:Asuncion"{"pyasu"} - "America:Bahia"{"brssa"} - "America:Bahia_Banderas"{"mxpvr"} - "America:Barbados"{"bbbgi"} - "America:Belem"{"brbel"} - "America:Belize"{"bzbze"} - "America:Blanc-Sablon"{"caybx"} - "America:Boa_Vista"{"brbvb"} - "America:Bogota"{"cobog"} - "America:Boise"{"usboi"} - "America:Buenos_Aires"{"arbue"} - "America:Cambridge_Bay"{"caycb"} - "America:Campo_Grande"{"brcgr"} - "America:Cancun"{"mxcun"} - "America:Caracas"{"veccs"} - "America:Catamarca"{"arctc"} - "America:Cayenne"{"gfcay"} - "America:Cayman"{"kygec"} - "America:Chicago"{"uschi"} - "America:Chihuahua"{"mxchi"} - "America:Coral_Harbour"{"cayzs"} - "America:Cordoba"{"arcor"} - "America:Costa_Rica"{"crsjo"} - "America:Creston"{"cacfq"} - "America:Cuiaba"{"brcgb"} - "America:Curacao"{"ancur"} - "America:Danmarkshavn"{"gldkshvn"} - "America:Dawson"{"cayda"} - "America:Dawson_Creek"{"caydq"} - "America:Denver"{"usden"} - "America:Detroit"{"usdet"} - "America:Dominica"{"dmdom"} - "America:Edmonton"{"caedm"} - "America:Eirunepe"{"brern"} - "America:El_Salvador"{"svsal"} - "America:Fort_Nelson"{"cafne"} - "America:Fortaleza"{"brfor"} - "America:Glace_Bay"{"caglb"} - "America:Godthab"{"glgoh"} - "America:Goose_Bay"{"cagoo"} - "America:Grand_Turk"{"tcgdt"} - "America:Grenada"{"gdgnd"} - "America:Guadeloupe"{"gpbbr"} - "America:Guatemala"{"gtgua"} - "America:Guayaquil"{"ecgye"} - "America:Guyana"{"gygeo"} - "America:Halifax"{"cahal"} - "America:Havana"{"cuhav"} - "America:Hermosillo"{"mxhmo"} - "America:Indiana:Knox"{"usknx"} - "America:Indiana:Marengo"{"usaeg"} - "America:Indiana:Petersburg"{"uswsq"} - "America:Indiana:Tell_City"{"ustel"} - "America:Indiana:Vevay"{"usinvev"} - "America:Indiana:Vincennes"{"usoea"} - "America:Indiana:Winamac"{"uswlz"} - "America:Indianapolis"{"usind"} - "America:Inuvik"{"cayev"} - "America:Iqaluit"{"caiql"} - "America:Jamaica"{"jmkin"} - "America:Jujuy"{"arjuj"} - "America:Juneau"{"usjnu"} - "America:Kentucky:Monticello"{"usmoc"} - "America:Kralendijk"{"bqkra"} - "America:La_Paz"{"bolpb"} - "America:Lima"{"pelim"} - "America:Los_Angeles"{"uslax"} - "America:Louisville"{"uslui"} - "America:Lower_Princes"{"sxphi"} - "America:Maceio"{"brmcz"} - "America:Managua"{"nimga"} - "America:Manaus"{"brmao"} - "America:Marigot"{"gpmsb"} - "America:Martinique"{"mqfdf"} - "America:Matamoros"{"mxmam"} - "America:Mazatlan"{"mxmzt"} - "America:Mendoza"{"armdz"} - "America:Menominee"{"usmnm"} - "America:Merida"{"mxmid"} - "America:Metlakatla"{"usmtm"} - "America:Mexico_City"{"mxmex"} - "America:Miquelon"{"pmmqc"} - "America:Moncton"{"camon"} - "America:Monterrey"{"mxmty"} - "America:Montevideo"{"uymvd"} - "America:Montreal"{"camtr"} - "America:Montserrat"{"msmni"} - "America:Nassau"{"bsnas"} - "America:New_York"{"usnyc"} - "America:Nipigon"{"canpg"} - "America:Nome"{"usome"} - "America:Noronha"{"brfen"} - "America:North_Dakota:Beulah"{"usxul"} - "America:North_Dakota:Center"{"usndcnt"} - "America:North_Dakota:New_Salem"{"usndnsl"} - "America:Ojinaga"{"mxoji"} - "America:Panama"{"papty"} - "America:Pangnirtung"{"capnt"} - "America:Paramaribo"{"srpbm"} - "America:Phoenix"{"usphx"} - "America:Port-au-Prince"{"htpap"} - "America:Port_of_Spain"{"ttpos"} - "America:Porto_Velho"{"brpvh"} - "America:Puerto_Rico"{"prsju"} - "America:Rainy_River"{"caffs"} - "America:Rankin_Inlet"{"cayek"} - "America:Recife"{"brrec"} - "America:Regina"{"careg"} - "America:Resolute"{"careb"} - "America:Rio_Branco"{"brrbr"} - "America:Santa_Isabel"{"mxstis"} - "America:Santarem"{"brstm"} - "America:Santiago"{"clscl"} - "America:Santo_Domingo"{"dosdq"} - "America:Sao_Paulo"{"brsao"} - "America:Scoresbysund"{"globy"} - "America:Sitka"{"ussit"} - "America:St_Barthelemy"{"gpsbh"} - "America:St_Johns"{"casjf"} - "America:St_Kitts"{"knbas"} - "America:St_Lucia"{"lccas"} - "America:St_Thomas"{"vistt"} - "America:St_Vincent"{"vcsvd"} - "America:Swift_Current"{"cayyn"} - "America:Tegucigalpa"{"hntgu"} - "America:Thule"{"glthu"} - "America:Thunder_Bay"{"cathu"} - "America:Tijuana"{"mxtij"} - "America:Toronto"{"cator"} - "America:Tortola"{"vgtov"} - "America:Vancouver"{"cavan"} - "America:Whitehorse"{"cayxy"} - "America:Winnipeg"{"cawnp"} - "America:Yakutat"{"usyak"} - "America:Yellowknife"{"cayzf"} - "Antarctica:Casey"{"aqcas"} - "Antarctica:Davis"{"aqdav"} - "Antarctica:DumontDUrville"{"aqddu"} - "Antarctica:Macquarie"{"aumqi"} - "Antarctica:Mawson"{"aqmaw"} - "Antarctica:McMurdo"{"aqmcm"} - "Antarctica:Palmer"{"aqplm"} - "Antarctica:Rothera"{"aqrot"} - "Antarctica:Syowa"{"aqsyw"} - "Antarctica:Troll"{"aqtrl"} - "Antarctica:Vostok"{"aqvos"} - "Arctic:Longyearbyen"{"sjlyr"} - "Asia:Aden"{"yeade"} - "Asia:Almaty"{"kzala"} - "Asia:Amman"{"joamm"} - "Asia:Anadyr"{"rudyr"} - "Asia:Aqtau"{"kzaau"} - "Asia:Aqtobe"{"kzakx"} - "Asia:Ashgabat"{"tmasb"} - "Asia:Atyrau"{"kzguw"} - "Asia:Baghdad"{"iqbgw"} - "Asia:Bahrain"{"bhbah"} - "Asia:Baku"{"azbak"} - "Asia:Bangkok"{"thbkk"} - "Asia:Barnaul"{"rubax"} - "Asia:Beirut"{"lbbey"} - "Asia:Bishkek"{"kgfru"} - "Asia:Brunei"{"bnbwn"} - "Asia:Calcutta"{"inccu"} - "Asia:Chita"{"ruchita"} - "Asia:Choibalsan"{"mncoq"} - "Asia:Colombo"{"lkcmb"} - "Asia:Damascus"{"sydam"} - "Asia:Dhaka"{"bddac"} - "Asia:Dili"{"tldil"} - "Asia:Dubai"{"aedxb"} - "Asia:Dushanbe"{"tjdyu"} - "Asia:Famagusta"{"cyfmg"} - "Asia:Gaza"{"gaza"} - "Asia:Hebron"{"hebron"} - "Asia:Hong_Kong"{"hkhkg"} - "Asia:Hovd"{"mnhvd"} - "Asia:Irkutsk"{"ruikt"} - "Asia:Jakarta"{"idjkt"} - "Asia:Jayapura"{"iddjj"} - "Asia:Jerusalem"{"jeruslm"} - "Asia:Kabul"{"afkbl"} - "Asia:Kamchatka"{"rupkc"} - "Asia:Karachi"{"pkkhi"} - "Asia:Katmandu"{"npktm"} - "Asia:Khandyga"{"rukhndg"} - "Asia:Krasnoyarsk"{"rukra"} - "Asia:Kuala_Lumpur"{"mykul"} - "Asia:Kuching"{"mykch"} - "Asia:Kuwait"{"kwkwi"} - "Asia:Macau"{"momfm"} - "Asia:Magadan"{"rugdx"} - "Asia:Makassar"{"idmak"} - "Asia:Manila"{"phmnl"} - "Asia:Muscat"{"ommct"} - "Asia:Nicosia"{"cynic"} - "Asia:Novokuznetsk"{"runoz"} - "Asia:Novosibirsk"{"ruovb"} - "Asia:Omsk"{"ruoms"} - "Asia:Oral"{"kzura"} - "Asia:Phnom_Penh"{"khpnh"} - "Asia:Pontianak"{"idpnk"} - "Asia:Pyongyang"{"kpfnj"} - "Asia:Qatar"{"qadoh"} - "Asia:Qyzylorda"{"kzkzo"} - "Asia:Rangoon"{"mmrgn"} - "Asia:Riyadh"{"saruh"} - "Asia:Saigon"{"vnsgn"} - "Asia:Sakhalin"{"ruuus"} - "Asia:Samarkand"{"uzskd"} - "Asia:Seoul"{"krsel"} - "Asia:Shanghai"{"cnsha"} - "Asia:Singapore"{"sgsin"} - "Asia:Srednekolymsk"{"rusred"} - "Asia:Taipei"{"twtpe"} - "Asia:Tashkent"{"uztas"} - "Asia:Tbilisi"{"getbs"} - "Asia:Tehran"{"irthr"} - "Asia:Thimphu"{"btthi"} - "Asia:Tokyo"{"jptyo"} - "Asia:Tomsk"{"rutof"} - "Asia:Ulaanbaatar"{"mnuln"} - "Asia:Urumqi"{"cnurc"} - "Asia:Ust-Nera"{"ruunera"} - "Asia:Vientiane"{"lavte"} - "Asia:Vladivostok"{"ruvvo"} - "Asia:Yakutsk"{"ruyks"} - "Asia:Yekaterinburg"{"ruyek"} - "Asia:Yerevan"{"amevn"} - "Atlantic:Azores"{"ptpdl"} - "Atlantic:Bermuda"{"bmbda"} - "Atlantic:Canary"{"eslpa"} - "Atlantic:Cape_Verde"{"cvrai"} - "Atlantic:Faeroe"{"fotho"} - "Atlantic:Madeira"{"ptfnc"} - "Atlantic:Reykjavik"{"isrey"} - "Atlantic:South_Georgia"{"gsgrv"} - "Atlantic:St_Helena"{"shshn"} - "Atlantic:Stanley"{"fkpsy"} - "Australia:Adelaide"{"auadl"} - "Australia:Brisbane"{"aubne"} - "Australia:Broken_Hill"{"aubhq"} - "Australia:Currie"{"aukns"} - "Australia:Darwin"{"audrw"} - "Australia:Eucla"{"aueuc"} - "Australia:Hobart"{"auhba"} - "Australia:Lindeman"{"auldc"} - "Australia:Lord_Howe"{"auldh"} - "Australia:Melbourne"{"aumel"} - "Australia:Perth"{"auper"} - "Australia:Sydney"{"ausyd"} - "Etc:GMT"{"utc"} - "Etc:GMT+1"{"utcw01"} - "Etc:GMT+10"{"utcw10"} - "Etc:GMT+11"{"utcw11"} - "Etc:GMT+12"{"utcw12"} - "Etc:GMT+2"{"utcw02"} - "Etc:GMT+3"{"utcw03"} - "Etc:GMT+4"{"utcw04"} - "Etc:GMT+5"{"utcw05"} - "Etc:GMT+6"{"utcw06"} - "Etc:GMT+7"{"utcw07"} - "Etc:GMT+8"{"utcw08"} - "Etc:GMT+9"{"utcw09"} - "Etc:GMT-1"{"utce01"} - "Etc:GMT-10"{"utce10"} - "Etc:GMT-11"{"utce11"} - "Etc:GMT-12"{"utce12"} - "Etc:GMT-13"{"utce13"} - "Etc:GMT-14"{"utce14"} - "Etc:GMT-2"{"utce02"} - "Etc:GMT-3"{"utce03"} - "Etc:GMT-4"{"utce04"} - "Etc:GMT-5"{"utce05"} - "Etc:GMT-6"{"utce06"} - "Etc:GMT-7"{"utce07"} - "Etc:GMT-8"{"utce08"} - "Etc:GMT-9"{"utce09"} - "Etc:Unknown"{"unk"} - "Europe:Amsterdam"{"nlams"} - "Europe:Andorra"{"adalv"} - "Europe:Astrakhan"{"ruasf"} - "Europe:Athens"{"grath"} - "Europe:Belgrade"{"rsbeg"} - "Europe:Berlin"{"deber"} - "Europe:Bratislava"{"skbts"} - "Europe:Brussels"{"bebru"} - "Europe:Bucharest"{"robuh"} - "Europe:Budapest"{"hubud"} - "Europe:Busingen"{"debsngn"} - "Europe:Chisinau"{"mdkiv"} - "Europe:Copenhagen"{"dkcph"} - "Europe:Dublin"{"iedub"} - "Europe:Gibraltar"{"gigib"} - "Europe:Guernsey"{"gggci"} - "Europe:Helsinki"{"fihel"} - "Europe:Isle_of_Man"{"imdgs"} - "Europe:Istanbul"{"trist"} - "Europe:Jersey"{"jesth"} - "Europe:Kaliningrad"{"rukgd"} - "Europe:Kiev"{"uaiev"} - "Europe:Kirov"{"rukvx"} - "Europe:Lisbon"{"ptlis"} - "Europe:Ljubljana"{"silju"} - "Europe:London"{"gblon"} - "Europe:Luxembourg"{"lulux"} - "Europe:Madrid"{"esmad"} - "Europe:Malta"{"mtmla"} - "Europe:Mariehamn"{"fimhq"} - "Europe:Minsk"{"bymsq"} - "Europe:Monaco"{"mcmon"} - "Europe:Moscow"{"rumow"} - "Europe:Oslo"{"noosl"} - "Europe:Paris"{"frpar"} - "Europe:Podgorica"{"metgd"} - "Europe:Prague"{"czprg"} - "Europe:Riga"{"lvrix"} - "Europe:Rome"{"itrom"} - "Europe:Samara"{"rukuf"} - "Europe:San_Marino"{"smsai"} - "Europe:Sarajevo"{"basjj"} - "Europe:Saratov"{"rurtw"} - "Europe:Simferopol"{"uasip"} - "Europe:Skopje"{"mkskp"} - "Europe:Sofia"{"bgsof"} - "Europe:Stockholm"{"sesto"} - "Europe:Tallinn"{"eetll"} - "Europe:Tirane"{"altia"} - "Europe:Ulyanovsk"{"ruuly"} - "Europe:Uzhgorod"{"uauzh"} - "Europe:Vaduz"{"livdz"} - "Europe:Vatican"{"vavat"} - "Europe:Vienna"{"atvie"} - "Europe:Vilnius"{"ltvno"} - "Europe:Volgograd"{"ruvog"} - "Europe:Warsaw"{"plwaw"} - "Europe:Zagreb"{"hrzag"} - "Europe:Zaporozhye"{"uaozh"} - "Europe:Zurich"{"chzrh"} - "Indian:Antananarivo"{"mgtnr"} - "Indian:Chagos"{"iodga"} - "Indian:Christmas"{"cxxch"} - "Indian:Cocos"{"cccck"} - "Indian:Comoro"{"kmyva"} - "Indian:Kerguelen"{"tfpfr"} - "Indian:Mahe"{"scmaw"} - "Indian:Maldives"{"mvmle"} - "Indian:Mauritius"{"muplu"} - "Indian:Mayotte"{"ytmam"} - "Indian:Reunion"{"rereu"} - "Pacific:Apia"{"wsapw"} - "Pacific:Auckland"{"nzakl"} - "Pacific:Bougainville"{"pgraw"} - "Pacific:Chatham"{"nzcht"} - "Pacific:Easter"{"clipc"} - "Pacific:Efate"{"vuvli"} - "Pacific:Enderbury"{"kipho"} - "Pacific:Fakaofo"{"tkfko"} - "Pacific:Fiji"{"fjsuv"} - "Pacific:Funafuti"{"tvfun"} - "Pacific:Galapagos"{"ecgps"} - "Pacific:Gambier"{"pfgmr"} - "Pacific:Guadalcanal"{"sbhir"} - "Pacific:Guam"{"gugum"} - "Pacific:Honolulu"{"ushnl"} - "Pacific:Johnston"{"umjon"} - "Pacific:Kiritimati"{"kicxi"} - "Pacific:Kosrae"{"fmksa"} - "Pacific:Kwajalein"{"mhkwa"} - "Pacific:Majuro"{"mhmaj"} - "Pacific:Marquesas"{"pfnhv"} - "Pacific:Midway"{"ummdy"} - "Pacific:Nauru"{"nrinu"} - "Pacific:Niue"{"nuiue"} - "Pacific:Norfolk"{"nfnlk"} - "Pacific:Noumea"{"ncnou"} - "Pacific:Pago_Pago"{"asppg"} - "Pacific:Palau"{"pwror"} - "Pacific:Pitcairn"{"pnpcn"} - "Pacific:Ponape"{"fmpni"} - "Pacific:Port_Moresby"{"pgpom"} - "Pacific:Rarotonga"{"ckrar"} - "Pacific:Saipan"{"mpspn"} - "Pacific:Tahiti"{"pfppt"} - "Pacific:Tarawa"{"kitrw"} - "Pacific:Tongatapu"{"totbu"} - "Pacific:Truk"{"fmtkk"} - "Pacific:Wake"{"umawk"} - "Pacific:Wallis"{"wfmau"} - CST6CDT{"cst6cdt"} - EST5EDT{"est5edt"} - MST7MDT{"mst7mdt"} - PST8PDT{"pst8pdt"} - } - } -} diff --git a/Build/source/libs/icu/icu-src/source/data/misc/windowsZones.txt b/Build/source/libs/icu/icu-src/source/data/misc/windowsZones.txt deleted file mode 100644 index 4606b168fb7..00000000000 --- a/Build/source/libs/icu/icu-src/source/data/misc/windowsZones.txt +++ /dev/null @@ -1,791 +0,0 @@ -// © 2016 and later: Unicode, Inc. and others. -// License & terms of use: http://www.unicode.org/copyright.html#License -windowsZones:table(nofallback){ - mapTimezones{ - "AUS Central Standard Time"{ - 001{"Australia/Darwin"} - AU{"Australia/Darwin"} - } - "AUS Eastern Standard Time"{ - 001{"Australia/Sydney"} - AU{"Australia/Sydney Australia/Melbourne"} - } - "Afghanistan Standard Time"{ - 001{"Asia/Kabul"} - AF{"Asia/Kabul"} - } - "Alaskan Standard Time"{ - 001{"America/Anchorage"} - US{ - "America/Anchorage America/Juneau America/Metlakatla America/Nome Ame" - "rica/Sitka America/Yakutat" - } - } - "Aleutian Standard Time"{ - 001{"America/Adak"} - US{"America/Adak"} - } - "Altai Standard Time"{ - 001{"Asia/Barnaul"} - RU{"Asia/Barnaul"} - } - "Arab Standard Time"{ - 001{"Asia/Riyadh"} - BH{"Asia/Bahrain"} - KW{"Asia/Kuwait"} - QA{"Asia/Qatar"} - SA{"Asia/Riyadh"} - YE{"Asia/Aden"} - } - "Arabian Standard Time"{ - 001{"Asia/Dubai"} - AE{"Asia/Dubai"} - OM{"Asia/Muscat"} - ZZ{"Etc/GMT-4"} - } - "Arabic Standard Time"{ - 001{"Asia/Baghdad"} - IQ{"Asia/Baghdad"} - } - "Argentina Standard Time"{ - 001{"America/Buenos_Aires"} - AR{ - "America/Buenos_Aires America/Argentina/La_Rioja America/Argentina/Ri" - "o_Gallegos America/Argentina/Salta America/Argentina/San_Juan Americ" - "a/Argentina/San_Luis America/Argentina/Tucuman America/Argentina/Ush" - "uaia America/Catamarca America/Cordoba America/Jujuy America/Mendoza" - } - } - "Astrakhan Standard Time"{ - 001{"Europe/Astrakhan"} - RU{"Europe/Astrakhan Europe/Saratov Europe/Ulyanovsk"} - } - "Atlantic Standard Time"{ - 001{"America/Halifax"} - BM{"Atlantic/Bermuda"} - CA{"America/Halifax America/Glace_Bay America/Goose_Bay America/Moncton"} - GL{"America/Thule"} - } - "Aus Central W. Standard Time"{ - 001{"Australia/Eucla"} - AU{"Australia/Eucla"} - } - "Azerbaijan Standard Time"{ - 001{"Asia/Baku"} - AZ{"Asia/Baku"} - } - "Azores Standard Time"{ - 001{"Atlantic/Azores"} - GL{"America/Scoresbysund"} - PT{"Atlantic/Azores"} - } - "Bahia Standard Time"{ - 001{"America/Bahia"} - BR{"America/Bahia"} - } - "Bangladesh Standard Time"{ - 001{"Asia/Dhaka"} - BD{"Asia/Dhaka"} - BT{"Asia/Thimphu"} - } - "Belarus Standard Time"{ - 001{"Europe/Minsk"} - BY{"Europe/Minsk"} - } - "Bougainville Standard Time"{ - 001{"Pacific/Bougainville"} - PG{"Pacific/Bougainville"} - } - "Canada Central Standard Time"{ - 001{"America/Regina"} - CA{"America/Regina America/Swift_Current"} - } - "Cape Verde Standard Time"{ - 001{"Atlantic/Cape_Verde"} - CV{"Atlantic/Cape_Verde"} - ZZ{"Etc/GMT+1"} - } - "Caucasus Standard Time"{ - 001{"Asia/Yerevan"} - AM{"Asia/Yerevan"} - } - "Cen. Australia Standard Time"{ - 001{"Australia/Adelaide"} - AU{"Australia/Adelaide Australia/Broken_Hill"} - } - "Central America Standard Time"{ - 001{"America/Guatemala"} - BZ{"America/Belize"} - CR{"America/Costa_Rica"} - EC{"Pacific/Galapagos"} - GT{"America/Guatemala"} - HN{"America/Tegucigalpa"} - NI{"America/Managua"} - SV{"America/El_Salvador"} - ZZ{"Etc/GMT+6"} - } - "Central Asia Standard Time"{ - 001{"Asia/Almaty"} - AQ{"Antarctica/Vostok"} - CN{"Asia/Urumqi"} - IO{"Indian/Chagos"} - KG{"Asia/Bishkek"} - KZ{"Asia/Almaty Asia/Qyzylorda"} - ZZ{"Etc/GMT-6"} - } - "Central Brazilian Standard Time"{ - 001{"America/Cuiaba"} - BR{"America/Cuiaba America/Campo_Grande"} - } - "Central Europe Standard Time"{ - 001{"Europe/Budapest"} - AL{"Europe/Tirane"} - CZ{"Europe/Prague"} - HU{"Europe/Budapest"} - ME{"Europe/Podgorica"} - RS{"Europe/Belgrade"} - SI{"Europe/Ljubljana"} - SK{"Europe/Bratislava"} - } - "Central European Standard Time"{ - 001{"Europe/Warsaw"} - BA{"Europe/Sarajevo"} - HR{"Europe/Zagreb"} - MK{"Europe/Skopje"} - PL{"Europe/Warsaw"} - } - "Central Pacific Standard Time"{ - 001{"Pacific/Guadalcanal"} - AQ{"Antarctica/Casey"} - AU{"Antarctica/Macquarie"} - FM{"Pacific/Ponape Pacific/Kosrae"} - NC{"Pacific/Noumea"} - SB{"Pacific/Guadalcanal"} - VU{"Pacific/Efate"} - ZZ{"Etc/GMT-11"} - } - "Central Standard Time (Mexico)"{ - 001{"America/Mexico_City"} - MX{ - "America/Mexico_City America/Bahia_Banderas America/Merida America/Mo" - "nterrey" - } - } - "Central Standard Time"{ - 001{"America/Chicago"} - CA{ - "America/Winnipeg America/Rainy_River America/Rankin_Inlet America/Re" - "solute" - } - MX{"America/Matamoros"} - US{ - "America/Chicago America/Indiana/Knox America/Indiana/Tell_City Ameri" - "ca/Menominee America/North_Dakota/Beulah America/North_Dakota/Center" - " America/North_Dakota/New_Salem" - } - ZZ{"CST6CDT"} - } - "Chatham Islands Standard Time"{ - 001{"Pacific/Chatham"} - NZ{"Pacific/Chatham"} - } - "China Standard Time"{ - 001{"Asia/Shanghai"} - CN{"Asia/Shanghai"} - HK{"Asia/Hong_Kong"} - MO{"Asia/Macau"} - } - "Cuba Standard Time"{ - 001{"America/Havana"} - CU{"America/Havana"} - } - "Dateline Standard Time"{ - 001{"Etc/GMT+12"} - ZZ{"Etc/GMT+12"} - } - "E. Africa Standard Time"{ - 001{"Africa/Nairobi"} - AQ{"Antarctica/Syowa"} - DJ{"Africa/Djibouti"} - ER{"Africa/Asmera"} - ET{"Africa/Addis_Ababa"} - KE{"Africa/Nairobi"} - KM{"Indian/Comoro"} - MG{"Indian/Antananarivo"} - SD{"Africa/Khartoum"} - SO{"Africa/Mogadishu"} - SS{"Africa/Juba"} - TZ{"Africa/Dar_es_Salaam"} - UG{"Africa/Kampala"} - YT{"Indian/Mayotte"} - ZZ{"Etc/GMT-3"} - } - "E. Australia Standard Time"{ - 001{"Australia/Brisbane"} - AU{"Australia/Brisbane Australia/Lindeman"} - } - "E. Europe Standard Time"{ - 001{"Europe/Chisinau"} - MD{"Europe/Chisinau"} - } - "E. South America Standard Time"{ - 001{"America/Sao_Paulo"} - BR{"America/Sao_Paulo"} - } - "Easter Island Standard Time"{ - 001{"Pacific/Easter"} - CL{"Pacific/Easter"} - } - "Eastern Standard Time (Mexico)"{ - 001{"America/Cancun"} - MX{"America/Cancun"} - } - "Eastern Standard Time"{ - 001{"America/New_York"} - BS{"America/Nassau"} - CA{ - "America/Toronto America/Iqaluit America/Montreal America/Nipigon Ame" - "rica/Pangnirtung America/Thunder_Bay" - } - US{ - "America/New_York America/Detroit America/Indiana/Petersburg America/" - "Indiana/Vincennes America/Indiana/Winamac America/Kentucky/Monticell" - "o America/Louisville" - } - ZZ{"EST5EDT"} - } - "Egypt Standard Time"{ - 001{"Africa/Cairo"} - EG{"Africa/Cairo"} - } - "Ekaterinburg Standard Time"{ - 001{"Asia/Yekaterinburg"} - RU{"Asia/Yekaterinburg"} - } - "FLE Standard Time"{ - 001{"Europe/Kiev"} - AX{"Europe/Mariehamn"} - BG{"Europe/Sofia"} - EE{"Europe/Tallinn"} - FI{"Europe/Helsinki"} - LT{"Europe/Vilnius"} - LV{"Europe/Riga"} - UA{"Europe/Kiev Europe/Uzhgorod Europe/Zaporozhye"} - } - "Fiji Standard Time"{ - 001{"Pacific/Fiji"} - FJ{"Pacific/Fiji"} - } - "GMT Standard Time"{ - 001{"Europe/London"} - ES{"Atlantic/Canary"} - FO{"Atlantic/Faeroe"} - GB{"Europe/London"} - GG{"Europe/Guernsey"} - IE{"Europe/Dublin"} - IM{"Europe/Isle_of_Man"} - JE{"Europe/Jersey"} - PT{"Europe/Lisbon Atlantic/Madeira"} - } - "GTB Standard Time"{ - 001{"Europe/Bucharest"} - CY{"Asia/Nicosia"} - GR{"Europe/Athens"} - RO{"Europe/Bucharest"} - } - "Georgian Standard Time"{ - 001{"Asia/Tbilisi"} - GE{"Asia/Tbilisi"} - } - "Greenland Standard Time"{ - 001{"America/Godthab"} - GL{"America/Godthab"} - } - "Greenwich Standard Time"{ - 001{"Atlantic/Reykjavik"} - BF{"Africa/Ouagadougou"} - CI{"Africa/Abidjan"} - GH{"Africa/Accra"} - GM{"Africa/Banjul"} - GN{"Africa/Conakry"} - GW{"Africa/Bissau"} - IS{"Atlantic/Reykjavik"} - LR{"Africa/Monrovia"} - ML{"Africa/Bamako"} - MR{"Africa/Nouakchott"} - SH{"Atlantic/St_Helena"} - SL{"Africa/Freetown"} - SN{"Africa/Dakar"} - ST{"Africa/Sao_Tome"} - TG{"Africa/Lome"} - } - "Haiti Standard Time"{ - 001{"America/Port-au-Prince"} - HT{"America/Port-au-Prince"} - } - "Hawaiian Standard Time"{ - 001{"Pacific/Honolulu"} - CK{"Pacific/Rarotonga"} - PF{"Pacific/Tahiti"} - UM{"Pacific/Johnston"} - US{"Pacific/Honolulu"} - ZZ{"Etc/GMT+10"} - } - "India Standard Time"{ - 001{"Asia/Calcutta"} - IN{"Asia/Calcutta"} - } - "Iran Standard Time"{ - 001{"Asia/Tehran"} - IR{"Asia/Tehran"} - } - "Israel Standard Time"{ - 001{"Asia/Jerusalem"} - IL{"Asia/Jerusalem"} - } - "Jordan Standard Time"{ - 001{"Asia/Amman"} - JO{"Asia/Amman"} - } - "Kaliningrad Standard Time"{ - 001{"Europe/Kaliningrad"} - RU{"Europe/Kaliningrad"} - } - "Korea Standard Time"{ - 001{"Asia/Seoul"} - KR{"Asia/Seoul"} - } - "Libya Standard Time"{ - 001{"Africa/Tripoli"} - LY{"Africa/Tripoli"} - } - "Line Islands Standard Time"{ - 001{"Pacific/Kiritimati"} - KI{"Pacific/Kiritimati"} - ZZ{"Etc/GMT-14"} - } - "Lord Howe Standard Time"{ - 001{"Australia/Lord_Howe"} - AU{"Australia/Lord_Howe"} - } - "Magadan Standard Time"{ - 001{"Asia/Magadan"} - RU{"Asia/Magadan"} - } - "Marquesas Standard Time"{ - 001{"Pacific/Marquesas"} - PF{"Pacific/Marquesas"} - } - "Mauritius Standard Time"{ - 001{"Indian/Mauritius"} - MU{"Indian/Mauritius"} - RE{"Indian/Reunion"} - SC{"Indian/Mahe"} - } - "Middle East Standard Time"{ - 001{"Asia/Beirut"} - LB{"Asia/Beirut"} - } - "Montevideo Standard Time"{ - 001{"America/Montevideo"} - UY{"America/Montevideo"} - } - "Morocco Standard Time"{ - 001{"Africa/Casablanca"} - EH{"Africa/El_Aaiun"} - MA{"Africa/Casablanca"} - } - "Mountain Standard Time (Mexico)"{ - 001{"America/Chihuahua"} - MX{"America/Chihuahua America/Mazatlan"} - } - "Mountain Standard Time"{ - 001{"America/Denver"} - CA{ - "America/Edmonton America/Cambridge_Bay America/Inuvik America/Yellow" - "knife" - } - MX{"America/Ojinaga"} - US{"America/Denver America/Boise"} - ZZ{"MST7MDT"} - } - "Myanmar Standard Time"{ - 001{"Asia/Rangoon"} - CC{"Indian/Cocos"} - MM{"Asia/Rangoon"} - } - "N. Central Asia Standard Time"{ - 001{"Asia/Novosibirsk"} - RU{"Asia/Novosibirsk"} - } - "Namibia Standard Time"{ - 001{"Africa/Windhoek"} - NA{"Africa/Windhoek"} - } - "Nepal Standard Time"{ - 001{"Asia/Katmandu"} - NP{"Asia/Katmandu"} - } - "New Zealand Standard Time"{ - 001{"Pacific/Auckland"} - AQ{"Antarctica/McMurdo"} - NZ{"Pacific/Auckland"} - } - "Newfoundland Standard Time"{ - 001{"America/St_Johns"} - CA{"America/St_Johns"} - } - "Norfolk Standard Time"{ - 001{"Pacific/Norfolk"} - NF{"Pacific/Norfolk"} - } - "North Asia East Standard Time"{ - 001{"Asia/Irkutsk"} - RU{"Asia/Irkutsk"} - } - "North Asia Standard Time"{ - 001{"Asia/Krasnoyarsk"} - RU{"Asia/Krasnoyarsk Asia/Novokuznetsk"} - } - "North Korea Standard Time"{ - 001{"Asia/Pyongyang"} - KP{"Asia/Pyongyang"} - } - "Omsk Standard Time"{ - 001{"Asia/Omsk"} - RU{"Asia/Omsk"} - } - "Pacific SA Standard Time"{ - 001{"America/Santiago"} - AQ{"Antarctica/Palmer"} - CL{"America/Santiago"} - } - "Pacific Standard Time (Mexico)"{ - 001{"America/Tijuana"} - MX{"America/Tijuana America/Santa_Isabel"} - } - "Pacific Standard Time"{ - 001{"America/Los_Angeles"} - CA{"America/Vancouver America/Dawson America/Whitehorse"} - US{"America/Los_Angeles"} - ZZ{"PST8PDT"} - } - "Pakistan Standard Time"{ - 001{"Asia/Karachi"} - PK{"Asia/Karachi"} - } - "Paraguay Standard Time"{ - 001{"America/Asuncion"} - PY{"America/Asuncion"} - } - "Romance Standard Time"{ - 001{"Europe/Paris"} - BE{"Europe/Brussels"} - DK{"Europe/Copenhagen"} - ES{"Europe/Madrid Africa/Ceuta"} - FR{"Europe/Paris"} - } - "Russia Time Zone 10"{ - 001{"Asia/Srednekolymsk"} - RU{"Asia/Srednekolymsk"} - } - "Russia Time Zone 11"{ - 001{"Asia/Kamchatka"} - RU{"Asia/Kamchatka Asia/Anadyr"} - } - "Russia Time Zone 3"{ - 001{"Europe/Samara"} - RU{"Europe/Samara"} - } - "Russian Standard Time"{ - 001{"Europe/Moscow"} - RU{"Europe/Moscow Europe/Kirov Europe/Volgograd"} - UA{"Europe/Simferopol"} - } - "SA Eastern Standard Time"{ - 001{"America/Cayenne"} - AQ{"Antarctica/Rothera"} - BR{ - "America/Fortaleza America/Belem America/Maceio America/Recife Americ" - "a/Santarem" - } - FK{"Atlantic/Stanley"} - GF{"America/Cayenne"} - SR{"America/Paramaribo"} - ZZ{"Etc/GMT+3"} - } - "SA Pacific Standard Time"{ - 001{"America/Bogota"} - BR{"America/Rio_Branco America/Eirunepe"} - CA{"America/Coral_Harbour"} - CO{"America/Bogota"} - EC{"America/Guayaquil"} - JM{"America/Jamaica"} - KY{"America/Cayman"} - PA{"America/Panama"} - PE{"America/Lima"} - ZZ{"Etc/GMT+5"} - } - "SA Western Standard Time"{ - 001{"America/La_Paz"} - AG{"America/Antigua"} - AI{"America/Anguilla"} - AW{"America/Aruba"} - BB{"America/Barbados"} - BL{"America/St_Barthelemy"} - BO{"America/La_Paz"} - BQ{"America/Kralendijk"} - BR{"America/Manaus America/Boa_Vista America/Porto_Velho"} - CA{"America/Blanc-Sablon"} - CW{"America/Curacao"} - DM{"America/Dominica"} - DO{"America/Santo_Domingo"} - GD{"America/Grenada"} - GP{"America/Guadeloupe"} - GY{"America/Guyana"} - KN{"America/St_Kitts"} - LC{"America/St_Lucia"} - MF{"America/Marigot"} - MQ{"America/Martinique"} - MS{"America/Montserrat"} - PR{"America/Puerto_Rico"} - SX{"America/Lower_Princes"} - TT{"America/Port_of_Spain"} - VC{"America/St_Vincent"} - VG{"America/Tortola"} - VI{"America/St_Thomas"} - ZZ{"Etc/GMT+4"} - } - "SE Asia Standard Time"{ - 001{"Asia/Bangkok"} - AQ{"Antarctica/Davis"} - CX{"Indian/Christmas"} - ID{"Asia/Jakarta Asia/Pontianak"} - KH{"Asia/Phnom_Penh"} - LA{"Asia/Vientiane"} - TH{"Asia/Bangkok"} - VN{"Asia/Saigon"} - ZZ{"Etc/GMT-7"} - } - "Saint Pierre Standard Time"{ - 001{"America/Miquelon"} - PM{"America/Miquelon"} - } - "Sakhalin Standard Time"{ - 001{"Asia/Sakhalin"} - RU{"Asia/Sakhalin"} - } - "Samoa Standard Time"{ - 001{"Pacific/Apia"} - WS{"Pacific/Apia"} - } - "Singapore Standard Time"{ - 001{"Asia/Singapore"} - BN{"Asia/Brunei"} - ID{"Asia/Makassar"} - MY{"Asia/Kuala_Lumpur Asia/Kuching"} - PH{"Asia/Manila"} - SG{"Asia/Singapore"} - ZZ{"Etc/GMT-8"} - } - "South Africa Standard Time"{ - 001{"Africa/Johannesburg"} - BI{"Africa/Bujumbura"} - BW{"Africa/Gaborone"} - CD{"Africa/Lubumbashi"} - LS{"Africa/Maseru"} - MW{"Africa/Blantyre"} - MZ{"Africa/Maputo"} - RW{"Africa/Kigali"} - SZ{"Africa/Mbabane"} - ZA{"Africa/Johannesburg"} - ZM{"Africa/Lusaka"} - ZW{"Africa/Harare"} - ZZ{"Etc/GMT-2"} - } - "Sri Lanka Standard Time"{ - 001{"Asia/Colombo"} - LK{"Asia/Colombo"} - } - "Syria Standard Time"{ - 001{"Asia/Damascus"} - SY{"Asia/Damascus"} - } - "Taipei Standard Time"{ - 001{"Asia/Taipei"} - TW{"Asia/Taipei"} - } - "Tasmania Standard Time"{ - 001{"Australia/Hobart"} - AU{"Australia/Hobart Australia/Currie"} - } - "Tocantins Standard Time"{ - 001{"America/Araguaina"} - BR{"America/Araguaina"} - } - "Tokyo Standard Time"{ - 001{"Asia/Tokyo"} - ID{"Asia/Jayapura"} - JP{"Asia/Tokyo"} - PW{"Pacific/Palau"} - TL{"Asia/Dili"} - ZZ{"Etc/GMT-9"} - } - "Tomsk Standard Time"{ - 001{"Asia/Tomsk"} - RU{"Asia/Tomsk"} - } - "Tonga Standard Time"{ - 001{"Pacific/Tongatapu"} - KI{"Pacific/Enderbury"} - TK{"Pacific/Fakaofo"} - TO{"Pacific/Tongatapu"} - ZZ{"Etc/GMT-13"} - } - "Transbaikal Standard Time"{ - 001{"Asia/Chita"} - RU{"Asia/Chita"} - } - "Turkey Standard Time"{ - 001{"Europe/Istanbul"} - TR{"Europe/Istanbul"} - } - "Turks And Caicos Standard Time"{ - 001{"America/Grand_Turk"} - TC{"America/Grand_Turk"} - } - "US Eastern Standard Time"{ - 001{"America/Indianapolis"} - US{"America/Indianapolis America/Indiana/Marengo America/Indiana/Vevay"} - } - "US Mountain Standard Time"{ - 001{"America/Phoenix"} - CA{"America/Dawson_Creek America/Creston America/Fort_Nelson"} - MX{"America/Hermosillo"} - US{"America/Phoenix"} - ZZ{"Etc/GMT+7"} - } - "UTC"{ - 001{"Etc/GMT"} - GL{"America/Danmarkshavn"} - ZZ{"Etc/GMT"} - } - "UTC+12"{ - 001{"Etc/GMT-12"} - KI{"Pacific/Tarawa"} - MH{"Pacific/Majuro Pacific/Kwajalein"} - NR{"Pacific/Nauru"} - TV{"Pacific/Funafuti"} - UM{"Pacific/Wake"} - WF{"Pacific/Wallis"} - ZZ{"Etc/GMT-12"} - } - "UTC-02"{ - 001{"Etc/GMT+2"} - BR{"America/Noronha"} - GS{"Atlantic/South_Georgia"} - ZZ{"Etc/GMT+2"} - } - "UTC-08"{ - 001{"Etc/GMT+8"} - PN{"Pacific/Pitcairn"} - ZZ{"Etc/GMT+8"} - } - "UTC-09"{ - 001{"Etc/GMT+9"} - PF{"Pacific/Gambier"} - ZZ{"Etc/GMT+9"} - } - "UTC-11"{ - 001{"Etc/GMT+11"} - AS{"Pacific/Pago_Pago"} - NU{"Pacific/Niue"} - UM{"Pacific/Midway"} - ZZ{"Etc/GMT+11"} - } - "Ulaanbaatar Standard Time"{ - 001{"Asia/Ulaanbaatar"} - MN{"Asia/Ulaanbaatar Asia/Choibalsan"} - } - "Venezuela Standard Time"{ - 001{"America/Caracas"} - VE{"America/Caracas"} - } - "Vladivostok Standard Time"{ - 001{"Asia/Vladivostok"} - RU{"Asia/Vladivostok Asia/Ust-Nera"} - } - "W. Australia Standard Time"{ - 001{"Australia/Perth"} - AU{"Australia/Perth"} - } - "W. Central Africa Standard Time"{ - 001{"Africa/Lagos"} - AO{"Africa/Luanda"} - BJ{"Africa/Porto-Novo"} - CD{"Africa/Kinshasa"} - CF{"Africa/Bangui"} - CG{"Africa/Brazzaville"} - CM{"Africa/Douala"} - DZ{"Africa/Algiers"} - GA{"Africa/Libreville"} - GQ{"Africa/Malabo"} - NE{"Africa/Niamey"} - NG{"Africa/Lagos"} - TD{"Africa/Ndjamena"} - TN{"Africa/Tunis"} - ZZ{"Etc/GMT-1"} - } - "W. Europe Standard Time"{ - 001{"Europe/Berlin"} - AD{"Europe/Andorra"} - AT{"Europe/Vienna"} - CH{"Europe/Zurich"} - DE{"Europe/Berlin Europe/Busingen"} - GI{"Europe/Gibraltar"} - IT{"Europe/Rome"} - LI{"Europe/Vaduz"} - LU{"Europe/Luxembourg"} - MC{"Europe/Monaco"} - MT{"Europe/Malta"} - NL{"Europe/Amsterdam"} - NO{"Europe/Oslo"} - SE{"Europe/Stockholm"} - SJ{"Arctic/Longyearbyen"} - SM{"Europe/San_Marino"} - VA{"Europe/Vatican"} - } - "W. Mongolia Standard Time"{ - 001{"Asia/Hovd"} - MN{"Asia/Hovd"} - } - "West Asia Standard Time"{ - 001{"Asia/Tashkent"} - AQ{"Antarctica/Mawson"} - KZ{"Asia/Oral Asia/Aqtau Asia/Aqtobe Asia/Atyrau"} - MV{"Indian/Maldives"} - TF{"Indian/Kerguelen"} - TJ{"Asia/Dushanbe"} - TM{"Asia/Ashgabat"} - UZ{"Asia/Tashkent Asia/Samarkand"} - ZZ{"Etc/GMT-5"} - } - "West Bank Standard Time"{ - 001{"Asia/Hebron"} - PS{"Asia/Hebron Asia/Gaza"} - } - "West Pacific Standard Time"{ - 001{"Pacific/Port_Moresby"} - AQ{"Antarctica/DumontDUrville"} - FM{"Pacific/Truk"} - GU{"Pacific/Guam"} - MP{"Pacific/Saipan"} - PG{"Pacific/Port_Moresby"} - ZZ{"Etc/GMT-10"} - } - "Yakutsk Standard Time"{ - 001{"Asia/Yakutsk"} - RU{"Asia/Yakutsk Asia/Khandyga"} - } - } -} diff --git a/Build/source/libs/icu/icu-src/source/data/misc/zoneinfo64.txt b/Build/source/libs/icu/icu-src/source/data/misc/zoneinfo64.txt deleted file mode 100644 index ed5bc311ad2..00000000000 --- a/Build/source/libs/icu/icu-src/source/data/misc/zoneinfo64.txt +++ /dev/null @@ -1,3807 +0,0 @@ -//--------------------------------------------------------- -// Copyright (C) 2016 and later: Unicode, Inc. and others. -// License & terms of use: http://www.unicode.org/copyright.html#License -//--------------------------------------------------------- -// Build tool: tz2icu -// Build date: Tue Nov 29 01:50:23 2016 -// tz database: ftp://ftp.iana.org/tz/ -// tz version: 2016j -// ICU version: 58.1 -//--------------------------------------------------------- -// >> !!! >> THIS IS A MACHINE-GENERATED FILE << !!! << -// >> !!! >>> DO NOT EDIT <<< !!! << -//--------------------------------------------------------- - -zoneinfo64:table(nofallback) { - TZVersion { "2016j" } - Zones:array { - /* ACT */ :int { 353 } //Z#0 - /* AET */ :int { 365 } //Z#1 - /* AGT */ :int { 64 } //Z#2 - /* ART */ :int { 18 } //Z#3 - /* AST */ :int { 60 } //Z#4 - /* Africa/Abidjan */ :table { - trans:intvector { -1830383032 } - typeOffsets:intvector { -968, 0, 0, 0 } - typeMap:bin { "01" } - links:intvector { 5, 11, 13, 21, 22, 27, 38, 51, 52, 54, 55, 345 } - } //Z#5 - /* Africa/Accra */ :table { - trans:intvector { -1640995148, -1556841600, -1546388400, -1525305600, -1514852400, -1493769600, -1483316400, -1462233600, -1451780400, -1430611200, -1420158000, -1399075200, -1388622000, -1367539200, -1357086000, -1336003200, -1325550000, -1304380800, -1293927600, -1272844800, -1262391600, -1241308800, -1230855600, -1209772800, -1199319600, -1178150400, -1167697200, -1146614400, -1136161200, -1115078400, -1104625200, -1083542400, -1073089200, -1051920000, -1041466800, -1020384000, -1009930800, -988848000, -978394800, -957312000, -946858800, -925689600, -915236400, -894153600, -883700400, -862617600, -852164400 } - typeOffsets:intvector { -52, 0, 0, 0, 0, 1200 } - typeMap:bin { "0102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201" } - } //Z#6 - /* Africa/Addis_Ababa */ :int { 48 } //Z#7 - /* Africa/Algiers */ :table { - transPre32:intvector { -1, 1808288224 } - trans:intvector { -1855958961, -1689814800, -1680397200, -1665363600, -1648342800, -1635123600, -1616893200, -1604278800, -1585443600, -1574038800, -1552266000, -1539997200, -1531443600, -956365200, -950486400, -942012000, -812502000, -796262400, -781052400, -766630800, -733280400, -439430400, -212029200, 41468400, 54774000, 231724800, 246236400, 259545600, 275274000, 309740400, 325468800, 341802000, 357523200 } - typeOffsets:intvector { 732, 0, 0, 0, 0, 3600, 561, 0, 3600, 0, 3600, 3600 } - typeMap:bin { "03010201020102010201020102010201040504050401040102010204050401020104" } - } //Z#8 - /* Africa/Asmara */ :int { 48 } //Z#9 - /* Africa/Asmera */ :int { 48 } //Z#10 - /* Africa/Bamako */ :int { 5 } //Z#11 - /* Africa/Bangui */ :int { 36 } //Z#12 - /* Africa/Banjul */ :int { 5 } //Z#13 - /* Africa/Bissau */ :table { - trans:intvector { -1830380260, 157770000 } - typeOffsets:intvector { -3740, 0, -3600, 0, 0, 0 } - typeMap:bin { "0102" } - } //Z#14 - /* Africa/Blantyre */ :int { 43 } //Z#15 - /* Africa/Brazzaville */ :int { 36 } //Z#16 - /* Africa/Bujumbura */ :int { 43 } //Z#17 - /* Africa/Cairo */ :table { - transPre32:intvector { -1, 2109558187 } - trans:intvector { -929844000, -923108400, -906170400, -892868400, -875844000, -857790000, -844308000, -825822000, -812685600, -794199600, -779853600, -762663600, -399088800, -386650800, -368330400, -355114800, -336790800, -323654400, -305168400, -292032000, -273632400, -260496000, -242096400, -228960000, -210560400, -197424000, -178938000, -165801600, -147402000, -134265600, -115866000, -102643200, -84330000, -71107200, -52707600, -39484800, -21171600, -7948800, 10364400, 23587200, 41900400, 55123200, 73522800, 86745600, 105058800, 118281600, 136594800, 149817600, 168130800, 181353600, 199753200, 212976000, 231289200, 244512000, 262825200, 276048000, 294361200, 307584000, 325983600, 339206400, 357519600, 370742400, 396399600, 402278400, 426812400, 433814400, 452214000, 465436800, 483750000, 496972800, 515286000, 528508800, 546822000, 560044800, 578444400, 591667200, 610412400, 623203200, 641516400, 654739200, 673052400, 686275200, 704674800, 717897600, 736210800, 749433600, 767746800, 780969600, 799020000, 812322000, 830469600, 843771600, 861919200, 875221200, 893368800, 906670800, 925423200, 938725200, 956872800, 970174800, 988322400, 1001624400, 1019772000, 1033074000, 1051221600, 1064523600, 1083276000, 1096578000, 1114725600, 1128027600, 1146175200, 1158872400, 1177624800, 1189112400, 1209074400, 1219957200, 1240524000, 1250802000, 1272578400, 1281474000, 1284069600, 1285880400, 1400191200, 1403816400, 1406844000, 1411678800 } - typeOffsets:intvector { 7509, 0, 7200, 0, 7200, 3600 } - typeMap:bin { "01020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201" } - links:intvector { 3, 18, 399 } - } //Z#18 - /* Africa/Casablanca */ :table { - trans:intvector { -1773012580, -956361600, -950490000, -942019200, -761187600, -617241600, -605149200, -81432000, -71110800, 141264000, 147222000, 199756800, 207702000, 231292800, 244249200, 265507200, 271033200, 448243200, 504918000, 1212278400, 1220223600, 1243814400, 1250809200, 1272758400, 1281222000, 1301788800, 1312066800, 1335664800, 1342749600, 1345428000, 1348970400, 1367114400, 1373162400, 1376100000, 1382839200, 1396144800, 1403920800, 1406944800, 1414288800, 1427594400, 1434247200, 1437271200, 1445738400, 1459044000, 1465092000, 1468116000, 1477792800, 1490493600, 1495332000, 1498960800, 1509242400, 1521943200, 1526176800, 1529200800, 1540692000, 1553997600, 1557021600, 1560045600, 1572141600, 1585447200, 1587261600, 1590285600, 1603591200, 1616896800, 1618106400, 1621130400, 1635645600, 1651975200, 1667095200, 1682215200, 1698544800, 1713060000, 1729994400, 1743904800, 1761444000, 1774749600, 1792893600, 1806199200, 1824948000, 1837648800, 1856397600, 1869098400, 1887847200, 1901152800, 1919296800, 1932602400, 1950746400, 1964052000, 1982800800, 1995501600, 2014250400, 2026951200, 2045700000, 2058400800, 2077149600, 2090455200, 2107994400, 2121904800, 2138234400 } - transPost32:intvector { 0, -2141612896, 0, -2122864096 } - typeOffsets:intvector { -1820, 0, 0, 0, 0, 3600, 3600, 0 } - typeMap:bin { "0102010201020102010201020102010201030102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201" } - finalRule { "Morocco" } - finalRaw:int { 0 } - finalYear:int { 2039 } - } //Z#19 - /* Africa/Ceuta */ :table { - transPre32:intvector { -1, 2117515772 } - trans:intvector { -1630112400, -1616810400, -1442451600, -1427677200, -1379293200, -1364778000, -1348448400, -1333328400, -1316394000, -1301274000, -81432000, -71110800, 141264000, 147222000, 199756800, 207702000, 231292800, 244249200, 265507200, 271033200, 448243200, 512528400, 528253200, 543978000, 559702800, 575427600, 591152400, 606877200, 622602000, 638326800, 654656400, 670381200, 686106000, 701830800, 717555600, 733280400, 749005200, 764730000, 780454800, 796179600, 811904400, 828234000, 846378000 } - typeOffsets:intvector { -1276, 0, 0, 0, 0, 3600, 3600, 0, 3600, 3600 } - typeMap:bin { "0102010201020102010201020102010201020102010304030403040304030403040304030403040304030403" } - finalRule { "EU" } - finalRaw:int { 3600 } - finalYear:int { 1997 } - } //Z#20 - /* Africa/Conakry */ :int { 5 } //Z#21 - /* Africa/Dakar */ :int { 5 } //Z#22 - /* Africa/Dar_es_Salaam */ :int { 48 } //Z#23 - /* Africa/Djibouti */ :int { 48 } //Z#24 - /* Africa/Douala */ :int { 36 } //Z#25 - /* Africa/El_Aaiun */ :table { - trans:intvector { -1136070432, 198291600, 199756800, 207702000, 231292800, 244249200, 265507200, 271033200, 1212278400, 1220223600, 1243814400, 1250809200, 1272758400, 1281222000, 1301788800, 1312066800, 1335664800, 1342749600, 1345428000, 1348970400, 1367114400, 1373162400, 1376100000, 1382839200, 1396144800, 1403920800, 1406944800, 1414288800, 1427594400, 1434247200, 1437271200, 1445738400, 1459044000, 1465092000, 1468116000, 1477792800, 1490493600, 1495332000, 1498960800, 1509242400, 1521943200, 1526176800, 1529200800, 1540692000, 1553997600, 1557021600, 1560045600, 1572141600, 1585447200, 1587261600, 1590285600, 1603591200, 1616896800, 1618106400, 1621130400, 1635645600, 1651975200, 1667095200, 1682215200, 1698544800, 1713060000, 1729994400, 1743904800, 1761444000, 1774749600, 1792893600, 1806199200, 1824948000, 1837648800, 1856397600, 1869098400, 1887847200, 1901152800, 1919296800, 1932602400, 1950746400, 1964052000, 1982800800, 1995501600, 2014250400, 2026951200, 2045700000, 2058400800, 2077149600, 2090455200, 2107994400, 2121904800, 2138234400 } - transPost32:intvector { 0, -2141612896, 0, -2122864096 } - typeOffsets:intvector { -3168, 0, -3600, 0, 0, 0, 0, 3600 } - typeMap:bin { "010203020302030203020302030203020302030203020302030203020302030203020302030203020302030203020302030203020302030203020302030203020302030203020302030203020302030203020302030203020302" } - finalRule { "Morocco" } - finalRaw:int { 0 } - finalYear:int { 2039 } - } //Z#26 - /* Africa/Freetown */ :int { 5 } //Z#27 - /* Africa/Gaborone */ :int { 43 } //Z#28 - /* Africa/Harare */ :int { 43 } //Z#29 - /* Africa/Johannesburg */ :table { - transPre32:intvector { -1, 1836794176 } - trans:intvector { -2109288600, -860976000, -845254800, -829526400, -813805200 } - typeOffsets:intvector { 6720, 0, 5400, 0, 7200, 0, 7200, 3600 } - typeMap:bin { "010203020302" } - links:intvector { 30, 44, 45 } - } //Z#30 - /* Africa/Juba */ :int { 33 } //Z#31 - /* Africa/Kampala */ :int { 48 } //Z#32 - /* Africa/Khartoum */ :table { - trans:intvector { -1230775808, 10360800, 24786000, 41810400, 56322000, 73432800, 87944400, 104882400, 119480400, 136332000, 151016400, 167781600, 182552400, 199231200, 214174800, 230680800, 245710800, 262735200, 277246800, 294184800, 308782800, 325634400, 340405200, 357084000, 371941200, 388533600, 403477200, 419983200, 435013200, 452037600, 466635600, 483487200, 498171600, 947930400 } - typeOffsets:intvector { 7808, 0, 7200, 0, 7200, 3600, 10800, 0 } - typeMap:bin { "01020102010201020102010201020102010201020102010201020102010201020103" } - links:intvector { 31, 33 } - } //Z#33 - /* Africa/Kigali */ :int { 43 } //Z#34 - /* Africa/Kinshasa */ :int { 36 } //Z#35 - /* Africa/Lagos */ :table { - trans:intvector { -1588464816 } - typeOffsets:intvector { 816, 0, 3600, 0 } - typeMap:bin { "01" } - links:intvector { 12, 16, 25, 35, 36, 37, 39, 42, 50, 53 } - } //Z#36 - /* Africa/Libreville */ :int { 36 } //Z#37 - /* Africa/Lome */ :int { 5 } //Z#38 - /* Africa/Luanda */ :int { 36 } //Z#39 - /* Africa/Lubumbashi */ :int { 43 } //Z#40 - /* Africa/Lusaka */ :int { 43 } //Z#41 - /* Africa/Malabo */ :int { 36 } //Z#42 - /* Africa/Maputo */ :table { - trans:intvector { -2109291020 } - typeOffsets:intvector { 7820, 0, 7200, 0 } - typeMap:bin { "01" } - links:intvector { 15, 17, 28, 29, 34, 40, 41, 43, 376 } - } //Z#43 - /* Africa/Maseru */ :int { 30 } //Z#44 - /* Africa/Mbabane */ :int { 30 } //Z#45 - /* Africa/Mogadishu */ :int { 48 } //Z#46 - /* Africa/Monrovia */ :table { - trans:intvector { -1604359012, 73529070 } - typeOffsets:intvector { -2588, 0, -2670, 0, 0, 0 } - typeMap:bin { "0102" } - } //Z#47 - /* Africa/Nairobi */ :table { - trans:intvector { -1309746436, -1262314800, -946780200, -315629100 } - typeOffsets:intvector { 8836, 0, 9000, 0, 9900, 0, 10800, 0 } - typeMap:bin { "03010203" } - links:intvector { 7, 9, 10, 23, 24, 32, 46, 48, 394, 513, 517, 522 } - } //Z#48 - /* Africa/Ndjamena */ :table { - trans:intvector { -1830387612, 308703600, 321314400 } - typeOffsets:intvector { 3612, 0, 3600, 0, 3600, 3600 } - typeMap:bin { "010201" } - } //Z#49 - /* Africa/Niamey */ :int { 36 } //Z#50 - /* Africa/Nouakchott */ :int { 5 } //Z#51 - /* Africa/Ouagadougou */ :int { 5 } //Z#52 - /* Africa/Porto-Novo */ :int { 36 } //Z#53 - /* Africa/Sao_Tome */ :int { 5 } //Z#54 - /* Africa/Timbuktu */ :int { 5 } //Z#55 - /* Africa/Tripoli */ :table { - trans:intvector { -1577926364, -574902000, -568087200, -512175600, -504928800, -449888400, -441856800, -347158800, 378684000, 386463600, 402271200, 417999600, 433807200, 449622000, 465429600, 481590000, 496965600, 512953200, 528674400, 544230000, 560037600, 575852400, 591660000, 607388400, 623196000, 641775600, 844034400, 860108400, 875916000, 1352505600, 1364515200, 1382659200 } - typeOffsets:intvector { 3164, 0, 3600, 0, 3600, 3600, 7200, 0 } - typeMap:bin { "0102010201020103010201020102010201020102010201020103010203010203" } - links:intvector { 56, 530 } - } //Z#56 - /* Africa/Tunis */ :table { - transPre32:intvector { -1, 1497764852 } - trans:intvector { -1855958961, -969242400, -950493600, -941940000, -891136800, -877827600, -857257200, -844556400, -842918400, -842223600, -828230400, -812502000, -796269600, -781052400, -766634400, 231202800, 243903600, 262825200, 276044400, 581122800, 591145200, 606870000, 622594800, 641516400, 654649200, 1114902000, 1128038400, 1143334800, 1162083600, 1174784400, 1193533200, 1206838800, 1224982800 } - typeOffsets:intvector { 2444, 0, 561, 0, 3600, 0, 3600, 3600 } - typeMap:bin { "01020302030203020302030203020302030203020302030203020302030203020302" } - } //Z#57 - /* Africa/Windhoek */ :table { - transPre32:intvector { -1, 1836796792 } - trans:intvector { -2109288600, -860976000, -845254800, 765324000, 778640400, 796780800, 810090000 } - typeOffsets:intvector { 4104, 0, 3600, 0, 3600, 3600, 5400, 0, 7200, 0, 7200, 3600 } - typeMap:bin { "0304050401020102" } - finalRule { "Namibia" } - finalRaw:int { 3600 } - finalYear:int { 1996 } - } //Z#58 - /* America/Adak */ :table { - transPre32:intvector { -1, 1069611295, -1, 2106022494 } - trans:intvector { -880196400, -765374400, -21466800, -5745600, 9982800, 25704000, 41432400, 57758400, 73486800, 89208000, 104936400, 120657600, 126709200, 152107200, 162392400, 183556800, 199285200, 215611200, 230734800, 247060800, 262789200, 278510400, 294238800, 309960000, 325688400, 341409600, 357138000, 372859200, 388587600, 404913600, 420037200, 436363200, 452088000, 467809200, 483537600, 499258800, 514987200, 530708400, 544622400, 562158000, 576072000, 594212400, 607521600, 625662000, 638971200, 657111600, 671025600, 688561200, 702475200, 720010800, 733924800, 752065200, 765374400, 783514800, 796824000, 814964400, 828878400, 846414000, 860328000, 877863600, 891777600, 909313200, 923227200, 941367600, 954676800, 972817200, 986126400, 1004266800, 1018180800, 1035716400, 1049630400, 1067166000, 1081080000, 1099220400, 1112529600, 1130670000, 1143979200, 1162119600, 1173614400, 1194174000 } - typeOffsets:intvector { 44001, 0, -42398, 0, -39600, 0, -39600, 3600, -36000, 0, -36000, 3600 } - typeMap:bin { "01020302030203020302030203020302030203020302030203020302030203020304050405040504050405040504050405040504050405040504050405040504050405040504050405040504050405040504" } - finalRule { "US" } - finalRaw:int { -36000 } - finalYear:int { 2008 } - links:intvector { 59, 80, 614 } - } //Z#59 - /* America/Anchorage */ :table { - transPre32:intvector { -1, 1069604872, -1, 2106016072 } - trans:intvector { -880200000, -765378000, -21470400, -5749200, 9979200, 25700400, 41428800, 57754800, 73483200, 89204400, 104932800, 120654000, 126705600, 152103600, 162388800, 183553200, 199281600, 215607600, 230731200, 247057200, 262785600, 278506800, 294235200, 309956400, 325684800, 341406000, 357134400, 372855600, 388584000, 404910000, 420033600, 436359600, 452084400, 467805600, 483534000, 499255200, 514983600, 530704800, 544618800, 562154400, 576068400, 594208800, 607518000, 625658400, 638967600, 657108000, 671022000, 688557600, 702471600, 720007200, 733921200, 752061600, 765370800, 783511200, 796820400, 814960800, 828874800, 846410400, 860324400, 877860000, 891774000, 909309600, 923223600, 941364000, 954673200, 972813600, 986122800, 1004263200, 1018177200, 1035712800, 1049626800, 1067162400, 1081076400, 1099216800, 1112526000, 1130666400, 1143975600, 1162116000, 1173610800, 1194170400 } - typeOffsets:intvector { 50424, 0, -36000, 0, -36000, 3600, -35976, 0, -32400, 0, -32400, 3600 } - typeMap:bin { "03010201020102010201020102010201020102010201020102010201020102010204050405040504050405040504050405040504050405040504050405040504050405040504050405040504050405040504" } - finalRule { "US" } - finalRaw:int { -32400 } - finalYear:int { 2008 } - links:intvector { 4, 60, 613 } - } //Z#60 - /* America/Anguilla */ :int { 186 } //Z#61 - /* America/Antigua */ :int { 186 } //Z#62 - /* America/Araguaina */ :table { - trans:intvector { -1767214032, -1206957600, -1191362400, -1175374800, -1159826400, -633819600, -622069200, -602283600, -591832800, -570747600, -560210400, -539125200, -531352800, -191365200, -184197600, -155163600, -150069600, -128898000, -121125600, -99954000, -89589600, -68418000, -57967200, 499748400, 511236000, 530593200, 540266400, 562129200, 571197600, 592974000, 602042400, 624423600, 634701600, 813726000, 824004000, 844570800, 856058400, 876106800, 888717600, 908074800, 919562400, 938919600, 951616800, 970974000, 982461600, 1003028400, 1013911200, 1036292400, 1045360800, 1350788400, 1361066400 } - typeOffsets:intvector { -11568, 0, -10800, 0, -10800, 3600 } - typeMap:bin { "010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201" } - } //Z#63 - /* America/Argentina/Buenos_Aires */ :table { - transPre32:intvector { -1, 1922869324 } - trans:intvector { -1567453392, -1233432000, -1222981200, -1205956800, -1194037200, -1172865600, -1162501200, -1141329600, -1130965200, -1109793600, -1099429200, -1078257600, -1067806800, -1046635200, -1036270800, -1015099200, -1004734800, -983563200, -973198800, -952027200, -941576400, -931032000, -900882000, -890337600, -833749200, -827265600, -752274000, -733780800, -197326800, -190843200, -184194000, -164491200, -152658000, -132955200, -121122000, -101419200, -86821200, -71092800, -54766800, -39038400, -23317200, -7588800, 128142000, 136605600, 596948400, 605066400, 624423600, 636516000, 656478000, 667965600, 687927600, 699415200, 719377200, 731469600, 938919600, 952052400, 1198983600, 1205632800, 1224385200, 1237082400 } - typeOffsets:intvector { -14028, 0, -15408, 0, -14400, 0, -14400, 3600, -10800, 0, -10800, 3600 } - typeMap:bin { "01020302030203020302030203020302030203020302030203020302030203020302030203020302030204050405040504050405040504030405040504" } - links:intvector { 2, 64, 90 } - } //Z#64 - /* America/Argentina/Catamarca */ :table { - transPre32:intvector { -1, 1922871084 } - trans:intvector { -1567453392, -1233432000, -1222981200, -1205956800, -1194037200, -1172865600, -1162501200, -1141329600, -1130965200, -1109793600, -1099429200, -1078257600, -1067806800, -1046635200, -1036270800, -1015099200, -1004734800, -983563200, -973198800, -952027200, -941576400, -931032000, -900882000, -890337600, -833749200, -827265600, -752274000, -733780800, -197326800, -190843200, -184194000, -164491200, -152658000, -132955200, -121122000, -101419200, -86821200, -71092800, -54766800, -39038400, -23317200, -7588800, 128142000, 136605600, 596948400, 605066400, 624423600, 636516000, 656478000, 667965600, 687931200, 699415200, 719377200, 731469600, 938919600, 952052400, 1086058800, 1087704000, 1198983600, 1205632800 } - typeOffsets:intvector { -15788, 0, -15408, 0, -14400, 0, -14400, 3600, -10800, 0, -10800, 3600 } - typeMap:bin { "01020302030203020302030203020302030203020302030203020302030203020302030203020302030204050405040504050205040504030402040504" } - links:intvector { 65, 66, 95 } - } //Z#65 - /* America/Argentina/ComodRivadavia */ :int { 65 } //Z#66 - /* America/Argentina/Cordoba */ :table { - trans:intvector { -1567453392, -1233432000, -1222981200, -1205956800, -1194037200, -1172865600, -1162501200, -1141329600, -1130965200, -1109793600, -1099429200, -1078257600, -1067806800, -1046635200, -1036270800, -1015099200, -1004734800, -983563200, -973198800, -952027200, -941576400, -931032000, -900882000, -890337600, -833749200, -827265600, -752274000, -733780800, -197326800, -190843200, -184194000, -164491200, -152658000, -132955200, -121122000, -101419200, -86821200, -71092800, -54766800, -39038400, -23317200, -7588800, 128142000, 136605600, 596948400, 605066400, 624423600, 636516000, 656478000, 667965600, 687931200, 699415200, 719377200, 731469600, 938919600, 952052400, 1198983600, 1205632800, 1224385200, 1237082400 } - typeOffsets:intvector { -15408, 0, -14400, 0, -14400, 3600, -10800, 0, -10800, 3600 } - typeMap:bin { "010201020102010201020102010201020102010201020102010201020102010201020102010201020103040304030403040104030403020304030403" } - links:intvector { 67, 101, 196 } - } //Z#67 - /* America/Argentina/Jujuy */ :table { - transPre32:intvector { -1, 1922870968 } - trans:intvector { -1567453392, -1233432000, -1222981200, -1205956800, -1194037200, -1172865600, -1162501200, -1141329600, -1130965200, -1109793600, -1099429200, -1078257600, -1067806800, -1046635200, -1036270800, -1015099200, -1004734800, -983563200, -973198800, -952027200, -941576400, -931032000, -900882000, -890337600, -833749200, -827265600, -752274000, -733780800, -197326800, -190843200, -184194000, -164491200, -152658000, -132955200, -121122000, -101419200, -86821200, -71092800, -54766800, -39038400, -23317200, -7588800, 128142000, 136605600, 596948400, 605066400, 624423600, 636516000, 657086400, 669178800, 686721600, 699415200, 719377200, 731469600, 938919600, 952052400, 1198983600, 1205632800 } - typeOffsets:intvector { -15672, 0, -15408, 0, -14400, 0, -14400, 3600, -10800, 0, -10800, 3600 } - typeMap:bin { "0102030203020302030203020302030203020302030203020302030203020302030203020302030203020405040504050203020504050403040504" } - links:intvector { 68, 143 } - } //Z#68 - /* America/Argentina/La_Rioja */ :table { - transPre32:intvector { -1, 1922871340 } - trans:intvector { -1567453392, -1233432000, -1222981200, -1205956800, -1194037200, -1172865600, -1162501200, -1141329600, -1130965200, -1109793600, -1099429200, -1078257600, -1067806800, -1046635200, -1036270800, -1015099200, -1004734800, -983563200, -973198800, -952027200, -941576400, -931032000, -900882000, -890337600, -833749200, -827265600, -752274000, -733780800, -197326800, -190843200, -184194000, -164491200, -152658000, -132955200, -121122000, -101419200, -86821200, -71092800, -54766800, -39038400, -23317200, -7588800, 128142000, 136605600, 596948400, 605066400, 624423600, 636516000, 656478000, 667792800, 673588800, 687927600, 699415200, 719377200, 731469600, 938919600, 952052400, 1086058800, 1087704000, 1198983600, 1205632800 } - typeOffsets:intvector { -16044, 0, -15408, 0, -14400, 0, -14400, 3600, -10800, 0, -10800, 3600 } - typeMap:bin { "0102030203020302030203020302030203020302030203020302030203020302030203020302030203020405040504050405020405040504030402040504" } - } //Z#69 - /* America/Argentina/Mendoza */ :table { - transPre32:intvector { -1, 1922871812 } - trans:intvector { -1567453392, -1233432000, -1222981200, -1205956800, -1194037200, -1172865600, -1162501200, -1141329600, -1130965200, -1109793600, -1099429200, -1078257600, -1067806800, -1046635200, -1036270800, -1015099200, -1004734800, -983563200, -973198800, -952027200, -941576400, -931032000, -900882000, -890337600, -833749200, -827265600, -752274000, -733780800, -197326800, -190843200, -184194000, -164491200, -152658000, -132955200, -121122000, -101419200, -86821200, -71092800, -54766800, -39038400, -23317200, -7588800, 128142000, 136605600, 596948400, 605066400, 624423600, 636516000, 655963200, 667796400, 687499200, 699418800, 719380800, 731469600, 938919600, 952052400, 1085281200, 1096171200, 1198983600, 1205632800 } - typeOffsets:intvector { -16516, 0, -15408, 0, -14400, 0, -14400, 3600, -10800, 0, -10800, 3600 } - typeMap:bin { "01020302030203020302030203020302030203020302030203020302030203020302030203020302030204050405040502030203020504030402040504" } - links:intvector { 70, 161 } - } //Z#70 - /* America/Argentina/Rio_Gallegos */ :table { - transPre32:intvector { -1, 1922871908 } - trans:intvector { -1567453392, -1233432000, -1222981200, -1205956800, -1194037200, -1172865600, -1162501200, -1141329600, -1130965200, -1109793600, -1099429200, -1078257600, -1067806800, -1046635200, -1036270800, -1015099200, -1004734800, -983563200, -973198800, -952027200, -941576400, -931032000, -900882000, -890337600, -833749200, -827265600, -752274000, -733780800, -197326800, -190843200, -184194000, -164491200, -152658000, -132955200, -121122000, -101419200, -86821200, -71092800, -54766800, -39038400, -23317200, -7588800, 128142000, 136605600, 596948400, 605066400, 624423600, 636516000, 656478000, 667965600, 687927600, 699415200, 719377200, 731469600, 938919600, 952052400, 1086058800, 1087704000, 1198983600, 1205632800 } - typeOffsets:intvector { -16612, 0, -15408, 0, -14400, 0, -14400, 3600, -10800, 0, -10800, 3600 } - typeMap:bin { "01020302030203020302030203020302030203020302030203020302030203020302030203020302030204050405040504050405040504030402040504" } - } //Z#71 - /* America/Argentina/Salta */ :table { - transPre32:intvector { -1, 1922870996 } - trans:intvector { -1567453392, -1233432000, -1222981200, -1205956800, -1194037200, -1172865600, -1162501200, -1141329600, -1130965200, -1109793600, -1099429200, -1078257600, -1067806800, -1046635200, -1036270800, -1015099200, -1004734800, -983563200, -973198800, -952027200, -941576400, -931032000, -900882000, -890337600, -833749200, -827265600, -752274000, -733780800, -197326800, -190843200, -184194000, -164491200, -152658000, -132955200, -121122000, -101419200, -86821200, -71092800, -54766800, -39038400, -23317200, -7588800, 128142000, 136605600, 596948400, 605066400, 624423600, 636516000, 656478000, 667965600, 687931200, 699415200, 719377200, 731469600, 938919600, 952052400, 1198983600, 1205632800 } - typeOffsets:intvector { -15700, 0, -15408, 0, -14400, 0, -14400, 3600, -10800, 0, -10800, 3600 } - typeMap:bin { "0102030203020302030203020302030203020302030203020302030203020302030203020302030203020405040504050405020504050403040504" } - } //Z#72 - /* America/Argentina/San_Juan */ :table { - transPre32:intvector { -1, 1922871740 } - trans:intvector { -1567453392, -1233432000, -1222981200, -1205956800, -1194037200, -1172865600, -1162501200, -1141329600, -1130965200, -1109793600, -1099429200, -1078257600, -1067806800, -1046635200, -1036270800, -1015099200, -1004734800, -983563200, -973198800, -952027200, -941576400, -931032000, -900882000, -890337600, -833749200, -827265600, -752274000, -733780800, -197326800, -190843200, -184194000, -164491200, -152658000, -132955200, -121122000, -101419200, -86821200, -71092800, -54766800, -39038400, -23317200, -7588800, 128142000, 136605600, 596948400, 605066400, 624423600, 636516000, 656478000, 667792800, 673588800, 687927600, 699415200, 719377200, 731469600, 938919600, 952052400, 1085972400, 1090728000, 1198983600, 1205632800 } - typeOffsets:intvector { -16444, 0, -15408, 0, -14400, 0, -14400, 3600, -10800, 0, -10800, 3600 } - typeMap:bin { "0102030203020302030203020302030203020302030203020302030203020302030203020302030203020405040504050405020405040504030402040504" } - } //Z#73 - /* America/Argentina/San_Luis */ :table { - transPre32:intvector { -1, 1922871220 } - trans:intvector { -1567453392, -1233432000, -1222981200, -1205956800, -1194037200, -1172865600, -1162501200, -1141329600, -1130965200, -1109793600, -1099429200, -1078257600, -1067806800, -1046635200, -1036270800, -1015099200, -1004734800, -983563200, -973198800, -952027200, -941576400, -931032000, -900882000, -890337600, -833749200, -827265600, -752274000, -733780800, -197326800, -190843200, -184194000, -164491200, -152658000, -132955200, -121122000, -101419200, -86821200, -71092800, -54766800, -39038400, -23317200, -7588800, 128142000, 136605600, 596948400, 605066400, 624423600, 637380000, 655963200, 667796400, 675748800, 938919600, 952052400, 1085972400, 1090728000, 1198983600, 1200880800, 1205031600, 1223784000, 1236481200, 1255233600 } - typeOffsets:intvector { -15924, 0, -15408, 0, -14400, 0, -14400, 3600, -10800, 0, -10800, 3600 } - typeMap:bin { "0102030203020302030203020302030203020302030203020302030203020302030203020302030203020405040504050203020403040204050302030204" } - } //Z#74 - /* America/Argentina/Tucuman */ :table { - transPre32:intvector { -1, 1922870948 } - trans:intvector { -1567453392, -1233432000, -1222981200, -1205956800, -1194037200, -1172865600, -1162501200, -1141329600, -1130965200, -1109793600, -1099429200, -1078257600, -1067806800, -1046635200, -1036270800, -1015099200, -1004734800, -983563200, -973198800, -952027200, -941576400, -931032000, -900882000, -890337600, -833749200, -827265600, -752274000, -733780800, -197326800, -190843200, -184194000, -164491200, -152658000, -132955200, -121122000, -101419200, -86821200, -71092800, -54766800, -39038400, -23317200, -7588800, 128142000, 136605600, 596948400, 605066400, 624423600, 636516000, 656478000, 667965600, 687931200, 699415200, 719377200, 731469600, 938919600, 952052400, 1086058800, 1087099200, 1198983600, 1205632800, 1224385200, 1237082400 } - typeOffsets:intvector { -15652, 0, -15408, 0, -14400, 0, -14400, 3600, -10800, 0, -10800, 3600 } - typeMap:bin { "010203020302030203020302030203020302030203020302030203020302030203020302030203020302040504050405040502050405040304020405040504" } - } //Z#75 - /* America/Argentina/Ushuaia */ :table { - transPre32:intvector { -1, 1922871688 } - trans:intvector { -1567453392, -1233432000, -1222981200, -1205956800, -1194037200, -1172865600, -1162501200, -1141329600, -1130965200, -1109793600, -1099429200, -1078257600, -1067806800, -1046635200, -1036270800, -1015099200, -1004734800, -983563200, -973198800, -952027200, -941576400, -931032000, -900882000, -890337600, -833749200, -827265600, -752274000, -733780800, -197326800, -190843200, -184194000, -164491200, -152658000, -132955200, -121122000, -101419200, -86821200, -71092800, -54766800, -39038400, -23317200, -7588800, 128142000, 136605600, 596948400, 605066400, 624423600, 636516000, 656478000, 667965600, 687927600, 699415200, 719377200, 731469600, 938919600, 952052400, 1085886000, 1087704000, 1198983600, 1205632800 } - typeOffsets:intvector { -16392, 0, -15408, 0, -14400, 0, -14400, 3600, -10800, 0, -10800, 3600 } - typeMap:bin { "01020302030203020302030203020302030203020302030203020302030203020302030203020302030204050405040504050405040504030402040504" } - } //Z#76 - /* America/Aruba */ :int { 105 } //Z#77 - /* America/Asuncion */ :table { - trans:intvector { -1206389360, 86760000, 134017200, 181368000, 194497200, 212990400, 226033200, 244526400, 257569200, 276062400, 291783600, 307598400, 323406000, 339220800, 354942000, 370756800, 386478000, 402292800, 418014000, 433828800, 449636400, 465451200, 481172400, 496987200, 512708400, 528523200, 544244400, 560059200, 575866800, 591681600, 607402800, 625032000, 638938800, 654753600, 670474800, 686721600, 699418800, 718257600, 733546800, 749448000, 762318000, 780984000, 793767600, 812520000, 825649200, 844574400, 856666800, 876024000, 888721200, 907473600, 920775600, 938923200, 952225200, 970372800, 983674800, 1002427200, 1018148400, 1030852800, 1049598000, 1062907200, 1081047600, 1097985600, 1110682800, 1129435200, 1142132400, 1160884800, 1173582000, 1192939200, 1205031600, 1224388800, 1236481200, 1255838400, 1270954800, 1286078400, 1302404400, 1317528000, 1333854000, 1349582400, 1364094000, 1381032000 } - typeOffsets:intvector { -13840, 0, -14400, 0, -14400, 3600, -10800, 0 } - typeMap:bin { "0103010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102" } - finalRule { "Para" } - finalRaw:int { -14400 } - finalYear:int { 2014 } - } //Z#78 - /* America/Atikokan */ :table { - transPre32:intvector { -1, 1928234084 } - trans:intvector { -1632067200, -1615136400, -923248800, -765392400 } - typeOffsets:intvector { -21988, 0, -21600, 0, -21600, 3600, -18000, 0 } - typeMap:bin { "0102010203" } - links:intvector { 79, 100 } - } //Z#79 - /* America/Atka */ :int { 59 } //Z#80 - /* America/Bahia */ :table { - trans:intvector { -1767216356, -1206957600, -1191362400, -1175374800, -1159826400, -633819600, -622069200, -602283600, -591832800, -570747600, -560210400, -539125200, -531352800, -191365200, -184197600, -155163600, -150069600, -128898000, -121125600, -99954000, -89589600, -68418000, -57967200, 499748400, 511236000, 530593200, 540266400, 562129200, 571197600, 592974000, 602042400, 624423600, 634701600, 656478000, 666756000, 687927600, 697600800, 719982000, 728445600, 750826800, 761709600, 782276400, 793159200, 813726000, 824004000, 844570800, 856058400, 876106800, 888717600, 908074800, 919562400, 938919600, 951616800, 970974000, 982461600, 1003028400, 1013911200, 1036292400, 1045360800, 1318734000, 1330221600 } - typeOffsets:intvector { -9244, 0, -10800, 0, -10800, 3600 } - typeMap:bin { "01020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201" } - } //Z#81 - /* America/Bahia_Banderas */ :table { - trans:intvector { -1514739600, -1343066400, -1234807200, -1220292000, -1207159200, -1191344400, -873828000, -661539600, 28800, 828867600, 846403200, 860317200, 877852800, 891766800, 909302400, 923216400, 941356800, 954666000, 972806400, 989139600, 1001836800, 1018170000, 1035705600, 1049619600, 1067155200, 1081069200, 1099209600, 1112518800, 1130659200, 1143968400, 1162108800, 1175418000, 1193558400, 1207472400, 1225008000, 1238922000, 1256457600, 1270371600, 1288508400, 1301817600, 1319958000 } - typeOffsets:intvector { -25260, 0, -28800, 0, -25200, 0, -25200, 3600, -21600, 0, -21600, 3600 } - typeMap:bin { "0204020402040201020302030203020302030203020302030203020302030203020302030205040504" } - finalRule { "Mexico" } - finalRaw:int { -21600 } - finalYear:int { 2012 } - } //Z#82 - /* America/Barbados */ :table { - trans:intvector { -1199217691, 234943200, 244616400, 261554400, 276066000, 293004000, 307515600, 325058400, 338706000 } - typeOffsets:intvector { -14309, 0, -14400, 0, -14400, 3600 } - typeMap:bin { "010201020102010201" } - } //Z#83 - /* America/Belem */ :table { - trans:intvector { -1767213964, -1206957600, -1191362400, -1175374800, -1159826400, -633819600, -622069200, -602283600, -591832800, -570747600, -560210400, -539125200, -531352800, -191365200, -184197600, -155163600, -150069600, -128898000, -121125600, -99954000, -89589600, -68418000, -57967200, 499748400, 511236000, 530593200, 540266400, 562129200, 571197600 } - typeOffsets:intvector { -11636, 0, -10800, 0, -10800, 3600 } - typeMap:bin { "0102010201020102010201020102010201020102010201020102010201" } - } //Z#84 - /* America/Belize */ :table { - trans:intvector { -1822500432, -1616954400, -1606069800, -1585504800, -1574015400, -1554055200, -1542565800, -1522605600, -1511116200, -1490551200, -1479666600, -1459101600, -1448217000, -1427652000, -1416162600, -1396202400, -1384713000, -1364752800, -1353263400, -1333303200, -1321813800, -1301248800, -1290364200, -1269799200, -1258914600, -1238349600, -1226860200, -1206900000, -1195410600, -1175450400, -1163961000, -1143396000, -1132511400, -1111946400, -1101061800, -1080496800, -1069612200, -1049047200, -1037557800, -1017597600, -1006108200, -986148000, -974658600, -954093600, -943209000, -922644000, -911759400, -891194400, -879705000, -859744800, -848255400, 123919200, 129618000, 409039200, 413874000 } - typeOffsets:intvector { -21168, 0, -21600, 0, -21600, 1800, -21600, 3600 } - typeMap:bin { "01020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020103010301" } - } //Z#85 - /* America/Blanc-Sablon */ :table { - transPre32:intvector { -1, 1581070604 } - trans:intvector { -1632074400, -1615143600, -880221600, -765399600 } - typeOffsets:intvector { -13708, 0, -14400, 0, -14400, 3600 } - typeMap:bin { "0102010201" } - } //Z#86 - /* America/Boa_Vista */ :table { - trans:intvector { -1767211040, -1206954000, -1191358800, -1175371200, -1159822800, -633816000, -622065600, -602280000, -591829200, -570744000, -560206800, -539121600, -531349200, -191361600, -184194000, -155160000, -150066000, -128894400, -121122000, -99950400, -89586000, -68414400, -57963600, 499752000, 511239600, 530596800, 540270000, 562132800, 571201200, 938923200, 951620400, 970977600, 971578800 } - typeOffsets:intvector { -14560, 0, -14400, 0, -14400, 3600 } - typeMap:bin { "010201020102010201020102010201020102010201020102010201020102010201" } - } //Z#87 - /* America/Bogota */ :table { - trans:intvector { -1739041424, 704869200, 733896000 } - typeOffsets:intvector { -17776, 0, -18000, 0, -18000, 3600 } - typeMap:bin { "010201" } - } //Z#88 - /* America/Boise */ :table { - transPre32:intvector { -1, 1577327296 } - trans:intvector { -1633269600, -1615129200, -1601820000, -1583679600, -1471788000, -880210800, -765388800, -84380400, -68659200, -52930800, -37209600, -21481200, -5760000, 9968400, 25689600, 41418000, 57744000, 73472400, 89193600, 104922000, 120643200, 129114000, 152092800, 162378000, 183542400, 199270800, 215596800, 230720400, 247046400, 262774800, 278496000, 294224400, 309945600, 325674000, 341395200, 357123600, 372844800, 388573200, 404899200, 420022800, 436348800, 452077200, 467798400, 483526800, 499248000, 514976400, 530697600, 544611600, 562147200, 576061200, 594201600, 607510800, 625651200, 638960400, 657100800, 671014800, 688550400, 702464400, 720000000, 733914000, 752054400, 765363600, 783504000, 796813200, 814953600, 828867600, 846403200, 860317200, 877852800, 891766800, 909302400, 923216400, 941356800, 954666000, 972806400, 986115600, 1004256000, 1018170000, 1035705600, 1049619600, 1067155200, 1081069200, 1099209600, 1112518800, 1130659200, 1143968400, 1162108800, 1173603600, 1194163200 } - typeOffsets:intvector { -27889, 0, -28800, 0, -28800, 3600, -25200, 0, -25200, 3600 } - typeMap:bin { "010201020103040304030403040304030403040304030403040304030403040304030403040304030403040304030403040304030403040304030403040304030403040304030403040304030403040304030403040304030403" } - finalRule { "US" } - finalRaw:int { -25200 } - finalYear:int { 2008 } - } //Z#89 - /* America/Buenos_Aires */ :int { 64 } //Z#90 - /* America/Cambridge_Bay */ :table { - trans:intvector { -1577923200, -880210800, -765388800, -147891600, -131562000, 325674000, 341395200, 357123600, 372844800, 388573200, 404899200, 420022800, 436348800, 452077200, 467798400, 483526800, 499248000, 514976400, 530697600, 544611600, 562147200, 576061200, 594201600, 607510800, 625651200, 638960400, 657100800, 671014800, 688550400, 702464400, 720000000, 733914000, 752054400, 765363600, 783504000, 796813200, 814953600, 828867600, 846403200, 860317200, 877852800, 891766800, 909302400, 923216400, 941356800, 954662400, 972802800, 973400400, 986115600, 1004256000, 1018170000, 1035705600, 1049619600, 1067155200, 1081069200, 1099209600, 1112518800, 1130659200, 1143968400, 1162108800, 1173603600, 1194163200 } - typeOffsets:intvector { 0, 0, -25200, 0, -25200, 3600, -25200, 7200, -21600, 0, -21600, 3600, -18000, 0 } - typeMap:bin { "0102010301020102010201020102010201020102010201020102010201020102010201020102010201020102040506040201020102010201020102010201" } - finalRule { "Canada" } - finalRaw:int { -25200 } - finalYear:int { 2008 } - } //Z#91 - /* America/Campo_Grande */ :table { - trans:intvector { -1767212492, -1206954000, -1191358800, -1175371200, -1159822800, -633816000, -622065600, -602280000, -591829200, -570744000, -560206800, -539121600, -531349200, -191361600, -184194000, -155160000, -150066000, -128894400, -121122000, -99950400, -89586000, -68414400, -57963600, 499752000, 511239600, 530596800, 540270000, 562132800, 571201200, 592977600, 602046000, 624427200, 634705200, 656481600, 666759600, 687931200, 697604400, 719985600, 728449200, 750830400, 761713200, 782280000, 793162800, 813729600, 824007600, 844574400, 856062000, 876110400, 888721200, 908078400, 919566000, 938923200, 951620400, 970977600, 982465200, 1003032000, 1013914800, 1036296000, 1045364400, 1066536000, 1076814000, 1099368000, 1108868400, 1129435200, 1140318000, 1162699200, 1172372400, 1192334400, 1203217200, 1224388800, 1234666800, 1255838400, 1266721200, 1287288000, 1298170800, 1318737600, 1330225200, 1350792000, 1361070000, 1382241600, 1392519600, 1413691200, 1424574000, 1445140800, 1456023600, 1476590400, 1487473200, 1508040000, 1518922800, 1540094400, 1550372400, 1571544000, 1581822000, 1602993600, 1613876400, 1634443200, 1645326000, 1665892800, 1677380400, 1697342400, 1708225200, 1729396800, 1739674800, 1760846400, 1771729200, 1792296000, 1803178800, 1823745600, 1834628400, 1855195200, 1866078000, 1887249600, 1897527600, 1918699200, 1928977200, 1950148800, 1960426800, 1981598400, 1992481200, 2013048000, 2024535600, 2044497600, 2055380400, 2076552000, 2086830000, 2108001600, 2118884400, 2139451200 } - transPost32:intvector { 0, -2144633296, 0, -2124066496 } - typeOffsets:intvector { -13108, 0, -14400, 0, -14400, 3600 } - typeMap:bin { "01020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102" } - finalRule { "Brazil" } - finalRaw:int { -14400 } - finalYear:int { 2039 } - } //Z#92 - /* America/Cancun */ :table { - trans:intvector { -1514743200, 377935200, 828860400, 846396000, 860310000, 877845600, 891759600, 902037600, 909298800, 923212800, 941353200, 954662400, 972802800, 989136000, 1001833200, 1018166400, 1035702000, 1049616000, 1067151600, 1081065600, 1099206000, 1112515200, 1130655600, 1143964800, 1162105200, 1175414400, 1193554800, 1207468800, 1225004400, 1238918400, 1256454000, 1270368000, 1288508400, 1301817600, 1319958000, 1333267200, 1351407600, 1365321600, 1382857200, 1396771200, 1414306800, 1422777600 } - typeOffsets:intvector { -20824, 0, -21600, 0, -21600, 3600, -18000, 0, -18000, 3600 } - typeMap:bin { "010304030403040201020102010201020102010201020102010201020102010201020102010201020103" } - } //Z#93 - /* America/Caracas */ :table { - transPre32:intvector { -1, 1770461760 } - trans:intvector { -1826739140, -157750200, 1197183600, 1462086000 } - typeOffsets:intvector { -16064, 0, -16200, 0, -16060, 0, -14400, 0 } - typeMap:bin { "0201030103" } - } //Z#94 - /* America/Catamarca */ :int { 65 } //Z#95 - /* America/Cayenne */ :table { - trans:intvector { -1846269040, -71092800 } - typeOffsets:intvector { -12560, 0, -14400, 0, -10800, 0 } - typeMap:bin { "0102" } - } //Z#96 - /* America/Cayman */ :int { 181 } //Z#97 - /* America/Chicago */ :table { - transPre32:intvector { -1, 1577320096 } - trans:intvector { -1633276800, -1615136400, -1601827200, -1583686800, -1563724800, -1551632400, -1538928000, -1520182800, -1504454400, -1491757200, -1473004800, -1459702800, -1441555200, -1428253200, -1410105600, -1396803600, -1378656000, -1365354000, -1347206400, -1333904400, -1315152000, -1301850000, -1283702400, -1270400400, -1252252800, -1238950800, -1220803200, -1207501200, -1189353600, -1176051600, -1157299200, -1144602000, -1125849600, -1112547600, -1094400000, -1081098000, -1067788800, -1045414800, -1031500800, -1018198800, -1000051200, -986749200, -967996800, -955299600, -936547200, -923245200, -905097600, -891795600, -880214400, -765392400, -747244800, -733942800, -715795200, -702493200, -684345600, -671043600, -652896000, -639594000, -620841600, -608144400, -589392000, -576090000, -557942400, -544640400, -526492800, -513190800, -495043200, -481741200, -463593600, -447267600, -431539200, -415818000, -400089600, -384368400, -368640000, -352918800, -337190400, -321469200, -305740800, -289414800, -273686400, -257965200, -242236800, -226515600, -210787200, -195066000, -179337600, -163616400, -147888000, -131562000, -116438400, -100112400, -84384000, -68662800, -52934400, -37213200, -21484800, -5763600, 9964800, 25686000, 41414400, 57740400, 73468800, 89190000, 104918400, 120639600, 126691200, 152089200, 162374400, 183538800, 199267200, 215593200, 230716800, 247042800, 262771200, 278492400, 294220800, 309942000, 325670400, 341391600, 357120000, 372841200, 388569600, 404895600, 420019200, 436345200, 452073600, 467794800, 483523200, 499244400, 514972800, 530694000, 544608000, 562143600, 576057600, 594198000, 607507200, 625647600, 638956800, 657097200, 671011200, 688546800, 702460800, 719996400, 733910400, 752050800, 765360000, 783500400, 796809600, 814950000, 828864000, 846399600, 860313600, 877849200, 891763200, 909298800, 923212800, 941353200, 954662400, 972802800, 986112000, 1004252400, 1018166400, 1035702000, 1049616000, 1067151600, 1081065600, 1099206000, 1112515200, 1130655600, 1143964800, 1162105200, 1173600000, 1194159600 } - typeOffsets:intvector { -21036, 0, -21600, 0, -21600, 3600, -18000, 0 } - typeMap:bin { "01020102010201020102010201020102010201020102010201020102010201020102010201030102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201" } - finalRule { "US" } - finalRaw:int { -21600 } - finalYear:int { 2008 } - links:intvector { 98, 379, 616 } - } //Z#98 - /* America/Chihuahua */ :table { - trans:intvector { -1514739600, -1343066400, -1234807200, -1220292000, -1207159200, -1191344400, 828864000, 846399600, 860313600, 877849200, 891766800, 909302400, 923216400, 941356800, 954666000, 972806400, 989139600, 1001836800, 1018170000, 1035705600 } - typeOffsets:intvector { -25460, 0, -25200, 0, -25200, 3600, -21600, 0, -21600, 3600 } - typeMap:bin { "0103010301030403040302010201020102010201" } - finalRule { "Mexico" } - finalRaw:int { -25200 } - finalYear:int { 2003 } - } //Z#99 - /* America/Coral_Harbour */ :int { 79 } //Z#100 - /* America/Cordoba */ :int { 67 } //Z#101 - /* America/Costa_Rica */ :table { - trans:intvector { -1545071027, 288770400, 297234000, 320220000, 328683600, 664264800, 678344400, 695714400, 700635600 } - typeOffsets:intvector { -20173, 0, -21600, 0, -21600, 3600 } - typeMap:bin { "010201020102010201" } - } //Z#102 - /* America/Creston */ :table { - transPre32:intvector { -1, 1581084860 } - trans:intvector { -1680454800, -1627833600 } - typeOffsets:intvector { -27964, 0, -28800, 0, -25200, 0 } - typeMap:bin { "020102" } - } //Z#103 - /* America/Cuiaba */ :table { - trans:intvector { -1767212140, -1206954000, -1191358800, -1175371200, -1159822800, -633816000, -622065600, -602280000, -591829200, -570744000, -560206800, -539121600, -531349200, -191361600, -184194000, -155160000, -150066000, -128894400, -121122000, -99950400, -89586000, -68414400, -57963600, 499752000, 511239600, 530596800, 540270000, 562132800, 571201200, 592977600, 602046000, 624427200, 634705200, 656481600, 666759600, 687931200, 697604400, 719985600, 728449200, 750830400, 761713200, 782280000, 793162800, 813729600, 824007600, 844574400, 856062000, 876110400, 888721200, 908078400, 919566000, 938923200, 951620400, 970977600, 982465200, 1003032000, 1013914800, 1036296000, 1045364400, 1099368000, 1108868400, 1129435200, 1140318000, 1162699200, 1172372400, 1192334400, 1203217200, 1224388800, 1234666800, 1255838400, 1266721200, 1287288000, 1298170800, 1318737600, 1330225200, 1350792000, 1361070000, 1382241600, 1392519600, 1413691200, 1424574000, 1445140800, 1456023600, 1476590400, 1487473200, 1508040000, 1518922800, 1540094400, 1550372400, 1571544000, 1581822000, 1602993600, 1613876400, 1634443200, 1645326000, 1665892800, 1677380400, 1697342400, 1708225200, 1729396800, 1739674800, 1760846400, 1771729200, 1792296000, 1803178800, 1823745600, 1834628400, 1855195200, 1866078000, 1887249600, 1897527600, 1918699200, 1928977200, 1950148800, 1960426800, 1981598400, 1992481200, 2013048000, 2024535600, 2044497600, 2055380400, 2076552000, 2086830000, 2108001600, 2118884400, 2139451200 } - transPost32:intvector { 0, -2144633296, 0, -2124066496 } - typeOffsets:intvector { -13460, 0, -14400, 0, -14400, 3600 } - typeMap:bin { "0102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102" } - finalRule { "Brazil" } - finalRaw:int { -14400 } - finalYear:int { 2039 } - } //Z#104 - /* America/Curacao */ :table { - trans:intvector { -1826738653, -157750200 } - typeOffsets:intvector { -16547, 0, -16200, 0, -14400, 0 } - typeMap:bin { "0102" } - links:intvector { 77, 105, 148, 153 } - } //Z#105 - /* America/Danmarkshavn */ :table { - trans:intvector { -1686091520, 323845200, 338950800, 354675600, 370400400, 386125200, 401850000, 417574800, 433299600, 449024400, 465354000, 481078800, 496803600, 512528400, 528253200, 543978000, 559702800, 575427600, 591152400, 606877200, 622602000, 638326800, 654656400, 670381200, 686106000, 701830800, 717555600, 733280400, 749005200, 764730000, 780454800, 796179600, 811904400, 820465200 } - typeOffsets:intvector { -4480, 0, -10800, 0, -10800, 3600, 0, 0 } - typeMap:bin { "01020102010201020102010201020102010201020102010201020102010201020103" } - } //Z#106 - /* America/Dawson */ :table { - transPre32:intvector { -1, 2105970356 } - trans:intvector { -1632056400, -1615125600, -1596978000, -1583164800, -880203600, -765381600, -147884400, -131554800, 120646800, 325677600, 341398800, 357127200, 372848400, 388576800, 404902800, 420026400, 436352400, 452080800, 467802000, 483530400, 499251600, 514980000, 530701200, 544615200, 562150800, 576064800, 594205200, 607514400, 625654800, 638964000, 657104400, 671018400, 688554000, 702468000, 720003600, 733917600, 752058000, 765367200, 783507600, 796816800, 814957200, 828871200, 846406800, 860320800, 877856400, 891770400, 909306000, 923220000, 941360400, 954669600, 972810000, 986119200, 1004259600, 1018173600, 1035709200, 1049623200, 1067158800, 1081072800, 1099213200, 1112522400, 1130662800, 1143972000, 1162112400, 1173607200, 1194166800 } - typeOffsets:intvector { -33460, 0, -32400, 0, -32400, 3600, -32400, 7200, -28800, 0, -28800, 3600 } - typeMap:bin { "010201020102010301040504050405040504050405040504050405040504050405040504050405040504050405040504050405040504050405040504050405040504" } - finalRule { "Canada" } - finalRaw:int { -28800 } - finalYear:int { 2008 } - } //Z#107 - /* America/Dawson_Creek */ :table { - transPre32:intvector { -1, 1581085752 } - trans:intvector { -1632060000, -1615129200, -880207200, -765385200, -715788000, -702486000, -684338400, -671036400, -652888800, -639586800, -620834400, -608137200, -589384800, -576082800, -557935200, -544633200, -526485600, -513183600, -495036000, -481734000, -463586400, -450284400, -431532000, -418230000, -400082400, -386780400, -368632800, -355330800, -337183200, -323881200, -305733600, -292431600, -273679200, -260982000, -242229600, -226508400, -210780000, -195058800, -179330400, -163609200, -147880800, -131554800, -116431200, -100105200, -84376800, -68655600, -52927200, -37206000, -21477600, -5756400, 9972000, 25693200, 41421600, 57747600, 73476000, 84013200 } - typeOffsets:intvector { -28856, 0, -28800, 0, -28800, 3600, -25200, 0 } - typeMap:bin { "010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010203" } - } //Z#108 - /* America/Denver */ :table { - transPre32:intvector { -1, 1577323696 } - trans:intvector { -1633273200, -1615132800, -1601823600, -1583683200, -1570374000, -1551628800, -1538924400, -1534089600, -880210800, -765388800, -147884400, -131558400, -116434800, -100108800, -84380400, -68659200, -52930800, -37209600, -21481200, -5760000, 9968400, 25689600, 41418000, 57744000, 73472400, 89193600, 104922000, 120643200, 126694800, 152092800, 162378000, 183542400, 199270800, 215596800, 230720400, 247046400, 262774800, 278496000, 294224400, 309945600, 325674000, 341395200, 357123600, 372844800, 388573200, 404899200, 420022800, 436348800, 452077200, 467798400, 483526800, 499248000, 514976400, 530697600, 544611600, 562147200, 576061200, 594201600, 607510800, 625651200, 638960400, 657100800, 671014800, 688550400, 702464400, 720000000, 733914000, 752054400, 765363600, 783504000, 796813200, 814953600, 828867600, 846403200, 860317200, 877852800, 891766800, 909302400, 923216400, 941356800, 954666000, 972806400, 986115600, 1004256000, 1018170000, 1035705600, 1049619600, 1067155200, 1081069200, 1099209600, 1112518800, 1130659200, 1143968400, 1162108800, 1173603600, 1194163200 } - typeOffsets:intvector { -25196, 0, -25200, 0, -25200, 3600 } - typeMap:bin { "01020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201" } - finalRule { "US" } - finalRaw:int { -25200 } - finalYear:int { 2008 } - links:intvector { 109, 203, 542, 622 } - } //Z#109 - /* America/Detroit */ :table { - trans:intvector { -2051202469, -1724083200, -880218000, -765396000, -684349200, -671047200, -80499600, -68666400, 104914800, 120636000, 126687600, 152085600, 167814000, 183535200, 199263600, 215589600, 230713200, 247039200, 262767600, 278488800, 294217200, 309938400, 325666800, 341388000, 357116400, 372837600, 388566000, 404892000, 420015600, 436341600, 452070000, 467791200, 483519600, 499240800, 514969200, 530690400, 544604400, 562140000, 576054000, 594194400, 607503600, 625644000, 638953200, 657093600, 671007600, 688543200, 702457200, 719992800, 733906800, 752047200, 765356400, 783496800, 796806000, 814946400, 828860400, 846396000, 860310000, 877845600, 891759600, 909295200, 923209200, 941349600, 954658800, 972799200, 986108400, 1004248800, 1018162800, 1035698400, 1049612400, 1067148000, 1081062000, 1099202400, 1112511600, 1130652000, 1143961200, 1162101600, 1173596400, 1194156000 } - typeOffsets:intvector { -19931, 0, -21600, 0, -18000, 0, -18000, 3600 } - typeMap:bin { "010203020302030203020302030203020302030203020302030203020302030203020302030203020302030203020302030203020302030203020302030203020302030203020302030203020302" } - finalRule { "US" } - finalRaw:int { -18000 } - finalYear:int { 2008 } - links:intvector { 110, 621 } - } //Z#110 - /* America/Dominica */ :int { 186 } //Z#111 - /* America/Edmonton */ :table { - trans:intvector { -1998663968, -1632063600, -1615132800, -1600614000, -1596816000, -1567954800, -1551628800, -1536505200, -1523203200, -1504450800, -1491753600, -1473001200, -1459699200, -880210800, -765388800, -715791600, -702489600, -84380400, -68659200, -21481200, -5760000, 73472400, 89193600, 104922000, 120643200, 136371600, 152092800, 167821200, 183542400, 199270800, 215596800, 230720400, 247046400, 262774800, 278496000, 294224400, 309945600, 325674000, 341395200, 357123600, 372844800, 388573200, 404899200, 420022800, 436348800, 452077200, 467798400, 483526800, 499248000, 514976400, 530697600, 544611600, 562147200, 576061200, 594201600, 607510800, 625651200, 638960400, 657100800, 671014800, 688550400, 702464400, 720000000, 733914000, 752054400, 765363600, 783504000, 796813200, 814953600, 828867600, 846403200, 860317200, 877852800, 891766800, 909302400, 923216400, 941356800, 954666000, 972806400, 986115600, 1004256000, 1018170000, 1035705600, 1049619600, 1067155200, 1081069200, 1099209600, 1112518800, 1130659200, 1143968400, 1162108800, 1173603600, 1194163200 } - typeOffsets:intvector { -27232, 0, -25200, 0, -25200, 3600 } - typeMap:bin { "010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201" } - finalRule { "Canada" } - finalRaw:int { -25200 } - finalYear:int { 2008 } - links:intvector { 112, 386 } - } //Z#112 - /* America/Eirunepe */ :table { - trans:intvector { -1767208832, -1206950400, -1191355200, -1175367600, -1159819200, -633812400, -622062000, -602276400, -591825600, -570740400, -560203200, -539118000, -531345600, -191358000, -184190400, -155156400, -150062400, -128890800, -121118400, -99946800, -89582400, -68410800, -57960000, 499755600, 511243200, 530600400, 540273600, 562136400, 571204800, 750834000, 761716800, 1214283600, 1384056000 } - typeOffsets:intvector { -16768, 0, -18000, 0, -18000, 3600, -14400, 0 } - typeMap:bin { "010201020102010201020102010201020102010201020102010201020102010301" } - } //Z#113 - /* America/El_Salvador */ :table { - trans:intvector { -1546279392, 547020000, 559717200, 578469600, 591166800 } - typeOffsets:intvector { -21408, 0, -21600, 0, -21600, 3600 } - typeMap:bin { "0102010201" } - } //Z#114 - /* America/Ensenada */ :int { 215 } //Z#115 - /* America/Fort_Nelson */ :table { - transPre32:intvector { -1, 1581086343 } - trans:intvector { -1632060000, -1615129200, -880207200, -765385200, -715788000, -702486000, -684338400, -671036400, -652888800, -639586800, -620834400, -608137200, -589384800, -576082800, -557935200, -544633200, -526485600, -513183600, -495036000, -481734000, -463586400, -450284400, -431532000, -418230000, -400082400, -386780400, -368632800, -355330800, -337183200, -323881200, -305733600, -292431600, -273679200, -260982000, -242229600, -226508400, -210780000, -195058800, -179330400, -163609200, -147880800, -131554800, -116431200, -100105200, -84376800, -68655600, -52927200, -37206000, -21477600, -5756400, 9972000, 25693200, 41421600, 57747600, 73476000, 89197200, 104925600, 120646800, 136375200, 152096400, 167824800, 183546000, 199274400, 215600400, 230724000, 247050000, 262778400, 278499600, 294228000, 309949200, 325677600, 341398800, 357127200, 372848400, 388576800, 404902800, 420026400, 436352400, 452080800, 467802000, 483530400, 499251600, 514980000, 530701200, 544615200, 562150800, 576064800, 594205200, 607514400, 625654800, 638964000, 657104400, 671018400, 688554000, 702468000, 720003600, 733917600, 752058000, 765367200, 783507600, 796816800, 814957200, 828871200, 846406800, 860320800, 877856400, 891770400, 909306000, 923220000, 941360400, 954669600, 972810000, 986119200, 1004259600, 1018173600, 1035709200, 1049623200, 1067158800, 1081072800, 1099213200, 1112522400, 1130662800, 1143972000, 1162112400, 1173607200, 1194166800, 1205056800, 1225616400, 1236506400, 1257066000, 1268560800, 1289120400, 1300010400, 1320570000, 1331460000, 1352019600, 1362909600, 1383469200, 1394359200, 1414918800, 1425808800 } - typeOffsets:intvector { -29447, 0, -28800, 0, -28800, 3600, -25200, 0 } - typeMap:bin { "01020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020103" } - } //Z#116 - /* America/Fort_Wayne */ :int { 131 } //Z#117 - /* America/Fortaleza */ :table { - trans:intvector { -1767216360, -1206957600, -1191362400, -1175374800, -1159826400, -633819600, -622069200, -602283600, -591832800, -570747600, -560210400, -539125200, -531352800, -191365200, -184197600, -155163600, -150069600, -128898000, -121125600, -99954000, -89589600, -68418000, -57967200, 499748400, 511236000, 530593200, 540266400, 562129200, 571197600, 592974000, 602042400, 624423600, 634701600, 938919600, 951616800, 970974000, 972180000, 1003028400, 1013911200 } - typeOffsets:intvector { -9240, 0, -10800, 0, -10800, 3600 } - typeMap:bin { "010201020102010201020102010201020102010201020102010201020102010201020102010201" } - } //Z#118 - /* America/Glace_Bay */ :table { - trans:intvector { -2131646412, -1632074400, -1615143600, -880221600, -765399600, -526500000, -513198000, 73461600, 89182800, 104911200, 120632400, 136360800, 152082000, 167810400, 183531600, 199260000, 215586000, 230709600, 247035600, 262764000, 278485200, 294213600, 309934800, 325663200, 341384400, 357112800, 372834000, 388562400, 404888400, 420012000, 436338000, 452066400, 467787600, 483516000, 499237200, 514965600, 530686800, 544600800, 562136400, 576050400, 594190800, 607500000, 625640400, 638949600, 657090000, 671004000, 688539600, 702453600, 719989200, 733903200, 752043600, 765352800, 783493200, 796802400, 814942800, 828856800, 846392400, 860306400, 877842000, 891756000, 909291600, 923205600, 941346000, 954655200, 972795600, 986104800, 1004245200, 1018159200, 1035694800, 1049608800, 1067144400, 1081058400, 1099198800, 1112508000, 1130648400, 1143957600, 1162098000, 1173592800, 1194152400 } - typeOffsets:intvector { -14388, 0, -14400, 0, -14400, 3600 } - typeMap:bin { "01020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201" } - finalRule { "Canada" } - finalRaw:int { -14400 } - finalYear:int { 2008 } - } //Z#119 - /* America/Godthab */ :table { - trans:intvector { -1686083584, 323845200, 338950800, 354675600, 370400400, 386125200, 401850000, 417574800, 433299600, 449024400, 465354000, 481078800, 496803600, 512528400, 528253200, 543978000, 559702800, 575427600, 591152400, 606877200, 622602000, 638326800, 654656400, 670381200, 686106000, 701830800, 717555600, 733280400, 749005200, 764730000, 780454800, 796179600, 811904400, 828234000, 846378000 } - typeOffsets:intvector { -12416, 0, -10800, 0, -10800, 3600 } - typeMap:bin { "0102010201020102010201020102010201020102010201020102010201020102010201" } - finalRule { "EU" } - finalRaw:int { -10800 } - finalYear:int { 1997 } - } //Z#120 - /* America/Goose_Bay */ :table { - transPre32:intvector { -1, 1581071396 } - trans:intvector { -1632076148, -1615145348, -1096921748, -1061670600, -1048973400, -1030221000, -1017523800, -998771400, -986074200, -966717000, -954624600, -935267400, -922570200, -903817800, -891120600, -872368200, -765401400, -746044200, -733347000, -714594600, -701897400, -683145000, -670447800, -651695400, -638998200, -619641000, -606943800, -589401000, -576099000, -557951400, -544649400, -526501800, -513199800, -495052200, -481750200, -463602600, -450300600, -431548200, -418246200, -400098600, -386796600, -368649000, -355347000, -337199400, -323897400, -305749800, -289423800, -273695400, -257974200, -242245800, -226524600, -210796200, -195075000, -179346600, -163625400, -147897000, -131571000, -119903400, -116445600, -100119600, -84391200, -68670000, -52941600, -37220400, -21492000, -5770800, 9957600, 25678800, 41407200, 57733200, 73461600, 89182800, 104911200, 120632400, 136360800, 152082000, 167810400, 183531600, 199260000, 215586000, 230709600, 247035600, 262764000, 278485200, 294213600, 309934800, 325663200, 341384400, 357112800, 372834000, 388562400, 404888400, 420012000, 436338000, 452066400, 467787600, 483516000, 499237200, 514965600, 530686800, 544593660, 562129260, 576043260, 594180060, 607492860, 625633260, 638942460, 657082860, 670996860, 688532460, 702446460, 719982060, 733896060, 752036460, 765345660, 783486060, 796795260, 814935660, 828849660, 846385260, 860299260, 877834860, 891748860, 909284460, 923198460, 941338860, 954648060, 972788460, 986097660, 1004238060, 1018152060, 1035687660, 1049601660, 1067137260, 1081051260, 1099191660, 1112500860, 1130641260, 1143950460, 1162090860, 1173585660, 1194145260, 1205035260, 1225594860, 1236484860, 1257044460, 1268539260, 1289098860, 1299988860, 1320555600, 1331445600, 1352005200 } - typeOffsets:intvector { -14500, 0, -14400, 0, -14400, 3600, -14400, 7200, -12652, 0, -12652, 3600, -12600, 0, -12600, 3600 } - typeMap:bin { "040504060706070607060706070607060706070607060706070607060706070607060706070607060706070607060706070607060706070607060102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010301020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201" } - finalRule { "Canada" } - finalRaw:int { -14400 } - finalYear:int { 2013 } - } //Z#121 - /* America/Grand_Turk */ :table { - transPre32:intvector { -1, 1770462768 } - trans:intvector { -1827687169, 294217200, 309938400, 325666800, 341388000, 357116400, 372837600, 388566000, 404892000, 420015600, 436341600, 452070000, 467791200, 483519600, 499240800, 514969200, 530690400, 544604400, 562140000, 576054000, 594194400, 607503600, 625644000, 638953200, 657093600, 671007600, 688543200, 702457200, 719992800, 733906800, 752047200, 765356400, 783496800, 796806000, 814946400, 828860400, 846396000, 860310000, 877845600, 891759600, 909295200, 923209200, 941349600, 954658800, 972799200, 986108400, 1004248800, 1018162800, 1035698400, 1049612400, 1067148000, 1081062000, 1099202400, 1112511600, 1130652000, 1143961200, 1162101600, 1173596400, 1194156000, 1205046000, 1225605600, 1236495600, 1257055200, 1268550000, 1289109600, 1299999600, 1320559200, 1331449200, 1352008800, 1362898800, 1383458400, 1394348400, 1414908000, 1425798000, 1446357600 } - typeOffsets:intvector { -17072, 0, -18431, 0, -18000, 0, -18000, 3600, -14400, 0 } - typeMap:bin { "01020302030203020302030203020302030203020302030203020302030203020302030203020302030203020302030203020302030203020302030203020302030203020302030203020304" } - } //Z#122 - /* America/Grenada */ :int { 186 } //Z#123 - /* America/Guadeloupe */ :int { 186 } //Z#124 - /* America/Guatemala */ :table { - trans:intvector { -1617040676, 123055200, 130914000, 422344800, 433054800, 669708000, 684219600, 1146376800, 1159678800 } - typeOffsets:intvector { -21724, 0, -21600, 0, -21600, 3600 } - typeMap:bin { "010201020102010201" } - } //Z#125 - /* America/Guayaquil */ :table { - transPre32:intvector { -1, 1770464856 } - trans:intvector { -1230749160 } - typeOffsets:intvector { -19160, 0, -18840, 0, -18000, 0 } - typeMap:bin { "0102" } - } //Z#126 - /* America/Guyana */ :table { - trans:intvector { -1730578040, 176010300, 662698800 } - typeOffsets:intvector { -13960, 0, -14400, 0, -13500, 0, -10800, 0 } - typeMap:bin { "020301" } - } //Z#127 - /* America/Halifax */ :table { - trans:intvector { -2131645536, -1696276800, -1680469200, -1632074400, -1615143600, -1566763200, -1557090000, -1535486400, -1524949200, -1504468800, -1493413200, -1472414400, -1461963600, -1440964800, -1429390800, -1409515200, -1396731600, -1376856000, -1366491600, -1346616000, -1333832400, -1313956800, -1303678800, -1282507200, -1272661200, -1251057600, -1240088400, -1219608000, -1207429200, -1188763200, -1175979600, -1157313600, -1143925200, -1124049600, -1113771600, -1091390400, -1081026000, -1059854400, -1050786000, -1030910400, -1018126800, -999460800, -986677200, -965592000, -955227600, -935956800, -923173200, -904507200, -891723600, -880221600, -765399600, -747252000, -733950000, -715802400, -702500400, -684352800, -671050800, -652903200, -639601200, -589399200, -576097200, -557949600, -544647600, -526500000, -513198000, -495050400, -481748400, -431546400, -418244400, -400096800, -386794800, -368647200, -355345200, -337197600, -323895600, -242244000, -226522800, -210794400, -195073200, -179344800, -163623600, -147895200, -131569200, -116445600, -100119600, -84391200, -68670000, -52941600, -37220400, -21492000, -5770800, 9957600, 25678800, 41407200, 57733200, 73461600, 89182800, 104911200, 120632400, 136360800, 152082000, 167810400, 183531600, 199260000, 215586000, 230709600, 247035600, 262764000, 278485200, 294213600, 309934800, 325663200, 341384400, 357112800, 372834000, 388562400, 404888400, 420012000, 436338000, 452066400, 467787600, 483516000, 499237200, 514965600, 530686800, 544600800, 562136400, 576050400, 594190800, 607500000, 625640400, 638949600, 657090000, 671004000, 688539600, 702453600, 719989200, 733903200, 752043600, 765352800, 783493200, 796802400, 814942800, 828856800, 846392400, 860306400, 877842000, 891756000, 909291600, 923205600, 941346000, 954655200, 972795600, 986104800, 1004245200, 1018159200, 1035694800, 1049608800, 1067144400, 1081058400, 1099198800, 1112508000, 1130648400, 1143957600, 1162098000, 1173592800, 1194152400 } - typeOffsets:intvector { -15264, 0, -14400, 0, -14400, 3600 } - typeMap:bin { "0102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201" } - finalRule { "Canada" } - finalRaw:int { -14400 } - finalYear:int { 2008 } - links:intvector { 128, 382 } - } //Z#128 - /* America/Havana */ :table { - transPre32:intvector { -1, 1770465464 } - trans:intvector { -1402813824, -1311534000, -1300996800, -933534000, -925675200, -902084400, -893620800, -870030000, -862171200, -775681200, -767822400, -744231600, -736372800, -144702000, -134251200, -113425200, -102542400, -86295600, -72907200, -54154800, -41457600, -21495600, -5774400, 9954000, 25675200, 41403600, 57729600, 73458000, 87364800, 104907600, 118900800, 136357200, 150436800, 167806800, 183528000, 199256400, 215582400, 230706000, 247032000, 263365200, 276667200, 290581200, 308721600, 322030800, 340171200, 358318800, 371620800, 389768400, 403070400, 421218000, 434520000, 452667600, 466574400, 484117200, 498024000, 511333200, 529473600, 542782800, 560923200, 574837200, 592372800, 606286800, 623822400, 638946000, 655876800, 671000400, 687330000, 702450000, 718779600, 733899600, 750229200, 765349200, 781678800, 796798800, 813128400, 828853200, 844578000, 860302800, 876632400, 891147600, 909291600, 922597200, 941346000, 954651600, 972795600, 986101200, 1004245200, 1018155600, 1035694800, 1049605200, 1067144400, 1080450000, 1162098000, 1173589200, 1193547600, 1205643600, 1224997200, 1236488400, 1256446800, 1268542800, 1288501200, 1300597200, 1321160400, 1333256400, 1352005200, 1362891600, 1383454800 } - typeOffsets:intvector { -19768, 0, -19776, 0, -18000, 0, -18000, 3600 } - typeMap:bin { "010203020302030203020302030203020302030203020302030203020302030203020302030203020302030203020302030203020302030203020302030203020302030203020302030203020302030203020302030203020302030203020302030203020302030203020302" } - finalRule { "Cuba" } - finalRaw:int { -18000 } - finalYear:int { 2014 } - links:intvector { 129, 393 } - } //Z#129 - /* America/Hermosillo */ :table { - trans:intvector { -1514739600, -1343066400, -1234807200, -1220292000, -1207159200, -1191344400, -873828000, -661539600, 28800, 828867600, 846403200, 860317200, 877852800, 891766800, 909302400 } - typeOffsets:intvector { -26632, 0, -28800, 0, -25200, 0, -25200, 3600, -21600, 0 } - typeMap:bin { "020402040204020102030203020302" } - } //Z#130 - /* America/Indiana/Indianapolis */ :table { - transPre32:intvector { -1, 1577320096 } - trans:intvector { -1633276800, -1615136400, -1601827200, -1583686800, -900259200, -891795600, -880214400, -765392400, -747244800, -733942800, -715795200, -702493200, -684345600, -671043600, -652896000, -639594000, -620841600, -608144400, -589392000, -576090000, -557942400, -544640400, -526492800, -513190800, -495043200, -481741200, -463593600, -386787600, -368640000, -21488400, -5767200, 9961200, 25682400, 1143961200, 1162101600, 1173596400, 1194156000 } - typeOffsets:intvector { -20678, 0, -21600, 0, -21600, 3600, -18000, 0, -18000, 3600 } - typeMap:bin { "0102010201020102010201020102010201020102010201020102010301030403040304030403" } - finalRule { "US" } - finalRaw:int { -18000 } - finalYear:int { 2008 } - links:intvector { 117, 131, 139, 510, 617 } - } //Z#131 - /* America/Indiana/Knox */ :table { - transPre32:intvector { -1, 1577320096 } - trans:intvector { -1633276800, -1615136400, -1601827200, -1583686800, -880214400, -765392400, -715795200, -702493200, -684345600, -671043600, -652896000, -639594000, -620841600, -608144400, -589392000, -576090000, -557942400, -544640400, -526492800, -513190800, -495043200, -481741200, -463593600, -447267600, -431539200, -415818000, -400089600, -386787600, -368640000, -355338000, -337190400, -321469200, -305740800, -289414800, -273686400, -257965200, -242236800, -195066000, -84384000, -68662800, -52934400, -37213200, -21484800, -5763600, 9964800, 25686000, 41414400, 57740400, 73468800, 89190000, 104918400, 120639600, 126691200, 152089200, 162374400, 183538800, 199267200, 215593200, 230716800, 247042800, 262771200, 278492400, 294220800, 309942000, 325670400, 341391600, 357120000, 372841200, 388569600, 404895600, 420019200, 436345200, 452073600, 467794800, 483523200, 499244400, 514972800, 530694000, 544608000, 562143600, 576057600, 594198000, 607507200, 625647600, 638956800, 657097200, 671011200, 688546800, 1143961200, 1162105200, 1173600000, 1194159600 } - typeOffsets:intvector { -20790, 0, -21600, 0, -21600, 3600, -18000, 0 } - typeMap:bin { "010201020102010201020102010201020102010201020102010201020102010201020102010301020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020302010201" } - finalRule { "US" } - finalRaw:int { -21600 } - finalYear:int { 2008 } - links:intvector { 132, 147, 620 } - } //Z#132 - /* America/Indiana/Marengo */ :table { - transPre32:intvector { -1, 1577320096 } - trans:intvector { -1633276800, -1615136400, -1601827200, -1583686800, -880214400, -765392400, -589392000, -576090000, -495043200, -481741200, -463593600, -450291600, -431539200, -418237200, -400089600, -386787600, -368640000, -355338000, -337190400, -323888400, -305740800, -292438800, -273686400, -21488400, -5767200, 9961200, 25682400, 41410800, 57736800, 73465200, 89186400, 104914800, 120636000, 126687600, 152089200, 162370800, 183535200, 1143961200, 1162101600, 1173596400, 1194156000 } - typeOffsets:intvector { -20723, 0, -21600, 0, -21600, 3600, -18000, 0, -18000, 3600 } - typeMap:bin { "010201020102010201020102010201020102010201020103040304030403040304030203040304030403" } - finalRule { "US" } - finalRaw:int { -18000 } - finalYear:int { 2008 } - } //Z#133 - /* America/Indiana/Petersburg */ :table { - transPre32:intvector { -1, 1577320096 } - trans:intvector { -1633276800, -1615136400, -1601827200, -1583686800, -880214400, -765392400, -462996000, -450291600, -431539200, -418237200, -400089600, -386787600, -368640000, -355338000, -337190400, -323888400, -305740800, -292438800, -273686400, -257965200, -242236800, -226515600, -210787200, -195066000, -179337600, -163616400, -147888000, -100112400, -84384000, -68662800, -52934400, -37213200, -21484800, -5763600, 9964800, 25686000, 41414400, 57740400, 73468800, 89190000, 104918400, 120639600, 126691200, 152089200, 162374400, 183538800, 199267200, 215593200, 230716800, 247042800, 1143961200, 1162105200, 1173600000, 1194159600, 1205046000, 1225605600 } - typeOffsets:intvector { -20947, 0, -21600, 0, -21600, 3600, -18000, 0, -18000, 3600 } - typeMap:bin { "010201020102010201020102010201020102010201020102010201030102010201020102010201020102010201020102010203020102030403" } - finalRule { "US" } - finalRaw:int { -18000 } - finalYear:int { 2009 } - } //Z#134 - /* America/Indiana/Tell_City */ :table { - transPre32:intvector { -1, 1577320096 } - trans:intvector { -1633276800, -1615136400, -1601827200, -1583686800, -880214400, -765392400, -747244800, -733942800, -526492800, -513190800, -495043200, -481741200, -462996000, -450291600, -431539200, -418237200, -400089600, -386787600, -368640000, -355338000, -337190400, -323888400, -305740800, -289414800, -273686400, -260989200, -242236800, -226515600, -210787200, -195066000, -179337600, -21488400, -5767200, 9961200, 25682400, 1143961200, 1162105200, 1173600000, 1194159600 } - typeOffsets:intvector { -20823, 0, -21600, 0, -21600, 3600, -18000, 0, -18000, 3600 } - typeMap:bin { "01020102010201020102010201020102010201020102010201020102010201030403040302010201" } - finalRule { "US" } - finalRaw:int { -21600 } - finalYear:int { 2008 } - } //Z#135 - /* America/Indiana/Vevay */ :table { - transPre32:intvector { -1, 1577320096 } - trans:intvector { -1633276800, -1615136400, -1601827200, -1583686800, -880214400, -765392400, -495043200, -21488400, -5767200, 9961200, 25682400, 41410800, 57736800, 73465200, 89186400, 1143961200, 1162101600, 1173596400, 1194156000 } - typeOffsets:intvector { -20416, 0, -21600, 0, -21600, 3600, -18000, 0, -18000, 3600 } - typeMap:bin { "0102010201020103040304030403040304030403" } - finalRule { "US" } - finalRaw:int { -18000 } - finalYear:int { 2008 } - } //Z#136 - /* America/Indiana/Vincennes */ :table { - transPre32:intvector { -1, 1577320096 } - trans:intvector { -1633276800, -1615136400, -1601827200, -1583686800, -880214400, -765392400, -747244800, -733942800, -526492800, -513190800, -495043200, -481741200, -462996000, -450291600, -431539200, -418237200, -400089600, -386787600, -368640000, -355338000, -337190400, -323888400, -305740800, -289414800, -273686400, -260989200, -242236800, -226515600, -210787200, -195066000, -179337600, -21488400, -5767200, 9961200, 25682400, 1143961200, 1162105200, 1173600000, 1194159600, 1205046000, 1225605600 } - typeOffsets:intvector { -21007, 0, -21600, 0, -21600, 3600, -18000, 0, -18000, 3600 } - typeMap:bin { "010201020102010201020102010201020102010201020102010201020102010304030403020102030403" } - finalRule { "US" } - finalRaw:int { -18000 } - finalYear:int { 2009 } - } //Z#137 - /* America/Indiana/Winamac */ :table { - transPre32:intvector { -1, 1577320096 } - trans:intvector { -1633276800, -1615136400, -1601827200, -1583686800, -880214400, -765392400, -747244800, -733942800, -715795200, -702493200, -684345600, -671043600, -652896000, -639594000, -620841600, -608144400, -589392000, -576090000, -557942400, -544640400, -526492800, -513190800, -495043200, -481741200, -463593600, -447267600, -431539200, -415818000, -400089600, -386787600, -368640000, -355338000, -337190400, -323888400, -305740800, -292438800, -273686400, -21488400, -5767200, 9961200, 25682400, 1143961200, 1162105200, 1173600000, 1194156000, 1205046000, 1225605600 } - typeOffsets:intvector { -20785, 0, -21600, 0, -21600, 3600, -18000, 0, -18000, 3600 } - typeMap:bin { "010201020102010201020102010201020102010201020102010201020102010201020102010304030403020104030403" } - finalRule { "US" } - finalRaw:int { -18000 } - finalYear:int { 2009 } - } //Z#138 - /* America/Indianapolis */ :int { 131 } //Z#139 - /* America/Inuvik */ :table { - trans:intvector { -536457600, -147888000, -131558400, 294228000, 325674000, 341395200, 357123600, 372844800, 388573200, 404899200, 420022800, 436348800, 452077200, 467798400, 483526800, 499248000, 514976400, 530697600, 544611600, 562147200, 576061200, 594201600, 607510800, 625651200, 638960400, 657100800, 671014800, 688550400, 702464400, 720000000, 733914000, 752054400, 765363600, 783504000, 796813200, 814953600, 828867600, 846403200, 860317200, 877852800, 891766800, 909302400, 923216400, 941356800, 954666000, 972806400, 986115600, 1004256000, 1018170000, 1035705600, 1049619600, 1067155200, 1081069200, 1099209600, 1112518800, 1130659200, 1143968400, 1162108800, 1173603600, 1194163200 } - typeOffsets:intvector { 0, 0, -28800, 0, -28800, 7200, -25200, 0, -25200, 3600 } - typeMap:bin { "010201030403040304030403040304030403040304030403040304030403040304030403040304030403040304030403040304030403040304030403" } - finalRule { "Canada" } - finalRaw:int { -25200 } - finalYear:int { 2008 } - } //Z#140 - /* America/Iqaluit */ :table { - trans:intvector { -865296000, -765396000, -147898800, -131569200, 325666800, 341388000, 357116400, 372837600, 388566000, 404892000, 420015600, 436341600, 452070000, 467791200, 483519600, 499240800, 514969200, 530690400, 544604400, 562140000, 576054000, 594194400, 607503600, 625644000, 638953200, 657093600, 671007600, 688543200, 702457200, 719992800, 733906800, 752047200, 765356400, 783496800, 796806000, 814946400, 828860400, 846396000, 860310000, 877845600, 891759600, 909295200, 923209200, 941349600, 954662400, 972802800, 986108400, 1004248800, 1018162800, 1035698400, 1049612400, 1067148000, 1081062000, 1099202400, 1112511600, 1130652000, 1143961200, 1162101600, 1173596400, 1194156000 } - typeOffsets:intvector { 0, 0, -21600, 0, -21600, 3600, -18000, 0, -18000, 3600, -18000, 7200 } - typeMap:bin { "040305030403040304030403040304030403040304030403040304030403040304030403040304030403040102030403040304030403040304030403" } - finalRule { "Canada" } - finalRaw:int { -18000 } - finalYear:int { 2008 } - } //Z#141 - /* America/Jamaica */ :table { - trans:intvector { -1827687169, 126687600, 152085600, 162370800, 183535200, 199263600, 215589600, 230713200, 247039200, 262767600, 278488800, 294217200, 309938400, 325666800, 341388000, 357116400, 372837600, 388566000, 404892000, 420015600, 436341600 } - typeOffsets:intvector { -18431, 0, -18000, 0, -18000, 3600 } - typeMap:bin { "010201020102010201020102010201020102010201" } - links:intvector { 142, 527 } - } //Z#142 - /* America/Jujuy */ :int { 68 } //Z#143 - /* America/Juneau */ :table { - transPre32:intvector { -1, 1069601157, -1, 2106012357 } - trans:intvector { -880207200, -765385200, -21477600, -5756400, 9972000, 25693200, 41421600, 57747600, 73476000, 89197200, 104925600, 120646800, 126698400, 152096400, 162381600, 183546000, 199274400, 215600400, 230724000, 247050000, 262778400, 278499600, 294228000, 309949200, 325677600, 341402400, 357127200, 372848400, 388576800, 404902800, 420026400, 436352400, 452084400, 467805600, 483534000, 499255200, 514983600, 530704800, 544618800, 562154400, 576068400, 594208800, 607518000, 625658400, 638967600, 657108000, 671022000, 688557600, 702471600, 720007200, 733921200, 752061600, 765370800, 783511200, 796820400, 814960800, 828874800, 846410400, 860324400, 877860000, 891774000, 909309600, 923223600, 941364000, 954673200, 972813600, 986122800, 1004263200, 1018177200, 1035712800, 1049626800, 1067162400, 1081076400, 1099216800, 1112526000, 1130666400, 1143975600, 1162116000, 1173610800, 1194170400 } - typeOffsets:intvector { 54139, 0, -32400, 0, -32400, 3600, -32261, 0, -28800, 0, -28800, 3600 } - typeMap:bin { "03040504050405040504050405040504050405040504050405040204050405040501020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201" } - finalRule { "US" } - finalRaw:int { -32400 } - finalYear:int { 2008 } - } //Z#144 - /* America/Kentucky/Louisville */ :table { - transPre32:intvector { -1, 1577320096 } - trans:intvector { -1633276800, -1615136400, -1601827200, -1583686800, -1535904000, -1525280400, -905097600, -891795600, -880214400, -765392400, -757360800, -744224400, -715795200, -608144400, -589392000, -576090000, -557942400, -544640400, -526492800, -513190800, -495043200, -481741200, -463593600, -450291600, -431539200, -415818000, -400089600, -384368400, -368640000, -352918800, -337190400, -321469200, -305740800, -289414800, -273686400, -266432400, -52938000, -37216800, -21488400, -5767200, 9961200, 25682400, 41410800, 57736800, 73465200, 89186400, 104914800, 120636000, 126687600, 152089200, 162370800, 183535200, 199263600, 215589600, 230713200, 247039200, 262767600, 278488800, 294217200, 309938400, 325666800, 341388000, 357116400, 372837600, 388566000, 404892000, 420015600, 436341600, 452070000, 467791200, 483519600, 499240800, 514969200, 530690400, 544604400, 562140000, 576054000, 594194400, 607503600, 625644000, 638953200, 657093600, 671007600, 688543200, 702457200, 719992800, 733906800, 752047200, 765356400, 783496800, 796806000, 814946400, 828860400, 846396000, 860310000, 877845600, 891759600, 909295200, 923209200, 941349600, 954658800, 972799200, 986108400, 1004248800, 1018162800, 1035698400, 1049612400, 1067148000, 1081062000, 1099202400, 1112511600, 1130652000, 1143961200, 1162101600, 1173596400, 1194156000 } - typeOffsets:intvector { -20582, 0, -21600, 0, -21600, 3600, -18000, 0, -18000, 3600 } - typeMap:bin { "010201020102010201020102010201020102010201020102010201020102010201020102030403040304030403040304030203040304030403040304030403040304030403040304030403040304030403040304030403040304030403040304030403040304030403040304030403040304030403" } - finalRule { "US" } - finalRaw:int { -18000 } - finalYear:int { 2008 } - links:intvector { 145, 152 } - } //Z#145 - /* America/Kentucky/Monticello */ :table { - transPre32:intvector { -1, 1577320096 } - trans:intvector { -1633276800, -1615136400, -1601827200, -1583686800, -880214400, -765392400, -52934400, -37213200, -21484800, -5763600, 9964800, 25686000, 41414400, 57740400, 73468800, 89190000, 104918400, 120639600, 126691200, 152089200, 162374400, 183538800, 199267200, 215593200, 230716800, 247042800, 262771200, 278492400, 294220800, 309942000, 325670400, 341391600, 357120000, 372841200, 388569600, 404895600, 420019200, 436345200, 452073600, 467794800, 483523200, 499244400, 514972800, 530694000, 544608000, 562143600, 576057600, 594198000, 607507200, 625647600, 638956800, 657097200, 671011200, 688546800, 702460800, 719996400, 733910400, 752050800, 765360000, 783500400, 796809600, 814950000, 828864000, 846399600, 860313600, 877849200, 891763200, 909298800, 923212800, 941353200, 954662400, 972802800, 986108400, 1004248800, 1018162800, 1035698400, 1049612400, 1067148000, 1081062000, 1099202400, 1112511600, 1130652000, 1143961200, 1162101600, 1173596400, 1194156000 } - typeOffsets:intvector { -20364, 0, -21600, 0, -21600, 3600, -18000, 0, -18000, 3600 } - typeMap:bin { "010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102030403040304030403040304030403" } - finalRule { "US" } - finalRaw:int { -18000 } - finalYear:int { 2008 } - } //Z#146 - /* America/Knox_IN */ :int { 132 } //Z#147 - /* America/Kralendijk */ :int { 105 } //Z#148 - /* America/La_Paz */ :table { - trans:intvector { -1205954844, -1192307244 } - typeOffsets:intvector { -16356, 0, -16356, 3600, -14400, 0 } - typeMap:bin { "0102" } - } //Z#149 - /* America/Lima */ :table { - transPre32:intvector { -1, 1770464188 } - trans:intvector { -1938538284, -1009825200, -1002052800, -986756400, -971035200, -955306800, -939585600, 504939600, 512712000, 536475600, 544248000, 631170000, 638942400, 757400400, 765172800 } - typeOffsets:intvector { -18492, 0, -18516, 0, -18000, 0, -18000, 3600 } - typeMap:bin { "01020302030203020302030203020302" } - } //Z#150 - /* America/Los_Angeles */ :table { - transPre32:intvector { -1, 1577327296 } - trans:intvector { -1633269600, -1615129200, -1601820000, -1583679600, -880207200, -765385200, -687967140, -662655600, -620838000, -608137200, -589388400, -576082800, -557938800, -544633200, -526489200, -513183600, -495039600, -481734000, -463590000, -450284400, -431535600, -418230000, -400086000, -386780400, -368636400, -355330800, -337186800, -323881200, -305737200, -292431600, -273682800, -260982000, -242233200, -226508400, -210783600, -195058800, -179334000, -163609200, -147884400, -131554800, -116434800, -100105200, -84376800, -68655600, -52927200, -37206000, -21477600, -5756400, 9972000, 25693200, 41421600, 57747600, 73476000, 89197200, 104925600, 120646800, 126698400, 152096400, 162381600, 183546000, 199274400, 215600400, 230724000, 247050000, 262778400, 278499600, 294228000, 309949200, 325677600, 341398800, 357127200, 372848400, 388576800, 404902800, 420026400, 436352400, 452080800, 467802000, 483530400, 499251600, 514980000, 530701200, 544615200, 562150800, 576064800, 594205200, 607514400, 625654800, 638964000, 657104400, 671018400, 688554000, 702468000, 720003600, 733917600, 752058000, 765367200, 783507600, 796816800, 814957200, 828871200, 846406800, 860320800, 877856400, 891770400, 909306000, 923220000, 941360400, 954669600, 972810000, 986119200, 1004259600, 1018173600, 1035709200, 1049623200, 1067158800, 1081072800, 1099213200, 1112522400, 1130662800, 1143972000, 1162112400, 1173607200, 1194166800 } - typeOffsets:intvector { -28378, 0, -28800, 0, -28800, 3600 } - typeMap:bin { "0102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201" } - finalRule { "US" } - finalRaw:int { -28800 } - finalYear:int { 2008 } - links:intvector { 151, 547, 623, 624 } - } //Z#151 - /* America/Louisville */ :int { 145 } //Z#152 - /* America/Lower_Princes */ :int { 105 } //Z#153 - /* America/Maceio */ :table { - trans:intvector { -1767217028, -1206957600, -1191362400, -1175374800, -1159826400, -633819600, -622069200, -602283600, -591832800, -570747600, -560210400, -539125200, -531352800, -191365200, -184197600, -155163600, -150069600, -128898000, -121125600, -99954000, -89589600, -68418000, -57967200, 499748400, 511236000, 530593200, 540266400, 562129200, 571197600, 592974000, 602042400, 624423600, 634701600, 813726000, 824004000, 938919600, 951616800, 970974000, 972180000, 1003028400, 1013911200 } - typeOffsets:intvector { -8572, 0, -10800, 0, -10800, 3600 } - typeMap:bin { "0102010201020102010201020102010201020102010201020102010201020102010201020102010201" } - } //Z#154 - /* America/Managua */ :table { - transPre32:intvector { -1, 1770466404 } - trans:intvector { -1121105688, 105084000, 161758800, 290584800, 299134800, 322034400, 330584400, 694260000, 717310800, 725868000, 852094800, 1113112800, 1128229200, 1146384000, 1159682400 } - typeOffsets:intvector { -20708, 0, -21600, 0, -21600, 3600, -20712, 0, -18000, 0 } - typeMap:bin { "03010401020102010401040102010201" } - } //Z#155 - /* America/Manaus */ :table { - trans:intvector { -1767211196, -1206954000, -1191358800, -1175371200, -1159822800, -633816000, -622065600, -602280000, -591829200, -570744000, -560206800, -539121600, -531349200, -191361600, -184194000, -155160000, -150066000, -128894400, -121122000, -99950400, -89586000, -68414400, -57963600, 499752000, 511239600, 530596800, 540270000, 562132800, 571201200, 750830400, 761713200 } - typeOffsets:intvector { -14404, 0, -14400, 0, -14400, 3600 } - typeMap:bin { "01020102010201020102010201020102010201020102010201020102010201" } - links:intvector { 156, 375 } - } //Z#156 - /* America/Marigot */ :int { 186 } //Z#157 - /* America/Martinique */ :table { - trans:intvector { -1851537340, 323841600, 338958000 } - typeOffsets:intvector { -14660, 0, -14400, 0, -14400, 3600 } - typeMap:bin { "010201" } - } //Z#158 - /* America/Matamoros */ :table { - trans:intvector { -1514743200, 576057600, 594198000, 828864000, 846399600, 860313600, 877849200, 891763200, 909298800, 923212800, 941353200, 954662400, 972802800, 989136000, 1001833200, 1018166400, 1035702000, 1049616000, 1067151600, 1081065600, 1099206000, 1112515200, 1130655600, 1143964800, 1162105200, 1175414400, 1193554800, 1207468800, 1225004400, 1238918400, 1256454000, 1268553600, 1289113200 } - typeOffsets:intvector { -24000, 0, -21600, 0, -21600, 3600 } - typeMap:bin { "010201020102010201020102010201020102010201020102010201020102010201" } - finalRule { "US" } - finalRaw:int { -21600 } - finalYear:int { 2011 } - } //Z#159 - /* America/Mazatlan */ :table { - trans:intvector { -1514739600, -1343066400, -1234807200, -1220292000, -1207159200, -1191344400, -873828000, -661539600, 28800, 828867600, 846403200, 860317200, 877852800, 891766800, 909302400, 923216400, 941356800, 954666000, 972806400, 989139600, 1001836800, 1018170000, 1035705600 } - typeOffsets:intvector { -25540, 0, -28800, 0, -25200, 0, -25200, 3600, -21600, 0 } - typeMap:bin { "0204020402040201020302030203020302030203020302" } - finalRule { "Mexico" } - finalRaw:int { -25200 } - finalYear:int { 2003 } - links:intvector { 160, 536 } - } //Z#160 - /* America/Mendoza */ :int { 70 } //Z#161 - /* America/Menominee */ :table { - transPre32:intvector { -1, 1635207523 } - trans:intvector { -1633276800, -1615136400, -1601827200, -1583686800, -880214400, -765392400, -747244800, -733942800, -116438400, -100112400, -21484800, 104914800, 120639600, 126691200, 152089200, 162374400, 183538800, 199267200, 215593200, 230716800, 247042800, 262771200, 278492400, 294220800, 309942000, 325670400, 341391600, 357120000, 372841200, 388569600, 404895600, 420019200, 436345200, 452073600, 467794800, 483523200, 499244400, 514972800, 530694000, 544608000, 562143600, 576057600, 594198000, 607507200, 625647600, 638956800, 657097200, 671011200, 688546800, 702460800, 719996400, 733910400, 752050800, 765360000, 783500400, 796809600, 814950000, 828864000, 846399600, 860313600, 877849200, 891763200, 909298800, 923212800, 941353200, 954662400, 972802800, 986112000, 1004252400, 1018166400, 1035702000, 1049616000, 1067151600, 1081065600, 1099206000, 1112515200, 1130655600, 1143964800, 1162105200, 1173600000, 1194159600 } - typeOffsets:intvector { -21027, 0, -21600, 0, -21600, 3600, -18000, 0 } - typeMap:bin { "01020102010201020102010302010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201" } - finalRule { "US" } - finalRaw:int { -21600 } - finalYear:int { 2008 } - } //Z#162 - /* America/Merida */ :table { - trans:intvector { -1514743200, 377935200, 407653200, 828864000, 846399600, 860313600, 877849200, 891763200, 909298800, 923212800, 941353200, 954662400, 972802800, 989136000, 1001833200, 1018166400, 1035702000 } - typeOffsets:intvector { -21508, 0, -21600, 0, -21600, 3600, -18000, 0 } - typeMap:bin { "0103010201020102010201020102010201" } - finalRule { "Mexico" } - finalRaw:int { -21600 } - finalYear:int { 2003 } - } //Z#163 - /* America/Metlakatla */ :table { - transPre32:intvector { -1, 1069600474, -1, 2106011674 } - trans:intvector { -880207200, -765385200, -21477600, -5756400, 9972000, 25693200, 41421600, 57747600, 73476000, 89197200, 104925600, 120646800, 126698400, 152096400, 162381600, 183546000, 199274400, 215600400, 230724000, 247050000, 262778400, 278499600, 294228000, 309949200, 325677600, 341398800, 357127200, 372848400, 388576800, 404902800, 420026400, 436352400, 1446372000, 1457866800, 1478426400 } - typeOffsets:intvector { 54822, 0, -32400, 0, -32400, 3600, -31578, 0, -28800, 0, -28800, 3600 } - typeMap:bin { "03040504050405040504050405040504050405040504050405040504050405040504010201" } - finalRule { "US" } - finalRaw:int { -32400 } - finalYear:int { 2017 } - } //Z#164 - /* America/Mexico_City */ :table { - trans:intvector { -1514739600, -1343066400, -1234807200, -1220292000, -1207159200, -1191344400, -975261600, -963169200, -917114400, -907354800, -821901600, -810068400, -627501600, -612990000, 828864000, 846399600, 860313600, 877849200, 891763200, 909298800, 923212800, 941353200, 954662400, 972802800, 989136000, 1001833200, 1018166400, 1035702000 } - typeOffsets:intvector { -23796, 0, -25200, 0, -21600, 0, -21600, 3600 } - typeMap:bin { "01020102010203020302030203020302030203020302030203020302" } - finalRule { "Mexico" } - finalRaw:int { -21600 } - finalYear:int { 2003 } - links:intvector { 165, 537 } - } //Z#165 - /* America/Miquelon */ :table { - trans:intvector { -1850328920, 326001600, 544597200, 562132800, 576046800, 594187200, 607496400, 625636800, 638946000, 657086400, 671000400, 688536000, 702450000, 719985600, 733899600, 752040000, 765349200, 783489600, 796798800, 814939200, 828853200, 846388800, 860302800, 877838400, 891752400, 909288000, 923202000, 941342400, 954651600, 972792000, 986101200, 1004241600, 1018155600, 1035691200, 1049605200, 1067140800, 1081054800, 1099195200, 1112504400, 1130644800, 1143954000, 1162094400, 1173589200, 1194148800 } - typeOffsets:intvector { -13480, 0, -14400, 0, -10800, 0, -10800, 3600 } - typeMap:bin { "0102030203020302030203020302030203020302030203020302030203020302030203020302030203020302" } - finalRule { "Canada" } - finalRaw:int { -10800 } - finalYear:int { 2008 } - } //Z#166 - /* America/Moncton */ :table { - transPre32:intvector { -1, 1579085244 } - trans:intvector { -2131642800, -1632074400, -1615143600, -1153681200, -1145822400, -1122231600, -1114372800, -1090782000, -1082923200, -1059332400, -1051473600, -1027882800, -1020024000, -996433200, -988574400, -965674800, -955396800, -934743600, -923947200, -904503600, -891892800, -880221600, -765399600, -747252000, -733950000, -715802400, -702500400, -684352800, -671050800, -652903200, -639601200, -620848800, -608151600, -589399200, -576097200, -557949600, -544647600, -526500000, -513198000, -495050400, -481748400, -463600800, -450298800, -431546400, -418244400, -400096800, -384375600, -368647200, -352926000, -337197600, -321476400, -305748000, -289422000, -273693600, -257972400, -242244000, -226522800, -210794400, -195073200, -179344800, -163623600, -147895200, -131569200, -116445600, -100119600, -84391200, -68670000, -52941600, -37220400, -21492000, -5770800, 9957600, 25678800, 41407200, 57733200, 73461600, 89182800, 136360800, 152082000, 167810400, 183531600, 199260000, 215586000, 230709600, 247035600, 262764000, 278485200, 294213600, 309934800, 325663200, 341384400, 357112800, 372834000, 388562400, 404888400, 420012000, 436338000, 452066400, 467787600, 483516000, 499237200, 514965600, 530686800, 544600800, 562136400, 576050400, 594190800, 607500000, 625640400, 638949600, 657090000, 671004000, 688539600, 702453600, 719989200, 733896060, 752036460, 765345660, 783486060, 796795260, 814935660, 828849660, 846385260, 860299260, 877834860, 891748860, 909284460, 923198460, 941338860, 954648060, 972788460, 986097660, 1004238060, 1018152060, 1035687660, 1049601660, 1067137260, 1081051260, 1099191660, 1112500860, 1130641260, 1143950460, 1162090860, 1173592800, 1194152400 } - typeOffsets:intvector { -15548, 0, -18000, 0, -14400, 0, -14400, 3600 } - typeMap:bin { "0102030203020302030203020302030203020302030203020302030203020302030203020302030203020302030203020302030203020302030203020302030203020302030203020302030203020302030203020302030203020302030203020302030203020302030203020302030203020302030203020302030203020302030203020302030203020302030203020302" } - finalRule { "Canada" } - finalRaw:int { -14400 } - finalYear:int { 2008 } - } //Z#167 - /* America/Monterrey */ :table { - trans:intvector { -1514743200, 576057600, 594198000, 828864000, 846399600, 860313600, 877849200, 891763200, 909298800, 923212800, 941353200, 954662400, 972802800, 989136000, 1001833200, 1018166400, 1035702000 } - typeOffsets:intvector { -24076, 0, -21600, 0, -21600, 3600 } - typeMap:bin { "0102010201020102010201020102010201" } - finalRule { "Mexico" } - finalRaw:int { -21600 } - finalYear:int { 2003 } - } //Z#168 - /* America/Montevideo */ :table { - trans:intvector { -1567455316, -1459542600, -1443819600, -1428006600, -1412283600, -1396470600, -1380747600, -1141590600, -1128286800, -1110141000, -1096837200, -1078691400, -1065387600, -1046637000, -1033938000, -1015187400, -1002488400, -983737800, -971038800, -952288200, -938984400, -920838600, -907534800, -896819400, -883602000, -853619400, -845848800, -334789200, -319672800, -314226000, -309996000, -149720400, -134604000, -118270800, -100044000, -86821200, -68508000, -50446800, -34119000, -18910800, -2583000, 12625200, 28953000, 72932400, 82692000, 132116400, 156911400, 212983200, 250052400, 260244000, 307594800, 325994400, 566449200, 574308000, 597812400, 605671200, 625633200, 636516000, 656478000, 667965600, 688532400, 699415200, 719377200, 730864800, 1095562800, 1111896000, 1128834000, 1142136000, 1159678800, 1173585600, 1191733200, 1205035200, 1223182800, 1236484800, 1254632400, 1268539200, 1286082000, 1299988800, 1317531600, 1331438400, 1349586000, 1362888000, 1381035600, 1394337600, 1412485200, 1425787200 } - typeOffsets:intvector { -13484, 0, -12600, 0, -12600, 1800, -10800, 0, -10800, 1800, -10800, 3600 } - typeMap:bin { "0102010201020102010201020102010201020102010201020105030503050305030503050304030403040305030405030503050305030503050305030503050305030503050305030503050305030503050305030503" } - } //Z#169 - /* America/Montreal */ :int { 216 } //Z#170 - /* America/Montserrat */ :int { 186 } //Z#171 - /* America/Nassau */ :table { - trans:intvector { -1825095030, -179341200, -163620000, -147891600, -131565600, -116442000, -100116000, -84387600, -68666400, -52938000, -37216800, -21488400, -5767200, 9961200, 25682400, 41410800, 57736800, 73465200, 89186400, 104914800, 120636000, 136364400, 152085600, 167814000, 183535200, 199263600, 215589600, 230713200, 247039200, 262767600, 278488800, 294217200, 309938400, 325666800, 341388000, 357116400, 372837600, 388566000, 404892000, 420015600, 436341600, 452070000, 467791200, 483519600, 499240800, 514969200, 530690400, 544604400, 562140000, 576054000, 594194400, 607503600, 625644000, 638953200, 657093600, 671007600, 688543200, 702457200, 719992800, 733906800, 752047200, 765356400, 783496800, 796806000, 814946400, 828860400, 846396000, 860310000, 877845600, 891759600, 909295200, 923209200, 941349600, 954658800, 972799200, 986108400, 1004248800, 1018162800, 1035698400, 1049612400, 1067148000, 1081062000, 1099202400, 1112511600, 1130652000, 1143961200, 1162101600, 1173596400, 1194156000 } - typeOffsets:intvector { -18570, 0, -18000, 0, -18000, 3600 } - typeMap:bin { "0102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201" } - finalRule { "US" } - finalRaw:int { -18000 } - finalYear:int { 2008 } - } //Z#172 - /* America/New_York */ :table { - transPre32:intvector { -1, 1577316496 } - trans:intvector { -1633280400, -1615140000, -1601830800, -1583690400, -1570381200, -1551636000, -1536512400, -1523210400, -1504458000, -1491760800, -1473008400, -1459706400, -1441558800, -1428256800, -1410109200, -1396807200, -1378659600, -1365357600, -1347210000, -1333908000, -1315155600, -1301853600, -1283706000, -1270404000, -1252256400, -1238954400, -1220806800, -1207504800, -1189357200, -1176055200, -1157302800, -1144605600, -1125853200, -1112551200, -1094403600, -1081101600, -1062954000, -1049652000, -1031504400, -1018202400, -1000054800, -986752800, -968000400, -955303200, -936550800, -923248800, -905101200, -891799200, -880218000, -765396000, -747248400, -733946400, -715798800, -702496800, -684349200, -671047200, -652899600, -639597600, -620845200, -608148000, -589395600, -576093600, -557946000, -544644000, -526496400, -513194400, -495046800, -481744800, -463597200, -447271200, -431542800, -415821600, -400093200, -384372000, -368643600, -352922400, -337194000, -321472800, -305744400, -289418400, -273690000, -257968800, -242240400, -226519200, -210790800, -195069600, -179341200, -163620000, -147891600, -131565600, -116442000, -100116000, -84387600, -68666400, -52938000, -37216800, -21488400, -5767200, 9961200, 25682400, 41410800, 57736800, 73465200, 89186400, 104914800, 120636000, 126687600, 152085600, 162370800, 183535200, 199263600, 215589600, 230713200, 247039200, 262767600, 278488800, 294217200, 309938400, 325666800, 341388000, 357116400, 372837600, 388566000, 404892000, 420015600, 436341600, 452070000, 467791200, 483519600, 499240800, 514969200, 530690400, 544604400, 562140000, 576054000, 594194400, 607503600, 625644000, 638953200, 657093600, 671007600, 688543200, 702457200, 719992800, 733906800, 752047200, 765356400, 783496800, 796806000, 814946400, 828860400, 846396000, 860310000, 877845600, 891759600, 909295200, 923209200, 941349600, 954658800, 972799200, 986108400, 1004248800, 1018162800, 1035698400, 1049612400, 1067148000, 1081062000, 1099202400, 1112511600, 1130652000, 1143961200, 1162101600, 1173596400, 1194156000 } - typeOffsets:intvector { -17762, 0, -18000, 0, -18000, 3600 } - typeMap:bin { "01020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201" } - finalRule { "US" } - finalRaw:int { -18000 } - finalYear:int { 2008 } - links:intvector { 173, 618 } - } //Z#173 - /* America/Nipigon */ :table { - transPre32:intvector { -1, 1928233280 } - trans:intvector { -1632070800, -1615140000, -923252400, -765396000, 136364400, 152085600, 167814000, 183535200, 199263600, 215589600, 230713200, 247039200, 262767600, 278488800, 294217200, 309938400, 325666800, 341388000, 357116400, 372837600, 388566000, 404892000, 420015600, 436341600, 452070000, 467791200, 483519600, 499240800, 514969200, 530690400, 544604400, 562140000, 576054000, 594194400, 607503600, 625644000, 638953200, 657093600, 671007600, 688543200, 702457200, 719992800, 733906800, 752047200, 765356400, 783496800, 796806000, 814946400, 828860400, 846396000, 860310000, 877845600, 891759600, 909295200, 923209200, 941349600, 954658800, 972799200, 986108400, 1004248800, 1018162800, 1035698400, 1049612400, 1067148000, 1081062000, 1099202400, 1112511600, 1130652000, 1143961200, 1162101600, 1173596400, 1194156000 } - typeOffsets:intvector { -21184, 0, -18000, 0, -18000, 3600 } - typeMap:bin { "01020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201" } - finalRule { "Canada" } - finalRaw:int { -18000 } - finalYear:int { 2008 } - } //Z#174 - /* America/Nome */ :table { - transPre32:intvector { -1, 1069608595, -1, 2106019794 } - trans:intvector { -880196400, -765374400, -21466800, -5745600, 9982800, 25704000, 41432400, 57758400, 73486800, 89208000, 104936400, 120657600, 126709200, 152107200, 162392400, 183556800, 199285200, 215611200, 230734800, 247060800, 262789200, 278510400, 294238800, 309960000, 325688400, 341409600, 357138000, 372859200, 388587600, 404913600, 420037200, 436363200, 452084400, 467805600, 483534000, 499255200, 514983600, 530704800, 544618800, 562154400, 576068400, 594208800, 607518000, 625658400, 638967600, 657108000, 671022000, 688557600, 702471600, 720007200, 733921200, 752061600, 765370800, 783511200, 796820400, 814960800, 828874800, 846410400, 860324400, 877860000, 891774000, 909309600, 923223600, 941364000, 954673200, 972813600, 986122800, 1004263200, 1018177200, 1035712800, 1049626800, 1067162400, 1081076400, 1099216800, 1112526000, 1130666400, 1143975600, 1162116000, 1173610800, 1194170400 } - typeOffsets:intvector { 46701, 0, -39698, 0, -39600, 0, -39600, 3600, -32400, 0, -32400, 3600 } - typeMap:bin { "01020302030203020302030203020302030203020302030203020302030203020304050405040504050405040504050405040504050405040504050405040504050405040504050405040504050405040504" } - finalRule { "US" } - finalRaw:int { -32400 } - finalYear:int { 2008 } - } //Z#175 - /* America/Noronha */ :table { - trans:intvector { -1767217820, -1206961200, -1191366000, -1175378400, -1159830000, -633823200, -622072800, -602287200, -591836400, -570751200, -560214000, -539128800, -531356400, -191368800, -184201200, -155167200, -150073200, -128901600, -121129200, -99957600, -89593200, -68421600, -57970800, 499744800, 511232400, 530589600, 540262800, 562125600, 571194000, 592970400, 602038800, 624420000, 634698000, 938916000, 951613200, 970970400, 971571600, 1003024800, 1013907600 } - typeOffsets:intvector { -7780, 0, -7200, 0, -7200, 3600 } - typeMap:bin { "010201020102010201020102010201020102010201020102010201020102010201020102010201" } - links:intvector { 176, 373 } - } //Z#176 - /* America/North_Dakota/Beulah */ :table { - transPre32:intvector { -1, 1577323696 } - trans:intvector { -1633273200, -1615132800, -1601823600, -1583683200, -880210800, -765388800, -84380400, -68659200, -52930800, -37209600, -21481200, -5760000, 9968400, 25689600, 41418000, 57744000, 73472400, 89193600, 104922000, 120643200, 126694800, 152092800, 162378000, 183542400, 199270800, 215596800, 230720400, 247046400, 262774800, 278496000, 294224400, 309945600, 325674000, 341395200, 357123600, 372844800, 388573200, 404899200, 420022800, 436348800, 452077200, 467798400, 483526800, 499248000, 514976400, 530697600, 544611600, 562147200, 576061200, 594201600, 607510800, 625651200, 638960400, 657100800, 671014800, 688550400, 702464400, 720000000, 733914000, 752054400, 765363600, 783504000, 796813200, 814953600, 828867600, 846403200, 860317200, 877852800, 891766800, 909302400, 923216400, 941356800, 954666000, 972806400, 986115600, 1004256000, 1018170000, 1035705600, 1049619600, 1067155200, 1081069200, 1099209600, 1112518800, 1130659200, 1143968400, 1162108800, 1173603600, 1194163200, 1205053200, 1225612800, 1236502800, 1257062400, 1268557200, 1289116800, 1300003200, 1320562800 } - typeOffsets:intvector { -24427, 0, -25200, 0, -25200, 3600, -21600, 0, -21600, 3600 } - typeMap:bin { "01020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102030403" } - finalRule { "US" } - finalRaw:int { -21600 } - finalYear:int { 2012 } - } //Z#177 - /* America/North_Dakota/Center */ :table { - transPre32:intvector { -1, 1577323696 } - trans:intvector { -1633273200, -1615132800, -1601823600, -1583683200, -880210800, -765388800, -84380400, -68659200, -52930800, -37209600, -21481200, -5760000, 9968400, 25689600, 41418000, 57744000, 73472400, 89193600, 104922000, 120643200, 126694800, 152092800, 162378000, 183542400, 199270800, 215596800, 230720400, 247046400, 262774800, 278496000, 294224400, 309945600, 325674000, 341395200, 357123600, 372844800, 388573200, 404899200, 420022800, 436348800, 452077200, 467798400, 483526800, 499248000, 514976400, 530697600, 544611600, 562147200, 576061200, 594201600, 607510800, 625651200, 638960400, 657100800, 671014800, 688550400, 702464400, 720000000, 733910400, 752050800, 765360000, 783500400, 796809600, 814950000, 828864000, 846399600, 860313600, 877849200, 891763200, 909298800, 923212800, 941353200, 954662400, 972802800, 986112000, 1004252400, 1018166400, 1035702000, 1049616000, 1067151600, 1081065600, 1099206000, 1112515200, 1130655600, 1143964800, 1162105200, 1173600000, 1194159600 } - typeOffsets:intvector { -24312, 0, -25200, 0, -25200, 3600, -21600, 0, -21600, 3600 } - typeMap:bin { "0102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010203040304030403040304030403040304030403040304030403040304030403" } - finalRule { "US" } - finalRaw:int { -21600 } - finalYear:int { 2008 } - } //Z#178 - /* America/North_Dakota/New_Salem */ :table { - transPre32:intvector { -1, 1577323696 } - trans:intvector { -1633273200, -1615132800, -1601823600, -1583683200, -880210800, -765388800, -84380400, -68659200, -52930800, -37209600, -21481200, -5760000, 9968400, 25689600, 41418000, 57744000, 73472400, 89193600, 104922000, 120643200, 126694800, 152092800, 162378000, 183542400, 199270800, 215596800, 230720400, 247046400, 262774800, 278496000, 294224400, 309945600, 325674000, 341395200, 357123600, 372844800, 388573200, 404899200, 420022800, 436348800, 452077200, 467798400, 483526800, 499248000, 514976400, 530697600, 544611600, 562147200, 576061200, 594201600, 607510800, 625651200, 638960400, 657100800, 671014800, 688550400, 702464400, 720000000, 733914000, 752054400, 765363600, 783504000, 796813200, 814953600, 828867600, 846403200, 860317200, 877852800, 891766800, 909302400, 923216400, 941356800, 954666000, 972806400, 986115600, 1004256000, 1018170000, 1035705600, 1049619600, 1067155200, 1081065600, 1099206000, 1112515200, 1130655600, 1143964800, 1162105200, 1173600000, 1194159600 } - typeOffsets:intvector { -24339, 0, -25200, 0, -25200, 3600, -21600, 0, -21600, 3600 } - typeMap:bin { "0102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102030403040304030403" } - finalRule { "US" } - finalRaw:int { -21600 } - finalYear:int { 2008 } - } //Z#179 - /* America/Ojinaga */ :table { - trans:intvector { -1514739600, -1343066400, -1234807200, -1220292000, -1207159200, -1191344400, 828864000, 846399600, 860313600, 877849200, 891766800, 909302400, 923216400, 941356800, 954666000, 972806400, 989139600, 1001836800, 1018170000, 1035705600, 1049619600, 1067155200, 1081069200, 1099209600, 1112518800, 1130659200, 1143968400, 1162108800, 1175418000, 1193558400, 1207472400, 1225008000, 1238922000, 1256457600, 1268557200, 1289116800 } - typeOffsets:intvector { -25060, 0, -25200, 0, -25200, 3600, -21600, 0, -21600, 3600 } - typeMap:bin { "010301030103040304030201020102010201020102010201020102010201020102010201" } - finalRule { "US" } - finalRaw:int { -25200 } - finalYear:int { 2011 } - } //Z#180 - /* America/Panama */ :table { - transPre32:intvector { -1, 1770464784 } - trans:intvector { -1946918424 } - typeOffsets:intvector { -19088, 0, -19176, 0, -18000, 0 } - typeMap:bin { "0102" } - links:intvector { 97, 181 } - } //Z#181 - /* America/Pangnirtung */ :table { - trans:intvector { -1546300800, -880221600, -765399600, -147902400, -131572800, 325663200, 341384400, 357112800, 372834000, 388562400, 404888400, 420012000, 436338000, 452066400, 467787600, 483516000, 499237200, 514965600, 530686800, 544600800, 562136400, 576050400, 594190800, 607500000, 625640400, 638949600, 657090000, 671004000, 688539600, 702453600, 719989200, 733903200, 752043600, 765352800, 783493200, 796802400, 814946400, 828860400, 846396000, 860310000, 877845600, 891759600, 909295200, 923209200, 941349600, 954662400, 972802800, 986108400, 1004248800, 1018162800, 1035698400, 1049612400, 1067148000, 1081062000, 1099202400, 1112511600, 1130652000, 1143961200, 1162101600, 1173596400, 1194156000 } - typeOffsets:intvector { 0, 0, -21600, 0, -21600, 3600, -18000, 0, -18000, 3600, -14400, 0, -14400, 3600, -14400, 7200 } - typeMap:bin { "05060507050605060506050605060506050605060506050605060506050605060506050403040304030403040102030403040304030403040304030403" } - finalRule { "Canada" } - finalRaw:int { -18000 } - finalYear:int { 2008 } - } //Z#182 - /* America/Paramaribo */ :table { - trans:intvector { -1861906760, -1104524348, -765317964, 465449400 } - typeOffsets:intvector { -13240, 0, -13252, 0, -13236, 0, -12600, 0, -10800, 0 } - typeMap:bin { "01020304" } - } //Z#183 - /* America/Phoenix */ :table { - transPre32:intvector { -1, 1577323696 } - trans:intvector { -1633273200, -1615132800, -1601823600, -1583683200, -880210800, -820519140, -812653140, -796845540, -84380400, -68659200 } - typeOffsets:intvector { -26898, 0, -25200, 0, -25200, 3600 } - typeMap:bin { "0102010201020102010201" } - links:intvector { 184, 544, 615 } - } //Z#184 - /* America/Port-au-Prince */ :table { - transPre32:intvector { -1, 1770463056 } - trans:intvector { -1670483460, 421218000, 436334400, 452062800, 467784000, 483512400, 499233600, 514962000, 530683200, 546411600, 562132800, 576050400, 594194400, 607500000, 625644000, 638949600, 657093600, 671004000, 688543200, 702453600, 719992800, 733903200, 752047200, 765352800, 783496800, 796802400, 814946400, 828856800, 846396000, 860306400, 877845600, 1112504400, 1130644800, 1143954000, 1162094400, 1331449200, 1352008800, 1362898800, 1383458400, 1394348400, 1414908000, 1425798000, 1446357600 } - typeOffsets:intvector { -17360, 0, -18000, 0, -18000, 3600, -17340, 0 } - typeMap:bin { "0301020102010201020102010201020102010201020102010201020102010201020102010201020102010201" } - } //Z#185 - /* America/Port_of_Spain */ :table { - trans:intvector { -1825098836 } - typeOffsets:intvector { -14764, 0, -14400, 0 } - typeMap:bin { "01" } - links:intvector { 61, 62, 111, 123, 124, 157, 171, 186, 205, 207, 208, 209, 210, 217, 219 } - } //Z#186 - /* America/Porto_Acre */ :int { 195 } //Z#187 - /* America/Porto_Velho */ :table { - trans:intvector { -1767210264, -1206954000, -1191358800, -1175371200, -1159822800, -633816000, -622065600, -602280000, -591829200, -570744000, -560206800, -539121600, -531349200, -191361600, -184194000, -155160000, -150066000, -128894400, -121122000, -99950400, -89586000, -68414400, -57963600, 499752000, 511239600, 530596800, 540270000, 562132800, 571201200 } - typeOffsets:intvector { -15336, 0, -14400, 0, -14400, 3600 } - typeMap:bin { "0102010201020102010201020102010201020102010201020102010201" } - } //Z#188 - /* America/Puerto_Rico */ :table { - transPre32:intvector { -1, 2061931961 } - trans:intvector { -873057600, -765399600 } - typeOffsets:intvector { -15865, 0, -14400, 0, -14400, 3600 } - typeMap:bin { "010201" } - links:intvector { 189, 546 } - } //Z#189 - /* America/Rainy_River */ :table { - transPre32:intvector { -1, 1928234792 } - trans:intvector { -1632067200, -1615136400, -923248800, -765392400, 136368000, 152089200, 167817600, 183538800, 199267200, 215593200, 230716800, 247042800, 262771200, 278492400, 294220800, 309942000, 325670400, 341391600, 357120000, 372841200, 388569600, 404895600, 420019200, 436345200, 452073600, 467794800, 483523200, 499244400, 514972800, 530694000, 544608000, 562143600, 576057600, 594198000, 607507200, 625647600, 638956800, 657097200, 671011200, 688546800, 702460800, 719996400, 733910400, 752050800, 765360000, 783500400, 796809600, 814950000, 828864000, 846399600, 860313600, 877849200, 891763200, 909298800, 923212800, 941353200, 954662400, 972802800, 986112000, 1004252400, 1018166400, 1035702000, 1049616000, 1067151600, 1081065600, 1099206000, 1112515200, 1130655600, 1143964800, 1162105200, 1173600000, 1194159600 } - typeOffsets:intvector { -22696, 0, -21600, 0, -21600, 3600 } - typeMap:bin { "01020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201" } - finalRule { "Canada" } - finalRaw:int { -21600 } - finalYear:int { 2008 } - } //Z#190 - /* America/Rankin_Inlet */ :table { - trans:intvector { -410227200, -147895200, -131565600, 325670400, 341391600, 357120000, 372841200, 388569600, 404895600, 420019200, 436345200, 452073600, 467794800, 483523200, 499244400, 514972800, 530694000, 544608000, 562143600, 576057600, 594198000, 607507200, 625647600, 638956800, 657097200, 671011200, 688546800, 702460800, 719996400, 733910400, 752050800, 765360000, 783500400, 796809600, 814950000, 828864000, 846399600, 860313600, 877849200, 891763200, 909298800, 923212800, 941353200, 954662400, 972802800, 986112000, 1004252400, 1018166400, 1035702000, 1049616000, 1067151600, 1081065600, 1099206000, 1112515200, 1130655600, 1143964800, 1162105200, 1173600000, 1194159600 } - typeOffsets:intvector { 0, 0, -21600, 0, -21600, 3600, -21600, 7200, -18000, 0 } - typeMap:bin { "0103010201020102010201020102010201020102010201020102010201020102010201020102010201020102040201020102010201020102010201" } - finalRule { "Canada" } - finalRaw:int { -21600 } - finalYear:int { 2008 } - } //Z#191 - /* America/Recife */ :table { - trans:intvector { -1767217224, -1206957600, -1191362400, -1175374800, -1159826400, -633819600, -622069200, -602283600, -591832800, -570747600, -560210400, -539125200, -531352800, -191365200, -184197600, -155163600, -150069600, -128898000, -121125600, -99954000, -89589600, -68418000, -57967200, 499748400, 511236000, 530593200, 540266400, 562129200, 571197600, 592974000, 602042400, 624423600, 634701600, 938919600, 951616800, 970974000, 971575200, 1003028400, 1013911200 } - typeOffsets:intvector { -8376, 0, -10800, 0, -10800, 3600 } - typeMap:bin { "010201020102010201020102010201020102010201020102010201020102010201020102010201" } - } //Z#192 - /* America/Regina */ :table { - trans:intvector { -2030202084, -1632063600, -1615132800, -1251651600, -1238349600, -1220202000, -1206900000, -1188752400, -1175450400, -1156698000, -1144000800, -1125248400, -1111946400, -1032714000, -1016992800, -1001264400, -986148000, -969814800, -954093600, -937760400, -922039200, -906310800, -890589600, -880210800, -765388800, -748450800, -732729600, -715791600, -702489600, -684342000, -671040000, -652892400, -639590400, -620838000, -608140800, -589388400, -576086400, -557938800, -544636800, -526489200, -513187200, -495039600, -481737600, -463590000, -450288000, -431535600, -418233600, -400086000, -386784000, -337186800, -321465600, -305737200 } - typeOffsets:intvector { -25116, 0, -25200, 0, -25200, 3600, -21600, 0 } - typeMap:bin { "01020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020103" } - links:intvector { 193, 384, 389 } - } //Z#193 - /* America/Resolute */ :table { - trans:intvector { -704937600, -147895200, -131565600, 325670400, 341391600, 357120000, 372841200, 388569600, 404895600, 420019200, 436345200, 452073600, 467794800, 483523200, 499244400, 514972800, 530694000, 544608000, 562143600, 576057600, 594198000, 607507200, 625647600, 638956800, 657097200, 671011200, 688546800, 702460800, 719996400, 733910400, 752050800, 765360000, 783500400, 796809600, 814950000, 828864000, 846399600, 860313600, 877849200, 891763200, 909298800, 923212800, 941353200, 954662400, 972802800, 986112000, 1004252400, 1018166400, 1035702000, 1049616000, 1067151600, 1081065600, 1099206000, 1112515200, 1130655600, 1143964800, 1162105200, 1173600000, 1194159600 } - typeOffsets:intvector { 0, 0, -21600, 0, -21600, 3600, -21600, 7200, -18000, 0 } - typeMap:bin { "0103010201020102010201020102010201020102010201020102010201020102010201020102010201020102040201020102010201020102040201" } - finalRule { "Canada" } - finalRaw:int { -21600 } - finalYear:int { 2008 } - } //Z#194 - /* America/Rio_Branco */ :table { - trans:intvector { -1767209328, -1206950400, -1191355200, -1175367600, -1159819200, -633812400, -622062000, -602276400, -591825600, -570740400, -560203200, -539118000, -531345600, -191358000, -184190400, -155156400, -150062400, -128890800, -121118400, -99946800, -89582400, -68410800, -57960000, 499755600, 511243200, 530600400, 540273600, 562136400, 571204800, 1214283600, 1384056000 } - typeOffsets:intvector { -16272, 0, -18000, 0, -18000, 3600, -14400, 0 } - typeMap:bin { "01020102010201020102010201020102010201020102010201020102010301" } - links:intvector { 187, 195, 372 } - } //Z#195 - /* America/Rosario */ :int { 67 } //Z#196 - /* America/Santa_Isabel */ :int { 215 } //Z#197 - /* America/Santarem */ :table { - trans:intvector { -1767212472, -1206954000, -1191358800, -1175371200, -1159822800, -633816000, -622065600, -602280000, -591829200, -570744000, -560206800, -539121600, -531349200, -191361600, -184194000, -155160000, -150066000, -128894400, -121122000, -99950400, -89586000, -68414400, -57963600, 499752000, 511239600, 530596800, 540270000, 562132800, 571201200, 1214280000 } - typeOffsets:intvector { -13128, 0, -14400, 0, -14400, 3600, -10800, 0 } - typeMap:bin { "010201020102010201020102010201020102010201020102010201020103" } - } //Z#198 - /* America/Santiago */ :table { - trans:intvector { -1892661434, -1688410800, -1619205434, -1593806400, -1335986234, -1317585600, -1304362800, -1286049600, -1272826800, -1254513600, -1241290800, -1222977600, -1209754800, -1191355200, -1178132400, -870552000, -865278000, -740520000, -736376400, -718056000, -713649600, -36619200, -23922000, -3355200, 7527600, 24465600, 37767600, 55915200, 69217200, 87969600, 100666800, 118209600, 132116400, 150868800, 163566000, 182318400, 195620400, 213768000, 227070000, 245217600, 258519600, 277272000, 289969200, 308721600, 321418800, 340171200, 353473200, 371620800, 384922800, 403070400, 416372400, 434520000, 447822000, 466574400, 479271600, 498024000, 510721200, 529473600, 545194800, 560923200, 574225200, 592372800, 605674800, 624427200, 637124400, 653457600, 668574000, 687326400, 700628400, 718776000, 732078000, 750225600, 763527600, 781675200, 794977200, 813729600, 826426800, 845179200, 859690800, 876628800, 889930800, 906868800, 923194800, 939528000, 952830000, 971582400, 984279600, 1003032000, 1015729200, 1034481600, 1047178800, 1065931200, 1079233200, 1097380800, 1110682800, 1128830400, 1142132400, 1160884800, 1173582000, 1192334400, 1206846000, 1223784000, 1237086000, 1255233600, 1270350000, 1286683200, 1304823600, 1313899200, 1335668400, 1346558400, 1367118000, 1378612800, 1398567600, 1410062400, 1463281200, 1471147200 } - typeOffsets:intvector { -16966, 0, -18000, 0, -18000, 3600, -14400, 0, -14400, 3600 } - typeMap:bin { "0100030002010201020102010201030103040301030403040304030403040304030403040304030403040304030403040304030403040304030403040304030403040304030403040304030403040304030403040304030403040304030403040304030403040304030403040304030403040304" } - finalRule { "Chile" } - finalRaw:int { -14400 } - finalYear:int { 2017 } - links:intvector { 199, 391 } - } //Z#199 - /* America/Santo_Domingo */ :table { - transPre32:intvector { -1, 1770462472 } - trans:intvector { -1159773600, -100119600, -89668800, -5770800, 4422600, 25678800, 33193800, 57733200, 64816200, 89182800, 96438600, 120632400, 127974600, 152082000, 972799200, 975823200 } - typeOffsets:intvector { -16776, 0, -18000, 0, -18000, 1800, -18000, 3600, -16800, 0, -14400, 0 } - typeMap:bin { "0401030102010201020102010201050105" } - } //Z#200 - /* America/Sao_Paulo */ :table { - trans:intvector { -1767214412, -1206957600, -1191362400, -1175374800, -1159826400, -633819600, -622069200, -602283600, -591832800, -570747600, -560210400, -539125200, -531352800, -195426000, -184197600, -155163600, -150069600, -128898000, -121125600, -99954000, -89589600, -68418000, -57967200, 499748400, 511236000, 530593200, 540266400, 562129200, 571197600, 592974000, 602042400, 624423600, 634701600, 656478000, 666756000, 687927600, 697600800, 719982000, 728445600, 750826800, 761709600, 782276400, 793159200, 813726000, 824004000, 844570800, 856058400, 876106800, 888717600, 908074800, 919562400, 938919600, 951616800, 970974000, 982461600, 1003028400, 1013911200, 1036292400, 1045360800, 1066532400, 1076810400, 1099364400, 1108864800, 1129431600, 1140314400, 1162695600, 1172368800, 1192330800, 1203213600, 1224385200, 1234663200, 1255834800, 1266717600, 1287284400, 1298167200, 1318734000, 1330221600, 1350788400, 1361066400, 1382238000, 1392516000, 1413687600, 1424570400, 1445137200, 1456020000, 1476586800, 1487469600, 1508036400, 1518919200, 1540090800, 1550368800, 1571540400, 1581818400, 1602990000, 1613872800, 1634439600, 1645322400, 1665889200, 1677376800, 1697338800, 1708221600, 1729393200, 1739671200, 1760842800, 1771725600, 1792292400, 1803175200, 1823742000, 1834624800, 1855191600, 1866074400, 1887246000, 1897524000, 1918695600, 1928973600, 1950145200, 1960423200, 1981594800, 1992477600, 2013044400, 2024532000, 2044494000, 2055376800, 2076548400, 2086826400, 2107998000, 2118880800, 2139447600 } - transPost32:intvector { 0, -2144636896, 0, -2124070096 } - typeOffsets:intvector { -11188, 0, -10800, 0, -10800, 3600 } - typeMap:bin { "01020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102" } - finalRule { "Brazil" } - finalRaw:int { -10800 } - finalYear:int { 2039 } - links:intvector { 201, 370, 374 } - } //Z#201 - /* America/Scoresbysund */ :table { - trans:intvector { -1686090728, 323841600, 338961600, 354679200, 370400400, 386125200, 401850000, 417574800, 433299600, 449024400, 465354000, 481078800, 496803600, 512528400, 528253200, 543978000, 559702800, 575427600, 591152400, 606877200, 622602000, 638326800, 654656400, 670381200, 686106000, 701830800, 717555600, 733280400, 749005200, 764730000, 780454800, 796179600, 811904400, 828234000, 846378000 } - typeOffsets:intvector { -5272, 0, -7200, 0, -7200, 3600, -3600, 0, -3600, 3600 } - typeMap:bin { "0102010403040304030403040304030403040304030403040304030403040304030403" } - finalRule { "EU" } - finalRaw:int { -3600 } - finalYear:int { 1997 } - } //Z#202 - /* America/Shiprock */ :int { 109 } //Z#203 - /* America/Sitka */ :table { - transPre32:intvector { -1, 1069601369, -1, 2106012569 } - trans:intvector { -880207200, -765385200, -21477600, -5756400, 9972000, 25693200, 41421600, 57747600, 73476000, 89197200, 104925600, 120646800, 126698400, 152096400, 162381600, 183546000, 199274400, 215600400, 230724000, 247050000, 262778400, 278499600, 294228000, 309949200, 325677600, 341398800, 357127200, 372848400, 388576800, 404902800, 420026400, 436352400, 452084400, 467805600, 483534000, 499255200, 514983600, 530704800, 544618800, 562154400, 576068400, 594208800, 607518000, 625658400, 638967600, 657108000, 671022000, 688557600, 702471600, 720007200, 733921200, 752061600, 765370800, 783511200, 796820400, 814960800, 828874800, 846410400, 860324400, 877860000, 891774000, 909309600, 923223600, 941364000, 954673200, 972813600, 986122800, 1004263200, 1018177200, 1035712800, 1049626800, 1067162400, 1081076400, 1099216800, 1112526000, 1130666400, 1143975600, 1162116000, 1173610800, 1194170400 } - typeOffsets:intvector { 53927, 0, -32473, 0, -32400, 0, -32400, 3600, -28800, 0, -28800, 3600 } - typeMap:bin { "01040504050405040504050405040504050405040504050405040504050405040502030203020302030203020302030203020302030203020302030203020302030203020302030203020302030203020302" } - finalRule { "US" } - finalRaw:int { -32400 } - finalYear:int { 2008 } - } //Z#204 - /* America/St_Barthelemy */ :int { 186 } //Z#205 - /* America/St_Johns */ :table { - trans:intvector { -1664130548, -1650137348, -1632076148, -1615145348, -1598650148, -1590100148, -1567286948, -1551565748, -1535837348, -1520116148, -1503782948, -1488666548, -1472333348, -1457216948, -1440883748, -1425767348, -1409434148, -1394317748, -1377984548, -1362263348, -1346534948, -1330813748, -1314480548, -1299364148, -1283030948, -1267914548, -1251581348, -1236464948, -1220131748, -1205015348, -1188682148, -1172960948, -1156627748, -1141511348, -1125178148, -1110061748, -1096921748, -1093728600, -1078612200, -1061670600, -1048973400, -1030221000, -1017523800, -998771400, -986074200, -966717000, -954624600, -935267400, -922570200, -903817800, -891120600, -872368200, -765401400, -746044200, -733347000, -714594600, -701897400, -683145000, -670447800, -651695400, -638998200, -619641000, -606943800, -589401000, -576099000, -557951400, -544649400, -526501800, -513199800, -495052200, -481750200, -463602600, -450300600, -431548200, -418246200, -400098600, -386796600, -368649000, -355347000, -337199400, -323897400, -305749800, -289423800, -273695400, -257974200, -242245800, -226524600, -210796200, -195075000, -179346600, -163625400, -147897000, -131571000, -116447400, -100121400, -84393000, -68671800, -52943400, -37222200, -21493800, -5772600, 9955800, 25677000, 41405400, 57731400, 73459800, 89181000, 104909400, 120630600, 136359000, 152080200, 167808600, 183529800, 199258200, 215584200, 230707800, 247033800, 262762200, 278483400, 294211800, 309933000, 325661400, 341382600, 357111000, 372832200, 388560600, 404886600, 420010200, 436336200, 452064600, 467785800, 483514200, 499235400, 514963800, 530685000, 544591860, 562127460, 576041460, 594178260, 607491060, 625631460, 638940660, 657081060, 670995060, 688530660, 702444660, 719980260, 733894260, 752034660, 765343860, 783484260, 796793460, 814933860, 828847860, 846383460, 860297460, 877833060, 891747060, 909282660, 923196660, 941337060, 954646260, 972786660, 986095860, 1004236260, 1018150260, 1035685860, 1049599860, 1067135460, 1081049460, 1099189860, 1112499060, 1130639460, 1143948660, 1162089060, 1173583860, 1194143460, 1205033460, 1225593060, 1236483060, 1257042660, 1268537460, 1289097060, 1299987060, 1320553800, 1331443800, 1352003400 } - typeOffsets:intvector { -12652, 0, -12652, 3600, -12600, 0, -12600, 3600, -12600, 7200 } - typeMap:bin { "01000100010001000100010001000100010001000100010001000100010001000100010002030203020302030203020302030203020302030203020302030203020302030203020302030203020302030203020302030203020302030203020302030203020302030203020302030203020302030203020302030203020302030203020302030203020402030203020302030203020302030203020302030203020302030203020302030203020302030203020302030203020302" } - finalRule { "Canada" } - finalRaw:int { -12600 } - finalYear:int { 2013 } - links:intvector { 206, 378, 387 } - } //Z#206 - /* America/St_Kitts */ :int { 186 } //Z#207 - /* America/St_Lucia */ :int { 186 } //Z#208 - /* America/St_Thomas */ :int { 186 } //Z#209 - /* America/St_Vincent */ :int { 186 } //Z#210 - /* America/Swift_Current */ :table { - trans:intvector { -2030201320, -1632063600, -1615132800, -880210800, -765388800, -747241200, -732729600, -715791600, -702489600, -684342000, -671040000, -652892400, -639590400, -400086000, -384364800, -337186800, -321465600, -305737200, -292435200, -273682800, -260985600, 73472400 } - typeOffsets:intvector { -25880, 0, -25200, 0, -25200, 3600, -21600, 0 } - typeMap:bin { "01020102010201020102010201020102010201020103" } - } //Z#211 - /* America/Tegucigalpa */ :table { - trans:intvector { -1538503868, 547020000, 559717200, 578469600, 591166800, 1146981600, 1154926800 } - typeOffsets:intvector { -20932, 0, -21600, 0, -21600, 3600 } - typeMap:bin { "01020102010201" } - } //Z#212 - /* America/Thule */ :table { - trans:intvector { -1686079492, 670399200, 686120400, 701848800, 717570000, 733903200, 752043600, 765352800, 783493200, 796802400, 814942800, 828856800, 846392400, 860306400, 877842000, 891756000, 909291600, 923205600, 941346000, 954655200, 972795600, 986104800, 1004245200, 1018159200, 1035694800, 1049608800, 1067144400, 1081058400, 1099198800, 1112508000, 1130648400, 1143957600, 1162098000, 1173592800, 1194152400 } - typeOffsets:intvector { -16508, 0, -14400, 0, -14400, 3600 } - typeMap:bin { "0102010201020102010201020102010201020102010201020102010201020102010201" } - finalRule { "Thule" } - finalRaw:int { -14400 } - finalYear:int { 2008 } - } //Z#213 - /* America/Thunder_Bay */ :table { - transPre32:intvector { -1, 1928233516 } - trans:intvector { -1893434400, -880218000, -765396000, 9961200, 25682400, 41410800, 57736800, 73465200, 89186400, 136364400, 152085600, 167814000, 183535200, 199263600, 215589600, 230713200, 247039200, 262767600, 278488800, 294217200, 309938400, 325666800, 341388000, 357116400, 372837600, 388566000, 404892000, 420015600, 436341600, 452070000, 467791200, 483519600, 499240800, 514969200, 530690400, 544604400, 562140000, 576054000, 594194400, 607503600, 625644000, 638953200, 657093600, 671007600, 688543200, 702457200, 719992800, 733906800, 752047200, 765356400, 783496800, 796806000, 814946400, 828860400, 846396000, 860310000, 877845600, 891759600, 909295200, 923209200, 941349600, 954658800, 972799200, 986108400, 1004248800, 1018162800, 1035698400, 1049612400, 1067148000, 1081062000, 1099202400, 1112511600, 1130652000, 1143961200, 1162101600, 1173596400, 1194156000 } - typeOffsets:intvector { -21420, 0, -21600, 0, -18000, 0, -18000, 3600 } - typeMap:bin { "010203020302030203020302030203020302030203020302030203020302030203020302030203020302030203020302030203020302030203020302030203020302030203020302030203020302" } - finalRule { "Canada" } - finalRaw:int { -18000 } - finalYear:int { 2008 } - } //Z#214 - /* America/Tijuana */ :table { - trans:intvector { -1514736000, -1451667600, -1343062800, -1234803600, -1222963200, -1207242000, -873820800, -761677200, -686073600, -661539600, -495039600, -481734000, -463590000, -450284400, -431535600, -418230000, -400086000, -386780400, -368636400, -355330800, -337186800, -323881200, -305737200, -292431600, 199274400, 215600400, 230724000, 247050000, 262778400, 278499600, 294228000, 309949200, 325677600, 341398800, 357127200, 372848400, 388576800, 404902800, 420026400, 436352400, 452080800, 467802000, 483530400, 499251600, 514980000, 530701200, 544615200, 562150800, 576064800, 594205200, 607514400, 625654800, 638964000, 657104400, 671018400, 688554000, 702468000, 720003600, 733917600, 752058000, 765367200, 783507600, 796816800, 814957200, 828871200, 846406800, 860320800, 877856400, 891770400, 909306000, 923220000, 941360400, 954669600, 972810000, 986119200, 1004259600, 1018173600, 1035709200, 1049623200, 1067158800, 1081072800, 1099213200, 1112522400, 1130662800, 1143972000, 1162112400, 1175421600, 1193562000, 1207476000, 1225011600, 1238925600, 1256461200, 1268560800, 1289120400 } - typeOffsets:intvector { -28084, 0, -28800, 0, -28800, 3600, -25200, 0 } - typeMap:bin { "03010301020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201" } - finalRule { "US" } - finalRaw:int { -28800 } - finalYear:int { 2011 } - links:intvector { 115, 197, 215, 535 } - } //Z#215 - /* America/Toronto */ :table { - transPre32:intvector { -1, 1928231148 } - trans:intvector { -1632070800, -1615140000, -1601753400, -1583697600, -1567357200, -1554667200, -1534698000, -1524074400, -1503248400, -1492365600, -1471798800, -1460916000, -1440954000, -1428861600, -1409504400, -1397412000, -1378054800, -1365962400, -1346605200, -1333908000, -1315155600, -1301853600, -1283706000, -1270404000, -1252256400, -1238954400, -1220806800, -1207504800, -1188752400, -1176055200, -1157302800, -1144000800, -1125853200, -1112551200, -1094403600, -1081101600, -1062954000, -1049652000, -1031504400, -1018202400, -1000054800, -986752800, -968000400, -955303200, -936550800, -765396000, -747248400, -733946400, -715806000, -702504000, -684356400, -671054400, -652906800, -634161600, -620845200, -602704800, -589395600, -576093600, -557946000, -544644000, -526496400, -513194400, -495046800, -481744800, -463597200, -450295200, -431542800, -418240800, -400093200, -384372000, -368643600, -352922400, -337194000, -321472800, -305744400, -289418400, -273690000, -257968800, -242240400, -226519200, -210790800, -195069600, -179341200, -163620000, -147891600, -131565600, -116442000, -100116000, -84387600, -68666400, -52938000, -37216800, -21488400, -5767200, 9961200, 25682400, 41410800, 57736800, 73465200, 89186400, 104914800, 120636000, 136364400, 152085600, 167814000, 183535200, 199263600, 215589600, 230713200, 247039200, 262767600, 278488800, 294217200, 309938400, 325666800, 341388000, 357116400, 372837600, 388566000, 404892000, 420015600, 436341600, 452070000, 467791200, 483519600, 499240800, 514969200, 530690400, 544604400, 562140000, 576054000, 594194400, 607503600, 625644000, 638953200, 657093600, 671007600, 688543200, 702457200, 719992800, 733906800, 752047200, 765356400, 783496800, 796806000, 814946400, 828860400, 846396000, 860310000, 877845600, 891759600, 909295200, 923209200, 941349600, 954658800, 972799200, 986108400, 1004248800, 1018162800, 1035698400, 1049612400, 1067148000, 1081062000, 1099202400, 1112511600, 1130652000, 1143961200, 1162101600, 1173596400, 1194156000 } - typeOffsets:intvector { -19052, 0, -18000, 0, -18000, 3600 } - typeMap:bin { "010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201" } - finalRule { "Canada" } - finalRaw:int { -18000 } - finalYear:int { 2008 } - links:intvector { 170, 216, 385 } - } //Z#216 - /* America/Tortola */ :int { 186 } //Z#217 - /* America/Vancouver */ :table { - transPre32:intvector { -1, 1581086444 } - trans:intvector { -1632060000, -1615129200, -880207200, -765385200, -747237600, -732726000, -715788000, -702486000, -684338400, -671036400, -652888800, -639586800, -620834400, -608137200, -589384800, -576082800, -557935200, -544633200, -526485600, -513183600, -495036000, -481734000, -463586400, -450284400, -431532000, -418230000, -400082400, -386780400, -368632800, -355330800, -337183200, -323881200, -305733600, -292431600, -273679200, -260982000, -242229600, -226508400, -210780000, -195058800, -179330400, -163609200, -147880800, -131554800, -116431200, -100105200, -84376800, -68655600, -52927200, -37206000, -21477600, -5756400, 9972000, 25693200, 41421600, 57747600, 73476000, 89197200, 104925600, 120646800, 136375200, 152096400, 167824800, 183546000, 199274400, 215600400, 230724000, 247050000, 262778400, 278499600, 294228000, 309949200, 325677600, 341398800, 357127200, 372848400, 388576800, 404902800, 420026400, 436352400, 452080800, 467802000, 483530400, 499251600, 514980000, 530701200, 544615200, 562150800, 576064800, 594205200, 607514400, 625654800, 638964000, 657104400, 671018400, 688554000, 702468000, 720003600, 733917600, 752058000, 765367200, 783507600, 796816800, 814957200, 828871200, 846406800, 860320800, 877856400, 891770400, 909306000, 923220000, 941360400, 954669600, 972810000, 986119200, 1004259600, 1018173600, 1035709200, 1049623200, 1067158800, 1081072800, 1099213200, 1112522400, 1130662800, 1143972000, 1162112400, 1173607200, 1194166800 } - typeOffsets:intvector { -29548, 0, -28800, 0, -28800, 3600 } - typeMap:bin { "010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201" } - finalRule { "Canada" } - finalRaw:int { -28800 } - finalYear:int { 2008 } - links:intvector { 218, 388 } - } //Z#218 - /* America/Virgin */ :int { 186 } //Z#219 - /* America/Whitehorse */ :table { - transPre32:intvector { -1, 2105969308 } - trans:intvector { -1632056400, -1615125600, -1596978000, -1583164800, -880203600, -765381600, -147884400, -131554800, -81961200, 325677600, 341398800, 357127200, 372848400, 388576800, 404902800, 420026400, 436352400, 452080800, 467802000, 483530400, 499251600, 514980000, 530701200, 544615200, 562150800, 576064800, 594205200, 607514400, 625654800, 638964000, 657104400, 671018400, 688554000, 702468000, 720003600, 733917600, 752058000, 765367200, 783507600, 796816800, 814957200, 828871200, 846406800, 860320800, 877856400, 891770400, 909306000, 923220000, 941360400, 954669600, 972810000, 986119200, 1004259600, 1018173600, 1035709200, 1049623200, 1067158800, 1081072800, 1099213200, 1112522400, 1130662800, 1143972000, 1162112400, 1173607200, 1194166800 } - typeOffsets:intvector { -32412, 0, -32400, 0, -32400, 3600, -32400, 7200, -28800, 0, -28800, 3600 } - typeMap:bin { "010201020102010301040504050405040504050405040504050405040504050405040504050405040504050405040504050405040504050405040504050405040504" } - finalRule { "Canada" } - finalRaw:int { -28800 } - finalYear:int { 2008 } - links:intvector { 220, 390 } - } //Z#220 - /* America/Winnipeg */ :table { - transPre32:intvector { -1, 1692709012 } - trans:intvector { -1694368800, -1681671600, -1632067200, -1615136400, -1029686400, -1018198800, -880214400, -765392400, -746035200, -732733200, -715795200, -702493200, -684345600, -671043600, -652896000, -639594000, -620755200, -607626000, -589392000, -576090000, -557942400, -544640400, -526492800, -513190800, -495043200, -481741200, -463593600, -450291600, -431539200, -418237200, -400089600, -386787600, -368640000, -355338000, -337190400, -321469200, -305740800, -292438800, -210787200, -198090000, -116438400, -100108800, -84384000, -68659200, -52934400, -37209600, -21484800, -5760000, 9964800, 25689600, 41414400, 57744000, 73468800, 89193600, 104918400, 120643200, 136368000, 152092800, 167817600, 183542400, 199267200, 215596800, 230716800, 247046400, 262771200, 278496000, 294220800, 309945600, 325670400, 341395200, 357120000, 372844800, 388569600, 404899200, 420019200, 436348800, 452073600, 467798400, 483523200, 499248000, 514972800, 530697600, 544608000, 562147200, 576057600, 594201600, 607507200, 625651200, 638956800, 657100800, 671011200, 688550400, 702460800, 720000000, 733910400, 752054400, 765360000, 783504000, 796809600, 814953600, 828864000, 846403200, 860313600, 877852800, 891763200, 909302400, 923212800, 941356800, 954662400, 972806400, 986112000, 1004256000, 1018166400, 1035705600, 1049616000, 1067155200, 1081065600, 1099209600, 1112515200, 1130659200, 1143964800, 1162105200, 1173600000, 1194159600 } - typeOffsets:intvector { -23316, 0, -21600, 0, -21600, 3600 } - typeMap:bin { "0102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201" } - finalRule { "Canada" } - finalRaw:int { -21600 } - finalYear:int { 2008 } - links:intvector { 221, 383 } - } //Z#221 - /* America/Yakutat */ :table { - transPre32:intvector { -1, 1069602431, -1, 2106013631 } - trans:intvector { -880203600, -765381600, -21474000, -5752800, 9975600, 25696800, 41425200, 57751200, 73479600, 89200800, 104929200, 120650400, 126702000, 152100000, 162385200, 183549600, 199278000, 215604000, 230727600, 247053600, 262782000, 278503200, 294231600, 309952800, 325681200, 341402400, 357130800, 372852000, 388580400, 404906400, 420030000, 436356000, 452084400, 467805600, 483534000, 499255200, 514983600, 530704800, 544618800, 562154400, 576068400, 594208800, 607518000, 625658400, 638967600, 657108000, 671022000, 688557600, 702471600, 720007200, 733921200, 752061600, 765370800, 783511200, 796820400, 814960800, 828874800, 846410400, 860324400, 877860000, 891774000, 909309600, 923223600, 941364000, 954673200, 972813600, 986122800, 1004263200, 1018177200, 1035712800, 1049626800, 1067162400, 1081076400, 1099216800, 1112526000, 1130666400, 1143975600, 1162116000, 1173610800, 1194170400 } - typeOffsets:intvector { 52865, 0, -33535, 0, -32400, 0, -32400, 3600 } - typeMap:bin { "01020302030203020302030203020302030203020302030203020302030203020302030203020302030203020302030203020302030203020302030203020302030203020302030203020302030203020302" } - finalRule { "US" } - finalRaw:int { -32400 } - finalYear:int { 2008 } - } //Z#222 - /* America/Yellowknife */ :table { - trans:intvector { -1104537600, -880210800, -765388800, -147891600, -131562000, 325674000, 341395200, 357123600, 372844800, 388573200, 404899200, 420022800, 436348800, 452077200, 467798400, 483526800, 499248000, 514976400, 530697600, 544611600, 562147200, 576061200, 594201600, 607510800, 625651200, 638960400, 657100800, 671014800, 688550400, 702464400, 720000000, 733914000, 752054400, 765363600, 783504000, 796813200, 814953600, 828867600, 846403200, 860317200, 877852800, 891766800, 909302400, 923216400, 941356800, 954666000, 972806400, 986115600, 1004256000, 1018170000, 1035705600, 1049619600, 1067155200, 1081069200, 1099209600, 1112518800, 1130659200, 1143968400, 1162108800, 1173603600, 1194163200 } - typeOffsets:intvector { 0, 0, -25200, 0, -25200, 3600, -25200, 7200 } - typeMap:bin { "01020103010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201" } - finalRule { "Canada" } - finalRaw:int { -25200 } - finalYear:int { 2008 } - } //Z#223 - /* Antarctica/Casey */ :table { - trans:intvector { -31536000, 1255802400, 1267714800, 1319738400, 1329843600, 1477065600 } - typeOffsets:intvector { 0, 0, 28800, 0, 39600, 0 } - typeMap:bin { "010201020102" } - } //Z#224 - /* Antarctica/Davis */ :table { - trans:intvector { -409190400, -163062000, -28857600, 1255806000, 1268251200, 1319742000, 1329854400 } - typeOffsets:intvector { 0, 0, 18000, 0, 25200, 0 } - typeMap:bin { "02000201020102" } - } //Z#225 - /* Antarctica/DumontDUrville */ :table { - trans:intvector { -725846400, -566992800, -415497600 } - typeOffsets:intvector { 0, 0, 36000, 0 } - typeMap:bin { "010001" } - } //Z#226 - /* Antarctica/Macquarie */ :table { - transPre32:intvector { -1, 2080708096 } - trans:intvector { -1680508800, -1665392400, -1601719200, -687052800, -71136000, -55411200, -37267200, -25776000, -5817600, 5673600, 25632000, 37728000, 57686400, 67968000, 89136000, 100022400, 120585600, 131472000, 152035200, 162921600, 183484800, 194976000, 215539200, 226425600, 246988800, 257875200, 278438400, 289324800, 309888000, 320774400, 341337600, 352224000, 372787200, 386092800, 404841600, 417542400, 436291200, 447177600, 467740800, 478627200, 499190400, 510076800, 530035200, 542736000, 562089600, 574790400, 594144000, 606240000, 625593600, 637689600, 657043200, 670348800, 686678400, 701798400, 718128000, 733248000, 749577600, 764697600, 781027200, 796147200, 812476800, 828201600, 844531200, 859651200, 875980800, 891100800, 907430400, 922550400, 938880000, 954000000, 967305600, 985449600, 1002384000, 1017504000, 1033833600, 1048953600, 1065283200, 1080403200, 1096732800, 1111852800, 1128182400, 1143907200, 1159632000, 1174752000, 1191686400, 1207411200, 1223136000, 1238860800, 1254585600, 1270310400 } - typeOffsets:intvector { 0, 0, 36000, 0, 36000, 3600, 39600, 0 } - typeMap:bin { "01020100010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010203" } - } //Z#227 - /* Antarctica/Mawson */ :table { - trans:intvector { -501206400, 1255809600 } - typeOffsets:intvector { 0, 0, 18000, 0, 21600, 0 } - typeMap:bin { "0201" } - } //Z#228 - /* Antarctica/McMurdo */ :int { 550 } //Z#229 - /* Antarctica/Palmer */ :table { - trans:intvector { -157766400, -152658000, -132955200, -121122000, -101419200, -86821200, -71092800, -54766800, -39038400, -23317200, -7588800, 128142000, 136605600, 389070000, 403070400, 416372400, 434520000, 447822000, 466574400, 479271600, 498024000, 510721200, 529473600, 545194800, 560923200, 574225200, 592372800, 605674800, 624427200, 637124400, 653457600, 668574000, 687326400, 700628400, 718776000, 732078000, 750225600, 763527600, 781675200, 794977200, 813729600, 826426800, 845179200, 859690800, 876628800, 889930800, 906868800, 923194800, 939528000, 952830000, 971582400, 984279600, 1003032000, 1015729200, 1034481600, 1047178800, 1065931200, 1079233200, 1097380800, 1110682800, 1128830400, 1142132400, 1160884800, 1173582000, 1192334400, 1206846000, 1223784000, 1237086000, 1255233600, 1270350000, 1286683200, 1304823600, 1313899200, 1335668400, 1346558400, 1367118000, 1378612800, 1398567600, 1410062400, 1463281200, 1471147200 } - typeOffsets:intvector { 0, 0, -14400, 0, -14400, 3600, -10800, 0, -10800, 3600 } - typeMap:bin { "020102010201020102010304030102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102" } - finalRule { "Chile" } - finalRaw:int { -14400 } - finalYear:int { 2017 } - } //Z#230 - /* Antarctica/Rothera */ :table { - trans:intvector { 218246400 } - typeOffsets:intvector { 0, 0, -10800, 0 } - typeMap:bin { "01" } - } //Z#231 - /* Antarctica/South_Pole */ :int { 550 } //Z#232 - /* Antarctica/Syowa */ :table { - trans:intvector { -407808000 } - typeOffsets:intvector { 0, 0, 10800, 0 } - typeMap:bin { "01" } - } //Z#233 - /* Antarctica/Troll */ :table { - trans:intvector { 1111885200, 1130634000 } - typeOffsets:intvector { 0, 0, 0, 7200 } - typeMap:bin { "0100" } - finalRule { "Troll" } - finalRaw:int { 0 } - finalYear:int { 2006 } - } //Z#234 - /* Antarctica/Vostok */ :table { - trans:intvector { -380073600 } - typeOffsets:intvector { 0, 0, 21600, 0 } - typeMap:bin { "01" } - } //Z#235 - /* Arctic/Longyearbyen */ :int { 472 } //Z#236 - /* Asia/Aden */ :int { 307 } //Z#237 - /* Asia/Almaty */ :table { - trans:intvector { -1441170468, -1247547600, 354909600, 370717200, 386445600, 402253200, 417981600, 433789200, 449604000, 465336000, 481060800, 496785600, 512510400, 528235200, 543960000, 559684800, 575409600, 591134400, 606859200, 622584000, 638308800, 654638400, 670363200, 686091600, 695768400, 701812800, 717537600, 733262400, 748987200, 764712000, 780436800, 796161600, 811886400, 828216000, 846360000, 859665600, 877809600, 891115200, 909259200, 922564800, 941313600, 954014400, 972763200, 985464000, 1004212800, 1017518400, 1035662400, 1048968000, 1067112000, 1080417600, 1099166400 } - typeOffsets:intvector { 18468, 0, 18000, 0, 18000, 3600, 21600, 0, 21600, 3600 } - typeMap:bin { "010304030403040304030403040304030403040304030201030403040304030403040304030403040304030403040304030403" } - } //Z#238 - /* Asia/Amman */ :table { - trans:intvector { -1230776624, 108165600, 118270800, 136591200, 149806800, 168127200, 181342800, 199749600, 215643600, 231285600, 244501200, 262735200, 275950800, 481154400, 496962000, 512949600, 528670800, 544399200, 560120400, 575848800, 592174800, 610581600, 623624400, 641167200, 655074000, 671839200, 685918800, 702856800, 717973200, 733701600, 749422800, 765151200, 779662800, 797205600, 811116000, 828655200, 843170400, 860104800, 874620000, 891554400, 906069600, 930780000, 938124000, 954367200, 970178400, 985816800, 1001628000, 1017352800, 1033077600, 1048802400, 1066946400, 1080252000, 1097791200, 1112306400, 1128031200, 1143756000, 1161900000, 1175205600, 1193349600, 1206655200, 1225404000, 1238104800, 1256853600, 1269554400, 1288303200, 1301608800, 1319752800, 1333058400, 1387486800, 1395957600, 1414706400 } - typeOffsets:intvector { 8624, 0, 7200, 0, 7200, 3600 } - typeMap:bin { "0102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201" } - finalRule { "Jordan" } - finalRaw:int { 7200 } - finalYear:int { 2015 } - } //Z#239 - /* Asia/Anadyr */ :table { - trans:intvector { -1441194596, -1247572800, 354884400, 370692000, 386420400, 402231600, 417960000, 433767600, 449582400, 465314400, 481039200, 496764000, 512488800, 528213600, 543938400, 559663200, 575388000, 591112800, 606837600, 622562400, 638287200, 654616800, 670341600, 686070000, 695746800, 701791200, 717516000, 733240800, 748965600, 764690400, 780415200, 796140000, 811864800, 828194400, 846338400, 859644000, 877788000, 891093600, 909237600, 922543200, 941292000, 953992800, 972741600, 985442400, 1004191200, 1017496800, 1035640800, 1048946400, 1067090400, 1080396000, 1099144800, 1111845600, 1130594400, 1143295200, 1162044000, 1174744800, 1193493600, 1206799200, 1224943200, 1238248800, 1256392800, 1269698400, 1288450800, 1301151600 } - typeOffsets:intvector { 42596, 0, 39600, 0, 39600, 3600, 43200, 0, 43200, 3600, 46800, 0, 46800, 3600 } - typeMap:bin { "03050605040304030403040304030403040304030403020103040304030403040304030403040304030403040304030403040304030403040304030403020103" } - } //Z#240 - /* Asia/Aqtau */ :table { - trans:intvector { -1441164064, -1247544000, 370724400, 386445600, 402256800, 417985200, 433792800, 449607600, 465339600, 481064400, 496789200, 512514000, 528238800, 543963600, 559688400, 575413200, 591138000, 606862800, 622587600, 638312400, 654642000, 670366800, 686095200, 695772000, 701816400, 717541200, 733266000, 748990800, 764715600, 780440400, 796168800, 811893600, 828223200, 846367200, 859672800, 877816800, 891122400, 909266400, 922572000, 941320800, 954021600, 972770400, 985471200, 1004220000, 1017525600, 1035669600, 1048975200, 1067119200, 1080424800, 1099173600 } - typeOffsets:intvector { 12064, 0, 14400, 0, 14400, 3600, 18000, 0, 18000, 3600, 21600, 0 } - typeMap:bin { "0103050403040304030403040304030403040304030201030403040304010201020102010201020102010201020102010203" } - } //Z#241 - /* Asia/Aqtobe */ :table { - trans:intvector { -1441165720, -1247544000, 354913200, 370720800, 386445600, 402256800, 417985200, 433792800, 449607600, 465339600, 481064400, 496789200, 512514000, 528238800, 543963600, 559688400, 575413200, 591138000, 606862800, 622587600, 638312400, 654642000, 670366800, 686095200, 695772000, 701816400, 717541200, 733266000, 748990800, 764715600, 780440400, 796165200, 811890000, 828219600, 846363600, 859669200, 877813200, 891118800, 909262800, 922568400, 941317200, 954018000, 972766800, 985467600, 1004216400, 1017522000, 1035666000, 1048971600, 1067115600, 1080421200, 1099170000 } - typeOffsets:intvector { 13720, 0, 14400, 0, 14400, 3600, 18000, 0, 18000, 3600, 21600, 0 } - typeMap:bin { "010304050403040304030403040304030403040304030201030403040304030403040304030403040304030403040304030403" } - } //Z#242 - /* Asia/Ashgabat */ :table { - trans:intvector { -1441166012, -1247544000, 354913200, 370720800, 386449200, 402256800, 417985200, 433792800, 449607600, 465339600, 481064400, 496789200, 512514000, 528238800, 543963600, 559688400, 575413200, 591138000, 606862800, 622587600, 638312400, 654642000, 670366800, 686095200, 695772000 } - typeOffsets:intvector { 14012, 0, 14400, 0, 14400, 3600, 18000, 0, 18000, 3600 } - typeMap:bin { "01030403040304030403040304030403040304030403020103" } - links:intvector { 243, 244 } - } //Z#243 - /* Asia/Ashkhabad */ :int { 243 } //Z#244 - /* Asia/Atyrau */ :table { - trans:intvector { -1441164464, -1247544000, 370724400, 386445600, 402256800, 417985200, 433792800, 449607600, 465339600, 481064400, 496789200, 512514000, 528238800, 543963600, 559688400, 575413200, 591138000, 606862800, 622587600, 638312400, 654642000, 670366800, 686095200, 695772000, 701816400, 717541200, 733266000, 748990800, 764715600, 780440400, 796165200, 811890000, 828219600, 846363600, 859669200, 877813200, 891118800, 909262800, 922568400, 941320800, 954021600, 972770400, 985471200, 1004220000, 1017525600, 1035669600, 1048975200, 1067119200, 1080424800, 1099173600 } - typeOffsets:intvector { 12464, 0, 14400, 0, 14400, 3600, 18000, 0, 18000, 3600, 21600, 0 } - typeMap:bin { "0103050403040304030403040304030403040304030201030403040304030403040304030403020102010201020102010203" } - } //Z#245 - /* Asia/Baghdad */ :table { - transPre32:intvector { -1, 1770435036 } - trans:intvector { -1641005856, 389048400, 402264000, 417906000, 433800000, 449614800, 465422400, 481150800, 496792800, 512517600, 528242400, 543967200, 559692000, 575416800, 591141600, 606866400, 622591200, 638316000, 654645600, 670464000, 686275200, 702086400, 717897600, 733622400, 749433600, 765158400, 780969600, 796694400, 812505600, 828316800, 844128000, 859852800, 875664000, 891388800, 907200000, 922924800, 938736000, 954547200, 970358400, 986083200, 1001894400, 1017619200, 1033430400, 1049155200, 1064966400, 1080777600, 1096588800, 1112313600, 1128124800, 1143849600, 1159660800, 1175385600, 1191196800 } - typeOffsets:intvector { 10660, 0, 10656, 0, 10800, 0, 10800, 3600 } - typeMap:bin { "010203020302030203020302030203020302030203020302030203020302030203020302030203020302030203020302030203020302" } - } //Z#246 - /* Asia/Bahrain */ :int { 304 } //Z#247 - /* Asia/Baku */ :table { - trans:intvector { -1441163964, -405140400, 354916800, 370724400, 386452800, 402260400, 417988800, 433796400, 449611200, 465343200, 481068000, 496792800, 512517600, 528242400, 543967200, 559692000, 575416800, 591141600, 606866400, 622591200, 638316000, 654645600, 670370400, 686098800, 701823600, 717548400, 828234000, 846378000, 859680000, 877824000, 891129600, 909273600, 922579200, 941328000, 954028800, 972777600, 985478400, 1004227200, 1017532800, 1035676800, 1048982400, 1067126400, 1080432000, 1099180800, 1111881600, 1130630400, 1143331200, 1162080000, 1174780800, 1193529600, 1206835200, 1224979200, 1238284800, 1256428800, 1269734400, 1288483200, 1301184000, 1319932800, 1332633600, 1351382400, 1364688000, 1382832000, 1396137600, 1414281600, 1427587200, 1445731200 } - typeOffsets:intvector { 11964, 0, 10800, 0, 10800, 3600, 14400, 0, 14400, 3600 } - typeMap:bin { "010304030403040304030403040304030403040304030201020304030403040304030403040304030403040304030403040304030403040304030403040304030403" } - } //Z#248 - /* Asia/Bangkok */ :table { - trans:intvector { -1570084924 } - typeOffsets:intvector { 24124, 0, 25200, 0 } - typeMap:bin { "01" } - links:intvector { 249, 301, 329 } - } //Z#249 - /* Asia/Barnaul */ :table { - trans:intvector { -1579844100, -1247551200, 354906000, 370713600, 386442000, 402249600, 417978000, 433785600, 449600400, 465332400, 481057200, 496782000, 512506800, 528231600, 543956400, 559681200, 575406000, 591130800, 606855600, 622580400, 638305200, 654634800, 670359600, 686088000, 695764800, 701809200, 717534000, 733258800, 748983600, 764708400, 780433200, 796158000, 801590400, 811886400, 828216000, 846360000, 859665600, 877809600, 891115200, 909259200, 922564800, 941313600, 954014400, 972763200, 985464000, 1004212800, 1017518400, 1035662400, 1048968000, 1067112000, 1080417600, 1099166400, 1111867200, 1130616000, 1143316800, 1162065600, 1174766400, 1193515200, 1206820800, 1224964800, 1238270400, 1256414400, 1269720000, 1288468800, 1301169600, 1414263600, 1459022400 } - typeOffsets:intvector { 20100, 0, 21600, 0, 21600, 3600, 25200, 0, 25200, 3600 } - typeMap:bin { "01030403040304030403040304030403040304030403020103040304030403040201020102010201020102010201020102010201020102010201020102010201030103" } - } //Z#250 - /* Asia/Beirut */ :table { - transPre32:intvector { -1, 1454817976 } - trans:intvector { -1570413600, -1552186800, -1538359200, -1522551600, -1507514400, -1490583600, -1473645600, -1460948400, -399866400, -386650800, -368330400, -355114800, -336794400, -323578800, -305172000, -291956400, -273636000, -260420400, 78012000, 86734800, 105055200, 118270800, 136591200, 149806800, 168127200, 181342800, 199749600, 212965200, 231285600, 244501200, 262735200, 275950800, 452210400, 466722000, 483746400, 498258000, 515282400, 529794000, 546818400, 561330000, 581119200, 592952400, 610754400, 624488400, 641512800, 656024400, 673048800, 687560400, 704671200, 718146000, 733269600, 748990800, 764719200, 780440400, 796168800, 811890000, 828223200, 843944400, 859672800, 875394000, 891122400, 906843600, 922572000, 941317200 } - typeOffsets:intvector { 8520, 0, 7200, 0, 7200, 3600 } - typeMap:bin { "0102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201" } - finalRule { "Lebanon" } - finalRaw:int { 7200 } - finalYear:int { 2000 } - } //Z#251 - /* Asia/Bishkek */ :table { - trans:intvector { -1441169904, -1247547600, 354909600, 370717200, 386445600, 402253200, 417981600, 433789200, 449604000, 465336000, 481060800, 496785600, 512510400, 528235200, 543960000, 559684800, 575409600, 591134400, 606859200, 622584000, 638308800, 654638400, 670363200, 683582400, 703018800, 717530400, 734468400, 748980000, 765918000, 780429600, 797367600, 811879200, 828817200, 843933600, 859671000, 877811400, 891120600, 909261000, 922570200, 941315400, 954019800, 972765000, 985469400, 1004214600, 1017523800, 1035664200, 1048973400, 1067113800, 1080423000, 1099168200, 1111872600, 1123783200 } - typeOffsets:intvector { 17904, 0, 18000, 0, 18000, 3600, 21600, 0, 21600, 3600 } - typeMap:bin { "01030403040304030403040304030403040304030403020102010201020102010201020102010201020102010201020102010203" } - } //Z#252 - /* Asia/Brunei */ :table { - trans:intvector { -1383464380, -1167636600 } - typeOffsets:intvector { 27580, 0, 27000, 0, 28800, 0 } - typeMap:bin { "0102" } - } //Z#253 - /* Asia/Calcutta */ :int { 285 } //Z#254 - /* Asia/Chita */ :table { - trans:intvector { -1579419232, -1247558400, 354898800, 370706400, 386434800, 402242400, 417970800, 433778400, 449593200, 465325200, 481050000, 496774800, 512499600, 528224400, 543949200, 559674000, 575398800, 591123600, 606848400, 622573200, 638298000, 654627600, 670352400, 686080800, 695757600, 701802000, 717526800, 733251600, 748976400, 764701200, 780426000, 796150800, 811875600, 828205200, 846349200, 859654800, 877798800, 891104400, 909248400, 922554000, 941302800, 954003600, 972752400, 985453200, 1004202000, 1017507600, 1035651600, 1048957200, 1067101200, 1080406800, 1099155600, 1111856400, 1130605200, 1143306000, 1162054800, 1174755600, 1193504400, 1206810000, 1224954000, 1238259600, 1256403600, 1269709200, 1288458000, 1301158800, 1414252800, 1459015200 } - typeOffsets:intvector { 27232, 0, 28800, 0, 28800, 3600, 32400, 0, 32400, 3600, 36000, 0 } - typeMap:bin { "010304030403040304030403040304030403040304030201030403040304030403040304030403040304030403040304030403040304030403040304030403050103" } - } //Z#255 - /* Asia/Choibalsan */ :table { - trans:intvector { -2032933080, 252435600, 417974400, 433778400, 449593200, 465314400, 481042800, 496764000, 512492400, 528213600, 543942000, 559663200, 575391600, 591112800, 606841200, 622562400, 638290800, 654616800, 670345200, 686066400, 701794800, 717516000, 733244400, 748965600, 764694000, 780415200, 796143600, 811864800, 828198000, 843919200, 859647600, 875368800, 891097200, 906818400, 988390800, 1001692800, 1017421200, 1033142400, 1048870800, 1064592000, 1080320400, 1096041600, 1111770000, 1127491200, 1143219600, 1159545600, 1206889200, 1427479200, 1443193200 } - typeOffsets:intvector { 27480, 0, 25200, 0, 28800, 0, 28800, 3600, 32400, 0, 32400, 3600 } - typeMap:bin { "01020504050405040504050405040504050405040504050405040504050405040504050405040504050405040504020302" } - finalRule { "Mongol" } - finalRaw:int { 28800 } - finalYear:int { 2016 } - } //Z#256 - /* Asia/Chongqing */ :int { 312 } //Z#257 - /* Asia/Chungking */ :int { 312 } //Z#258 - /* Asia/Colombo */ :table { - transPre32:intvector { -1, 1454807332 } - trans:intvector { -2019705572, -883287000, -862639200, -764051400, 832962600, 846266400, 1145039400 } - typeOffsets:intvector { 19164, 0, 19172, 0, 19800, 0, 19800, 1800, 19800, 3600, 21600, 0, 23400, 0 } - typeMap:bin { "0102030402060502" } - } //Z#259 - /* Asia/Dacca */ :int { 262 } //Z#260 - /* Asia/Damascus */ :table { - trans:intvector { -1577931912, -1568592000, -1554080400, -1537142400, -1522630800, -1505692800, -1491181200, -1474243200, -1459126800, -242265600, -228877200, -210556800, -197427600, -178934400, -165718800, -147398400, -134269200, -116467200, -102646800, -84326400, -71110800, -52704000, -39488400, -21168000, -7952400, 10368000, 23583600, 41904000, 55119600, 73526400, 86742000, 105062400, 118278000, 136598400, 149814000, 168134400, 181350000, 199756800, 212972400, 231292800, 241916400, 262828800, 273452400, 418694400, 433810800, 450316800, 465433200, 508896000, 529196400, 541555200, 562633200, 574387200, 594255600, 607305600, 623199600, 638928000, 654649200, 670456800, 686264400, 702684000, 717886800, 733096800, 748904400, 765151200, 780958800, 796687200, 812494800, 828309600, 844117200, 859759200, 875653200, 891208800, 907189200, 922917600, 938725200, 954540000, 970347600, 986076000, 1001883600, 1017612000, 1033419600, 1049148000, 1064955600, 1080770400, 1096578000, 1112306400, 1128114000, 1143842400, 1158872400, 1175205600, 1193950800, 1207260000, 1225486800, 1238104800, 1256850000, 1270159200, 1288299600, 1301608800, 1319749200, 1333058400, 1351198800 } - typeOffsets:intvector { 8712, 0, 7200, 0, 7200, 3600 } - typeMap:bin { "0102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201" } - finalRule { "Syria" } - finalRaw:int { 7200 } - finalYear:int { 2013 } - } //Z#261 - /* Asia/Dhaka */ :table { - transPre32:intvector { -1, 1770423996 } - trans:intvector { -891582800, -872058600, -862637400, -576138600, 1245430800, 1262278800 } - typeOffsets:intvector { 21700, 0, 19800, 0, 21200, 0, 21600, 0, 21600, 3600, 23400, 0 } - typeMap:bin { "02050105030403" } - links:intvector { 260, 262, 371 } - } //Z#262 - /* Asia/Dili */ :table { - trans:intvector { -1830414140, -879152400, 199897200, 969120000 } - typeOffsets:intvector { 30140, 0, 28800, 0, 32400, 0 } - typeMap:bin { "01020102" } - } //Z#263 - /* Asia/Dubai */ :table { - trans:intvector { -1577936472 } - typeOffsets:intvector { 13272, 0, 14400, 0 } - typeMap:bin { "01" } - links:intvector { 264, 295 } - } //Z#264 - /* Asia/Dushanbe */ :table { - trans:intvector { -1441168512, -1247547600, 354909600, 370717200, 386445600, 402253200, 417981600, 433789200, 449604000, 465336000, 481060800, 496785600, 512510400, 528235200, 543960000, 559684800, 575409600, 591134400, 606859200, 622584000, 638308800, 654638400, 670363200, 684363600 } - typeOffsets:intvector { 16512, 0, 18000, 0, 18000, 3600, 21600, 0, 21600, 3600 } - typeMap:bin { "010304030403040304030403040304030403040304030201" } - } //Z#265 - /* Asia/Famagusta */ :table { - trans:intvector { -1518920148, 166572000, 182293200, 200959200, 213829200, 228866400, 243982800, 260316000, 276123600, 291765600, 307486800, 323820000, 338936400, 354664800, 370386000, 386114400, 401835600, 417564000, 433285200, 449013600, 465339600, 481068000, 496789200, 512517600, 528238800, 543967200, 559688400, 575416800, 591138000, 606866400, 622587600, 638316000, 654642000, 670370400, 686091600, 701820000, 717541200, 733269600, 748990800, 764719200, 780440400, 796168800, 811890000, 828223200, 843944400, 859672800, 875394000, 891122400, 909277200, 922582800, 941331600, 954032400, 972781200, 985482000, 1004230800, 1017536400, 1035680400, 1048986000, 1067130000, 1080435600, 1099184400, 1111885200, 1130634000, 1143334800, 1162083600, 1174784400, 1193533200, 1206838800, 1224982800, 1238288400, 1256432400, 1269738000, 1288486800, 1301187600, 1319936400, 1332637200, 1351386000, 1364691600, 1382835600, 1396141200, 1414285200, 1427590800, 1445734800, 1459040400, 1473282000 } - typeOffsets:intvector { 8148, 0, 7200, 0, 7200, 3600, 10800, 0 } - typeMap:bin { "01020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010203" } - } //Z#266 - /* Asia/Gaza */ :table { - transPre32:intvector { -1, 2109557424 } - trans:intvector { -933645600, -857358000, -844300800, -825822000, -812685600, -794199600, -779853600, -762656400, -748310400, -731127600, -399088800, -386650800, -368330400, -355114800, -336790800, -323654400, -305168400, -292032000, -273632400, -260496000, -242096400, -228960000, -210560400, -197424000, -178938000, -165801600, -147402000, -134265600, -115866000, -102643200, -84330000, -81313200, 142380000, 150843600, 167176800, 178664400, 482277600, 495579600, 516751200, 526424400, 545436000, 558478800, 576626400, 589323600, 609890400, 620773200, 638316000, 651618000, 669765600, 683672400, 701820000, 715726800, 733701600, 747176400, 765151200, 778021200, 796600800, 810075600, 828655200, 843170400, 860104800, 874620000, 891554400, 906069600, 924213600, 939934800, 956268000, 971989200, 987717600, 1003438800, 1019167200, 1034888400, 1050616800, 1066338000, 1082066400, 1096581600, 1113516000, 1128380400, 1143842400, 1158872400, 1175378400, 1189638000, 1206655200, 1219957200, 1238104800, 1252015200, 1269640860, 1281474000, 1301608860, 1312146000, 1333058400, 1348178400, 1364508000, 1380229200, 1395957600, 1414098000, 1427493600, 1445547600, 1458946800, 1477692000 } - typeOffsets:intvector { 8272, 0, 7200, 0, 7200, 3600 } - typeMap:bin { "0102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201" } - finalRule { "Palestine" } - finalRaw:int { 7200 } - finalYear:int { 2017 } - } //Z#267 - /* Asia/Harbin */ :int { 312 } //Z#268 - /* Asia/Hebron */ :table { - transPre32:intvector { -1, 2109557273 } - trans:intvector { -933645600, -857358000, -844300800, -825822000, -812685600, -794199600, -779853600, -762656400, -748310400, -731127600, -399088800, -386650800, -368330400, -355114800, -336790800, -323654400, -305168400, -292032000, -273632400, -260496000, -242096400, -228960000, -210560400, -197424000, -178938000, -165801600, -147402000, -134265600, -115866000, -102643200, -84330000, -81313200, 142380000, 150843600, 167176800, 178664400, 482277600, 495579600, 516751200, 526424400, 545436000, 558478800, 576626400, 589323600, 609890400, 620773200, 638316000, 651618000, 669765600, 683672400, 701820000, 715726800, 733701600, 747176400, 765151200, 778021200, 796600800, 810075600, 828655200, 843170400, 860104800, 874620000, 891554400, 906069600, 924213600, 939934800, 956268000, 971989200, 987717600, 1003438800, 1019167200, 1034888400, 1050616800, 1066338000, 1082066400, 1096581600, 1113516000, 1128380400, 1143842400, 1158872400, 1175378400, 1189638000, 1206655200, 1220216400, 1238104800, 1252015200, 1269554400, 1281474000, 1301608860, 1312146000, 1314655200, 1317330000, 1333058400, 1348178400, 1364508000, 1380229200, 1395957600, 1414098000, 1427493600, 1445547600, 1458946800, 1477692000 } - typeOffsets:intvector { 8423, 0, 7200, 0, 7200, 3600 } - typeMap:bin { "01020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201" } - finalRule { "Palestine" } - finalRaw:int { 7200 } - finalYear:int { 2017 } - } //Z#269 - /* Asia/Ho_Chi_Minh */ :table { - trans:intvector { -2004073600, -1851577590, -852105600, -782643600, -767869200, -718095600, -457776000, -315648000, 171820800 } - typeOffsets:intvector { 25600, 0, 25200, 0, 25590, 0, 28800, 0, 32400, 0 } - typeMap:bin { "020103040103010301" } - links:intvector { 270, 308, 628 } - } //Z#270 - /* Asia/Hong_Kong */ :table { - trans:intvector { -2056693002, -907389000, -891667800, -884246400, -766746000, -747981000, -728544600, -717049800, -694503000, -683785800, -668064600, -654755400, -636615000, -623305800, -605165400, -591856200, -573715800, -559801800, -542352600, -528352200, -510211800, -498112200, -478762200, -466662600, -446707800, -435213000, -415258200, -403158600, -383808600, -371709000, -352359000, -340259400, -320909400, -308809800, -288855000, -277360200, -257405400, -245910600, -225955800, -213856200, -194506200, -182406600, -163056600, -148537800, -132816600, -117088200, -101367000, -85638600, -69312600, -53584200, -37863000, -22134600, -6413400, 9315000, 25036200, 40764600, 56485800, 72214200, 88540200, 104268600, 119989800, 126041400, 151439400, 167167800, 182889000, 198617400, 214338600, 295385400, 309292200 } - typeOffsets:intvector { 27402, 0, 28800, 0, 28800, 3600, 32400, 0 } - typeMap:bin { "010201030102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201" } - links:intvector { 271, 509 } - } //Z#271 - /* Asia/Hovd */ :table { - trans:intvector { -2032927596, 252439200, 417978000, 433785600, 449600400, 465321600, 481050000, 496771200, 512499600, 528220800, 543949200, 559670400, 575398800, 591120000, 606848400, 622569600, 638298000, 654624000, 670352400, 686073600, 701802000, 717523200, 733251600, 748972800, 764701200, 780422400, 796150800, 811872000, 828205200, 843926400, 859654800, 875376000, 891104400, 906825600, 988398000, 1001700000, 1017428400, 1033149600, 1048878000, 1064599200, 1080327600, 1096048800, 1111777200, 1127498400, 1143226800, 1159552800, 1427482800, 1443196800 } - typeOffsets:intvector { 21996, 0, 21600, 0, 25200, 0, 25200, 3600 } - typeMap:bin { "010203020302030203020302030203020302030203020302030203020302030203020302030203020302030203020302" } - finalRule { "Mongol" } - finalRaw:int { 25200 } - finalYear:int { 2016 } - } //Z#272 - /* Asia/Irkutsk */ :table { - trans:intvector { -1575874625, -1247554800, 354902400, 370710000, 386438400, 402246000, 417974400, 433782000, 449596800, 465328800, 481053600, 496778400, 512503200, 528228000, 543952800, 559677600, 575402400, 591127200, 606852000, 622576800, 638301600, 654631200, 670356000, 686084400, 695761200, 701805600, 717530400, 733255200, 748980000, 764704800, 780429600, 796154400, 811879200, 828208800, 846352800, 859658400, 877802400, 891108000, 909252000, 922557600, 941306400, 954007200, 972756000, 985456800, 1004205600, 1017511200, 1035655200, 1048960800, 1067104800, 1080410400, 1099159200, 1111860000, 1130608800, 1143309600, 1162058400, 1174759200, 1193508000, 1206813600, 1224957600, 1238263200, 1256407200, 1269712800, 1288461600, 1301162400, 1414256400 } - typeOffsets:intvector { 25025, 0, 25200, 0, 25200, 3600, 28800, 0, 28800, 3600, 32400, 0 } - typeMap:bin { "0103040304030403040304030403040304030403040302010304030403040304030403040304030403040304030403040304030403040304030403040304030503" } - } //Z#273 - /* Asia/Istanbul */ :int { 456 } //Z#274 - /* Asia/Jakarta */ :table { - trans:intvector { -1451719200, -1172906400, -876641400, -766054800, -683883000, -620812800, -189415800 } - typeOffsets:intvector { 25632, 0, 25200, 0, 26400, 0, 27000, 0, 28800, 0, 32400, 0 } - typeMap:bin { "02030503040301" } - } //Z#275 - /* Asia/Jayapura */ :table { - trans:intvector { -1172913768, -799491600, -189423000 } - typeOffsets:intvector { 33768, 0, 32400, 0, 34200, 0 } - typeMap:bin { "010201" } - } //Z#276 - /* Asia/Jerusalem */ :table { - transPre32:intvector { -1, 1454818042 } - trans:intvector { -1641003640, -933645600, -857358000, -844300800, -825822000, -812685600, -794199600, -779853600, -762656400, -748310400, -731127600, -681962400, -673243200, -667962000, -652327200, -636426000, -622087200, -608947200, -591847200, -572486400, -558576000, -542851200, -527731200, -514425600, -490845600, -482986800, -459475200, -451537200, -428551200, -418262400, -400032000, -387428400, 142380000, 150843600, 167176800, 178664400, 482277600, 495579600, 516751200, 526424400, 545436000, 558478800, 576626400, 589323600, 609890400, 620773200, 638316000, 651618000, 669765600, 683672400, 701820000, 715726800, 733701600, 747176400, 765151200, 778021200, 796600800, 810075600, 826840800, 842821200, 858895200, 874184400, 890344800, 905029200, 923011200, 936313200, 955670400, 970783200, 986770800, 1001282400, 1017356400, 1033941600, 1048806000, 1065132000, 1081292400, 1095804000, 1112313600, 1128812400, 1143763200, 1159657200, 1175212800, 1189897200, 1206662400, 1223161200, 1238112000, 1254006000, 1269561600, 1284246000, 1301616000, 1317510000, 1333065600, 1348354800, 1364515200, 1382828400 } - typeOffsets:intvector { 8454, 0, 7200, 0, 7200, 3600, 7200, 7200, 8440, 0 } - typeMap:bin { "0401020102010201020102010302010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201" } - finalRule { "Zion" } - finalRaw:int { 7200 } - finalYear:int { 2014 } - links:intvector { 277, 319, 525 } - } //Z#277 - /* Asia/Kabul */ :table { - transPre32:intvector { -1, 1770429088 } - trans:intvector { -788932800 } - typeOffsets:intvector { 16608, 0, 14400, 0, 16200, 0 } - typeMap:bin { "0102" } - } //Z#278 - /* Asia/Kamchatka */ :table { - trans:intvector { -1487759676, -1247569200, 354888000, 370695600, 386424000, 402231600, 417960000, 433767600, 449582400, 465314400, 481039200, 496764000, 512488800, 528213600, 543938400, 559663200, 575388000, 591112800, 606837600, 622562400, 638287200, 654616800, 670341600, 686070000, 695746800, 701791200, 717516000, 733240800, 748965600, 764690400, 780415200, 796140000, 811864800, 828194400, 846338400, 859644000, 877788000, 891093600, 909237600, 922543200, 941292000, 953992800, 972741600, 985442400, 1004191200, 1017496800, 1035640800, 1048946400, 1067090400, 1080396000, 1099144800, 1111845600, 1130594400, 1143295200, 1162044000, 1174744800, 1193493600, 1206799200, 1224943200, 1238248800, 1256392800, 1269698400, 1288450800, 1301151600 } - typeOffsets:intvector { 38076, 0, 39600, 0, 39600, 3600, 43200, 0, 43200, 3600 } - typeMap:bin { "01030403040304030403040304030403040304030403020103040304030403040304030403040304030403040304030403040304030403040304030403020103" } - } //Z#279 - /* Asia/Karachi */ :table { - trans:intvector { -1988166492, -862637400, -764145000, -576135000, 1018119600, 1033840800, 1212260400, 1225476000, 1239735600, 1257012000 } - typeOffsets:intvector { 16092, 0, 18000, 0, 18000, 3600, 19800, 0, 19800, 3600 } - typeMap:bin { "03040301020102010201" } - links:intvector { 280, 543 } - } //Z#280 - /* Asia/Kashgar */ :int { 327 } //Z#281 - /* Asia/Kathmandu */ :table { - trans:intvector { -1577943676, 504901800 } - typeOffsets:intvector { 20476, 0, 19800, 0, 20700, 0 } - typeMap:bin { "0102" } - links:intvector { 282, 283 } - } //Z#282 - /* Asia/Katmandu */ :int { 282 } //Z#283 - /* Asia/Khandyga */ :table { - trans:intvector { -1579424533, -1247558400, 354898800, 370706400, 386434800, 402242400, 417970800, 433778400, 449593200, 465325200, 481050000, 496774800, 512499600, 528224400, 543949200, 559674000, 575398800, 591123600, 606848400, 622573200, 638298000, 654627600, 670352400, 686080800, 695757600, 701802000, 717526800, 733251600, 748976400, 764701200, 780426000, 796150800, 811875600, 828205200, 846349200, 859654800, 877798800, 891104400, 909248400, 922554000, 941302800, 954003600, 972752400, 985453200, 1004202000, 1017507600, 1035651600, 1048957200, 1067101200, 1072882800, 1080403200, 1099152000, 1111852800, 1130601600, 1143302400, 1162051200, 1174752000, 1193500800, 1206806400, 1224950400, 1238256000, 1256400000, 1269705600, 1288454400, 1301155200, 1315832400, 1414252800 } - typeOffsets:intvector { 32533, 0, 28800, 0, 28800, 3600, 32400, 0, 32400, 3600, 36000, 0, 36000, 3600, 39600, 0 } - typeMap:bin { "01030403040304030403040304030403040304030403020103040304030403040304030403040304030403040304030403050605060506050605060506050605070503" } - } //Z#284 - /* Asia/Kolkata */ :table { - transPre32:intvector { -1, 1454805288 } - trans:intvector { -891582800, -872058600, -862637400, -764145000 } - typeOffsets:intvector { 21208, 0, 19800, 0, 19800, 3600, 21200, 0, 23400, 0 } - typeMap:bin { "0304010201" } - links:intvector { 254, 285, 511 } - } //Z#285 - /* Asia/Krasnoyarsk */ :table { - trans:intvector { -1577513486, -1247551200, 354906000, 370713600, 386442000, 402249600, 417978000, 433785600, 449600400, 465332400, 481057200, 496782000, 512506800, 528231600, 543956400, 559681200, 575406000, 591130800, 606855600, 622580400, 638305200, 654634800, 670359600, 686088000, 695764800, 701809200, 717534000, 733258800, 748983600, 764708400, 780433200, 796158000, 811882800, 828212400, 846356400, 859662000, 877806000, 891111600, 909255600, 922561200, 941310000, 954010800, 972759600, 985460400, 1004209200, 1017514800, 1035658800, 1048964400, 1067108400, 1080414000, 1099162800, 1111863600, 1130612400, 1143313200, 1162062000, 1174762800, 1193511600, 1206817200, 1224961200, 1238266800, 1256410800, 1269716400, 1288465200, 1301166000, 1414260000 } - typeOffsets:intvector { 22286, 0, 21600, 0, 21600, 3600, 25200, 0, 25200, 3600, 28800, 0 } - typeMap:bin { "0103040304030403040304030403040304030403040302010304030403040304030403040304030403040304030403040304030403040304030403040304030503" } - } //Z#286 - /* Asia/Kuala_Lumpur */ :table { - transPre32:intvector { -1, 2117490090 } - trans:intvector { -2038200925, -1167634800, -1073028000, -894180000, -879665400, -767005200, 378664200 } - typeOffsets:intvector { 24406, 0, 24925, 0, 25200, 0, 25200, 1200, 26400, 0, 27000, 0, 28800, 0, 32400, 0 } - typeMap:bin { "0102030405070506" } - } //Z#287 - /* Asia/Kuching */ :table { - trans:intvector { -1383463280, -1167636600, -1082448000, -1074586800, -1050825600, -1042964400, -1019289600, -1011428400, -987753600, -979892400, -956217600, -948356400, -924595200, -916734000, -893059200, -885198000, -879667200, -767005200 } - typeOffsets:intvector { 26480, 0, 27000, 0, 28800, 0, 28800, 1200, 32400, 0 } - typeMap:bin { "010203020302030203020302030203020402" } - } //Z#288 - /* Asia/Kuwait */ :int { 307 } //Z#289 - /* Asia/Macao */ :int { 291 } //Z#290 - /* Asia/Macau */ :table { - trans:intvector { -1830411260, -277360200, -257405400, -245910600, -225955800, -214473600, -194506200, -182406600, -163056600, -150969600, -131619600, -117088200, -101367000, -85638600, -69312600, -53584200, -37863000, -22134600, -6413400, 9315000, 25036200, 40764600, 56485800, 72201600, 87922800, 103651200, 119977200, 135705600, 151439400, 167167800, 182889000, 198617400, 214338600, 230067000, 245788200, 261504000, 277225200, 292953600, 309279600, 325008000, 340729200 } - typeOffsets:intvector { 27260, 0, 28800, 0, 28800, 3600 } - typeMap:bin { "0102010201020102010201020102010201020102010201020102010201020102010201020102010201" } - links:intvector { 290, 291 } - } //Z#291 - /* Asia/Magadan */ :table { - trans:intvector { -1441188192, -1247565600, 354891600, 370699200, 386427600, 402235200, 417963600, 433771200, 449586000, 465318000, 481042800, 496767600, 512492400, 528217200, 543942000, 559666800, 575391600, 591116400, 606841200, 622566000, 638290800, 654620400, 670345200, 686073600, 695750400, 701794800, 717519600, 733244400, 748969200, 764694000, 780418800, 796143600, 811868400, 828198000, 846342000, 859647600, 877791600, 891097200, 909241200, 922546800, 941295600, 953996400, 972745200, 985446000, 1004194800, 1017500400, 1035644400, 1048950000, 1067094000, 1080399600, 1099148400, 1111849200, 1130598000, 1143298800, 1162047600, 1174748400, 1193497200, 1206802800, 1224946800, 1238252400, 1256396400, 1269702000, 1288450800, 1301151600, 1414245600, 1461427200 } - typeOffsets:intvector { 36192, 0, 36000, 0, 36000, 3600, 39600, 0, 39600, 3600, 43200, 0 } - typeMap:bin { "010304030403040304030403040304030403040304030201030403040304030403040304030403040304030403040304030403040304030403040304030403050103" } - } //Z#292 - /* Asia/Makassar */ :table { - trans:intvector { -1172908656, -880272000, -766054800 } - typeOffsets:intvector { 28656, 0, 28800, 0, 32400, 0 } - typeMap:bin { "010201" } - links:intvector { 293, 324 } - } //Z#293 - /* Asia/Manila */ :table { - transPre32:intvector { -1, 350346256, -1, 2065645456 } - trans:intvector { -1046678400, -1038733200, -873273600, -794221200, -496224000, -489315600, 259344000, 275151600 } - typeOffsets:intvector { -57360, 0, 28800, 0, 28800, 3600, 29040, 0, 32400, 0 } - typeMap:bin { "03010201040102010201" } - } //Z#294 - /* Asia/Muscat */ :int { 264 } //Z#295 - /* Asia/Nicosia */ :table { - trans:intvector { -1518920008, 166572000, 182293200, 200959200, 213829200, 228866400, 243982800, 260316000, 276123600, 291765600, 307486800, 323820000, 338936400, 354664800, 370386000, 386114400, 401835600, 417564000, 433285200, 449013600, 465339600, 481068000, 496789200, 512517600, 528238800, 543967200, 559688400, 575416800, 591138000, 606866400, 622587600, 638316000, 654642000, 670370400, 686091600, 701820000, 717541200, 733269600, 748990800, 764719200, 780440400, 796168800, 811890000, 828223200, 843944400, 859672800, 875394000, 891122400, 909277200, 922582800, 941331600 } - typeOffsets:intvector { 8008, 0, 7200, 0, 7200, 3600 } - typeMap:bin { "010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201" } - finalRule { "EUAsia" } - finalRaw:int { 7200 } - finalYear:int { 2000 } - links:intvector { 296, 471 } - } //Z#296 - /* Asia/Novokuznetsk */ :table { - trans:intvector { -1441259328, -1247551200, 354906000, 370713600, 386442000, 402249600, 417978000, 433785600, 449600400, 465332400, 481057200, 496782000, 512506800, 528231600, 543956400, 559681200, 575406000, 591130800, 606855600, 622580400, 638305200, 654634800, 670359600, 686088000, 695764800, 701809200, 717534000, 733258800, 748983600, 764708400, 780433200, 796158000, 811882800, 828212400, 846356400, 859662000, 877806000, 891111600, 909255600, 922561200, 941310000, 954010800, 972759600, 985460400, 1004209200, 1017514800, 1035658800, 1048964400, 1067108400, 1080414000, 1099162800, 1111863600, 1130612400, 1143313200, 1162062000, 1174762800, 1193511600, 1206817200, 1224961200, 1238266800, 1256410800, 1269716400, 1288468800, 1301169600 } - typeOffsets:intvector { 20928, 0, 21600, 0, 21600, 3600, 25200, 0, 25200, 3600 } - typeMap:bin { "01030403040304030403040304030403040304030403020103040304030403040304030403040304030403040304030403040304030403040304030403020103" } - } //Z#297 - /* Asia/Novosibirsk */ :table { - trans:intvector { -1579476700, -1247551200, 354906000, 370713600, 386442000, 402249600, 417978000, 433785600, 449600400, 465332400, 481057200, 496782000, 512506800, 528231600, 543956400, 559681200, 575406000, 591130800, 606855600, 622580400, 638305200, 654634800, 670359600, 686088000, 695764800, 701809200, 717534000, 733258800, 738086400, 748987200, 764712000, 780436800, 796161600, 811886400, 828216000, 846360000, 859665600, 877809600, 891115200, 909259200, 922564800, 941313600, 954014400, 972763200, 985464000, 1004212800, 1017518400, 1035662400, 1048968000, 1067112000, 1080417600, 1099166400, 1111867200, 1130616000, 1143316800, 1162065600, 1174766400, 1193515200, 1206820800, 1224964800, 1238270400, 1256414400, 1269720000, 1288468800, 1301169600, 1414263600, 1469304000 } - typeOffsets:intvector { 19900, 0, 21600, 0, 21600, 3600, 25200, 0, 25200, 3600 } - typeMap:bin { "01030403040304030403040304030403040304030403020103040304020102010201020102010201020102010201020102010201020102010201020102010201030103" } - } //Z#298 - /* Asia/Omsk */ :table { - trans:intvector { -1582088010, -1247547600, 354909600, 370717200, 386445600, 402253200, 417981600, 433789200, 449604000, 465336000, 481060800, 496785600, 512510400, 528235200, 543960000, 559684800, 575409600, 591134400, 606859200, 622584000, 638308800, 654638400, 670363200, 686091600, 695768400, 701812800, 717537600, 733262400, 748987200, 764712000, 780436800, 796161600, 811886400, 828216000, 846360000, 859665600, 877809600, 891115200, 909259200, 922564800, 941313600, 954014400, 972763200, 985464000, 1004212800, 1017518400, 1035662400, 1048968000, 1067112000, 1080417600, 1099166400, 1111867200, 1130616000, 1143316800, 1162065600, 1174766400, 1193515200, 1206820800, 1224964800, 1238270400, 1256414400, 1269720000, 1288468800, 1301169600, 1414263600 } - typeOffsets:intvector { 17610, 0, 18000, 0, 18000, 3600, 21600, 0, 21600, 3600, 25200, 0 } - typeMap:bin { "0103040304030403040304030403040304030403040302010304030403040304030403040304030403040304030403040304030403040304030403040304030503" } - } //Z#299 - /* Asia/Oral */ :table { - trans:intvector { -1441164324, -1247544000, 354913200, 370720800, 386445600, 402256800, 417985200, 433792800, 449607600, 465339600, 481064400, 496789200, 512514000, 528238800, 543963600, 559688400, 575413200, 591138000, 606862800, 622591200, 638316000, 654645600, 670370400, 686095200, 695772000, 701816400, 717544800, 733269600, 748994400, 764719200, 780444000, 796168800, 811893600, 828223200, 846367200, 859672800, 877816800, 891122400, 909266400, 922572000, 941320800, 954021600, 972770400, 985471200, 1004220000, 1017525600, 1035669600, 1048975200, 1067119200, 1080424800, 1099173600 } - typeOffsets:intvector { 12324, 0, 14400, 0, 14400, 3600, 18000, 0, 18000, 3600, 21600, 0 } - typeMap:bin { "010304050403040304030403040304030403020102010201030201020102010201020102010201020102010201020102010203" } - } //Z#300 - /* Asia/Phnom_Penh */ :int { 249 } //Z#301 - /* Asia/Pontianak */ :table { - trans:intvector { -1172906240, -881220600, -766054800, -683883000, -620812800, -189415800, 567964800 } - typeOffsets:intvector { 26240, 0, 25200, 0, 27000, 0, 28800, 0, 32400, 0 } - typeMap:bin { "02040203020301" } - } //Z#302 - /* Asia/Pyongyang */ :table { - trans:intvector { -1948782180, -1830414600, 1439564400 } - typeOffsets:intvector { 30180, 0, 30600, 0, 32400, 0 } - typeMap:bin { "010201" } - } //Z#303 - /* Asia/Qatar */ :table { - trans:intvector { -1577935568, 76190400 } - typeOffsets:intvector { 12368, 0, 10800, 0, 14400, 0 } - typeMap:bin { "0201" } - links:intvector { 247, 304 } - } //Z#304 - /* Asia/Qyzylorda */ :table { - trans:intvector { -1441167712, -1247544000, 354913200, 370720800, 386445600, 402256800, 417985200, 433792800, 449607600, 465339600, 481064400, 496789200, 512514000, 528238800, 543963600, 559688400, 575413200, 591138000, 606862800, 622587600, 638312400, 654642000, 670366800, 686095200, 695768400, 701812800, 717541200, 733266000, 748990800, 764715600, 780440400, 796165200, 811890000, 828219600, 846363600, 859669200, 877813200, 891118800, 909262800, 922568400, 941317200, 954018000, 972766800, 985467600, 1004216400, 1017522000, 1035666000, 1048971600, 1067115600, 1080421200, 1099170000 } - typeOffsets:intvector { 15712, 0, 14400, 0, 14400, 3600, 18000, 0, 18000, 3600, 21600, 0 } - typeMap:bin { "010304050403040304030403040304030403040304030203050403040304030403040304030403040304030403040304030405" } - } //Z#305 - /* Asia/Rangoon */ :int { 332 } //Z#306 - /* Asia/Riyadh */ :table { - trans:intvector { -719636812 } - typeOffsets:intvector { 11212, 0, 10800, 0 } - typeMap:bin { "01" } - links:intvector { 237, 289, 307 } - } //Z#307 - /* Asia/Saigon */ :int { 270 } //Z#308 - /* Asia/Sakhalin */ :table { - trans:intvector { -2031039048, -768560400, 354891600, 370699200, 386427600, 402235200, 417963600, 433771200, 449586000, 465318000, 481042800, 496767600, 512492400, 528217200, 543942000, 559666800, 575391600, 591116400, 606841200, 622566000, 638290800, 654620400, 670345200, 686073600, 695750400, 701794800, 717519600, 733244400, 748969200, 764694000, 780418800, 796143600, 811868400, 828198000, 846342000, 859647600, 877795200, 891100800, 909244800, 922550400, 941299200, 954000000, 972748800, 985449600, 1004198400, 1017504000, 1035648000, 1048953600, 1067097600, 1080403200, 1099152000, 1111852800, 1130601600, 1143302400, 1162051200, 1174752000, 1193500800, 1206806400, 1224950400, 1238256000, 1256400000, 1269705600, 1288454400, 1301155200, 1414249200, 1459008000 } - typeOffsets:intvector { 34248, 0, 32400, 0, 36000, 0, 36000, 3600, 39600, 0, 39600, 3600 } - typeMap:bin { "010405040504050405040504050405040504050405040302040504050405040504050403020302030203020302030203020302030203020302030203020302040204" } - } //Z#309 - /* Asia/Samarkand */ :table { - trans:intvector { -1441168073, -1247544000, 354913200, 370720800, 386445600, 402256800, 417985200, 433792800, 449607600, 465339600, 481064400, 496789200, 512514000, 528238800, 543963600, 559688400, 575413200, 591138000, 606862800, 622587600, 638312400, 654642000, 670366800, 686091600 } - typeOffsets:intvector { 16073, 0, 14400, 0, 18000, 0, 18000, 3600, 21600, 0 } - typeMap:bin { "010203040302030203020302030203020302030203020302" } - } //Z#310 - /* Asia/Seoul */ :table { - trans:intvector { -1948782472, -1830414600, -498128400, -462702600, -451733400, -429784200, -418296600, -399544200, -387451800, -368094600, -356002200, -336645000, -324552600, -305195400, -293103000, -264933000, 547578000, 560883600, 579027600, 592333200 } - typeOffsets:intvector { 30472, 0, 30600, 0, 30600, 3600, 32400, 0, 32400, 3600 } - typeMap:bin { "0103010201020102010201020102010304030403" } - links:intvector { 311, 595 } - } //Z#311 - /* Asia/Shanghai */ :table { - transPre32:intvector { -1, 2117485353 } - trans:intvector { -933494400, -923130000, -908784000, -891594000, 515520000, 527007600, 545155200, 558457200, 576604800, 589906800, 608659200, 621961200, 640108800, 653410800, 671558400, 684860400 } - typeOffsets:intvector { 29143, 0, 28800, 0, 28800, 3600 } - typeMap:bin { "0102010201020102010201020102010201" } - links:intvector { 257, 258, 268, 312, 381, 545 } - } //Z#312 - /* Asia/Singapore */ :table { - trans:intvector { -2038200925, -1167634800, -1073028000, -894180000, -879665400, -767005200, 378664200 } - typeOffsets:intvector { 24925, 0, 25200, 0, 25200, 1200, 26400, 0, 27000, 0, 28800, 0, 32400, 0 } - typeMap:bin { "01020304060405" } - links:intvector { 313, 597 } - } //Z#313 - /* Asia/Srednekolymsk */ :table { - trans:intvector { -1441188892, -1247565600, 354891600, 370699200, 386427600, 402235200, 417963600, 433771200, 449586000, 465318000, 481042800, 496767600, 512492400, 528217200, 543942000, 559666800, 575391600, 591116400, 606841200, 622566000, 638290800, 654620400, 670345200, 686073600, 695750400, 701794800, 717519600, 733244400, 748969200, 764694000, 780418800, 796143600, 811868400, 828198000, 846342000, 859647600, 877791600, 891097200, 909241200, 922546800, 941295600, 953996400, 972745200, 985446000, 1004194800, 1017500400, 1035644400, 1048950000, 1067094000, 1080399600, 1099148400, 1111849200, 1130598000, 1143298800, 1162047600, 1174748400, 1193497200, 1206802800, 1224946800, 1238252400, 1256396400, 1269702000, 1288450800, 1301151600, 1414245600 } - typeOffsets:intvector { 36892, 0, 36000, 0, 36000, 3600, 39600, 0, 39600, 3600, 43200, 0 } - typeMap:bin { "0103040304030403040304030403040304030403040302010304030403040304030403040304030403040304030403040304030403040304030403040304030503" } - } //Z#314 - /* Asia/Taipei */ :table { - transPre32:intvector { -1, 1959718936 } - trans:intvector { -1017820800, -766224000, -745833600, -733827600, -716889600, -699613200, -683884800, -670669200, -652348800, -639133200, -620812800, -607597200, -589276800, -576061200, -562924800, -541760400, -528710400, -510224400, -497174400, -478688400, -465638400, -449830800, -434016000, -418208400, -402480000, -386672400, -370944000, -355136400, -339408000, -323600400, -302515200, -291978000, -270979200, -260442000, 133977600, 149785200, 165513600, 181321200, 299606400, 307551600 } - typeOffsets:intvector { 29160, 0, 28800, 0, 28800, 3600, 32400, 0 } - typeMap:bin { "0103010201020102010201020102010201020102010201020102010201020102010201020102010201" } - links:intvector { 315, 594 } - } //Z#315 - /* Asia/Tashkent */ :table { - trans:intvector { -1441168631, -1247547600, 354909600, 370717200, 386445600, 402253200, 417981600, 433789200, 449604000, 465336000, 481060800, 496785600, 512510400, 528235200, 543960000, 559684800, 575409600, 591134400, 606859200, 622584000, 638308800, 654638400, 670363200, 686091600 } - typeOffsets:intvector { 16631, 0, 18000, 0, 18000, 3600, 21600, 0, 21600, 3600 } - typeMap:bin { "010304030403040304030403040304030403040304030201" } - } //Z#316 - /* Asia/Tbilisi */ :table { - trans:intvector { -1441162751, -405140400, 354916800, 370724400, 386452800, 402260400, 417988800, 433796400, 449611200, 465343200, 481068000, 496792800, 512517600, 528242400, 543967200, 559692000, 575416800, 591141600, 606866400, 622591200, 638316000, 654645600, 670370400, 686098800, 701816400, 717537600, 733266000, 748987200, 764715600, 780436800, 796161600, 811882800, 828216000, 877806000, 891115200, 909255600, 922564800, 941310000, 954014400, 972759600, 985464000, 1004209200, 1017518400, 1035658800, 1048968000, 1067108400, 1080417600, 1088276400, 1099177200, 1111878000 } - typeOffsets:intvector { 10751, 0, 10800, 0, 10800, 3600, 14400, 0, 14400, 3600 } - typeMap:bin { "0103040304030403040304030403040304030403040302010201020102030403040304030403040304030403040304020103" } - } //Z#317 - /* Asia/Tehran */ :table { - trans:intvector { -757394744, 247177800, 259272000, 277758000, 283982400, 290809800, 306531000, 322432200, 338499000, 673216200, 685481400, 701209800, 717103800, 732745800, 748639800, 764281800, 780175800, 795817800, 811711800, 827353800, 843247800, 858976200, 874870200, 890512200, 906406200, 922048200, 937942200, 953584200, 969478200, 985206600, 1001100600, 1016742600, 1032636600, 1048278600, 1064172600, 1079814600, 1095708600, 1111437000, 1127331000, 1206045000, 1221939000, 1237667400, 1253561400, 1269203400, 1285097400, 1300739400, 1316633400, 1332275400, 1348169400, 1363897800, 1379791800, 1395433800, 1411327800, 1426969800, 1442863800, 1458505800, 1474399800, 1490128200, 1506022200, 1521664200, 1537558200, 1553200200, 1569094200, 1584736200, 1600630200, 1616358600, 1632252600, 1647894600, 1663788600, 1679430600, 1695324600, 1710966600, 1726860600, 1742589000, 1758483000, 1774125000, 1790019000, 1805661000, 1821555000, 1837197000, 1853091000, 1868733000, 1884627000, 1900355400, 1916249400, 1931891400, 1947785400, 1963427400, 1979321400, 1994963400, 2010857400, 2026585800, 2042479800, 2058121800, 2074015800, 2089657800, 2105551800 } - typeOffsets:intvector { 12344, 0, 12600, 0, 12600, 3600, 14400, 0, 14400, 3600 } - typeMap:bin { "01030403010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201" } - finalRule { "Iran" } - finalRaw:int { 12600 } - finalYear:int { 2037 } - links:intvector { 318, 524 } - } //Z#318 - /* Asia/Tel_Aviv */ :int { 277 } //Z#319 - /* Asia/Thimbu */ :int { 321 } //Z#320 - /* Asia/Thimphu */ :table { - trans:intvector { -706341516, 560025000 } - typeOffsets:intvector { 21516, 0, 19800, 0, 21600, 0 } - typeMap:bin { "0102" } - links:intvector { 320, 321 } - } //Z#321 - /* Asia/Tokyo */ :table { - transPre32:intvector { -1, 1707254896 } - trans:intvector { -683794800, -672393600, -654764400, -640944000, -620290800, -609494400, -588841200, -578044800 } - typeOffsets:intvector { 33539, 0, 32400, 0, 32400, 3600 } - typeMap:bin { "010201020102010201" } - links:intvector { 322, 526, 528 } - } //Z#322 - /* Asia/Tomsk */ :table { - trans:intvector { -1578807591, -1247551200, 354906000, 370713600, 386442000, 402249600, 417978000, 433785600, 449600400, 465332400, 481057200, 496782000, 512506800, 528231600, 543956400, 559681200, 575406000, 591130800, 606855600, 622580400, 638305200, 654634800, 670359600, 686088000, 695764800, 701809200, 717534000, 733258800, 748983600, 764708400, 780433200, 796158000, 811882800, 828212400, 846356400, 859662000, 877806000, 891111600, 909255600, 922561200, 941310000, 954010800, 972759600, 985460400, 1004209200, 1017514800, 1020193200, 1035662400, 1048968000, 1067112000, 1080417600, 1099166400, 1111867200, 1130616000, 1143316800, 1162065600, 1174766400, 1193515200, 1206820800, 1224964800, 1238270400, 1256414400, 1269720000, 1288468800, 1301169600, 1414263600, 1464465600 } - typeOffsets:intvector { 20391, 0, 21600, 0, 21600, 3600, 25200, 0, 25200, 3600 } - typeMap:bin { "01030403040304030403040304030403040304030403020103040304030403040304030403040304030403040304020102010201020102010201020102010201030103" } - } //Z#323 - /* Asia/Ujung_Pandang */ :int { 293 } //Z#324 - /* Asia/Ulaanbaatar */ :table { - trans:intvector { -2032931252, 252435600, 417974400, 433782000, 449596800, 465318000, 481046400, 496767600, 512496000, 528217200, 543945600, 559666800, 575395200, 591116400, 606844800, 622566000, 638294400, 654620400, 670348800, 686070000, 701798400, 717519600, 733248000, 748969200, 764697600, 780418800, 796147200, 811868400, 828201600, 843922800, 859651200, 875372400, 891100800, 906822000, 988394400, 1001696400, 1017424800, 1033146000, 1048874400, 1064595600, 1080324000, 1096045200, 1111773600, 1127494800, 1143223200, 1159549200, 1427479200, 1443193200 } - typeOffsets:intvector { 25652, 0, 25200, 0, 28800, 0, 28800, 3600 } - typeMap:bin { "010203020302030203020302030203020302030203020302030203020302030203020302030203020302030203020302" } - finalRule { "Mongol" } - finalRaw:int { 28800 } - finalYear:int { 2016 } - links:intvector { 325, 326 } - } //Z#325 - /* Asia/Ulan_Bator */ :int { 325 } //Z#326 - /* Asia/Urumqi */ :table { - trans:intvector { -1325483420 } - typeOffsets:intvector { 21020, 0, 21600, 0 } - typeMap:bin { "01" } - links:intvector { 281, 327 } - } //Z#327 - /* Asia/Ust-Nera */ :table { - trans:intvector { -1579426374, -1247558400, 354898800, 370699200, 386427600, 402235200, 417963600, 433771200, 449586000, 465318000, 481042800, 496767600, 512492400, 528217200, 543942000, 559666800, 575391600, 591116400, 606841200, 622566000, 638290800, 654620400, 670345200, 686073600, 695750400, 701794800, 717519600, 733244400, 748969200, 764694000, 780418800, 796143600, 811868400, 828198000, 846342000, 859647600, 877791600, 891097200, 909241200, 922546800, 941295600, 953996400, 972745200, 985446000, 1004194800, 1017500400, 1035644400, 1048950000, 1067094000, 1080399600, 1099148400, 1111849200, 1130598000, 1143298800, 1162047600, 1174748400, 1193497200, 1206802800, 1224946800, 1238252400, 1256396400, 1269702000, 1288450800, 1301151600, 1315828800, 1414249200 } - typeOffsets:intvector { 34374, 0, 28800, 0, 32400, 0, 36000, 0, 36000, 3600, 39600, 0, 39600, 3600, 43200, 0 } - typeMap:bin { "010206050605060506050605060506050605060506050403050605060506050605060506050605060506050605060506050605060506050605060506050605070503" } - } //Z#328 - /* Asia/Vientiane */ :int { 249 } //Z#329 - /* Asia/Vladivostok */ :table { - trans:intvector { -1487321251, -1247562000, 354895200, 370702800, 386431200, 402238800, 417967200, 433774800, 449589600, 465321600, 481046400, 496771200, 512496000, 528220800, 543945600, 559670400, 575395200, 591120000, 606844800, 622569600, 638294400, 654624000, 670348800, 686077200, 695754000, 701798400, 717523200, 733248000, 748972800, 764697600, 780422400, 796147200, 811872000, 828201600, 846345600, 859651200, 877795200, 891100800, 909244800, 922550400, 941299200, 954000000, 972748800, 985449600, 1004198400, 1017504000, 1035648000, 1048953600, 1067097600, 1080403200, 1099152000, 1111852800, 1130601600, 1143302400, 1162051200, 1174752000, 1193500800, 1206806400, 1224950400, 1238256000, 1256400000, 1269705600, 1288454400, 1301155200, 1414249200 } - typeOffsets:intvector { 31651, 0, 32400, 0, 32400, 3600, 36000, 0, 36000, 3600, 39600, 0 } - typeMap:bin { "0103040304030403040304030403040304030403040302010304030403040304030403040304030403040304030403040304030403040304030403040304030503" } - } //Z#330 - /* Asia/Yakutsk */ :table { - trans:intvector { -1579423138, -1247558400, 354898800, 370706400, 386434800, 402242400, 417970800, 433778400, 449593200, 465325200, 481050000, 496774800, 512499600, 528224400, 543949200, 559674000, 575398800, 591123600, 606848400, 622573200, 638298000, 654627600, 670352400, 686080800, 695757600, 701802000, 717526800, 733251600, 748976400, 764701200, 780426000, 796150800, 811875600, 828205200, 846349200, 859654800, 877798800, 891104400, 909248400, 922554000, 941302800, 954003600, 972752400, 985453200, 1004202000, 1017507600, 1035651600, 1048957200, 1067101200, 1080406800, 1099155600, 1111856400, 1130605200, 1143306000, 1162054800, 1174755600, 1193504400, 1206810000, 1224954000, 1238259600, 1256403600, 1269709200, 1288458000, 1301158800, 1414252800 } - typeOffsets:intvector { 31138, 0, 28800, 0, 28800, 3600, 32400, 0, 32400, 3600, 36000, 0 } - typeMap:bin { "0103040304030403040304030403040304030403040302010304030403040304030403040304030403040304030403040304030403040304030403040304030503" } - } //Z#331 - /* Asia/Yangon */ :table { - trans:intvector { -1577946280, -873268200, -778410000 } - typeOffsets:intvector { 23080, 0, 23400, 0, 32400, 0 } - typeMap:bin { "010201" } - links:intvector { 306, 332 } - } //Z#332 - /* Asia/Yekaterinburg */ :table { - trans:intvector { -1688270553, -1592610305, -1247544000, 354913200, 370720800, 386449200, 402256800, 417985200, 433792800, 449607600, 465339600, 481064400, 496789200, 512514000, 528238800, 543963600, 559688400, 575413200, 591138000, 606862800, 622587600, 638312400, 654642000, 670366800, 686095200, 695772000, 701816400, 717541200, 733266000, 748990800, 764715600, 780440400, 796165200, 811890000, 828219600, 846363600, 859669200, 877813200, 891118800, 909262800, 922568400, 941317200, 954018000, 972766800, 985467600, 1004216400, 1017522000, 1035666000, 1048971600, 1067115600, 1080421200, 1099170000, 1111870800, 1130619600, 1143320400, 1162069200, 1174770000, 1193518800, 1206824400, 1224968400, 1238274000, 1256418000, 1269723600, 1288472400, 1301173200, 1414267200 } - typeOffsets:intvector { 14553, 0, 13505, 0, 14400, 0, 14400, 3600, 18000, 0, 18000, 3600, 21600, 0 } - typeMap:bin { "010204050405040504050405040504050405040504050403020405040504050405040504050405040504050405040504050405040504050405040504050405040604" } - } //Z#333 - /* Asia/Yerevan */ :table { - trans:intvector { -1441162680, -405140400, 354916800, 370724400, 386452800, 402260400, 417988800, 433796400, 449611200, 465343200, 481068000, 496792800, 512517600, 528242400, 543967200, 559692000, 575416800, 591141600, 606866400, 622591200, 638316000, 654645600, 670370400, 686098800, 701823600, 717548400, 733273200, 748998000, 764722800, 780447600, 796172400, 811897200, 859672800, 877816800, 891122400, 909266400, 922572000, 941320800, 954021600, 972770400, 985471200, 1004220000, 1017525600, 1035669600, 1048975200, 1067119200, 1080424800, 1099173600, 1111874400, 1130623200, 1143324000, 1162072800, 1174773600, 1193522400, 1206828000, 1224972000, 1238277600, 1256421600, 1269727200, 1288476000, 1301176800, 1319925600 } - typeOffsets:intvector { 10680, 0, 10800, 0, 10800, 3600, 14400, 0, 14400, 3600 } - typeMap:bin { "0103040304030403040304030403040304030403040302010201020102010203040304030403040304030403040304030403040304030403040304030403" } - links:intvector { 334, 538 } - } //Z#334 - /* Atlantic/Azores */ :table { - transPre32:intvector { -1, 1581063056 } - trans:intvector { -1830377128, -1689548400, -1677794400, -1667430000, -1647730800, -1635807600, -1616194800, -1604358000, -1584658800, -1572735600, -1553036400, -1541199600, -1521500400, -1442444400, -1426806000, -1379286000, -1364770800, -1348441200, -1333321200, -1316386800, -1301266800, -1284332400, -1269817200, -1221433200, -1206918000, -1191193200, -1175468400, -1127689200, -1111964400, -1096844400, -1080514800, -1063580400, -1049065200, -1033340400, -1017615600, -1002495600, -986166000, -969231600, -950482800, -942015600, -922662000, -906937200, -891126000, -877302000, -873676800, -864000000, -857948400, -845852400, -842832000, -831340800, -825894000, -814402800, -810777600, -799891200, -794444400, -782953200, -779328000, -768441600, -762994800, -749084400, -733359600, -717624000, -701899200, -686174400, -670449600, -654724800, -639000000, -591825600, -575496000, -559771200, -544046400, -528321600, -512596800, -496872000, -481147200, -465422400, -449697600, -433972800, -417643200, -401918400, -386193600, -370468800, -354744000, -339019200, -323294400, -307569600, -291844800, -276120000, -260395200, -244670400, -228340800, -212616000, -196891200, -181166400, -165441600, -149716800, -133992000, -118267200, 228272400, 243997200, 260326800, 276051600, 291776400, 307504800, 323226000, 338954400, 354679200, 370404000, 386128800, 401853600, 417582000, 433303200, 449028000, 465357600, 481082400, 496807200, 512532000, 528256800, 543981600, 559706400, 575431200, 591156000, 606880800, 622605600, 638330400, 654660000, 670384800, 686109600, 701834400, 717559200, 733280400, 749005200, 764730000, 780454800, 796179600, 811904400, 828234000, 846378000 } - typeOffsets:intvector { -6160, 0, -7200, 0, -7200, 3600, -7200, 7200, -6872, 0, -3600, 0, -3600, 3600, 0, 0 } - typeMap:bin { "04010201020102010201020102010201020102010201020102010201020102010201020102010201020102010203020102030201020302010203020102010201020102010201020102010201020102010201020102010201020102010201020102010506050605060506050605060506050605060506050605060506050605060506070605060506050605" } - finalRule { "EU" } - finalRaw:int { -3600 } - finalYear:int { 1997 } - } //Z#335 - /* Atlantic/Bermuda */ :table { - trans:intvector { -1262281242, 136360800, 152082000, 167810400, 183531600, 199260000, 215586000, 230709600, 247035600, 262764000, 278485200, 294213600, 309934800, 325663200, 341384400, 357112800, 372834000, 388562400, 404888400, 420012000, 436338000, 452066400, 467787600, 483516000, 499237200, 514965600, 530686800, 544600800, 562136400, 576050400, 594190800, 607500000, 625640400, 638949600, 657090000, 671004000, 688539600, 702453600, 719989200, 733903200, 752043600, 765352800, 783493200, 796802400, 814942800, 828856800, 846392400, 860306400, 877842000, 891756000, 909291600, 923205600, 941346000, 954655200, 972795600, 986104800, 1004245200, 1018159200, 1035694800, 1049608800, 1067144400, 1081058400, 1099198800, 1112508000, 1130648400, 1143957600, 1162098000, 1173592800, 1194152400 } - typeOffsets:intvector { -15558, 0, -14400, 0, -14400, 3600 } - typeMap:bin { "010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201" } - finalRule { "US" } - finalRaw:int { -14400 } - finalYear:int { 2008 } - } //Z#336 - /* Atlantic/Canary */ :table { - trans:intvector { -1509663504, -733874400, 323827200, 338950800, 354675600, 370400400, 386125200, 401850000, 417574800, 433299600, 449024400, 465354000, 481078800, 496803600, 512528400, 528253200, 543978000, 559702800, 575427600, 591152400, 606877200, 622602000, 638326800, 654656400, 670381200, 686106000, 701830800, 717555600, 733280400, 749005200, 764730000, 780454800, 796179600, 811904400, 828234000, 846378000 } - typeOffsets:intvector { -3696, 0, -3600, 0, 0, 0, 0, 3600 } - typeMap:bin { "010203020302030203020302030203020302030203020302030203020302030203020302" } - finalRule { "EU" } - finalRaw:int { 0 } - finalYear:int { 1997 } - } //Z#337 - /* Atlantic/Cape_Verde */ :table { - trans:intvector { -1988144756, -862610400, -764118000, 186120000 } - typeOffsets:intvector { -5644, 0, -7200, 0, -7200, 3600, -3600, 0 } - typeMap:bin { "01020103" } - } //Z#338 - /* Atlantic/Faeroe */ :int { 340 } //Z#339 - /* Atlantic/Faroe */ :table { - trans:intvector { -1955748776, 354675600, 370400400, 386125200, 401850000, 417574800, 433299600, 449024400, 465354000, 481078800, 496803600, 512528400, 528253200, 543978000, 559702800, 575427600, 591152400, 606877200, 622602000, 638326800, 654656400, 670381200, 686106000, 701830800, 717555600, 733280400, 749005200, 764730000, 780454800, 796179600, 811904400, 828234000, 846378000 } - typeOffsets:intvector { -1624, 0, 0, 0, 0, 3600 } - typeMap:bin { "010201020102010201020102010201020102010201020102010201020102010201" } - finalRule { "EU" } - finalRaw:int { 0 } - finalYear:int { 1997 } - links:intvector { 339, 340 } - } //Z#340 - /* Atlantic/Jan_Mayen */ :int { 472 } //Z#341 - /* Atlantic/Madeira */ :table { - trans:intvector { -1830379944, -1689552000, -1677798000, -1667433600, -1647734400, -1635811200, -1616198400, -1604361600, -1584662400, -1572739200, -1553040000, -1541203200, -1521504000, -1442448000, -1426809600, -1379289600, -1364774400, -1348444800, -1333324800, -1316390400, -1301270400, -1284336000, -1269820800, -1221436800, -1206921600, -1191196800, -1175472000, -1127692800, -1111968000, -1096848000, -1080518400, -1063584000, -1049068800, -1033344000, -1017619200, -1002499200, -986169600, -969235200, -950486400, -942019200, -922665600, -906940800, -891129600, -877305600, -873680400, -864003600, -857952000, -845856000, -842835600, -831344400, -825897600, -814406400, -810781200, -799894800, -794448000, -782956800, -779331600, -768445200, -762998400, -749088000, -733363200, -717627600, -701902800, -686178000, -670453200, -654728400, -639003600, -591829200, -575499600, -559774800, -544050000, -528325200, -512600400, -496875600, -481150800, -465426000, -449701200, -433976400, -417646800, -401922000, -386197200, -370472400, -354747600, -339022800, -323298000, -307573200, -291848400, -276123600, -260398800, -244674000, -228344400, -212619600, -196894800, -181170000, -165445200, -149720400, -133995600, -118270800, 228268800, 243993600, 260323200, 276048000, 291772800, 307501200, 323222400, 338950800, 354675600, 370400400, 386125200, 401850000, 417578400, 433299600, 449024400, 465354000, 481078800, 496803600, 512528400, 528253200, 543978000, 559702800, 575427600, 591152400, 606877200, 622602000, 638326800, 654656400, 670381200, 686106000, 701830800, 717555600, 733280400, 749005200, 764730000, 780454800, 796179600, 811904400, 828234000, 846378000 } - typeOffsets:intvector { -4056, 0, -3600, 0, -3600, 3600, -3600, 7200, 0, 0, 0, 3600 } - typeMap:bin { "010201020102010201020102010201020102010201020102010201020102010201020102010201020102010203020102030201020302010203020102010201020102010201020102010201020102010201020102010201020102010201020102010405040504050405040504050405040504050405040504050405040504050405040504050405040504" } - finalRule { "EU" } - finalRaw:int { 0 } - finalYear:int { 1997 } - } //Z#342 - /* Atlantic/Reykjavik */ :table { - trans:intvector { -1956609120, -1668211200, -1647212400, -1636675200, -1613430000, -1605139200, -1581894000, -1539561600, -1531350000, -968025600, -952293600, -942008400, -920239200, -909957600, -888789600, -877903200, -857944800, -846453600, -826495200, -815004000, -795045600, -783554400, -762991200, -752104800, -731541600, -717631200, -700092000, -686181600, -668642400, -654732000, -636588000, -623282400, -605743200, -591832800, -573688800, -559778400, -542239200, -528328800, -510789600, -496879200, -479340000, -465429600, -447890400, -433980000, -415836000, -401925600, -384386400, -370476000, -352936800, -339026400, -321487200, -307576800, -290037600, -276127200, -258588000, -244677600, -226533600, -212623200, -195084000, -181173600, -163634400, -149724000, -132184800, -118274400, -100735200, -86824800, -68680800, -54770400 } - typeOffsets:intvector { -5280, 0, -3600, 0, -3600, 3600, 0, 0 } - typeMap:bin { "0102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020103" } - links:intvector { 343, 512 } - } //Z#343 - /* Atlantic/South_Georgia */ :table { - transPre32:intvector { -1, 1770454464 } - typeOffsets:intvector { -8768, 0, -7200, 0 } - typeMap:bin { "01" } - } //Z#344 - /* Atlantic/St_Helena */ :int { 5 } //Z#345 - /* Atlantic/Stanley */ :table { - trans:intvector { -1824235716, -1018209600, -1003093200, -986760000, -971643600, -954705600, -939589200, -923256000, -908139600, -891806400, -876690000, -860356800, -852066000, 420609600, 433306800, 452052000, 464151600, 483501600, 495601200, 514350000, 527054400, 545799600, 558504000, 577249200, 589953600, 608698800, 621403200, 640753200, 652852800, 672202800, 684907200, 703652400, 716356800, 735102000, 747806400, 766551600, 779256000, 798001200, 810705600, 830055600, 842760000, 861505200, 874209600, 892954800, 905659200, 924404400, 937108800, 955854000, 968558400, 987310800, 999410400, 1019365200, 1030860000, 1050814800, 1062914400, 1082264400, 1094364000, 1113714000, 1125813600, 1145163600, 1157263200, 1176613200, 1188712800, 1208667600, 1220767200, 1240117200, 1252216800, 1271566800, 1283666400 } - typeOffsets:intvector { -13884, 0, -14400, 0, -14400, 3600, -10800, 0, -10800, 3600 } - typeMap:bin { "010201020102010201020102010304030403020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020103" } - } //Z#346 - /* Australia/ACT */ :int { 365 } //Z#347 - /* Australia/Adelaide */ :table { - transPre32:intvector { -1, 1930857236, -1, 2064778096 } - trans:intvector { -1672565340, -1665390600, -883639800, -876126600, -860398200, -844677000, -828343800, -813227400, 57688200, 67969800, 89137800, 100024200, 120587400, 131473800, 152037000, 162923400, 183486600, 194977800, 215541000, 226427400, 246990600, 257877000, 278440200, 289326600, 309889800, 320776200, 341339400, 352225800, 372789000, 384280200, 404843400, 415729800, 436293000, 447179400, 467742600, 478629000, 499192200, 511288200, 530037000, 542737800, 562091400, 574792200, 594145800, 606241800, 625595400, 637691400, 657045000, 667931400, 688494600, 701195400, 719944200, 731435400, 751998600, 764094600, 783448200, 796149000, 814897800, 828203400, 846347400, 859653000, 877797000, 891102600, 909246600, 922552200, 941301000, 954001800, 972750600, 985451400, 1004200200, 1017505800, 1035649800, 1048955400, 1067099400, 1080405000, 1099153800, 1111854600, 1130603400, 1143909000, 1162053000, 1174753800, 1193502600, 1207413000, 1223137800 } - typeOffsets:intvector { 33260, 0, 32400, 0, 34200, 0, 34200, 3600 } - typeMap:bin { "01020302030203020302030203020302030203020302030203020302030203020302030203020302030203020302030203020302030203020302030203020302030203020302030203020302030203020302030203" } - finalRule { "AS" } - finalRaw:int { 34200 } - finalYear:int { 2009 } - links:intvector { 348, 364 } - } //Z#348 - /* Australia/Brisbane */ :table { - transPre32:intvector { -1, 1928175368 } - trans:intvector { -1672567140, -1665392400, -883641600, -876128400, -860400000, -844678800, -828345600, -813229200, 57686400, 67968000, 625593600, 636480000, 657043200, 667929600, 688492800, 699379200 } - typeOffsets:intvector { 36728, 0, 36000, 0, 36000, 3600 } - typeMap:bin { "0102010201020102010201020102010201" } - links:intvector { 349, 363 } - } //Z#349 - /* Australia/Broken_Hill */ :table { - transPre32:intvector { -1, 1930856548, -1, 1980016096, -1, 2064778096 } - trans:intvector { -1672565340, -1665390600, -883639800, -876126600, -860398200, -844677000, -828343800, -813227400, 57688200, 67969800, 89137800, 100024200, 120587400, 131473800, 152037000, 162923400, 183486600, 194977800, 215541000, 226427400, 246990600, 257877000, 278440200, 289326600, 309889800, 320776200, 341339400, 352225800, 372789000, 386699400, 404843400, 415729800, 436293000, 447179400, 467742600, 478629000, 499192200, 511288200, 530037000, 542737800, 562091400, 574792200, 594145800, 606241800, 625595400, 636481800, 657045000, 667931400, 688494600, 699381000, 719944200, 731435400, 751998600, 762885000, 783448200, 794334600, 814897800, 828203400, 846347400, 859653000, 877797000, 891102600, 909246600, 922552200, 941301000, 954001800, 972750600, 985451400, 1004200200, 1017505800, 1035649800, 1048955400, 1067099400, 1080405000, 1099153800, 1111854600, 1130603400, 1143909000, 1162053000, 1174753800, 1193502600, 1207413000, 1223137800 } - typeOffsets:intvector { 33948, 0, 32400, 0, 34200, 0, 34200, 3600, 36000, 0 } - typeMap:bin { "0401020302030203020302030203020302030203020302030203020302030203020302030203020302030203020302030203020302030203020302030203020302030203020302030203020302030203020302030203" } - finalRule { "AS" } - finalRaw:int { 34200 } - finalYear:int { 2009 } - links:intvector { 350, 369 } - } //Z#350 - /* Australia/Canberra */ :int { 365 } //Z#351 - /* Australia/Currie */ :table { - transPre32:intvector { -1, 1949172768 } - trans:intvector { -1680508800, -1665392400, -883641600, -876128400, -860400000, -844678800, -828345600, -813229200, 57686400, 67968000, 89136000, 100022400, 120585600, 131472000, 152035200, 162921600, 183484800, 194976000, 215539200, 226425600, 246988800, 257875200, 278438400, 289324800, 309888000, 320774400, 341337600, 352224000, 372787200, 386092800, 404841600, 417542400, 436291200, 447177600, 467740800, 478627200, 499190400, 510076800, 530035200, 542736000, 562089600, 574790400, 594144000, 606240000, 625593600, 637689600, 657043200, 670348800, 686678400, 701798400, 718128000, 733248000, 749577600, 764697600, 781027200, 796147200, 812476800, 828201600, 844531200, 859651200, 875980800, 891100800, 907430400, 922550400, 938880000, 954000000, 967305600, 985449600, 1002384000, 1017504000, 1033833600, 1048953600, 1065283200, 1080403200, 1096732800, 1111852800, 1128182400, 1143907200, 1159632000, 1174752000, 1191686400, 1207411200, 1223136000 } - typeOffsets:intvector { 34528, 0, 36000, 0, 36000, 3600 } - typeMap:bin { "010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102" } - finalRule { "AT" } - finalRaw:int { 36000 } - finalYear:int { 2009 } - } //Z#352 - /* Australia/Darwin */ :table { - transPre32:intvector { -1, 1930859096, -1, 2064778096 } - trans:intvector { -1672565340, -1665390600, -883639800, -876126600, -860398200, -844677000, -828343800, -813227400 } - typeOffsets:intvector { 31400, 0, 32400, 0, 34200, 0, 34200, 3600 } - typeMap:bin { "01020302030203020302" } - links:intvector { 0, 353, 361 } - } //Z#353 - /* Australia/Eucla */ :table { - transPre32:intvector { -1, 1957038768 } - trans:intvector { -1672562640, -1665387900, -883637100, -876123900, -860395500, -844674300, 152039700, 162926100, 436295700, 447182100, 690311700, 699383700, 1165079700, 1174756500, 1193505300, 1206810900, 1224954900, 1238260500 } - typeOffsets:intvector { 30928, 0, 31500, 0, 31500, 3600 } - typeMap:bin { "01020102010201020102010201020102010201" } - } //Z#354 - /* Australia/Hobart */ :table { - transPre32:intvector { -1, 1949171940 } - trans:intvector { -1680508800, -1665392400, -883641600, -876128400, -860400000, -844678800, -828345600, -813229200, -71136000, -55411200, -37267200, -25776000, -5817600, 5673600, 25632000, 37728000, 57686400, 67968000, 89136000, 100022400, 120585600, 131472000, 152035200, 162921600, 183484800, 194976000, 215539200, 226425600, 246988800, 257875200, 278438400, 289324800, 309888000, 320774400, 341337600, 352224000, 372787200, 386092800, 404841600, 417542400, 436291200, 447177600, 467740800, 478627200, 499190400, 510076800, 530035200, 542736000, 562089600, 574790400, 594144000, 606240000, 625593600, 637689600, 657043200, 670348800, 686678400, 701798400, 718128000, 733248000, 749577600, 764697600, 781027200, 796147200, 812476800, 828201600, 844531200, 859651200, 875980800, 891100800, 907430400, 922550400, 938880000, 954000000, 967305600, 985449600, 1002384000, 1017504000, 1033833600, 1048953600, 1065283200, 1080403200, 1096732800, 1111852800, 1128182400, 1143907200, 1159632000, 1174752000, 1191686400, 1207411200, 1223136000 } - typeOffsets:intvector { 35356, 0, 36000, 0, 36000, 3600 } - typeMap:bin { "0102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102" } - finalRule { "AT" } - finalRaw:int { 36000 } - finalYear:int { 2009 } - links:intvector { 355, 366 } - } //Z#355 - /* Australia/LHI */ :int { 358 } //Z#356 - /* Australia/Lindeman */ :table { - transPre32:intvector { -1, 1928176340 } - trans:intvector { -1672567140, -1665392400, -883641600, -876128400, -860400000, -844678800, -828345600, -813229200, 57686400, 67968000, 625593600, 636480000, 657043200, 667929600, 688492800, 699379200, 719942400, 731433600, 751996800, 762883200 } - typeOffsets:intvector { 35756, 0, 36000, 0, 36000, 3600 } - typeMap:bin { "010201020102010201020102010201020102010201" } - } //Z#357 - /* Australia/Lord_Howe */ :table { - transPre32:intvector { -1, 1930852316 } - trans:intvector { 352216800, 372785400, 384273000, 404839800, 415722600, 436289400, 447172200, 467739000, 478621800, 499188600, 511282800, 530033400, 542732400, 562087800, 574786800, 594142200, 606236400, 625591800, 636476400, 657041400, 667926000, 688491000, 699375600, 719940600, 731430000, 751995000, 762879600, 783444600, 794329200, 814894200, 828198000, 846343800, 859647600, 877793400, 891097200, 909243000, 922546800, 941297400, 953996400, 967303800, 985446000, 1004196600, 1017500400, 1035646200, 1048950000, 1067095800, 1080399600, 1099150200, 1111849200, 1130599800, 1143903600, 1162049400, 1174748400, 1193499000, 1207407600, 1223134200 } - typeOffsets:intvector { 38180, 0, 36000, 0, 37800, 0, 37800, 1800, 37800, 3600 } - typeMap:bin { "010204020402040204020302030203020302030203020302030203020302030203020302030203020302030203020302030203020302030203" } - finalRule { "LH" } - finalRaw:int { 37800 } - finalYear:int { 2009 } - links:intvector { 356, 358 } - } //Z#358 - /* Australia/Melbourne */ :table { - transPre32:intvector { -1, 1930855704 } - trans:intvector { -1672567140, -1665392400, -883641600, -876128400, -860400000, -844678800, -828345600, -813229200, 57686400, 67968000, 89136000, 100022400, 120585600, 131472000, 152035200, 162921600, 183484800, 194976000, 215539200, 226425600, 246988800, 257875200, 278438400, 289324800, 309888000, 320774400, 341337600, 352224000, 372787200, 384278400, 404841600, 415728000, 436291200, 447177600, 467740800, 478627200, 499190400, 511286400, 530035200, 542736000, 561484800, 574790400, 594144000, 606240000, 625593600, 637689600, 657043200, 667929600, 688492800, 699379200, 719942400, 731433600, 751996800, 762883200, 783446400, 796147200, 814896000, 828201600, 846345600, 859651200, 877795200, 891100800, 909244800, 922550400, 941299200, 954000000, 967305600, 985449600, 1004198400, 1017504000, 1035648000, 1048953600, 1067097600, 1080403200, 1099152000, 1111852800, 1130601600, 1143907200, 1162051200, 1174752000, 1193500800, 1207411200, 1223136000 } - typeOffsets:intvector { 34792, 0, 36000, 0, 36000, 3600 } - typeMap:bin { "010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102" } - finalRule { "AV" } - finalRaw:int { 36000 } - finalYear:int { 2009 } - links:intvector { 359, 367 } - } //Z#359 - /* Australia/NSW */ :int { 365 } //Z#360 - /* Australia/North */ :int { 353 } //Z#361 - /* Australia/Perth */ :table { - transPre32:intvector { -1, 1957041892 } - trans:intvector { -1672559940, -1665385200, -883634400, -876121200, -860392800, -844671600, 152042400, 162928800, 436298400, 447184800, 690314400, 699386400, 1165082400, 1174759200, 1193508000, 1206813600, 1224957600, 1238263200 } - typeOffsets:intvector { 27804, 0, 28800, 0, 28800, 3600 } - typeMap:bin { "01020102010201020102010201020102010201" } - links:intvector { 362, 368 } - } //Z#362 - /* Australia/Queensland */ :int { 349 } //Z#363 - /* Australia/South */ :int { 348 } //Z#364 - /* Australia/Sydney */ :table { - transPre32:intvector { -1, 1930854204 } - trans:intvector { -1672567140, -1665392400, -883641600, -876128400, -860400000, -844678800, -828345600, -813229200, 57686400, 67968000, 89136000, 100022400, 120585600, 131472000, 152035200, 162921600, 183484800, 194976000, 215539200, 226425600, 246988800, 257875200, 278438400, 289324800, 309888000, 320774400, 341337600, 352224000, 372787200, 386697600, 404841600, 415728000, 436291200, 447177600, 467740800, 478627200, 499190400, 511286400, 530035200, 542736000, 562089600, 574790400, 594144000, 606240000, 625593600, 636480000, 657043200, 667929600, 688492800, 699379200, 719942400, 731433600, 751996800, 762883200, 783446400, 794332800, 814896000, 828201600, 846345600, 859651200, 877795200, 891100800, 909244800, 922550400, 941299200, 954000000, 967305600, 985449600, 1004198400, 1017504000, 1035648000, 1048953600, 1067097600, 1080403200, 1099152000, 1111852800, 1130601600, 1143907200, 1162051200, 1174752000, 1193500800, 1207411200, 1223136000 } - typeOffsets:intvector { 36292, 0, 36000, 0, 36000, 3600 } - typeMap:bin { "010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102" } - finalRule { "AN" } - finalRaw:int { 36000 } - finalYear:int { 2009 } - links:intvector { 1, 347, 351, 360, 365 } - } //Z#365 - /* Australia/Tasmania */ :int { 355 } //Z#366 - /* Australia/Victoria */ :int { 359 } //Z#367 - /* Australia/West */ :int { 362 } //Z#368 - /* Australia/Yancowinna */ :int { 350 } //Z#369 - /* BET */ :int { 201 } //Z#370 - /* BST */ :int { 262 } //Z#371 - /* Brazil/Acre */ :int { 195 } //Z#372 - /* Brazil/DeNoronha */ :int { 176 } //Z#373 - /* Brazil/East */ :int { 201 } //Z#374 - /* Brazil/West */ :int { 156 } //Z#375 - /* CAT */ :int { 43 } //Z#376 - /* CET */ :table { - trans:intvector { -1693706400, -1680483600, -1663455600, -1650150000, -1632006000, -1618700400, -938905200, -857257200, -844556400, -828226800, -812502000, -796777200, -781052400, -766623600, 228877200, 243997200, 260326800, 276051600, 291776400, 307501200, 323830800, 338950800, 354675600, 370400400, 386125200, 401850000, 417574800, 433299600, 449024400, 465354000, 481078800, 496803600, 512528400, 528253200, 543978000, 559702800, 575427600, 591152400, 606877200, 622602000, 638326800, 654656400, 670381200, 686106000, 701830800, 717555600, 733280400, 749005200, 764730000, 780454800, 796179600, 811904400, 828234000, 846378000 } - typeOffsets:intvector { 3600, 0, 3600, 3600 } - typeMap:bin { "010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100" } - finalRule { "C-Eur" } - finalRaw:int { 3600 } - finalYear:int { 1997 } - } //Z#377 - /* CNT */ :int { 206 } //Z#378 - /* CST */ :int { 98 } //Z#379 - /* CST6CDT */ :table { - trans:intvector { -1633276800, -1615136400, -1601827200, -1583686800, -880214400, -765392400, -84384000, -68662800, -52934400, -37213200, -21484800, -5763600, 9964800, 25686000, 41414400, 57740400, 73468800, 89190000, 104918400, 120639600, 126691200, 152089200, 162374400, 183538800, 199267200, 215593200, 230716800, 247042800, 262771200, 278492400, 294220800, 309942000, 325670400, 341391600, 357120000, 372841200, 388569600, 404895600, 420019200, 436345200, 452073600, 467794800, 483523200, 499244400, 514972800, 530694000, 544608000, 562143600, 576057600, 594198000, 607507200, 625647600, 638956800, 657097200, 671011200, 688546800, 702460800, 719996400, 733910400, 752050800, 765360000, 783500400, 796809600, 814950000, 828864000, 846399600, 860313600, 877849200, 891763200, 909298800, 923212800, 941353200, 954662400, 972802800, 986112000, 1004252400, 1018166400, 1035702000, 1049616000, 1067151600, 1081065600, 1099206000, 1112515200, 1130655600, 1143964800, 1162105200, 1173600000, 1194159600 } - typeOffsets:intvector { -21600, 0, -21600, 3600 } - typeMap:bin { "01000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100" } - finalRule { "US" } - finalRaw:int { -21600 } - finalYear:int { 2008 } - } //Z#380 - /* CTT */ :int { 312 } //Z#381 - /* Canada/Atlantic */ :int { 128 } //Z#382 - /* Canada/Central */ :int { 221 } //Z#383 - /* Canada/East-Saskatchewan */ :int { 193 } //Z#384 - /* Canada/Eastern */ :int { 216 } //Z#385 - /* Canada/Mountain */ :int { 112 } //Z#386 - /* Canada/Newfoundland */ :int { 206 } //Z#387 - /* Canada/Pacific */ :int { 218 } //Z#388 - /* Canada/Saskatchewan */ :int { 193 } //Z#389 - /* Canada/Yukon */ :int { 220 } //Z#390 - /* Chile/Continental */ :int { 199 } //Z#391 - /* Chile/EasterIsland */ :int { 554 } //Z#392 - /* Cuba */ :int { 129 } //Z#393 - /* EAT */ :int { 48 } //Z#394 - /* ECT */ :int { 473 } //Z#395 - /* EET */ :table { - trans:intvector { 228877200, 243997200, 260326800, 276051600, 291776400, 307501200, 323830800, 338950800, 354675600, 370400400, 386125200, 401850000, 417574800, 433299600, 449024400, 465354000, 481078800, 496803600, 512528400, 528253200, 543978000, 559702800, 575427600, 591152400, 606877200, 622602000, 638326800, 654656400, 670381200, 686106000, 701830800, 717555600, 733280400, 749005200, 764730000, 780454800, 796179600, 811904400, 828234000, 846378000 } - typeOffsets:intvector { 7200, 0, 7200, 3600 } - typeMap:bin { "01000100010001000100010001000100010001000100010001000100010001000100010001000100" } - finalRule { "EU" } - finalRaw:int { 7200 } - finalYear:int { 1997 } - } //Z#396 - /* EST */ :table { - typeOffsets:intvector { -18000, 0 } - } //Z#397 - /* EST5EDT */ :table { - trans:intvector { -1633280400, -1615140000, -1601830800, -1583690400, -880218000, -765396000, -84387600, -68666400, -52938000, -37216800, -21488400, -5767200, 9961200, 25682400, 41410800, 57736800, 73465200, 89186400, 104914800, 120636000, 126687600, 152085600, 162370800, 183535200, 199263600, 215589600, 230713200, 247039200, 262767600, 278488800, 294217200, 309938400, 325666800, 341388000, 357116400, 372837600, 388566000, 404892000, 420015600, 436341600, 452070000, 467791200, 483519600, 499240800, 514969200, 530690400, 544604400, 562140000, 576054000, 594194400, 607503600, 625644000, 638953200, 657093600, 671007600, 688543200, 702457200, 719992800, 733906800, 752047200, 765356400, 783496800, 796806000, 814946400, 828860400, 846396000, 860310000, 877845600, 891759600, 909295200, 923209200, 941349600, 954658800, 972799200, 986108400, 1004248800, 1018162800, 1035698400, 1049612400, 1067148000, 1081062000, 1099202400, 1112511600, 1130652000, 1143961200, 1162101600, 1173596400, 1194156000 } - typeOffsets:intvector { -18000, 0, -18000, 3600 } - typeMap:bin { "01000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100" } - finalRule { "US" } - finalRaw:int { -18000 } - finalYear:int { 2008 } - } //Z#398 - /* Egypt */ :int { 18 } //Z#399 - /* Eire */ :int { 451 } //Z#400 - /* Etc/GMT */ :table { - typeOffsets:intvector { 0, 0 } - links:intvector { 401, 402, 415, 430, 431, 503, 504, 505, 506, 507 } - } //Z#401 - /* Etc/GMT+0 */ :int { 401 } //Z#402 - /* Etc/GMT+1 */ :table { - typeOffsets:intvector { -3600, 0 } - } //Z#403 - /* Etc/GMT+10 */ :table { - typeOffsets:intvector { -36000, 0 } - } //Z#404 - /* Etc/GMT+11 */ :table { - typeOffsets:intvector { -39600, 0 } - } //Z#405 - /* Etc/GMT+12 */ :table { - typeOffsets:intvector { -43200, 0 } - } //Z#406 - /* Etc/GMT+2 */ :table { - typeOffsets:intvector { -7200, 0 } - } //Z#407 - /* Etc/GMT+3 */ :table { - typeOffsets:intvector { -10800, 0 } - } //Z#408 - /* Etc/GMT+4 */ :table { - typeOffsets:intvector { -14400, 0 } - } //Z#409 - /* Etc/GMT+5 */ :table { - typeOffsets:intvector { -18000, 0 } - } //Z#410 - /* Etc/GMT+6 */ :table { - typeOffsets:intvector { -21600, 0 } - } //Z#411 - /* Etc/GMT+7 */ :table { - typeOffsets:intvector { -25200, 0 } - } //Z#412 - /* Etc/GMT+8 */ :table { - typeOffsets:intvector { -28800, 0 } - } //Z#413 - /* Etc/GMT+9 */ :table { - typeOffsets:intvector { -32400, 0 } - } //Z#414 - /* Etc/GMT-0 */ :int { 401 } //Z#415 - /* Etc/GMT-1 */ :table { - typeOffsets:intvector { 3600, 0 } - } //Z#416 - /* Etc/GMT-10 */ :table { - typeOffsets:intvector { 36000, 0 } - } //Z#417 - /* Etc/GMT-11 */ :table { - typeOffsets:intvector { 39600, 0 } - } //Z#418 - /* Etc/GMT-12 */ :table { - typeOffsets:intvector { 43200, 0 } - } //Z#419 - /* Etc/GMT-13 */ :table { - typeOffsets:intvector { 46800, 0 } - } //Z#420 - /* Etc/GMT-14 */ :table { - typeOffsets:intvector { 50400, 0 } - } //Z#421 - /* Etc/GMT-2 */ :table { - typeOffsets:intvector { 7200, 0 } - } //Z#422 - /* Etc/GMT-3 */ :table { - typeOffsets:intvector { 10800, 0 } - } //Z#423 - /* Etc/GMT-4 */ :table { - typeOffsets:intvector { 14400, 0 } - } //Z#424 - /* Etc/GMT-5 */ :table { - typeOffsets:intvector { 18000, 0 } - } //Z#425 - /* Etc/GMT-6 */ :table { - typeOffsets:intvector { 21600, 0 } - } //Z#426 - /* Etc/GMT-7 */ :table { - typeOffsets:intvector { 25200, 0 } - } //Z#427 - /* Etc/GMT-8 */ :table { - typeOffsets:intvector { 28800, 0 } - } //Z#428 - /* Etc/GMT-9 */ :table { - typeOffsets:intvector { 32400, 0 } - } //Z#429 - /* Etc/GMT0 */ :int { 401 } //Z#430 - /* Etc/Greenwich */ :int { 401 } //Z#431 - /* Etc/UCT */ :table { - typeOffsets:intvector { 0, 0 } - links:intvector { 432, 612 } - } //Z#432 - /* Etc/UTC */ :table { - typeOffsets:intvector { 0, 0 } - links:intvector { 433, 434, 436, 626, 627, 631 } - } //Z#433 - /* Etc/Universal */ :int { 433 } //Z#434 - /* Etc/Unknown */ :table { - typeOffsets:intvector { 0, 0 } - } //Z#435 - /* Etc/Zulu */ :int { 433 } //Z#436 - /* Europe/Amsterdam */ :table { - trans:intvector { -1693700372, -1680484772, -1663453172, -1650147572, -1633213172, -1617488372, -1601158772, -1586038772, -1569709172, -1554589172, -1538259572, -1523139572, -1507501172, -1490566772, -1470176372, -1459117172, -1443997172, -1427667572, -1406672372, -1396217972, -1376950772, -1364768372, -1345414772, -1333318772, -1313792372, -1301264372, -1282256372, -1269814772, -1250720372, -1238365172, -1219184372, -1206915572, -1186957172, -1175465972, -1156025972, -1143411572, -1124489972, -1111961972, -1092953972, -1080512372, -1061331572, -1049062772, -1029190772, -1025745572, -1017613200, -998259600, -986163600, -966723600, -954109200, -935022000, -857257200, -844556400, -828226800, -812502000, -796777200, -781052400, -766623600, 228877200, 243997200, 260326800, 276051600, 291776400, 307501200, 323830800, 338950800, 354675600, 370400400, 386125200, 401850000, 417574800, 433299600, 449024400, 465354000, 481078800, 496803600, 512528400, 528253200, 543978000, 559702800, 575427600, 591152400, 606877200, 622602000, 638326800, 654656400, 670381200, 686106000, 701830800, 717555600, 733280400, 749005200, 764730000, 780454800, 796179600, 811904400, 828234000, 846378000 } - typeOffsets:intvector { 1172, 0, 1172, 3600, 1200, 0, 1200, 3600, 3600, 0, 3600, 3600 } - typeMap:bin { "01000100010001000100010001000100010001000100010001000100010001000100010001000100010001030203020302050405040504050405040504050405040504050405040504050405040504050405040504050405040504050405040504" } - finalRule { "EU" } - finalRaw:int { 3600 } - finalYear:int { 1997 } - } //Z#437 - /* Europe/Andorra */ :table { - transPre32:intvector { -1, 2117514132 } - trans:intvector { -733881600, 481078800, 496803600, 512528400, 528253200, 543978000, 559702800, 575427600, 591152400, 606877200, 622602000, 638326800, 654656400, 670381200, 686106000, 701830800, 717555600, 733280400, 749005200, 764730000, 780454800, 796179600, 811904400, 828234000, 846378000 } - typeOffsets:intvector { 364, 0, 0, 0, 3600, 0, 3600, 3600 } - typeMap:bin { "0102030203020302030203020302030203020302030203020302" } - finalRule { "EU" } - finalRaw:int { 3600 } - finalYear:int { 1997 } - } //Z#438 - /* Europe/Astrakhan */ :table { - trans:intvector { -1441249932, -1247540400, 354916800, 370724400, 386452800, 402260400, 417988800, 433796400, 449611200, 465343200, 481068000, 496792800, 512517600, 528242400, 543967200, 559692000, 575416800, 591141600, 606866400, 622594800, 638319600, 654649200, 670374000, 701820000, 717548400, 733273200, 748998000, 764722800, 780447600, 796172400, 811897200, 828226800, 846370800, 859676400, 877820400, 891126000, 909270000, 922575600, 941324400, 954025200, 972774000, 985474800, 1004223600, 1017529200, 1035673200, 1048978800, 1067122800, 1080428400, 1099177200, 1111878000, 1130626800, 1143327600, 1162076400, 1174777200, 1193526000, 1206831600, 1224975600, 1238281200, 1256425200, 1269730800, 1288479600, 1301180400, 1414274400, 1459033200 } - typeOffsets:intvector { 11532, 0, 10800, 0, 10800, 3600, 14400, 0, 14400, 3600 } - typeMap:bin { "01030403040304030403040304030403040302010201030201020102010201020102010201020102010201020102010201020102010201020102010201030103" } - } //Z#439 - /* Europe/Athens */ :table { - trans:intvector { -1686101632, -1182996000, -1178161200, -906861600, -904878000, -857257200, -844477200, -828237600, -812422800, -552362400, -541652400, 166485600, 186184800, 198028800, 213753600, 228873600, 244080000, 260323200, 275446800, 291798000, 307407600, 323388000, 338936400, 354675600, 370400400, 386125200, 401850000, 417574800, 433299600, 449024400, 465354000, 481078800, 496803600, 512528400, 528253200, 543978000, 559702800, 575427600, 591152400, 606877200, 622602000, 638326800, 654656400, 670381200, 686106000, 701830800, 717555600, 733280400, 749005200, 764730000, 780454800, 796179600, 811904400, 828234000, 846378000 } - typeOffsets:intvector { 5692, 0, 3600, 0, 3600, 3600, 7200, 0, 7200, 3600 } - typeMap:bin { "03040304020102010304030403040304030403040304030403040304030403040304030403040304030403040304030403040304030403" } - finalRule { "EU" } - finalRaw:int { 7200 } - finalYear:int { 1997 } - } //Z#440 - /* Europe/Belfast */ :int { 463 } //Z#441 - /* Europe/Belgrade */ :table { - transPre32:intvector { -1, 1581051976 } - trans:intvector { -905824800, -857257200, -844556400, -828226800, -812502000, -796777200, -777942000, -766623600, 417574800, 433299600, 449024400, 465354000, 481078800, 496803600, 512528400, 528253200, 543978000, 559702800, 575427600, 591152400, 606877200, 622602000, 638326800, 654656400, 670381200, 686106000, 701830800, 717555600, 733280400, 749005200, 764730000, 780454800, 796179600, 811904400, 828234000, 846378000 } - typeOffsets:intvector { 4920, 0, 3600, 0, 3600, 3600 } - typeMap:bin { "01020102010201020102010201020102010201020102010201020102010201020102010201" } - finalRule { "EU" } - finalRaw:int { 3600 } - finalYear:int { 1997 } - links:intvector { 442, 462, 474, 480, 483, 497 } - } //Z#442 - /* Europe/Berlin */ :table { - transPre32:intvector { -1, 1872912888 } - trans:intvector { -1693706400, -1680483600, -1663455600, -1650150000, -1632006000, -1618700400, -938905200, -857257200, -844556400, -828226800, -812502000, -796777200, -781052400, -776563200, -765936000, -761180400, -748479600, -733273200, -717631200, -714610800, -710380800, -701910000, -684975600, -670460400, -654130800, -639010800, 323830800, 338950800, 354675600, 370400400, 386125200, 401850000, 417574800, 433299600, 449024400, 465354000, 481078800, 496803600, 512528400, 528253200, 543978000, 559702800, 575427600, 591152400, 606877200, 622602000, 638326800, 654656400, 670381200, 686106000, 701830800, 717555600, 733280400, 749005200, 764730000, 780454800, 796179600, 811904400, 828234000, 846378000 } - typeOffsets:intvector { 3208, 0, 3600, 0, 3600, 3600, 3600, 7200 } - typeMap:bin { "01020102010201020102010201020302010201020302010201020102010201020102010201020102010201020102010201020102010201020102010201" } - finalRule { "EU" } - finalRaw:int { 3600 } - finalYear:int { 1997 } - } //Z#443 - /* Europe/Bratislava */ :int { 475 } //Z#444 - /* Europe/Brussels */ :table { - transPre32:intvector { -1, 1844014246 } - trans:intvector { -1740355200, -1693702800, -1680483600, -1663455600, -1650150000, -1632006000, -1618700400, -1613826000, -1604278800, -1585530000, -1574038800, -1552266000, -1539997200, -1520557200, -1507510800, -1490576400, -1473642000, -1459126800, -1444006800, -1427677200, -1411952400, -1396227600, -1379293200, -1364778000, -1348448400, -1333328400, -1316394000, -1301263200, -1284328800, -1269813600, -1253484000, -1238364000, -1221429600, -1206914400, -1191189600, -1175464800, -1160344800, -1143410400, -1127685600, -1111960800, -1096840800, -1080511200, -1063576800, -1049061600, -1033336800, -1017612000, -1002492000, -986162400, -969228000, -950479200, -942012000, -934668000, -857257200, -844556400, -828226800, -812502000, -798073200, -781052400, -766623600, -745455600, -733273200, 228877200, 243997200, 260326800, 276051600, 291776400, 307501200, 323830800, 338950800, 354675600, 370400400, 386125200, 401850000, 417574800, 433299600, 449024400, 465354000, 481078800, 496803600, 512528400, 528253200, 543978000, 559702800, 575427600, 591152400, 606877200, 622602000, 638326800, 654656400, 670381200, 686106000, 701830800, 717555600, 733280400, 749005200, 764730000, 780454800, 796179600, 811904400, 828234000, 846378000 } - typeOffsets:intvector { 1050, 0, 0, 0, 0, 3600, 3600, 0, 3600, 3600 } - typeMap:bin { "010304030403040301020102010201020102010201020102010201020102010201020102010201020102010201020102010201020403040304030403040304030403040304030403040304030403040304030403040304030403040304030403040304030403" } - finalRule { "EU" } - finalRaw:int { 3600 } - finalYear:int { 1997 } - } //Z#445 - /* Europe/Bucharest */ :table { - trans:intvector { -1213148664, -1187056800, -1175479200, -1159754400, -1144029600, -1127700000, -1111975200, -1096250400, -1080525600, -1064800800, -1049076000, -1033351200, -1017626400, -1001901600, -986176800, -970452000, -954727200, 296604000, 307486800, 323816400, 338940000, 354672000, 370396800, 386121600, 401846400, 417571200, 433296000, 449020800, 465350400, 481075200, 496800000, 512524800, 528249600, 543974400, 559699200, 575424000, 591148800, 606873600, 622598400, 638323200, 654652800, 670370400, 686095200, 701820000, 717544800, 733269600, 748994400, 764719200, 780440400, 796168800, 811890000, 828223200, 846363600, 859683600, 877827600 } - typeOffsets:intvector { 6264, 0, 7200, 0, 7200, 3600 } - typeMap:bin { "01020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201" } - finalRule { "EU" } - finalRaw:int { 7200 } - finalYear:int { 1998 } - } //Z#446 - /* Europe/Budapest */ :table { - transPre32:intvector { -1, 1794028316 } - trans:intvector { -1693706400, -1680483600, -1663455600, -1650150000, -1633212000, -1618700400, -1600466400, -1581202800, -906771600, -857257200, -844556400, -828226800, -812502000, -796777200, -778471200, -762660000, -749689200, -733359600, -717634800, -701910000, -686185200, -670460400, -654130800, -639010800, -621990000, -605660400, -492656400, -481168800, -461120400, -449632800, -428547600, -418269600, -397094400, -386809200, 323827200, 338950800, 354675600, 370400400, 386125200, 401850000, 417574800, 433299600, 449024400, 465354000, 481078800, 496803600, 512528400, 528253200, 543978000, 559702800, 575427600, 591152400, 606877200, 622602000, 638326800, 654656400, 670381200, 686106000, 701830800, 717555600, 733280400, 749005200, 764730000, 780454800, 796179600, 811904400, 828234000, 846378000 } - typeOffsets:intvector { 4580, 0, 3600, 0, 3600, 3600 } - typeMap:bin { "010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201" } - finalRule { "EU" } - finalRaw:int { 3600 } - finalYear:int { 1997 } - } //Z#447 - /* Europe/Busingen */ :int { 499 } //Z#448 - /* Europe/Chisinau */ :table { - transPre32:intvector { -1, 1454819576 } - trans:intvector { -1637114100, -1213148664, -1187056800, -1175479200, -1159754400, -1144029600, -1127700000, -1111975200, -1096250400, -1080525600, -1064800800, -1049076000, -1033351200, -1017626400, -1001901600, -986176800, -970452000, -954727200, -927165600, -898138800, -857257200, -844556400, -828226800, -812502000, -800157600, 354920400, 370728000, 386456400, 402264000, 417992400, 433800000, 449614800, 465346800, 481071600, 496796400, 512521200, 528246000, 543970800, 559695600, 575420400, 591145200, 606870000, 622594800, 638319600, 641944800, 654652800, 670377600, 686102400, 701820000, 717541200, 733269600, 748990800, 764719200, 780440400, 796168800, 811890000, 828223200, 846363600, 859680000, 877824000 } - typeOffsets:intvector { 6920, 0, 3600, 0, 3600, 3600, 6264, 0, 6900, 0, 7200, 0, 7200, 3600, 10800, 0, 10800, 3600 } - typeMap:bin { "04030506050605060506050605060506050605060201020102070807080708070807080708070807080708070806050605060506050605060506050605" } - finalRule { "Moldova" } - finalRaw:int { 7200 } - finalYear:int { 1998 } - links:intvector { 449, 488 } - } //Z#449 - /* Europe/Copenhagen */ :table { - transPre32:intvector { -1, 1896673076 } - trans:intvector { -1692496800, -1680490800, -935110800, -857257200, -844556400, -828226800, -812502000, -796777200, -781052400, -769388400, -747010800, -736383600, -715215600, -706748400, -683161200, -675298800, 323830800, 338950800, 354675600, 370400400, 386125200, 401850000, 417574800, 433299600, 449024400, 465354000, 481078800, 496803600, 512528400, 528253200, 543978000, 559702800, 575427600, 591152400, 606877200, 622602000, 638326800, 654656400, 670381200, 686106000, 701830800, 717555600, 733280400, 749005200, 764730000, 780454800, 796179600, 811904400, 828234000, 846378000 } - typeOffsets:intvector { 3020, 0, 3600, 0, 3600, 3600 } - typeMap:bin { "010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201" } - finalRule { "EU" } - finalRaw:int { 3600 } - finalYear:int { 1997 } - } //Z#450 - /* Europe/Dublin */ :table { - transPre32:intvector { -1, 1473317596 } - trans:intvector { -1691962479, -1680471279, -1664143200, -1650146400, -1633903200, -1617487200, -1601848800, -1586037600, -1570399200, -1552168800, -1538344800, -1522533600, -1507500000, -1490565600, -1473631200, -1460930400, -1442786400, -1428876000, -1410732000, -1396216800, -1379282400, -1364767200, -1348437600, -1333317600, -1315778400, -1301263200, -1284328800, -1269813600, -1253484000, -1238364000, -1221429600, -1206914400, -1189980000, -1175464800, -1159135200, -1143410400, -1126476000, -1111960800, -1095631200, -1080511200, -1063576800, -1049061600, -1032127200, -1017612000, -1001282400, -986162400, -969228000, -950479200, -942012000, -733359600, -719445600, -699490800, -684972000, -668037600, -654732000, -636588000, -622072800, -605743200, -590623200, -574293600, -558568800, -542239200, -527119200, -512604000, -496274400, -481154400, -464220000, -449704800, -432165600, -417650400, -401320800, -386200800, -369266400, -354751200, -337816800, -323301600, -306972000, -291852000, -276732000, -257983200, -245282400, -226533600, -213228000, -195084000, -182383200, -163634400, -150933600, -132184800, -119484000, -100735200, -88034400, -68680800, -59004000, -37242000, 57722400, 69818400, 89172000, 101268000, 120621600, 132717600, 152071200, 164167200, 183520800, 196221600, 214970400, 227671200, 246420000, 259120800, 278474400, 290570400, 309924000, 322020000, 341373600, 354675600, 372819600, 386125200, 404269200, 417574800, 435718800, 449024400, 467773200, 481078800, 499222800, 512528400, 530672400, 543978000, 562122000, 575427600, 593571600, 606877200, 625626000, 638326800, 657075600, 670381200, 688525200, 701830800, 719974800, 733280400, 751424400, 764730000, 782874000, 796179600, 814323600, 828234000, 846378000 } - typeOffsets:intvector { -1500, 0, -1521, 0, -1521, 3600, 0, 0, 0, 3600, 3600, 0 } - typeMap:bin { "0102030403040304030403040304030403040304030403040304030403040304030403040304030403040304030403040304030403040304030403040304030403040304030403040304030403040304030403040304030403040304030405030403040304030403040304030403040304030403040304030403040304030403040304030403040304030403040304030403" } - finalRule { "EU" } - finalRaw:int { 0 } - finalYear:int { 1997 } - links:intvector { 400, 451 } - } //Z#451 - /* Europe/Gibraltar */ :table { - transPre32:intvector { -1, 1473317380 } - trans:intvector { -1691964000, -1680472800, -1664143200, -1650146400, -1633903200, -1617487200, -1601848800, -1586037600, -1570399200, -1552168800, -1538344800, -1522533600, -1507500000, -1490565600, -1473631200, -1460930400, -1442786400, -1428876000, -1410732000, -1396216800, -1379282400, -1364767200, -1348437600, -1333317600, -1315778400, -1301263200, -1284328800, -1269813600, -1253484000, -1238364000, -1221429600, -1206914400, -1189980000, -1175464800, -1159135200, -1143410400, -1126476000, -1111960800, -1095631200, -1080511200, -1063576800, -1049061600, -1032127200, -1017612000, -1001282400, -986162400, -969228000, -950479200, -942012000, -904518000, -896050800, -875487600, -864601200, -844038000, -832546800, -812588400, -798073200, -781052400, -772066800, -764805600, -748476000, -733356000, -719445600, -717030000, -706748400, -699487200, -687996000, -668037600, -654732000, -636588000, -622072800, -605743200, -590623200, -574293600, -558568800, -542239200, -527119200, -512604000, -496274400, -481154400, -464220000, -449704800, -432165600, -417650400, -401320800, 386125200, 401850000, 417574800, 433299600, 449024400, 465354000, 481078800, 496803600, 512528400, 528253200, 543978000, 559702800, 575427600, 591152400, 606877200, 622602000, 638326800, 654656400, 670381200, 686106000, 701830800, 717555600, 733280400, 749005200, 764730000, 780454800, 796179600, 811904400, 828234000, 846378000 } - typeOffsets:intvector { -1284, 0, 0, 0, 0, 3600, 0, 7200, 3600, 0, 3600, 3600 } - typeMap:bin { "0102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102030203020302030203020102010203020102010201020102010201020102010201020104050405040504050405040504050405040504050405040504050405040504" } - finalRule { "EU" } - finalRaw:int { 3600 } - finalYear:int { 1997 } - } //Z#452 - /* Europe/Guernsey */ :int { 463 } //Z#453 - /* Europe/Helsinki */ :table { - trans:intvector { -1535938789, -875671200, -859773600, 354672000, 370396800, 386121600, 401846400, 417574800, 433299600, 449024400, 465354000, 481078800, 496803600, 512528400, 528253200, 543978000, 559702800, 575427600, 591152400, 606877200, 622602000, 638326800, 654656400, 670381200, 686106000, 701830800, 717555600, 733280400, 749005200, 764730000, 780454800, 796179600, 811904400, 828234000, 846378000 } - typeOffsets:intvector { 5989, 0, 7200, 0, 7200, 3600 } - typeMap:bin { "0102010201020102010201020102010201020102010201020102010201020102010201" } - finalRule { "EU" } - finalRaw:int { 7200 } - finalYear:int { 1997 } - links:intvector { 454, 467 } - } //Z#454 - /* Europe/Isle_of_Man */ :int { 463 } //Z#455 - /* Europe/Istanbul */ :table { - transPre32:intvector { -1, 1454819544 } - trans:intvector { -1869875816, -1693706400, -1680490800, -1570413600, -1552186800, -1538359200, -1522551600, -1507514400, -1490583600, -1440208800, -1428030000, -1409709600, -1396494000, -931140000, -922762800, -917834400, -892436400, -875844000, -857358000, -781063200, -764737200, -744343200, -733806000, -716436000, -701924400, -684986400, -670474800, -654141600, -639025200, -621828000, -606970800, -590032800, -575434800, -235620000, -228279600, -177732000, -165726000, 10533600, 23835600, 41983200, 55285200, 74037600, 87339600, 107910000, 121219200, 133920000, 152676000, 165362400, 183502800, 202428000, 215557200, 228866400, 245797200, 260316000, 277246800, 308779200, 323827200, 340228800, 354672000, 371678400, 386121600, 403128000, 428446800, 433886400, 482792400, 496702800, 512521200, 528246000, 543970800, 559695600, 575420400, 591145200, 606870000, 622594800, 638319600, 654649200, 670374000, 686098800, 701823600, 717548400, 733273200, 748998000, 764118000, 780447600, 796172400, 811897200, 828226800, 846370800, 859676400, 877820400, 891126000, 909270000, 922575600, 941324400, 954025200, 972774000, 985474800, 1004223600, 1017529200, 1035673200, 1048978800, 1067122800, 1080428400, 1099177200, 1111878000, 1130626800, 1143327600, 1162076400, 1174784400, 1193533200, 1206838800, 1224982800, 1238288400, 1256432400, 1269738000, 1288486800, 1301274000, 1319936400, 1332637200, 1351386000, 1364691600, 1382835600, 1396227600, 1414285200, 1427590800, 1446944400, 1459040400, 1473195600 } - typeOffsets:intvector { 6952, 0, 7016, 0, 7200, 0, 7200, 3600, 10800, 0, 10800, 3600 } - typeMap:bin { "010203020302030203020302030203020302030203020302030203020302030203020302030203020302030203020302030203020302030504050405040504050403020302030203020302030203020302030203020302030203020302030203020302030203020302030203020302030203020302030203020302030203020304" } - links:intvector { 274, 456, 611 } - } //Z#456 - /* Europe/Jersey */ :int { 463 } //Z#457 - /* Europe/Kaliningrad */ :table { - transPre32:intvector { -1, 1872911176 } - trans:intvector { -1693706400, -1680483600, -1663455600, -1650150000, -1632006000, -1618700400, -938905200, -857257200, -844556400, -828226800, -812502000, -796777200, -788922000, -778730400, -762663600, -757389600, 354920400, 370728000, 386456400, 402264000, 417992400, 433800000, 449614800, 465346800, 481071600, 496796400, 512521200, 528246000, 543970800, 559695600, 575420400, 591145200, 606870000, 622598400, 638323200, 654652800, 670377600, 686102400, 701827200, 717552000, 733276800, 749001600, 764726400, 780451200, 796176000, 811900800, 828230400, 846374400, 859680000, 877824000, 891129600, 909273600, 922579200, 941328000, 954028800, 972777600, 985478400, 1004227200, 1017532800, 1035676800, 1048982400, 1067126400, 1080432000, 1099180800, 1111881600, 1130630400, 1143331200, 1162080000, 1174780800, 1193529600, 1206835200, 1224979200, 1238284800, 1256428800, 1269734400, 1288483200, 1301184000, 1414278000 } - typeOffsets:intvector { 4920, 0, 3600, 0, 3600, 3600, 7200, 0, 7200, 3600, 10800, 0, 10800, 3600 } - typeMap:bin { "01020102010201020102010201030403050605060506050605060506050605060504030403040304030403040304030403040304030403040304030403040304030403040304030403040304030503" } - } //Z#458 - /* Europe/Kiev */ :table { - trans:intvector { -1441159324, -1247536800, -892522800, -857257200, -844556400, -828226800, -825382800, 354920400, 370728000, 386456400, 402264000, 417992400, 433800000, 449614800, 465346800, 481071600, 496796400, 512521200, 528246000, 543970800, 559695600, 575420400, 591145200, 606870000, 622594800, 638319600, 646783200, 686102400, 701820000, 717541200, 733269600, 748990800, 764719200, 780440400, 796179600, 811904400, 828234000, 846378000 } - typeOffsets:intvector { 7324, 0, 3600, 0, 3600, 3600, 7200, 0, 7200, 3600, 10800, 0, 10800, 3600 } - typeMap:bin { "0305020102010506050605060506050605060506050605060506040304030403040304030403" } - finalRule { "EU" } - finalRaw:int { 7200 } - finalYear:int { 1997 } - } //Z#459 - /* Europe/Kirov */ :table { - trans:intvector { -1593820800, -1247540400, 354916800, 370724400, 386452800, 402260400, 417988800, 433796400, 449611200, 465343200, 481068000, 496792800, 512517600, 528242400, 543967200, 559692000, 575416800, 591141600, 606866400, 622594800, 638319600, 654649200, 670374000, 701820000, 717548400, 733273200, 748998000, 764722800, 780447600, 796172400, 811897200, 828226800, 846370800, 859676400, 877820400, 891126000, 909270000, 922575600, 941324400, 954025200, 972774000, 985474800, 1004223600, 1017529200, 1035673200, 1048978800, 1067122800, 1080428400, 1099177200, 1111878000, 1130626800, 1143327600, 1162076400, 1174777200, 1193526000, 1206831600, 1224975600, 1238281200, 1256425200, 1269730800, 1288479600, 1301180400, 1414274400 } - typeOffsets:intvector { 11928, 0, 10800, 0, 10800, 3600, 14400, 0, 14400, 3600 } - typeMap:bin { "010304030403040304030403040304030403020102010302010201020102010201020102010201020102010201020102010201020102010201020102010301" } - } //Z#460 - /* Europe/Lisbon */ :table { - trans:intvector { -1830381795, -1689555600, -1677801600, -1667437200, -1647738000, -1635814800, -1616202000, -1604365200, -1584666000, -1572742800, -1553043600, -1541206800, -1521507600, -1442451600, -1426813200, -1379293200, -1364778000, -1348448400, -1333328400, -1316394000, -1301274000, -1284339600, -1269824400, -1221440400, -1206925200, -1191200400, -1175475600, -1127696400, -1111971600, -1096851600, -1080522000, -1063587600, -1049072400, -1033347600, -1017622800, -1002502800, -986173200, -969238800, -950490000, -942022800, -922669200, -906944400, -891133200, -877309200, -873684000, -864007200, -857955600, -845859600, -842839200, -831348000, -825901200, -814410000, -810784800, -799898400, -794451600, -782960400, -779335200, -768448800, -763002000, -749091600, -733366800, -717631200, -701906400, -686181600, -670456800, -654732000, -639007200, -591832800, -575503200, -559778400, -544053600, -528328800, -512604000, -496879200, -481154400, -465429600, -449704800, -433980000, -417650400, -401925600, -386200800, -370476000, -354751200, -339026400, -323301600, -307576800, -291852000, -276127200, -260402400, -244677600, -228348000, -212623200, -196898400, -181173600, -165448800, -149724000, -133999200, -118274400, 212544000, 228268800, 243993600, 260323200, 276048000, 291772800, 307501200, 323222400, 338950800, 354675600, 370400400, 386125200, 401850000, 417578400, 433299600, 449024400, 465354000, 481078800, 496803600, 512528400, 528253200, 543978000, 559702800, 575427600, 591152400, 606877200, 622602000, 638326800, 654656400, 670381200, 686106000, 701830800, 717555600, 733280400, 749005200, 764730000, 780454800, 796179600, 811904400, 828234000, 846378000 } - typeOffsets:intvector { -2205, 0, 0, 0, 0, 3600, 0, 7200, 3600, 0, 3600, 3600 } - typeMap:bin { "01020102010201020102010201020102010201020102010201020102010201020102010201020102010201020302010203020102030201020302010201020102010201020102010201020102010201020102010201020102010201020102010201040102010201020102010201020102010201020102010201020102010201020102040504050405040201" } - finalRule { "EU" } - finalRaw:int { 0 } - finalYear:int { 1997 } - links:intvector { 461, 593 } - } //Z#461 - /* Europe/Ljubljana */ :int { 442 } //Z#462 - /* Europe/London */ :table { - transPre32:intvector { -1, 442304971 } - trans:intvector { -1691964000, -1680472800, -1664143200, -1650146400, -1633903200, -1617487200, -1601848800, -1586037600, -1570399200, -1552168800, -1538344800, -1522533600, -1507500000, -1490565600, -1473631200, -1460930400, -1442786400, -1428876000, -1410732000, -1396216800, -1379282400, -1364767200, -1348437600, -1333317600, -1315778400, -1301263200, -1284328800, -1269813600, -1253484000, -1238364000, -1221429600, -1206914400, -1189980000, -1175464800, -1159135200, -1143410400, -1126476000, -1111960800, -1095631200, -1080511200, -1063576800, -1049061600, -1032127200, -1017612000, -1001282400, -986162400, -969228000, -950479200, -942012000, -904518000, -896050800, -875487600, -864601200, -844038000, -832546800, -812588400, -798073200, -781052400, -772066800, -764805600, -748476000, -733356000, -719445600, -717030000, -706748400, -699487200, -687996000, -668037600, -654732000, -636588000, -622072800, -605743200, -590623200, -574293600, -558568800, -542239200, -527119200, -512604000, -496274400, -481154400, -464220000, -449704800, -432165600, -417650400, -401320800, -386200800, -369266400, -354751200, -337816800, -323301600, -306972000, -291852000, -276732000, -257983200, -245282400, -226533600, -213228000, -195084000, -182383200, -163634400, -150933600, -132184800, -119484000, -100735200, -88034400, -68680800, -59004000, -37242000, 57722400, 69818400, 89172000, 101268000, 120621600, 132717600, 152071200, 164167200, 183520800, 196221600, 214970400, 227671200, 246420000, 259120800, 278474400, 290570400, 309924000, 322020000, 341373600, 354675600, 372819600, 386125200, 404269200, 417574800, 435718800, 449024400, 467773200, 481078800, 499222800, 512528400, 530672400, 543978000, 562122000, 575427600, 593571600, 606877200, 625626000, 638326800, 657075600, 670381200, 688525200, 701830800, 719974800, 733280400, 751424400, 764730000, 782874000, 796179600, 814323600, 828234000, 846378000 } - typeOffsets:intvector { -75, 0, 0, 0, 0, 3600, 0, 7200, 3600, 0 } - typeMap:bin { "01020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020302030203020302030201020102030201020102010201020102010201020102010201020102010201020102010201020102010201020102010204010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201" } - finalRule { "EU" } - finalRaw:int { 0 } - finalYear:int { 1997 } - links:intvector { 441, 453, 455, 457, 463, 501, 502 } - } //Z#463 - /* Europe/Luxembourg */ :table { - trans:intvector { -2069713476, -1692496800, -1680483600, -1662343200, -1650157200, -1632006000, -1618700400, -1612659600, -1604278800, -1585519200, -1574038800, -1552258800, -1539997200, -1520550000, -1507510800, -1490572800, -1473642000, -1459119600, -1444006800, -1427673600, -1411866000, -1396224000, -1379293200, -1364774400, -1348448400, -1333324800, -1316394000, -1301270400, -1284339600, -1269813600, -1253484000, -1238364000, -1221429600, -1206914400, -1191189600, -1175464800, -1160344800, -1143410400, -1127685600, -1111960800, -1096840800, -1080511200, -1063576800, -1049061600, -1033336800, -1017612000, -1002492000, -986162400, -969228000, -950479200, -942012000, -935186400, -857257200, -844556400, -828226800, -812502000, -797986800, -781052400, -766623600, -745455600, -733273200, 228877200, 243997200, 260326800, 276051600, 291776400, 307501200, 323830800, 338950800, 354675600, 370400400, 386125200, 401850000, 417574800, 433299600, 449024400, 465354000, 481078800, 496803600, 512528400, 528253200, 543978000, 559702800, 575427600, 591152400, 606877200, 622602000, 638326800, 654656400, 670381200, 686106000, 701830800, 717555600, 733280400, 749005200, 764730000, 780454800, 796179600, 811904400, 828234000, 846378000 } - typeOffsets:intvector { 1476, 0, 0, 0, 0, 3600, 3600, 0, 3600, 3600 } - typeMap:bin { "0304030403040301020102010201020102010201020102010201020102010201020102010201020102010201020102010201020403040304030403040304030403040304030403040304030403040304030403040304030403040304030403040304030403" } - finalRule { "EU" } - finalRaw:int { 3600 } - finalYear:int { 1997 } - } //Z#464 - /* Europe/Madrid */ :table { - transPre32:intvector { -1, 2117515380 } - trans:intvector { -1661734800, -1648429200, -1631926800, -1616893200, -1601254800, -1585357200, -1442451600, -1427677200, -1379293200, -1364778000, -1348448400, -1333328400, -1316394000, -1301274000, -1284339600, -1269824400, -1029114000, -1017622800, -1002848400, -986173200, -969238800, -954118800, -940208400, -873079200, -862538400, -842839200, -828237600, -811389600, -796010400, -779940000, -765421200, -748490400, -733888800, -652327200, -639190800, 135122400, 150246000, 167176800, 181695600, 196812000, 212540400, 228866400, 243990000, 260402400, 276044400, 291776400, 307501200, 323830800, 338950800, 354675600, 370400400, 386125200, 401850000, 417574800, 433299600, 449024400, 465354000, 481078800, 496803600, 512528400, 528253200, 543978000, 559702800, 575427600, 591152400, 606877200, 622602000, 638326800, 654656400, 670381200, 686106000, 701830800, 717555600, 733280400, 749005200, 764730000, 780454800, 796179600, 811904400, 828234000, 846378000 } - typeOffsets:intvector { -884, 0, 0, 0, 0, 3600, 0, 7200, 3600, 0, 3600, 3600 } - typeMap:bin { "01020102010201020102010201020102010201020102010203020302030203020304050405040504050405040504050405040504050405040504050405040504050405040504050405040504050405040504" } - finalRule { "EU" } - finalRaw:int { 3600 } - finalYear:int { 1997 } - } //Z#465 - /* Europe/Malta */ :table { - transPre32:intvector { -1, 1891488612 } - trans:intvector { -1690765200, -1680487200, -1664758800, -1648951200, -1635123600, -1616896800, -1604278800, -1585533600, -1571014800, -1555293600, -932432400, -857257200, -844556400, -828226800, -812588400, -798073200, -781052400, -766717200, -750898800, -733359600, -719456400, -701917200, -689209200, -670460400, -114051600, -103168800, -81997200, -71715600, -50547600, -40266000, -18493200, -8211600, 12956400, 23238000, 43801200, 54687600, 75855600, 86742000, 102380400, 118105200, 135730800, 148518000, 167187600, 180489600, 198637200, 211939200, 230086800, 243388800, 261536400, 274838400, 292986000, 306288000, 323312400, 338342400, 354675600, 370400400, 386125200, 401850000, 417574800, 433299600, 449024400, 465354000, 481078800, 496803600, 512528400, 528253200, 543978000, 559702800, 575427600, 591152400, 606877200, 622602000, 638326800, 654656400, 670381200, 686106000, 701830800, 717555600, 733280400, 749005200, 764730000, 780454800, 796179600, 811904400, 828234000, 846378000 } - typeOffsets:intvector { 3484, 0, 3600, 0, 3600, 3600 } - typeMap:bin { "010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201" } - finalRule { "EU" } - finalRaw:int { 3600 } - finalYear:int { 1997 } - } //Z#466 - /* Europe/Mariehamn */ :int { 454 } //Z#467 - /* Europe/Minsk */ :table { - transPre32:intvector { -1, 1454819880 } - trans:intvector { -1441158600, -1247536800, -899780400, -857257200, -844556400, -828226800, -812502000, -804650400, 354920400, 370728000, 386456400, 402264000, 417992400, 433800000, 449614800, 465346800, 481071600, 496796400, 512521200, 528246000, 543970800, 559695600, 575420400, 591145200, 606870000, 622594800, 670374000, 686102400, 701827200, 717552000, 733276800, 749001600, 764726400, 780451200, 796176000, 811900800, 828230400, 846374400, 859680000, 877824000, 891129600, 909273600, 922579200, 941328000, 954028800, 972777600, 985478400, 1004227200, 1017532800, 1035676800, 1048982400, 1067126400, 1080432000, 1099180800, 1111881600, 1130630400, 1143331200, 1162080000, 1174780800, 1193529600, 1206835200, 1224979200, 1238284800, 1256428800, 1269734400, 1288483200, 1301184000 } - typeOffsets:intvector { 6616, 0, 3600, 0, 3600, 3600, 6600, 0, 7200, 0, 7200, 3600, 10800, 0, 10800, 3600 } - typeMap:bin { "0304060201020102060706070607060706070607060706070607060504050405040504050405040504050405040504050405040504050405040504050405040504050406" } - } //Z#468 - /* Europe/Monaco */ :table { - transPre32:intvector { -1, 1808287124 } - trans:intvector { -1855958961, -1689814800, -1680397200, -1665363600, -1648342800, -1635123600, -1616893200, -1604278800, -1585443600, -1574038800, -1552266000, -1539997200, -1520557200, -1507510800, -1490576400, -1470618000, -1459126800, -1444006800, -1427677200, -1411952400, -1396227600, -1379293200, -1364778000, -1348448400, -1333328400, -1316394000, -1301274000, -1284339600, -1269824400, -1253494800, -1238374800, -1221440400, -1206925200, -1191200400, -1175475600, -1160355600, -1143421200, -1127696400, -1111971600, -1096851600, -1080522000, -1063587600, -1049072400, -1033347600, -1017622800, -1002502800, -986173200, -969238800, -950490000, -942012000, -904438800, -891136800, -877827600, -857257200, -844556400, -828226800, -812502000, -796266000, -781052400, -766623600, 196819200, 212540400, 228877200, 243997200, 260326800, 276051600, 291776400, 307501200, 323830800, 338950800, 354675600, 370400400, 386125200, 401850000, 417574800, 433299600, 449024400, 465354000, 481078800, 496803600, 512528400, 528253200, 543978000, 559702800, 575427600, 591152400, 606877200, 622602000, 638326800, 654656400, 670381200, 686106000, 701830800, 717555600, 733280400, 749005200, 764730000, 780454800, 796179600, 811904400, 828234000, 846378000 } - typeOffsets:intvector { 1772, 0, 0, 0, 0, 3600, 0, 7200, 561, 0, 3600, 0, 3600, 3600 } - typeMap:bin { "04010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010203020302030203020305060506050605060506050605060506050605060506050605060506050605060506050605060506050605" } - finalRule { "EU" } - finalRaw:int { 3600 } - finalYear:int { 1997 } - } //Z#469 - /* Europe/Moscow */ :table { - trans:intvector { -1688265017, -1656819079, -1641353479, -1627965079, -1618716679, -1596429079, -1593820800, -1589860800, -1542427200, -1539493200, -1525323600, -1522728000, -1491188400, -1247536800, 354920400, 370728000, 386456400, 402264000, 417992400, 433800000, 449614800, 465346800, 481071600, 496796400, 512521200, 528246000, 543970800, 559695600, 575420400, 591145200, 606870000, 622594800, 638319600, 654649200, 670374000, 686102400, 695779200, 701823600, 717548400, 733273200, 748998000, 764722800, 780447600, 796172400, 811897200, 828226800, 846370800, 859676400, 877820400, 891126000, 909270000, 922575600, 941324400, 954025200, 972774000, 985474800, 1004223600, 1017529200, 1035673200, 1048978800, 1067122800, 1080428400, 1099177200, 1111878000, 1130626800, 1143327600, 1162076400, 1174777200, 1193526000, 1206831600, 1224975600, 1238281200, 1256425200, 1269730800, 1288479600, 1301180400, 1414274400 } - typeOffsets:intvector { 9017, 0, 7200, 0, 7200, 3600, 9079, 0, 9079, 3600, 9079, 7200, 10800, 0, 10800, 3600, 10800, 7200, 14400, 0 } - typeMap:bin { "0304030504050706070807060106070607060706070607060706070607060706070602010607060706070607060706070607060706070607060706070607060706070607060706070607060906" } - links:intvector { 470, 629 } - } //Z#470 - /* Europe/Nicosia */ :int { 296 } //Z#471 - /* Europe/Oslo */ :table { - transPre32:intvector { -1, 1928209516 } - trans:intvector { -1691884800, -1680573600, -927511200, -857257200, -844556400, -828226800, -812502000, -796777200, -781052400, -765327600, -340844400, -324514800, -308790000, -293065200, -277340400, -261615600, -245890800, -230166000, -214441200, -198716400, -182991600, -166662000, -147913200, -135212400, 323830800, 338950800, 354675600, 370400400, 386125200, 401850000, 417574800, 433299600, 449024400, 465354000, 481078800, 496803600, 512528400, 528253200, 543978000, 559702800, 575427600, 591152400, 606877200, 622602000, 638326800, 654656400, 670381200, 686106000, 701830800, 717555600, 733280400, 749005200, 764730000, 780454800, 796179600, 811904400, 828234000, 846378000 } - typeOffsets:intvector { 2580, 0, 3600, 0, 3600, 3600 } - typeMap:bin { "0102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201" } - finalRule { "EU" } - finalRaw:int { 3600 } - finalYear:int { 1997 } - links:intvector { 236, 341, 472 } - } //Z#472 - /* Europe/Paris */ :table { - trans:intvector { -1855958901, -1689814800, -1680397200, -1665363600, -1648342800, -1635123600, -1616893200, -1604278800, -1585443600, -1574038800, -1552266000, -1539997200, -1520557200, -1507510800, -1490576400, -1470618000, -1459126800, -1444006800, -1427677200, -1411952400, -1396227600, -1379293200, -1364778000, -1348448400, -1333328400, -1316394000, -1301274000, -1284339600, -1269824400, -1253494800, -1238374800, -1221440400, -1206925200, -1191200400, -1175475600, -1160355600, -1143421200, -1127696400, -1111971600, -1096851600, -1080522000, -1063587600, -1049072400, -1033347600, -1017622800, -1002502800, -986173200, -969238800, -950490000, -942012000, -932436000, -857257200, -844556400, -828226800, -812502000, -800071200, -796266000, -781052400, -766623600, 196819200, 212540400, 228877200, 243997200, 260326800, 276051600, 291776400, 307501200, 323830800, 338950800, 354675600, 370400400, 386125200, 401850000, 417574800, 433299600, 449024400, 465354000, 481078800, 496803600, 512528400, 528253200, 543978000, 559702800, 575427600, 591152400, 606877200, 622602000, 638326800, 654656400, 670381200, 686106000, 701830800, 717555600, 733280400, 749005200, 764730000, 780454800, 796179600, 811904400, 828234000, 846378000 } - typeOffsets:intvector { 561, 0, 0, 0, 0, 3600, 0, 7200, 3600, 0, 3600, 3600 } - typeMap:bin { "0102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102050405040503020304050405040504050405040504050405040504050405040504050405040504050405040504050405040504" } - finalRule { "EU" } - finalRaw:int { 3600 } - finalYear:int { 1997 } - links:intvector { 395, 473 } - } //Z#473 - /* Europe/Podgorica */ :int { 442 } //Z#474 - /* Europe/Prague */ :table { - transPre32:intvector { -1, 1825565432 } - trans:intvector { -1693706400, -1680483600, -1663455600, -1650150000, -1632006000, -1618700400, -938905200, -857257200, -844556400, -828226800, -812502000, -798073200, -780534000, -761180400, -746578800, -733359600, -716425200, -701910000, -684975600, -670460400, -654217200, -639010800, 291776400, 307501200, 323830800, 338950800, 354675600, 370400400, 386125200, 401850000, 417574800, 433299600, 449024400, 465354000, 481078800, 496803600, 512528400, 528253200, 543978000, 559702800, 575427600, 591152400, 606877200, 622602000, 638326800, 654656400, 670381200, 686106000, 701830800, 717555600, 733280400, 749005200, 764730000, 780454800, 796179600, 811904400, 828234000, 846378000 } - typeOffsets:intvector { 3464, 0, 3600, 0, 3600, 3600 } - typeMap:bin { "0102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201" } - finalRule { "EU" } - finalRaw:int { 3600 } - finalYear:int { 1997 } - links:intvector { 444, 475 } - } //Z#475 - /* Europe/Riga */ :table { - trans:intvector { -1632008194, -1618702594, -1601681794, -1597275394, -1377308194, -928029600, -899521200, -857257200, -844556400, -828226800, -812502000, -796777200, -795834000, 354920400, 370728000, 386456400, 402264000, 417992400, 433800000, 449614800, 465346800, 481071600, 496796400, 512521200, 528246000, 543970800, 559695600, 575420400, 591145200, 606870000, 622598400, 638323200, 654652800, 670377600, 686102400, 701827200, 717552000, 733276800, 749001600, 764726400, 780451200, 796176000, 811900800, 828230400, 843955200, 859683600, 877827600, 891133200, 909277200, 922582800, 941331600, 985482000, 1004230800 } - typeOffsets:intvector { 5794, 0, 3600, 0, 3600, 3600, 5794, 3600, 7200, 0, 7200, 3600, 10800, 0, 10800, 3600 } - typeMap:bin { "0300030004060201020102010607060706070607060706070607060706050405040504050405040504050405040504050405040504" } - finalRule { "EU" } - finalRaw:int { 7200 } - finalYear:int { 2002 } - } //Z#476 - /* Europe/Rome */ :table { - transPre32:intvector { -1, 1891402096 } - trans:intvector { -1690765200, -1680487200, -1664758800, -1648951200, -1635123600, -1616896800, -1604278800, -1585533600, -1571014800, -1555293600, -932432400, -857257200, -844556400, -828226800, -812502000, -798073200, -781052400, -766717200, -750898800, -733359600, -719456400, -701917200, -689209200, -670460400, -114051600, -103168800, -81997200, -71715600, -50547600, -40266000, -18493200, -8211600, 12956400, 23238000, 43801200, 54687600, 75855600, 86742000, 107910000, 118191600, 138754800, 149641200, 170809200, 181090800, 202258800, 212540400, 233103600, 243990000, 265158000, 276044400, 296607600, 307494000, 323830800, 338950800, 354675600, 370400400, 386125200, 401850000, 417574800, 433299600, 449024400, 465354000, 481078800, 496803600, 512528400, 528253200, 543978000, 559702800, 575427600, 591152400, 606877200, 622602000, 638326800, 654656400, 670381200, 686106000, 701830800, 717555600, 733280400, 749005200, 764730000, 780454800, 796179600, 811904400, 828234000, 846378000 } - typeOffsets:intvector { 2996, 0, 3600, 0, 3600, 3600 } - typeMap:bin { "010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201" } - finalRule { "EU" } - finalRaw:int { 3600 } - finalYear:int { 1997 } - links:intvector { 477, 479, 492 } - } //Z#477 - /* Europe/Samara */ :table { - trans:intvector { -1593820800, -1247540400, 354916800, 370724400, 386452800, 402260400, 417988800, 433796400, 449611200, 465343200, 481068000, 496792800, 512517600, 528242400, 543967200, 559692000, 575416800, 591141600, 606866400, 622594800, 638319600, 654649200, 670374000, 686102400, 687916800, 701820000, 717544800, 733269600, 748994400, 764719200, 780444000, 796168800, 811893600, 828223200, 846367200, 859672800, 877816800, 891122400, 909266400, 922572000, 941320800, 954021600, 972770400, 985471200, 1004220000, 1017525600, 1035669600, 1048975200, 1067119200, 1080424800, 1099173600, 1111874400, 1130623200, 1143324000, 1162072800, 1174773600, 1193522400, 1206828000, 1224972000, 1238277600, 1256421600, 1269727200, 1288479600, 1301180400 } - typeOffsets:intvector { 12020, 0, 7200, 3600, 10800, 0, 10800, 3600, 14400, 0, 14400, 3600 } - typeMap:bin { "02040504050405040504050405040504050403020302010204050405040504050405040504050405040504050405040504050405040504050405040504030204" } - } //Z#478 - /* Europe/San_Marino */ :int { 477 } //Z#479 - /* Europe/Sarajevo */ :int { 442 } //Z#480 - /* Europe/Saratov */ :table { - trans:intvector { -1593820800, -1247540400, 354916800, 370724400, 386452800, 402260400, 417988800, 433796400, 449611200, 465343200, 481068000, 496792800, 512517600, 528242400, 543967200, 559692000, 575416800, 591145200, 606870000, 622594800, 638319600, 654649200, 670374000, 701820000, 717548400, 733273200, 748998000, 764722800, 780447600, 796172400, 811897200, 828226800, 846370800, 859676400, 877820400, 891126000, 909270000, 922575600, 941324400, 954025200, 972774000, 985474800, 1004223600, 1017529200, 1035673200, 1048978800, 1067122800, 1080428400, 1099177200, 1111878000, 1130626800, 1143327600, 1162076400, 1174777200, 1193526000, 1206831600, 1224975600, 1238281200, 1256425200, 1269730800, 1288479600, 1301180400, 1414274400, 1480806000 } - typeOffsets:intvector { 11058, 0, 10800, 0, 10800, 3600, 14400, 0, 14400, 3600 } - typeMap:bin { "01030403040304030403040304030403020102010201030201020102010201020102010201020102010201020102010201020102010201020102010201030103" } - } //Z#481 - /* Europe/Simferopol */ :table { - transPre32:intvector { -1, 1454818312 } - trans:intvector { -1441160160, -1247536800, -888894000, -857257200, -844556400, -828226800, -812502000, -811648800, 354920400, 370728000, 386456400, 402264000, 417992400, 433800000, 449614800, 465346800, 481071600, 496796400, 512521200, 528246000, 543970800, 559695600, 575420400, 591145200, 606870000, 622594800, 646786800, 701820000, 717541200, 733269600, 748990800, 764719200, 767739600, 780436800, 796165200, 811886400, 828219600, 846374400, 859683600, 877827600, 891133200, 909277200, 922582800, 941331600, 954032400, 972781200, 985482000, 1004230800, 1017536400, 1035680400, 1048986000, 1067130000, 1080435600, 1099184400, 1111885200, 1130634000, 1143334800, 1162083600, 1174784400, 1193533200, 1206838800, 1224982800, 1238288400, 1256432400, 1269738000, 1288486800, 1301187600, 1319936400, 1332637200, 1351386000, 1364691600, 1382835600, 1396137600, 1414274400 } - typeOffsets:intvector { 8184, 0, 3600, 0, 3600, 3600, 7200, 0, 7200, 3600, 8160, 0, 10800, 0, 10800, 3600, 14400, 0 } - typeMap:bin { "050306020102010206070607060706070607060706070607060706030403040304070607060706040304030403040304030403040304030403040304030403040304030403040304030806" } - } //Z#482 - /* Europe/Skopje */ :int { 442 } //Z#483 - /* Europe/Sofia */ :table { - transPre32:intvector { -1, 1454820900, -1, 1925440280 } - trans:intvector { -857257200, -844556400, -828226800, -812502000, -796777200, -781048800, 291762000, 307576800, 323816400, 339026400, 355266000, 370393200, 386715600, 401846400, 417571200, 433296000, 449020800, 465350400, 481075200, 496800000, 512524800, 528249600, 543974400, 559699200, 575424000, 591148800, 606873600, 622598400, 638323200, 654652800, 670370400, 686091600, 701820000, 717541200, 733269600, 748990800, 764719200, 780440400, 796168800, 811890000, 828223200, 846363600, 859683600, 877827600 } - typeOffsets:intvector { 5596, 0, 3600, 0, 3600, 3600, 7016, 0, 7200, 0, 7200, 3600 } - typeMap:bin { "03040102010201040504050405040504050405040504050405040504050405040504050405040504050405040504" } - finalRule { "EU" } - finalRaw:int { 7200 } - finalYear:int { 1998 } - } //Z#484 - /* Europe/Stockholm */ :table { - transPre32:intvector { -1, 1423286164, -1, 2085974882 } - trans:intvector { -1692496800, -1680483600, 323830800, 338950800, 354675600, 370400400, 386125200, 401850000, 417574800, 433299600, 449024400, 465354000, 481078800, 496803600, 512528400, 528253200, 543978000, 559702800, 575427600, 591152400, 606877200, 622602000, 638326800, 654656400, 670381200, 686106000, 701830800, 717555600, 733280400, 749005200, 764730000, 780454800, 796179600, 811904400, 828234000, 846378000 } - typeOffsets:intvector { 4332, 0, 3600, 0, 3600, 3600, 3614, 0 } - typeMap:bin { "0301020102010201020102010201020102010201020102010201020102010201020102010201" } - finalRule { "EU" } - finalRaw:int { 3600 } - finalYear:int { 1997 } - } //Z#485 - /* Europe/Tallinn */ :table { - trans:intvector { -1638322740, -1632006000, -1618700400, -1593824400, -1535938740, -927943200, -892954800, -857257200, -844556400, -828226800, -812502000, -797652000, 354920400, 370728000, 386456400, 402264000, 417992400, 433800000, 449614800, 465346800, 481071600, 496796400, 512521200, 528246000, 543970800, 559695600, 575420400, 591145200, 606870000, 622598400, 638323200, 654652800, 670377600, 686102400, 701827200, 717552000, 733276800, 749001600, 764726400, 780451200, 796176000, 811900800, 828230400, 846374400, 859680000, 877824000, 891129600, 909277200, 922582800, 941331600, 1017536400, 1035680400 } - typeOffsets:intvector { 5940, 0, 3600, 0, 3600, 3600, 7200, 0, 7200, 3600, 10800, 0, 10800, 3600 } - typeMap:bin { "01020100030502010201020506050605060506050605060506050605040304030403040304030403040304030403040304030403" } - finalRule { "EU" } - finalRaw:int { 7200 } - finalYear:int { 2003 } - } //Z#486 - /* Europe/Tirane */ :table { - trans:intvector { -1767230360, -932346000, -857257200, -844556400, -843519600, 136854000, 149896800, 168130800, 181432800, 199839600, 213141600, 231894000, 244591200, 263257200, 276040800, 294706800, 307490400, 326156400, 339458400, 357087600, 370389600, 389142000, 402444000, 419468400, 433807200, 449622000, 465354000, 481078800, 496803600, 512528400, 528253200, 543978000, 559702800, 575427600, 591152400, 606877200, 622602000, 638326800, 654656400, 670381200, 686106000, 701830800, 717555600, 733280400, 749005200, 764730000, 780454800, 796179600, 811904400, 828234000, 846378000 } - typeOffsets:intvector { 4760, 0, 3600, 0, 3600, 3600 } - typeMap:bin { "010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201" } - finalRule { "EU" } - finalRaw:int { 3600 } - finalYear:int { 1997 } - } //Z#487 - /* Europe/Tiraspol */ :int { 449 } //Z#488 - /* Europe/Ulyanovsk */ :table { - trans:intvector { -1593820800, -1247540400, 354916800, 370724400, 386452800, 402260400, 417988800, 433796400, 449611200, 465343200, 481068000, 496792800, 512517600, 528242400, 543967200, 559692000, 575416800, 591141600, 606866400, 622594800, 638319600, 654649200, 670374000, 686102400, 695779200, 701823600, 717548400, 733273200, 748998000, 764722800, 780447600, 796172400, 811897200, 828226800, 846370800, 859676400, 877820400, 891126000, 909270000, 922575600, 941324400, 954025200, 972774000, 985474800, 1004223600, 1017529200, 1035673200, 1048978800, 1067122800, 1080428400, 1099177200, 1111878000, 1130626800, 1143327600, 1162076400, 1174777200, 1193526000, 1206831600, 1224975600, 1238281200, 1256425200, 1269730800, 1288479600, 1301180400, 1414274400, 1459033200 } - typeOffsets:intvector { 11616, 0, 7200, 0, 7200, 3600, 10800, 0, 10800, 3600, 14400, 0, 14400, 3600 } - typeMap:bin { "030506050605060506050605060506050605040304030201030403040304030403040304030403040304030403040304030403040304030403040304030403050305" } - } //Z#489 - /* Europe/Uzhgorod */ :table { - transPre32:intvector { -1, 1794027544 } - trans:intvector { -938905200, -857257200, -844556400, -828226800, -812502000, -794714400, -773456400, 354920400, 370728000, 386456400, 402264000, 417992400, 433800000, 449614800, 465346800, 481071600, 496796400, 512521200, 528246000, 543970800, 559695600, 575420400, 591145200, 606870000, 622594800, 646786800, 670384800, 701820000, 717541200, 733269600, 748990800, 764719200, 780440400, 796179600, 811904400, 828234000, 846378000 } - typeOffsets:intvector { 5352, 0, 3600, 0, 3600, 3600, 7200, 0, 7200, 3600, 10800, 0, 10800, 3600 } - typeMap:bin { "0102010201020105060506050605060506050605060506050605010304030403040304030403" } - finalRule { "EU" } - finalRaw:int { 7200 } - finalYear:int { 1997 } - } //Z#490 - /* Europe/Vaduz */ :int { 499 } //Z#491 - /* Europe/Vatican */ :int { 477 } //Z#492 - /* Europe/Vienna */ :table { - transPre32:intvector { -1, 1872912175 } - trans:intvector { -1693706400, -1680483600, -1663455600, -1650150000, -1632006000, -1618700400, -1569711600, -1555801200, -938905200, -857257200, -844556400, -828226800, -812502000, -796777200, -781052400, -780188400, -748479600, -733359600, -717634800, -701910000, -684975600, -670460400, 323823600, 338940000, 354675600, 370400400, 386125200, 401850000, 417574800, 433299600, 449024400, 465354000, 481078800, 496803600, 512528400, 528253200, 543978000, 559702800, 575427600, 591152400, 606877200, 622602000, 638326800, 654656400, 670381200, 686106000, 701830800, 717555600, 733280400, 749005200, 764730000, 780454800, 796179600, 811904400, 828234000, 846378000 } - typeOffsets:intvector { 3921, 0, 3600, 0, 3600, 3600 } - typeMap:bin { "010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201" } - finalRule { "EU" } - finalRaw:int { 3600 } - finalYear:int { 1997 } - } //Z#493 - /* Europe/Vilnius */ :table { - transPre32:intvector { -1, 1454820420 } - trans:intvector { -1672536240, -1585100136, -1561251600, -1553565600, -928198800, -900126000, -857257200, -844556400, -828226800, -812502000, -802144800, 354920400, 370728000, 386456400, 402264000, 417992400, 433800000, 449614800, 465346800, 481071600, 496796400, 512521200, 528246000, 543970800, 559695600, 575420400, 591145200, 606870000, 622598400, 638323200, 654652800, 670377600, 686102400, 701827200, 717552000, 733276800, 749001600, 764726400, 780451200, 796176000, 811900800, 828230400, 846374400, 859680000, 877824000, 891133200, 909277200, 922582800, 941331600, 1048986000, 1067130000 } - typeOffsets:intvector { 6076, 0, 3600, 0, 3600, 3600, 5040, 0, 5736, 0, 7200, 0, 7200, 3600, 10800, 0, 10800, 3600 } - typeMap:bin { "03040105010702010201020708070807080708070807080708070807060506050605060506050605060506050605020102050605" } - finalRule { "EU" } - finalRaw:int { 7200 } - finalYear:int { 2004 } - } //Z#494 - /* Europe/Volgograd */ :table { - trans:intvector { -1577761060, -1247540400, 354916800, 370724400, 386452800, 402260400, 417988800, 433796400, 449611200, 465343200, 481068000, 496792800, 512517600, 528242400, 543967200, 559692000, 575416800, 591145200, 606870000, 622594800, 638319600, 654649200, 670374000, 701820000, 717548400, 733273200, 748998000, 764722800, 780447600, 796172400, 811897200, 828226800, 846370800, 859676400, 877820400, 891126000, 909270000, 922575600, 941324400, 954025200, 972774000, 985474800, 1004223600, 1017529200, 1035673200, 1048978800, 1067122800, 1080428400, 1099177200, 1111878000, 1130626800, 1143327600, 1162076400, 1174777200, 1193526000, 1206831600, 1224975600, 1238281200, 1256425200, 1269730800, 1288479600, 1301180400, 1414274400 } - typeOffsets:intvector { 10660, 0, 10800, 0, 10800, 3600, 14400, 0, 14400, 3600 } - typeMap:bin { "010304030403040304030403040304030201020102010302010201020102010201020102010201020102010201020102010201020102010201020102010301" } - } //Z#495 - /* Europe/Warsaw */ :table { - trans:intvector { -1717032240, -1693706400, -1680483600, -1663455600, -1650150000, -1632006000, -1618700400, -1600473600, -1587168000, -1501725600, -931734000, -857257200, -844556400, -828226800, -812502000, -796608000, -778726800, -762660000, -748486800, -733273200, -715215600, -701910000, -684975600, -670460400, -654130800, -639010800, -397094400, -386812800, -371088000, -355363200, -334195200, -323308800, -307584000, -291859200, -271296000, -260409600, -239846400, -228960000, -208396800, -197510400, -176342400, -166060800, 228873600, 243993600, 260323200, 276048000, 291772800, 307497600, 323827200, 338947200, 354672000, 370396800, 386121600, 401846400, 417571200, 433296000, 449020800, 465350400, 481075200, 496800000, 512524800, 528249600, 543974400, 559699200, 575427600, 591152400, 606877200, 622602000, 638326800, 654656400, 670381200, 686106000, 701830800, 717555600, 733280400, 749005200, 764730000, 780454800, 796179600, 811904400, 828234000, 846378000 } - typeOffsets:intvector { 5040, 0, 3600, 0, 3600, 3600, 7200, 0, 7200, 3600 } - typeMap:bin { "01020102010203040301020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201" } - finalRule { "EU" } - finalRaw:int { 3600 } - finalYear:int { 1997 } - links:intvector { 496, 592 } - } //Z#496 - /* Europe/Zagreb */ :int { 442 } //Z#497 - /* Europe/Zaporozhye */ :table { - transPre32:intvector { -1, 1454818056 } - trans:intvector { -1441160400, -1247536800, -894769200, -857257200, -844556400, -828226800, -826419600, 354920400, 370728000, 386456400, 402264000, 417992400, 433800000, 449614800, 465346800, 481071600, 496796400, 512521200, 528246000, 543970800, 559695600, 575420400, 591145200, 606870000, 622594800, 638319600, 654649200, 670374000, 686091600, 701820000, 717541200, 733269600, 748990800, 764719200, 780440400, 796179600, 811904400, 828234000, 846378000 } - typeOffsets:intvector { 8440, 0, 3600, 0, 3600, 3600, 7200, 0, 7200, 3600, 8400, 0, 10800, 0, 10800, 3600 } - typeMap:bin { "05030602010201060706070607060706070607060706070607060706040304030403040304030403" } - finalRule { "EU" } - finalRaw:int { 7200 } - finalYear:int { 1997 } - } //Z#498 - /* Europe/Zurich */ :table { - transPre32:intvector { -1, 619768448, -1, 1909720710 } - trans:intvector { -904435200, -891129600, -872985600, -859680000, 354675600, 370400400, 386125200, 401850000, 417574800, 433299600, 449024400, 465354000, 481078800, 496803600, 512528400, 528253200, 543978000, 559702800, 575427600, 591152400, 606877200, 622602000, 638326800, 654656400, 670381200, 686106000, 701830800, 717555600, 733280400, 749005200, 764730000, 780454800, 796179600, 811904400, 828234000, 846378000 } - typeOffsets:intvector { 2048, 0, 1786, 0, 3600, 0, 3600, 3600 } - typeMap:bin { "0102030203020302030203020302030203020302030203020302030203020302030203020302" } - finalRule { "EU" } - finalRaw:int { 3600 } - finalYear:int { 1997 } - links:intvector { 448, 491, 499 } - } //Z#499 - /* Factory */ :table { - typeOffsets:intvector { 0, 0 } - } //Z#500 - /* GB */ :int { 463 } //Z#501 - /* GB-Eire */ :int { 463 } //Z#502 - /* GMT */ :int { 401 } //Z#503 - /* GMT+0 */ :int { 401 } //Z#504 - /* GMT-0 */ :int { 401 } //Z#505 - /* GMT0 */ :int { 401 } //Z#506 - /* Greenwich */ :int { 401 } //Z#507 - /* HST */ :table { - typeOffsets:intvector { -36000, 0 } - } //Z#508 - /* Hongkong */ :int { 271 } //Z#509 - /* IET */ :int { 131 } //Z#510 - /* IST */ :int { 285 } //Z#511 - /* Iceland */ :int { 343 } //Z#512 - /* Indian/Antananarivo */ :int { 48 } //Z#513 - /* Indian/Chagos */ :table { - trans:intvector { -1988167780, 820436400 } - typeOffsets:intvector { 17380, 0, 18000, 0, 21600, 0 } - typeMap:bin { "0102" } - } //Z#514 - /* Indian/Christmas */ :table { - transPre32:intvector { -1, 1930865124 } - typeOffsets:intvector { 25372, 0, 25200, 0 } - typeMap:bin { "01" } - } //Z#515 - /* Indian/Cocos */ :table { - transPre32:intvector { -1, 2085955236 } - typeOffsets:intvector { 23260, 0, 23400, 0 } - typeMap:bin { "01" } - } //Z#516 - /* Indian/Comoro */ :int { 48 } //Z#517 - /* Indian/Kerguelen */ :table { - trans:intvector { -631152000 } - typeOffsets:intvector { 0, 0, 18000, 0 } - typeMap:bin { "01" } - } //Z#518 - /* Indian/Mahe */ :table { - trans:intvector { -2006653308 } - typeOffsets:intvector { 13308, 0, 14400, 0 } - typeMap:bin { "01" } - } //Z#519 - /* Indian/Maldives */ :table { - trans:intvector { -315636840 } - typeOffsets:intvector { 17640, 0, 18000, 0 } - typeMap:bin { "01" } - } //Z#520 - /* Indian/Mauritius */ :table { - trans:intvector { -1988164200, 403041600, 417034800, 1224972000, 1238274000 } - typeOffsets:intvector { 13800, 0, 14400, 0, 14400, 3600 } - typeMap:bin { "0102010201" } - } //Z#521 - /* Indian/Mayotte */ :int { 48 } //Z#522 - /* Indian/Reunion */ :table { - trans:intvector { -1848886912 } - typeOffsets:intvector { 13312, 0, 14400, 0 } - typeMap:bin { "01" } - } //Z#523 - /* Iran */ :int { 318 } //Z#524 - /* Israel */ :int { 277 } //Z#525 - /* JST */ :int { 322 } //Z#526 - /* Jamaica */ :int { 142 } //Z#527 - /* Japan */ :int { 322 } //Z#528 - /* Kwajalein */ :int { 568 } //Z#529 - /* Libya */ :int { 56 } //Z#530 - /* MET */ :table { - trans:intvector { -1693706400, -1680483600, -1663455600, -1650150000, -1632006000, -1618700400, -938905200, -857257200, -844556400, -828226800, -812502000, -796777200, -781052400, -766623600, 228877200, 243997200, 260326800, 276051600, 291776400, 307501200, 323830800, 338950800, 354675600, 370400400, 386125200, 401850000, 417574800, 433299600, 449024400, 465354000, 481078800, 496803600, 512528400, 528253200, 543978000, 559702800, 575427600, 591152400, 606877200, 622602000, 638326800, 654656400, 670381200, 686106000, 701830800, 717555600, 733280400, 749005200, 764730000, 780454800, 796179600, 811904400, 828234000, 846378000 } - typeOffsets:intvector { 3600, 0, 3600, 3600 } - typeMap:bin { "010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100" } - finalRule { "C-Eur" } - finalRaw:int { 3600 } - finalYear:int { 1997 } - } //Z#531 - /* MIT */ :int { 549 } //Z#532 - /* MST */ :table { - typeOffsets:intvector { -25200, 0 } - } //Z#533 - /* MST7MDT */ :table { - trans:intvector { -1633273200, -1615132800, -1601823600, -1583683200, -880210800, -765388800, -84380400, -68659200, -52930800, -37209600, -21481200, -5760000, 9968400, 25689600, 41418000, 57744000, 73472400, 89193600, 104922000, 120643200, 126694800, 152092800, 162378000, 183542400, 199270800, 215596800, 230720400, 247046400, 262774800, 278496000, 294224400, 309945600, 325674000, 341395200, 357123600, 372844800, 388573200, 404899200, 420022800, 436348800, 452077200, 467798400, 483526800, 499248000, 514976400, 530697600, 544611600, 562147200, 576061200, 594201600, 607510800, 625651200, 638960400, 657100800, 671014800, 688550400, 702464400, 720000000, 733914000, 752054400, 765363600, 783504000, 796813200, 814953600, 828867600, 846403200, 860317200, 877852800, 891766800, 909302400, 923216400, 941356800, 954666000, 972806400, 986115600, 1004256000, 1018170000, 1035705600, 1049619600, 1067155200, 1081069200, 1099209600, 1112518800, 1130659200, 1143968400, 1162108800, 1173603600, 1194163200 } - typeOffsets:intvector { -25200, 0, -25200, 3600 } - typeMap:bin { "01000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100" } - finalRule { "US" } - finalRaw:int { -25200 } - finalYear:int { 2008 } - } //Z#534 - /* Mexico/BajaNorte */ :int { 215 } //Z#535 - /* Mexico/BajaSur */ :int { 160 } //Z#536 - /* Mexico/General */ :int { 165 } //Z#537 - /* NET */ :int { 334 } //Z#538 - /* NST */ :int { 550 } //Z#539 - /* NZ */ :int { 550 } //Z#540 - /* NZ-CHAT */ :int { 552 } //Z#541 - /* Navajo */ :int { 109 } //Z#542 - /* PLT */ :int { 280 } //Z#543 - /* PNT */ :int { 184 } //Z#544 - /* PRC */ :int { 312 } //Z#545 - /* PRT */ :int { 189 } //Z#546 - /* PST */ :int { 151 } //Z#547 - /* PST8PDT */ :table { - trans:intvector { -1633269600, -1615129200, -1601820000, -1583679600, -880207200, -765385200, -84376800, -68655600, -52927200, -37206000, -21477600, -5756400, 9972000, 25693200, 41421600, 57747600, 73476000, 89197200, 104925600, 120646800, 126698400, 152096400, 162381600, 183546000, 199274400, 215600400, 230724000, 247050000, 262778400, 278499600, 294228000, 309949200, 325677600, 341398800, 357127200, 372848400, 388576800, 404902800, 420026400, 436352400, 452080800, 467802000, 483530400, 499251600, 514980000, 530701200, 544615200, 562150800, 576064800, 594205200, 607514400, 625654800, 638964000, 657104400, 671018400, 688554000, 702468000, 720003600, 733917600, 752058000, 765367200, 783507600, 796816800, 814957200, 828871200, 846406800, 860320800, 877856400, 891770400, 909306000, 923220000, 941360400, 954669600, 972810000, 986119200, 1004259600, 1018173600, 1035709200, 1049623200, 1067158800, 1081072800, 1099213200, 1112522400, 1130662800, 1143972000, 1162112400, 1173607200, 1194166800 } - typeOffsets:intvector { -28800, 0, -28800, 3600 } - typeMap:bin { "01000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100" } - finalRule { "US" } - finalRaw:int { -28800 } - finalYear:int { 2008 } - } //Z#548 - /* Pacific/Apia */ :table { - transPre32:intvector { -1, 1439229312 } - trans:intvector { -1861878784, -631110600, 1285498800, 1301752800, 1316872800, 1325239200, 1333202400, 1348927200 } - typeOffsets:intvector { 45184, 0, -41400, 0, -41216, 0, -39600, 0, -39600, 3600, 46800, 0, 46800, 3600 } - typeMap:bin { "020103040304060506" } - finalRule { "WS" } - finalRaw:int { 46800 } - finalYear:int { 2013 } - links:intvector { 532, 549 } - } //Z#549 - /* Pacific/Auckland */ :table { - transPre32:intvector { -1, 1102531752 } - trans:intvector { -1330335000, -1320057000, -1300699800, -1287396000, -1269250200, -1255946400, -1237800600, -1224496800, -1206351000, -1192442400, -1174901400, -1160992800, -1143451800, -1125914400, -1112607000, -1094464800, -1081157400, -1063015200, -1049707800, -1031565600, -1018258200, -1000116000, -986808600, -968061600, -955359000, -936612000, -923304600, -757425600, 152632800, 162309600, 183477600, 194968800, 215532000, 226418400, 246981600, 257868000, 278431200, 289317600, 309880800, 320767200, 341330400, 352216800, 372780000, 384271200, 404834400, 415720800, 436284000, 447170400, 467733600, 478620000, 499183200, 510069600, 530632800, 541519200, 562082400, 573573600, 594136800, 605023200, 623772000, 637682400, 655221600, 669132000, 686671200, 700581600, 718120800, 732636000, 749570400, 764085600, 781020000, 795535200, 812469600, 826984800, 844524000, 858434400, 875973600, 889884000, 907423200, 921938400, 938872800, 953388000, 970322400, 984837600, 1002376800, 1016287200, 1033826400, 1047736800, 1065276000, 1079791200, 1096725600, 1111240800, 1128175200, 1142690400, 1159624800, 1174140000, 1191074400, 1207404000, 1222524000 } - typeOffsets:intvector { 41944, 0, 41400, 0, 41400, 1800, 41400, 3600, 43200, 0, 43200, 3600 } - typeMap:bin { "0103010201020102010201020102010201020102010201020102010204050405040504050405040504050405040504050405040504050405040504050405040504050405040504050405040504050405040504050405040504050405040504050405" } - finalRule { "NZ" } - finalRaw:int { 43200 } - finalYear:int { 2009 } - links:intvector { 229, 232, 539, 540, 550 } - } //Z#550 - /* Pacific/Bougainville */ :table { - transPre32:intvector { -1, 1454789160, -1, 1928176784 } - trans:intvector { -868010400, -768906000, 1419696000 } - typeOffsets:intvector { 37336, 0, 32400, 0, 35312, 0, 36000, 0, 39600, 0 } - typeMap:bin { "0203010304" } - } //Z#551 - /* Pacific/Chatham */ :table { - transPre32:intvector { -1, 1102529668 } - trans:intvector { -757426500, 152632800, 162309600, 183477600, 194968800, 215532000, 226418400, 246981600, 257868000, 278431200, 289317600, 309880800, 320767200, 341330400, 352216800, 372780000, 384271200, 404834400, 415720800, 436284000, 447170400, 467733600, 478620000, 499183200, 510069600, 530632800, 541519200, 562082400, 573573600, 594136800, 605023200, 623772000, 637682400, 655221600, 669132000, 686671200, 700581600, 718120800, 732636000, 749570400, 764085600, 781020000, 795535200, 812469600, 826984800, 844524000, 858434400, 875973600, 889884000, 907423200, 921938400, 938872800, 953388000, 970322400, 984837600, 1002376800, 1016287200, 1033826400, 1047736800, 1065276000, 1079791200, 1096725600, 1111240800, 1128175200, 1142690400, 1159624800, 1174140000, 1191074400, 1207404000, 1222524000 } - typeOffsets:intvector { 44028, 0, 44100, 0, 45900, 0, 45900, 3600 } - typeMap:bin { "0102030203020302030203020302030203020302030203020302030203020302030203020302030203020302030203020302030203020302030203020302030203020302030203" } - finalRule { "Chatham" } - finalRaw:int { 45900 } - finalYear:int { 2009 } - links:intvector { 541, 552 } - } //Z#552 - /* Pacific/Chuuk */ :table { - transPre32:intvector { -1, 2117478068 } - typeOffsets:intvector { 36428, 0, 36000, 0 } - typeMap:bin { "01" } - links:intvector { 553, 588, 591 } - } //Z#553 - /* Pacific/Easter */ :table { - trans:intvector { -1178124152, -36619200, -23922000, -3355200, 7527600, 24465600, 37767600, 55915200, 69217200, 87969600, 100666800, 118209600, 132116400, 150868800, 163566000, 182318400, 195620400, 213768000, 227070000, 245217600, 258519600, 277272000, 289969200, 308721600, 321418800, 340171200, 353473200, 371620800, 384922800, 403070400, 416372400, 434520000, 447822000, 466574400, 479271600, 498024000, 510721200, 529473600, 545194800, 560923200, 574225200, 592372800, 605674800, 624427200, 637124400, 653457600, 668574000, 687326400, 700628400, 718776000, 732078000, 750225600, 763527600, 781675200, 794977200, 813729600, 826426800, 845179200, 859690800, 876628800, 889930800, 906868800, 923194800, 939528000, 952830000, 971582400, 984279600, 1003032000, 1015729200, 1034481600, 1047178800, 1065931200, 1079233200, 1097380800, 1110682800, 1128830400, 1142132400, 1160884800, 1173582000, 1192334400, 1206846000, 1223784000, 1237086000, 1255233600, 1270350000, 1286683200, 1304823600, 1313899200, 1335668400, 1346558400, 1367118000, 1378612800, 1398567600, 1410062400, 1463281200, 1471147200 } - typeOffsets:intvector { -26248, 0, -25200, 0, -25200, 3600, -21600, 0, -21600, 3600 } - typeMap:bin { "010201020102010201020102010201020102010201020102010201020304030403040304030403040304030403040304030403040304030403040304030403040304030403040304030403040304030403040304030403040304030403040304" } - finalRule { "Chile" } - finalRaw:int { -21600 } - finalYear:int { 2017 } - links:intvector { 392, 554 } - } //Z#554 - /* Pacific/Efate */ :table { - trans:intvector { -1829387596, 433256400, 448977600, 467298000, 480427200, 496760400, 511876800, 528210000, 543931200, 559659600, 575380800, 591109200, 606830400, 622558800, 638280000, 654008400, 669729600, 686062800, 696340800, 719931600, 727790400 } - typeOffsets:intvector { 40396, 0, 39600, 0, 39600, 3600 } - typeMap:bin { "010201020102010201020102010201020102010201" } - } //Z#555 - /* Pacific/Enderbury */ :table { - transPre32:intvector { -1, 2117555556 } - trans:intvector { 307627200, 788958000 } - typeOffsets:intvector { -41060, 0, -43200, 0, -39600, 0, 46800, 0 } - typeMap:bin { "010203" } - } //Z#556 - /* Pacific/Fakaofo */ :table { - transPre32:intvector { -1, 2117555592 } - trans:intvector { 1325242800 } - typeOffsets:intvector { -41096, 0, -39600, 0, 46800, 0 } - typeMap:bin { "0102" } - } //Z#557 - /* Pacific/Fiji */ :table { - trans:intvector { -1709985344, 909842400, 920124000, 941896800, 951573600, 1259416800, 1269698400, 1287842400, 1299333600, 1319292000, 1327154400, 1350741600, 1358604000, 1382796000, 1390050000, 1414850400, 1421503200, 1446300000 } - typeOffsets:intvector { 42944, 0, 43200, 0, 43200, 3600 } - typeMap:bin { "010201020102010201020102010201020102" } - finalRule { "Fiji" } - finalRaw:int { 43200 } - finalYear:int { 2016 } - } //Z#558 - /* Pacific/Funafuti */ :table { - transPre32:intvector { -1, 2117471484 } - typeOffsets:intvector { 43012, 0, 43200, 0 } - typeMap:bin { "01" } - } //Z#559 - /* Pacific/Galapagos */ :table { - trans:intvector { -1230746496, 504939600 } - typeOffsets:intvector { -21504, 0, -21600, 0, -18000, 0 } - typeMap:bin { "0201" } - } //Z#560 - /* Pacific/Gambier */ :table { - trans:intvector { -1806678012 } - typeOffsets:intvector { -32388, 0, -32400, 0 } - typeMap:bin { "01" } - } //Z#561 - /* Pacific/Guadalcanal */ :table { - trans:intvector { -1806748788 } - typeOffsets:intvector { 38388, 0, 39600, 0 } - typeMap:bin { "01" } - links:intvector { 562, 596 } - } //Z#562 - /* Pacific/Guam */ :table { - transPre32:intvector { -1, 350340556, -1, 2117479756 } - typeOffsets:intvector { -51660, 0, 34740, 0, 36000, 0 } - typeMap:bin { "0102" } - links:intvector { 563, 583 } - } //Z#563 - /* Pacific/Honolulu */ :table { - transPre32:intvector { -1, 1960865982 } - trans:intvector { -1157283000, -1155436200, -880198200, -765376200, -712150200 } - typeOffsets:intvector { -37886, 0, -37800, 0, -37800, 3600, -36000, 0 } - typeMap:bin { "010201020103" } - links:intvector { 564, 565, 619 } - } //Z#564 - /* Pacific/Johnston */ :int { 564 } //Z#565 - /* Pacific/Kiritimati */ :table { - transPre32:intvector { -1, 2117552256 } - trans:intvector { 307622400, 788954400 } - typeOffsets:intvector { -37760, 0, -38400, 0, -36000, 0, 50400, 0 } - typeMap:bin { "010203" } - } //Z#566 - /* Pacific/Kosrae */ :table { - transPre32:intvector { -1, 2117475380 } - trans:intvector { -7988400, 915105600 } - typeOffsets:intvector { 39116, 0, 39600, 0, 43200, 0 } - typeMap:bin { "010201" } - } //Z#567 - /* Pacific/Kwajalein */ :table { - transPre32:intvector { -1, 2117474336 } - trans:intvector { -7988400, 745848000 } - typeOffsets:intvector { 40160, 0, -43200, 0, 39600, 0, 43200, 0 } - typeMap:bin { "020103" } - links:intvector { 529, 568 } - } //Z#568 - /* Pacific/Majuro */ :table { - transPre32:intvector { -1, 2117473408 } - trans:intvector { -7988400 } - typeOffsets:intvector { 41088, 0, 39600, 0, 43200, 0 } - typeMap:bin { "0102" } - } //Z#569 - /* Pacific/Marquesas */ :table { - trans:intvector { -1806676920 } - typeOffsets:intvector { -33480, 0, -34200, 0 } - typeMap:bin { "01" } - } //Z#570 - /* Pacific/Midway */ :int { 576 } //Z#571 - /* Pacific/Nauru */ :table { - trans:intvector { -1545131260, -877347000, -800960400, 294323400 } - typeOffsets:intvector { 40060, 0, 32400, 0, 41400, 0, 43200, 0 } - typeMap:bin { "02010203" } - } //Z#572 - /* Pacific/Niue */ :table { - transPre32:intvector { -1, 2117555276 } - trans:intvector { -599575200, 276089400 } - typeOffsets:intvector { -40780, 0, -41400, 0, -40800, 0, -39600, 0 } - typeMap:bin { "020103" } - } //Z#573 - /* Pacific/Norfolk */ :table { - transPre32:intvector { -1, 2117474184 } - trans:intvector { -599656320, 152029800, 162912600, 1443882600 } - typeOffsets:intvector { 40312, 0, 39600, 0, 40320, 0, 41400, 0, 41400, 3600 } - typeMap:bin { "0203040301" } - } //Z#574 - /* Pacific/Noumea */ :table { - trans:intvector { -1829387148, 250002000, 257342400, 281451600, 288878400, 849366000, 857228400 } - typeOffsets:intvector { 39948, 0, 39600, 0, 39600, 3600 } - typeMap:bin { "01020102010201" } - } //Z#575 - /* Pacific/Pago_Pago */ :table { - transPre32:intvector { -1, 1439229064 } - trans:intvector { -1861879032 } - typeOffsets:intvector { 45432, 0, -40968, 0, -39600, 0 } - typeMap:bin { "0102" } - links:intvector { 571, 576, 584, 625 } - } //Z#576 - /* Pacific/Palau */ :table { - transPre32:intvector { -1, 2117482220 } - typeOffsets:intvector { 32276, 0, 32400, 0 } - typeMap:bin { "01" } - } //Z#577 - /* Pacific/Pitcairn */ :table { - transPre32:intvector { -1, 2117545716 } - trans:intvector { 893665800 } - typeOffsets:intvector { -31220, 0, -30600, 0, -28800, 0 } - typeMap:bin { "0102" } - } //Z#578 - /* Pacific/Pohnpei */ :table { - transPre32:intvector { -1, 2117476524 } - typeOffsets:intvector { 37972, 0, 39600, 0 } - typeMap:bin { "01" } - links:intvector { 579, 580 } - } //Z#579 - /* Pacific/Ponape */ :int { 579 } //Z#580 - /* Pacific/Port_Moresby */ :table { - transPre32:intvector { -1, 1454791176, -1, 1928176784 } - typeOffsets:intvector { 35320, 0, 35312, 0, 36000, 0 } - typeMap:bin { "0102" } - } //Z#581 - /* Pacific/Rarotonga */ :table { - transPre32:intvector { -1, 2117552840 } - trans:intvector { 279714600, 289387800, 309952800, 320837400, 341402400, 352287000, 372852000, 384341400, 404906400, 415791000, 436356000, 447240600, 467805600, 478690200, 499255200, 510139800, 530704800, 541589400, 562154400, 573643800, 594208800, 605093400, 625658400, 636543000, 657108000, 667992600 } - typeOffsets:intvector { -38344, 0, -37800, 0, -36000, 0, -36000, 1800 } - typeMap:bin { "010302030203020302030203020302030203020302030203020302" } - } //Z#582 - /* Pacific/Saipan */ :int { 563 } //Z#583 - /* Pacific/Samoa */ :int { 576 } //Z#584 - /* Pacific/Tahiti */ :table { - trans:intvector { -1806674504 } - typeOffsets:intvector { -35896, 0, -36000, 0 } - typeMap:bin { "01" } - } //Z#585 - /* Pacific/Tarawa */ :table { - transPre32:intvector { -1, 2117472972 } - typeOffsets:intvector { 41524, 0, 43200, 0 } - typeMap:bin { "01" } - } //Z#586 - /* Pacific/Tongatapu */ :table { - transPre32:intvector { -1, 2117470136 } - trans:intvector { -915193200, 939214800, 953384400, 973342800, 980596800, 1004792400, 1012046400, 1478350800, 1484398800, 1509800400 } - typeOffsets:intvector { 44360, 0, 44400, 0, 46800, 0, 46800, 3600 } - typeMap:bin { "0102030203020302030203" } - finalRule { "Tonga" } - finalRaw:int { 46800 } - finalYear:int { 2018 } - } //Z#587 - /* Pacific/Truk */ :int { 553 } //Z#588 - /* Pacific/Wake */ :table { - transPre32:intvector { -1, 2117474508 } - typeOffsets:intvector { 39988, 0, 43200, 0 } - typeMap:bin { "01" } - } //Z#589 - /* Pacific/Wallis */ :table { - transPre32:intvector { -1, 2117470376 } - typeOffsets:intvector { 44120, 0, 43200, 0 } - typeMap:bin { "01" } - } //Z#590 - /* Pacific/Yap */ :int { 553 } //Z#591 - /* Poland */ :int { 496 } //Z#592 - /* Portugal */ :int { 461 } //Z#593 - /* ROC */ :int { 315 } //Z#594 - /* ROK */ :int { 311 } //Z#595 - /* SST */ :int { 562 } //Z#596 - /* Singapore */ :int { 313 } //Z#597 - /* SystemV/AST4 */ :table { - typeOffsets:intvector { -14400, 0 } - } //Z#598 - /* SystemV/AST4ADT */ :table { - transPre32:intvector { -1, 2096195296, -1, 2111916496, -1, 2127644896, -1, 2143366096 } - trans:intvector { -2135872800, -2120151600, -2104423200, -2088702000, -2072973600, -2056647600, -2040919200, -2025198000, -2009469600, -1993748400, -1978020000, -1962298800, -1946570400, -1930849200, -1915120800, -1898794800, -1883671200, -1867345200, -1851616800, -1835895600, -1820167200, -1804446000, -1788717600, -1772996400, -1757268000, -1741546800, -1725818400, -1709492400, -1693764000, -1678042800, -1662314400, -1646593200, -1630864800, -1615143600, -1599415200, -1583694000, -1567965600, -1551639600, -1536516000, -1520190000, -1504461600, -1488740400, -1473012000, -1457290800, -1441562400, -1425841200, -1410112800, -1394391600, -1378663200, -1362337200, -1347213600, -1330887600, -1315159200, -1299438000, -1283709600, -1267988400, -1252260000, -1236538800, -1220810400, -1205089200, -1189360800, -1173034800, -1157306400, -1141585200, -1125856800, -1110135600, -1094407200, -1078686000, -1062957600, -1047236400, -1031508000, -1015182000, -1000058400, -983732400, -968004000, -952282800, -936554400, -920833200, -905104800, -889383600, -873655200, -857934000, -842205600, -825879600, -810151200, -794430000, -778701600, -762980400, -747252000, -731530800, -715802400, -700081200, -684352800, -668026800, -652903200, -636577200, -620848800, -605127600, -589399200, -573678000, -557949600, -542228400, -526500000, -510778800, -495050400, -478724400, -463600800, -447274800, -431546400, -415825200, -400096800, -384375600, -368647200, -352926000, -337197600, -321476400, -305748000, -289422000, -273693600, -257972400, -242244000, -226522800, -210794400, -195073200, -179344800, -163623600, -147895200, -131569200, -116445600, -100119600, -84391200, -68670000, -52941600, -37220400, -21492000, -5770800, 9957600, 25678800, 41407200, 57733200, 73461600, 89182800, 104911200, 120632400, 126684000, 154501200, 162367200, 183531600, 199260000, 215586000 } - typeOffsets:intvector { -14400, 0, -14400, 3600 } - typeMap:bin { "01000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100" } - finalRule { "SystemV" } - finalRaw:int { -14400 } - finalYear:int { 1977 } - } //Z#599 - /* SystemV/CST6 */ :table { - typeOffsets:intvector { -21600, 0 } - } //Z#600 - /* SystemV/CST6CDT */ :table { - transPre32:intvector { -1, 2096202496, -1, 2111923696, -1, 2127652096, -1, 2143373296 } - trans:intvector { -2135865600, -2120144400, -2104416000, -2088694800, -2072966400, -2056640400, -2040912000, -2025190800, -2009462400, -1993741200, -1978012800, -1962291600, -1946563200, -1930842000, -1915113600, -1898787600, -1883664000, -1867338000, -1851609600, -1835888400, -1820160000, -1804438800, -1788710400, -1772989200, -1757260800, -1741539600, -1725811200, -1709485200, -1693756800, -1678035600, -1662307200, -1646586000, -1630857600, -1615136400, -1599408000, -1583686800, -1567958400, -1551632400, -1536508800, -1520182800, -1504454400, -1488733200, -1473004800, -1457283600, -1441555200, -1425834000, -1410105600, -1394384400, -1378656000, -1362330000, -1347206400, -1330880400, -1315152000, -1299430800, -1283702400, -1267981200, -1252252800, -1236531600, -1220803200, -1205082000, -1189353600, -1173027600, -1157299200, -1141578000, -1125849600, -1110128400, -1094400000, -1078678800, -1062950400, -1047229200, -1031500800, -1015174800, -1000051200, -983725200, -967996800, -952275600, -936547200, -920826000, -905097600, -889376400, -873648000, -857926800, -842198400, -825872400, -810144000, -794422800, -778694400, -762973200, -747244800, -731523600, -715795200, -700074000, -684345600, -668019600, -652896000, -636570000, -620841600, -605120400, -589392000, -573670800, -557942400, -542221200, -526492800, -510771600, -495043200, -478717200, -463593600, -447267600, -431539200, -415818000, -400089600, -384368400, -368640000, -352918800, -337190400, -321469200, -305740800, -289414800, -273686400, -257965200, -242236800, -226515600, -210787200, -195066000, -179337600, -163616400, -147888000, -131562000, -116438400, -100112400, -84384000, -68662800, -52934400, -37213200, -21484800, -5763600, 9964800, 25686000, 41414400, 57740400, 73468800, 89190000, 104918400, 120639600, 126691200, 154508400, 162374400, 183538800, 199267200, 215593200 } - typeOffsets:intvector { -21600, 0, -21600, 3600 } - typeMap:bin { "01000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100" } - finalRule { "SystemV" } - finalRaw:int { -21600 } - finalYear:int { 1977 } - } //Z#601 - /* SystemV/EST5 */ :table { - typeOffsets:intvector { -18000, 0 } - } //Z#602 - /* SystemV/EST5EDT */ :table { - transPre32:intvector { -1, 2096198896, -1, 2111920096, -1, 2127648496, -1, 2143369696 } - trans:intvector { -2135869200, -2120148000, -2104419600, -2088698400, -2072970000, -2056644000, -2040915600, -2025194400, -2009466000, -1993744800, -1978016400, -1962295200, -1946566800, -1930845600, -1915117200, -1898791200, -1883667600, -1867341600, -1851613200, -1835892000, -1820163600, -1804442400, -1788714000, -1772992800, -1757264400, -1741543200, -1725814800, -1709488800, -1693760400, -1678039200, -1662310800, -1646589600, -1630861200, -1615140000, -1599411600, -1583690400, -1567962000, -1551636000, -1536512400, -1520186400, -1504458000, -1488736800, -1473008400, -1457287200, -1441558800, -1425837600, -1410109200, -1394388000, -1378659600, -1362333600, -1347210000, -1330884000, -1315155600, -1299434400, -1283706000, -1267984800, -1252256400, -1236535200, -1220806800, -1205085600, -1189357200, -1173031200, -1157302800, -1141581600, -1125853200, -1110132000, -1094403600, -1078682400, -1062954000, -1047232800, -1031504400, -1015178400, -1000054800, -983728800, -968000400, -952279200, -936550800, -920829600, -905101200, -889380000, -873651600, -857930400, -842202000, -825876000, -810147600, -794426400, -778698000, -762976800, -747248400, -731527200, -715798800, -700077600, -684349200, -668023200, -652899600, -636573600, -620845200, -605124000, -589395600, -573674400, -557946000, -542224800, -526496400, -510775200, -495046800, -478720800, -463597200, -447271200, -431542800, -415821600, -400093200, -384372000, -368643600, -352922400, -337194000, -321472800, -305744400, -289418400, -273690000, -257968800, -242240400, -226519200, -210790800, -195069600, -179341200, -163620000, -147891600, -131565600, -116442000, -100116000, -84387600, -68666400, -52938000, -37216800, -21488400, -5767200, 9961200, 25682400, 41410800, 57736800, 73465200, 89186400, 104914800, 120636000, 126687600, 154504800, 162370800, 183535200, 199263600, 215589600 } - typeOffsets:intvector { -18000, 0, -18000, 3600 } - typeMap:bin { "01000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100" } - finalRule { "SystemV" } - finalRaw:int { -18000 } - finalYear:int { 1977 } - } //Z#603 - /* SystemV/HST10 */ :table { - typeOffsets:intvector { -36000, 0 } - } //Z#604 - /* SystemV/MST7 */ :table { - typeOffsets:intvector { -25200, 0 } - } //Z#605 - /* SystemV/MST7MDT */ :table { - transPre32:intvector { -1, 2096206096, -1, 2111927296, -1, 2127655696, -1, 2143376896 } - trans:intvector { -2135862000, -2120140800, -2104412400, -2088691200, -2072962800, -2056636800, -2040908400, -2025187200, -2009458800, -1993737600, -1978009200, -1962288000, -1946559600, -1930838400, -1915110000, -1898784000, -1883660400, -1867334400, -1851606000, -1835884800, -1820156400, -1804435200, -1788706800, -1772985600, -1757257200, -1741536000, -1725807600, -1709481600, -1693753200, -1678032000, -1662303600, -1646582400, -1630854000, -1615132800, -1599404400, -1583683200, -1567954800, -1551628800, -1536505200, -1520179200, -1504450800, -1488729600, -1473001200, -1457280000, -1441551600, -1425830400, -1410102000, -1394380800, -1378652400, -1362326400, -1347202800, -1330876800, -1315148400, -1299427200, -1283698800, -1267977600, -1252249200, -1236528000, -1220799600, -1205078400, -1189350000, -1173024000, -1157295600, -1141574400, -1125846000, -1110124800, -1094396400, -1078675200, -1062946800, -1047225600, -1031497200, -1015171200, -1000047600, -983721600, -967993200, -952272000, -936543600, -920822400, -905094000, -889372800, -873644400, -857923200, -842194800, -825868800, -810140400, -794419200, -778690800, -762969600, -747241200, -731520000, -715791600, -700070400, -684342000, -668016000, -652892400, -636566400, -620838000, -605116800, -589388400, -573667200, -557938800, -542217600, -526489200, -510768000, -495039600, -478713600, -463590000, -447264000, -431535600, -415814400, -400086000, -384364800, -368636400, -352915200, -337186800, -321465600, -305737200, -289411200, -273682800, -257961600, -242233200, -226512000, -210783600, -195062400, -179334000, -163612800, -147884400, -131558400, -116434800, -100108800, -84380400, -68659200, -52930800, -37209600, -21481200, -5760000, 9968400, 25689600, 41418000, 57744000, 73472400, 89193600, 104922000, 120643200, 126694800, 154512000, 162378000, 183542400, 199270800, 215596800 } - typeOffsets:intvector { -25200, 0, -25200, 3600 } - typeMap:bin { "01000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100" } - finalRule { "SystemV" } - finalRaw:int { -25200 } - finalYear:int { 1977 } - } //Z#606 - /* SystemV/PST8 */ :table { - typeOffsets:intvector { -28800, 0 } - } //Z#607 - /* SystemV/PST8PDT */ :table { - transPre32:intvector { -1, 2096209696, -1, 2111930896, -1, 2127659296, -1, 2143380496 } - trans:intvector { -2135858400, -2120137200, -2104408800, -2088687600, -2072959200, -2056633200, -2040904800, -2025183600, -2009455200, -1993734000, -1978005600, -1962284400, -1946556000, -1930834800, -1915106400, -1898780400, -1883656800, -1867330800, -1851602400, -1835881200, -1820152800, -1804431600, -1788703200, -1772982000, -1757253600, -1741532400, -1725804000, -1709478000, -1693749600, -1678028400, -1662300000, -1646578800, -1630850400, -1615129200, -1599400800, -1583679600, -1567951200, -1551625200, -1536501600, -1520175600, -1504447200, -1488726000, -1472997600, -1457276400, -1441548000, -1425826800, -1410098400, -1394377200, -1378648800, -1362322800, -1347199200, -1330873200, -1315144800, -1299423600, -1283695200, -1267974000, -1252245600, -1236524400, -1220796000, -1205074800, -1189346400, -1173020400, -1157292000, -1141570800, -1125842400, -1110121200, -1094392800, -1078671600, -1062943200, -1047222000, -1031493600, -1015167600, -1000044000, -983718000, -967989600, -952268400, -936540000, -920818800, -905090400, -889369200, -873640800, -857919600, -842191200, -825865200, -810136800, -794415600, -778687200, -762966000, -747237600, -731516400, -715788000, -700066800, -684338400, -668012400, -652888800, -636562800, -620834400, -605113200, -589384800, -573663600, -557935200, -542214000, -526485600, -510764400, -495036000, -478710000, -463586400, -447260400, -431532000, -415810800, -400082400, -384361200, -368632800, -352911600, -337183200, -321462000, -305733600, -289407600, -273679200, -257958000, -242229600, -226508400, -210780000, -195058800, -179330400, -163609200, -147880800, -131554800, -116431200, -100105200, -84376800, -68655600, -52927200, -37206000, -21477600, -5756400, 9972000, 25693200, 41421600, 57747600, 73476000, 89197200, 104925600, 120646800, 126698400, 154515600, 162381600, 183546000, 199274400, 215600400 } - typeOffsets:intvector { -28800, 0, -28800, 3600 } - typeMap:bin { "01000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100" } - finalRule { "SystemV" } - finalRaw:int { -28800 } - finalYear:int { 1977 } - } //Z#608 - /* SystemV/YST9 */ :table { - typeOffsets:intvector { -32400, 0 } - } //Z#609 - /* SystemV/YST9YDT */ :table { - transPre32:intvector { -1, 2096213296, -1, 2111934496, -1, 2127662896, -1, 2143384096 } - trans:intvector { -2135854800, -2120133600, -2104405200, -2088684000, -2072955600, -2056629600, -2040901200, -2025180000, -2009451600, -1993730400, -1978002000, -1962280800, -1946552400, -1930831200, -1915102800, -1898776800, -1883653200, -1867327200, -1851598800, -1835877600, -1820149200, -1804428000, -1788699600, -1772978400, -1757250000, -1741528800, -1725800400, -1709474400, -1693746000, -1678024800, -1662296400, -1646575200, -1630846800, -1615125600, -1599397200, -1583676000, -1567947600, -1551621600, -1536498000, -1520172000, -1504443600, -1488722400, -1472994000, -1457272800, -1441544400, -1425823200, -1410094800, -1394373600, -1378645200, -1362319200, -1347195600, -1330869600, -1315141200, -1299420000, -1283691600, -1267970400, -1252242000, -1236520800, -1220792400, -1205071200, -1189342800, -1173016800, -1157288400, -1141567200, -1125838800, -1110117600, -1094389200, -1078668000, -1062939600, -1047218400, -1031490000, -1015164000, -1000040400, -983714400, -967986000, -952264800, -936536400, -920815200, -905086800, -889365600, -873637200, -857916000, -842187600, -825861600, -810133200, -794412000, -778683600, -762962400, -747234000, -731512800, -715784400, -700063200, -684334800, -668008800, -652885200, -636559200, -620830800, -605109600, -589381200, -573660000, -557931600, -542210400, -526482000, -510760800, -495032400, -478706400, -463582800, -447256800, -431528400, -415807200, -400078800, -384357600, -368629200, -352908000, -337179600, -321458400, -305730000, -289404000, -273675600, -257954400, -242226000, -226504800, -210776400, -195055200, -179326800, -163605600, -147877200, -131551200, -116427600, -100101600, -84373200, -68652000, -52923600, -37202400, -21474000, -5752800, 9975600, 25696800, 41425200, 57751200, 73479600, 89200800, 104929200, 120650400, 126702000, 154519200, 162385200, 183549600, 199278000, 215604000 } - typeOffsets:intvector { -32400, 0, -32400, 3600 } - typeMap:bin { "01000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100" } - finalRule { "SystemV" } - finalRaw:int { -32400 } - finalYear:int { 1977 } - } //Z#610 - /* Turkey */ :int { 456 } //Z#611 - /* UCT */ :int { 432 } //Z#612 - /* US/Alaska */ :int { 60 } //Z#613 - /* US/Aleutian */ :int { 59 } //Z#614 - /* US/Arizona */ :int { 184 } //Z#615 - /* US/Central */ :int { 98 } //Z#616 - /* US/East-Indiana */ :int { 131 } //Z#617 - /* US/Eastern */ :int { 173 } //Z#618 - /* US/Hawaii */ :int { 564 } //Z#619 - /* US/Indiana-Starke */ :int { 132 } //Z#620 - /* US/Michigan */ :int { 110 } //Z#621 - /* US/Mountain */ :int { 109 } //Z#622 - /* US/Pacific */ :int { 151 } //Z#623 - /* US/Pacific-New */ :int { 151 } //Z#624 - /* US/Samoa */ :int { 576 } //Z#625 - /* UTC */ :int { 433 } //Z#626 - /* Universal */ :int { 433 } //Z#627 - /* VST */ :int { 270 } //Z#628 - /* W-SU */ :int { 470 } //Z#629 - /* WET */ :table { - trans:intvector { 228877200, 243997200, 260326800, 276051600, 291776400, 307501200, 323830800, 338950800, 354675600, 370400400, 386125200, 401850000, 417574800, 433299600, 449024400, 465354000, 481078800, 496803600, 512528400, 528253200, 543978000, 559702800, 575427600, 591152400, 606877200, 622602000, 638326800, 654656400, 670381200, 686106000, 701830800, 717555600, 733280400, 749005200, 764730000, 780454800, 796179600, 811904400, 828234000, 846378000 } - typeOffsets:intvector { 0, 0, 0, 3600 } - typeMap:bin { "01000100010001000100010001000100010001000100010001000100010001000100010001000100" } - finalRule { "EU" } - finalRaw:int { 0 } - finalYear:int { 1997 } - } //Z#630 - /* Zulu */ :int { 433 } //Z#631 - } - Names { - "ACT","AET","AGT","ART","AST","Africa/Abidjan","Africa/Accra" // 6 - ,"Africa/Addis_Ababa","Africa/Algiers","Africa/Asmara" // 9 - ,"Africa/Asmera","Africa/Bamako","Africa/Bangui","Africa/Banjul" // 13 - ,"Africa/Bissau","Africa/Blantyre","Africa/Brazzaville" // 16 - ,"Africa/Bujumbura","Africa/Cairo","Africa/Casablanca" // 19 - ,"Africa/Ceuta","Africa/Conakry","Africa/Dakar","Africa/Dar_es_Salaam" // 23 - ,"Africa/Djibouti","Africa/Douala","Africa/El_Aaiun" // 26 - ,"Africa/Freetown","Africa/Gaborone","Africa/Harare" // 29 - ,"Africa/Johannesburg","Africa/Juba","Africa/Kampala" // 32 - ,"Africa/Khartoum","Africa/Kigali","Africa/Kinshasa" // 35 - ,"Africa/Lagos","Africa/Libreville","Africa/Lome","Africa/Luanda" // 39 - ,"Africa/Lubumbashi","Africa/Lusaka","Africa/Malabo" // 42 - ,"Africa/Maputo","Africa/Maseru","Africa/Mbabane","Africa/Mogadishu" // 46 - ,"Africa/Monrovia","Africa/Nairobi","Africa/Ndjamena" // 49 - ,"Africa/Niamey","Africa/Nouakchott","Africa/Ouagadougou" // 52 - ,"Africa/Porto-Novo","Africa/Sao_Tome","Africa/Timbuktu" // 55 - ,"Africa/Tripoli","Africa/Tunis","Africa/Windhoek" // 58 - ,"America/Adak","America/Anchorage","America/Anguilla" // 61 - ,"America/Antigua","America/Araguaina","America/Argentina/Buenos_Aires" // 64 - ,"America/Argentina/Catamarca","America/Argentina/ComodRivadavia" // 66 - ,"America/Argentina/Cordoba","America/Argentina/Jujuy" // 68 - ,"America/Argentina/La_Rioja","America/Argentina/Mendoza" // 70 - ,"America/Argentina/Rio_Gallegos","America/Argentina/Salta" // 72 - ,"America/Argentina/San_Juan","America/Argentina/San_Luis" // 74 - ,"America/Argentina/Tucuman","America/Argentina/Ushuaia" // 76 - ,"America/Aruba","America/Asuncion","America/Atikokan" // 79 - ,"America/Atka","America/Bahia","America/Bahia_Banderas" // 82 - ,"America/Barbados","America/Belem","America/Belize" // 85 - ,"America/Blanc-Sablon","America/Boa_Vista","America/Bogota" // 88 - ,"America/Boise","America/Buenos_Aires","America/Cambridge_Bay" // 91 - ,"America/Campo_Grande","America/Cancun","America/Caracas" // 94 - ,"America/Catamarca","America/Cayenne","America/Cayman" // 97 - ,"America/Chicago","America/Chihuahua","America/Coral_Harbour" // 100 - ,"America/Cordoba","America/Costa_Rica","America/Creston" // 103 - ,"America/Cuiaba","America/Curacao","America/Danmarkshavn" // 106 - ,"America/Dawson","America/Dawson_Creek","America/Denver" // 109 - ,"America/Detroit","America/Dominica","America/Edmonton" // 112 - ,"America/Eirunepe","America/El_Salvador","America/Ensenada" // 115 - ,"America/Fort_Nelson","America/Fort_Wayne","America/Fortaleza" // 118 - ,"America/Glace_Bay","America/Godthab","America/Goose_Bay" // 121 - ,"America/Grand_Turk","America/Grenada","America/Guadeloupe" // 124 - ,"America/Guatemala","America/Guayaquil","America/Guyana" // 127 - ,"America/Halifax","America/Havana","America/Hermosillo" // 130 - ,"America/Indiana/Indianapolis","America/Indiana/Knox" // 132 - ,"America/Indiana/Marengo","America/Indiana/Petersburg" // 134 - ,"America/Indiana/Tell_City","America/Indiana/Vevay" // 136 - ,"America/Indiana/Vincennes","America/Indiana/Winamac" // 138 - ,"America/Indianapolis","America/Inuvik","America/Iqaluit" // 141 - ,"America/Jamaica","America/Jujuy","America/Juneau" // 144 - ,"America/Kentucky/Louisville","America/Kentucky/Monticello" // 146 - ,"America/Knox_IN","America/Kralendijk","America/La_Paz" // 149 - ,"America/Lima","America/Los_Angeles","America/Louisville" // 152 - ,"America/Lower_Princes","America/Maceio","America/Managua" // 155 - ,"America/Manaus","America/Marigot","America/Martinique" // 158 - ,"America/Matamoros","America/Mazatlan","America/Mendoza" // 161 - ,"America/Menominee","America/Merida","America/Metlakatla" // 164 - ,"America/Mexico_City","America/Miquelon","America/Moncton" // 167 - ,"America/Monterrey","America/Montevideo","America/Montreal" // 170 - ,"America/Montserrat","America/Nassau","America/New_York" // 173 - ,"America/Nipigon","America/Nome","America/Noronha" // 176 - ,"America/North_Dakota/Beulah","America/North_Dakota/Center" // 178 - ,"America/North_Dakota/New_Salem","America/Ojinaga" // 180 - ,"America/Panama","America/Pangnirtung","America/Paramaribo" // 183 - ,"America/Phoenix","America/Port-au-Prince","America/Port_of_Spain" // 186 - ,"America/Porto_Acre","America/Porto_Velho","America/Puerto_Rico" // 189 - ,"America/Rainy_River","America/Rankin_Inlet","America/Recife" // 192 - ,"America/Regina","America/Resolute","America/Rio_Branco" // 195 - ,"America/Rosario","America/Santa_Isabel","America/Santarem" // 198 - ,"America/Santiago","America/Santo_Domingo","America/Sao_Paulo" // 201 - ,"America/Scoresbysund","America/Shiprock","America/Sitka" // 204 - ,"America/St_Barthelemy","America/St_Johns","America/St_Kitts" // 207 - ,"America/St_Lucia","America/St_Thomas","America/St_Vincent" // 210 - ,"America/Swift_Current","America/Tegucigalpa","America/Thule" // 213 - ,"America/Thunder_Bay","America/Tijuana","America/Toronto" // 216 - ,"America/Tortola","America/Vancouver","America/Virgin" // 219 - ,"America/Whitehorse","America/Winnipeg","America/Yakutat" // 222 - ,"America/Yellowknife","Antarctica/Casey","Antarctica/Davis" // 225 - ,"Antarctica/DumontDUrville","Antarctica/Macquarie" // 227 - ,"Antarctica/Mawson","Antarctica/McMurdo","Antarctica/Palmer" // 230 - ,"Antarctica/Rothera","Antarctica/South_Pole","Antarctica/Syowa" // 233 - ,"Antarctica/Troll","Antarctica/Vostok","Arctic/Longyearbyen" // 236 - ,"Asia/Aden","Asia/Almaty","Asia/Amman","Asia/Anadyr" // 240 - ,"Asia/Aqtau","Asia/Aqtobe","Asia/Ashgabat","Asia/Ashkhabad" // 244 - ,"Asia/Atyrau","Asia/Baghdad","Asia/Bahrain","Asia/Baku" // 248 - ,"Asia/Bangkok","Asia/Barnaul","Asia/Beirut","Asia/Bishkek" // 252 - ,"Asia/Brunei","Asia/Calcutta","Asia/Chita","Asia/Choibalsan" // 256 - ,"Asia/Chongqing","Asia/Chungking","Asia/Colombo","Asia/Dacca" // 260 - ,"Asia/Damascus","Asia/Dhaka","Asia/Dili","Asia/Dubai" // 264 - ,"Asia/Dushanbe","Asia/Famagusta","Asia/Gaza","Asia/Harbin" // 268 - ,"Asia/Hebron","Asia/Ho_Chi_Minh","Asia/Hong_Kong" // 271 - ,"Asia/Hovd","Asia/Irkutsk","Asia/Istanbul","Asia/Jakarta" // 275 - ,"Asia/Jayapura","Asia/Jerusalem","Asia/Kabul","Asia/Kamchatka" // 279 - ,"Asia/Karachi","Asia/Kashgar","Asia/Kathmandu","Asia/Katmandu" // 283 - ,"Asia/Khandyga","Asia/Kolkata","Asia/Krasnoyarsk" // 286 - ,"Asia/Kuala_Lumpur","Asia/Kuching","Asia/Kuwait","Asia/Macao" // 290 - ,"Asia/Macau","Asia/Magadan","Asia/Makassar","Asia/Manila" // 294 - ,"Asia/Muscat","Asia/Nicosia","Asia/Novokuznetsk","Asia/Novosibirsk" // 298 - ,"Asia/Omsk","Asia/Oral","Asia/Phnom_Penh","Asia/Pontianak" // 302 - ,"Asia/Pyongyang","Asia/Qatar","Asia/Qyzylorda","Asia/Rangoon" // 306 - ,"Asia/Riyadh","Asia/Saigon","Asia/Sakhalin","Asia/Samarkand" // 310 - ,"Asia/Seoul","Asia/Shanghai","Asia/Singapore","Asia/Srednekolymsk" // 314 - ,"Asia/Taipei","Asia/Tashkent","Asia/Tbilisi","Asia/Tehran" // 318 - ,"Asia/Tel_Aviv","Asia/Thimbu","Asia/Thimphu","Asia/Tokyo" // 322 - ,"Asia/Tomsk","Asia/Ujung_Pandang","Asia/Ulaanbaatar" // 325 - ,"Asia/Ulan_Bator","Asia/Urumqi","Asia/Ust-Nera","Asia/Vientiane" // 329 - ,"Asia/Vladivostok","Asia/Yakutsk","Asia/Yangon","Asia/Yekaterinburg" // 333 - ,"Asia/Yerevan","Atlantic/Azores","Atlantic/Bermuda" // 336 - ,"Atlantic/Canary","Atlantic/Cape_Verde","Atlantic/Faeroe" // 339 - ,"Atlantic/Faroe","Atlantic/Jan_Mayen","Atlantic/Madeira" // 342 - ,"Atlantic/Reykjavik","Atlantic/South_Georgia","Atlantic/St_Helena" // 345 - ,"Atlantic/Stanley","Australia/ACT","Australia/Adelaide" // 348 - ,"Australia/Brisbane","Australia/Broken_Hill","Australia/Canberra" // 351 - ,"Australia/Currie","Australia/Darwin","Australia/Eucla" // 354 - ,"Australia/Hobart","Australia/LHI","Australia/Lindeman" // 357 - ,"Australia/Lord_Howe","Australia/Melbourne","Australia/NSW" // 360 - ,"Australia/North","Australia/Perth","Australia/Queensland" // 363 - ,"Australia/South","Australia/Sydney","Australia/Tasmania" // 366 - ,"Australia/Victoria","Australia/West","Australia/Yancowinna" // 369 - ,"BET","BST","Brazil/Acre","Brazil/DeNoronha","Brazil/East" // 374 - ,"Brazil/West","CAT","CET","CNT","CST","CST6CDT","CTT" // 381 - ,"Canada/Atlantic","Canada/Central","Canada/East-Saskatchewan" // 384 - ,"Canada/Eastern","Canada/Mountain","Canada/Newfoundland" // 387 - ,"Canada/Pacific","Canada/Saskatchewan","Canada/Yukon" // 390 - ,"Chile/Continental","Chile/EasterIsland","Cuba","EAT" // 394 - ,"ECT","EET","EST","EST5EDT","Egypt","Eire","Etc/GMT" // 401 - ,"Etc/GMT+0","Etc/GMT+1","Etc/GMT+10","Etc/GMT+11" // 405 - ,"Etc/GMT+12","Etc/GMT+2","Etc/GMT+3","Etc/GMT+4","Etc/GMT+5" // 410 - ,"Etc/GMT+6","Etc/GMT+7","Etc/GMT+8","Etc/GMT+9","Etc/GMT-0" // 415 - ,"Etc/GMT-1","Etc/GMT-10","Etc/GMT-11","Etc/GMT-12" // 419 - ,"Etc/GMT-13","Etc/GMT-14","Etc/GMT-2","Etc/GMT-3" // 423 - ,"Etc/GMT-4","Etc/GMT-5","Etc/GMT-6","Etc/GMT-7","Etc/GMT-8" // 428 - ,"Etc/GMT-9","Etc/GMT0","Etc/Greenwich","Etc/UCT","Etc/UTC" // 433 - ,"Etc/Universal","Etc/Unknown","Etc/Zulu","Europe/Amsterdam" // 437 - ,"Europe/Andorra","Europe/Astrakhan","Europe/Athens" // 440 - ,"Europe/Belfast","Europe/Belgrade","Europe/Berlin" // 443 - ,"Europe/Bratislava","Europe/Brussels","Europe/Bucharest" // 446 - ,"Europe/Budapest","Europe/Busingen","Europe/Chisinau" // 449 - ,"Europe/Copenhagen","Europe/Dublin","Europe/Gibraltar" // 452 - ,"Europe/Guernsey","Europe/Helsinki","Europe/Isle_of_Man" // 455 - ,"Europe/Istanbul","Europe/Jersey","Europe/Kaliningrad" // 458 - ,"Europe/Kiev","Europe/Kirov","Europe/Lisbon","Europe/Ljubljana" // 462 - ,"Europe/London","Europe/Luxembourg","Europe/Madrid" // 465 - ,"Europe/Malta","Europe/Mariehamn","Europe/Minsk","Europe/Monaco" // 469 - ,"Europe/Moscow","Europe/Nicosia","Europe/Oslo","Europe/Paris" // 473 - ,"Europe/Podgorica","Europe/Prague","Europe/Riga","Europe/Rome" // 477 - ,"Europe/Samara","Europe/San_Marino","Europe/Sarajevo" // 480 - ,"Europe/Saratov","Europe/Simferopol","Europe/Skopje" // 483 - ,"Europe/Sofia","Europe/Stockholm","Europe/Tallinn" // 486 - ,"Europe/Tirane","Europe/Tiraspol","Europe/Ulyanovsk" // 489 - ,"Europe/Uzhgorod","Europe/Vaduz","Europe/Vatican" // 492 - ,"Europe/Vienna","Europe/Vilnius","Europe/Volgograd" // 495 - ,"Europe/Warsaw","Europe/Zagreb","Europe/Zaporozhye" // 498 - ,"Europe/Zurich","Factory","GB","GB-Eire","GMT","GMT+0" // 504 - ,"GMT-0","GMT0","Greenwich","HST","Hongkong","IET" // 510 - ,"IST","Iceland","Indian/Antananarivo","Indian/Chagos" // 514 - ,"Indian/Christmas","Indian/Cocos","Indian/Comoro" // 517 - ,"Indian/Kerguelen","Indian/Mahe","Indian/Maldives" // 520 - ,"Indian/Mauritius","Indian/Mayotte","Indian/Reunion" // 523 - ,"Iran","Israel","JST","Jamaica","Japan","Kwajalein" // 529 - ,"Libya","MET","MIT","MST","MST7MDT","Mexico/BajaNorte" // 535 - ,"Mexico/BajaSur","Mexico/General","NET","NST","NZ" // 540 - ,"NZ-CHAT","Navajo","PLT","PNT","PRC","PRT","PST","PST8PDT" // 548 - ,"Pacific/Apia","Pacific/Auckland","Pacific/Bougainville" // 551 - ,"Pacific/Chatham","Pacific/Chuuk","Pacific/Easter" // 554 - ,"Pacific/Efate","Pacific/Enderbury","Pacific/Fakaofo" // 557 - ,"Pacific/Fiji","Pacific/Funafuti","Pacific/Galapagos" // 560 - ,"Pacific/Gambier","Pacific/Guadalcanal","Pacific/Guam" // 563 - ,"Pacific/Honolulu","Pacific/Johnston","Pacific/Kiritimati" // 566 - ,"Pacific/Kosrae","Pacific/Kwajalein","Pacific/Majuro" // 569 - ,"Pacific/Marquesas","Pacific/Midway","Pacific/Nauru" // 572 - ,"Pacific/Niue","Pacific/Norfolk","Pacific/Noumea" // 575 - ,"Pacific/Pago_Pago","Pacific/Palau","Pacific/Pitcairn" // 578 - ,"Pacific/Pohnpei","Pacific/Ponape","Pacific/Port_Moresby" // 581 - ,"Pacific/Rarotonga","Pacific/Saipan","Pacific/Samoa" // 584 - ,"Pacific/Tahiti","Pacific/Tarawa","Pacific/Tongatapu" // 587 - ,"Pacific/Truk","Pacific/Wake","Pacific/Wallis","Pacific/Yap" // 591 - ,"Poland","Portugal","ROC","ROK","SST","Singapore" // 597 - ,"SystemV/AST4","SystemV/AST4ADT","SystemV/CST6","SystemV/CST6CDT" // 601 - ,"SystemV/EST5","SystemV/EST5EDT","SystemV/HST10","SystemV/MST7" // 605 - ,"SystemV/MST7MDT","SystemV/PST8","SystemV/PST8PDT" // 608 - ,"SystemV/YST9","SystemV/YST9YDT","Turkey","UCT","US/Alaska" // 613 - ,"US/Aleutian","US/Arizona","US/Central","US/East-Indiana" // 617 - ,"US/Eastern","US/Hawaii","US/Indiana-Starke","US/Michigan" // 621 - ,"US/Mountain","US/Pacific","US/Pacific-New","US/Samoa" // 625 - ,"UTC","Universal","VST","W-SU","WET","Zulu" // 631 - } - Rules { - AN:intvector { - 9, 1, -1, 7200, 1, 3, 1, -1, 7200, 1, 3600 - } //_#0 - AS:intvector { - 9, 1, -1, 7200, 1, 3, 1, -1, 7200, 1, 3600 - } //_#1 - AT:intvector { - 9, 1, -1, 7200, 1, 3, 1, -1, 7200, 1, 3600 - } //_#2 - AV:intvector { - 9, 1, -1, 7200, 1, 3, 1, -1, 7200, 1, 3600 - } //_#3 - Brazil:intvector { - 9, 15, -1, 0, 0, 1, 15, -1, 0, 0, 3600 - } //_#4 - C-Eur:intvector { - 2, -31, -1, 7200, 1, 9, -31, -1, 7200, 1, 3600 - } //_#5 - Canada:intvector { - 2, 8, -1, 7200, 0, 10, 1, -1, 7200, 0, 3600 - } //_#6 - Chatham:intvector { - 8, -30, -1, 9900, 1, 3, 1, -1, 9900, 1, 3600 - } //_#7 - Chile:intvector { - 7, 9, -1, 14400, 2, 4, 9, -1, 10800, 2, 3600 - } //_#8 - Cuba:intvector { - 2, 8, -1, 0, 1, 10, 1, -1, 0, 1, 3600 - } //_#9 - EU:intvector { - 2, -31, -1, 3600, 2, 9, -31, -1, 3600, 2, 3600 - } //_#10 - EUAsia:intvector { - 2, -31, -1, 3600, 2, 9, -31, -1, 3600, 2, 3600 - } //_#11 - Fiji:intvector { - 10, 1, -1, 7200, 0, 0, 15, -1, 10800, 0, 3600 - } //_#12 - Iran:intvector { - 2, 21, 0, 0, 0, 8, 21, 0, 0, 0, 3600 - } //_#13 - Jordan:intvector { - 2, -31, -5, 86400, 0, 9, -31, -6, 0, 1, 3600 - } //_#14 - LH:intvector { - 9, 1, -1, 7200, 0, 3, 1, -1, 7200, 0, 1800 - } //_#15 - Lebanon:intvector { - 2, -31, -1, 0, 0, 9, -31, -1, 0, 0, 3600 - } //_#16 - Mexico:intvector { - 3, 1, -1, 7200, 0, 9, -31, -1, 7200, 0, 3600 - } //_#17 - Moldova:intvector { - 2, -31, -1, 7200, 0, 9, -31, -1, 10800, 0, 3600 - } //_#18 - Mongol:intvector { - 2, -31, -7, 7200, 0, 8, -30, -7, 0, 0, 3600 - } //_#19 - Morocco:intvector { - 2, -31, -1, 7200, 0, 9, -31, -1, 10800, 0, 3600 - } //_#20 - NZ:intvector { - 8, -30, -1, 7200, 1, 3, 1, -1, 7200, 1, 3600 - } //_#21 - Namibia:intvector { - 8, 1, -1, 7200, 0, 3, 1, -1, 7200, 0, 3600 - } //_#22 - Palestine:intvector { - 2, -31, -7, 3600, 0, 9, -31, -7, 3600, 0, 3600 - } //_#23 - Para:intvector { - 9, 1, -1, 0, 0, 2, 22, -1, 0, 0, 3600 - } //_#24 - Syria:intvector { - 2, -31, -6, 0, 0, 9, -31, -6, 0, 0, 3600 - } //_#25 - SystemV:intvector { - 3, -30, -1, 7200, 0, 9, -31, -1, 7200, 0, 3600 - } //_#26 - Thule:intvector { - 2, 8, -1, 7200, 0, 10, 1, -1, 7200, 0, 3600 - } //_#27 - Tonga:intvector { - 10, 1, -1, 7200, 0, 0, 15, -1, 10800, 0, 3600 - } //_#28 - Troll:intvector { - 2, -31, -1, 3600, 2, 9, -31, -1, 3600, 2, 7200 - } //_#29 - US:intvector { - 2, 8, -1, 7200, 0, 10, 1, -1, 7200, 0, 3600 - } //_#30 - WS:intvector { - 8, -30, -1, 10800, 0, 3, 1, -1, 14400, 0, 3600 - } //_#31 - Zion:intvector { - 2, 23, -6, 7200, 0, 9, -31, -1, 7200, 0, 3600 - } //_#32 - } - Regions:array { - "AU", //Z#0 ACT - "AU", //Z#1 AET - "AR", //Z#2 AGT - "EG", //Z#3 ART - "US", //Z#4 AST - "CI", //Z#5 Africa/Abidjan - "GH", //Z#6 Africa/Accra - "ET", //Z#7 Africa/Addis_Ababa - "DZ", //Z#8 Africa/Algiers - "ER", //Z#9 Africa/Asmara - "ER", //Z#10 Africa/Asmera - "ML", //Z#11 Africa/Bamako - "CF", //Z#12 Africa/Bangui - "GM", //Z#13 Africa/Banjul - "GW", //Z#14 Africa/Bissau - "MW", //Z#15 Africa/Blantyre - "CG", //Z#16 Africa/Brazzaville - "BI", //Z#17 Africa/Bujumbura - "EG", //Z#18 Africa/Cairo - "MA", //Z#19 Africa/Casablanca - "ES", //Z#20 Africa/Ceuta - "GN", //Z#21 Africa/Conakry - "SN", //Z#22 Africa/Dakar - "TZ", //Z#23 Africa/Dar_es_Salaam - "DJ", //Z#24 Africa/Djibouti - "CM", //Z#25 Africa/Douala - "EH", //Z#26 Africa/El_Aaiun - "SL", //Z#27 Africa/Freetown - "BW", //Z#28 Africa/Gaborone - "ZW", //Z#29 Africa/Harare - "ZA", //Z#30 Africa/Johannesburg - "SS", //Z#31 Africa/Juba - "UG", //Z#32 Africa/Kampala - "SD", //Z#33 Africa/Khartoum - "RW", //Z#34 Africa/Kigali - "CD", //Z#35 Africa/Kinshasa - "NG", //Z#36 Africa/Lagos - "GA", //Z#37 Africa/Libreville - "TG", //Z#38 Africa/Lome - "AO", //Z#39 Africa/Luanda - "CD", //Z#40 Africa/Lubumbashi - "ZM", //Z#41 Africa/Lusaka - "GQ", //Z#42 Africa/Malabo - "MZ", //Z#43 Africa/Maputo - "LS", //Z#44 Africa/Maseru - "SZ", //Z#45 Africa/Mbabane - "SO", //Z#46 Africa/Mogadishu - "LR", //Z#47 Africa/Monrovia - "KE", //Z#48 Africa/Nairobi - "TD", //Z#49 Africa/Ndjamena - "NE", //Z#50 Africa/Niamey - "MR", //Z#51 Africa/Nouakchott - "BF", //Z#52 Africa/Ouagadougou - "BJ", //Z#53 Africa/Porto-Novo - "ST", //Z#54 Africa/Sao_Tome - "CI", //Z#55 Africa/Timbuktu - "LY", //Z#56 Africa/Tripoli - "TN", //Z#57 Africa/Tunis - "NA", //Z#58 Africa/Windhoek - "US", //Z#59 America/Adak - "US", //Z#60 America/Anchorage - "AI", //Z#61 America/Anguilla - "AG", //Z#62 America/Antigua - "BR", //Z#63 America/Araguaina - "AR", //Z#64 America/Argentina/Buenos_Aires - "AR", //Z#65 America/Argentina/Catamarca - "AR", //Z#66 America/Argentina/ComodRivadavia - "AR", //Z#67 America/Argentina/Cordoba - "AR", //Z#68 America/Argentina/Jujuy - "AR", //Z#69 America/Argentina/La_Rioja - "AR", //Z#70 America/Argentina/Mendoza - "AR", //Z#71 America/Argentina/Rio_Gallegos - "AR", //Z#72 America/Argentina/Salta - "AR", //Z#73 America/Argentina/San_Juan - "AR", //Z#74 America/Argentina/San_Luis - "AR", //Z#75 America/Argentina/Tucuman - "AR", //Z#76 America/Argentina/Ushuaia - "AW", //Z#77 America/Aruba - "PY", //Z#78 America/Asuncion - "CA", //Z#79 America/Atikokan - "US", //Z#80 America/Atka - "BR", //Z#81 America/Bahia - "MX", //Z#82 America/Bahia_Banderas - "BB", //Z#83 America/Barbados - "BR", //Z#84 America/Belem - "BZ", //Z#85 America/Belize - "CA", //Z#86 America/Blanc-Sablon - "BR", //Z#87 America/Boa_Vista - "CO", //Z#88 America/Bogota - "US", //Z#89 America/Boise - "AR", //Z#90 America/Buenos_Aires - "CA", //Z#91 America/Cambridge_Bay - "BR", //Z#92 America/Campo_Grande - "MX", //Z#93 America/Cancun - "VE", //Z#94 America/Caracas - "AR", //Z#95 America/Catamarca - "GF", //Z#96 America/Cayenne - "KY", //Z#97 America/Cayman - "US", //Z#98 America/Chicago - "MX", //Z#99 America/Chihuahua - "CA", //Z#100 America/Coral_Harbour - "AR", //Z#101 America/Cordoba - "CR", //Z#102 America/Costa_Rica - "CA", //Z#103 America/Creston - "BR", //Z#104 America/Cuiaba - "CW", //Z#105 America/Curacao - "GL", //Z#106 America/Danmarkshavn - "CA", //Z#107 America/Dawson - "CA", //Z#108 America/Dawson_Creek - "US", //Z#109 America/Denver - "US", //Z#110 America/Detroit - "DM", //Z#111 America/Dominica - "CA", //Z#112 America/Edmonton - "BR", //Z#113 America/Eirunepe - "SV", //Z#114 America/El_Salvador - "MX", //Z#115 America/Ensenada - "CA", //Z#116 America/Fort_Nelson - "US", //Z#117 America/Fort_Wayne - "BR", //Z#118 America/Fortaleza - "CA", //Z#119 America/Glace_Bay - "GL", //Z#120 America/Godthab - "CA", //Z#121 America/Goose_Bay - "TC", //Z#122 America/Grand_Turk - "GD", //Z#123 America/Grenada - "GP", //Z#124 America/Guadeloupe - "GT", //Z#125 America/Guatemala - "EC", //Z#126 America/Guayaquil - "GY", //Z#127 America/Guyana - "CA", //Z#128 America/Halifax - "CU", //Z#129 America/Havana - "MX", //Z#130 America/Hermosillo - "US", //Z#131 America/Indiana/Indianapolis - "US", //Z#132 America/Indiana/Knox - "US", //Z#133 America/Indiana/Marengo - "US", //Z#134 America/Indiana/Petersburg - "US", //Z#135 America/Indiana/Tell_City - "US", //Z#136 America/Indiana/Vevay - "US", //Z#137 America/Indiana/Vincennes - "US", //Z#138 America/Indiana/Winamac - "US", //Z#139 America/Indianapolis - "CA", //Z#140 America/Inuvik - "CA", //Z#141 America/Iqaluit - "JM", //Z#142 America/Jamaica - "AR", //Z#143 America/Jujuy - "US", //Z#144 America/Juneau - "US", //Z#145 America/Kentucky/Louisville - "US", //Z#146 America/Kentucky/Monticello - "US", //Z#147 America/Knox_IN - "BQ", //Z#148 America/Kralendijk - "BO", //Z#149 America/La_Paz - "PE", //Z#150 America/Lima - "US", //Z#151 America/Los_Angeles - "US", //Z#152 America/Louisville - "SX", //Z#153 America/Lower_Princes - "BR", //Z#154 America/Maceio - "NI", //Z#155 America/Managua - "BR", //Z#156 America/Manaus - "MF", //Z#157 America/Marigot - "MQ", //Z#158 America/Martinique - "MX", //Z#159 America/Matamoros - "MX", //Z#160 America/Mazatlan - "AR", //Z#161 America/Mendoza - "US", //Z#162 America/Menominee - "MX", //Z#163 America/Merida - "US", //Z#164 America/Metlakatla - "MX", //Z#165 America/Mexico_City - "PM", //Z#166 America/Miquelon - "CA", //Z#167 America/Moncton - "MX", //Z#168 America/Monterrey - "UY", //Z#169 America/Montevideo - "CA", //Z#170 America/Montreal - "MS", //Z#171 America/Montserrat - "BS", //Z#172 America/Nassau - "US", //Z#173 America/New_York - "CA", //Z#174 America/Nipigon - "US", //Z#175 America/Nome - "BR", //Z#176 America/Noronha - "US", //Z#177 America/North_Dakota/Beulah - "US", //Z#178 America/North_Dakota/Center - "US", //Z#179 America/North_Dakota/New_Salem - "MX", //Z#180 America/Ojinaga - "PA", //Z#181 America/Panama - "CA", //Z#182 America/Pangnirtung - "SR", //Z#183 America/Paramaribo - "US", //Z#184 America/Phoenix - "HT", //Z#185 America/Port-au-Prince - "TT", //Z#186 America/Port_of_Spain - "BR", //Z#187 America/Porto_Acre - "BR", //Z#188 America/Porto_Velho - "PR", //Z#189 America/Puerto_Rico - "CA", //Z#190 America/Rainy_River - "CA", //Z#191 America/Rankin_Inlet - "BR", //Z#192 America/Recife - "CA", //Z#193 America/Regina - "CA", //Z#194 America/Resolute - "BR", //Z#195 America/Rio_Branco - "AR", //Z#196 America/Rosario - "MX", //Z#197 America/Santa_Isabel - "BR", //Z#198 America/Santarem - "CL", //Z#199 America/Santiago - "DO", //Z#200 America/Santo_Domingo - "BR", //Z#201 America/Sao_Paulo - "GL", //Z#202 America/Scoresbysund - "US", //Z#203 America/Shiprock - "US", //Z#204 America/Sitka - "BL", //Z#205 America/St_Barthelemy - "CA", //Z#206 America/St_Johns - "KN", //Z#207 America/St_Kitts - "LC", //Z#208 America/St_Lucia - "VI", //Z#209 America/St_Thomas - "VC", //Z#210 America/St_Vincent - "CA", //Z#211 America/Swift_Current - "HN", //Z#212 America/Tegucigalpa - "GL", //Z#213 America/Thule - "CA", //Z#214 America/Thunder_Bay - "MX", //Z#215 America/Tijuana - "CA", //Z#216 America/Toronto - "VG", //Z#217 America/Tortola - "CA", //Z#218 America/Vancouver - "TT", //Z#219 America/Virgin - "CA", //Z#220 America/Whitehorse - "CA", //Z#221 America/Winnipeg - "US", //Z#222 America/Yakutat - "CA", //Z#223 America/Yellowknife - "AQ", //Z#224 Antarctica/Casey - "AQ", //Z#225 Antarctica/Davis - "AQ", //Z#226 Antarctica/DumontDUrville - "AU", //Z#227 Antarctica/Macquarie - "AQ", //Z#228 Antarctica/Mawson - "AQ", //Z#229 Antarctica/McMurdo - "AQ", //Z#230 Antarctica/Palmer - "AQ", //Z#231 Antarctica/Rothera - "NZ", //Z#232 Antarctica/South_Pole - "AQ", //Z#233 Antarctica/Syowa - "AQ", //Z#234 Antarctica/Troll - "AQ", //Z#235 Antarctica/Vostok - "SJ", //Z#236 Arctic/Longyearbyen - "YE", //Z#237 Asia/Aden - "KZ", //Z#238 Asia/Almaty - "JO", //Z#239 Asia/Amman - "RU", //Z#240 Asia/Anadyr - "KZ", //Z#241 Asia/Aqtau - "KZ", //Z#242 Asia/Aqtobe - "TM", //Z#243 Asia/Ashgabat - "TM", //Z#244 Asia/Ashkhabad - "KZ", //Z#245 Asia/Atyrau - "IQ", //Z#246 Asia/Baghdad - "BH", //Z#247 Asia/Bahrain - "AZ", //Z#248 Asia/Baku - "TH", //Z#249 Asia/Bangkok - "RU", //Z#250 Asia/Barnaul - "LB", //Z#251 Asia/Beirut - "KG", //Z#252 Asia/Bishkek - "BN", //Z#253 Asia/Brunei - "IN", //Z#254 Asia/Calcutta - "RU", //Z#255 Asia/Chita - "MN", //Z#256 Asia/Choibalsan - "CN", //Z#257 Asia/Chongqing - "CN", //Z#258 Asia/Chungking - "LK", //Z#259 Asia/Colombo - "BD", //Z#260 Asia/Dacca - "SY", //Z#261 Asia/Damascus - "BD", //Z#262 Asia/Dhaka - "TL", //Z#263 Asia/Dili - "AE", //Z#264 Asia/Dubai - "TJ", //Z#265 Asia/Dushanbe - "CY", //Z#266 Asia/Famagusta - "PS", //Z#267 Asia/Gaza - "CN", //Z#268 Asia/Harbin - "PS", //Z#269 Asia/Hebron - "VN", //Z#270 Asia/Ho_Chi_Minh - "HK", //Z#271 Asia/Hong_Kong - "MN", //Z#272 Asia/Hovd - "RU", //Z#273 Asia/Irkutsk - "TR", //Z#274 Asia/Istanbul - "ID", //Z#275 Asia/Jakarta - "ID", //Z#276 Asia/Jayapura - "IL", //Z#277 Asia/Jerusalem - "AF", //Z#278 Asia/Kabul - "RU", //Z#279 Asia/Kamchatka - "PK", //Z#280 Asia/Karachi - "CN", //Z#281 Asia/Kashgar - "NP", //Z#282 Asia/Kathmandu - "NP", //Z#283 Asia/Katmandu - "RU", //Z#284 Asia/Khandyga - "IN", //Z#285 Asia/Kolkata - "RU", //Z#286 Asia/Krasnoyarsk - "MY", //Z#287 Asia/Kuala_Lumpur - "MY", //Z#288 Asia/Kuching - "KW", //Z#289 Asia/Kuwait - "MO", //Z#290 Asia/Macao - "MO", //Z#291 Asia/Macau - "RU", //Z#292 Asia/Magadan - "ID", //Z#293 Asia/Makassar - "PH", //Z#294 Asia/Manila - "OM", //Z#295 Asia/Muscat - "CY", //Z#296 Asia/Nicosia - "RU", //Z#297 Asia/Novokuznetsk - "RU", //Z#298 Asia/Novosibirsk - "RU", //Z#299 Asia/Omsk - "KZ", //Z#300 Asia/Oral - "KH", //Z#301 Asia/Phnom_Penh - "ID", //Z#302 Asia/Pontianak - "KP", //Z#303 Asia/Pyongyang - "QA", //Z#304 Asia/Qatar - "KZ", //Z#305 Asia/Qyzylorda - "MM", //Z#306 Asia/Rangoon - "SA", //Z#307 Asia/Riyadh - "VN", //Z#308 Asia/Saigon - "RU", //Z#309 Asia/Sakhalin - "UZ", //Z#310 Asia/Samarkand - "KR", //Z#311 Asia/Seoul - "CN", //Z#312 Asia/Shanghai - "SG", //Z#313 Asia/Singapore - "RU", //Z#314 Asia/Srednekolymsk - "TW", //Z#315 Asia/Taipei - "UZ", //Z#316 Asia/Tashkent - "GE", //Z#317 Asia/Tbilisi - "IR", //Z#318 Asia/Tehran - "IL", //Z#319 Asia/Tel_Aviv - "BT", //Z#320 Asia/Thimbu - "BT", //Z#321 Asia/Thimphu - "JP", //Z#322 Asia/Tokyo - "RU", //Z#323 Asia/Tomsk - "ID", //Z#324 Asia/Ujung_Pandang - "MN", //Z#325 Asia/Ulaanbaatar - "MN", //Z#326 Asia/Ulan_Bator - "CN", //Z#327 Asia/Urumqi - "RU", //Z#328 Asia/Ust-Nera - "LA", //Z#329 Asia/Vientiane - "RU", //Z#330 Asia/Vladivostok - "RU", //Z#331 Asia/Yakutsk - "MM", //Z#332 Asia/Yangon - "RU", //Z#333 Asia/Yekaterinburg - "AM", //Z#334 Asia/Yerevan - "PT", //Z#335 Atlantic/Azores - "BM", //Z#336 Atlantic/Bermuda - "ES", //Z#337 Atlantic/Canary - "CV", //Z#338 Atlantic/Cape_Verde - "FO", //Z#339 Atlantic/Faeroe - "FO", //Z#340 Atlantic/Faroe - "NO", //Z#341 Atlantic/Jan_Mayen - "PT", //Z#342 Atlantic/Madeira - "IS", //Z#343 Atlantic/Reykjavik - "GS", //Z#344 Atlantic/South_Georgia - "SH", //Z#345 Atlantic/St_Helena - "FK", //Z#346 Atlantic/Stanley - "AU", //Z#347 Australia/ACT - "AU", //Z#348 Australia/Adelaide - "AU", //Z#349 Australia/Brisbane - "AU", //Z#350 Australia/Broken_Hill - "AU", //Z#351 Australia/Canberra - "AU", //Z#352 Australia/Currie - "AU", //Z#353 Australia/Darwin - "AU", //Z#354 Australia/Eucla - "AU", //Z#355 Australia/Hobart - "AU", //Z#356 Australia/LHI - "AU", //Z#357 Australia/Lindeman - "AU", //Z#358 Australia/Lord_Howe - "AU", //Z#359 Australia/Melbourne - "AU", //Z#360 Australia/NSW - "AU", //Z#361 Australia/North - "AU", //Z#362 Australia/Perth - "AU", //Z#363 Australia/Queensland - "AU", //Z#364 Australia/South - "AU", //Z#365 Australia/Sydney - "AU", //Z#366 Australia/Tasmania - "AU", //Z#367 Australia/Victoria - "AU", //Z#368 Australia/West - "AU", //Z#369 Australia/Yancowinna - "BR", //Z#370 BET - "BD", //Z#371 BST - "BR", //Z#372 Brazil/Acre - "BR", //Z#373 Brazil/DeNoronha - "BR", //Z#374 Brazil/East - "BR", //Z#375 Brazil/West - "MZ", //Z#376 CAT - "001",//Z#377 CET - "CA", //Z#378 CNT - "US", //Z#379 CST - "001",//Z#380 CST6CDT - "CN", //Z#381 CTT - "CA", //Z#382 Canada/Atlantic - "CA", //Z#383 Canada/Central - "CA", //Z#384 Canada/East-Saskatchewan - "CA", //Z#385 Canada/Eastern - "CA", //Z#386 Canada/Mountain - "CA", //Z#387 Canada/Newfoundland - "CA", //Z#388 Canada/Pacific - "CA", //Z#389 Canada/Saskatchewan - "CA", //Z#390 Canada/Yukon - "CL", //Z#391 Chile/Continental - "CL", //Z#392 Chile/EasterIsland - "CU", //Z#393 Cuba - "KE", //Z#394 EAT - "FR", //Z#395 ECT - "001",//Z#396 EET - "001",//Z#397 EST - "001",//Z#398 EST5EDT - "EG", //Z#399 Egypt - "IE", //Z#400 Eire - "001",//Z#401 Etc/GMT - "001",//Z#402 Etc/GMT+0 - "001",//Z#403 Etc/GMT+1 - "001",//Z#404 Etc/GMT+10 - "001",//Z#405 Etc/GMT+11 - "001",//Z#406 Etc/GMT+12 - "001",//Z#407 Etc/GMT+2 - "001",//Z#408 Etc/GMT+3 - "001",//Z#409 Etc/GMT+4 - "001",//Z#410 Etc/GMT+5 - "001",//Z#411 Etc/GMT+6 - "001",//Z#412 Etc/GMT+7 - "001",//Z#413 Etc/GMT+8 - "001",//Z#414 Etc/GMT+9 - "001",//Z#415 Etc/GMT-0 - "001",//Z#416 Etc/GMT-1 - "001",//Z#417 Etc/GMT-10 - "001",//Z#418 Etc/GMT-11 - "001",//Z#419 Etc/GMT-12 - "001",//Z#420 Etc/GMT-13 - "001",//Z#421 Etc/GMT-14 - "001",//Z#422 Etc/GMT-2 - "001",//Z#423 Etc/GMT-3 - "001",//Z#424 Etc/GMT-4 - "001",//Z#425 Etc/GMT-5 - "001",//Z#426 Etc/GMT-6 - "001",//Z#427 Etc/GMT-7 - "001",//Z#428 Etc/GMT-8 - "001",//Z#429 Etc/GMT-9 - "001",//Z#430 Etc/GMT0 - "001",//Z#431 Etc/Greenwich - "001",//Z#432 Etc/UCT - "001",//Z#433 Etc/UTC - "001",//Z#434 Etc/Universal - "001",//Z#435 Etc/Unknown - "001",//Z#436 Etc/Zulu - "NL", //Z#437 Europe/Amsterdam - "AD", //Z#438 Europe/Andorra - "RU", //Z#439 Europe/Astrakhan - "GR", //Z#440 Europe/Athens - "GB", //Z#441 Europe/Belfast - "RS", //Z#442 Europe/Belgrade - "DE", //Z#443 Europe/Berlin - "SK", //Z#444 Europe/Bratislava - "BE", //Z#445 Europe/Brussels - "RO", //Z#446 Europe/Bucharest - "HU", //Z#447 Europe/Budapest - "DE", //Z#448 Europe/Busingen - "MD", //Z#449 Europe/Chisinau - "DK", //Z#450 Europe/Copenhagen - "IE", //Z#451 Europe/Dublin - "GI", //Z#452 Europe/Gibraltar - "GG", //Z#453 Europe/Guernsey - "FI", //Z#454 Europe/Helsinki - "IM", //Z#455 Europe/Isle_of_Man - "TR", //Z#456 Europe/Istanbul - "JE", //Z#457 Europe/Jersey - "RU", //Z#458 Europe/Kaliningrad - "UA", //Z#459 Europe/Kiev - "RU", //Z#460 Europe/Kirov - "PT", //Z#461 Europe/Lisbon - "SI", //Z#462 Europe/Ljubljana - "GB", //Z#463 Europe/London - "LU", //Z#464 Europe/Luxembourg - "ES", //Z#465 Europe/Madrid - "MT", //Z#466 Europe/Malta - "AX", //Z#467 Europe/Mariehamn - "BY", //Z#468 Europe/Minsk - "MC", //Z#469 Europe/Monaco - "RU", //Z#470 Europe/Moscow - "CY", //Z#471 Europe/Nicosia - "NO", //Z#472 Europe/Oslo - "FR", //Z#473 Europe/Paris - "ME", //Z#474 Europe/Podgorica - "CZ", //Z#475 Europe/Prague - "LV", //Z#476 Europe/Riga - "IT", //Z#477 Europe/Rome - "RU", //Z#478 Europe/Samara - "SM", //Z#479 Europe/San_Marino - "BA", //Z#480 Europe/Sarajevo - "RU", //Z#481 Europe/Saratov - "UA", //Z#482 Europe/Simferopol - "MK", //Z#483 Europe/Skopje - "BG", //Z#484 Europe/Sofia - "SE", //Z#485 Europe/Stockholm - "EE", //Z#486 Europe/Tallinn - "AL", //Z#487 Europe/Tirane - "MD", //Z#488 Europe/Tiraspol - "RU", //Z#489 Europe/Ulyanovsk - "UA", //Z#490 Europe/Uzhgorod - "LI", //Z#491 Europe/Vaduz - "VA", //Z#492 Europe/Vatican - "AT", //Z#493 Europe/Vienna - "LT", //Z#494 Europe/Vilnius - "RU", //Z#495 Europe/Volgograd - "PL", //Z#496 Europe/Warsaw - "HR", //Z#497 Europe/Zagreb - "UA", //Z#498 Europe/Zaporozhye - "CH", //Z#499 Europe/Zurich - "001",//Z#500 Factory - "GB", //Z#501 GB - "GB", //Z#502 GB-Eire - "001",//Z#503 GMT - "001",//Z#504 GMT+0 - "001",//Z#505 GMT-0 - "001",//Z#506 GMT0 - "001",//Z#507 Greenwich - "001",//Z#508 HST - "HK", //Z#509 Hongkong - "US", //Z#510 IET - "IN", //Z#511 IST - "IS", //Z#512 Iceland - "MG", //Z#513 Indian/Antananarivo - "IO", //Z#514 Indian/Chagos - "CX", //Z#515 Indian/Christmas - "CC", //Z#516 Indian/Cocos - "KM", //Z#517 Indian/Comoro - "TF", //Z#518 Indian/Kerguelen - "SC", //Z#519 Indian/Mahe - "MV", //Z#520 Indian/Maldives - "MU", //Z#521 Indian/Mauritius - "YT", //Z#522 Indian/Mayotte - "RE", //Z#523 Indian/Reunion - "IR", //Z#524 Iran - "IL", //Z#525 Israel - "JP", //Z#526 JST - "JM", //Z#527 Jamaica - "JP", //Z#528 Japan - "MH", //Z#529 Kwajalein - "LY", //Z#530 Libya - "001",//Z#531 MET - "WS", //Z#532 MIT - "001",//Z#533 MST - "001",//Z#534 MST7MDT - "MX", //Z#535 Mexico/BajaNorte - "MX", //Z#536 Mexico/BajaSur - "MX", //Z#537 Mexico/General - "AM", //Z#538 NET - "NZ", //Z#539 NST - "NZ", //Z#540 NZ - "NZ", //Z#541 NZ-CHAT - "US", //Z#542 Navajo - "PK", //Z#543 PLT - "US", //Z#544 PNT - "CN", //Z#545 PRC - "PR", //Z#546 PRT - "US", //Z#547 PST - "001",//Z#548 PST8PDT - "WS", //Z#549 Pacific/Apia - "NZ", //Z#550 Pacific/Auckland - "PG", //Z#551 Pacific/Bougainville - "NZ", //Z#552 Pacific/Chatham - "FM", //Z#553 Pacific/Chuuk - "CL", //Z#554 Pacific/Easter - "VU", //Z#555 Pacific/Efate - "KI", //Z#556 Pacific/Enderbury - "TK", //Z#557 Pacific/Fakaofo - "FJ", //Z#558 Pacific/Fiji - "TV", //Z#559 Pacific/Funafuti - "EC", //Z#560 Pacific/Galapagos - "PF", //Z#561 Pacific/Gambier - "SB", //Z#562 Pacific/Guadalcanal - "GU", //Z#563 Pacific/Guam - "US", //Z#564 Pacific/Honolulu - "UM", //Z#565 Pacific/Johnston - "KI", //Z#566 Pacific/Kiritimati - "FM", //Z#567 Pacific/Kosrae - "MH", //Z#568 Pacific/Kwajalein - "MH", //Z#569 Pacific/Majuro - "PF", //Z#570 Pacific/Marquesas - "UM", //Z#571 Pacific/Midway - "NR", //Z#572 Pacific/Nauru - "NU", //Z#573 Pacific/Niue - "NF", //Z#574 Pacific/Norfolk - "NC", //Z#575 Pacific/Noumea - "AS", //Z#576 Pacific/Pago_Pago - "PW", //Z#577 Pacific/Palau - "PN", //Z#578 Pacific/Pitcairn - "FM", //Z#579 Pacific/Pohnpei - "FM", //Z#580 Pacific/Ponape - "PG", //Z#581 Pacific/Port_Moresby - "CK", //Z#582 Pacific/Rarotonga - "MP", //Z#583 Pacific/Saipan - "AS", //Z#584 Pacific/Samoa - "PF", //Z#585 Pacific/Tahiti - "KI", //Z#586 Pacific/Tarawa - "TO", //Z#587 Pacific/Tongatapu - "FM", //Z#588 Pacific/Truk - "UM", //Z#589 Pacific/Wake - "WF", //Z#590 Pacific/Wallis - "FM", //Z#591 Pacific/Yap - "PL", //Z#592 Poland - "PT", //Z#593 Portugal - "TW", //Z#594 ROC - "KR", //Z#595 ROK - "SB", //Z#596 SST - "SG", //Z#597 Singapore - "001",//Z#598 SystemV/AST4 - "001",//Z#599 SystemV/AST4ADT - "001",//Z#600 SystemV/CST6 - "001",//Z#601 SystemV/CST6CDT - "001",//Z#602 SystemV/EST5 - "001",//Z#603 SystemV/EST5EDT - "001",//Z#604 SystemV/HST10 - "001",//Z#605 SystemV/MST7 - "001",//Z#606 SystemV/MST7MDT - "001",//Z#607 SystemV/PST8 - "001",//Z#608 SystemV/PST8PDT - "001",//Z#609 SystemV/YST9 - "001",//Z#610 SystemV/YST9YDT - "TR", //Z#611 Turkey - "001",//Z#612 UCT - "US", //Z#613 US/Alaska - "US", //Z#614 US/Aleutian - "US", //Z#615 US/Arizona - "US", //Z#616 US/Central - "US", //Z#617 US/East-Indiana - "US", //Z#618 US/Eastern - "US", //Z#619 US/Hawaii - "US", //Z#620 US/Indiana-Starke - "US", //Z#621 US/Michigan - "US", //Z#622 US/Mountain - "US", //Z#623 US/Pacific - "US", //Z#624 US/Pacific-New - "AS", //Z#625 US/Samoa - "001",//Z#626 UTC - "001",//Z#627 Universal - "VN", //Z#628 VST - "RU", //Z#629 W-SU - "001",//Z#630 WET - "001",//Z#631 Zulu - } -} diff --git a/Build/source/libs/icu/icu-src/source/data/unidata/CaseFolding.txt b/Build/source/libs/icu/icu-src/source/data/unidata/CaseFolding.txt index 372ee68bd81..efdf18e441c 100644 --- a/Build/source/libs/icu/icu-src/source/data/unidata/CaseFolding.txt +++ b/Build/source/libs/icu/icu-src/source/data/unidata/CaseFolding.txt @@ -1,6 +1,6 @@ -# CaseFolding-9.0.0.txt -# Date: 2016-03-02, 18:54:54 GMT -# © 2016 Unicode®, Inc. +# CaseFolding-10.0.0.txt +# Date: 2017-04-14, 05:40:18 GMT +# © 2017 Unicode®, Inc. # Unicode and the Unicode Logo are registered trademarks of Unicode, Inc. in the U.S. and other countries. # For terms of use, see http://www.unicode.org/terms_of_use.html # @@ -24,7 +24,7 @@ # # NOTE: case folding does not preserve normalization formats! # -# For information on case folding, including how to have case folding +# For information on case folding, including how to have case folding # preserve normalization formats, see Section 3.13 Default Case Algorithms in # The Unicode Standard. # diff --git a/Build/source/libs/icu/icu-src/source/data/unidata/DerivedCoreProperties.txt b/Build/source/libs/icu/icu-src/source/data/unidata/DerivedCoreProperties.txt index cc664144311..895f8e8086d 100644 --- a/Build/source/libs/icu/icu-src/source/data/unidata/DerivedCoreProperties.txt +++ b/Build/source/libs/icu/icu-src/source/data/unidata/DerivedCoreProperties.txt @@ -1,6 +1,6 @@ -# DerivedCoreProperties-9.0.0.txt -# Date: 2016-06-01, 10:34:24 GMT -# © 2016 Unicode®, Inc. +# DerivedCoreProperties-10.0.0.txt +# Date: 2017-03-19, 00:05:15 GMT +# © 2017 Unicode®, Inc. # Unicode and the Unicode Logo are registered trademarks of Unicode, Inc. in the U.S. and other countries. # For terms of use, see http://www.unicode.org/terms_of_use.html # @@ -340,6 +340,7 @@ FFE9..FFEC ; Math 0828 ; Alphabetic 0829..082C ; Alphabetic 0840..0858 ; Alphabetic +0860..086A ; Alphabetic 08A0..08B4 ; Alphabetic 08B6..08BD ; Alphabetic 08D4..08DF ; Alphabetic @@ -379,6 +380,7 @@ FFE9..FFEC ; Math 09DF..09E1 ; Alphabetic 09E2..09E3 ; Alphabetic 09F0..09F1 ; Alphabetic +09FC ; Alphabetic 0A01..0A02 ; Alphabetic 0A03 ; Alphabetic 0A05..0A0A ; Alphabetic @@ -416,6 +418,7 @@ FFE9..FFEC ; Math 0AE0..0AE1 ; Alphabetic 0AE2..0AE3 ; Alphabetic 0AF9 ; Alphabetic +0AFA..0AFC ; Alphabetic 0B01 ; Alphabetic 0B02..0B03 ; Alphabetic 0B05..0B0C ; Alphabetic @@ -491,7 +494,7 @@ FFE9..FFEC ; Math 0CE0..0CE1 ; Alphabetic 0CE2..0CE3 ; Alphabetic 0CF1..0CF2 ; Alphabetic -0D01 ; Alphabetic +0D00..0D01 ; Alphabetic 0D02..0D03 ; Alphabetic 0D05..0D0C ; Alphabetic 0D0E..0D10 ; Alphabetic @@ -792,12 +795,12 @@ FFE9..FFEC ; Math 30A1..30FA ; Alphabetic 30FC..30FE ; Alphabetic 30FF ; Alphabetic -3105..312D ; Alphabetic +3105..312E ; Alphabetic 3131..318E ; Alphabetic 31A0..31BA ; Alphabetic 31F0..31FF ; Alphabetic 3400..4DB5 ; Alphabetic -4E00..9FD5 ; Alphabetic +4E00..9FEA ; Alphabetic A000..A014 ; Alphabetic A015 ; Alphabetic A016..A48C ; Alphabetic @@ -955,7 +958,7 @@ FFDA..FFDC ; Alphabetic 10280..1029C ; Alphabetic 102A0..102D0 ; Alphabetic 10300..1031F ; Alphabetic -10330..10340 ; Alphabetic +1032D..10340 ; Alphabetic 10341 ; Alphabetic 10342..10349 ; Alphabetic 1034A ; Alphabetic @@ -1115,6 +1118,23 @@ FFDA..FFDC ; Alphabetic 11727..1172A ; Alphabetic 118A0..118DF ; Alphabetic 118FF ; Alphabetic +11A00 ; Alphabetic +11A01..11A06 ; Alphabetic +11A07..11A08 ; Alphabetic +11A09..11A0A ; Alphabetic +11A0B..11A32 ; Alphabetic +11A35..11A38 ; Alphabetic +11A39 ; Alphabetic +11A3A ; Alphabetic +11A3B..11A3E ; Alphabetic +11A50 ; Alphabetic +11A51..11A56 ; Alphabetic +11A57..11A58 ; Alphabetic +11A59..11A5B ; Alphabetic +11A5C..11A83 ; Alphabetic +11A86..11A89 ; Alphabetic +11A8A..11A96 ; Alphabetic +11A97 ; Alphabetic 11AC0..11AF8 ; Alphabetic 11C00..11C08 ; Alphabetic 11C0A..11C2E ; Alphabetic @@ -1131,6 +1151,16 @@ FFDA..FFDC ; Alphabetic 11CB2..11CB3 ; Alphabetic 11CB4 ; Alphabetic 11CB5..11CB6 ; Alphabetic +11D00..11D06 ; Alphabetic +11D08..11D09 ; Alphabetic +11D0B..11D30 ; Alphabetic +11D31..11D36 ; Alphabetic +11D3A ; Alphabetic +11D3C..11D3D ; Alphabetic +11D3F..11D41 ; Alphabetic +11D43 ; Alphabetic +11D46 ; Alphabetic +11D47 ; Alphabetic 12000..12399 ; Alphabetic 12400..1246E ; Alphabetic 12480..12543 ; Alphabetic @@ -1148,10 +1178,11 @@ FFDA..FFDC ; Alphabetic 16F50 ; Alphabetic 16F51..16F7E ; Alphabetic 16F93..16F9F ; Alphabetic -16FE0 ; Alphabetic +16FE0..16FE1 ; Alphabetic 17000..187EC ; Alphabetic 18800..18AF2 ; Alphabetic -1B000..1B001 ; Alphabetic +1B000..1B11E ; Alphabetic +1B170..1B2FB ; Alphabetic 1BC00..1BC6A ; Alphabetic 1BC70..1BC7C ; Alphabetic 1BC80..1BC88 ; Alphabetic @@ -1235,9 +1266,10 @@ FFDA..FFDC ; Alphabetic 2A700..2B734 ; Alphabetic 2B740..2B81D ; Alphabetic 2B820..2CEA1 ; Alphabetic +2CEB0..2EBE0 ; Alphabetic 2F800..2FA1D ; Alphabetic -# Total code points: 118240 +# Total code points: 126629 # ================================================ @@ -2798,6 +2830,7 @@ FF41..FF5A ; Cased 0AC7..0AC8 ; Case_Ignorable 0ACD ; Case_Ignorable 0AE2..0AE3 ; Case_Ignorable +0AFA..0AFF ; Case_Ignorable 0B01 ; Case_Ignorable 0B3C ; Case_Ignorable 0B3F ; Case_Ignorable @@ -2820,7 +2853,8 @@ FF41..FF5A ; Cased 0CC6 ; Case_Ignorable 0CCC..0CCD ; Case_Ignorable 0CE2..0CE3 ; Case_Ignorable -0D01 ; Case_Ignorable +0D00..0D01 ; Case_Ignorable +0D3B..0D3C ; Case_Ignorable 0D41..0D44 ; Case_Ignorable 0D4D ; Case_Ignorable 0D62..0D63 ; Case_Ignorable @@ -2916,7 +2950,7 @@ FF41..FF5A ; Cased 1D2C..1D6A ; Case_Ignorable 1D78 ; Case_Ignorable 1D9B..1DBF ; Case_Ignorable -1DC0..1DF5 ; Case_Ignorable +1DC0..1DF9 ; Case_Ignorable 1DFB..1DFF ; Case_Ignorable 1FBD ; Case_Ignorable 1FBF..1FC1 ; Case_Ignorable @@ -3078,6 +3112,15 @@ FFF9..FFFB ; Case_Ignorable 1171D..1171F ; Case_Ignorable 11722..11725 ; Case_Ignorable 11727..1172B ; Case_Ignorable +11A01..11A06 ; Case_Ignorable +11A09..11A0A ; Case_Ignorable +11A33..11A38 ; Case_Ignorable +11A3B..11A3E ; Case_Ignorable +11A47 ; Case_Ignorable +11A51..11A56 ; Case_Ignorable +11A59..11A5B ; Case_Ignorable +11A8A..11A96 ; Case_Ignorable +11A98..11A99 ; Case_Ignorable 11C30..11C36 ; Case_Ignorable 11C38..11C3D ; Case_Ignorable 11C3F ; Case_Ignorable @@ -3085,12 +3128,17 @@ FFF9..FFFB ; Case_Ignorable 11CAA..11CB0 ; Case_Ignorable 11CB2..11CB3 ; Case_Ignorable 11CB5..11CB6 ; Case_Ignorable +11D31..11D36 ; Case_Ignorable +11D3A ; Case_Ignorable +11D3C..11D3D ; Case_Ignorable +11D3F..11D45 ; Case_Ignorable +11D47 ; Case_Ignorable 16AF0..16AF4 ; Case_Ignorable 16B30..16B36 ; Case_Ignorable 16B40..16B43 ; Case_Ignorable 16F8F..16F92 ; Case_Ignorable 16F93..16F9F ; Case_Ignorable -16FE0 ; Case_Ignorable +16FE0..16FE1 ; Case_Ignorable 1BC9D..1BC9E ; Case_Ignorable 1BCA0..1BCA3 ; Case_Ignorable 1D167..1D169 ; Case_Ignorable @@ -3117,7 +3165,7 @@ E0001 ; Case_Ignorable E0020..E007F ; Case_Ignorable E0100..E01EF ; Case_Ignorable -# Total code points: 2240 +# Total code points: 2314 # ================================================ @@ -5763,6 +5811,7 @@ FF41..FF5A ; Changes_When_Casemapped 0824 ; ID_Start 0828 ; ID_Start 0840..0858 ; ID_Start +0860..086A ; ID_Start 08A0..08B4 ; ID_Start 08B6..08BD ; ID_Start 0904..0939 ; ID_Start @@ -5782,6 +5831,7 @@ FF41..FF5A ; Changes_When_Casemapped 09DC..09DD ; ID_Start 09DF..09E1 ; ID_Start 09F0..09F1 ; ID_Start +09FC ; ID_Start 0A05..0A0A ; ID_Start 0A0F..0A10 ; ID_Start 0A13..0A28 ; ID_Start @@ -6039,12 +6089,12 @@ FF41..FF5A ; Changes_When_Casemapped 30A1..30FA ; ID_Start 30FC..30FE ; ID_Start 30FF ; ID_Start -3105..312D ; ID_Start +3105..312E ; ID_Start 3131..318E ; ID_Start 31A0..31BA ; ID_Start 31F0..31FF ; ID_Start 3400..4DB5 ; ID_Start -4E00..9FD5 ; ID_Start +4E00..9FEA ; ID_Start A000..A014 ; ID_Start A015 ; ID_Start A016..A48C ; ID_Start @@ -6162,7 +6212,7 @@ FFDA..FFDC ; ID_Start 10280..1029C ; ID_Start 102A0..102D0 ; ID_Start 10300..1031F ; ID_Start -10330..10340 ; ID_Start +1032D..10340 ; ID_Start 10341 ; ID_Start 10342..10349 ; ID_Start 1034A ; ID_Start @@ -6249,11 +6299,21 @@ FFDA..FFDC ; ID_Start 11700..11719 ; ID_Start 118A0..118DF ; ID_Start 118FF ; ID_Start +11A00 ; ID_Start +11A0B..11A32 ; ID_Start +11A3A ; ID_Start +11A50 ; ID_Start +11A5C..11A83 ; ID_Start +11A86..11A89 ; ID_Start 11AC0..11AF8 ; ID_Start 11C00..11C08 ; ID_Start 11C0A..11C2E ; ID_Start 11C40 ; ID_Start 11C72..11C8F ; ID_Start +11D00..11D06 ; ID_Start +11D08..11D09 ; ID_Start +11D0B..11D30 ; ID_Start +11D46 ; ID_Start 12000..12399 ; ID_Start 12400..1246E ; ID_Start 12480..12543 ; ID_Start @@ -6269,10 +6329,11 @@ FFDA..FFDC ; ID_Start 16F00..16F44 ; ID_Start 16F50 ; ID_Start 16F93..16F9F ; ID_Start -16FE0 ; ID_Start +16FE0..16FE1 ; ID_Start 17000..187EC ; ID_Start 18800..18AF2 ; ID_Start -1B000..1B001 ; ID_Start +1B000..1B11E ; ID_Start +1B170..1B2FB ; ID_Start 1BC00..1BC6A ; ID_Start 1BC70..1BC7C ; ID_Start 1BC80..1BC88 ; ID_Start @@ -6346,9 +6407,10 @@ FFDA..FFDC ; ID_Start 2A700..2B734 ; ID_Start 2B740..2B81D ; ID_Start 2B820..2CEA1 ; ID_Start +2CEB0..2EBE0 ; ID_Start 2F800..2FA1D ; ID_Start -# Total code points: 117007 +# Total code points: 125334 # ================================================ @@ -6451,6 +6513,7 @@ FFDA..FFDC ; ID_Start 0829..082D ; ID_Continue 0840..0858 ; ID_Continue 0859..085B ; ID_Continue +0860..086A ; ID_Continue 08A0..08B4 ; ID_Continue 08B6..08BD ; ID_Continue 08D4..08E1 ; ID_Continue @@ -6495,6 +6558,7 @@ FFDA..FFDC ; ID_Start 09E2..09E3 ; ID_Continue 09E6..09EF ; ID_Continue 09F0..09F1 ; ID_Continue +09FC ; ID_Continue 0A01..0A02 ; ID_Continue 0A03 ; ID_Continue 0A05..0A0A ; ID_Continue @@ -6537,6 +6601,7 @@ FFDA..FFDC ; ID_Start 0AE2..0AE3 ; ID_Continue 0AE6..0AEF ; ID_Continue 0AF9 ; ID_Continue +0AFA..0AFF ; ID_Continue 0B01 ; ID_Continue 0B02..0B03 ; ID_Continue 0B05..0B0C ; ID_Continue @@ -6620,11 +6685,12 @@ FFDA..FFDC ; ID_Start 0CE2..0CE3 ; ID_Continue 0CE6..0CEF ; ID_Continue 0CF1..0CF2 ; ID_Continue -0D01 ; ID_Continue +0D00..0D01 ; ID_Continue 0D02..0D03 ; ID_Continue 0D05..0D0C ; ID_Continue 0D0E..0D10 ; ID_Continue 0D12..0D3A ; ID_Continue +0D3B..0D3C ; ID_Continue 0D3D ; ID_Continue 0D3E..0D40 ; ID_Continue 0D41..0D44 ; ID_Continue @@ -6888,6 +6954,7 @@ FFDA..FFDC ; ID_Start 1CF2..1CF3 ; ID_Continue 1CF4 ; ID_Continue 1CF5..1CF6 ; ID_Continue +1CF7 ; ID_Continue 1CF8..1CF9 ; ID_Continue 1D00..1D2B ; ID_Continue 1D2C..1D6A ; ID_Continue @@ -6895,7 +6962,7 @@ FFDA..FFDC ; ID_Start 1D78 ; ID_Continue 1D79..1D9A ; ID_Continue 1D9B..1DBF ; ID_Continue -1DC0..1DF5 ; ID_Continue +1DC0..1DF9 ; ID_Continue 1DFB..1DFF ; ID_Continue 1E00..1F15 ; ID_Continue 1F18..1F1D ; ID_Continue @@ -6986,12 +7053,12 @@ FFDA..FFDC ; ID_Start 30A1..30FA ; ID_Continue 30FC..30FE ; ID_Continue 30FF ; ID_Continue -3105..312D ; ID_Continue +3105..312E ; ID_Continue 3131..318E ; ID_Continue 31A0..31BA ; ID_Continue 31F0..31FF ; ID_Continue 3400..4DB5 ; ID_Continue -4E00..9FD5 ; ID_Continue +4E00..9FEA ; ID_Continue A000..A014 ; ID_Continue A015 ; ID_Continue A016..A48C ; ID_Continue @@ -7179,7 +7246,7 @@ FFDA..FFDC ; ID_Continue 102A0..102D0 ; ID_Continue 102E0 ; ID_Continue 10300..1031F ; ID_Continue -10330..10340 ; ID_Continue +1032D..10340 ; ID_Continue 10341 ; ID_Continue 10342..10349 ; ID_Continue 1034A ; ID_Continue @@ -7367,6 +7434,25 @@ FFDA..FFDC ; ID_Continue 118A0..118DF ; ID_Continue 118E0..118E9 ; ID_Continue 118FF ; ID_Continue +11A00 ; ID_Continue +11A01..11A06 ; ID_Continue +11A07..11A08 ; ID_Continue +11A09..11A0A ; ID_Continue +11A0B..11A32 ; ID_Continue +11A33..11A38 ; ID_Continue +11A39 ; ID_Continue +11A3A ; ID_Continue +11A3B..11A3E ; ID_Continue +11A47 ; ID_Continue +11A50 ; ID_Continue +11A51..11A56 ; ID_Continue +11A57..11A58 ; ID_Continue +11A59..11A5B ; ID_Continue +11A5C..11A83 ; ID_Continue +11A86..11A89 ; ID_Continue +11A8A..11A96 ; ID_Continue +11A97 ; ID_Continue +11A98..11A99 ; ID_Continue 11AC0..11AF8 ; ID_Continue 11C00..11C08 ; ID_Continue 11C0A..11C2E ; ID_Continue @@ -7385,6 +7471,16 @@ FFDA..FFDC ; ID_Continue 11CB2..11CB3 ; ID_Continue 11CB4 ; ID_Continue 11CB5..11CB6 ; ID_Continue +11D00..11D06 ; ID_Continue +11D08..11D09 ; ID_Continue +11D0B..11D30 ; ID_Continue +11D31..11D36 ; ID_Continue +11D3A ; ID_Continue +11D3C..11D3D ; ID_Continue +11D3F..11D45 ; ID_Continue +11D46 ; ID_Continue +11D47 ; ID_Continue +11D50..11D59 ; ID_Continue 12000..12399 ; ID_Continue 12400..1246E ; ID_Continue 12480..12543 ; ID_Continue @@ -7406,10 +7502,11 @@ FFDA..FFDC ; ID_Continue 16F51..16F7E ; ID_Continue 16F8F..16F92 ; ID_Continue 16F93..16F9F ; ID_Continue -16FE0 ; ID_Continue +16FE0..16FE1 ; ID_Continue 17000..187EC ; ID_Continue 18800..18AF2 ; ID_Continue -1B000..1B001 ; ID_Continue +1B000..1B11E ; ID_Continue +1B170..1B2FB ; ID_Continue 1BC00..1BC6A ; ID_Continue 1BC70..1BC7C ; ID_Continue 1BC80..1BC88 ; ID_Continue @@ -7506,10 +7603,11 @@ FFDA..FFDC ; ID_Continue 2A700..2B734 ; ID_Continue 2B740..2B81D ; ID_Continue 2B820..2CEA1 ; ID_Continue +2CEB0..2EBE0 ; ID_Continue 2F800..2FA1D ; ID_Continue E0100..E01EF ; ID_Continue -# Total code points: 119691 +# Total code points: 128108 # ================================================ @@ -7578,6 +7676,7 @@ E0100..E01EF ; ID_Continue 0824 ; XID_Start 0828 ; XID_Start 0840..0858 ; XID_Start +0860..086A ; XID_Start 08A0..08B4 ; XID_Start 08B6..08BD ; XID_Start 0904..0939 ; XID_Start @@ -7597,6 +7696,7 @@ E0100..E01EF ; ID_Continue 09DC..09DD ; XID_Start 09DF..09E1 ; XID_Start 09F0..09F1 ; XID_Start +09FC ; XID_Start 0A05..0A0A ; XID_Start 0A0F..0A10 ; XID_Start 0A13..0A28 ; XID_Start @@ -7853,12 +7953,12 @@ E0100..E01EF ; ID_Continue 30A1..30FA ; XID_Start 30FC..30FE ; XID_Start 30FF ; XID_Start -3105..312D ; XID_Start +3105..312E ; XID_Start 3131..318E ; XID_Start 31A0..31BA ; XID_Start 31F0..31FF ; XID_Start 3400..4DB5 ; XID_Start -4E00..9FD5 ; XID_Start +4E00..9FEA ; XID_Start A000..A014 ; XID_Start A015 ; XID_Start A016..A48C ; XID_Start @@ -7981,7 +8081,7 @@ FFDA..FFDC ; XID_Start 10280..1029C ; XID_Start 102A0..102D0 ; XID_Start 10300..1031F ; XID_Start -10330..10340 ; XID_Start +1032D..10340 ; XID_Start 10341 ; XID_Start 10342..10349 ; XID_Start 1034A ; XID_Start @@ -8068,11 +8168,21 @@ FFDA..FFDC ; XID_Start 11700..11719 ; XID_Start 118A0..118DF ; XID_Start 118FF ; XID_Start +11A00 ; XID_Start +11A0B..11A32 ; XID_Start +11A3A ; XID_Start +11A50 ; XID_Start +11A5C..11A83 ; XID_Start +11A86..11A89 ; XID_Start 11AC0..11AF8 ; XID_Start 11C00..11C08 ; XID_Start 11C0A..11C2E ; XID_Start 11C40 ; XID_Start 11C72..11C8F ; XID_Start +11D00..11D06 ; XID_Start +11D08..11D09 ; XID_Start +11D0B..11D30 ; XID_Start +11D46 ; XID_Start 12000..12399 ; XID_Start 12400..1246E ; XID_Start 12480..12543 ; XID_Start @@ -8088,10 +8198,11 @@ FFDA..FFDC ; XID_Start 16F00..16F44 ; XID_Start 16F50 ; XID_Start 16F93..16F9F ; XID_Start -16FE0 ; XID_Start +16FE0..16FE1 ; XID_Start 17000..187EC ; XID_Start 18800..18AF2 ; XID_Start -1B000..1B001 ; XID_Start +1B000..1B11E ; XID_Start +1B170..1B2FB ; XID_Start 1BC00..1BC6A ; XID_Start 1BC70..1BC7C ; XID_Start 1BC80..1BC88 ; XID_Start @@ -8165,9 +8276,10 @@ FFDA..FFDC ; XID_Start 2A700..2B734 ; XID_Start 2B740..2B81D ; XID_Start 2B820..2CEA1 ; XID_Start +2CEB0..2EBE0 ; XID_Start 2F800..2FA1D ; XID_Start -# Total code points: 116984 +# Total code points: 125311 # ================================================ @@ -8266,6 +8378,7 @@ FFDA..FFDC ; XID_Start 0829..082D ; XID_Continue 0840..0858 ; XID_Continue 0859..085B ; XID_Continue +0860..086A ; XID_Continue 08A0..08B4 ; XID_Continue 08B6..08BD ; XID_Continue 08D4..08E1 ; XID_Continue @@ -8310,6 +8423,7 @@ FFDA..FFDC ; XID_Start 09E2..09E3 ; XID_Continue 09E6..09EF ; XID_Continue 09F0..09F1 ; XID_Continue +09FC ; XID_Continue 0A01..0A02 ; XID_Continue 0A03 ; XID_Continue 0A05..0A0A ; XID_Continue @@ -8352,6 +8466,7 @@ FFDA..FFDC ; XID_Start 0AE2..0AE3 ; XID_Continue 0AE6..0AEF ; XID_Continue 0AF9 ; XID_Continue +0AFA..0AFF ; XID_Continue 0B01 ; XID_Continue 0B02..0B03 ; XID_Continue 0B05..0B0C ; XID_Continue @@ -8435,11 +8550,12 @@ FFDA..FFDC ; XID_Start 0CE2..0CE3 ; XID_Continue 0CE6..0CEF ; XID_Continue 0CF1..0CF2 ; XID_Continue -0D01 ; XID_Continue +0D00..0D01 ; XID_Continue 0D02..0D03 ; XID_Continue 0D05..0D0C ; XID_Continue 0D0E..0D10 ; XID_Continue 0D12..0D3A ; XID_Continue +0D3B..0D3C ; XID_Continue 0D3D ; XID_Continue 0D3E..0D40 ; XID_Continue 0D41..0D44 ; XID_Continue @@ -8703,6 +8819,7 @@ FFDA..FFDC ; XID_Start 1CF2..1CF3 ; XID_Continue 1CF4 ; XID_Continue 1CF5..1CF6 ; XID_Continue +1CF7 ; XID_Continue 1CF8..1CF9 ; XID_Continue 1D00..1D2B ; XID_Continue 1D2C..1D6A ; XID_Continue @@ -8710,7 +8827,7 @@ FFDA..FFDC ; XID_Start 1D78 ; XID_Continue 1D79..1D9A ; XID_Continue 1D9B..1DBF ; XID_Continue -1DC0..1DF5 ; XID_Continue +1DC0..1DF9 ; XID_Continue 1DFB..1DFF ; XID_Continue 1E00..1F15 ; XID_Continue 1F18..1F1D ; XID_Continue @@ -8800,12 +8917,12 @@ FFDA..FFDC ; XID_Start 30A1..30FA ; XID_Continue 30FC..30FE ; XID_Continue 30FF ; XID_Continue -3105..312D ; XID_Continue +3105..312E ; XID_Continue 3131..318E ; XID_Continue 31A0..31BA ; XID_Continue 31F0..31FF ; XID_Continue 3400..4DB5 ; XID_Continue -4E00..9FD5 ; XID_Continue +4E00..9FEA ; XID_Continue A000..A014 ; XID_Continue A015 ; XID_Continue A016..A48C ; XID_Continue @@ -8999,7 +9116,7 @@ FFDA..FFDC ; XID_Continue 102A0..102D0 ; XID_Continue 102E0 ; XID_Continue 10300..1031F ; XID_Continue -10330..10340 ; XID_Continue +1032D..10340 ; XID_Continue 10341 ; XID_Continue 10342..10349 ; XID_Continue 1034A ; XID_Continue @@ -9187,6 +9304,25 @@ FFDA..FFDC ; XID_Continue 118A0..118DF ; XID_Continue 118E0..118E9 ; XID_Continue 118FF ; XID_Continue +11A00 ; XID_Continue +11A01..11A06 ; XID_Continue +11A07..11A08 ; XID_Continue +11A09..11A0A ; XID_Continue +11A0B..11A32 ; XID_Continue +11A33..11A38 ; XID_Continue +11A39 ; XID_Continue +11A3A ; XID_Continue +11A3B..11A3E ; XID_Continue +11A47 ; XID_Continue +11A50 ; XID_Continue +11A51..11A56 ; XID_Continue +11A57..11A58 ; XID_Continue +11A59..11A5B ; XID_Continue +11A5C..11A83 ; XID_Continue +11A86..11A89 ; XID_Continue +11A8A..11A96 ; XID_Continue +11A97 ; XID_Continue +11A98..11A99 ; XID_Continue 11AC0..11AF8 ; XID_Continue 11C00..11C08 ; XID_Continue 11C0A..11C2E ; XID_Continue @@ -9205,6 +9341,16 @@ FFDA..FFDC ; XID_Continue 11CB2..11CB3 ; XID_Continue 11CB4 ; XID_Continue 11CB5..11CB6 ; XID_Continue +11D00..11D06 ; XID_Continue +11D08..11D09 ; XID_Continue +11D0B..11D30 ; XID_Continue +11D31..11D36 ; XID_Continue +11D3A ; XID_Continue +11D3C..11D3D ; XID_Continue +11D3F..11D45 ; XID_Continue +11D46 ; XID_Continue +11D47 ; XID_Continue +11D50..11D59 ; XID_Continue 12000..12399 ; XID_Continue 12400..1246E ; XID_Continue 12480..12543 ; XID_Continue @@ -9226,10 +9372,11 @@ FFDA..FFDC ; XID_Continue 16F51..16F7E ; XID_Continue 16F8F..16F92 ; XID_Continue 16F93..16F9F ; XID_Continue -16FE0 ; XID_Continue +16FE0..16FE1 ; XID_Continue 17000..187EC ; XID_Continue 18800..18AF2 ; XID_Continue -1B000..1B001 ; XID_Continue +1B000..1B11E ; XID_Continue +1B170..1B2FB ; XID_Continue 1BC00..1BC6A ; XID_Continue 1BC70..1BC7C ; XID_Continue 1BC80..1BC88 ; XID_Continue @@ -9326,10 +9473,11 @@ FFDA..FFDC ; XID_Continue 2A700..2B734 ; XID_Continue 2B740..2B81D ; XID_Continue 2B820..2CEA1 ; XID_Continue +2CEB0..2EBE0 ; XID_Continue 2F800..2FA1D ; XID_Continue E0100..E01EF ; XID_Continue -# Total code points: 119672 +# Total code points: 128089 # ================================================ @@ -9339,8 +9487,8 @@ E0100..E01EF ; XID_Continue # + Cf (Format characters) # + Variation_Selector # - White_Space -# - FFF9..FFFB (Annotation Characters) -# - 0600..0605, 06DD, 070F, 08E2, 110BD (exceptional Cf characters that should be visible) +# - FFF9..FFFB (Annotation characters) +# - Prepended_Concatenation_Mark (Exceptional format characters that should be visible) 00AD ; Default_Ignorable_Code_Point 034F ; Default_Ignorable_Code_Point @@ -9431,6 +9579,7 @@ E01F0..E0FFF ; Default_Ignorable_Code_Point 0AC7..0AC8 ; Grapheme_Extend 0ACD ; Grapheme_Extend 0AE2..0AE3 ; Grapheme_Extend +0AFA..0AFF ; Grapheme_Extend 0B01 ; Grapheme_Extend 0B3C ; Grapheme_Extend 0B3E ; Grapheme_Extend @@ -9459,7 +9608,8 @@ E01F0..E0FFF ; Default_Ignorable_Code_Point 0CCC..0CCD ; Grapheme_Extend 0CD5..0CD6 ; Grapheme_Extend 0CE2..0CE3 ; Grapheme_Extend -0D01 ; Grapheme_Extend +0D00..0D01 ; Grapheme_Extend +0D3B..0D3C ; Grapheme_Extend 0D3E ; Grapheme_Extend 0D41..0D44 ; Grapheme_Extend 0D4D ; Grapheme_Extend @@ -9548,7 +9698,7 @@ E01F0..E0FFF ; Default_Ignorable_Code_Point 1CED ; Grapheme_Extend 1CF4 ; Grapheme_Extend 1CF8..1CF9 ; Grapheme_Extend -1DC0..1DF5 ; Grapheme_Extend +1DC0..1DF9 ; Grapheme_Extend 1DFB..1DFF ; Grapheme_Extend 200C ; Grapheme_Extend 20D0..20DC ; Grapheme_Extend @@ -9658,6 +9808,15 @@ FF9E..FF9F ; Grapheme_Extend 1171D..1171F ; Grapheme_Extend 11722..11725 ; Grapheme_Extend 11727..1172B ; Grapheme_Extend +11A01..11A06 ; Grapheme_Extend +11A09..11A0A ; Grapheme_Extend +11A33..11A38 ; Grapheme_Extend +11A3B..11A3E ; Grapheme_Extend +11A47 ; Grapheme_Extend +11A51..11A56 ; Grapheme_Extend +11A59..11A5B ; Grapheme_Extend +11A8A..11A96 ; Grapheme_Extend +11A98..11A99 ; Grapheme_Extend 11C30..11C36 ; Grapheme_Extend 11C38..11C3D ; Grapheme_Extend 11C3F ; Grapheme_Extend @@ -9665,6 +9824,11 @@ FF9E..FF9F ; Grapheme_Extend 11CAA..11CB0 ; Grapheme_Extend 11CB2..11CB3 ; Grapheme_Extend 11CB5..11CB6 ; Grapheme_Extend +11D31..11D36 ; Grapheme_Extend +11D3A ; Grapheme_Extend +11D3C..11D3D ; Grapheme_Extend +11D3F..11D45 ; Grapheme_Extend +11D47 ; Grapheme_Extend 16AF0..16AF4 ; Grapheme_Extend 16B30..16B36 ; Grapheme_Extend 16F8F..16F92 ; Grapheme_Extend @@ -9692,7 +9856,7 @@ FF9E..FF9F ; Grapheme_Extend E0020..E007F ; Grapheme_Extend E0100..E01EF ; Grapheme_Extend -# Total code points: 1828 +# Total code points: 1901 # ================================================ @@ -9849,6 +10013,7 @@ E0100..E01EF ; Grapheme_Extend 0830..083E ; Grapheme_Base 0840..0858 ; Grapheme_Base 085E ; Grapheme_Base +0860..086A ; Grapheme_Base 08A0..08B4 ; Grapheme_Base 08B6..08BD ; Grapheme_Base 0903 ; Grapheme_Base @@ -9885,6 +10050,8 @@ E0100..E01EF ; Grapheme_Extend 09F4..09F9 ; Grapheme_Base 09FA ; Grapheme_Base 09FB ; Grapheme_Base +09FC ; Grapheme_Base +09FD ; Grapheme_Base 0A03 ; Grapheme_Base 0A05..0A0A ; Grapheme_Base 0A0F..0A10 ; Grapheme_Base @@ -10227,6 +10394,7 @@ E0100..E01EF ; Grapheme_Extend 1CEE..1CF1 ; Grapheme_Base 1CF2..1CF3 ; Grapheme_Base 1CF5..1CF6 ; Grapheme_Base +1CF7 ; Grapheme_Base 1D00..1D2B ; Grapheme_Base 1D2C..1D6A ; Grapheme_Base 1D6B..1D77 ; Grapheme_Base @@ -10297,7 +10465,7 @@ E0100..E01EF ; Grapheme_Extend 208D ; Grapheme_Base 208E ; Grapheme_Base 2090..209C ; Grapheme_Base -20A0..20BE ; Grapheme_Base +20A0..20BF ; Grapheme_Base 2100..2101 ; Grapheme_Base 2102 ; Grapheme_Base 2103..2106 ; Grapheme_Base @@ -10371,8 +10539,7 @@ E0100..E01EF ; Grapheme_Extend 239B..23B3 ; Grapheme_Base 23B4..23DB ; Grapheme_Base 23DC..23E1 ; Grapheme_Base -23E2..23FE ; Grapheme_Base -2400..2426 ; Grapheme_Base +23E2..2426 ; Grapheme_Base 2440..244A ; Grapheme_Base 2460..249B ; Grapheme_Base 249C..24E9 ; Grapheme_Base @@ -10458,7 +10625,7 @@ E0100..E01EF ; Grapheme_Extend 2B76..2B95 ; Grapheme_Base 2B98..2BB9 ; Grapheme_Base 2BBD..2BC8 ; Grapheme_Base -2BCA..2BD1 ; Grapheme_Base +2BCA..2BD2 ; Grapheme_Base 2BEC..2BEF ; Grapheme_Base 2C00..2C2E ; Grapheme_Base 2C30..2C5E ; Grapheme_Base @@ -10523,7 +10690,7 @@ E0100..E01EF ; Grapheme_Extend 2E40 ; Grapheme_Base 2E41 ; Grapheme_Base 2E42 ; Grapheme_Base -2E43..2E44 ; Grapheme_Base +2E43..2E49 ; Grapheme_Base 2E80..2E99 ; Grapheme_Base 2E9B..2EF3 ; Grapheme_Base 2F00..2FD5 ; Grapheme_Base @@ -10575,7 +10742,7 @@ E0100..E01EF ; Grapheme_Extend 30FB ; Grapheme_Base 30FC..30FE ; Grapheme_Base 30FF ; Grapheme_Base -3105..312D ; Grapheme_Base +3105..312E ; Grapheme_Base 3131..318E ; Grapheme_Base 3190..3191 ; Grapheme_Base 3192..3195 ; Grapheme_Base @@ -10597,7 +10764,7 @@ E0100..E01EF ; Grapheme_Extend 3300..33FF ; Grapheme_Base 3400..4DB5 ; Grapheme_Base 4DC0..4DFF ; Grapheme_Base -4E00..9FD5 ; Grapheme_Base +4E00..9FEA ; Grapheme_Base A000..A014 ; Grapheme_Base A015 ; Grapheme_Base A016..A48C ; Grapheme_Base @@ -10871,7 +11038,7 @@ FFFC..FFFD ; Grapheme_Base 102E1..102FB ; Grapheme_Base 10300..1031F ; Grapheme_Base 10320..10323 ; Grapheme_Base -10330..10340 ; Grapheme_Base +1032D..10340 ; Grapheme_Base 10341 ; Grapheme_Base 10342..10349 ; Grapheme_Base 1034A ; Grapheme_Base @@ -11062,6 +11229,19 @@ FFFC..FFFD ; Grapheme_Base 118E0..118E9 ; Grapheme_Base 118EA..118F2 ; Grapheme_Base 118FF ; Grapheme_Base +11A00 ; Grapheme_Base +11A07..11A08 ; Grapheme_Base +11A0B..11A32 ; Grapheme_Base +11A39 ; Grapheme_Base +11A3A ; Grapheme_Base +11A3F..11A46 ; Grapheme_Base +11A50 ; Grapheme_Base +11A57..11A58 ; Grapheme_Base +11A5C..11A83 ; Grapheme_Base +11A86..11A89 ; Grapheme_Base +11A97 ; Grapheme_Base +11A9A..11A9C ; Grapheme_Base +11A9E..11AA2 ; Grapheme_Base 11AC0..11AF8 ; Grapheme_Base 11C00..11C08 ; Grapheme_Base 11C0A..11C2E ; Grapheme_Base @@ -11076,6 +11256,11 @@ FFFC..FFFD ; Grapheme_Base 11CA9 ; Grapheme_Base 11CB1 ; Grapheme_Base 11CB4 ; Grapheme_Base +11D00..11D06 ; Grapheme_Base +11D08..11D09 ; Grapheme_Base +11D0B..11D30 ; Grapheme_Base +11D46 ; Grapheme_Base +11D50..11D59 ; Grapheme_Base 12000..12399 ; Grapheme_Base 12400..1246E ; Grapheme_Base 12470..12474 ; Grapheme_Base @@ -11102,10 +11287,11 @@ FFFC..FFFD ; Grapheme_Base 16F50 ; Grapheme_Base 16F51..16F7E ; Grapheme_Base 16F93..16F9F ; Grapheme_Base -16FE0 ; Grapheme_Base +16FE0..16FE1 ; Grapheme_Base 17000..187EC ; Grapheme_Base 18800..18AF2 ; Grapheme_Base -1B000..1B001 ; Grapheme_Base +1B000..1B11E ; Grapheme_Base +1B170..1B2FB ; Grapheme_Base 1BC00..1BC6A ; Grapheme_Base 1BC70..1BC7C ; Grapheme_Base 1BC80..1BC88 ; Grapheme_Base @@ -11225,11 +11411,12 @@ FFFC..FFFD ; Grapheme_Base 1F210..1F23B ; Grapheme_Base 1F240..1F248 ; Grapheme_Base 1F250..1F251 ; Grapheme_Base +1F260..1F265 ; Grapheme_Base 1F300..1F3FA ; Grapheme_Base 1F3FB..1F3FF ; Grapheme_Base -1F400..1F6D2 ; Grapheme_Base +1F400..1F6D4 ; Grapheme_Base 1F6E0..1F6EC ; Grapheme_Base -1F6F0..1F6F6 ; Grapheme_Base +1F6F0..1F6F8 ; Grapheme_Base 1F700..1F773 ; Grapheme_Base 1F780..1F7D4 ; Grapheme_Base 1F800..1F80B ; Grapheme_Base @@ -11237,21 +11424,21 @@ FFFC..FFFD ; Grapheme_Base 1F850..1F859 ; Grapheme_Base 1F860..1F887 ; Grapheme_Base 1F890..1F8AD ; Grapheme_Base -1F910..1F91E ; Grapheme_Base -1F920..1F927 ; Grapheme_Base -1F930 ; Grapheme_Base -1F933..1F93E ; Grapheme_Base -1F940..1F94B ; Grapheme_Base -1F950..1F95E ; Grapheme_Base -1F980..1F991 ; Grapheme_Base +1F900..1F90B ; Grapheme_Base +1F910..1F93E ; Grapheme_Base +1F940..1F94C ; Grapheme_Base +1F950..1F96B ; Grapheme_Base +1F980..1F997 ; Grapheme_Base 1F9C0 ; Grapheme_Base +1F9D0..1F9E6 ; Grapheme_Base 20000..2A6D6 ; Grapheme_Base 2A700..2B734 ; Grapheme_Base 2B740..2B81D ; Grapheme_Base 2B820..2CEA1 ; Grapheme_Base +2CEB0..2EBE0 ; Grapheme_Base 2F800..2FA1D ; Grapheme_Base -# Total code points: 126288 +# Total code points: 134733 # ================================================ @@ -11267,6 +11454,7 @@ FFFC..FFFD ; Grapheme_Base 0BCD ; Grapheme_Link 0C4D ; Grapheme_Link 0CCD ; Grapheme_Link +0D3B..0D3C ; Grapheme_Link 0D4D ; Grapheme_Link 0DCA ; Grapheme_Link 0E3A ; Grapheme_Link @@ -11302,8 +11490,12 @@ ABED ; Grapheme_Link 1163F ; Grapheme_Link 116B6 ; Grapheme_Link 1172B ; Grapheme_Link +11A34 ; Grapheme_Link +11A47 ; Grapheme_Link +11A99 ; Grapheme_Link 11C3F ; Grapheme_Link +11D44..11D45 ; Grapheme_Link -# Total code points: 47 +# Total code points: 54 # EOF diff --git a/Build/source/libs/icu/icu-src/source/data/unidata/DerivedNormalizationProps.txt b/Build/source/libs/icu/icu-src/source/data/unidata/DerivedNormalizationProps.txt index 8a8dd662792..6a8adda9f91 100644 --- a/Build/source/libs/icu/icu-src/source/data/unidata/DerivedNormalizationProps.txt +++ b/Build/source/libs/icu/icu-src/source/data/unidata/DerivedNormalizationProps.txt @@ -1,6 +1,6 @@ -# DerivedNormalizationProps-9.0.0.txt -# Date: 2016-03-02, 18:54:59 GMT -# © 2016 Unicode®, Inc. +# DerivedNormalizationProps-10.0.0.txt +# Date: 2017-02-14, 04:26:07 GMT +# © 2017 Unicode®, Inc. # Unicode and the Unicode Logo are registered trademarks of Unicode, Inc. in the U.S. and other countries. # For terms of use, see http://www.unicode.org/terms_of_use.html # diff --git a/Build/source/libs/icu/icu-src/source/data/unidata/FractionalUCA.txt b/Build/source/libs/icu/icu-src/source/data/unidata/FractionalUCA.txt index dbc3985d91a..bff4282645f 100644 --- a/Build/source/libs/icu/icu-src/source/data/unidata/FractionalUCA.txt +++ b/Build/source/libs/icu/icu-src/source/data/unidata/FractionalUCA.txt @@ -1,260 +1,258 @@ -# Copyright (C) 2016 and later: Unicode, Inc. and others. -# License & terms of use: http://www.unicode.org/copyright.html # Fractional UCA Table, generated from the UCA DUCET -# 2016-06-03 -# VERSION: UCA=9.0.0, UCD=9.0.0 +# 2017-06-05 +# VERSION: UCA=10.0.0, UCD=10.0.0 # For a description of the format and usage, see # http://www.unicode.org/reports/tr35/tr35-collation.html -[UCA version = 9.0.0] -# Unified_Ideograph: 80388 characters -[Unified_Ideograph 4E00..9FD5 FA0E..FA0F FA11 FA13..FA14 FA1F FA21 FA23..FA24 FA27..FA29 3400..4DB5 20000..2A6D6 2A700..2B734 2B740..2B81D 2B820..2CEA1] - -[radical 1=⼀一:一-丆𠀀-𠀂𫠠万-丌亐卄𠀃-𠀆𪜀𪜁𫝀不-专丗𠀇-𠀌𪜂𫠡且-世丘-丝㐀𠀍-𠀗𫠢𫠣丞-丢㐁㐂𠀘-𠀚𠀜𠀞-𠀠𫝁𫠤𫠥丣-严丽𠀡-𠀤𠀦-𠀨𠀪𠀫𫝂𫠦-𫠩並丧𠀬-𠀮𠀰-𠀴𪜃𫠪-𫠭𠀵𠀶𠀸𠀺𠀻𪜄𫠮𠀽-𠁀𠤢𪜅𫠯-𫠲𠁁-𠁅𪜆𫠳-𫠵𠁆-𠁈𠁊𠁋𫠶𠁌𠁍𫠷-𫠻𠁎-𠁒𫝃𫠼𫠽𠁓𠁔𫠾𫠿𠁕𠁗-𠁛𠁝𤳏𪜇𫡀𠁖𠁟𫡁𫡂𠁠] -[radical 2=⼁丨:丨丩𠁡𠁢个丫㐃㐄𫡃𫡄中-丰𠁣𪜈𫡅丱𠁥𠁦串𠁧𠁨𫡆丳𠁩-𠁬𫡇临𠁭-𠁯𪜉丵𠁰𠁱𫡈𫡉𠁳-𠁶𫡊𠁸𫡋𫡌𠁹𠁺𫡍𠁻𫡎] -[radical 3=⼂丶:丶丷𪜊丸义𠁼𠁽丹为𠁿主丼𠂀-𠂂𪜋举𠂃-𠂅] -[radical 4=⼃丿:丿-乄㐅𠂆-𠂊久-么乊𠂋-𠂎𫝄𫡏之乌尹𠂏-𠂓乍-乐𠂔-𠂡𫡐乑-乔㐆𠂢-𠂧𠂩-𠂫𠂭𪜌𫡑-𫡓乕𠂯𫡔乖𠂲𠂳𠂶𫡕-𫡘乗𠂴𠂷𪜍𫡙𫡚乘𠂹-𠂾𪜎𪜏𫡛𫡜𠂿-𠃂𫡝𠃃𠃄𫡞𠃆𠃅𠃇𫡟𫡠𠃈𫡡] -[radical 5=⼄乙:乙-乛𠃉-𠃎𠃑乜九龴𠃏𠃐乞-习㐇-㐉𠃒-𠃔乣-书㐊㐋𠁾𠃕-𠃝𫡢乧㐌-㐏𠃞-𠃣𪜐𫡣乨-买㐐-㐕𠃤-𠃨𪜑𫡤乱乲㐖-㐘𠃩𠃪𠃬𠧝𪜒𪜓𫡥-𫡧乳-乸㐙-㐛𠃭-𠃯𪜔𫡨乹-乼㐜-㐠𠂸𠃲-𠃷𪜕𫡩乽𠃸-𠃻𤱡𪜖𪜗𫡪-𫡬乾-亀㐡-㐣𠃼-𠄂𪜘𫡭𫡮亁㐤𥝀𪜙𪜚亂-亄𠄃𠄄𪜛𫡯𫡰𠄅-𠄈𢆡㐥𠄉㐦𠄊𠄋] -[radical 6=⼅亅:亅𠄌了𠄍-𠄐亇𠄑予㐧𠄒-𠄔争𠀩𠄕亊𠄖-𠄘𪜜事㐨𠄙-𠄛𪜝𠄜𠄝] -[radical 7=⼆二:二𠄞-𠄠亍-亏云-亖𠄡亗-亚𠄢-𠄧𫡱些亜𠀥𠄨-𠄪𫡲亝-亟㐩𠄫-𠄯𫡳𠄰-𠄳𠄵-𠄺𫡴𠄻-𠄾𫡵𫡶𠄿𪜞𫡷𠅀𪜟𫡸𫡹] -[radical 8=⼇亠:亠-亣𠅁𠅂𪜠𪜡交-产㐪㐫𠅃-𠅇𫝅亨-亪㐬𠅈-𠅋𪜢𫡺享京㐭𠅌-𠅒亭-亲𠅓-𠅕亳𠅖𠅘-𠅝𫡻𠅞-𠅧𪜣亴亵𠅨-𠅯𠅲𪜤𫡼亶亷㐮𠅳-𠅸𠅺-𠅼𠆀𫡽𫡾𠅾𠅿𫡿𫢀𠆁-𠆉𪜥亸𠆋-𠆒𠆔𠆖-𠆘㐯𫢁𫢂𠆚𠆝𪜦𫢃亹𠆞𫢄𠆟-𠆡] -[radical 9=⼈人:人亻𠆢亼-亿𠆣-𠆥𫢅什-仓𠆦-𠆨𪜧𫢆-𫢈仔-仭㐰-㐷𠆩-𠆭𠆯𠆰𠆳𫝆𫢉𫢊仮-伬佤㐸-㑀𠆴-𠇑𠇓-𠇕𪜨-𪜫𫢋-𫢐伭-佣佥-佨㑁-㑈𠇖-𠈁𪜬-𪜴𫢑-𫢘佩-侭鿇㑉-㑖𠈃-𠈣𠈥-𠈬𪜵-𪜺𫝇𫝈𫢙-𫢝侮-俭㑗-㑢𠈭-𠉢𪜻-𪝂𫢞-𫢩修-倿㑣㑥-㑭𠉣-𠊦𠋟𪝃-𪝊𫝉𫢪-𫢼偀-偿㑤㑮-㑲𠊧-𠋐𠋒-𠋞𠋠-𠋬𪝋-𪝕𫝊𫢽-𫣃傀-傩㑳-㑺𠋭-𠌅𠌇-𠌝𠌠-𠌩𪝖-𪝟𫣄-𫣐傪-働㑻-㒁𠌫-𠍡𠍣𠍤𠍦-𠍬𠎵𪝠-𪝤𫝋𫣑-𫣖僎-僱僳僴僷㒂-㒐𠍥𠍭-𠎗𠎙𠎚𠎝-𠎴𠏐𪝥-𪝪𫣗-𫣢僲僵僶僸-儏㒑-㒘𠎷-𠏏𠏑𠏔-𠏦𪝫-𪝯𫣣-𫣬儐-儞儫㒙-㒜𠏒𠏨-𠐇𪝰-𪝳𫣭-𫣱償-優儬㒝㒞𠐈-𠐛𠐝-𠐢𪝴-𪝶𫣲-𫣸儭-儲㒟㒠𠐣-𠐺𪝷-𪝹𫣹-𫤃儳-儵㒡-㒣𠐻-𠑁𠑃-𠑌𪝺-𪝼𫤄-𫤈儶㒤-㒦𠑍-𠑖𠑞𪝽𫤉-𫤋儷-儺㒧㒨𠑗-𠑝𠑟-𠑣𪝾𫤌-𫤑儻儼𠑤-𠑩儽㒩𠑪-𠑯𫤒-𫤔儾𠑰𫤕𫤖㒪𠑲𠑳𠑵] -[radical 10=⼉儿:儿-元𠑶兄𠑷𠑸充-兊㒫𠑹-𠑼𫤗克-兑𠑽-𠒂兒-兖㒬𠒃-𠒋𪝿𫤘兗-兙𠒌-𠒏𪞀𫝌𫤙党兛㒭𠒐-𠒖𪞁兜-兞㒮𠒗-𠒝𫤚𫤛兟兠𠒞-𠒣𫤜𫤝兡𠒤-𠒦𪞂𫤞兢𠒧-𠒯𫤟𫤠𠒰-𠒲𠒴-𠒷𪞃-𪞅兣𠒳𠒸-𠓅𠓇𫤡𫤢㒯𠓆𠓈-𠓊𫤣-𫤦𠓋𠓎𪞆𫤧𠓍𠓏𠓐兤𠓑-𠓔𫤨𠓕-𠓚] -[radical 11=⼊入:入兦𠓛內𠓜-𠓞㒰㒱𠓟全氽㒲𠇒𠓠-𠓣㒳㒴𠓤-𠓨兩𠓩兪𠓪-𠓰𪞇𫤩𠓱𠌆𠓲𠓳𫤪𠓴-𠓿] -[radical 12=⼋八:八𠔀公-兯𠔁-𠔄兰𠔅𠔆共-兴龹𠔈𠔉𪞈𫤫𫤬兵㒵-㒷𠔊-𠔏其-典𠔐𠔑𠩖𫤭兹养㒸𠔒-𠔗兺兼𠔙-𠔛𫤮𫤯兽𠔜𠔝𫤰𠔞-𠔧𪞉𫤱兾兿𠔨-𠔮𪞊𫤲𠔯-𠔱𠭻𪞋𪞌冀𠔳-𠔵𪞍𠁜冁𠔶𠔷𫤳𠔸-𠔺𫤴𫤵㒹𫤶] -[radical 13=⼌冂:冂𠔼冃-冈𠔽-𠕀冉-册𠕁-𠕊再冎𠕋-𠕏冏𠕐-𠕕𪞎冐㒺𠕖-𠕚冑冒𠕛𠕜𫝍冓冔𠕝-𠕟冕㒻㒼𠕠-𠕢最㒽𠕣-𠕥㒾𠕦𠕧𫤷𠕨-𠕪𠕬-𠕱㒿𠕲] -[radical 14=⼍冖:冖-冘㓀㓁𠕳𠕴写冚𠕵-𠕸军农𠕹-𠕿冝𠖀-𠖃𪞏𪞐𫤸冞𠖄-𠖆𪞑冟冠㓂𠖇-𠖋𫤹𫤺冡-冧𠖌-𠖒𪞒冨𠖓𪞓㓃𠖔-𠖙𪞔𠖚𠖛冩𠖜-𠖞𪞕㓄𫤻冪𠖠-𠖥𫤼𠖦-𠖨𫤽𠖩-𠖫] -[radical 15=⼎冫:冫𠖬𫤾㓅𠖭冬-冯𠖮-𠖰𪞖𫤿冰-冴㓆㓇𠖱-𠖶𪞗-𪞚𫥀-𫥃况-冻鿑㓈𠖷-𠖿𠗁𪞛-𪞝𫥄-𫥈冼-净㓉-㓍𠗀𠗂-𠗇𪞞𫥉-𫥋凁-凃㓎㓏𠗈-𠗗𪞟-𪞡𫝎𫥌-𫥎凄-凎㓐-㓒𠗘-𠗤𪞢-𪞥𫥏𫥐减-凑㓓𠗥-𠗰𪞦-𪞨𫝏𫥑-𫥔凒-凖㓔㓕𠗱-𠗹𪞩𪞪𫥕𫥖凗㓖𠗺-𠘃𪞫𪞬𫥗𫥘凘㓗𠘄-𠘉𠘓𪞭𫥙凙-凜𠘊-𠘑𪞮𫥚-𫥜凝凞𠘒𠘔𠘕𪞯凟𠘖-𠘜𥂳𠘝-𠘡𫥝𠘢𠘣𪞰𠘤-𠘦] -[radical 16=⼏几:几𠘧𠘨凡-凤𠘩-𠘰凥-凧𠘱-𠘴凨-凫𠘵-𠘻𪞱𫥞𫥟凬𠘼-𠙅𪞲凭-凯𠙆-𠙎𠫮𠙏-𠙖𪞳𫥠凰㓘𠙘𠙙𠙛-𠙞𪞴𫥡凱凲𠁉𠙟-𠙣𫥢𠙤-𠙧𪞵𫥣凳凴𠙨-𠙫𠙭-𠙳] -[radical 17=⼐凵:凵𠙴𠙵凶𠙶-𠙸凷-击𠙹-𠙻𠙽𪞶凼㓙𠙾-𠚊函𠚋-𠚍𪞷凾𠚎-𠚐𠚒𠚓𪞸𫥤𠚔-𠚗凿𠚘𪞹𫥥𫥦𪞺𪞻𫥧-𫥩𠚙𠚚𢍭𫥪𫥫𠚜𫥬𠚝𠚞𢇕𪞼𠚟𪞽𫥭-𫥯𠚠-𠚢] -[radical 18=⼑刀:刀-刂𠚣刃刄𠚤刅-刈𠚥-𠚬刉-刍㓚-㓜𠚭-𠚴𠚶𠚻𫥰𫥱刎-创㓝㓞𠚵𠚷-𠚺𠚼-𠛍𪞾-𪟀𫥲-𫥴刜-刭㓟㓠𠛎-𠛦𪟁𪟂𫥵-𫥻刮-剂㓡-㓦𠛧-𠜏𪟃-𪟅𫥼-𫥿剃-剑㓧-㓫𠜐-𠜰𪟆𪟇𫝐𫦀𫦁剒-剧㓬-㓰𠜱-𠝜𠝶𪟈𪟉𫦂-𫦅剨剪-剱剶㓱-㓶𠝝-𠝵𠝷-𠝾𪟊-𪟍𫦆-𫦌剩割-創㓷-㓻𠝿-𠞛𠞝-𠞤𪟎-𪟐𫦍-𫦑剷-剿㓼㓽𠞥-𠟁𪟑-𪟓𫦒-𫦔劀-劄㓾-㔉𠟂-𠟟𠟡-𠟥𫦕-𫦙劅-劏㔊𠟠𠟦-𠟹𪟔𫦚劐-劔㔋-㔍𠟺-𠠊𪟕𪟖劕㔎㔏𠠌-𠠚𫦛㔐𠠛-𠠠𫦜-𫦞劖㔑𠠡-𠠣𫦟𫦠㔒𠠤𠠦-𠠩劗劘𠠥𠠪-𠠭劙劚𠠮𫦡𠠯𫦢𠠰𠠱𫦣] -[radical 19=⼒力:力劜𠠲𫦤劝办𠠳-𠠵功-劢㔓㘞𠆮𠠶-𠠸劣-动㔔-㔖𠠹-𠡁𫦥助-労㔗㔘𠡂-𠡐𪟗-𪟙𫦦𫦧劵-势㔙-㔛𠡑-𠡝𪟚𪟛𫦨勀-勋㔜𠡞-𠡪𪟜𫦩-𫦭勌-勑㔝-㔟𠡫-𠡺𪟝-𪟟𫦮-𫦲勒-勖勘-勚㔠𠡻-𠢄𪟠𫦳勛-勞㔡𠢅-𠢒𪟡𪟢𫦴𫦵募-勧𠢓-𠢟𪟣𫝑𫦶𫦷勨-勭㔢𠢠-𠢯𪟤𪟥𫦸勮-勲𠢰-𠢵𪟦𫦹𫦺勳𠢶-𠢸𫦻𫦼勴-勶㔣-㔦𠢹-𠢿㔧𠣀-𠣃𫦽𫦾勷𠣄𠣅勸𠣆𠣇𪟧𠣈-𠣊𫦿𠣋] -[radical 20=⼓勹:勹-匂𠣌匃-匇𠣍-𠣐𫧀𫧁匈𠣑-𠣓匉𠣔-𠣗匊-匌𠣘-𠣝匍𠣞-𠣣匎𠣤-𠣭𫧂𫧃匏匐㔨𠣮-𠣴匑匒㔩𠣵-𠣷𫧄匓㔪𠣸-𠤂匔𠤃𫧅𠤄-𠤇𫧆𠤈-𠤍] -[radical 21=⼔匕:匕𠤎𪟨化㔫𠤏𫧇北𠤐𪟩𠤑-𠤕㔬𠤖-𠤝𪟪𠤞-𠤡匘匙㔭𫧈𫧉𠤣-𠤥𪟫𠤦-𠤪𫧊] -[radical 22=⼕匚:匚𠤬𠤭𫧋匛-匞𫧌匟-匢𠤮-𠤱𪟬𫧍-𫧏匣-匥㔯㔰𠤳-𠤷𪟭𪟮𫧐𫧒匦𠤸-𠤻𫧑匧-匩𠤼-𠥂𠥄-𠥈𪟯𫧓匪匫龨𠥉-𠥍𪟰𫧔匬-匮㔱𠥎-𠥕𫧕匯㔲-㔴𠥖-𠥘𫧖匰-匲㔵𠥙-𠥛𪟱𫧗匳𠥜-𠥡𫧘𫧙匴𠥢𠥣𫧚匵𫧛𫧜𠥤𠥥匶𠥦𠥧匷𠥨𠥩𪟲𠥪𫧝㔶𠥫𠥬] -[radical 23=⼖匸:匸-区𠥭𠤲𠥮𠥯医㔷𠥰-𠥲匼𠥳匽𠥃𠥴-𠥶匾-區㔸𠥷-𠥺] -[radical 24=⼗十:十-千卅-午㔹𠥻𠥼𠥿卉半卌𠆱𠥽𠥾𠦀𠦁卋卍-卐㔺㔻𠦂-𠦗𪟳𫝒𫧞卑-卖龺𠦘-𠦢𣥥𫝓𫧟𫧠南単𫝔𫧡𫧢𠦣-𠦩𪟴卙𠦪-𠦯𪟵博𠦰-𠦳𫧣㔼𠦴-𠦼𪟶𫧤𫧥𠦽-𠦿𪟷𫧦𠧀-𠧄𪟸𪟹𫧧𫧨𠧅-𠧈𪟺𫧩-𫧫𠧉-𠧍𪟻𠧎𫧬𪟼卛𠧏𫧭𠧐𠧑] -[radical 25=⼘卜:卜𠧒卝卞𪟽卟-卢𠧓𠀝𠧔-𠧘卣卤𠧙-𠧜𡥋𪟾卥-卧㔽𠧞-𠧨𫧮𠧩-𠧲𠭉𫧯𠧳-𠧷𠧹𪟿𫧰卨𠧺-𠨂𠨄𫧱𫧲𠨅𫧳𫧴𠨆𠨇𪠀𫧵𠨈-𠨊𫧶-𫧸𠨋𠨌] -[radical 26=⼙卩:卩-卫㔾㔿卬𠨍-𠨐𫧹卭-卯𠨑印危𠨒-𠨗𫧺卲-卵㕀𠨘卶-卺㕁𪠁卻-卽𠨙-𠨝𪠂𠨞卾卿𫧻𠨟-𠨡𫧼厀厁𠨢-𠨤𫧽𠨥𫧾-𫨀𠨦-𠨪𫨁𠨫] -[radical 27=⼚厂:厂-历𠨬厇-厉𠨭-𠨳𪠃𫨂厊-厍㕂-㕄𠂬𠂮𠨴-𠨿厎-厑㕅-㕇𠂰𠩀-𠩉𪠄𫝕𫨃𫨄厒-厕㕈㕉𠩊-𠩕𪠅𪠆𫨅-𫨈厖-厛㕊𠩗-𠩦𪠇-𪠊𫨉𫨊厜-原虒㕋-㕍𠩧-𠩷𪠋-𪠎𫝖𫝗𫨋厠-厣厩𠩸-𠩾𠪀-𠪆𪠏𪠐𫨌-𫨐厤-厨㕎𠪇-𠪐𪠑𪠒𫨑-𫨗厪厫㕏𠩿𠪑-𠪘𪠓-𪠕𫨘-𫨛厬-厰㕐㕑𠪙-𠪬𪠖𪠗𫨜𫨝厱厲㕒𠪭-𠪸𪠘𪠙𫨞𫨟𠪺-𠪾𫨠-𫨢厳㕓𠪿𪠚𫨣𠫀-𠫆厴𠫇𪠛𫨤𠫉-𠫎㕔𠫏𫨥𠫐厵𠫑𠫒] -[radical 28=⼛厶:厶𠫓-𠫖厷-厹㕕𠫗𠫘𫨦厺-厼𠫙-𠫝厽厾𠫞-𠫥县𠫦-𠫨𫨧叀-参𠫩-𠫭𠫯-𠫲𠫴-𠫸𪠜𫨨𫨩㕖𠫹-𠫼𪠝𫨪參叄㕗㕘𠫽𠫾𪠞𫨫叅𠫿-𠬅𦎅𪠟𠬆-𠬌𪠠𫨬-𫨮叆𠔲𠬍-𠬐叇㕙𠬑𠬒𪠡𠬓𠬕-𠬗𫨯𫨰𠬔𠬘𠬙𪠢𫨱] -[radical 29=⼜又:又-収㕚㕛𠬚-𠬠𪠣𪠤𫨲叏-发𠬡-𠬨叒㕜𠬩-𠬰𪠥𫨳叓㕝𠬱-𠬸𪠦𫨴-𫨸叔-变㕞𠬹-𠬾𪠧𪠨𫨹叙-叝㕟𠫳𠬿-𠭈𪠩𪠪𫨺𫨻叞叟𠭊-𠭔𪠫𪠬𫨼-𫨿𠭕-𠭤𫩀-𫩃㕠𠭥-𠭮𪠭𪠮𫩄𫩅叠﨎𠭯-𠭵𠭷-𠭺𪠯𫩆𫩇㕡𠭼-𠮂𡪞𪠰𫩈𫩉𠮃-𠮆𫩊叡𠮇-𠮌𪠱𫩋𫩌𠮍-𠮏𫩍𫩎叢𠮐壡𠮑-𠮘] -[radical 30=⼝口:口𠮙-𠮞𫩏古-叾㕣-㕥𠙼𠮟-𠮪𪠲𫩐𫩑叿-吗㕦-㕨𠮫-𠯊𫝘𫩒-𫩗吘-呜㕩-㕶𠈂𠯋-𠰇𪠳-𪠵𫩘-𫩞呝-咝㕷-㕿𠰈-𠱏𪠶-𪠹𫩟-𫩪咞-哟㖀-㖎𠀷𠀹𠱐-𠲫𪠺-𪡃𫝙𫩫-𫩼哠-唧㖏-㖞𠲬-𠳤𠳦-𠳪𠳬-𠴥𪡄-𪡎𫩽-𫪑唨-啘啚-啞啠-啪啬-啹㖟-㖵𠳥𠴧-𠶶𪡏-𪡛𫪒-𫪰啙啫啺-喌喎-喾噅㖶-㗑𠶷-𠷡𠷣-𠸵𠸻-𠸾𪡜-𪡩𫪱-𫫂喍喿-嗵㗒-㗡𠷢𠸶-𠸺𠸿-𠹯𠹳-𠻓𪡪-𪡷𫫃-𫫒嗶-嘞嘡-嘧噑噓㗢-㗰𠁷𠻔-𠽠𪡸-𪢄𫝚𫫓-𫫧嘟嘠嘨-噄噆-噐噒噔噖-噝噴㗱-㗺𠆊𠏓𠏧𠹰-𠹲𠽡-𠾦𠾨-𠿆𡀔𡀦𪢅-𪢍𫝛𫫨-𫫵噞-噳噵-噼㗻-㘄𠿇-𡀓𡀕-𡀥𡀧-𡀼𢨐𨗓𪢎-𪢔𫫶-𫬆噽-嚓嚺㘅-㘈𡀽-𡂎𪢕-𪢘𫝜𫬇-𫬑嚔-嚤㘉-㘏𡂏-𡃟𡃰𪢙-𪢞𫝝𫬒-𫬛嚥-嚰㘐-㘒𡃠-𡃯𡃱-𡄈𡄊-𡄐𪢟-𪢡𫬜-𫬫嚱-嚹㘓㘔𡄑-𡄰𪢢-𪢤𫬬-𫬵嚻-囄囍㘕-㘗𡄱-𡅔𡅣𫬶-𫬸囅-囋囎㘘𡅗-𡅢𡅤-𡅯𪢥𫝞𫬹囌囏囐㘙㘚𡅰-𡅸𫬺-𫬼囑-囓𡅹-𡆅𪢦𪢧𫬽-𫬿囔囕㘛𡆆-𡆎𫭀㘜𡆏-𡆚𡆞𫭁囖𡆛-𡆝𧮥𡆟] -[radical 31=⼞囗:囗𡆠-𡆢囘-囜龱㘝𠁤𡆣-𡆦𫭂囝-団㘟𡆧-𡆳囤-囵𡆴-𡇇𪢨𫭃𫭄囶-图㘠㘡𠀯𡇈-𡇌𡇎-𡇑𪢩𫭅𫭆囿圀㘢𡇒-𡇟𪢪𫭇𫭈圁-圆㘣𡇠-𡇯𪢫𫭉𫭊圇-國圏𡇰-𡇻𡈀𪢬𪢭𫭋𫭌圌-圎圐𡇼-𡇿𡈁-𡈉𤔗𫭍-𫭏圑-圕𡈊-𡈔𪢮𫭐圖-圙㘤𡈕-𡈡𪢯𫭑圚𡈢-𡈤𡈦-𡈩𫭒圛圜𡈥𡈪-𡈬𪢰𫭓𡈭-𡈱𫭔𡈲-𡈴㘥𡈵-𡈺𫭕圝圞𡈻] -[radical 32=⼟土:土-圡龶𡈼-𡈾𫭖圢-圧㘦𡈿-𡉇𪢱𪢲𫭗𫭘在-场𡉈-𡉖𪢳-𪢷𫭙𫭚圻-坠㘧-㘰𡉘-𡊃𪢸-𪣂𫭛-𫭤坡-垊㘱-㘵𡊄-𡊶𪣃-𪣊𫭥-𫭨型-垵城鿍㘶-㘾𡊷-𡋛𡋝-𡋬𪣋-𪣓𫭩-𫭯垶-埍埏-埛﨏㘿-㙆𡋭-𡌥𣑧𪣔-𪣣𫭰-𫭻埜-埩埫-堕㙇-㙍𡌦-𡍣𪣤-𪣱𫭼-𫮅埪堖-堼堾-塂塄-塈㙎-㙘𡍤-𡎭𪣲-𪣽𫝟𫮆-𫮑堽塃塉-塱㙙-㙟𡎮-𡏬𧯧𪣾-𪤍𫮒-𫮚塲-墛㙠-㙦𡏭-𡐝𦥈𪤎-𪤘𫝠𫮛-𫮢墜-墧墩-墹㙧-㙯𠚛𡐞-𡑝𪤙-𪤞𫮣-𫮬墺-壌龳㙰-㙶𡑞-𡑹𡑻-𡒈𪤟-𪤥𫝡𫮭-𫮯壍-壗龼㙷-㙺𡒉-𡒠𡒢-𡒯𪤦-𪤫𫮰-𫮵壘壙㙻-㙽𡒰-𡒿𡓁-𡓋𡓍-𡓏𪤬-𪤯𫮶-𫮸壚-壠壢㙾㙿𡓀𡓌𡓐-𡓚𡓜-𡓥𪤰𫮹-𫮼壣-壥㚀𡓦-𡓰𪤱𫮽-𫮿壦𡓱-𡓶𡓸𡓹𡓻-𡔁𫯀𡓺𡔂-𡔉壧壨𡔊-𡔎壩㚁𡔏-𡔕壪㚂𡔖-𡔚] -[radical 33=⼠士:士-壭𡔛壮𡔜壯-壳𡔝-𡔟壴壵𡔠-𡔢𫯁𫯂壶𡔣-𡔩𪤲壷壸𡔪-𡔭壹-壻㚃𡔮𡔯壼𡔰𡔲-𡔵𪤳壽壾𡔶𡔸-𡔻𫯃𫯄壿夀㚄𡔼𡔽𫯅夁𡔾-𡕅𡕇-𡕍𫯆𫯇𡅕𡕏-𡕑𪤴𫯈𫯉] -[radical 34=⼡夂:夂𡕒夃处𡕓𡕔夅𡕕𡕖夆𡕗-𡕙备夈㚅𡕚𠙚𡕛𡕜𪌛𡕝𫯊𪤵] -[radical 35=⼢夊:夊𡕞𡕟夋𡕠𡕡夌𡕢-𡕥変复㚆㚇夎夏𠀼𡕦𫯋𫯌𡕧-𡕬𠌞𡕭𠭶𡕮-𡕱𪤶夐𡕲-𡕻夑夓𡕼-𡕿夒𡖀𡖁夔𡖂𡖃] -[radical 36=⼣夕:夕-夘㚈𡖄-𡖆夙-夛𡖇-𡖉𪤷𫝢𡖊-𡖌𫝣夜夝㚉𡖍-𡖏𪤸𫯍𡖐𡖑𪤹夞𠅗𡖒-𡖜𢻈𪤺𫯎够夠𡖝-𡖥𪤻𫯏𫯐夡㚊𠅱𠨃𡖦-𡖮𡖰𪤼𫯑𫯒𡖯𡖱-𡖵夢-夥㚋㚌𡖶-𡖾𢆣𪤽𫯓𫯔夦𡖿-𡗁𪤾𫯕𠆓𠆕𡗂-𡗅𪤿𫯖𫯗𠆙𡗆-𡗈𫯘㚍𡗉-𡗌𡗐𡗍𡗎𪥀𫯙𡗏𣡳𫯚𡗑] -[radical 37=⼤大:大-夭𡗒-𡗔𪥁𫯛央-头㚎𡗕-𡗛𪥂夵-夼㚏-㚑𠀛𡗝-𡗤𪥃𫯜夽-奂㚒㚓𡗥-𡗶𪥄-𪥆𫯝-𫯟奃-奉奋-奍㚔-㚙𡗷-𡘌𪥇-𪥌𫯠-𫯢奎-奖㚚㚛𡘍-𡘜𪥍-𪥏𫯣-𫯥奊套-奚𡘝-𡘳𪥐-𪥒𫝤𫯦𫯧奛-奞㚜-㚞𡘴-𡙆𪥓-𪥕𫯨奟-奥㚟𡔱𡙇-𡙚𪥖-𪥘𫯩-𫯯奦-奨㚠𡙛-𡙫𪥙-𪥛𫯰-𫯴奩-奬𡙬-𡙶𪥜-𪥞𫯵-𫯷奭𡙷-𡚅𪥟-𪥡𫯸-𫯼奮奯㚡𡚆-𡚎𤏠𫝥𫯽-𫰀𡚏-𡚖𫰁奰𡚗𡾗𪥢𡚘-𡚚𫰂𡚛𪥣𫰃𫰄𡚜𡚝奱𡚞-𡚢𫰅奲𡚣-𡚥] -[radical 38=⼥女:女𡚦𫰆奴-奶㚢𡚧-𡚭𫰇奷-妈㚣-㚨𡚮-𡚻𪥤𪥥𫰈-𫰊妉-妌妎-妫㚩-㚯㛠𡚼-𡛘𪥦-𪥬𫝦𫰋-𫰖妬-姗㚰-㛁𡛙-𡜁𪥭-𪥰𫰗-𫰛妍姘-姫姭-娃娅-娈㛂-㛌𡜂-𡜭𪥱-𪥵𫝧𫝨𫰜-𫰩姬娉-娫娭-娴娽㛍-㛟㛡-㛤𡜮-𡝝𪥶-𪥺𫝩-𫝫𫰪-𫰶娬娵-娼娾-婶㛥-㛭𡝞-𡞛𪥻-𪦅𫰷-𫱂婷-媏媑-媯嫏㛮-㜄𡞜-𡟧𡠣𪦆-𪦐𫝬𫱃-𫱐媐媰-嫎嫐-嫔㜅-㜔𡟨-𡠕𪦑-𪦖𫱑-𫱞嫕-嫲㜕-㜢𡠗𡠙-𡠢𡠤-𡠱𡠳-𡡎𪦗-𪦟𫝭𫱟-𫱫嫳-嬏㜣-㜨𡠖𡠘𡠲𡡏-𡢍𡢐𪦠-𪦥𫝮𫱬-𫱷嬐-嬢嬴㜩-㜭𡢎𡢑-𡣄𪦦-𪦪𫱸-𫲄嬣-嬳嬵-嬷㜮㜯𡣅-𡣡𡣣-𡣩𪦫𫲅-𫲌嬸嬺-嬽㜰㜱𡣪-𡣼𪦬-𪦯𫲍-𫲓嬹嬾嬿㜲-㜵𡣽-𡤍𡤞𪦰𪦱𫲔-𫲙孀-孆㜶-㜸𡤎-𡤗𪦲𫲚𫲛孇-孉㜹𡤘-𡤝𡤟𡤠𪦳𪦴𫲜𫲝孊-孌㜺𡤡-𡤪𫲞𫲟孍𡤫-𡤭𪦵𫲠孎孏𡤮-𡤶㜻㜼𡤷-𡤻] -[radical 39=⼦子:子-孓𡤼孔𡤽孕𡤾-𡥂𫲡孖-孙㜽𡉗𡥃-𡥅孚-孞㜾㜿𡥆-𡥊𡥌𡥍𪦶-𪦹孟-孧㝀𠃱𡥎-𡥚𪦺𫲢-𫲤孨-孪㝁𡥛-𡥧𪦻𫲥孫-孭㝂㝃𡥨-𡥭𢈲𨹴𫲦孮-孰孲𡥮-𡥵𪦼-𪦾𫲧𫲨孱㝄𡥶-𡦂𪦿𫲩𫲪孳孴㝅𡦃-𡦐𫲫𫲬孵-孷𡦑-𡦖𪧀𫲭𫲮㝆𡦗-𡦝𫝯𫲯𫲰學孹㝇𡦞-𡦨𪧁𫲱𫲲孺孻𡦩𪧂𪧃𡦪-𡦬孼𡦭-𡦰𫲳孽孾𡦱-𡦶𪧄孿𡦷𫲴㝈𡦸] -[radical 40=⼧宀:宀㝉𡦹宁-宄㝊㝋𡦺-𡦼宅-安㝌㝍𡦽-𡧊𫲵𫲶宊-宒㝎-㝑𡧋-𡧕𪧅-𪧇𫲷-𫲽宓-审㝒𡧖-𡧨𪧈𪧉𫲾-𫳀客-宦宨-宫㝓-㝖𡧩-𡧿𪧊-𪧌𫳁-𫳆宧宬-宾㝗-㝚𡨀-𡨡𪧍-𪧐𫳇-𫳏宿-寉㝛-㝡𡨢-𡨼𪧑-𪧓𫳐-𫳙寊-寕寪㝢㝣𡨽-𡩞𪧔-𪧚𫳚-𫳣寖-寝㝤-㝨𡩟-𡩺𪧛-𪧠𫳤-𫳮寞-寨㝩-㝬𡩻-𡪝𪧡-𪧥𫝰𫳯-𫳼審寫-寮㝭-㝯𡪟-𡪽𪧦-𪧪𫝱𫳽-𫴁寯寰𡪾-𡫐𪧫-𪧮𫴂-𫴏寱寲𡫑-𡫝𪧯𫴐-𫴗㝰𡫞-𡫫𪧰-𪧲𫴘-𫴛寳-寵𡫬-𡫶𫴜-𫴟寶𡫷-𡫻𪧳𪧴𫴠寷㝱𡫼-𡬃𪧵𫴡-𫴣𡬄-𡬋𫴤𫴥𡬌𫴦𫴧𡬍𡬏𡬐𪧶𫴨-𫴪𡬑𡬓-𡬕㝲𡬖-𡬘𡬎𡬙𡬚𡬒𡬛𫴫𡬜] -[radical 41=⼨寸:寸𡬝对㝳寺-导𡬞𪧷寽-寿㝴尀㝵𡬟-𡬦封専将𡬧-𡬬𫴬尃-尅㝶𡬭𫴭將-尉𡬮-𡬲𪧸𪧹尊-尌㝷𡬳-𡬸𪧺𫴮𫴯𡬹-𡬼𫴰-𫴳對𡬽-𡭂導𡭃-𡭉𣊒𪧻𪧼𫴴𫴵𡭊-𡭌𪧽𡭍-𡭏𪧾𡭐-𡭓𫴶𫴷] -[radical 42=⼩小:小𡭔尐少𡭕𡭖尒-尕龸𡭗𡭘尖-尘𡭙-𡭤𪧿𫴸𫴹尙尚𠈤𡭥-𡭩𪨀𫴺𫴻尛-尝𡭪-𡭳𫴼𫴽㝸𡭴-𡭼𪨁𪨂𡭽-𡮍𫴾-𫵃尞㝹𡮎-𡮗𫵄𫵅尟尠𠅽𡮘-𡮝尡㝺𡮞-𡮥𪨃𫵆𫵇㝻𡮦-𡮯𪨄𫵈𫵉𡮰-𡮳𪨅𫵊-𫵌𡮴-𡮶𢇔𪨆𡮷-𡮻𤯏𡮼-𡮾𫵍𡮿𡯀] -[radical 43=⼪尢:尢尣𡯁𡯂尤𡯃-𡯊𫵎尥-尧㝼𡯋-𡯎尨-尬㝽𡯏-𡯙𫵏尭㝾㝿𡯚-𡯡𫵐尮尯㞀㞁𡯢-𡯤𡯦𡯧㞂𡯨-𡯲㞃-㞆𡯳-𡯸𫵑尰就㞇㞈𡯹-𡰂𪨇尲-尴㞉㞊𡰃-𡰊𪨈𡰋-𡰏尵𡰐-𡰕𫵒𡰖-𡰚尶尷𡰛-𡰢] -[radical 44=⼫尸:尸𡰣尺-尼㞋𡰤-𡰨𡰴尽㞌㞍𡰩-𡰳𫝲尾-屃㞎𡰵-𡰽𪨉-𪨋𫵓-𫵕屄-届㞏-㞑𡰾-𡱋𪨌𫵖-𫵘屋-屏㞒-㞖𡱌-𡱡𢇀𪨍𪨎𫵙-𫵝屐-屘㞗𡱢-𡱹𪨏𪨐𫵞𫵟屙-屝㞘㞙𡱺-𡲓𪨑𫵠属-屡㞚㞛𡲔-𡲫𪨕-𪨘𡲬-𡳃𪨒-𪨔𫵡屢屣㞜-㞞𡳄-𡳏𪨙𪨚𫵢-𫵥層-屧㞟㞠𡳐-𡳞𪨛𪨜𡳟-𡳧𪨝𫵦𫵧屨𡳨𡳩𪨞𫵨屩屪𡳪𡳫𫵩屫㞡𡳬-𡳰𪨟𪨠𫵪𫵫𡳱-𡳴屬𡳵-𡳷𫵬𫵭𡳸-𡳺𪨡屭𡳻-𡳽] -[radical 45=⼬屮:屮𡳾屯㞢𡳿屰𡴀-𡴅㞣㞷𡴆-𡴚𫵮𡴛-𡴥𫵯𫵰𡴦-𡴬] -[radical 46=⼭山:山乢屲𡴭-𡴯屳-屷㞤-㞧𡴰-𡴽𫵱-𫵴屸-岃㞨-㞯𡴾-𡵒𪨢-𪨥𫝳𫵵岄-岌岎-岜㞰-㞶㞸𡵓-𡶂𪨦-𪨨𫵶𫵷岝-峅㞹-㟃𡶃-𡶣𡶥-𡶪𪨩-𪨮𫵸𫵹岍峆-峧㟄-㟆𡶫-𡷔𪨯-𪨴𫝴𫵺𫵻峨-崅㟇-㟖𡷕-𡸐𦊤𪨵-𪨺𫝵𫵼-𫶀崆-崰㟗-㟥𡸑-𡹩𪨻-𪩁𫶁-𫶅崱-嵉嵋-嵝﨑㟦-㟯𡹪-𡺩𪩂-𪩇𫶆-𫶉嵊嵞-嵶㟰-㟸𡺪-𡻗𪩈-𪩋𫶊-𫶐嵷-嶎㟹-㠄𡻘-𡼉𪩌-𪩒𫶑-𫶔嶏-嶥㠅-㠐𡼊-𡼼𪩓-𪩖𫶕𫶖嶦-嶶㠑-㠗𡼽-𡽈𡽊-𡽛𪩗-𪩚𫶗-𫶜嶷-嶺嶼-嶿㠘-㠜𡽉𡽜-𡾁𡾻𪩛-𪩝𫶝巀-巂㠝-㠟𡾂-𡾖𡾠𫶞嶻巃-巅㠠-㠣𡾘-𡾟𡾡-𡾭𣦭𪩞𫶟-𫶣巆-巌㠤𡾮-𡾺巍巏巐㠥㠦𡾼-𡿆𪩟𫶤巎巑-巕巗㠧𡿇-𡿑𪩠巖巘-巚𡿒-𡿜𫶥𡿝-𡿟𫶦𡿠𡿡𡿣𡿤㠨𡿢𡿥] -[radical 47=⼮巛:巛-川𡿦𡿨𫶧𡿧州巟㠩𡿩-𡿭巠𡿮-𡿰𪩡𡿱-𡿻𪩢𠙗𡿼𡿽𫶨巢巣𡿾-𢀀𫶩𢀁𢀂巤𢀃-𢀋𫶪𢀌-𢀐] -[radical 48=⼯工:工㠪𢀑-𢀕左-巨𢀖-𢀙巩巪𢀚𢀛𪩣巫𢀜-𢀞𫶫𢀟𫶬巬巭𢀠𫶭差㠫㠬𢀡-𢀣𪩤𫶮巯㠭𢀤𢀥𪩥巰𢀦𢀧𪩦𫶯𪩧𫶰㠮𢀨-𢀫𫶱𢀬𢑰𤀢𫶲𫶳𢀭𪩨𫶴𢀮𪩩𢀯-𢀲𪩪] -[radical 49=⼰己:己-巴𢀳㠯𢀴-𢀶𫶵巵𪩬巶㠰𢀷𢀸𪩫巷-巻𢀹-𢀻巼𢀼-𢀿𫶶㠱𢁀-𢁄𫶷巽𢁅-𢁉𪩭𪩮𫶸𫶹𢁊𪩯𢁋-𢁍𢁏𪩰𪩱𫶺𢁎𢁐𫶻𫶼𢁑] -[radical 50=⼱巾:巾-帅㠲㠳𢁒-𢁔𪩲𫶽𫶾帆-师㠴-㠶𢁕-𢁤帉-帐㠷-㠼𢁥-𢁺𫶿-𫷂帑-帜㠽-㡀𢁻-𢂏𫷃𫷄帝-帧㡁-㡆𢂐-𢂰𫷅帨-帱㡇㡈𢂱-𢃌𪩳帲-帼㡉-㡎𢃍-𢃪𪩴-𪩷𫷆𫷇帽-幇幉㡏-㡖𢃫-𢄉𪩸-𪩺𫷈𫷉幊-幏㡗-㡛𢄊-𢄞𫷊-𫷏幈幑-幙幛㡜-㡟𢄟-𢄲𪩻幚幜-幥㡠㡡𢄳-𢅌𪩼幦-幩㡢-㡤𢅍-𢅞𪩽𫷐𫷑幪-幬㡥㡦𢅟-𢅨𪩾幭-幯𢅩-𢅬幰𢅭-𢅷𪩿𫷒𫷓幱㡧㡨𢅸-𢅺𪪀𢅻-𢅽㡩㡪𢅾-𢆈] -[radical 51=⼲干:干平𢆉年幵𫷔𢆊-𢆌𪪁𫷕𫷖并-幸𢆍-𢆚𪪂𪪃𫷗𢆛-𢆝𪪄幹𢆞-𢆠𪪅𪪆𫷘-𫷚𢆢𢆤𫷛𢆥𪪇𫷜𫷝𢆦-𢆪𪪈𫷞𢆫𪪉𢆬-𢆮] -[radical 52=⼳幺:乡幺幻𢆯-𢆱幼𢆲-𢆶𪪊𢆷-𢆾幽𢆿𢇂𪪋𫷟𢇁𢇃-𢇉幾㡫㡬𢇊𫷠𫷡𠅹𢇋𫷢𫷣㡭𢇌-𢇓𫷤㡮𢇖] -[radical 53=⼴广:广-広𠆲𫷥庄-庆㡯-㡱𢇗-𢇢𫷦庇-应庘㡲㡳𢇣-𢇱𪪌𪪍𫷧底-店庙-废㡴-㡻𢇲-𢈆𪪎𪪏庠-度㡼-㢂𢈇-𢈘𪪐𪪑𫷨𫷩座-庯㢃-㢇𢈙-𢈱𪪒-𪪗𫷪-𫷯庰-庼㢈-㢌𢈳-𢉕𢉗-𢉚𪪘𪪙𫝶𫝷𫷰-𫷵庽-廃廊㢍-㢐𢉛-𢉻𢉽𢉾𪪚𪪛𫷶-𫷹廅-廉廋廌㢑𢉼𢉿-𢊔𪪜𪪝𫷺𫷻廄廍-廘㢒-㢕𢊕-𢊬𪪞-𪪠𫷼-𫷿廙-廤㢖-㢘𢊭-𢋁𪪡-𪪣𫸀廥-廪㢙-㢜𢋂-𢋐𪪤𪪥𫸁𫸂𢋑-𢋛𢋝-𢋠𪪦-𪪨𫸃-𫸆廫𢋡-𢋭𪪩𫸇廬廭龐㢝𠓌𢋮-𢋺𪪪𫸈廮-廰㢞𢋻-𢌃𫸉廱𢌄-𢌆𪪫𫸊廲𢌈-𢌌𫸋𫸌𢌍-𢌑𫸍𫸎𢌒廳𫸏𢌓𫸐𢌔-𢌖] -[radical 54=⼵廴:廴𢌗廵㢟𢌘-𢌚𪪬𫸑延廷𢌜廸廹㢠𢌛𢌝𢌞𪪭𪪮建-廼𢌟廽𢌠-𢌥𪪯𢌦𢌧𪪰𫸒𫸓𢌨-𢌪𪪱𢌫𣉡𦋪𪪲𫸔𫸕] -[radical 55=⼶廾:廾𢌬廿开𢌭弁𢌮𢌯异𢌰-𢌲𫸖弃-弅𢌳𢌵-𢌺𪪳弆𢌻𢌽-𢍁𪪴𫸗-𫸙弇弈𢌴𢌼𢍂-𢍌弉𢍍-𢍓𪪵𫸚𫸛𢍔-𢍙𫸜𫸝𢍚-𢍡𪪶𫸞𢍢-𢍥𪪷𫸟㢡𢍦-𢍫弊㢢𢍬㢣𢍮-𢍱𫸠𫸡𢍲-𢍴𪪸𫸢𫸣𢍵𫸤𢍶𪪹𢍷-𢍹] -[radical 56=⼷弋:弋𢍺弌𢍻𢍼弍-弐𢍽𢍾㢤𢍿-𢎅㢥𢎆-𢎍弑𢎎弒㢦𢎏𢎐𣦏𢎑-𢎖] -[radical 57=⼸弓:弓𢎗𢎘弔-弖㢧𢎙-𢎡弗弘𢎢-𢎪弙-弜㢨-㢫𢎫-𢎶𪪺𫸥-𫸧弝-张㢬㢭𢎷-𢏅𫸨-𫸪弡-弪㢮-㢱𢏆-𢏓𪪻𫸫-𫸭弫-弯㢲-㢷𠄴𠔘𢏔-𢏣𪪼𪪽𫸮-𫸲弰-弳㢸㢹𢏤-𢏭𪪾𫸳-𫸶弴-弹㢺-㢼𢏮-𢏿𪪿𫸷𫸸强-弾㢽-㢿𢐀-𢐉𪫀𪫁𫸹𫸺弿-彂㣀-㣂𢐊-𢐑彃-彅㣃𢐒-𢐝𪫂𫸻彆-彉㣄㣅𢐞-𢐤𫸼𫸽彊彋𢐥-𢐪𫸾𫸿彌𢐬-𢐱𪫃𫹀彍𢐲-𢐷𫹁𢐸-𢐾𤯽𢐿-𢑅𫹂㣆𢑆-𢑉𪫄𫹃彎𢑊彏𢑋𢑌𪫅𢑍𢑎] -[radical 58=⼹彐:彐-当𢑏-𢑒𪫆𢑓彔录㣇𢑔𢑕𫹄彖𢑗-𢑝彗𢑞-𢑡彘𢑢-𢑤𫹅𫹆彙彚𢑥-𢑮𣼙𫹇𫹈彛彜㣈𢑯𢑱𢑲彝彞𢑳-𢑶𪫇彟𢑷-𢑾彠𢑿] -[radical 59=⼺彡:彡𢒀-𢒂㣉𢒃-𢒆形-彤㣊𢒇𢒈㣋-㣍𢒉-𢒍彥彦𢒎𫝸彧彨𢒏-𢒓𣥲𪫈𫹉彩彫彬㣎𢒔-𢒝彭㣏㣐𢒞-𢒣彮𢒤-𢒨彯彰㣑𢒩𢒪影㣒𢒫-𢒯𪫉㣓𢒰-𢒴𪫊𫹊𢒵𢒷𢒶彲𢒸-𢒻] -[radical 60=⼻彳:彳𢒼𢒽㣔𢒾𢒿𫹋彴彵㣕𢓀-𢓃𫹌彶-彻鿈鿉㣖㣗𢓄-𢓑𪫋𫹍-𫹐彼-径㣘㣙𢓒-𢓛𪫌𫹑待-徍徔㣚-㣡𢓜-𢓩𫹒𫹓徎-従徕㣢㣣𢓪-𢔀𪫍𪫎𫹔𫹕徖-徙徛-徤㣤-㣩𢔁-𢔞𪫏𪫐𫹖-𫹘徚徥-徫㣪-㣮𢔟-𢔫𢔭-𢔱𪫑-𪫓𫹙-𫹝徬-徰㣯𢔲-𢕎𢕧𪫔𪫕𫹞-𫹠徱徳徴㣰-㣲𢕏-𢕦𢕨𢕩𪫖-𪫘𫹡𫹢徲徵-徺㣳㣴𢕪-𢕸𫹣-𫹥徻徼㣵㣶𢕹-𢖄𢖆𢖇𪫙徽徾㣷𢖈-𢖊𢖌-𢖎𪫚𫹦𢖏-𢖗𪫛𪫜𫹧𫹨徿㣸𢖘-𢖚𢖜忀忁㣹𢖝-𢖠𢖢忂𢖣𢖤𫹩𢖥𢖦𫹪𢖧𢖨] -[radical 61=⼼心:心忄𢖩必忆㣺𢖪忇-忊㣻𢖫-𢖱𪫝𫹫-𫹭忋-応㣼-㤀𢖲-𢗈𪫞𫹮-𫹱忝-怆㤁-㤋𢗉-𢗾𪫟-𪫥𫝹𫹲-𫹹怇-怿㤌-㤙𢗿-𢘳𪫦-𪫬𫹺-𫹿恀-恽㤚-㤭㤺𢘴-𢙰𪫭-𪫴𫺀-𫺋恾-悯㤮-㤹㤻-㤽𢙱-𢚿𪫵-𪫾𫺌-𫺕悰-惯㤾-㥙𢛀-𢜧𪫿-𪬆𫺖-𫺟惰-愦慨㥚-㥫𢜨-𢞌𪬇-𪬒𫺠-𫺭愧-慑㥬-㥻𢞍-𢟟𪬓-𪬞𫺮-𫺷慒-慧慩-慬慮-憈㥼-㦈𠕫𢟠-𢠰𦑑𪬟-𪬧𫺸-𫻂慭憉-憳㦉-㦖𢠱-𢢑𪬨-𪬭𫻃-𫻉憴-憺憼-懔㦗-㦙𢢒-𢣍𦡗𪬮-𪬶𫻊-𫻏憻懕-懨㦚-㦠𢣎-𢣺𪬷-𪬹𫻐-𫻒懩-懴㦡㦢𢣻-𢤥𦻇𪬺-𪬾𫻓-𫻙懵-懸㦣-㦧𢤦-𢥊𪬿𪭀𫻚-𫻜懹-懻㦨-㦪𢥋-𢥖𪭁𪭂𫻝-𫻡懼-懿𢥗-𢥤𪭃𪭄𫻢-𫻤戀-戂㦫㦬𢥥-𢥮𪭅𪭆戃戄𢥯-𢥺𪭇戅戆𢥻-𢦂𪭈𢦃𢦄戇㦭𢦅-𢦇𫻥𢦈-𢦋] -[radical 62=⼽戈:戈-戋𢦌𢦍𪭉戌-成𢦎-𢦑𪭊𫻦𫻧我-戓㦮㦯𢦒-𢦙𫻨戔-戗㦰-㦲𢦚-𢦥𫻩𫻪战㦳𢦦-𢦶𪭋𪭌𫻫𫻬戙㦴-㦶𢦷-𢦾𪭍𪭎𫻭-𫻱戚-戝㦷𢦿-𢧇𪭏𪭐𫻲-𫻶戞戟戦㦸𢧈-𢧓𪭑𫻷-𫻾戠-戥㦹𢧔-𢧡𪭒𫻿𫼀戧-戬㦺𠎶𢧢-𢧧𢧩-𢧱𪭓𫼁戭-戯戱㦻㦼𢧨𢧲-𢨆𫼂𫼃戰𢨇-𢨏𢨑𢨒𪭔-𪭖𫼄-𫼈戲戴㦽𢨓-𢨗戳𢨘-𢨣戵𪭗] -[radical 63=⼾戶:戶-戹𢨤-𢨩戺-戼㦾𢨪-𢨮戽-所㦿㧀𢨯-𢨵𫼉扁-扃㧁㧂𢨶-𢩄𪭘𫼊扄-扇𢩅-𢩌𫼋𫼌扈𢩍-𢩐𪭙𫼍𫼎扉扊𢩑-𢩕𫼏𫼐𢩖𢩗𤟵𫼑𢩘-𢩞𪭚𢩟-𢩡𨐳𢩢𪭛𢩣𢩤𫼒] -[radical 64=⼿手:手-才龵扎𢩥-𢩧𫼓扐-扖㧃-㧅𢩨-𢩬𫼔扏扗-扞扠-扬㧆-㧈𢩭-𢪂𪭜𫼕-𫼗扟扭-扷批-报㧉-㧑𢪃-𢪳𪭝-𪭣𫼘-𫼛扸抦-择㧒-㧠𢪴-𢫣𪭤-𪭪𫝺𫼜-𫼡拪-挧㧡-㧱𢫤-𢬮𪭫-𪭳𫝻𫼢-𫼰挨-捤㧲-㧸𢬯-𢮀𪭴-𪮀𫼱-𫽀捥-掱掳-掽㧹-㨈𢮁-𢯨𪮁-𪮋𫽁-𫽖掲掾-揄揆-搅摒㨉-㨕㨗㨘𢯩-𢰾𢱀-𢱞𪮌-𪮖𫝼𫽗-𫽨搆-搰搲-摊㨖㨙-㨬𢱟-𢲲𪮗-𪮢𫝽𫽩-𫽶揅摋-摑摓-摕摗-撄撇㨭-㩂𢲳-𢴔𢴖-𢴟𪮣-𪮪𫝾𫽷-𫾁搱摖撅撆撈-撺擆㩃-㩑𢴕𢴠-𢵾𢷅𪮫-𪮴𫾂-𫾉撻-擅擇-擞㩒-㩙𢵿-𢷄𢷆-𢷊𪮵-𪮷𫾊-𫾏擟-擤擦-擱㩚-㩟𢷋-𢷵𪮸-𪮺𫾐-𫾒擥擲-攆㩠-㩫𢷶-𢸢𪮻-𪯀𫝿𫾓-𫾘攇-攐攒㩬㩭𢸣-𢹌𪯁𫾙𫾚攑攓-攚㩮-㩰𢹍-𢹡𢹣-𢹫𪯂𫾛攛-攝㩱-㩴𢹢𢹬-𢺁𫾜-𫾞攞-攤攦攧𢺂-𢺕𪯃𫾟𫾠攥攨-攫㩵-㩷𢺖-𢺝𪯄𫾡攬攭𢺞-𢺫𫾢攮㩸㩹𢺬-𢺴] -[radical 65=⽀支:支攰𢺵𢺶㩺𢺷-𢺽𪯆攱𢺾-𢻀㩻㩼𢻁-𢻇𢻉㩽𢻊-𢻍𪯅攲㩾𢻎-𢻜𫾣𢻝-𢻟𪯇攳𢻠-𢻤𫾤𢻥-𢻩𫾥𢻪] -[radical 66=⽁攴:攴-攷𫾦攸-攼㩿㪀𢻫-𢻲𫾧攽-政㪁㪂𢻳-𢼈𪯈𫾨敀-故㪃-㪆𢼉-𢼚𪯉𪯊𫾩敆-敌㪇-㪉𢼛-𢼸𣁋𪯋𪯌𫾪-𫾰啟敍-敛㪊-㪎𢼹-𢽙𢽜𢽷𪯍𪵊𫾱-𫾸敜-敪敭㪏-㪚𢽚𢽛𢽝-𢽶𢽸-𢽾𢾣𪯎𪯏𫾹-𫿀敫敬敮-数㪛-㪟𢽿-𢾢𢾤𪯐𫿁-𫿇敱-敳㪠-㪣𢾦-𢿅𪯑𪯒𫿈-𫿌整-敻㪤-㪦𢿇-𢿝𣁛𪯓-𪯖𫿍-𫿐敼-敿㪧-㪪𢿞-𢿽𪯗-𪯙𫿑-𫿗斀-斂𢿾-𣀃𣀅-𣀏𪯚𫿘-𫿚斃贁㪫㪬𣀄𣀐-𣀚𪯛𪯜𫿛-𫿝斄𣀛-𣀢𩠮𫿞-𫿢斅斆㪭𣀣-𣀭𩠰𫿣-𫿦㪮𣀮-𣀲𪯝𪯞𫿧𫿨𣀳𣀴𫿩𣀵-𣀺𪯟𫿪-𫿬𣀻-𣁀] -[radical 67=⽂文:文𣁁𫿭斈㪯𣁂𪯠斉𣁃-𣁅𪯡𪯢𣁆-𣁉𪯣𫿮𫿯斊斋㪰𣁊𣁌𣁍𪯤𫿰斌-斏𣁎-𣁓𣁚斐斑𣁔-𣁖𪯥-𪯧𫿱斒㪱𣁗-𣁙𩖰𪯨-𪯪𣁜-𣁡斓𣁢-𣁦斔𣁧𣁨𫿲斕𣁩𣁪斖𣁫] -[radical 68=⽃斗:斗𣁬㪲㪳斘𣁭㪴𣁮-𣁰㪵𣁱𣁲𪯫料斚㪶𣁳-𣁶𪯬𫿳斛斜㪷𣁷-𣁻𫿴斝㪸𣁼-𣂀𫿵斞斟𣂁𣂃-𣂅斠斡𣂂𣂆-𣂈𪯭㪹𣂉-𣂋𪯮𫿶斢𫿷斣㪺𣂌𣂍𪯯𫿸𣂎-𣂐𪯰㪻] -[radical 69=⽄斤:斤𣂑斥𣂒𣂓斦-斩𣂔-𣂘𪯱斪斫㪼㪽𣂙𣂚㪾㪿𣂛-𣂝斬断𣂞-𣂠𫿹𫿺斮斯㫀𣂡-𣂪𣂬𣂭𫿻𫿼新斱𣂮-𣂵𥇴斲㫁𣂶-𣂺斳㫂𣂻-𣂿斴𣃀-𣃆𫿽斵斶𣃇-𣃋斷𣃌-𣃓𫿾𣃔𣃕𫿿𣃖斸] -[radical 70=⽅方:方㫃𣃗-𣃙斺-於㫄𣃚-𣃜𪯲𪯳𬀀施-旀㫆𣃝-𣃥𪯴旁-旆旊㫅㫇-㫉𣃦-𣃲𪯵-𪯷𬀁-𬀆旇-旉旋-族㫊-㫌𣃳-𣃻𪯸𫞀𬀇𬀈旐旑㫍𣃼-𣄇𪯹-𪯼𬀉𬀊旒-旕𣄈-𣄍𪯽𫞁𬀋-𬀍旖旗𣄎-𣄓𪯾𬀎-𬀐㫎㫏𣄔-𣄖𪯿𪰀𬀑𬀒旘旙𣄗-𣄜𪰁𪰂𬀓-𬀖旚𣄝𬀗旛𣄞-𣄣𬀘-𬀛旜-旞𣄤𪰃𪰄𬀜𬀝旟𣄥𪰅𬀞-𬀠𣄦𬀡𣄧𣄨𬀢𣄩𬀣𣄪-𣄬𬀤] -[radical 71=⽆无:无旡𣄭-𣄯既𣄰-𣄳旣𬀥𣄴𣄵旤𣄶-𣄺] -[radical 72=⽇日:日-旧𣄻-𣄽旨-旯㫐㫑𣄾-𣅃𣅅𬀦旰-旸㫒-㫗𣅄𣅆-𣅙𪰆𪰇𬀧𬀨旹-昙㫘-㫚𣅚-𣅶𪰈-𪰎𬀩-𬀫昚-昿㫛-㫤𣅷-𣆈𣆊-𣆑𪰏-𪰘𫞂𫞃𬀬-𬀮晀-晖㫥-㫮𣆒-𣆱𪰙-𪰤𫞄𬀯-𬀴勗晗-晩曽㫯-㫴𣆲-𣇡𪰥-𪰨𬀵-𬀺晪-暃暑㫵-㬀𣇢-𣈣𪰩-𪰮𬀻-𬁁暄-暐暒-暙㬁-㬌𣈤-𣉑𪰯-𪰷𬁂-𬁉暚-暨㬍-㬐𣉒-𣉠𣉢-𣉺𪰸-𪰽𬁊-𬁏暩-暷㬑-㬖𣉻-𣊈𣊊-𣊑𣊓-𣊝𣋇𪰾-𪱅𬁐-𬁒暸-曍龧㬗-㬟𣊉𣊞-𣋆𣋈𪱇-𪱌𬁓-𬁘曎-曗曚㬠-㬢𠁞𣋉-𣋝𪱆𪱍𬁙-𬁛曘曙曛曜㬣-㬨𠆛𣋞-𣋱𥫂𪱎-𪱐𬁜曝-曢㬩㬪𣋲-𣋾曣-曨㬫𣋿-𣌇𬁝𬁞曩𣌈-𣌌𪱑-𪱓㬬㬭𣌍-𣌕曪-曬㬮𣌖曭曮𣌗-𣌙𣌛𪱔曯㬯𣌜𣌝𣌟𣌠] -[radical 73=⽈曰:曰-曳㬰更曵𣌡𣌢𬁟𬁠曶𣌣-𣌦𬁡曷𣆉𣌧-𣌬書曺𣌭-𣌶𬁢曹曻曼𣌷-𣌺𬁣𬁤曾替朁朂𣌻-𣌽𬁥-𬁧會𣌾-𣍂朄朅𣍃-𣍅𬁨-𬁪𣍆-𣍊𪱕𬁫朆㬱𣍋-𣍎𪱖𪱗㬲𣍏𣍐𬁬𣍑-𣍗𪱘𣍘𣍙𬁭-𬁯朇𣍚𠑱𣍛𣍜] -[radical 74=⽉月:月𣍝有𣍞𪱙𬁰𣍟-𣍣𪱚𬁱-𬁳朊-服㬳𣍤𪱛𬁴-𬁸朎-朑𣍥-𣍧𣍩-𣍬𪱜𪱝𬁹朒-朕㬴㬵𣍭𣍮𪱞𫞅𬁺-𬁼朖-望㬶㬷𣍱-𣍶𪱠-𪱢𬁽-𬂁朜-期㬸𣍷-𣎃𦜳𪱣𫞆𫞇𬂂-𬂅朠朡𣎄-𣎌𪱤-𪱧𬂆朢㬺㬻𣎍-𣎑𪱟𪱨-𪱪𬂇-𬂌膤㬼-㬾𣎒-𣎙𪱫𪱬𬂍𬂎朣-朥㬿𣎚𣎛𣎝-𣎢𪱭𬂏𬂐㭀𣎜𣎣-𣎨𦡖𬂑-𬂔朦𣎩-𣎭𬂕-𬂘朧𣎮𣎯𪱮𪱯𬂙𣎰-𣎲𪱰𬂚] -[radical 75=⽊木:木朩𣎳𣎴𬂛未-朰𣎵-𣎷𬂜朱-权㭁𣎸-𣏀杄-杩极㭂-㭆𣏁-𣏓𪱱-𪱵𬂝-𬂟杪-枀枂-枭㭇-㭐𣏔-𣐇𪱶-𪱹𫞈𬂠-𬂤枮-树㭑-㭗𣐈-𣐴𪱺-𪲂𬂥𬂦栒-桪鿄㭘-㭧𣐵-𣑦𣑨-𣑾𪲃-𪲏𫞉𫞊𬂧-𬂱桫-棂㭨-㭵㭷𣑿-𣓀𪲐-𪲞𬂲-𬂼棃-椮㭶㭸-㮊𣓁-𣔰𪲟-𪲯𬂽-𬃓椯-榉榋榌榔榘﨓㮋-㮠㮢㮣𣔱-𣕣𣕥-𣖩𪲰-𪳇𬃔-𬃮榊榍-榓榕-榗榙-槡槩樮﨔㮤-㮽𣕤𣖪-𣘔𪳈-𪳜𫞋𫞌𬃯-𬄆槢-槨槪-樭樯-樱橥橴㮾-㯏㯑㯒㯠𣘕-𣙑𣙓-𣙺𪳝-𪳬𫞍-𫞏𬄇-𬄘樲-橤橦-橳橵-橼㯐㯓-㯟㯡-㯩𣙒𣙻-𣛯𪳭-𪳼𫞐𬄙-𬄫橽-檪㯪-㯶𣛰-𣜡𣜣-𣝀𪳽-𪴈𫞑𬄬-𬄶檫-櫊㯷-㯽𣝁-𣝘𣝚-𣞎𪴉-𪴏𫞒𬄷-𬅀櫋-櫦櫫櫭㯾-㰈𣝙𣞐-𣟃𣟑𪴐-𪴕𬅁-𬅈櫧-櫪櫬櫮-櫶㰉-㰓㰖𣟄-𣟐𣟒-𣟮𪴖-𪴚𬅉𬅊櫸-欅欌㰔㰕𣟯-𣠁𣠃-𣠘𪴛-𪴞𬅋-𬅏櫷欆-欋欍欎㰗㰘𣠂𣠙-𣠶𪴟-𪴡𬅐-𬅓欏-欒㰙-㰜𣠷-𣡊𪴢𪴣𬅔欓-欕𣡋-𣡝𥤔𪴤𪴥𬅕-𬅘欖-欛𣡞-𣡨𣡮𪴦欜欝𣡩-𣡭𣡯-𣡱𪴨𬅙𬅚𣡲𣡴𣡵𪴧𬅛欞欟𣡶-𣡼𬅜𣡽-𣡿] -[radical 76=⽋欠:欠-欢𣢀欤㰝㰞𣢁-𣢈𬅝𬅞欣欥-欧㰟-㰢𣢉-𣢖𪴩𬅟欨-欪㰣-㰨𣢗-𣢦𪴪𪴫𬅠𬅡欫-欱㰩-㰭𣢧-𣢹𬅢𬅣欲-欸㰮-㰱𣢺-𣣇𪴬𪴭𬅤-𬅨欹-欿㰲-㰶㰸𣣈-𣣜𪴮𬅩𬅪歀-歈㰹-㰾𣣝-𣣫𣣭-𣣱𪴯𪴰𬅫𬅬歉-歍㰿-㱁𣣲-𣤇𪴱𬅭-𬅯歎-歓㱂㱃𣤈-𣤗𪴲歔-歚㱄㱅𣤘-𣤟𬅰𬅱歛-歝㱆-㱉𣤠-𣤧𬅲歞歟𣤨-𣤫𬅳歠㱊𣤬-𣤰㱋𣤱-𣤳𪴳𣤴𣤵𣤷𣤸𬅴歡㱌𣤶𣤹-𣤼㱍𣤽𬅵𣤾𪴴㱎𣤿-𣥁] -[radical 77=⽌止:止龰𣥂正𣥃𣥄此㱏𣥅𣥆𬅶𬅷步㱐㱑𣥇𣥈𣥊-𣥌𬅸武-歩𣥉𣥍-𣥡𪴵𬅹歪歫㱒-㱔𣥢-𣥤𬅺𬅻歬歭𣥦-𣥱𪴶𬅼𬅽𣥳-𣥸𪴷𬅾-𬆀歮歯㱕㱖𣥹-𣦆𪴸𬆁-𬆃歰-歳𣦇-𣦊𣦌-𣦎𤚜𪴹𪴺𫞓𬆄𬆅歴㱗𣦐-𣦓𪴻𬆆𬆇歵歶𣦔-𣦛𪴼𬆈𬆉歷𣦜-𣦠𪴽𪴾𬆊𬆋𣦡-𣦥𪴿𬆌𬆍歸㱘𣦦-𣦫𬆎𣦬𬆏𬆐𣦮-𣦴] -[radical 78=⽍歹:歹𣦵𣦶歺𣦷死㱙𣦸-𣦾歼𣦿-𣧈歽-殁㱚-㱝𣧉-𣧜殂-殇㱞-㱠𣧝-𣧱𪵀𪵁𬆑𬆒殈-残㰷㱡𣧲-𣨄𪵂𪵃𬆓-𬆕殌-殓㱢㱣𣨅-𣨕𪵄𬆖𬆗殔-殚㱤-㱩𣨖-𣨰𪵅𬆘-𬆚殛殜㱪-㱮𣨱-𣩃𬆛殝-殡㱯-㱲𣩄-𣩌𪵆殢-殦㱳㱴𣩍-𣩜𫞔殧-殫㱵-㱷𣩝-𣩧殬-殮㱸𣩨-𣩮𪵇殯𣩯-𣩶殰殱𣩷𣩸𬆜㱹㱺𣩹-𣩻𬆝殲𣩼-𣩾㱻𣩿-𣪁] -[radical 79=⽎殳:殳㱼𬆞殴㱽𣪂-𣪄𬆟𬆠段殶𣪅-𣪇𬆡𬆢殷㱾㱿𣪈-𣪊𪵈𪵉𬆣𬆤殸-殻㲀𣪋-𣪘𪵋𬆥-𬆧殼殽㲁-㲃𣪙-𣪟𪵌-𪵎𬆨殾-毂㲄𣪠-𣪬𪵏𬆩-𬆬毃毄㲅𣪮-𣪵𬆭毅毆𣪶-𣪺𤛗𪵐𬆮-𬆰毇毈㲆-㲈𣪻-𣫋𬆱㲉𣫌-𣫏𪵑𪵒𬆲𬆳㲊𣫐-𣫗毉𣫘-𣫡𬆴毊𣫢-𣫩𪵓𣫪𣫫𬆵] -[radical 80=⽏毋:毋毌𣫬母毎𣫭每毐𣫮毑毒𣫯-𣫲𬆶𣫳-𣫸𬆷毓𣫹-𣫼𪵔𣫽-𣫿𬆸𣬀𣬁] -[radical 81=⽐比:比毕𠂱𣬂-𣬇毖-毘㲋毙𣬈-𣬌𬆹𣬍𬆺𣬎-𣬑𪵕𣬒-𣬔毚𣬕𣬖𬆻𣬗-𣬚] -[radical 82=⽑毛:毛𣬛𪵖㲌𣬜-𣬠毜毝𣬡-𣬨𬆼毞毟㲍-㲑𣬩-𣬷𪵗𪵘𬆽-𬆿毠毡㲒𣬸-𣭛𪵙𪵚𬇀毢-毪㲓𣭜-𣭰𪵛𪵜毫-毮㲔-㲚𣭱-𣮇𬇁毯-毶㲛-㲞𣮈-𣮧𪵝𪵞毷-毽㲟-㲣𣮨-𣯄𪵟𬇂毾㲤-㲩𣯅-𣯢𪵠𬇃𬇄毿-氂𣯣-𣯷𪵡𬇅氃-氇㲪-㲮𣯸-𣰉𬇆氈-氊𣰊-𣰙𬇇氋㲯㲰𣰚-𣰪𪵢𬇈氌㲱𣰫-𣰰𠫈𣰱-𣰺氍𣰻-𣱁氎㲲𣱂-𣱄] -[radical 83=⽒氏:氏-民𫞕氒𫞖𬇉氓𣱅𣱆𬇊𬇋𣱇-𣱊𬇌㲳𬇍𣱋-𣱐𬇎𣱑-𣱔] -[radical 84=⽓气:气-氘𣱕𣱖氙氚𣱗𣱘氛-氝㲴𣱙-𣱛𪵣𬇏氞-氢𣱜-𣱠𪵤𬇐氣-氩𣱡𬇑氪氫㲵𣱣𪵥氬-氰𣱢𣱤𣱥氱𣱦-𣱨𪵦氲氳𣱩𪵧𬇒㲶𣱪𣱫㲷𣱬𣱭𬇓𣱮-𣱰] -[radical 85=⽔水:水氵氺𣱱氶-氹㲸𣱲-𣱴氻氼氾-汉㲹-㲼𣱵-𣱿𪵨汊-汤㲽-㲿𣲀-𣲍𪵩-𪵬𬇔-𬇗汥-沪㳀-㳊𣲎-𣲱𪵭-𪵰𬇘-𬇚沫-泙泛-泴泶-泾㳋-㳕𣲲-𣳣𪵱-𪵶𬇛-𬇟泚泿-洌洎-洕洗-浕㳖-㳣𣳤-𣴝𪵷-𪵽𬇠-𬇦洍洖浖-涘涚-涩㳤-㳳𣴞-𣵶𣷚𪵾-𪶋𫞗𬇧-𬇴涙涪-渂渄-渗渚湴㳴-㴎𣵷-𣷙𣷛-𣷻𣸊𪶌-𪶖𫞘𬇵-𬈄渃渘渙減-湳湵-溌滋滞鿌㴏-㴤𣷼-𣸉𣸋-𣹜𪶗-𪶩𬈅-𬈕溍-滊滍-滙滛-滝滟-滪漓㴥-㴻𣹝-𣻌𦴶𪶪-𪶾𫞙-𫞛𬈖-𬈤滌滚滫-漊漌-漒演-漼漾-潍㴼-㵉𣻍-𣻳𣻵-𣼘𣼚-𣽂𪶿-𪷊𬈥-𬈱漋漽潎-潿澁-澘澚-澝濐㵊-㵜𣻴𣽃-𣾨𣾪-𣾿𣿁-𣿄𪷋-𪷜𫞜𬈲-𬉇澙澞-濏濑-濓濖㵝-㵮𣾩𣿅-𤀡𪷝-𪷧𫞝𬉈-𬉒澀濔濕濗-濲濴-濸㵯-㵼𣿀𤀣-𤁝𤁟𤁠𪷨-𪷲𬉓-𬉚濹-瀔㵽-㶃𤁞𤁡-𤂜𤂞-𤂠𤂢-𤂲𪷳-𪷹𬉛-𬉞濳瀕-瀮㶄-㶋𤂝𤂡𤂳-𤃧𪷺-𪷿𫞞𬉟-𬉤瀯-灁㶌-㶑𤃨-𤄍𪸀-𪸂𬉥-𬉪灂-灍灏灐㶒-㶘𢌇𤄎-𤄵𪸃-𪸇𬉫-𬉭灑-灘㶙㶚𤄶-𤅉𪸈𪸉𬉮𬉯灙-灜㶛-㶝𤅊-𤅟𪸊𪸋灝-灡㶞㶟𤅠-𤅨𪸌𬉰𬉱灢灣𤅩-𤅯灎灤-灦㶠𤅰-𤅶灧灨𤅷-𤅿𬉲灩灪𤆀𬉳𤆁] -[radical 86=⽕火:火-灭𤆂𪸍灮-灳炇㶡㶢𤆃-𤆌灴-炀㶣-㶥𤆍-𤆜𪸎-𪸐𬉴-𬉺炁-炆炈-炞㶦-㶪𤆝-𤆻𪸑-𪸗𬉻-𬊀炟-烃㶫-㶲𤆼-𤇮𪸘-𪸢𬊁𬊂烄-烮㶳-㶸𤇯-𤈤𪸣-𪸪𫞟𬊃-𬊈烯-焓焕-焘㶹-㷁𤈥-𤉡𪸫-𪸲𫞠𬊉-𬊖焔焙-煀煮㷂-㷍𤉢-𤊱𪸳-𪹃𬊗-𬊨煁-煭煯-煸煺㮡㷎-㷞𤊲-𤋲𤋴-𤌆𤍏𪹄-𪹑𬊩-𬊱煹煻-熙熦蒸㷟-㷪𤌇-𤌱𤌳-𤍎𪹒-𪹠𫞡𬊲-𬊾熚-熥熧-熵黙龦龽㷫-㷲𤌲𤍐-𤍨𤍪-𤍿𤎁𤎃-𤎜𪹡-𪹩𬊿-𬋄熶-燞㷳-㷽𤍩𤎝-𤏟𤏡-𤏴𪹪-𪹳𬋅-𬋌營-燷㷾-㸃𤏵-𤐣𪹴-𪹻𬋍-𬋐燸-爃㸄㸅𤐤-𤑂𤑄-𤑑𦦨𪹼-𪺀𬋑-𬋓爄-爊爌-爎爕㸆㸇㸉𤑒-𤑲𪺁𪺂𬋔-𬋘爋爏-爔爖-爘㸈㸊-㸌𤑳-𤒠𤒨𪺃-𪺅𬋙-𬋝爙-爛㸍𤒡-𤒧𤒪-𤒹爜-爠㸎𤒩𤒺𤒻𤒽-𤓆𪺆𪺇爡爢㸏㸐𤒼𤓇-𤓎𤓐-𤓖𪺈𬋞爣𤓗-𤓛𪺉爤-爦𤓜-𤓞𤓠-𤓣𪺊𪺋𬋟𬋠㸑𤓤-𤓩𪺌爧𤓪𤓬𬋡𬋢爨𤓫𤓭爩𤓮𬋣] -[radical 87=⽖爪:爪爫𤓯-𤓵𪺍爬爭㸒㸓𤓶-𤓼𬋤𬋥爮-爰𤓽-𤔋𪺎𬋦爱𤔌-𤔏𬋧𬋨㸔𤔐-𤔓𪺏𬋩𬋪爲𤔔-𤔖𤔘-𤔛𪺐-𪺓𬋫𬋬𤔜-𤔡𪺔𪺕𬋭𬋮爳㸕𤔢-𤔦𬋯𬋰噕爴𤔧-𤔭𪺖𪺗𬋱𬋲𤔮-𤔱𬋳𬋴𤔲-𤔸𤔼𪺘𪺙𬋵𬋶爵𤔹𤔻𤔽𤔾𤔺𤔿𤕀𬋷𤕂-𤕇𬋸𬋹𤕈-𤕍𬋺𪺚] -[radical 88=⽗父:父爷𤕎𤕏𬋻爸𤕐𤕑㸖𤕒爹㸗𤕓𤕔𪺛㸘𤕕𪺜𤕖𤕗爺㸙𤕘-𤕚𬋼𤕛] +[UCA version = 10.0.0] +# Unified_Ideograph: 87882 characters +[Unified_Ideograph 4E00..9FEA FA0E..FA0F FA11 FA13..FA14 FA1F FA21 FA23..FA24 FA27..FA29 3400..4DB5 20000..2A6D6 2A700..2B734 2B740..2B81D 2B820..2CEA1 2CEB0..2EBE0] + +[radical 1=⼀一:一-丆𠀀-𠀂𫠠𬺰万-丌亐卄𠀃-𠀆𪜀𪜁𫝀𬺱-𬺴不-专丗𠀇-𠀌𪜂𫠡𬺵-𬺹且-世丘-丝㐀𠀍-𠀗𫠢𫠣𬺺-𬺾丞-丢㐁㐂𠀘-𠀚𠀜𠀞-𠀠𫝁𫠤𫠥𬺿-𬻉丣-严丽鿖𠀡-𠀤𠀦-𠀨𠀪𠀫𫝂𫠦-𫠩𬻊-𬻒並丧𠀬-𠀮𠀰-𠀴𪜃𫠪-𫠭𬻓-𬻘鿗𠀵𠀶𠀸𠀺𠀻𪜄𫠮𬻙-𬻝𠀽-𠁀𠤢𪜅𫠯-𫠲𬻞-𬻠𠁁-𠁅𪜆𫠳-𫠵𬻡-𬻥𠁆-𠁈𠁊𠁋𫠶𬻦-𬻨𠁌𠁍𫠷-𫠻𬻩-𬻮𠁎-𠁒𫝃𫠼𫠽𬻯𠁓𠁔𫠾𫠿𬻰𠁕𠁗-𠁛𠁝𤳏𪜇𫡀𠁖𠁟𫡁𫡂𠁠𬻱] +[radical 2=⼁丨:丨丩𠁡𠁢个丫㐃㐄𫡃𫡄中-丰𠁣𪜈𫡅丱𠁥𠁦𬻲𬻳串𠁧𠁨𫡆丳𠁩-𠁬𫡇临𠁭-𠁯𪜉𬻴丵𠁰𠁱𫡈𫡉𬻵-𬻷𠁳-𠁵𬻸𬻹𠁶𫡊𠁸𫡋𫡌𠁹𠁺𫡍𠁻𫡎] +[radical 3=⼂丶:丶丷𪜊丸义𠁼𠁽𬻺丹为𠁿主丼𠂀-𠂂𬻻𪜋举𬻼𠂃𬻽𠂄𬻾𠂅] +[radical 4=⼃丿:丿-乄㐅𠂆-𠂊𬻿-𬼂久-么乊𠂋-𠂎𫝄𫡏𬼃之乌尹𠂏-𠂓𬼄-𬼆乍-乐𠂔-𠂡𫡐𬼇𬼈乑-乔㐆𠂢-𠂧𠂩-𠂫𠂭𪜌𫡑-𫡓𬼉乕𠂯𫡔𬼊乖𠂲𠂳𠂶𫡕-𫡘𬼋乗𠂴𠂷𪜍𫡙𫡚乘𠂹-𠂾𪜎𪜏𫡛𫡜𬼌-𬼏𠂿-𠃂𫡝𬼐𠃃𠃄𫡞𠃆𠃅𬼑𠃇𫡟𫡠𬼒-𬼕𠃈𫡡] +[radical 5=⼄乙:乙-乛𠃉-𠃎𠃑乜九龴𠃏𠃐乞-习㐇-㐉𠃒-𠃔𬼖乣-书㐊㐋𠁾𠃕-𠃝𫡢𬼗𬼘乧㐌-㐏𠃞-𠃣𪜐𫡣𬼙-𬼜乨-买㐐-㐕𠃤-𠃨𪜑𫡤𬼝-𬼢乱乲㐖-㐘𠃩𠃪𠃬𠧝𪜒𪜓𫡥-𫡧𬼣𬼤乳-乸㐙-㐛𠃭-𠃯𪜔𫡨𬼥-𬼧乹-乼㐜-㐠𠂸𠃲-𠃷𪜕𫡩𬼨-𬼫乽𠃸-𠃻𤱡𪜖𪜗𫡪-𫡬𬼬𬼭乾-亀㐡-㐣𠃼-𠄂𪜘𫡭𫡮𬼮-𬼱亁㐤𥝀𪜙𪜚𬼲-𬼴亂-亄𠄃𠄄𪜛𫡯𫡰𬼵𠄅-𠄈𢆡㐥𠄉㐦𠄊𠄋] +[radical 6=⼅亅:亅𠄌了𠄍-𠄐亇𠄑𬼶-𬼸予㐧𠄒-𠄔争𠀩𠄕𬼹亊𠄖-𠄘𪜜事㐨𠄙𬼺𠄚𠄛𪜝𬼻𠄜𠄝𬼼] +[radical 7=⼆二:二𠄞-𠄠亍-亏𬼽云-亖𠄡亗-亚𠄢-𠄧𫡱些亜𠀥𠄨-𠄪𫡲亝-亟㐩𠄫-𠄯𫡳𬼾𠄰-𠄳𬼿𬽀𠄵-𠄸𬽁𠄹𠄺𫡴𠄻𬽂𠄼-𠄾𫡵𫡶𠄿𪜞𫡷𠅀𪜟𫡸𫡹] +[radical 8=⼇亠:亠-亣𠅁𠅂𪜠𪜡𬽃交-产㐪㐫𠅃-𠅇𫝅𬽄亨-亪㐬𠅈-𠅋𪜢𫡺𬽅-𬽇享京㐭𠅌-𠅒𬽈𬽉亭-亲𠅓-𠅕𬽊-𬽌亳𠅖𠅘-𠅝𫡻𬽍𠅞-𠅧𪜣𬽎-𬽒亴亵𠅨-𠅯𠅲𪜤𫡼𬽓𬽔亶亷㐮𠅳-𠅸𠅺-𠅼𠆀𫡽𫡾𬽕-𬽘𠅾𠅿𫡿𫢀𠆁-𠆉𪜥𬽙𬽚亸𠆋-𠆒𠆔𠆖-𠆘𬽛𬽜㐯𫢁𫢂𬽝𬽞𠆚𠆝𪜦𫢃亹𠆞𬽟𫢄𬽠𠆟-𠆡] +[radical 9=⼈人:人亻𠆢亼-亿𠆣-𠆥𫢅什-仓𠆦-𠆨𪜧𫢆-𫢈𬽡𬽢仔-仭㐰-㐷𠆩-𠆭𠆯𠆰𠆳𫝆𫢉𫢊𬽣-𬽨仮-伬佤㐸-㑀𠆴-𠇑𠇓-𠇕𪜨-𪜫𫢋-𫢐𬽩-𬽭伭-佣佥-佨㑁-㑈𠇖-𠈁𪜬-𪜴𫢑-𫢘𬽮-𬽺佩-侭鿇㑉-㑖𠈃-𠈣𠈥-𠈬𪜵-𪜺𫝇𫝈𫢙-𫢝𬽻-𬾄侮-俭㑗-㑢𠈭-𠉢𪜻-𪝂𫢞-𫢩𬾅-𬾙修-倿㑣㑥-㑭𠉣-𠊦𠋟𪝃-𪝊𫝉𫢪-𫢼𬾚-𬾩偀-偿㑤㑮-㑲𠊧-𠋐𠋒-𠋞𠋠-𠋬𪝋-𪝕𫝊𫢽-𫣃𬾪-𬾼傀-傩鿘㑳-㑺𠋭-𠌅𠌇-𠌝𠌠-𠌩𪝖-𪝟𫣄-𫣐𬾽-𬿏傪-働鿙㑻-㒁𠌫-𠍡𠍣𠍤𠍦-𠍬𠎵𪝠-𪝤𫝋𫣑-𫣖𬿐-𬿠僎-僱僳僴僷㒂-㒐𠍥𠍭-𠎗𠎙𠎚𠎝-𠎴𠏐𪝥-𪝪𫣗-𫣢𬿡-𬿮僲僵僶僸-儏㒑-㒘𠎷-𠏏𠏑𠏔-𠏦𪝫-𪝯𫣣-𫣬𬿯-𬿺儐-儞儫鿚㒙-㒜𠏒𠏨-𠐇𪝰-𪝳𫣭-𫣱𬿻-𭀀償-優儬㒝㒞𠐈-𠐛𠐝-𠐢𪝴-𪝶𫣲-𫣸𭀁-𭀅儭-儲㒟㒠𠐣-𠐺𪝷-𪝹𫣹-𫤃𭀆-𭀌儳-儵㒡-㒣𠐻-𠑁𠑃-𠑌𪝺-𪝼𫤄-𫤈𭀍-𭀏儶㒤-㒦𠑍-𠑖𠑞𪝽𫤉-𫤋𭀐𭀑儷-儺㒧㒨𠑗-𠑝𠑟-𠑣𪝾𫤌-𫤑儻儼𠑤-𠑩𭀒儽㒩𠑪-𠑯𫤒-𫤔𭀓𭀔儾𠑰𫤕𭀕𫤖㒪𠑲𠑳𠑵] +[radical 10=⼉儿:儿-元𠑶𭀖-𭀘兄𠑷𠑸𭀙-𭀝充-兊㒫𠑹-𠑼𫤗克-兑𠑽-𠒂𭀞-𭀠兒-兖㒬𠒃-𠒋𪝿𫤘𭀡-𭀤兗-兙𠒌-𠒏𪞀𫝌𫤙𭀥党兛㒭𠒐-𠒖𪞁𭀦𭀧兜-兞㒮𠒗-𠒝𫤚𫤛𭀨兟兠𠒞-𠒣𫤜𫤝𭀩-𭀭兡𠒤-𠒦𪞂𫤞𭀮𭀯兢𠒧-𠒯𫤟𫤠𭀰-𭀳𠒰-𠒲𠒴-𠒷𪞃-𪞅𭀴兣𠒳𠒸-𠒾𭀵𠒿-𠓅𠓇𫤡𫤢𭀶-𭀸㒯𠓆𠓈-𠓊𫤣-𫤦𭀹𭀺𠓋𠓎𪞆𫤧𠓍𠓏𠓐兤𠓑-𠓔𫤨𠓕-𠓚] +[radical 11=⼊入:入兦𠓛內𠓜-𠓞㒰㒱𠓟𭀻全氽㒲𠇒𠓠-𠓣㒳㒴𠓤-𠓨𭀼-𭀾兩𠓩𭀿兪𠓪-𠓬𭁀𠓭-𠓰𪞇𫤩𠓱𠌆𠓲𠓳𫤪𠓴-𠓼𭁁𠓽𭁂𠓾𠓿𭁃] +[radical 12=⼋八:八𠔀公-兯𠔁-𠔄兰𠔅𠔆𭁄共-兴龹𠔈𠔉𪞈𫤫𫤬𭁅𭁆兵㒵-㒷𠔊-𠔏𭁇其-典𠔐𠔑𠩖𫤭𭁈-𭁋兹养㒸𠔒-𠔗𭁌-𭁎兺兼𠔙-𠔛𫤮𫤯𭁏𭁐兽𠔜𠔝𫤰𭁑-𭁓𠔞-𠔧𪞉𫤱𭁔-𭁖兾兿𠔨-𠔮𪞊𫤲𭁗𭁘𠔯-𠔱𠭻𪞋𭁙𪞌𭁚-𭁜冀𠔳-𠔵𪞍𠁜冁𠔶𠔷𫤳𠔸-𠔺𫤴𫤵𭁝㒹𭁞𫤶] +[radical 13=⼌冂:冂𠔼冃-冈𠔽-𠕀𭁟冉-册𠕁-𠕊𭁠再冎𠕋-𠕏𭁡𭁢冏𠕐-𠕕𪞎冐㒺𠕖-𠕚𭁣-𭁩冑冒𠕛𠕜𫝍𭁪𭁫冓冔𠕝-𠕟𭁬-𭁯冕㒻㒼𠕠-𠕢最㒽𠕣-𠕥𭁰𭁱㒾𠕦𠕧𫤷𠕨-𠕪𠕬-𠕰𭁲𠕱㒿𠕲] +[radical 14=⼍冖:冖-冘㓀㓁𠕳𠕴写冚𠕵-𠕸𭁳军农𠕹-𠕿冝𠖀-𠖃𪞏𪞐𫤸冞𠖄-𠖆𪞑𭁴冟冠㓂𠖇-𠖋𫤹𫤺冡-冧𠖌-𠖒𪞒𭁵-𭁻冨𠖓𪞓𭁼-𭁿㓃𠖔-𠖙𪞔𭂀𠖚𠖛𭂁𭂂冩𠖜-𠖞𪞕㓄𫤻𭂃-𭂅冪𠖠-𠖥𫤼𠖦-𠖨𫤽𠖩-𠖫] +[radical 15=⼎冫:冫𠖬𫤾㓅𠖭𭂆𭂇冬-冯𠖮-𠖰𪞖𫤿𭂈冰-冴㓆㓇𠖱-𠖶𪞗-𪞚𫥀-𫥃况-冻鿑㓈𠖷-𠖿𠗁𪞛-𪞝𫥄-𫥈𭂉𭂊冼-净㓉-㓍𠗀𠗂-𠗇𪞞𫥉-𫥋𭂋-𭂎凁-凃㓎㓏𠗈-𠗗𪞟-𪞡𫝎𫥌-𫥎𭂏𭂐凄-凎㓐-㓒𠗘-𠗤𪞢-𪞥𫥏𫥐𭂑-𭂕减-凑㓓𠗥-𠗰𪞦-𪞨𫝏𫥑-𫥔𭂖-𭂘凒-凖㓔㓕𠗱-𠗹𪞩𪞪𫥕𫥖𭂙-𭂛凗㓖𠗺-𠘃𪞫𪞬𫥗𫥘𭂜-𭂞凘㓗𠘄-𠘉𠘓𪞭𫥙𭂟-𭂡凙-凜𠘊-𠘑𪞮𫥚-𫥜𭂢-𭂤凝凞𠘒𠘔𠘕𪞯𭂥凟𠘖-𠘜𥂳𭂦𠘝-𠘡𫥝𭂧𠘢𠘣𪞰𭂨𠘤𠘥鿛𠘦] +[radical 16=⼏几:几𠘧𠘨凡-凤𠘩-𠘰𭂩-𭂬凥-凧𠘱-𠘴凨-凫𠘵-𠘻𪞱𫥞𫥟𭂭-𭂯凬𠘼-𠙅𪞲𭂰凭-凯𠙆-𠙎𠫮𭂱𭂲𠙏-𠙑𭂳𭂴𠙒-𠙖𪞳𫥠凰㓘𠙘𠙙𠙛-𠙞𪞴𫥡𭂵𭂶凱凲𠁉𠙟-𠙣𫥢𭂷𠙤-𠙧𪞵𫥣𭂸𭂹凳凴𠙨-𠙫𠙭-𠙰𭂺𠙱-𠙳] +[radical 17=⼐凵:凵𠙴𠙵凶𠙶-𠙸凷-击𠙹-𠙻𠙽𪞶凼㓙𠙾-𠚊𭂻函𠚋-𠚍𪞷凾𠚎-𠚐𠚒𠚓𪞸𫥤𭂼𠚔-𠚗𭂽凿𠚘𪞹𫥥𫥦𭂾𪞺𪞻𫥧-𫥩𠚙𠚚𢍭𫥪𫥫𭂿𠚜𫥬𭃀𠚝𠚞𭃁𢇕𪞼𠚟𪞽𫥭-𫥯𠚠-𠚢] +[radical 18=⼑刀:刀-刂𠚣刃刄𠚤刅-刈𠚥-𠚬𭃂-𭃄刉-刍㓚-㓜𠚭-𠚴𠚶𠚻𫥰𫥱𭃅-𭃇刎-创㓝㓞𠚵𠚷-𠚺𠚼-𠛍𪞾-𪟀𫥲-𫥴𭃈-𭃌刜-刭㓟㓠𠛎-𠛦𪟁𪟂𫥵-𫥻𭃍-𭃔刮-剂㓡-㓦𠛧-𠜏𪟃-𪟅𫥼-𫥿𭃕-𭃡剃-剑㓧-㓫𠜐-𠜰𪟆𪟇𫝐𫦀𫦁𭃢-𭃨剒-剧㓬-㓰𠜱-𠝜𠝶𪟈𪟉𫦂-𫦅𭃩-𭃳剨剪-剱剶㓱-㓶𠝝-𠝵𠝷-𠝾𪟊-𪟍𫦆-𫦌𭃴-𭃾剩割-創㓷-㓻𠝿-𠞛𠞝-𠞤𪟎-𪟐𫦍-𫦑𭃿-𭄅剷-剿㓼㓽𠞥-𠟁𪟑-𪟓𫦒-𫦔𭄆-𭄏劀-劄㓾-㔉𠟂-𠟟𠟡-𠟥𫦕-𫦙𭄐𭄑劅-劏㔊𠟠𠟦-𠟹𪟔𫦚𭄒劐-劔㔋-㔍𠟺-𠠊𪟕𪟖𭄓-𭄗劕㔎㔏𠠌-𠠚𫦛𭄘𭄙㔐𠠛-𠠠𫦜-𫦞𭄚𭄛劖㔑𠠡-𠠣𫦟𫦠𭄜㔒𠠤𠠦-𠠩劗劘𠠥𠠪-𠠭劙劚𠠮𫦡𠠯𭄝𫦢𠠰𠠱𫦣] +[radical 19=⼒力:力劜𠠲𫦤劝办𠠳-𠠵𭄞功-劢㔓㘞𠆮𠠶-𠠸𭄟𭄠劣-动㔔-㔖𠠹-𠡁𫦥助-労㔗㔘𠡂-𠡐𪟗-𪟙𫦦𫦧劵-势㔙-㔛𠡑-𠡝𪟚𪟛𫦨𭄡-𭄥勀-勋㔜𠡞-𠡪𪟜𫦩-𫦭𭄦-𭄫勌-勑㔝-㔟𠡫-𠡺𪟝-𪟟𫦮-𫦲𭄬-𭄲勒-勖勘-勚㔠𠡻-𠢄𪟠𫦳𭄳-𭄶勛-勞㔡𠢅-𠢒𪟡𪟢𫦴𫦵𭄷-𭄹募-勧𠢓-𠢟𪟣𫝑𫦶𫦷𭄺-𭄾勨-勭㔢𠢠-𠢯𪟤𪟥𫦸𭄿-𭅃勮-勲𠢰-𠢵𪟦𫦹𫦺勳𠢶-𠢸𫦻𫦼勴-勶㔣-㔦𠢹-𠢿㔧𠣀-𠣃𫦽𫦾勷𠣄𠣅勸𠣆𠣇𪟧𠣈-𠣊𫦿𠣋] +[radical 20=⼓勹:勹-匂𠣌𭅄匃-匇𠣍-𠣐𫧀𫧁𭅅匈𠣑-𠣓𭅆匉𠣔-𠣗𭅇𭅈匊-匌𠣘-𠣝𭅉𭅊匍𠣞-𠣣𭅋匎𠣤-𠣭𫧂𫧃匏匐㔨𠣮-𠣴𭅌匑匒㔩𠣵-𠣷𫧄𭅍匓㔪𠣸-𠣼𭅎𭅏𠣽-𠤂匔𠤃𫧅𠤄-𠤇𫧆𠤈-𠤍] +[radical 21=⼔匕:匕𠤎𪟨化㔫𠤏𫧇北𠤐𪟩𭅐𠤑-𠤕㔬𠤖𭅑𠤗-𠤝𪟪𭅒𠤞-𠤡𭅓匘匙㔭𫧈𫧉𠤣-𠤥𪟫𠤦-𠤪𫧊] +[radical 22=⼕匚:匚𠤬𠤭𫧋𭅔匛-匞𫧌𭅕𭅖匟-匢𠤮-𠤱𪟬𫧍-𫧏匣-匥㔯㔰𠤳-𠤷𪟭𪟮𫧐𫧒𭅗𭅘匦𠤸-𠤻𫧑𭅙𭅚匧-匩𠤼-𠥂𠥄-𠥈𪟯𫧓匪匫龨𠥉-𠥍𪟰𫧔𭅛匬-匮㔱𠥎𠥏𭅜𭅝𠥐-𠥕𫧕匯㔲-㔴𠥖-𠥘𫧖匰-匲㔵𠥙-𠥛𪟱𫧗𭅞匳𠥜-𠥡𫧘𫧙匴𠥢𠥣𫧚匵𫧛𫧜𠥤𠥥匶𠥦𠥧匷𠥨𠥩𪟲𠥪𫧝㔶𠥫𠥬] +[radical 23=⼖匸:匸-区𠥭𠤲𠥮𠥯医㔷𠥰-𠥲匼𠥳匽𠥃𠥴𠥵𭅟𠥶匾-區㔸𠥷-𠥺] +[radical 24=⼗十:十-千卅-午㔹𠥻𠥼𠥿𭅠卉半卌𠆱𠥽𠥾𠦀𠦁卋卍-卐㔺㔻𠦂-𠦗𪟳𫝒𫧞卑-卖龺𠦘-𠦢𣥥𫝓𫧟𫧠南単𫝔𫧡𫧢𭅡𭅢𠦣-𠦩𪟴𭅣卙𠦪-𠦯𪟵𭅤博𠦰-𠦳𫧣𭅥𭅦㔼𠦴-𠦼𪟶𫧤𫧥𭅧𠦽-𠦿𪟷𫧦𠧀-𠧄𪟸𪟹𫧧𫧨𭅨-𭅪𠧅-𠧈𪟺𫧩-𫧫𠧉-𠧍𪟻𭅫𭅬𠧎𫧬𪟼𭅭卛𠧏𫧭𠧐𭅮𠧑] +[radical 25=⼘卜:卜𠧒卝卞𪟽卟-卢𠧓𠀝𠧔-𠧘𭅯卣卤𠧙-𠧜𡥋𪟾𭅰卥-卧㔽𠧞-𠧨𫧮𠧩-𠧲𠭉𫧯𠧳-𠧷𠧹𪟿𫧰卨𠧺-𠧿𭅱𠨀-𠨂𠨄𫧱𫧲𠨅𫧳𫧴𠨆𠨇𪠀𫧵𠨈-𠨊𫧶-𫧸𠨋𠨌] +[radical 26=⼙卩:卩-卫㔾㔿𭅲卬𠨍-𠨐𫧹𭅳卭-卯𠨑𭅴印危𠨒-𠨗𫧺𭅵卲-卵㕀𠨘卶-卺㕁𪠁𭅶-𭅺卻-卽𠨙-𠨝𪠂𠨞𭅻𭅼卾卿𫧻𠨟-𠨡𫧼厀厁𠨢-𠨤𫧽𭅽𭅾𠨥𫧾𫧿𭅿𫨀𠨦-𠨪𫨁𠨫] +[radical 27=⼚厂:厂-历𠨬厇-厉𠨭-𠨳𪠃𫨂𭆀厊-厍㕂-㕄𠂬𠂮𠨴-𠨿𭆁厎-厑㕅-㕇𠂰𠩀-𠩉𪠄𫝕𫨃𫨄𭆂𭆃厒-厕㕈㕉𠩊-𠩕𪠅𪠆𫨅-𫨈𭆄厖-厛㕊𠩗-𠩦𪠇-𪠊𫨉𫨊𭆅厜-原虒㕋-㕍𠩧-𠩷𪠋-𪠎𫝖𫝗𫨋𭆆-𭆈厠-厣厩𠩸-𠩾𠪀-𠪆𪠏𪠐𫨌-𫨐𭆉-𭆋厤-厨㕎𠪇-𠪐𪠑𪠒𫨑-𫨗𭆌-𭆐厪厫㕏𠩿𠪑-𠪘𪠓-𪠕𫨘-𫨛𭆑𭆒厬-厰㕐㕑𠪙-𠪬𪠖𪠗𫨜𫨝𭆓-𭆕厱厲㕒𠪭-𠪸𪠘𪠙𫨞𫨟𭆖𠪺-𠪾𫨠-𫨢𭆗厳㕓𠪿𪠚𫨣𠫀-𠫆厴𠫇𪠛𫨤𠫉-𠫎㕔𠫏𫨥𭆘𠫐厵𠫑𠫒] +[radical 28=⼛厶:厶𠫓-𠫖厷-厹㕕𠫗𠫘𫨦厺-厼𠫙-𠫝厽厾𠫞-𠫥𭆙𭆚县𠫦-𠫨𫨧叀-参𠫩-𠫭𠫯-𠫲𠫴-𠫸𪠜𫨨𫨩𭆛-𭆝㕖𠫹-𠫼𪠝𫨪𭆞-𭆢參叄㕗㕘𠫽𠫾𪠞𫨫𭆣叅𠫿-𠬅𦎅𪠟𠬆-𠬌𪠠𫨬-𫨮𭆤叆𠔲𠬍-𠬐叇㕙𠬑𠬒𪠡𠬓𠬕-𠬗𫨯𫨰𠬔𠬘𠬙𪠢𫨱] +[radical 29=⼜又:又叉𭆥及-収㕚㕛𠬚-𠬠𪠣𪠤𫨲叏-发𠬡-𠬨𭆦叒㕜𠬩-𠬰𪠥𫨳𭆧𭆨叓㕝𠬱-𠬸𪠦𫨴-𫨸叔-变㕞𠬹-𠬾𪠧𪠨𫨹𭆩-𭆫叙-叝㕟𠫳𠬿-𠭈𪠩𪠪𫨺𫨻𭆬-𭆮叞叟𠭊-𠭔𪠫𪠬𫨼-𫨿𭆯𭆰𠭕-𠭤𫩀-𫩃𭆱𭆲㕠𠭥-𠭮𪠭𪠮𫩄𫩅𭆳𭆴叠﨎𠭯-𠭵𠭷-𠭺𪠯𫩆𫩇㕡𠭼-𠮂𡪞𪠰𫩈𫩉𭆵𭆶𠮃-𠮆𫩊𭆷叡𠮇-𠮌𪠱𫩋𫩌𠮍-𠮏𫩍𫩎叢𠮐壡𠮑-𠮘] +[radical 30=⼝口:口𠮙-𠮞𫩏古-叾㕣-㕥𠙼𠮟-𠮪𪠲𫩐𫩑𭆸𭆹叿-吗㕦-㕨𠮫-𠯊𫝘𫩒-𫩗𭆺-𭇂吘-呜㕩-㕶𠈂𠯋-𠰇𪠳-𪠵𫩘-𫩞𭇃-𭇍呝-咝㕷-㕿𠰈-𠱏𪠶-𪠹𫩟-𫩪𭇎-𭇝咞-哟㖀-㖎𠀷𠀹𠱐-𠲫𪠺-𪡃𫝙𫩫-𫩼𭇞-𭇴哠-唧㖏-㖞𠲬-𠳤𠳦-𠳪𠳬-𠴥𪡄-𪡎𫩽-𫪑𭇵-𭈋唨-啘啚-啞啠-啪啬-啹㖟-㖵𠳥𠴧-𠶶𪡏-𪡛𫪒-𫪰𭈌-𭈮啙啫啺-喌喎-喾噅㖶-㗑𠶷-𠷡𠷣-𠸵𠸻-𠸾𪡜-𪡩𫪱-𫫂𭈯-𭉙喍喿-嗵㗒-㗡𠷢𠸶-𠸺𠸿-𠹯𠹳-𠻓𪡪-𪡷𫫃-𫫒𭉚-𭉽嗶-嘞嘡-嘧噑噓㗢-㗰𠁷𠻔-𠽠𪡸-𪢄𫝚𫫓-𫫧𭉾-𭊠嘟嘠嘨-噄噆-噐噒噔噖-噝噴㗱-㗺𠆊𠏓𠏧𠹰-𠹲𠽡-𠾦𠾨-𠿆𡀔𡀦𪢅-𪢍𫝛𫫨-𫫵𭊡-𭋁噞-噳噵-噼㗻-㘄𠿇-𡀓𡀕-𡀥𡀧-𡀼𢨐𨗓𪢎-𪢔𫫶-𫬆𭋂-𭋛噽-嚓嚺㘅-㘈𡀽-𡂎𪢕-𪢘𫝜𫬇-𫬑𭋜-𭋯嚔-嚤㘉-㘏𡂏-𡃟𡃰𪢙-𪢞𫝝𫬒-𫬛𭋰-𭌉嚥-嚰㘐-㘒𡃠-𡃯𡃱-𡄈𡄊-𡄐𪢟-𪢡𫬜-𫬫𭌊-𭌡嚱-嚹㘓㘔𡄑-𡄰𪢢-𪢤𫬬-𫬵𭌢-𭌯嚻-囄囍㘕-㘗𡄱-𡅔𡅣𫬶-𫬸𭌰-𭌳囅-囋囎㘘𡅗-𡅢𡅤-𡅯𪢥𫝞𫬹𭌴-𭌽囌囏囐㘙㘚𡅰-𡅸𫬺-𫬼𭌾-𭍅囑-囓𡅹-𡆅𪢦𪢧𫬽-𫬿𭍆-𭍋囔囕㘛𡆆-𡆎𫭀𭍌-𭍏㘜𡆏-𡆘𭍐-𭍒𡆙𡆚𡆞𫭁𭍓𭍔囖𡆛-𡆝𧮥𭍕-𭍘𡆟𭍙] +[radical 31=⼞囗:囗𡆠-𡆢囘-囜龱㘝𠁤𡆣-𡆦𫭂𭍚囝-団㘟𡆧-𡆳囤-囵𡆴-𡇇𪢨𫭃𫭄𭍛𭍜囶-图㘠㘡𠀯𡇈-𡇌𡇎-𡇑𪢩𫭅𫭆𭍝囿圀㘢𡇒-𡇟𪢪𫭇𫭈𭍞𭍟圁-圆㘣𡇠-𡇯𪢫𫭉𫭊𭍠-𭍤圇-國圏𡇰-𡇻𡈀𪢬𪢭𫭋𫭌𭍥-𭍨圌-圎圐𡇼-𡇿𡈁-𡈉𤔗𫭍-𫭏𭍩𭍪圑-圕𡈊-𡈔𪢮𫭐𭍫圖-圙㘤𡈕-𡈡𪢯𫭑𭍬-𭍰圚𡈢-𡈤𡈦-𡈩𫭒𭍱-𭍳圛圜𡈥𡈪-𡈬𪢰𫭓𭍴𡈭-𡈱𫭔𭍵𡈲𭍶𡈳𡈴𭍷㘥𡈵-𡈺𫭕𭍸圝圞𡈻𭍹] +[radical 32=⼟土:土-圡龶𡈼-𡈾𫭖圢-圧㘦𡈿-𡉇𪢱𪢲𫭗𫭘𭍺在-场𡉈-𡉖𪢳-𪢷𫭙𫭚𭍻-𭍽圻-坠㘧-㘰𡉘-𡊃𪢸-𪣂𫭛-𫭤𭍾-𭎄坡-垊㘱-㘵𡊄-𡊶𪣃-𪣊𫭥-𫭨𭎅-𭎎型-垵城鿍㘶-㘾𡊷-𡋛𡋝-𡋬𪣋-𪣓𫭩-𫭯𭎏-𭎛垶-埍埏-埛﨏㘿-㙆𡋭-𡌥𣑧𪣔-𪣣𫭰-𫭻𭎜-𭎨埜-埩埫-堕㙇-㙍𡌦-𡍣𪣤-𪣱𫭼-𫮅𭎩-𭎵埪堖-堼堾-塂塄-塈㙎-㙘𡍤-𡎭𪣲-𪣽𫝟𫮆-𫮑𭎶-𭏋堽塃塉-塱㙙-㙟𡎮-𡏬𧯧𪣾-𪤍𫮒-𫮚𭏌-𭏜塲-墛㙠-㙦𡏭-𡐝𦥈𪤎-𪤘𫝠𫮛-𫮢𭏝-𭏩墜-墧墩-墹㙧-㙯𠚛𡐞-𡑝𪤙-𪤞𫮣-𫮬𭏪-𭏵墺-壌龳㙰-㙶𡑞-𡑹𡑻-𡒈𪤟-𪤥𫝡𫮭-𫮯𭏶-𭏽壍-壗龼㙷-㙺𡒉-𡒠𡒢-𡒯𪤦-𪤫𫮰-𫮵𭏾-𭐀壘壙㙻-㙽𡒰-𡒿𡓁-𡓋𡓍-𡓏𪤬-𪤯𫮶-𫮸𭐁-𭐄壚-壠壢㙾㙿𡓀𡓌𡓐-𡓚𡓜-𡓥𪤰𫮹-𫮼𭐅-𭐉壣-壥㚀𡓦-𡓰𪤱𫮽-𫮿𭐊𭐋壦𡓱-𡓶𡓸𡓹𡓻-𡔁𫯀𭐌-𭐎𡓺𡔂-𡔉𭐏壧壨𡔊-𡔎壩㚁𡔏-𡔕𭐐壪㚂𡔖𭐑𡔗-𡔚] +[radical 33=⼠士:士-壭𡔛壮𡔜壯-壳𡔝-𡔟𭐒壴壵𡔠-𡔢𫯁𫯂壶𡔣-𡔩𪤲壷壸𡔪-𡔭壹-壻㚃𡔮𡔯𭐓-𭐕壼𡔰𡔲-𡔵𪤳𭐖壽壾𡔶𡔸-𡔻𫯃𫯄𭐗壿夀㚄𡔼𡔽𫯅𭐘夁𡔾-𡕄𭐙𡕅𡕇-𡕌𭐚𡕍𫯆𫯇𡅕𡕏-𡕑𪤴𫯈𭐛𫯉𭐜] +[radical 34=⼡夂:夂𡕒夃处𡕓𡕔𭐝夅𡕕𡕖夆𡕗-𡕙备夈㚅𡕚𭐞𠙚𡕛𡕜𪌛𡕝𫯊𪤵] +[radical 35=⼢夊:夊𭐟𡕞𡕟夋𡕠𡕡夌𡕢-𡕥𭐠𭐡変复㚆㚇𭐢-𭐤夎夏𠀼𡕦𫯋𫯌𭐥𭐦𡕧-𡕬𭐧𠌞𡕭𠭶𡕮-𡕱𪤶𭐨𭐩夐𡕲-𡕵𭐪𭐫𡕶𡕷𭐬𡕸-𡕺𭐭𭐮𡕻𭐯夑夓𡕼-𡕿𭐰夒𡖀𭐱𡖁夔𭐲𡖂𡖃] +[radical 36=⼣夕:夕-夘㚈𡖄-𡖆夙-夛𡖇-𡖉𪤷𫝢𭐳𭐴𡖊-𡖌𫝣𭐵夜夝㚉𡖍-𡖏𪤸𫯍𭐶𡖐𡖑𪤹夞𠅗𡖒-𡖜𢻈𪤺𫯎够夠𡖝-𡖥𪤻𫯏𫯐𭐷𭐸夡㚊𠅱𠨃𡖦-𡖮𡖰𪤼𫯑𫯒𭐹-𭐻𡖯𡖱-𡖵夢-夥㚋㚌𡖶-𡖾𢆣𪤽𫯓𫯔𭐼𭐽夦𡖿-𡗁𪤾𫯕𭐾𭐿𠆓𠆕𡗂-𡗅𪤿𫯖𫯗𠆙𡗆-𡗈𫯘𭑀㚍𡗉𡗊𭑁𡗋𡗌𡗐𡗍𡗎𪥀𫯙𡗏𣡳𫯚𡗑] +[radical 37=⼤大:大-夭𡗒-𡗔𪥁𫯛央-头㚎𡗕-𡗛𪥂𭑂夵-夼㚏-㚑𠀛𡗝-𡗤𪥃𫯜𭑃夽-奂㚒㚓𡗥-𡗶𪥄-𪥆𫯝-𫯟𭑄𭑅奃-奉奋-奍㚔-㚙𡗷-𡘌𪥇-𪥌𫯠-𫯢𭑆-𭑋奎-奖㚚㚛𡘍-𡘜𪥍-𪥏𫯣-𫯥𭑌-𭑎奊套-奚𡘝-𡘳𪥐-𪥒𫝤𫯦𫯧𭑏-𭑒奛-奞㚜-㚞𡘴-𡙆𪥓-𪥕𫯨𭑓-𭑖奟-奥㚟𡔱𡙇-𡙚𪥖-𪥘𫯩-𫯯𭑗-𭑛奦-奨㚠𡙛-𡙫𪥙-𪥛𫯰-𫯴𭑜-𭑟奩-奬𡙬-𡙶𪥜-𪥞𫯵-𫯷𭑠奭𡙷-𡚅𪥟-𪥡𫯸-𫯼奮奯㚡𡚆-𡚎𤏠𫝥𫯽-𫰀𭑡-𭑣𡚏-𡚖𫰁𭑤奰𡚗𡾗𪥢𭑥𡚘-𡚚𫰂𭑦𡚛𪥣𫰃𫰄𡚜𡚝奱𡚞-𡚢𫰅奲𡚣-𡚥] +[radical 38=⼥女:女𡚦𫰆奴-奶㚢𡚧-𡚭𫰇𭑧-𭑫奷-妈㚣-㚨𡚮-𡚻𪥤𪥥𫰈-𫰊𭑬𭑭妉-妌妎-妫㚩-㚯㛠𡚼-𡛘𪥦-𪥬𫝦𫰋-𫰖𭑮𭑯妬-姗㚰-㛁𡛙-𡜁𪥭-𪥰𫰗-𫰛𭑰-𭑵妍姘-姫姭-娃娅-娈㛂-㛌𡜂-𡜭𪥱-𪥵𫝧𫝨𫰜-𫰩𭑶-𭑹姬娉-娫娭-娴娽㛍-㛟㛡-㛤𡜮-𡝝𪥶-𪥺𫝩-𫝫𫰪-𫰶𭑺-𭑿娬娵-娼娾-婶㛥-㛭𡝞-𡞛𪥻-𪦅𫰷-𫱂𭒀-𭒄婷-媏媑-媯嫏㛮-㜄𡞜-𡟧𡠣𪦆-𪦐𫝬𫱃-𫱐𭒅-𭒌媐媰-嫎嫐-嫔㜅-㜔𡟨-𡠕𪦑-𪦖𫱑-𫱞𭒍-𭒑嫕-嫲㜕-㜢𡠗𡠙-𡠢𡠤-𡠱𡠳-𡡎𪦗-𪦟𫝭𫱟-𫱫𭒒-𭒝嫳-嬏㜣-㜨𡠖𡠘𡠲𡡏-𡢍𡢐𪦠-𪦥𫝮𫱬-𫱷𭒞-𭒡嬐-嬢嬴㜩-㜭𡢎𡢑-𡣄𪦦-𪦪𫱸-𫲄𭒢-𭒥嬣-嬳嬵-嬷㜮㜯𡣅-𡣡𡣣-𡣩𪦫𫲅-𫲌𭒦-𭒨嬸嬺-嬽㜰㜱𡣪-𡣼𪦬-𪦯𫲍-𫲓𭒩-𭒭嬹嬾嬿㜲-㜵𡣽-𡤍𡤞𪦰𪦱𫲔-𫲙𭒮孀-孆㜶-㜸𡤎-𡤗𪦲𫲚𫲛𭒯-𭒳孇-孉㜹𡤘-𡤝𡤟𡤠𪦳𪦴𫲜𫲝孊-孌㜺𡤡-𡤪𫲞𫲟孍𡤫-𡤭𪦵𫲠孎孏𡤮-𡤳𭒴𡤴-𡤶𭒵㜻㜼𡤷-𡤻] +[radical 39=⼦子:子-孓𡤼孔𡤽孕𡤾-𡥂𫲡𭒶-𭒹孖-孙㜽𡉗𡥃-𡥅𭒺-𭒼孚-孞㜾㜿𡥆-𡥊𡥌𡥍𪦶-𪦹孟-孧㝀𠃱𡥎-𡥚𪦺𫲢-𫲤𭒽-𭓀孨-孪㝁𡥛-𡥧𪦻𫲥𭓁𭓂孫-孭㝂㝃𡥨-𡥭𢈲𨹴𫲦𭓃-𭓇孮-孰孲𡥮-𡥵𪦼-𪦾𫲧𫲨𭓈-𭓎孱㝄𡥶-𡦂𪦿𫲩𫲪𭓏-𭓔孳孴㝅𡦃-𡦐𫲫𫲬𭓕𭓖孵-孷𡦑-𡦖𪧀𫲭𫲮𭓗𭓘㝆𡦗-𡦝𫝯𫲯𫲰學孹㝇𡦞-𡦨𪧁𫲱𫲲𭓙𭓚孺孻𡦩𪧂𪧃𭓛𡦪-𡦬孼𡦭-𡦰𫲳𭓜孽孾𡦱-𡦶𪧄孿𡦷𫲴㝈𡦸𭓝] +[radical 40=⼧宀:宀㝉𡦹宁-宄㝊㝋𡦺-𡦼宅-安㝌㝍𡦽-𡧊𫲵𫲶𭓞宊-宒㝎-㝑𡧋-𡧕𪧅-𪧇𫲷-𫲽𭓟-𭓡宓-审㝒𡧖-𡧨𪧈𪧉𫲾-𫳀𭓢-𭓩客-宦宨-宫㝓-㝖𡧩-𡧿𪧊-𪧌𫳁-𫳆𭓪-𭓯宧宬-宾㝗-㝚𡨀-𡨡𪧍-𪧐𫳇-𫳏𭓰-𭓳宿-寉㝛-㝡𡨢-𡨼𪧑-𪧓𫳐-𫳙𭓴-𭓿寊-寕寪㝢㝣𡨽-𡩞𪧔-𪧚𫳚-𫳣𭔀-𭔅寖-寝㝤-㝨𡩟-𡩺𪧛-𪧠𫳤-𫳮𭔆-𭔌寞-寨㝩-㝬𡩻-𡪝𪧡-𪧥𫝰𫳯-𫳼𭔍-𭔐審寫-寮㝭-㝯𡪟-𡪽𪧦-𪧪𫝱𫳽-𫴁𭔑-𭔖寯寰𡪾-𡫐𪧫-𪧮𫴂-𫴏𭔗-𭔙寱寲𡫑-𡫝𪧯𫴐-𫴗𭔚-𭔞㝰𡫞-𡫫𪧰-𪧲𫴘-𫴛𭔟-𭔡寳-寵𡫬-𡫶𫴜-𫴟𭔢-𭔤寶𡫷-𡫻𪧳𪧴𫴠𭔥𭔦寷㝱𡫼-𡬃𪧵𫴡-𫴣𭔧𡬄-𡬋𫴤𫴥𭔨𡬌𫴦𫴧𡬍𡬏𡬐𪧶𫴨-𫴪𡬑𡬓-𡬕㝲𡬖-𡬘𡬎𡬙𡬚𡬒𡬛𫴫𡬜] +[radical 41=⼨寸:寸𡬝对㝳寺-导𡬞𪧷𭔩寽-寿㝴𭔪尀㝵𡬟-𡬦𭔫𭔬封専将𡬧-𡬬𫴬𭔭-𭔯尃-尅㝶𡬭𫴭𭔰-𭔲將-尉𡬮-𡬲𪧸𪧹𭔳-𭔵尊-尌㝷𡬳-𡬸𪧺𫴮𫴯𭔶-𭔸𡬹-𡬼𫴰-𫴳𭔹-𭔼對𡬽-𡭂𭔽-𭔿導𡭃-𡭉𣊒𪧻𪧼𫴴𫴵𭕀𭕁𡭊-𡭌𪧽𭕂𡭍-𡭏𪧾𡭐𡭑𭕃𡭒𡭓𫴶𫴷] +[radical 42=⼩小:小𡭔𭕄尐少𡭕𡭖尒-尕龸𡭗𡭘尖-尘𡭙-𡭜𭕅𡭝-𡭤𪧿𫴸𫴹𭕆𭕇尙尚𠈤𡭥-𡭩𪨀𫴺𫴻𭕈𭕉尛-尝𡭪-𡭳𫴼𫴽𭕊㝸𡭴-𡭼𪨁𪨂𡭽-𡮍𫴾-𫵃尞㝹𡮎-𡮗𫵄𫵅尟尠𠅽𡮘-𡮝𭕋尡㝺𡮞-𡮥𪨃𫵆𫵇㝻𡮦-𡮯𪨄𫵈𫵉𡮰-𡮳𪨅𫵊-𫵌𭕌𡮴-𡮶𢇔𪨆𡮷-𡮻𤯏𡮼-𡮾𫵍𡮿𡯀] +[radical 43=⼪尢:尢尣𡯁𡯂尤𡯃-𡯊𫵎尥-尧㝼𡯋-𡯎𭕍尨-尬㝽𡯏-𡯙𫵏尭㝾㝿𡯚-𡯡𫵐𭕎尮尯㞀㞁𡯢-𡯤𡯦𡯧㞂𡯨-𡯲㞃-㞆𡯳-𡯸𫵑𭕏𭕐尰就㞇㞈𡯹-𡰂𪨇尲-尴㞉㞊𡰃-𡰊𪨈𭕑𭕒𡰋-𡰏𭕓尵𡰐-𡰕𫵒𡰖-𡰚尶尷𡰛-𡰢] +[radical 44=⼫尸:尸𡰣尺-尼㞋𡰤-𡰨𡰴𭕔尽㞌㞍𡰩-𡰳𫝲尾-屃㞎𡰵-𡰽𪨉-𪨋𫵓-𫵕屄-届㞏-㞑𡰾-𡱋𪨌𫵖-𫵘𭕕-𭕘屋-屏㞒-㞖𡱌-𡱡𢇀𪨍𪨎𫵙-𫵝𭕙-𭕝屐-屘㞗𡱢-𡱹𪨏𪨐𫵞𫵟𭕞𭕟屙-屝㞘㞙𡱺-𡲓𪨑𫵠𭕠-𭕣属-屡㞚㞛𡲔-𡲫𪨕-𪨘𭕤𡲬-𡳃𪨒-𪨔𫵡𭕥-𭕭屢屣㞜-㞞𡳄-𡳏𪨙𪨚𫵢-𫵥𭕮𭕯層-屧㞟㞠𡳐-𡳞𪨛𪨜𭕰-𭕵𡳟-𡳧𪨝𫵦𫵧屨𡳨𡳩𪨞𫵨𭕶屩屪𡳪𡳫𫵩𭕷𭕸屫㞡𡳬-𡳰𪨟𪨠𫵪𫵫𭕹𭕺𡳱-𡳴屬𡳵-𡳷𫵬𫵭𭕻𡳸-𡳺𪨡𭕼屭𡳻𭕽𡳼𡳽] +[radical 45=⼬屮:屮𡳾屯㞢𡳿𭕾屰𡴀-𡴅𭕿㞣㞷𡴆-𡴚𫵮𡴛-𡴥𫵯𫵰𡴦-𡴬] +[radical 46=⼭山:山乢屲𡴭-𡴯屳-屷㞤-㞧𡴰-𡴽𫵱-𫵴𭖀屸-岃㞨-㞯𡴾-𡵒𪨢-𪨥𫝳𫵵𭖁-𭖄岄-岌岎-岜㞰-㞶㞸𡵓-𡶂𪨦-𪨨𫵶𫵷𭖅-𭖊岝-峅㞹-㟃𡶃-𡶣𡶥-𡶪𪨩-𪨮𫵸𫵹𭖋-𭖔岍峆-峧㟄-㟆𡶫-𡷔𪨯-𪨴𫝴𫵺𫵻𭖕-𭖞峨-崅㟇-㟖𡷕-𡸐𦊤𪨵-𪨺𫝵𫵼-𫶀𭖟-𭖨崆-崰㟗-㟥𡸑-𡹩𪨻-𪩁𫶁-𫶅𭖩-𭖱崱-嵉嵋-嵝﨑㟦-㟯𡹪-𡺩𪩂-𪩇𫶆-𫶉𭖲-𭖿嵊嵞-嵶㟰-㟸𡺪-𡻗𪩈-𪩋𫶊-𫶐𭗀-𭗆嵷-嶎㟹-㠄𡻘-𡼉𪩌-𪩒𫶑-𫶔𭗇-𭗓嶏-嶥㠅-㠐𡼊-𡼼𪩓-𪩖𫶕𫶖𭗔-𭗞嶦-嶶㠑-㠗𡼽-𡽈𡽊-𡽛𪩗-𪩚𫶗-𫶜𭗟𭗠嶷-嶺嶼-嶿㠘-㠜𡽉𡽜-𡾁𡾻𪩛-𪩝𫶝𭗡-𭗤巀-巂㠝-㠟𡾂-𡾖𡾠𫶞𭗥-𭗫嶻巃-巅㠠-㠣𡾘-𡾟𡾡-𡾭𣦭𪩞𫶟-𫶣𭗬-𭗱巆-巌㠤𡾮-𡾺𭗲-𭗴巍巏巐㠥㠦𡾼-𡿆𪩟𫶤𭗵𭗶巎巑-巕巗㠧𡿇-𡿑𪩠𭗷巖巘-巚𡿒𡿓𭗸𡿔-𡿜𫶥𭗹𡿝-𡿟𫶦𡿠𡿡𡿣𡿤㠨𡿢𡿥] +[radical 47=⼮巛:巛-川𡿦𡿨𫶧𡿧𭗺州巟㠩𡿩-𡿭𭗻𭗼巠𡿮-𡿰𪩡𭗽𭗾𡿱-𡿶𭗿𡿷-𡿻𪩢𭘀𠙗𡿼𡿽𫶨𭘁巢巣𡿾-𢀀𫶩𢀁𢀂巤𢀃-𢀋𫶪𢀌-𢀐] +[radical 48=⼯工:工㠪𢀑-𢀕𭘂左-巨𢀖-𢀙巩巪𢀚𢀛𪩣𭘃-𭘅巫𢀜-𢀞𫶫𢀟𫶬𭘆巬巭𢀠𫶭𭘇𭘈差㠫㠬𢀡-𢀣𪩤𫶮巯㠭𢀤𢀥𪩥巰𢀦𢀧𪩦𫶯𭘉𪩧𫶰㠮𢀨-𢀫𫶱𢀬𢑰𤀢𫶲𫶳𢀭𪩨𫶴𢀮𪩩𢀯-𢀲𪩪] +[radical 49=⼰己:己-巴𢀳㠯𢀴-𢀶𫶵巵𪩬𭘊巶㠰𢀷𢀸𪩫𭘋𭘌巷-巻𢀹-𢀻𭘍巼𢀼-𢀿𫶶㠱𢁀-𢁄𫶷巽𢁅-𢁉𪩭𪩮𫶸𫶹𭘎𭘏𢁊𪩯𢁋-𢁍𢁏𪩰𪩱𫶺𢁎𢁐𫶻𫶼𭘐𢁑] +[radical 50=⼱巾:巾-帅㠲㠳𢁒-𢁔𪩲𫶽𫶾帆-师㠴-㠶𢁕-𢁤𭘑𭘒帉-帐㠷-㠼𢁥-𢁺𫶿-𫷂𭘓𭘔帑-帜㠽-㡀𢁻-𢂏𫷃𫷄𭘕-𭘚帝-帧㡁-㡆𢂐-𢂰𫷅𭘛-𭘞帨-帱㡇㡈𢂱-𢃌𪩳𭘟-𭘣帲-帼㡉-㡎𢃍-𢃪𪩴-𪩷𫷆𫷇𭘤-𭘦帽-幇幉㡏-㡖𢃫-𢄉𪩸-𪩺𫷈𫷉𭘧-𭘮幊-幏㡗-㡛𢄊-𢄞𫷊-𫷏𭘯-𭘱幈幑-幙幛㡜-㡟𢄟-𢄲𪩻𭘲-𭘴幚幜-幥㡠㡡𢄳-𢅌𪩼𭘵幦-幩㡢-㡤𢅍-𢅞𪩽𫷐𫷑𭘶-𭘸幪-幬㡥㡦𢅟-𢅨𪩾幭-幯𢅩-𢅬𭘹-𭘻幰𢅭-𢅷𪩿𫷒𫷓𭘼幱㡧㡨𢅸-𢅺𪪀𢅻-𢅽㡩㡪𢅾-𢆂𭘽𢆃-𢆈] +[radical 51=⼲干:干平𢆉年幵𫷔𭘾𢆊-𢆌𪪁𫷕𫷖并-幸𢆍-𢆐𭘿𭙀𢆑-𢆕𭙁𢆖-𢆙𭙂𭙃𢆚𪪂𪪃𫷗𢆛-𢆝𪪄幹𢆞-𢆠𪪅𪪆𫷘-𫷚𢆢𢆤𫷛𭙄-𭙆𢆥𪪇𫷜𫷝𢆦-𢆪𪪈𫷞𭙇𢆫𪪉𢆬-𢆮] +[radical 52=⼳幺:乡幺幻𢆯-𢆱𭙈𭙉幼𢆲-𢆵𭙊𢆶𪪊𢆷-𢆺𭙋𢆻-𢆾幽𢆿𢇂𪪋𫷟𭙌𢇁𢇃-𢇉幾㡫㡬𢇊𫷠𫷡𠅹𢇋𫷢𫷣㡭𢇌-𢇓𫷤㡮𢇖] +[radical 53=⼴广:广-広𠆲𫷥𭙍-𭙏庄-庆㡯-㡱𢇗-𢇢𫷦𭙐-𭙒庇-应庘㡲㡳𢇣-𢇱𪪌𪪍𫷧𭙓-𭙗底-店庙-废㡴-㡻𢇲-𢈆𪪎𪪏𭙘𭙙庠-度㡼-㢂𢈇-𢈘𪪐𪪑𫷨𫷩𭙚𭙛座-庯㢃-㢇𢈙-𢈱𪪒-𪪗𫷪-𫷯𭙜-𭙡庰-庼㢈-㢌𢈳-𢉕𢉗-𢉚𪪘𪪙𫝶𫝷𫷰-𫷵𭙢𭙣庽-廃廊㢍-㢐𢉛-𢉻𢉽𢉾𪪚𪪛𫷶-𫷹𭙤-𭙧廅-廉廋廌㢑𢉼𢉿-𢊔𪪜𪪝𫷺𫷻𭙨-𭙭廄廍-廘㢒-㢕𢊕-𢊬𪪞-𪪠𫷼-𫷿𭙮-𭙳廙-廤㢖-㢘𢊭-𢋁𪪡-𪪣𫸀𭙴-𭙻廥-廪㢙-㢜𢋂-𢋐𪪤𪪥𫸁𫸂𭙼-𭚃𢋑-𢋛𢋝-𢋠𪪦-𪪨𫸃-𫸆𭚄廫𢋡-𢋭𪪩𫸇𭚅-𭚈廬廭龐㢝𠓌𢋮-𢋺𪪪𫸈𭚉-𭚋廮-廰㢞𢋻-𢌃𫸉𭚌廱𢌄-𢌆𪪫𫸊𭚍𭚎廲𢌈-𢌌𫸋𫸌𭚏𭚐𢌍-𢌑𫸍𫸎𢌒𭚑廳𫸏𢌓𫸐𢌔-𢌖] +[radical 54=⼵廴:廴𢌗廵㢟𢌘-𢌚𪪬𫸑延廷𢌜𭚒-𭚔廸廹㢠𢌛𢌝𢌞𪪭𪪮𭚕建-廼𢌟廽𢌠-𢌥𪪯𢌦𢌧𪪰𫸒𫸓𢌨-𢌪𪪱𢌫𣉡𦋪𪪲𫸔𫸕] +[radical 55=⼶廾:廾𢌬廿开𢌭弁𢌮𢌯异𢌰-𢌲𫸖弃-弅𢌳𢌵-𢌺𪪳弆𢌻𢌽-𢍁𪪴𫸗-𫸙弇弈𢌴𢌼𢍂-𢍌𭚖弉𢍍-𢍓𪪵𫸚𫸛𭚗𭚘𢍔-𢍙𫸜𫸝𢍚-𢍡𪪶𫸞𢍢-𢍥𪪷𫸟𭚙㢡𢍦-𢍫𭚚弊㢢𢍬㢣𢍮-𢍱𫸠𫸡𭚛-𭚝𢍲-𢍴𪪸𫸢𫸣𢍵𫸤𢍶𪪹𭚞𢍷-𢍹] +[radical 56=⼷弋:弋𢍺弌𢍻𢍼弍𭚟-𭚡弎-弐𢍽𢍾㢤𢍿-𢎅㢥𢎆-𢎍𭚢弑𢎎弒㢦𢎏𢎐𣦏𭚣𭚤𢎑-𢎖] +[radical 57=⼸弓:弓𢎗𢎘弔-弖㢧𢎙-𢎡𭚥弗弘𢎢-𢎪弙-弜㢨-㢫𢎫-𢎶𪪺𫸥-𫸧𭚦弝-张㢬㢭𢎷-𢏅𫸨-𫸪𭚧𭚨弡-弪㢮-㢱𢏆-𢏓𪪻𫸫-𫸭𭚩-𭚫弫-弯㢲-㢷𠄴𠔘𢏔-𢏣𪪼𪪽𫸮-𫸲𭚬-𭚰弰-弳㢸㢹𢏤-𢏭𪪾𫸳-𫸶𭚱-𭚵弴-弹㢺-㢼𢏮-𢏿𪪿𫸷𫸸𭚶-𭚹强-弾㢽-㢿𢐀-𢐉𪫀𪫁𫸹𫸺𭚺-𭛁弿-彂㣀-㣂𢐊-𢐑𭛂𭛃彃-彅㣃𢐒-𢐝𪫂𫸻𭛄彆-彉㣄㣅𢐞-𢐤𫸼𫸽𭛅-𭛇彊彋𢐥-𢐪𫸾𫸿𭛈𭛉彌𢐬-𢐱𪫃𫹀𭛊𭛋彍𢐲-𢐷𫹁𭛌𢐸-𢐾𤯽𢐿-𢑅𫹂㣆𢑆-𢑉𪫄𫹃彎𢑊彏𢑋𢑌𪫅𢑍𢑎] +[radical 58=⼹彐:彐-当𢑏-𢑒𪫆𢑓彔录㣇𢑔𢑕𫹄𭛍𭛎彖𢑗-𢑚𭛏𢑛-𢑝彗𢑞-𢑡𭛐彘𢑢-𢑤𫹅𫹆𭛑𭛒彙彚𢑥-𢑮𣼙𫹇𫹈彛彜㣈𢑯𢑱𢑲彝彞𢑳-𢑶𪫇彟𢑷-𢑾彠𢑿] +[radical 59=⼺彡:彡𢒀-𢒂㣉𢒃-𢒆形-彤㣊𢒇𢒈㣋-㣍𢒉-𢒍𭛓彥彦𢒎𫝸彧彨𢒏-𢒓𣥲𪫈𫹉彩彫彬㣎𢒔-𢒝彭㣏㣐𢒞-𢒣彮𢒤-𢒨𭛔𭛕彯彰㣑𢒩𢒪𭛖-𭛘影㣒𢒫-𢒯𪫉𭛙-𭛛㣓𢒰-𢒴𪫊𫹊𢒵𢒷𢒶彲𢒸-𢒻] +[radical 60=⼻彳:彳𢒼𢒽㣔𢒾𢒿𫹋彴彵㣕𢓀-𢓃𫹌𭛜𭛝彶-彻鿈鿉㣖㣗𢓄-𢓑𪫋𫹍-𫹐𭛞彼-径㣘㣙𢓒-𢓛𪫌𫹑𭛟-𭛦待-徍徔㣚-㣡𢓜-𢓩𫹒𫹓𭛧-𭛩徎-従徕㣢㣣𢓪-𢔀𪫍𪫎𫹔𫹕𭛪-𭛮徖-徙徛-徤㣤-㣩𢔁-𢔞𪫏𪫐𫹖-𫹘𭛯-𭛶徚徥-徫㣪-㣮𢔟-𢔫𢔭-𢔱𪫑-𪫓𫹙-𫹝𭛷-𭛼徬-徰㣯𢔲-𢕎𢕧𪫔𪫕𫹞-𫹠𭛽徱徳徴㣰-㣲𢕏-𢕦𢕨𢕩𪫖-𪫘𫹡𫹢𭛾-𭜀徲徵-徺㣳㣴𢕪-𢕸𫹣-𫹥𭜁-𭜅徻徼㣵㣶𢕹-𢖄𢖆𢖇𪫙𭜆-𭜈徽徾㣷𢖈-𢖊𢖌-𢖎𪫚𫹦𢖏-𢖗𪫛𪫜𫹧𫹨𭜉徿㣸𢖘-𢖚𢖜𭜊忀忁㣹𢖝-𢖠𢖢忂𢖣𢖤𫹩𢖥𢖦𫹪𢖧𢖨] +[radical 61=⼼心:心忄𢖩必忆㣺𢖪忇-忊㣻𢖫-𢖱𪫝𫹫-𫹭忋-応㣼-㤀𢖲-𢗈𪫞𫹮-𫹱𭜋-𭜎忝-怆㤁-㤋𢗉-𢗾𪫟-𪫥𫝹𫹲-𫹹𭜏-𭜘怇-怿㤌-㤙𢗿-𢘳𪫦-𪫬𫹺-𫹿𭜙-𭜧恀-恽㤚-㤭㤺𢘴-𢙰𪫭-𪫴𫺀-𫺋𭜨-𭜵恾-悯㤮-㤹㤻-㤽𢙱-𢚿𪫵-𪫾𫺌-𫺕𭜶-𭝋悰-惯㤾-㥙𢛀-𢜧𪫿-𪬆𫺖-𫺟𭝌-𭝠惰-愦慨㥚-㥫𢜨-𢞌𪬇-𪬒𫺠-𫺭𭝡-𭝶愧-慑㥬-㥻𢞍-𢟟𪬓-𪬞𫺮-𫺷𭝷-𭞌慒-慧慩-慬慮-憈㥼-㦈𠕫𢟠-𢠰𦑑𪬟-𪬧𫺸-𫻂𭞍-𭞥慭憉-憳㦉-㦖𢠱-𢢑𪬨-𪬭𫻃-𫻉𭞦-𭞹憴-憺憼-懔㦗-㦙𢢒-𢣍𦡗𪬮-𪬶𫻊-𫻏𭞺-𭟄憻懕-懨㦚-㦠𢣎-𢣺𪬷-𪬹𫻐-𫻒𭟅-𭟌懩-懴㦡㦢𢣻-𢤥𦻇𪬺-𪬾𫻓-𫻙𭟍-𭟗懵-懸㦣-㦧𢤦-𢥊𪬿𪭀𫻚-𫻜𭟘-𭟞懹-懻㦨-㦪𢥋-𢥖𪭁𪭂𫻝-𫻡𭟟-𭟢懼-懿𢥗-𢥤𪭃𪭄𫻢-𫻤𭟣-𭟦戀-戂㦫㦬𢥥-𢥮𪭅𪭆𭟧戃戄𢥯-𢥺𪭇戅戆𢥻-𢦂𭟨-𭟪𪭈𭟫𭟬𢦃𢦄𭟭戇㦭𢦅-𢦇𫻥𢦈-𢦋] +[radical 62=⼽戈:戈-戋𢦌𢦍𪭉𭟮戌-成𢦎-𢦑𪭊𫻦𫻧我-戓㦮㦯𢦒-𢦙𫻨𭟯戔-戗㦰-㦲𢦚-𢦥𫻩𫻪𭟰-𭟲战㦳𢦦-𢦶𪭋𪭌𫻫𫻬𭟳戙㦴-㦶𢦷-𢦾𪭍𪭎𫻭-𫻱戚-戝㦷𢦿-𢧇𪭏𪭐𫻲-𫻶𭟴𭟵戞戟戦㦸𢧈-𢧓𪭑𫻷-𫻾𭟶戠-戥㦹𢧔-𢧡𪭒𫻿𫼀𭟷戧-戬㦺𠎶𢧢-𢧧𢧩-𢧱𪭓𫼁𭟸𭟹戭-戯戱㦻㦼𢧨𢧲-𢨆𫼂𫼃𭟺-𭟼戰𢨇-𢨏𢨑𢨒𪭔-𪭖𫼄-𫼈𭟽戲戴㦽𢨓-𢨗𭟾戳𢨘-𢨣戵𪭗] +[radical 63=⼾戶:戶-戹𢨤𢨥𭟿𢨦-𢨩戺-戼㦾𢨪-𢨮𭠀戽-所㦿㧀𢨯-𢨵𫼉𭠁𭠂扁-扃㧁㧂𢨶-𢩄𪭘𫼊𭠃-𭠆扄-扇𢩅-𢩌𫼋𫼌扈𢩍-𢩐𪭙𫼍𫼎扉扊𢩑-𢩕𫼏𫼐𭠇-𭠉𢩖𢩗𤟵𫼑𢩘-𢩞𪭚𭠊𢩟𭠋𢩠𢩡𨐳𢩢𪭛𢩣𢩤𭠌𫼒] +[radical 64=⼿手:手-才龵𭠍扎𢩥-𢩧𫼓扐-扖㧃-㧅𢩨-𢩬𫼔𭠎扏扗-扞扠-扬㧆-㧈𢩭-𢪂𪭜𫼕-𫼗𭠏𭠐扟扭-扷批-报㧉-㧑𢪃-𢪳𪭝-𪭣𫼘-𫼛𭠑-𭠖扸抦-择㧒-㧠𢪴-𢫣𪭤-𪭪𫝺𫼜-𫼡𭠗-𭠡拪-挧㧡-㧱𢫤-𢬮𪭫-𪭳𫝻𫼢-𫼰𭠢-𭠲挨-捤㧲-㧸𢬯-𢮀𪭴-𪮀𫼱-𫽀𭠳-𭡈捥-掱掳-掽㧹-㨈𢮁-𢯨𪮁-𪮋𫽁-𫽖𭡉-𭡝掲掾-揄揆-搅摒㨉-㨕㨗㨘𢯩-𢰾𢱀-𢱞𪮌-𪮖𫝼𫽗-𫽨𭡞-𭡱搆-搰搲-摊㨖㨙-㨬𢱟-𢲲𪮗-𪮢𫝽𫽩-𫽶𭡲-𭢆揅摋-摑摓-摕摗-撄撇㨭-㩂𢲳-𢴔𢴖-𢴟𪮣-𪮪𫝾𫽷-𫾁𭢇-𭢖搱摖撅撆撈-撺擆㩃-㩑𢴕𢴠-𢵾𢷅𪮫-𪮴𫾂-𫾉𭢗-𭢢撻-擅擇-擞㩒-㩙𢵿-𢷄𢷆-𢷊𪮵-𪮷𫾊-𫾏𭢣-𭢱擟-擤擦-擱㩚-㩟𢷋-𢷵𪮸-𪮺𫾐-𫾒𭢲-𭢽擥擲-攆㩠-㩫𢷶-𢸢𪮻-𪯀𫝿𫾓-𫾘𭢾-𭣃攇-攐攒㩬㩭𢸣-𢹌𪯁𫾙𫾚𭣄-𭣋攑攓-攚㩮-㩰𢹍-𢹡𢹣-𢹫𪯂𫾛𭣌-𭣐攛-攝㩱-㩴𢹢𢹬-𢺁𫾜-𫾞𭣑𭣒攞-攤攦攧鿜𢺂-𢺕𪯃𫾟𫾠攥攨-攫㩵-㩷𢺖-𢺝𪯄𫾡攬攭𢺞-𢺫𫾢攮㩸㩹𢺬-𢺳𭣓𢺴] +[radical 65=⽀支:支𭣔攰𢺵𭣕𢺶𭣖㩺𢺷-𢺽𪯆攱𢺾-𢻀𭣗𭣘㩻㩼𢻁-𢻇𢻉㩽𢻊-𢻍𪯅攲㩾𢻎-𢻙𭣙𭣚𢻚-𢻜𫾣𢻝-𢻟𪯇𭣛攳𢻠-𢻤𫾤𭣜𭣝𢻥-𢻩𭣞𫾥𭣟𢻪𭣠] +[radical 66=⽁攴:攴-攷𫾦𭣡攸-攼㩿㪀𢻫-𢻲𫾧𭣢𭣣攽-政㪁㪂𢻳-𢼈𪯈𫾨𭣤敀-故㪃-㪆𢼉-𢼚𪯉𪯊𫾩𭣥-𭣩敆-敌㪇-㪉𢼛-𢼸𣁋𪯋𪯌𫾪-𫾰𭣪-𭣱啟敍-敛㪊-㪎𢼹-𢽙𢽜𢽷𪯍𪵊𫾱-𫾸𭣲-𭣵敜-敪敭㪏-㪚𢽚𢽛𢽝-𢽶𢽸-𢽾𢾣𪯎𪯏𫾹-𫿀𭣶-𭣻敫敬敮-数㪛-㪟𢽿-𢾢𢾤𪯐𫿁-𫿇𭣼-𭤂敱-敳㪠-㪣𢾦-𢿅𪯑𪯒𫿈-𫿌𭤃-𭤇整-敻㪤-㪦𢿇-𢿝𣁛𪯓-𪯖𫿍-𫿐𭤈-𭤋敼-敿㪧-㪪𢿞-𢿽𪯗-𪯙𫿑-𫿗斀-斂𢿾-𣀃𣀅-𣀏𪯚𫿘-𫿚𭤌𭤍斃贁㪫㪬𣀄𣀐-𣀚𪯛𪯜𫿛-𫿝𭤎𭤏斄𣀛-𣀢𩠮𫿞-𫿢斅斆㪭𣀣-𣀭𩠰𫿣-𫿦㪮𣀮-𣀲𪯝𪯞𫿧𫿨𭤐𭤑𣀳𣀴𫿩𭤒𣀵-𣀺𪯟𫿪-𫿬𣀻𣀼𭤓𣀽-𣁀] +[radical 67=⽂文:文𣁁𫿭斈㪯𣁂𪯠𭤔斉𣁃-𣁅𪯡𪯢𣁆-𣁉𪯣𫿮𫿯𭤕-𭤙斊斋㪰𣁊𣁌𣁍𪯤𫿰斌-斏𣁎-𣁓𣁚斐斑𣁔-𣁖𪯥-𪯧𫿱斒㪱𣁗-𣁙𩖰𪯨-𪯪𣁜-𣁡斓𣁢-𣁤𭤚𭤛𣁥𣁦斔𣁧𣁨𫿲斕𣁩𣁪斖𣁫] +[radical 68=⽃斗:斗𣁬㪲㪳斘𣁭㪴𣁮-𣁰㪵𣁱𣁲𪯫料斚㪶𣁳-𣁶𪯬𫿳斛斜㪷𣁷-𣁻𫿴斝㪸𣁼-𣂀𫿵斞斟𣂁𣂃-𣂅斠斡𣂂𣂆-𣂈𪯭㪹𣂉-𣂋𪯮𫿶𭤜斢𫿷𭤝斣㪺𣂌𣂍𪯯𫿸𣂎-𣂐𪯰㪻𭤞] +[radical 69=⽄斤:斤𣂑斥𭤟𣂒𣂓斦-斩𣂔-𣂘𪯱𭤠斪斫㪼㪽𣂙𣂚𭤡𭤢㪾㪿𣂛-𣂝斬断𣂞-𣂠𫿹𫿺斮斯㫀𣂡-𣂪𣂬𣂭𫿻𫿼新斱𣂮-𣂵𥇴𭤣𭤤斲㫁𣂶-𣂺𭤥斳㫂𣂻-𣂿斴𣃀-𣃆𫿽斵斶𣃇-𣃋𭤦斷𣃌-𣃓𫿾𣃔𣃕𫿿𣃖斸] +[radical 70=⽅方:方𭤧㫃𣃗𭤨-𭤪𣃘𣃙斺-於㫄𣃚-𣃜𪯲𪯳𬀀𭤫𭤬施-旀㫆𣃝-𣃥𪯴𭤭-𭤴旁-旆旊㫅㫇-㫉𣃦-𣃲𪯵-𪯷𬀁-𬀆𭤵-𭤹旇-旉旋-族㫊-㫌𣃳-𣃻𪯸𫞀𬀇𬀈𭤺旐旑㫍𣃼-𣄇𪯹-𪯼𬀉𬀊𭤻-𭤾旒-旕𣄈-𣄍𪯽𫞁𬀋-𬀍𭤿𭥀旖旗𣄎-𣄓𪯾𬀎-𬀐𭥁㫎㫏𣄔-𣄖𪯿𪰀𬀑𬀒𭥂-𭥄旘旙𣄗-𣄜𪰁𪰂𬀓-𬀖𭥅旚𣄝𬀗𭥆旛𣄞-𣄣𬀘-𬀛𭥇𭥈旜-旞𣄤𪰃𪰄𬀜𬀝𭥉旟𣄥𪰅𬀞-𬀠𣄦𬀡𣄧𣄨𬀢𣄩𬀣𣄪-𣄬𬀤] +[radical 71=⽆无:无旡𣄭-𣄯既𣄰-𣄳旣𬀥𣄴𣄵旤𣄶-𣄺𭥊] +[radical 72=⽇日:日-旧𣄻-𣄽𭥋旨-旯㫐㫑𣄾-𣅃𣅅𬀦𭥌-𭥎旰-旸㫒-㫗𣅄𣅆-𣅙𪰆𪰇𬀧𬀨𭥏-𭥑旹-昙㫘-㫚𣅚-𣅶𪰈-𪰎𬀩-𬀫𭥒-𭥠昚-昿㫛-㫤𣅷-𣆈𣆊-𣆑𪰏-𪰘𫞂𫞃𬀬-𬀮𭥡-𭥭晀-晖㫥-㫮𣆒-𣆱𪰙-𪰤𫞄𬀯-𬀴𭥮-𭦃勗晗-晩曽㫯-㫴𣆲-𣇡𪰥-𪰨𬀵-𬀺𭦄-𭦘晪-暃暑㫵-㬀𣇢-𣈣𪰩-𪰮𬀻-𬁁𭦙-𭦧暄-暐暒-暙㬁-㬌𣈤-𣉑𪰯-𪰷𬁂-𬁉𭦨-𭧁暚-暨㬍-㬐𣉒-𣉠𣉢-𣉺𪰸-𪰽𬁊-𬁏𭧂-𭧑暩-暷㬑-㬖𣉻-𣊈𣊊-𣊑𣊓-𣊝𣋇𪰾-𪱅𬁐-𬁒𭧒-𭧡暸-曍龧㬗-㬟𣊉𣊞-𣋆𣋈𪱇-𪱌𬁓-𬁘𭧢-𭧴曎-曗曚㬠-㬢𠁞𣋉-𣋝𪱆𪱍𬁙-𬁛𭧵-𭧾曘曙曛曜㬣-㬨𠆛𣋞-𣋱𥫂𪱎-𪱐𬁜𭧿-𭨉曝-曢㬩㬪𣋲-𣋾𭨊-𭨌曣-曨㬫𣋿-𣌇𬁝𬁞𭨍-𭨐曩𣌈-𣌌𪱑-𪱓𭨑㬬㬭𣌍-𣌕曪-曬㬮𣌖𭨒曭曮𣌗-𣌙𣌛𪱔𭨓𭨔曯㬯𣌜𣌝𭨕-𭨗𣌟𣌠] +[radical 73=⽈曰:曰-曳㬰𭨘更曵𣌡𣌢𬁟𬁠曶𣌣-𣌦𬁡曷𣆉𣌧-𣌬𭨙𭨚書曺𣌭-𣌶𬁢𭨛𭨜曹曻曼𣌷-𣌺𬁣𬁤曾替朁朂𣌻-𣌽𬁥-𬁧𭨝會𣌾-𣍂朄朅𣍃-𣍅𬁨-𬁪𭨞𣍆-𣍊𪱕𬁫𭨟-𭨢朆㬱𣍋-𣍎𪱖𪱗㬲𣍏𣍐𬁬𣍑-𣍗𪱘𣍘𣍙𬁭-𬁯朇𭨣𣍚𠑱𣍛𣍜] +[radical 74=⽉月:月𣍝有𣍞𪱙𬁰𭨤𭨥𣍟-𣍣𪱚𬁱-𬁳𭨦𭨧朊-服㬳𣍤𪱛𬁴-𬁸𭨨-𭨭朎-朑𣍥-𣍧𣍩-𣍬𪱜𪱝𬁹𭨮-𭨱朒-朕㬴㬵𣍭𣍮𪱞𫞅𬁺-𬁼𭨲𭨳朖-望㬶㬷𣍱-𣍶𪱠-𪱢𬁽-𬂁𭨴-𭨸朜-期㬸𣍷-𣎃𦜳𪱣𫞆𫞇𬂂-𬂅𭨹-𭨽朠朡𣎄-𣎌𪱤-𪱧𬂆𭨾-𭩀朢㬺㬻𣎍-𣎑𪱟𪱨-𪱪𬂇-𬂌𭩁-𭩃膤㬼-㬾𣎒-𣎙𪱫𪱬𬂍𬂎𭩄𭩅朣-朥㬿𣎚𣎛𣎝-𣎢𪱭𬂏𬂐𭩆-𭩉㭀𣎜𣎣-𣎨𦡖𬂑-𬂔𭩊-𭩎朦𣎩-𣎭𬂕𬂖𭩏-𭩑𬂗𬂘𭩒-𭩕朧𣎮𣎯𪱮𪱯𬂙𣎰𣎱𭩖𣎲𪱰𭩗𬂚] +[radical 75=⽊木:木朩𣎳𣎴𬂛未-朰𣎵-𣎷𬂜𭩘朱-权㭁𣎸-𣏀杄-杩极㭂-㭆𣏁-𣏓𪱱-𪱵𬂝-𬂟𭩙-𭩛杪-枀枂-枭㭇-㭐𣏔-𣐇𪱶-𪱹𫞈𬂠-𬂤𭩜-𭩡枮-树㭑-㭗𣐈-𣐴𪱺-𪲂𬂥𬂦𭩢-𭩲栒-桪鿄㭘-㭧𣐵-𣑦𣑨-𣑾𪲃-𪲏𫞉𫞊𬂧-𬂱𭩳-𭪂桫-棂㭨-㭵㭷𣑿-𣓀𪲐-𪲞𬂲-𬂼𭪃-𭪗棃-椮㭶㭸-㮊𣓁-𣔰𪲟-𪲯𬂽-𬃓𭪘-𭪵椯-榉榋榌榔榘﨓㮋-㮠㮢㮣𣔱-𣕣𣕥-𣖩𪲰-𪳇𬃔-𬃮𭪶-𭫎榊榍-榓榕-榗榙-槡槩樮﨔㮤-㮽𣕤𣖪-𣘔𪳈-𪳜𫞋𫞌𬃯-𬄆𭫏-𭫟槢-槨槪-樭樯-樱橥橴㮾-㯏㯑㯒㯠𣘕-𣙑𣙓-𣙺𪳝-𪳬𫞍-𫞏𬄇-𬄘𭫠-𭫺樲-橤橦-橳橵-橼㯐㯓-㯟㯡-㯩𣙒𣙻-𣛯𪳭-𪳼𫞐𬄙-𬄫𭫻-𭬉橽-檪㯪-㯶𣛰-𣜡𣜣-𣝀𪳽-𪴈𫞑𬄬-𬄶𭬊-𭬑檫-櫊㯷-㯽𣝁-𣝘𣝚-𣞎𪴉-𪴏𫞒𬄷-𬅀𭬒-𭬝櫋-櫦櫫櫭㯾-㰈𣝙𣞐-𣟃𣟑𪴐-𪴕𬅁-𬅈𭬞-𭬨櫧-櫪櫬櫮-櫶㰉-㰓㰖𣟄-𣟐𣟒-𣟮𪴖-𪴚𬅉𬅊𭬩-𭬳櫸-欅欌㰔㰕𣟯-𣠁𣠃-𣠘𪴛-𪴞𬅋-𬅏𭬴-𭬷櫷欆-欋欍欎㰗㰘𣠂𣠙-𣠶𪴟-𪴡𬅐-𬅓𭬸-𭬺欏-欒㰙-㰜𣠷-𣡊𪴢𪴣𬅔𭬻-𭭀欓-欕𣡋-𣡝𥤔𪴤𪴥𬅕-𬅘欖-欛𣡞-𣡨𣡮𪴦欜欝𣡩-𣡭𣡯-𣡱𪴨𬅙𬅚𭭁鿝𣡲𣡴𣡵𪴧𬅛欞欟𣡶-𣡹𭭂𣡺-𣡼𬅜𭭃𣡽-𣡿] +[radical 76=⽋欠:欠-欢𣢀𭭄欤㰝㰞𣢁-𣢈𬅝𬅞欣欥-欧㰟-㰢𣢉-𣢖𪴩𬅟𭭅𭭆欨-欪㰣-㰨𣢗-𣢦𪴪𪴫𬅠𬅡欫-欱㰩-㰭𣢧-𣢹𬅢𬅣𭭇-𭭋欲-欸㰮-㰱𣢺-𣣇𪴬𪴭𬅤-𬅨𭭌欹-欿㰲-㰶㰸𣣈-𣣜𪴮𬅩𬅪𭭍-𭭏歀-歈㰹-㰾𣣝-𣣫𣣭-𣣱𪴯𪴰𬅫𬅬𭭐𭭑歉-歍㰿-㱁𣣲-𣤇𪴱𬅭-𬅯𭭒歎-歓㱂㱃𣤈-𣤗𪴲𭭓𭭔歔-歚㱄㱅𣤘-𣤟𬅰𬅱𭭕𭭖歛-歝㱆-㱉𣤠-𣤧𬅲歞歟𣤨-𣤫𬅳歠㱊𣤬-𣤰㱋𣤱-𣤳𪴳𭭗𣤴𣤵𣤷𣤸𬅴歡㱌𣤶𣤹-𣤼㱍𣤽𬅵𣤾𪴴㱎𣤿-𣥁] +[radical 77=⽌止:止龰𣥂正𣥃𣥄此㱏𣥅𣥆𬅶𬅷𭭘-𭭚步㱐㱑𣥇𣥈𣥊-𣥌𬅸武-歩𣥉𣥍-𣥡𪴵𬅹𭭛-𭭝歪歫㱒-㱔𣥢-𣥤𬅺𬅻𭭞-𭭠歬歭𣥦-𣥱𪴶𬅼𬅽𭭡𣥳-𣥸𪴷𬅾-𬆀𭭢-𭭥歮歯㱕㱖𣥹-𣦆𪴸𬆁-𬆃𭭦-𭭩歰-歳𣦇-𣦊𣦌-𣦎𤚜𪴹𪴺𫞓𬆄𬆅𭭪𭭫歴㱗𣦐-𣦓𪴻𬆆𬆇𭭬𭭭歵歶𣦔-𣦛𪴼𬆈𬆉𭭮-𭭱歷𣦜-𣦠𪴽𪴾𬆊𬆋𭭲-𭭴𣦡-𣦥𪴿𬆌𬆍𭭵𭭶歸㱘𣦦-𣦫𬆎𭭷𣦬𬆏𬆐𣦮𭭸-𭭻𣦯-𣦴𭭼] +[radical 78=⽍歹:歹𣦵𣦶歺𣦷死㱙𣦸-𣦾𭭽-𭭿歼𣦿-𣧈𭮀𭮁歽-殁㱚-㱝𣧉-𣧜𭮂-𭮅殂-殇㱞-㱠𣧝-𣧱𪵀𪵁𬆑𬆒𭮆-𭮈殈-残㰷㱡𣧲-𣨄𪵂𪵃𬆓-𬆕𭮉-𭮑殌-殓㱢㱣𣨅-𣨕𪵄𬆖𬆗𭮒-𭮖殔-殚㱤-㱩𣨖-𣨰𪵅𬆘-𬆚𭮗𭮘殛殜㱪-㱮𣨱-𣩃𬆛𭮙-𭮛殝-殡㱯-㱲𣩄-𣩌𪵆𭮜殢-殦㱳㱴𣩍-𣩜𫞔𭮝𭮞殧-殫㱵-㱷𣩝-𣩧𭮟-𭮣殬-殮㱸𣩨-𣩮𪵇殯𣩯-𣩶𭮤-𭮧殰殱𣩷𣩸𬆜鿞㱹㱺𣩹-𣩻𬆝殲𣩼-𣩾㱻𣩿-𣪁] +[radical 79=⽎殳:殳㱼𬆞殴㱽𣪂-𣪄𬆟𬆠𭮨段殶𣪅-𣪇𬆡𬆢殷㱾㱿𣪈-𣪊𪵈𪵉𬆣𬆤𭮩-𭮭殸-殻㲀𣪋-𣪘𪵋𬆥-𬆧𭮮-𭮱殼殽㲁-㲃𣪙-𣪟𪵌-𪵎𬆨𭮲-𭮶殾-毂㲄𣪠-𣪬𪵏𬆩-𬆬𭮷𭮸毃毄㲅𣪮-𣪵𬆭𭮹-𭮻毅毆𣪶-𣪺𤛗𪵐𬆮-𬆰𭮼𭮽毇毈㲆-㲈𣪻-𣫋𬆱𭮾-𭯁㲉𣫌-𣫏𪵑𪵒𬆲𬆳㲊𣫐-𣫗𭯂毉𣫘-𣫝𭯃𣫞𣫟𭯄𣫠𣫡𬆴毊𣫢-𣫨𭯅𣫩𪵓𭯆𣫪𣫫𬆵] +[radical 80=⽏毋:毋毌𣫬母毎𣫭𭯇每毐𣫮毑毒𣫯-𣫲𬆶𭯈𣫳-𣫸𬆷毓𣫹-𣫼𪵔𭯉𣫽-𣫿𬆸𣬀𣬁] +[radical 81=⽐比:比毕𠂱𣬂-𣬇毖-毘㲋𭯊毙𣬈-𣬊𭯋-𭯎𣬋𣬌𭯏𬆹𭯐𭯑𣬍𬆺𣬎-𣬑𪵕𣬒-𣬔毚𣬕𣬖𬆻𣬗-𣬚] +[radical 82=⽑毛:毛𣬛𪵖㲌𣬜-𣬠毜毝𣬡-𣬨𬆼毞毟㲍-㲑𣬩-𣬷𪵗𪵘𬆽-𬆿𭯒毠毡㲒𣬸-𣭛𪵙𪵚𬇀𭯓-𭯗毢-毪㲓𣭜-𣭰𪵛𪵜𭯘毫-毮㲔-㲚𣭱-𣮇𬇁𭯙𭯚毯-毶㲛-㲞𣮈-𣮧𪵝𪵞𭯛-𭯝毷-毽㲟-㲣𣮨-𣯄𪵟𬇂𭯞𭯟毾㲤-㲩𣯅-𣯢𪵠𬇃𬇄𭯠-𭯢毿-氂𣯣-𣯷𪵡𬇅氃-氇㲪-㲮𣯸-𣰉𬇆𭯣-𭯥氈-氊𣰊-𣰙𬇇𭯦-𭯩氋㲯㲰𣰚-𣰪𪵢𬇈𭯪氌㲱𣰫-𣰰𭯫𠫈𣰱-𣰵𭯬𣰶-𣰺氍𣰻-𣰾𭯭𣰿-𣱁𭯮氎㲲𣱂𣱃𭯯𣱄] +[radical 83=⽒氏:氏-民𫞕氒𫞖𬇉氓𣱅𣱆𬇊𬇋𭯰𣱇-𣱊𬇌㲳𬇍𣱋-𣱎𭯱𣱏𣱐𬇎𣱑-𣱔] +[radical 84=⽓气:气-氘𣱕𣱖氙氚𣱗𣱘氛-氝㲴𣱙-𣱛𪵣𬇏𭯲氞-氢𣱜-𣱠𪵤𬇐氣-氩𣱡𬇑氪氫㲵𣱣𪵥氬-氰𣱢𣱤𣱥氱𣱦-𣱨𪵦氲氳𣱩𪵧𬇒㲶𣱪𣱫𭯳㲷𭯴𣱬𣱭𬇓𣱮𭯵𣱯𣱰] +[radical 85=⽔水:水氵氺𣱱氶-氹㲸𣱲-𣱴氻氼氾-汉㲹-㲼𣱵-𣱿𪵨汊-汤㲽-㲿𣲀-𣲍𪵩-𪵬𬇔-𬇗𭯶𭯷汥-沪㳀-㳊𣲎-𣲱𪵭-𪵰𬇘-𬇚𭯸-𭯼沫-泙泛-泴泶-泾㳋-㳕𣲲-𣳣𪵱-𪵶𬇛-𬇟𭯽-𭰋泚泿-洌洎-洕洗-浕㳖-㳣𣳤-𣴝𪵷-𪵽𬇠-𬇦𭰌-𭰖洍洖浖-涘涚-涩㳤-㳳𣴞-𣵶𣷚𪵾-𪶋𫞗𬇧-𬇴𭰗-𭰧涙涪-渂渄-渗渚湴㳴-㴎𣵷-𣷙𣷛-𣷻𣸊𪶌-𪶖𫞘𬇵-𬈄𭰨-𭱂渃渘渙減-湳湵-溌滋滞鿌㴏-㴤𣷼-𣸉𣸋-𣹜𪶗-𪶩𬈅-𬈕𭱃-𭱡溍-滊滍-滙滛-滝滟-滪漓㴥-㴻𣹝-𣻌𦴶𪶪-𪶾𫞙-𫞛𬈖-𬈤𭱢-𭱵滌滚滫-漊漌-漒演-漼漾-潍㴼-㵉𣻍-𣻳𣻵-𣼘𣼚-𣽂𪶿-𪷊𬈥-𬈱𭱶-𭲑漋漽潎-潿澁-澘澚-澝濐㵊-㵜𣻴𣽃-𣾨𣾪-𣾿𣿁-𣿄𪷋-𪷜𫞜𬈲-𬉇𭲒-𭲫澙澞-濏濑-濓濖㵝-㵮𣾩𣿅-𤀡𪷝-𪷧𫞝𬉈-𬉒𭲬-𭲻澀濔濕濗-濲濴-濸㵯-㵼𣿀𤀣-𤁝𤁟𤁠𪷨-𪷲𬉓-𬉚𭲼-𭳏濹-瀔㵽-㶃𤁞𤁡-𤂜𤂞-𤂠𤂢-𤂲𪷳-𪷹𬉛-𬉞𭳐-𭳛濳瀕-瀮㶄-㶋𤂝𤂡𤂳-𤃧𪷺-𪷿𫞞𬉟-𬉤𭳜-𭳫瀯-灁㶌-㶑𤃨-𤄍𪸀-𪸂𬉥-𬉪𭳬-𭳯灂-灍灏灐㶒-㶘𢌇𤄎-𤄵𪸃-𪸇𬉫-𬉭𭳰-𭳶灑-灘㶙㶚𤄶-𤅉𪸈𪸉𬉮𬉯𭳷-𭳹灙-灜㶛-㶝𤅊-𤅟𪸊𪸋灝-灡㶞㶟𤅠-𤅨𪸌𬉰𬉱𭳺-𭳽灢灣𤅩-𤅯灎灤-灦㶠𤅰-𤅶灧灨𤅷-𤅿𬉲灩灪𭳾𤆀𬉳𤆁] +[radical 86=⽕火:火-灭𤆂𪸍𭳿灮-灳炇㶡㶢𤆃-𤆌𭴀-𭴂灴-炀㶣-㶥𤆍-𤆜𪸎-𪸐𬉴-𬉺𭴃-𭴇炁-炆炈-炞㶦-㶪𤆝-𤆻𪸑-𪸗𬉻-𬊀𭴈-𭴑炟-烃㶫-㶲𤆼-𤇮𪸘-𪸢𬊁𬊂𭴒-𭴚烄-烮㶳-㶸𤇯-𤈤𪸣-𪸪𫞟𬊃-𬊈𭴛-𭴥烯-焓焕-焘㶹-㷁𤈥-𤉡𪸫-𪸲𫞠𬊉-𬊖𭴦-𭴷焔焙-煀煮㷂-㷍𤉢-𤊱𪸳-𪹃𬊗-𬊨𭴸-𭵈煁-煭煯-煸煺㮡㷎-㷞𤊲-𤋲𤋴-𤌆𤍏𪹄-𪹑𬊩-𬊱𭵉-𭵡煹煻-熙熦蒸㷟-㷪𤌇-𤌱𤌳-𤍎𪹒-𪹠𫞡𬊲-𬊾𭵢-𭵲熚-熥熧-熵黙龦龽㷫-㷲𤌲𤍐-𤍨𤍪-𤍿𤎁𤎃-𤎜𪹡-𪹩𬊿-𬋄𭵳-𭵼熶-燞㷳-㷽𤍩𤎝-𤏟𤏡-𤏴𪹪-𪹳𬋅-𬋌𭵽-𭶋營-燷鿪㷾-㸃𤏵-𤐣𪹴-𪹻𬋍-𬋐𭶌-𭶙燸-爃㸄㸅𤐤-𤑂𤑄-𤑑𦦨𪹼-𪺀𬋑-𬋓𭶚-𭶡爄-爊爌-爎爕㸆㸇㸉𤑒-𤑲𪺁𪺂𬋔-𬋘𭶢𭶣爋爏-爔爖-爘㸈㸊-㸌𤑳-𤒠𤒨𪺃-𪺅𬋙-𬋝𭶤-𭶦爙-爛㸍𤒡-𤒧𤒪-𤒹爜-爠㸎𤒩𤒺𤒻𤒽-𤓆𪺆𪺇𭶧爡爢㸏㸐𤒼𤓇-𤓎𤓐-𤓖𪺈𬋞爣𤓗-𤓛𪺉𭶨𭶩爤-爦𤓜-𤓞𤓠-𤓣𪺊𪺋𬋟𬋠㸑𤓤-𤓩𪺌爧𤓪𤓬𬋡𬋢爨𤓫𤓭爩𤓮𬋣] +[radical 87=⽖爪:爪爫𤓯-𤓵𪺍爬爭㸒㸓𤓶-𤓼𬋤𬋥𭶪爮-爰𤓽-𤔋𪺎𬋦𭶫爱𤔌-𤔏𬋧𬋨𭶬-𭶯㸔𤔐-𤔓𪺏𬋩𬋪𭶰爲𤔔-𤔖𤔘-𤔛𪺐-𪺓𬋫𬋬𭶱𤔜-𤔡𪺔𪺕𬋭𬋮𭶲𭶳爳㸕𤔢-𤔦𬋯𬋰𭶴𭶵噕爴𤔧-𤔭𪺖𪺗𬋱𬋲𭶶𤔮-𤔱𬋳𬋴𭶷𭶸𤔲-𤔸𤔼𪺘𪺙𬋵𬋶爵𤔹𤔻𤔽𤔾𭶹𤔺𤔿𤕀𬋷𤕂-𤕇𬋸𬋹𤕈-𤕍𬋺𪺚] +[radical 88=⽗父:父爷𭶺𤕎𤕏𬋻𭶻爸𤕐𤕑㸖𤕒爹㸗𤕓𤕔𪺛㸘𤕕𪺜𭶼𤕖𤕗爺㸙𤕘-𤕚𬋼𤕛𭶽] [radical 89=⽘爻:爻𤕜㸚𤕝𪺝爼𤕞-𤕡爽𤕢-𤕥爾𠎛𤕦-𤕩𬋽𠑂𡄉𬋾] -[radical 90=⽙爿:丬爿𤕪-𤕮牀𤕯-𤕱牁㸛𤕲-𤕵𬋿-𬌁牂𤕶-𤖃𪺞𬌂㸜𤖄-𤖋𪺟𬌃-𬌈牃𤖌-𤖎牄𤖏-𤖒𬌉牅𤖓-𤖕𪺠𬌊𤖖-𤖛𬌋-𬌍牆𤖜-𤖟𪺡𬌎𤖠𤖡𬌏𤖢𬌐𬌑𤖣-𤖧] +[radical 90=⽙爿:丬爿𤕪-𤕮𭶾𭶿牀𤕯-𤕱𭷀𭷁牁㸛𤕲-𤕵𬋿-𬌁𭷂𭷃牂𤕶-𤕺𭷄𭷅𤕻-𤖃𪺞𬌂𭷆㸜𤖄-𤖋𪺟𬌃-𬌈牃𤖌-𤖎牄𤖏-𤖒𬌉牅𤖓-𤖕𪺠𬌊𤖖-𤖛𬌋-𬌍牆𤖜-𤖟𭷇𪺡𬌎𭷈𤖠𤖡𬌏𤖢𬌐𬌑𤖣-𤖧] [radical 90'=⺦丬:𬌒] -[radical 91=⽚片:片𤖨-𤖫版㸝㸞𤖬-𤖰𬌓𬌔牉牊𤖱-𤖹㸟-㸡𤖺-𤖿𪺢𤗀-𤗆𪺣𪺤𬌕牋-牍𤗇-𤗗𪺥牎-牒𤗘-𤗡牓牔㸢𤗢-𤗧牕-牗𤗨-𤗹𪺦㸣𤗺-𤗾㸤𤗿-𤘂牘𤘃㸥𤘄𬌖] -[radical 92=⽛牙:牙㸦𤘅𤘆𪺧𤘇㸧𤘈𤘉𬌗𤘊𤘋牚𤘌-𤘏𪺨𤘐𤘑𬌘𤘒𤘓] -[radical 93=⽜牛:牛牜𤘔牝-牟㸨𤘕-𤘗𬌙牠-牤㸩㸪𤘘-𤘛𪺩𬌚牥-牬㸫-㸯𤘜-𤘷𬌛𬌜牭-牵㸰-㸴𤘸-𤙐𪺪𪺫𫞢𬌝牶-牺㸵-㸸𤙑-𤙚𪺬-𪺮𬌞𬌟牻-牿犁㸹-㹀𤙛-𤙮𬌠犀犂-犋㹁-㹃𤙯-𤚌𪺯𬌡𬌢犌-犑㹅-㹈𤚍-𤚛𤚝-𤚨𤚿𪺰𬌣-𬌥犒-犗㹄㹉-㹋𤚩-𤚾𤛀-𤛉𪺱-𪺳𬌦𬌧犘-犛㹌-㹐𤛊-𤛖𤛘-𤛠𪺴𬌨犜-犟㹑-㹓𤛡-𤛮𪺵犠㹔-㹖𤛯-𤛸㹗㹘𤛹𤛺犡-犦㹙𤛻-𤜁犧犨𤜂-𤜆㹚𤜇-𤜋𪺶犩㹛𤜌-𤜓犪𤜔-𤜘犫𤜙] -[radical 94=⽝犬:犬-犮𡗜𤜚𬌩犯犰𤜛-𤜠犱-犸𤜡-𤜮𬌪𬌫犹-狈㹜-㹠𤜯-𤝎𤝮𪺷狉-狞㹡-㹪𤝏-𤝭𪺸𪺹𫞣𬌬𬌭狟-狲㹫-㹰𤝯-𤞘𤞣𪺺𪺻𬌮-𬌱狳-猃㹱-㹸𤞙-𤞢𤞤-𤟂𪺼𪺽𬌲-𬌴猄-猡猪猫㹹-㺀𤟃-𤟛𪺾-𪻁𫞤𬌵-𬌷猢-猩猬-猹獁獓㺁-㺆𤟜-𤟴𤟶-𤠌𪻂-𪻅𬌸-𬌼猺-獀獂獃獅-獊㺇-㺍𤠍-𤠸𪻆𪻇𬌽-𬍀獄獌-獒獔獕㺎-㺓𤠹-𤡢𪻈𬍁-𬍅獋獖-獤㺔-㺙𤡣-𤢋𪻉𬍆𬍇獥-獭㺚-㺜𤢌-𤢥𬍈-𬍊獮-獴㺝-㺟𤢦-𤢳𪻊𬍋獵-獸㺠𤢴-𤣄𪻋𬍌獹-獻㺡㺢𤣅-𤣌𪻌獼獽㺣-㺦𤣍-𤣐𬍍獾獿𤣑-𤣖玀𤣗-𤣚玁-玃𤣛-𤣞㺧𤣟-𤣢𬍎𤣣𤣤] +[radical 91=⽚片:片𤖨-𤖫版㸝㸞𤖬-𤖰𬌓𬌔𭷉牉牊𤖱-𤖹𭷊𭷋㸟-㸡𤖺-𤖿𪺢𤗀-𤗆𪺣𪺤𬌕𭷌牋-牍𤗇-𤗗𪺥牎-牒𤗘-𤗡牓牔㸢𤗢-𤗧牕-牗𤗨-𤗹𪺦㸣𤗺-𤗾𭷍㸤𤗿-𤘂𭷎牘𤘃㸥𤘄𬌖] +[radical 92=⽛牙:牙㸦𤘅𤘆𪺧𭷏𤘇𭷐㸧𤘈𤘉𬌗𭷑𤘊𤘋牚𤘌-𤘏𪺨𭷒𤘐𤘑𬌘𤘒𤘓] +[radical 93=⽜牛:牛牜𤘔𭷓牝-牟㸨𤘕-𤘗𬌙𭷔牠-牤㸩㸪𤘘-𤘛𪺩𬌚牥-牬㸫-㸯𤘜-𤘷𬌛𬌜𭷕-𭷙牭-牵㸰-㸴𤘸-𤙐𪺪𪺫𫞢𬌝𭷚-𭷝牶-牺㸵-㸸𤙑-𤙚𪺬-𪺮𬌞𬌟𭷞𭷟牻-牿犁㸹-㹀𤙛-𤙮𬌠𭷠-𭷣犀犂-犋㹁-㹃𤙯-𤚌𪺯𬌡𬌢𭷤-𭷬犌-犑㹅-㹈𤚍-𤚛𤚝-𤚨𤚿𪺰𬌣-𬌥𭷭犒-犗㹄㹉-㹋𤚩-𤚾𤛀-𤛉𪺱-𪺳𬌦𬌧𭷮𭷯犘-犛㹌-㹐𤛊-𤛖𤛘-𤛠𪺴𬌨𭷰-𭷳犜-犟㹑-㹓𤛡-𤛮𪺵𭷴𭷵犠㹔-㹖𤛯-𤛸㹗㹘𤛹𤛺犡-犦㹙𤛻-𤜁𭷶犧犨𤜂-𤜆㹚𤜇-𤜋𪺶犩㹛𤜌-𤜓𭷷犪𤜔-𤜘犫𤜙] +[radical 94=⽝犬:犬-犮𡗜𤜚𬌩犯犰𤜛-𤜠𭷸犱-犸𤜡-𤜮𬌪𬌫𭷹犹-狈㹜-㹠𤜯-𤝎𤝮𪺷𭷺-𭷾狉-狞㹡-㹪𤝏-𤝭𪺸𪺹𫞣𬌬𬌭𭷿-𭸃狟-狲㹫-㹰𤝯-𤞘𤞣𪺺𪺻𬌮-𬌱𭸄-𭸉狳-猃㹱-㹸𤞙-𤞢𤞤-𤟂𪺼𪺽𬌲-𬌴𭸊-𭸑猄-猡猪猫㹹-㺀𤟃-𤟛𪺾-𪻁𫞤𬌵-𬌷𭸒-𭸖猢-猩猬-猹獁㺁-㺆𤟜-𤟴𤟶-𤠌𪻂-𪻅𬌸-𬌼𭸗-𭸠猺-獀獂獃獅-獊㺇-㺍𤠍-𤠸𪻆𪻇𬌽-𬍀𭸡獄獌-獕㺎-㺓𤠹-𤡢𪻈𬍁-𬍅𭸢-𭸧獋獖-獤㺔-㺙𤡣-𤢋𪻉𬍆𬍇𭸨-𭸬獥-獭㺚-㺜𤢌-𤢥𬍈-𬍊𭸭獮-獴㺝-㺟𤢦-𤢳𪻊𬍋𭸮𭸯獵-獸㺠𤢴-𤣄𪻋𬍌𭸰𭸱獹-獻㺡㺢𤣅-𤣌𪻌獼獽㺣-㺦𤣍-𤣐𬍍𭸲獾獿𤣑-𤣖𭸳玀𤣗-𤣚玁-玃𤣛-𤣞㺧𤣟-𤣢𬍎𤣣𤣤𭸴] [radical 95=⽞玄:玄𤣥玅𤣦玆-玈𤣧𤣨𬍏] -[radical 96=⽟玉:玉王𤣩玊玌-玑㺨-㺫𤣪-𤣬𪻍玒-玛㺬-㺯𤣭-𤣸𬍐𬍑玜-玱㺰-㺶𤣹-𤤎𪻎-𪻔𫞥𬍒-𬍖玲-珑㺷-㺾𤤏-𤤴𪻕𪻖𬍗-𬍝珒-珲琉㺿-㻈𠴦𤤵-𤥕𪻗-𪻟𫞦𬍞-𬍤珳-珶珸-琈琊-琓㻉-㻐𤥖-𤥺𪻠-𪻥𬍥-𬍩珷琔-琝琟-琼㻑-㻜𤥻-𤦮𪻦-𪻲𫞧𬍪-𬍳琞琽-瑟㻝-㻦𤦯-𤧩𪻳-𪼂𬍴-𬍺瑠-瑸㻧-㻪𤧪-𤨓𪼃-𪼏𫞨𬍻-𬎄瑹-璌璎璓㻫-㻴𤨔-𤨿𤩁𪼐-𪼖𫞩𬎅-𬎊璍璏-璒璔-璡璣璤㻵-㻼𤩀𤩂-𤩪𪼗-𪼠𬎋-𬎒璢璥-璴㻽-㼂𤩫-𤪊𪼡-𪼦𬎓-𬎖璵-瓂𤪋-𤪨𤪴𪼧𪼨𬎗-𬎙瓃-瓋㼃-㼆𤪩-𤪳𤪵-𤪽𪼩-𪼫𬎚瓌-瓒㼇𤪾-𤫈𪼬-𪼯𬎛-𬎝瓓-瓖𤫉-𤫓𪼰瓗-瓙𤫔-𤫘瓚㼈𤫙-𤫟𪼱瓛𤫠𪼲𬎞𤫣-𤫧𬎟𬎠𤫢𤫨𬎡𤫩] -[radical 97=⽠瓜:瓜瓝𤫪𪼳㼉㼊𤫫-𤫯𪼴瓞瓟㼋㼌𤫰-𤫴𬎢𬎣瓠㼍㼎𤫵-𤫹㼏𤫺-𤬀瓡𤬁-𤬆𪼵㼐-㼒𤬈-𤬌㼓㼔𤬇𤬍𤬐-𤬕瓢𤬎𤬏𤬖𤬗㼕𤬘-𤬚瓣𤬛-𤬝瓤𤬞-𤬡瓥𤬢㼖𤬣-𤬥] -[radical 98=⽡瓦:瓦瓧㼗𤬦𤬧𬎤瓨瓩㼘㼙𤬨-𤬫𪼶𬎥瓪-瓲㼚㼛𤬬-𤬲𪼷𪼸𬎦𬎧瓳-瓵㼜-㼠𤬳-𤬽𪼹瓶-瓸㼡-㼦𤬾-𤭋𬎨-𬎫瓹-瓼㼧-㼪𤭌-𤭚瓽-甁㼫-㼱𤭛-𤭦𤭲𤮖𪼺𪼻𬎬𬎭甂-甆㼲-㼷𤭧-𤭱𤭳-𤭸𪼼𬎮甇-甉㼸-㼺𠪹𤭹-𤮄𪼽𪼾𬎯甊-甎㼻-㼾𤮅-𤮍甏-甒㼿-㽅𤮎-𤮕𤮗甓-甕㽆㽇𤮘-𤮟甖㽈㽉𤮠𤮡𬎰𤮢-𤮥甗𤮦-𤮬㽊𤮭-𤮯𪼿𤮰-𤮵㽋𤮶㽌𤮷-𤮹] -[radical 99=⽢甘:甘𤮺甙𤮻-𤯀甚𤯁-𤯄𫞪㽍𤯅甛甜𤯆𪽀甝甞㽎𤯇𬎱㽏𤯈𬎲㽐𤯉-𤯌㽑𤯍𤯎𤯐-𤯒] -[radical 100=⽣生:生𤯓𤯔𪽁𤯕-𤯗甠𤯘-𤯞𬎳甡𤯟產産𤯠-𤯥𪽂𬎴𬎵甤-甦㽒𤯦-𤯫𬎶𤯬-𤯱𪽃-𪽅𬎷-𬎹甧𤯲-𤯴𬎺-𬎼㽓𤯵㽔𤯶-𤯼𤯾-𤰂] -[radical 101=⽤用:用-甪𤰃𪽆甫甬𤰄𠂵𠃰𡶤𤰅𤰆𬎽𬎾甭甮𠳫𤰇𤰈甯𤰉-𤰏𤰑𤰐] -[radical 102=⽥田:田-电𤰒甶𤰓𤰔男-町甼㽕-㽗𠃫𤰕-𤰜𪽇𬎿画甽-畅𡇍𢑖𤰝-𤰨𪽈𬏀畆-畓㽘-㽚𤰩-𤱋𪽉-𪽌𬏁畔-畟㽛㽜𤱌-𤱠𤱢-𤱤𪽍-𪽐𬏂𬏃畡-畧畩異㽝㽞𤱥-𤱺𪽑𪽒𫞫𬏄-𬏆番-畯畲-畴㽟㽠𤱻-𤲐𪽓-𪽗𬏇-𬏊畵-畺㽡-㽤𤲑-𤲪𪽘-𪽚𬏋畱畻-畽㽥𤲫-𤲶𪽛𪽜畾畿㽦-㽨𤲷-𤳇𪽝𪽞𬏌-𬏒疀-疂㽩𤳈-𤳎𤳐𤳑𪽟-𪽡𬏓𬏔疃疄㽪𤳒-𤳚𤳜-𤳣𪽢𬏕疅㽫㽬𤳤-𤳨𨐴𪽣𬏖𬏗疆疇㽭𤳩-𤳰𤳲疈㽮𤳱𤳳-𤳸𪽤𤳹-𤳾𪽥𪽦疉疊𤳿-𤴁㽯𤴂-𤴄𬏘𤴅-𤴒] -[radical 103=⽦疋:疋𤴓-𤴕疌𤴖𤴘疍𤴗疎疏𤴙-𤴛㽰𤴜𤴝𬏙疐疑𤴞-𤴢𪽧𤴣𤴤] -[radical 104=⽧疒:疒𤴥𬏚疓-疗㽱㽲𤴦-𤴮疘-疠㽳-㽶𤴯-𤴶𬏛𬏜疡-疯疺㽷-㽼𤴷-𤵖𪽨-𪽫𬏝-𬏠疰-疹疻-痉㽽-㾉𤵗-𤵶𪽬-𪽮𫞬𬏡-𬏦痊-痖㾊-㾒𤵷-𤶔𪽯𬏧-𬏬痗-痫㾓-㾡𤶕-𤷁𪽰𪽱𬏭-𬏱痬-瘆㾢-㾩𤷂-𤷺𪽲𬏲-𬏵瘇-瘘瘟瘧㾪-㾵𤷻-𤸩𪽳-𪽵𬏶-𬏸瘙-瘞瘠-瘦瘨-瘫㾶-㿁𤸪-𤹜𪽶𪽷𫞭𬏹瘬-瘿癊㿂-㿈𤹝-𤺂𤺞𬏺𬏻癀-癉癋-癎㿉㿊𤺃-𤺝𤺟-𤺹𪽸𪽹𬏼𬏽癏-癞㿋-㿐𤺺-𤻔𬏾癟-癡癣㿑-㿓𤻕-𤻯𪽺癢癤-癦㿔𤻰-𤻿癧-癫㿕-㿗𤼀-𤼊𬏿𬐀癬-癮㿘𤼋-𤼏𬐁癯癰㿙𤼐-𤼗癱癲㿚㿛𤼘-𤼞癳𤼟-𤼢癴㿜𤼣𤼤癵] -[radical 105=⽨癶:癶𤼥𤼦癷-発𤼧-𤼮登發𤼯-𤼲𬐂𤼳-𤼺𤼼𤼻] -[radical 106=⽩白:白-癿𤼽𤼾𬐃皀-皃㿝𤼿-𤽁的𤽂-𤽇皅-皈㿞𤽈-𤽗𪽻𪽼𬐄𬐅畠皉-皍㿟𤽘-𤽤𪽽𫞮𬐆𬐇皎-皑㿠㿡𤽥-𤽫𬐈𬐉皒-皖𠌟𤽬-𤽸𪽾𪽿𬐊皗-皙㿢𤽹-𤾇𪾀𪾁𬐋-𬐎㿣㿤𤾈-𤾓𪾂𪾃𬐏𬐐皚-皞㿥𤾔-𤾚𪾄皟-皡㿦𤾛-𤾟皢-皥𤾠-𤾦皦-皨𤾧-𤾪皩㿧𤾫-𤾳皪皫𤾴-𤾷皬㿨𤾸-𤾺𪾅𤾻-𤾽皭𤾾𤾿𬐑𤿀-𤿃㿩𤿄𤿅] -[radical 107=⽪皮:皮𤿆𤿇皯㿪𤿈-𤿍𪾆㿫㿬𤿎-𤿔𪾇𬐒皰皱㿭㿮𤿕-𤿞𬐓𬐔皲㿯㿰𤿟-𤿦皳皴㿱𤿧-𤿮𤿰-𤿲𬐕皵龾㿲㿳𤿯𤿳-𤿿皶-皹㿴㿵𥀀-𥀌𪾈𪾉𬐖皺㿶㿷𥀍-𥀓皻㿸𥀔-𥀞皼𥀟-𥀡皽㿹𥀢-𥀮皾㿺𥀯-𥀺] -[radical 108=⽫皿:皿-盁𥀿𥁀盂㿻𥁁-𥁅𫞯𬐗盃-盈㿼㿽𥁆-𥁍𪾊𪾋𫞰𬐘𬐙盉-监㿾-䀀𥁎-𥁝𥁫𪾌𪾍𬐚𬐛盒-盘盛䀁䀂𥁞-𥁪𪾎𬐜-𬐞盙盚盜䀃𥁬-𥁶𪾏𪾐𬐟-𬐡盝-盟䀄䀅𥁷-𥂂𪾑𪾒𫞱𬐢-𬐧盠-監䀆𥂃-𥂆𪾓𪾔𬐨-𬐯盤𥂇-𥂒𪾕𬐰盥-盧䀇䀈𥂓-𥂤𪾖𬐱盨-盪䀉𥂥-𥂲𥂴-𥂷𪾗𪾘𬐲-𬐵盫盬𥂸-𥂺𥂼-𥃀𪾙𬐶𬐷䀊𥂻𥃁-𥃆𪾚𬐸-𬐼盭𥃇-𥃑𬐽䀋𥃒𦪹𪾛𬐾-𬑀䀌𥃓-𥃗𪾜𬑁𬑂𥃘𥃙𥃞𥃚-𥃝𪾝𥃟𥃠𬑃𬑄𥃡䀍𪾞𥃢𥃣] -[radical 109=⽬目:目𥃤𥃥盯䀎䀏𥃦-𥃱盰-盵䀐-䀔𥃲-𥄂𪾟𪾠𬑅盶-眍䀕-䀞𥄃-𥄰𪾡-𪾣𬑆𬑇眎-眬眿䀟-䀦𥄱-𥅙𪾤-𪾧𫞲𬑈-𬑏眭-眾睁䀧-䀮𠌪𥅚-𥆉𪾨-𪾪𫞳𬑐-𬑕着睂-睑鿃䀯-䁀𥆊-𥇄𥇆-𥇈𥇫𪾫𪾬𬑖𬑗睒-睠睢-睭䁁-䁉𢰿𢾥𣪭𥇅𥇉-𥇪𥇬-𥇳𥇵-𥈁𪾭-𪾰𬑘-𬑛睡睮-瞆䁊-䁖𥈂-𥈻𪾱-𪾴𬑜𬑝瞇-瞓䁗-䁡𥈼-𥉳𥊇𪾵-𪾸𬑞-𬑣瞔-瞣䁢-䁪𥉴-𥊆𥊈-𥊩𥋖𪾹-𪾻𬑤-𬑧瞤-瞷䁫-䁳𥊪-𥋕𥋗𪾼-𪿀𬑨𬑩瞸-矂䁴-䁺𥋘-𥋾矃-矊𥋿-𥌔𥌖-𥌙𪿁𬑪矋-矏䁻-䁾𥌚-𥌬𪿂矐-矓䁿䂀𥌭-𥌹𥍂𪿃𪿄𬑫䂁𥌺-𥍁𥍃𥍅-𥍇矔䂂䂃𥍈-𥍎矕矗𥍏-𥍒矘矙䂄𥍓𬑬矖矚𥍔-𥍜𪿅䂅] -[radical 110=⽭矛:矛𥍝䂆𥍞𬑭矜䂇𥍟𥍠𪿆矝𥍡-𥍦䂈𥍧-𥍩矞矟𥍪-𥍱𪿇矠𠍢𥍲-𥍵𬑮䂉𥍶-𥎁𬑯𥎂-𥎍䂊-䂌𥎏-𥎒𥎎𥎓-𥎜䂍𥎞-𥎠𥎝𥎡-𥎣䂎矡𥎤𥎥] -[radical 111=⽮矢:矢矣𥎦𥎧矤知𥎨矦-矨𥎩-𥎯𪿈𪿉矩䂏䂐𥎰-𥎸𬑰𬑱矪矫䂑䂒𥎹-𥏍𪿊矬短䂓𠅰𥏎-𥏗𬑲𬑳矮䂔𥏘-𥏩𪿋𬑴䂕𥏪-𥏱𪿌𥏲-𥏺𪿍𪿎𥏻-𥏿矯矰𥐀-𥐆𬑵𥐇-𥐋𬑶矱𥐌-𥐏𬑷矲𪿏𪿐𬑸𥐑𥐒𥐐𥐓𥐔] -[radical 112=⽯石:石䂖𥐕𥐖矴-矶䂗𥐗-𥐜𬑹矷-码䂘䂙𥐝-𥐨𬑺-𬑼泵砂-砜䂚-䂞𥐩-𥑅𪿑-𪿓𬑽-𬒂砝-硁䂟-䂨𥑆-𥑲𪿔-𪿘𬒃-𬒈硂-硛鿎䂩-䂯𥑳-𥒩𪿙-𪿝𬒉-𬒌硜-硷䂰-䂶𥒪-𥓉𪿞-𪿣𬒍-𬒑硸-硽硿-碜碰䂷-䃇𥓊-𥓹𪿤-𪿩𬒒-𬒕硾碝-碯碱-碹磁䃈-䃐𥓺-𥔬𪿪𪿫𬒖-𬒚確-磀磂-磙磜磤䃑-䃗𥔭-𥕋𪿬-𪿮𬒛磚磛磝-磣磥-磮䃘-䃞䃠𥕌-𥕯𪿯-𪿴𬒜-𬒞磯-礅䃟䃡-䃨𥕰-𥖖𪿵-𪿷𬒟-𬒣礆-礖䃩-䃯𣞏𥖗-𥖩𪿸-𪿺𬒤𬒥礗-礡䃰𥖪-𥖺𪿻-𪿽𬒦𬒧礢-礬䃱-䃳𡕎𥖻-𥗑𬒨礭-礴䃴-䃷𥗒-𥗜𪿾礵䃸䃹𥗝-𥗪𬒩𬒪礶礷𥗫-𥗳𪿿礸䃺𥗴𥗵𥗷𥗸𬒫礹𥗹䃻𥗺-𥘄] -[radical 113=⽰示:示礻𥘅礼𥘆礽䃼𥘇-𥘌社-祃𥘍-𥘔𫀀𫀁𬒬祄-祎视鿆䃽-䄀𥘕-𥘪𫀂𫀃𬒭-𬒰祏-祢䄁-䄃𥘫-𥙍𫀄-𫀆𬒱-𬒳祣-祥祧-祯䄄-䄆𥙎-𥙪𫀇-𫀊𫞴𬒴𬒵祦祰-祸禄視䄇-䄊𣂫𥙫-𥚇𫀋-𫀏𫞵𬒶-𬒽祹-禃禅禆䄋-䄒𥚈-𥚥𫀐-𫀙𬒾-𬓈禇-禙䄓-䄗𢿆𥚦-𥛄𫀚𫀛𬓉-𬓍禚-禣䄘䄙𠖟𥛅-𥛗𫀜-𫀟𬓎-𬓐禤-禦䄚-䄞𥛘-𥛭𫀠𫀡𬓑-𬓗禧-禫䄟𥛮-𥜂𫞶𬓘-𬓚禬-禯鿅䄠䄡𥜃-𥜑𫀢𬓛禰禱䄢𥜒-𥜙𫀣𬓜禲䄣𥜚-𥜟䄤𥜠-𥜤禳禴𥜥-𥜩𬓝禵𥜪-𥜯禶禷𥜰-𥜵𫀤𥜶-𥜸𧆆𥜹𥜺䄥] -[radical 114=⽱禸:禸𥜻禹禺𥜼离𥜽禼𥜾禽萬𥜿𥝁-𥝃𠎘𠾧𥝄-𥝇𦦔𬓞𣜢𥝈𥝉𫀥𥝊𬓟𥝋] -[radical 115=⽲禾:禾𥝌-𥝏𫀦禿-秃䄦䄧𥝐-𥝓𬓠秄-秊䄨-䄭𥝔-𥝢𫀧秋-秗䄮-䄵𥝣-𥝽𫀨𫀩𬓡-𬓤秘-称䄶-䄹𥝾-𥞗𫀪-𫀭𬓥𬓦秱-秾稆䄺-䅊𥞘-𥞱𥟅𫀮-𫀱𫞷𬓧-𬓩秿-稅稇-税䅋-䅓𠞜𥞲-𥟄𥟆-𥟌𫀲-𫀸𬓪-𬓬稏-稥䅔-䅟𥟍-𥟼𫀹-𫀻𫞸𬓭-𬓰稦-稳穊䅠-䅫𥟽-𥠰𫀼-𫁀𬓱-𬓴稴-穃䅬-䅶𥠱-𥡛𫁁-𫁄𬓵-𬓹穄-穈穋-穒䅷-䅽𥡜-𥢉𫁅𬓺-𬓽穉穓-穞䅾-䆀𥢊-𥢳𫁆𬓾-𬔀穟-穣䆁-䆇𥢴-𥣉𥣋-𥣔𫁇𫁈𬔁穤-穫𥣊𥣕-𥣡𥣣-𥣧𬔂穬-穯䆈䆉𥣢𥣨-𥣶𥣸-𥣿𫁉𬔃䆊-䆍𥤀-𥤅𬔄穰穳䆎䆏𥤆-𥤉穱𥤊-𥤒穲𥤓𥤕-𥤟䆐𥤠𥤡] -[radical 116=⽳穴:穴𥤢穵-穷䆑𥤣-𥤦𫞹𬔅穸-穻䆒𥤧-𥤳穼-窃䆓-䆖𥤴-𥥆𫁊𬔆𬔇窄-窎䆗-䆙𥥇-𥥟𫁋𬔈窏-窕䆚-䆠𥥠-𥥵𫁌𫁍𬔉𬔊窖-窝䆡-䆥𥥶-𥦚𫁎-𫁐𬔋𬔌窞-窧䆦-䆩𥦛-𥦷𫁑-𫁓𬔍窨-窭䆪䆫𥦸-𥧏𫁔𫁕窮-窴䆬-䆮𥧐-𥧡𥧣-𥧫𫁖𬔎𬔏窵-窽䆯-䆴𥧬-𥧻𥧽-𥨋𫁗-𫁚𬔐-𬔓窾-竃䆵-䆻𥧼𥨌-𥨟𥨩𫁛竄竅䆼䆽𥨠-𥨨𫁜𬔔竆䆾䆿𥨪-𥨯𥨲竇䇀𥨰𥨱𥨳𥨴𥨶-𥨺竈竉𥨵𥨻-𥩈𬔕竊䇁𥩉𫞺𥩊𥩋𫁝𥩌𥩍𥩏-𥩑𥩎𥩒-𥩔] -[radical 117=⽴立:立䇂𬔖竌竍𥩕𥩖𫞻竎竏䇃䇄𥩗𥩘𫁞𬔗竐-竗䇅䇆𥩙-𥩟𫁟𬔘-𬔚竘-竞䇇-䇊𥩠-𥩰𫁠𫁡𬔛𬔜竡䇋𥩱-𥩽𫁢𫞼𬔝竢-竧䇌䇍𥩾-𥪉𫁣𫁤𬔞-𬔠竨-竫䇎-䇑𥪊-𥪗𫁥𫁦𬔡-𬔣竬竭端竰𥪘-𥪤𫁧𫁨𬔤-𬔦𥪥-𥪬𫁩-𫁫𬔧竮竱䇒𥪭𥪮𥪰𥪱𫁬𬔨𬔩竲-竴䇓𥪯𥪲-𥪹𥪻𫁭𬔪竵䇔𥪼-𥫁𥫃𥫄䇕𥪺𥫅-𥫇𫁮競竷𥫈-𥫏𬔫竸𥫐𥫑𫁯𥫓𥫔𥫒𥫕𥫖] -[radical 118=⽵竹:竹𥫗𥫘竺竻𥫙-𥫜𫁰𬔬竼-笃䇖𥫝-𥫮𫁱𬔭笅-笕䇗-䇝𥫯-𥬋𫁲-𫁷𬔮-𬔲笖-笾䇞-䇦𥬌-𥬩𥬿𫁸-𫁻𬔳-𬔹笄笿-筝䇧-䇴𥬪-𥬾𥭀-𥭏𫁼𫁽𬔺-𬕁筞-简節䇵-䈀𥭐-𥮇𥮉-𥮌𫁾-𫂃𬕂-𬕍箁-箫䈁-䈍𥮈𥮍-𥯐𫂄-𫂉𬕎-𬕙箬-箿篁-篈篊-篓䈎-䈩𥯑-𥰗𫂊-𫂏𫞽-𫞿𬕚-𬕡築篔-篯簑簕䈪-䈷𥰘-𥱴𫂐-𫂗𬕢-𬕨篰-簐簒-簔簖簗䈸-䉇𥱵-𥳀𥳂-𥳅𥴎𫂘-𫂟𬕩-𬕬簘-簲䉈-䉎䉐-䉚䉣𥳁𥳆-𥴍𥴏-𥴠𫂠-𫂤𬕭-𬕲簳-籂䉏䉛-䉢䉤𥴡-𥵛𫂥𫂦𬕳-𬕺籃-籏籕籖䉥𥵜-𥶄𫂧籐-籔䉦-䉭𥶅-𥶴𫂨-𫂫𬕻-𬕿籗-籡䉮-䉱𥶵-𥷓𫂬𬖀-𬖅籢-籨䉲-䉴𥷔-𥷧𫂭𬖆籪䉶𥷨-𥷻𫂮𬖇籩籫-籮𥷼-𥸇𫂯籯籰䉷𥸈-𥸏䉸𥸐-𥸖𬖈-𬖊𥸗𥸚-𥸝𫂰𥸘𥸙𥸞-𥸠籱䉹𥸡-𥸣籲𥸤] -[radical 119=⽶米:米𥸥𥸦𬖋籴-籶𥸧-𥸪𫂱𫂲𬖌-𬖎娄籷-粂䉺𥸫-𥸲𫂳𫂴𬖏粃-粑䉻䉼𥸳-𥹀𫂵-𫂷𬖐-𬖒畨粒-粝粣䉽-䊀𥹁-𥹖𥹘𥹙𥹱𫂸-𫂼𬖓-𬖘粞-粢粤-粭䊁-䊆𥹗𥹚-𥹰𫂽-𫃀𬖙-𬖜粮-粵糀䊇-䊌𥹲-𥺗𫃁𬖝-𬖠粶-粿糁䊍-䊒𥺘-𥻀𫃂-𫃅𬖡-𬖥糂-糎䊓-䊙𡢏𥻁-𥻣𫃆-𫃈𬖦-𬖪糏-糘䊚䊛䨀𢐫𥻤-𥻾𫃉-𫃌𬖫-𬖲糙-糢糨䊜-䊢𥻿-𥼖𫃍𫃎𫟀𬖳-𬖵糣-糧䊣-䊩𥼗-𥼵𫃏-𫃑𬖶-𬖺糩-糭䊪-䊬𥼶-𥽎𫃒-𫃕𬖻糮-糰䊭䊮𥽏-𥽖𫃖𬖼-𬖾糲䊯𥽗-𥽠𥽢𥽣𬖿糱糳糴䊰𥽡𥽤-𥽫𫃗-𫃙𬗀𬗁糵䊱䊲𥽬-𥽵𬗂糶䊳䊴𥽶-𥽿糷𥾀-𥾄] -[radical 120=⽷糸:糸-糿䊵𥾅-𥾋𫃚𫃛紀-紉䊶-䊹𥾌-𥾘𫃜𫃝𬗃𬗄紊-紧䊺-䋇𥾙-𥿂𫃞𬗅𬗆紨-経䋈-䋔𥿃-𥿥𫃟-𫃡𬗇-𬗊絍-絚絜-絷䋕-䋞𥿦-𦀑𫃢-𫃤𬗋-𬗔絛絸-綛緐䋟-䋦𦀒-𦁅𫃥-𫃩𬗕-𬗞綜-総緑緒緔緕䋧-䋲𦁆-𦁿𫃪-𫃲𬗟-𬗧緓緖-縇䋳-䌄𦂀-𦂦𦂨-𦃁𫃳-𫃷𫟁𬗨-𬗮縈-縨䌅-䌋𦂧𦃂-𦄁𦄃-𦄈𫃸-𫃼𬗯-𬗲縩-繇繉繊繌繍䌌-䌕𦄂𦄉-𦄻𫃽-𫄀𬗳-𬗺繈繎-繥繧繱䌖-䌛𦄼-𦅴𫄁-𫄄𫟂𬗻-𬘁繋繦繨-繰繲-繺䌜-䌢𦅵-𦆛𦆥𫄅-𫄋𬘂繻-纃䌣-䌧𦆜-𦆣𦆦𦆧𦆩𦆪𦆬-𦆺𫄌-𫄎𬘃-𬘈纄-纐䌨䌩𦆤𦆨𦆫𦆻-𦇁𦇃-𦇓𫄏-𫄑𬘉-𬘌纑纒䌪-䌭𦇂𦇔-𦇦𫄒-𫄔𬘍-𬘏纓-纖䌮𦇧-𦇯𫄕𬘐𬘑纗䌯-䌲𦇰-𦇷𦇹𬘒纘-纛䌳䌴𦇸𦇺𦇻𫄖𦇼𦇽𫄗纜纝䌵𦇾-𦈂𫄘𦈃𦈄纞𦈅-𦈇] -[radical 120'=⺰纟:纟𫄙纠-纫纶䌶𬘓纬-纵纷-纾䌸𫄚-𫄝𬘔-𬘘线-绐䌷䌹𦈈𫄞𫄟𬘙-𬘞绑-统䌺䌻𦈉𫄠-𫄣𫟃𬘟-𬘧绠-绨䌼𦈊-𦈌𫄤-𫄩𫟄𬘨-𬘫绩-缁䌽𦈍-𦈐𫄪𫄫𫟅𬘬-𬘯缂-缘䌾䌿𦈑-𦈕𫄬-𫄮𫟆𬘰-𬘸缙-缤䍀𦈖-𦈙𫄯𫄰𬘹-𬘽缥-缫𦈚𫄱-𫄴𬘾-𬙂缬-缯𦈛-𦈝𫄵𫄶𬙃-𬙈缰-缴䍁𦈞𦈟𫄷𬙉𦈠𦈡𫄸𫟇𬙊缵𬙋𫄹] -[radical 121=⽸缶:缶𦈢缷缸䍂𦈣-𦈥缹缺缼䍃𦈦-𦈨𬙌𬙍缻缽䍄-䍉𦈩-𦈮𬙎缾-罀䍊𦈯-𦈳𬙏𦈴-𦈷𫄺罁罂䍋䍌𦈸-𦉀𫄻𬙐𦉁-𦉇𫄼𫄽𬙑𬙒罃䍍𦉈-𦉎𫄾𬙓罄-罆𦉏-𦉔罇-罉𦉕-𦉘罊罋𤕁𦉙-𦉜𫄿𬙔罌𦉝𦉞罍𦉟𦉠罎罏𦉡䍎𦉢-𦉤罐𤫡𦉥-𦉩] -[radical 122=⽹网:网-罓䍏𦉪𦉫𦉭𦉰𦉯𦉬𦉮𦉱-𦉶𬙕罔-罗䍐䍑𦉷-𦊀𫅀𬙖-𬙘罘-罚䍒-䍔𦊁-𦊍𫅁𬙙罛-罢䍕-䍗𦊎-𦊣𦊥-𦊩𦊳𫅂𬙚-𬙜罣䍘𦊪-𦊲𦊴-𦊻𫅃-𫅅𬙝罤-罦䍙䍚𦊼-𦋄𦋑𬙞𬙟罧-置署䍛-䍞𦋅-𦋐𦋒-𦋜𫅆𫅇𬙠-𬙣罯-罱罳罴䍟𦋝-𦋩𦋫-𦋮𫅈罵-罸𦋯-𦋼𫅉𬙤-𬙦罹-罼䍠䍡𦋽-𦌑𫅊罽-羁䍢𦌒-𦌞𧷅𬙧𬙨羂䍣𦌟-𦌨𧐰𫅋𬙩羃-羆䍤𦌪-𦌴𫅌𦌵-𦌺䍥𦌻𦌼𫅍𬙪羇𦌽𬙫羈羉䍦𦌾-𦍊] -[radical 123=⽺羊:羊𦍋-𦍍羋羌𦍎-𦍐𫅎羍-羑𦍑-𦍖𫟈𬙬羒-羔羖-羙䍧-䍩𦍗-𦍤𦍮𬙭-𬙯羕羚-羟䍪-䍭𦍥-𦍭𦍯-𦍸𫅏-𫅒𬙰羠-羢䍮-䍰𦍹-𦎄𫅓𫅔𬙱-𬙳羣-羪䍱𦎆-𦎖𫅕𬙴羫䍲-䍶𦎗-𦎡𬙵𬙶羬-羰䍷𦎢-𦎮𫅖-𫅘𬙷𬙸羱羲䍸䍹𦎯-𦎶𫅙𬙹-𬙻䍺𦎷-𦏄𫅚-𫅜𬙼𬙽羳-羵䍻䍼𦌩𦏅-𦏔𫅝𫅞𬙾羶-羹𦏕-𦏛𬙿羺𦏜-𦏡𫅟羻羼𡅖𦏢-𦏧𬚀䍽𦏨𦏩𫅠𫅡𬚁𦏪-𦏮𬚂𣌞𦏯-𦏱] -[radical 124=⽻羽:羽𦏳𦏲羾羿𦏴-𦐁𫅢翀-翆䍾䍿𦐂-𦐔𫅣翇-習䎀-䎆𦐕-𦐢𫅤翓-翚䎇-䎊𦐣-𦐷𫅥-𫅧翛-翝䎋-䎎𦐸-𦑄𦑆𫅨𫅩𬚃翞-翤䎏-䎓𦑅𦑇-𦑐𦑒-𦑗𫅪𬚄翥-翭𦑘-𦑯𦑻𫅫𫅬翮-翱䎔䎕𦑰-𦑺𦑼-𦒂𦒞𫅭𫅮𬚅𬚆翲-翶翼𦒃-𦒌𫅯𬚇𬚈翷-翻䎖-䎘𦒍-𦒛𦒟𫅰𫅱翽翾𦒜𦒝𦒠𦒡翿耀䎙𦒢-𦒥𦒪𦒫䎚𦒦𦒨𦒩𦒬𦒧𦒭-𦒯𫅲𦒰] -[radical 125=⽼老:老-考𦒱𦒲𬚉𬚊䎛𦒳-𦒵耄-耆𦒶-𦒹耇-耉𦒺-𦒿𫅳𫅴𬚋耊耋䎜-䎞𦓀𦓁𫅵𬚌𦓂𫅶𦓄𦓅𫅷𦓆𦓇𦓃𦓈𦓉𬚍𦓊𫅸𬚎𦓋-𦓍] -[radical 126=⽽而:而𦓐𦓎𦓏𦓑耍-耑䎟-䎡𦓒-𦓜𬚏𦓝-𦓣] -[radical 127=⽾耒:耒𦓤耓𦓥-𦓧耔䎢𦓨-𦓪耕-耙𦓫耚-耟䎣𦓬-𦓮𫅹耠𦓯-𦓳𫅺𫅻𬚐耡耢䎤䎥𦓴-𦓶𫅼耣-耥䎦-䎪𦓷-𦔁耦耧䎫䎬𦔂-𦔊𫅽耨-耪𦔋-𦔒𫅾耫耬䎭-䎯𦔓-𦔚耭耮䎰𦔛-𦔞𦔠-𦔤𫅿𦔟𦔥-𦔨𬚑耯耰䎱𦔩𦔪耱耲𦔫-𦔭] -[radical 128=⽿耳:耳耴䎲𦔮耵𦔯-𦔶𫆀𫟉耶耷𦔷-𦔻𬚒𬚓耸-聂䎳䎴𦔼-𦕏𫆁聃-聍䎵䎶𦕐-𦕟𬚔-𬚖聎-联聠䎷𦕠-𦕢𦕤-𦕴𫆂𫆃𬚗-𬚙聕-聘䎸䎹𦕣𦕵-𦖇𦖗𫆄-𫆆𬚚-𬚝聙-聟聡-聣䎺-䎾𦖈-𦖖𦖘-𦖡𫆇𫆈𬚞-𬚠聤-聫䎿䏀𥧢𦖢-𦖻𦗇𫆉𬚡𬚢聬聭䏁-䏃𦖼-𦗆𦗈-𦗏𫆊-𫆍𬚣-𬚥聯-聳䏄-䏇𦗐-𦗞𫆎𫆏聮聴-職䏈𦗟-𦗲𫆐𫆑𬚦𬚧聸𦗳-𦗽𫆒聹-聼䏉𦗾-𦘄𬚨𦘅-𦘉聽聾䏊𦘊-𦘑𫆓𬚩] -[radical 129=⾀聿:聿肀𦘒𦘓𬚪𦘔肁-肃𦘕-𦘚肄-肆䏋𦘛𦘜𫆔𬚫肇肈𦘝-𦘟𫆕𦘠-𦘢𬚬𦘣𬚭𬚮𦘤-𦘨] -[radical 130=⾁肉:肉-肏䏌䏍𦘩-𦘳肐-肠䏎䏏𦘴-𦘾𬚯股-胁䏐-䏝𦘿-𦙩𫆖-𫆘𬚰-𬚳胂-胬脉䏞-䏥𡋜𣍨𦙪-𦚜𫆙-𫆜𬚴-𬚶胭-脈脊-脔䏦-䏮𣍯𣍰𦚝-𦛓𫆝𫆞𬚷-𬚺脕-脸䏯-䏻𦛔-𦜅𫆟-𫆡𬚻-𬛁脹-腚㬹䏼-䐌𦜆-𦜲𦜴-𦝙𫆢-𫆥𬛂-𬛇幐腛-腾䐍-䐛𦝚-𦞘𦟓𦟔𫆦-𫆨𬛈-𬛋腿-膑䐜-䐪𦞙-𦟒𦟕-𦟗𫆩-𫆮𫟊𬛌-𬛎膒-膣䐫-䐴𦟘-𦠂𫆯-𫆴𬛏-𬛓膥-膶䐵-䐽𦠃-𦠽𦡄𦡮𫆵-𫆸𬛔-𬛘膷-臌䐾-䑁𦠾-𦡃𦡅-𦡍𦡏-𦡕𦡘-𦡭𦡯𫆹-𫆻𬛙-𬛛臍-臓䑂-䑅𤑃𦡎𦡰-𦢉𫆼𫆽𬛜𬛝臔臕臗臘䑆-䑈𦢊-𦢤𫆾𫆿臖臙-臜䑉䑊𦢥-𦢷𫇀𬛞臝㔮䑋-䑎𦢸-𦢾𫇁𬛟臞臟䑏𦢿-𦣅𫇂臠-臢𤓏𦣆-𦣐𫇃𬛠𦣑-𦣕𬛡𦣖-𦣜𫇄] -[radical 131=⾂臣:臣𦣞𦣝臤臥𦣟-𦣣𫇅𬛢𬛣䑐𦣤𦣥𬛤臦𦣦-𦣩𫇆𬛥𫇇𬛦臧𦣫𦣬𦣮𫇈𦣭𦣯𬛧𬛨𦣪臨臩𦣰𦣱𬛩䑑𦣲𦣳𫇉𦣴𦣵𬛪𦣶𬛫𦣷𦣸] -[radical 132=⾃自:自𦣹臫𦣺-𦤀臬臭𦤁-𦤏𬛬臮-臰𦤐-𦤓𫇊𦤔-𦤗𬛭臱𦤘-𦤝𫇋臲𦤞-𦤤𬛮𦤥𫇌𦤦-𦤪𬛯𦤫-𦤮𬛰𦤯-𦤲𫇍] -[radical 133=⾄至:至𦤳-𦤵𬛱致䑒𦤶-𦤺𬛲𦤻-𦤾臵-臸𦤿𦥀𬛳臹䑓𦥁𫇎臺𦥂-𦥄𫇏𫇐𦥅-𦥇臻𦥉-𦥍𬛴𬛵𦥎-𦥐𫇑𬛶𬛷] -[radical 134=⾅臼:臼𦥑-𦥔臽臾𦥕𦥖𦥙臿𦥗𦥘𦥚-𦥜𦥧𬛸𬛹舀舁䑔𦥝-𦥤舂䑕𦥥𦥦𦥨-𦥬舃舄𦥭-𦥲𫟋舅𦥳-𦥺𬛺與䑖𦥻-𦦄興䑗𦦅-𦦎𬛻舆舉䑘𦦏-𦦓𦦕-𦦗𬛼𦦘-𦦠𬛽舊𦦡-𦦧𫇒𬛾舋𠤫𦦩-𦦬𦦯𬛿𬜀𦦭𦦮𦦰-𦦻𬜁𤓟𦦼𬜂𦦽-𦧀𫇓𬜃𦧁𦧂𬜄𦧃-𦧅𠔻] -[radical 135=⾆舌:舌𦧆舍-舏𫇔𦧇舐䑙䑚𦧈-𦧐舑䑛𦧑-𦧔𬜅𬜆舒𦧕-𦧞𫇕𫇖𬜇舓-舕𦧟-𦧦𬜈舖舗䑜𦧧-𦧬𬜉-𬜌舘𦧭-𦧰𫇗𦧱-𦧳𬜍舙𦧴-𦧶𬜎舚𦧷𫇘𬜏𬜐𦧸-𦧺𫇙𦧻-𦧽] -[radical 136=⾇舛:舛-舞䑝𦧾𦧿䑞𦨀𦨁䑟𦨃𦨂𦨄-𦨆] -[radical 137=⾈舟:舟𠂨𦨇舠䑠𦨈-𦨍𬜑舡-舤䑡-䑣𦨎-𦨔𫇚𬜒舥-舱䑤䑥𦨕-𦨠舲-舻䑦-䑩𦨡-𦨮舼-舿䑪-䑮𦨯-𦨲𦨴-𦨼𬜓艀-艉䑯䑰𦨳𦨽-𦩉𬜔艊-艍䑱-䑸𦩊-𦩜𨦞𫇛𬜕𬜖艎-艔䑹-䑻𦩝-𦩳𦩿𫇜𫇝𬜗艕-艙䑼-䑾𦩴-𦩾𦪀-𦪅𬜘-𬜚艚-艝䑿-䒅𦪆-𦪐𫇞𬜛艞-艠䒆-䒈𦪑-𦪧𫇟艡-艥𦪨-𦪰艦-艩䒉𦪱-𦪵𫇠艪𦪶-𦪸𦪺-𦪼𬜜艫𦪽-𦫂𫇡-𫇣艬𦫃𦫄艭𦫅-𦫇𦫉𦫈𦫊] -[radical 138=⾉艮:艮-艰𦫋-𦫐艱𦫑𦫒] -[radical 139=⾊色:色䒊𦫓艳艴䒋𦫔-𦫚𬜝𦫛-𦫝艵𦫞-𦫣𬜞𦫤-𦫩䒌䒍𦫪-𦫮𫇤䒎䒏艶𦫯-𦫱䒐艷𦫲𬜟] -[radical 140=⾋艸:艸艹䒑艺龷𦫳-𦫵艻-节䒒-䒔𦫶-𦬀𫇥𫇦𬜠芃-芗䒕-䒙𦬁-𦬒𫇧𫇨𬜡𬜢芘-芾苀-苏茾䒚-䒥𦬓-𦬶𫇩-𫇭𬜣-𬜥芿苐-茑茓-茕䒦-䒯𦬷-𦭬𫇮-𫇵𫟌𫟍𬜦𬜧茒茖-茜茞-茢茤-茽茿-荒荔-药鿒䒰-䓁𦭭-𦮵𫇶-𫇾𫟎𬜨-𬜮茝茣荰-莬莮-莽鿊䓂-䓔䓖𦮶-𦯰𦯲-𦰕𦰗-𦰩𫇿-𫈏𫟏-𫟑𬜯-𬜺荓莾-萨著龿䓕䓗-䓭𦯱𦰖𦰪-𦳀𫈐-𫈠𬜻-𬝋莭萩-萫萭-葖葘-蒏鿓䓮-䓻𦳁-𦴵𦴷-𦵆𦵈-𦵠𫈡-𫈵𫟒𫟓𬝌-𬝙蒐-蒷蒹-蓤蓦䓼-䔍𤎀𦵇𦵡-𦷾𫈶-𫉇𫟔𬝚-𬝴蓥蓧-蔼䔎-䔬𦷿-𦸼𦸾-𦺄𫉈-𫉜𫟕𬝵-𬞍蔽-蕵䔭-䕄𦸽𦺆-𦻆𦻈-𦻽𦻿-𦼨𦽭𫉝-𫉤𫟖𬞎-𬞙蕶-薨薪-薬薮龩﨟䕅-䕑𦻾𦼩-𦽬𦽮-𦾩𦿡𦿸𫉥-𫉴𬞚-𬞬薩薭薯-藓蘤䕒-䕝𦾪-𦿓𦿖-𦿜𦿞-𦿠𦿢-𦿷𦿹-𧀟𫉵-𫊄𬞭-𬞾藔-藭藯-藵䕞-䕥𦿔𦿕𦿝𧀠-𧁺𧃌𫊅-𫊋𬞿-𬟍藮藶-蘑蘓蘔蘢䕦-䕲𧁻-𧃋𧃎𫊌-𫊏𬟎-𬟕蘒蘕-蘡蘣蘥-蘰䕳-䕷𧃍𧃏-𧄌𫊐-𫊓𬟖-𬟛蘲-蘷鿀䕸-䕺𧄍-𧄵𫊔-𫊖𬟜-𬟟蘱蘸-虁䕻-䕽𧄶-𧅕𫊗𬟠-𬟤虂-虅䕾𧅖-𧅭𫊘-𫊚𬟥虆-虉䕿䖀𧅮-𧅴𧅶-𧅹𬟦䖁𧅺-𧆅𫊛𫊜虊䖂-䖄𧆇-𧆎䖅䖆𧅵𧆏-𧆒虋虌𧆔𧆕𦺅𧆖𧆚𧆗䖇𧆙𧆓𧆘] -[radical 141=⾌虍:虍-虏䖈𧆛彪虐䖉𧆜-𧆞𫊝𫊞𬟧虑虓虔䖊-䖍𧆟-𧆢𫊟𬟨𬟩處-虚䖎䖏𧆣-𧆰虛-虝䖐䖑𧆱-𧆹𫊠𫊡𬟪虞號䖒-䖖𧆺-𧇀𬟫-𬟭虠虡𧇁-𧇎𫊢虢虣䖗𧇏-𧇛虤-虦䖘𧇜-𧇰𬟮-𬟰虧虨䖙𧇱-𧇺𫊣虩䖚䖛𧇻-𧈁𧈃𧈄𬟱䖜𧈂𧈅-𧈊𬟲𧈋-𧈏𧈑-𧈛𬟳虪𧈜] -[radical 142=⾍虫:虫虬䖝𧈝𧈞虭-虲𧈟-𧈧𫊤虳-蚃䖞-䖠𡯥𧈨-𧈺𫊥𫊦𬟴𬟵蚄-蚇蚉-蚪蚬䖡-䖣𧈻-𧉝𫊧-𫊫𬟶-𬟻蚫蚭-蛏﨡䖤-䖬𧉞-𧊎𫊬-𫊲𬟼-𬠁蚈蛐-蛕蛗-蛴䖭-䖵𧊏-𧊪𧊬𧊭𧊯-𧋇𫊳-𫊼𬠂-𬠇蛖蛵-蜗蜫蝆䖶-䖾𧊫𧊮𧋈-𧋝𧋟-𧌂𧌞𫊽-𫋁𬠈-𬠍蜘-蜪蜬-蝅蝇-蝋䖿-䗊䗕𧋞𧌃-𧌝𧌟-𧌯𧌱-𧍑𫋂-𫋉𬠎-𬠚蝌-蝸蝺-螀蟡䗋-䗔䗖𧌰𧍒-𧎠𧏇𫋊-𫋎𬠛-𬠞蝹螁-螩蟗䗗-䗞𧎡-𧏆𧏈-𧏷𫋏-𫋕𬠟-𬠤螪-蟒蠁䗟-䗮𢋜𧏸-𧐯𧐱-𧑃𫋖-𫋙𬠥-𬠨蟓-蟖蟘-蟠蟢-蟵蠎䗯-䗳𧑄-𧒍𫋚-𫋞𬠩-𬠮蟶-蠀蠂-蠍蠏䗴-䗻𧒎-𧓈𫋟-𫋢𬠯-𬠱蠐-蠙䗼-䘁𧓉-𧓰𫋣-𫋥𫟗𬠲-𬠷蠚-蠤蠴䘂-䘄𧓱-𧔜𫋦𫋧𬠸蠥-蠬䘅-䘉𧔝-𧕂𫋨𬠹蠭-蠳䘊-䘌𧕃-𧕒𧕔-𧕚𬠺蠵-蠺𧕓𧕛-𧕮蠻䘍𧕯-𧕼𬠻蠼𧕽-𧖃𧖊蠽蠾𧖄-𧖉𧖋-𧖐蠿䘎𧖑-𧖗𠑴𧖘-𧖛𫋩𧖜-𧖟𧖡-𧖦] -[radical 143=⾎血:血𧖧-𧖩衁衂䘏𧖪衃衄䘐𧖫-𧖯𫋪衅䘑𧖰-𧖲𫋫衆-衉𧖳𧖴𬠼䘒𧖵-𧖹䘓𧖺-𧖿𧗄䘔𧗀-𧗃𧗅-𧗍𫋬𧗎-𧗗衊𧗘-𧗛衋𧗜] -[radical 144=⾏行:行𬠽𧗝-𧗠衍衎𧗡-𧗥衏䘕𧗦-𧗩𬠾𬠿衐-衔𧗪𫋭衕-衘䘖𢔬𧗫-𧗱𫋮衙𧗲-𧗸𧗺𧗻衚-衝𧗹𧗼𧗽𫋯𫟘𬡀衞-衡䘗䘘𢖅𧗾𢖋𧗿-𧘁𫟙𧘂𧘃𫋰𧘄䘙𢖡𧘅𬡁𧘆𫋱衢] -[radical 145=⾐衣:衣衤𧘇补䘚䘛𧘈-𧘌𬡂衦-衬䘜-䘞𧘍-𧘜𬡃-𬡇衭-袇䘟-䘡𧘝-𧘼𫋲-𫋴𬡈-𬡊袈-袮袰䘢-䘧𧘽𧘿-𧙝𫋵-𫋷𬡋-𬡐袯袱-裉䘨-䘮𧘾𧙞-𧙿𫋸-𫋼𬡑-𬡘裊-裥䘯-䘲𧚀-𧚣𫋽𫟚𬡙-𬡝裧-褄䘳-䙂𧚤-𧚺𧚼-𧛎𫋾-𫌄𬡞-𬡤裦褅-褝䙃-䙍𧚻𧛏-𧛷𫌅𫌆𬡥𬡦褞-褲褴䙎-䙓𧛸-𧜜𧜨𫌇-𫌉𬡧-𬡩褳褵-襅襔䙔-䙝𧜝-𧜧𧜩-𧜬𧜮-𧝁𫌊-𫌏𬡪-𬡭襆-襓襕鿋䙞-䙣𧜭𧝂-𧝰𫌐-𫌒𬡮𬡯襖-襢䙤䙥𧝱-𧞌𫌓𫌔𬡰𬡱襣-襨䙦-䙩𧞍-𧞖𧞘-𧞦𫌕𬡲-𬡴襩-襮䙪𧞗𧞧-𧞱𧞳-𧞵𫌖𬡵𬡶襯-襲䙫𧞲𧞶-𧟂𬡷襳襴襽䙬䙭𧟃-𧟇𫌗襵-襷䙮䙯𧟈-𧟋𫌘𫌙襸-襼䙰𧟌-𧟔䙱𧟕-𧟟] -[radical 146=⾑襾:襾-覀𧟠-𧟣要䙲𧟤-𧟦䙳𧟧-𧟩𬡸覂䙴𧟪-𧟬𫌚覃覄䙵䙶𧟭𧟮𫟛覅𧟯𧟰𬡹𧟱-𧟸𬡺𧟹-𧟾𫌛𧟿覆𧠀𧠁𬡻覇覈𧠂-𧠄覉覊𧠅] -[radical 147=⾒見:見𧠆𧠇覌覙𧠈覍覎䙷䙸𧠉-𧠍𫌜規-覔䙹-䙻𧠎-𧠛𬡼覕覗覘覚䙼-䙿𧠜-𧠧𫌝𬡽覛覜䚀䚁𧠨-𧠺𫌞覝-覡䚂䚃𧠻-𧡊𫌟𫌠覢-覥䚄䚅𧡋-𧡠𫌡𬡾-𬢀覦-親䚆-䚉𧡡-𧡶𫌢𫌣覫-覯䚊-䚌𧡷-𧢁𬢁覰-観䚍䚎𧢂-𧢋𫌤𬢂覴-覸䚏-䚓𧢌-𧢑𬢃𬢄覹-覻𧢒-𧢗𫌥覼覽䚔𧢘-𧢛𬢅覾覿𥍄𧢜-𧢡𫟜𬢆𧢢-𧢥觀𧢦-𧢫𫌦𫌧䚕𧢬-𧢮䚖𧢯-𧢱] +[radical 96=⽟玉:玉王𤣩玊玌-玑㺨-㺫𤣪-𤣬𪻍𭸵玒-玛㺬-㺯𤣭-𤣸𬍐𬍑玜-玱㺰-㺶𤣹-𤤎𪻎-𪻔𫞥𬍒-𬍖𭸶-𭸻玲-珑㺷-㺾𤤏-𤤴𪻕𪻖𬍗-𬍝𭸼-𭹃珒-珲琉㺿-㻈𠴦𤤵-𤥕𪻗-𪻟𫞦𬍞-𬍤𭹄-𭹋珳-珶珸-琈琊-琓㻉-㻐𤥖-𤥺𪻠-𪻥𬍥-𬍩𭹌-𭹔珷琔-琝琟-琼㻑-㻜𤥻-𤦮𪻦-𪻲𫞧𬍪-𬍳𭹕-𭹢琞琽-瑟㻝-㻦𤦯-𤧩𪻳-𪼂𬍴-𬍺𭹣-𭹪瑠-瑸㻧-㻪𤧪-𤨓𪼃-𪼏𫞨𬍻-𬎄𭹫-𭹮瑹-璌璎璓㻫-㻴𤨔-𤨿𤩁𪼐-𪼖𫞩𬎅-𬎊𭹯-𭹵璍璏-璒璔-璡璣璤㻵-㻼𤩀𤩂-𤩪𪼗-𪼠𬎋-𬎒𭹶-𭹿璢璥-璴㻽-㼂𤩫-𤪊𪼡-𪼦𬎓-𬎖𭺀-𭺈璵-瓂𤪋-𤪨𤪴𪼧𪼨𬎗-𬎙𭺉-𭺌瓃-瓋㼃-㼆𤪩-𤪳𤪵-𤪽𪼩-𪼫𬎚𭺍-𭺐瓌-瓒㼇𤪾-𤫈𪼬-𪼯𬎛-𬎝𭺑瓓-瓖𤫉-𤫓𪼰𭺒𭺓瓗-瓙𤫔-𤫘𭺔-𭺖瓚㼈𤫙-𤫟𪼱瓛𤫠𪼲𬎞𤫣-𤫧𬎟𬎠𤫢𤫨𬎡𤫩] +[radical 97=⽠瓜:瓜瓝𤫪𪼳㼉㼊𤫫-𤫯𪼴𭺗瓞瓟㼋㼌𤫰-𤫴𬎢𬎣𭺘瓠㼍㼎𤫵-𤫹㼏𤫺-𤬀瓡𤬁-𤬆𪼵㼐-㼒𤬈-𤬌㼓㼔𤬇𤬍𤬐-𤬕瓢𤬎𤬏𤬖𭺙𤬗㼕𤬘-𤬚𭺚瓣𤬛-𤬝瓤𤬞-𤬡瓥𤬢㼖𤬣-𤬥] +[radical 98=⽡瓦:瓦𭺛𭺜瓧㼗𤬦𤬧𬎤瓨瓩㼘㼙𤬨-𤬫𪼶𬎥瓪-瓲㼚㼛𤬬-𤬲𪼷𪼸𬎦𬎧𭺝瓳-瓵㼜-㼠𤬳-𤬽𪼹瓶-瓸㼡-㼦𤬾-𤭋𬎨-𬎫𭺞-𭺡瓹-瓼㼧-㼪𤭌-𤭚𭺢瓽-甁㼫-㼱𤭛-𤭦𤭲𤮖𪼺𪼻𬎬𬎭𭺣甂-甆㼲-㼷𤭧-𤭱𤭳-𤭸𪼼𬎮甇-甉㼸-㼺𠪹𤭹-𤮄𪼽𪼾𬎯𭺤甊-甎㼻-㼾𤮅-𤮍甏-甒㼿-㽅𤮎-𤮕𤮗甓-甕㽆㽇𤮘-𤮟𭺥𭺦甖㽈㽉𤮠𤮡𬎰𤮢-𤮥𭺧𭺨甗𤮦-𤮬㽊𤮭-𤮯𪼿𭺩𤮰-𤮵㽋𤮶㽌𤮷-𤮹] +[radical 99=⽢甘:甘𤮺𭺪𭺫甙𤮻-𤯀甚𤯁-𤯄𫞪㽍𤯅甛甜𭺬𤯆𪽀甝甞㽎𤯇𬎱𭺭㽏𤯈𬎲𭺮𭺯㽐𤯉𤯊𭺰𤯋𤯌㽑𤯍𤯎𤯐-𤯒] +[radical 100=⽣生:生𤯓𤯔𪽁𤯕-𤯗𭺱-𭺳甠𤯘-𤯞𬎳甡𤯟𭺴產産𤯠-𤯥𪽂𬎴𬎵甤-甦㽒𤯦-𤯫𬎶𭺵𤯬-𤯱𪽃-𪽅𬎷-𬎹甧𤯲-𤯴𬎺-𬎼㽓𤯵㽔𤯶-𤯺𭺶𭺷𤯻𤯼𤯾-𤰂] +[radical 101=⽤用:用-甪𤰃𪽆甫甬𤰄𠂵𠃰𡶤𤰅𤰆𬎽𬎾𭺸甭甮𭺹𠳫𤰇𤰈𭺺甯𤰉𭺻𤰊-𤰌𭺼𤰍-𤰏𤰑𤰐] +[radical 102=⽥田:田-电𤰒甶𤰓𤰔𭺽男-町甼㽕-㽗𠃫𤰕-𤰜𪽇𬎿画甽-畅𡇍𢑖𤰝-𤰨𪽈𬏀畆-畓㽘-㽚𤰩-𤱋𪽉-𪽌𬏁𭺾-𭻆畔-畟㽛㽜𤱌-𤱠𤱢-𤱤𪽍-𪽐𬏂𬏃𭻇-𭻋畡-畧畩異㽝㽞𤱥-𤱺𪽑𪽒𫞫𬏄-𬏆𭻌-𭻓番-畯畲-畴㽟㽠𤱻-𤲐𪽓-𪽗𬏇-𬏊𭻔-𭻚畵-畺㽡-㽤𤲑-𤲪𪽘-𪽚𬏋𭻛-𭻟畱畻-畽㽥𤲫-𤲶𪽛𪽜𭻠-𭻤畾畿㽦-㽨𤲷-𤳇𪽝𪽞𬏌-𬏒𭻥𭻦疀-疂㽩𤳈-𤳎𤳐𤳑𪽟-𪽡𬏓𬏔𭻧-𭻮疃疄㽪𤳒-𤳚𤳜-𤳣𪽢𬏕𭻯-𭻱疅㽫㽬𤳤-𤳨𨐴𪽣𬏖𬏗𭻲𭻳疆疇㽭𤳩-𤳰𤳲𭻴𭻵疈㽮𤳱𤳳-𤳸𪽤𭻶𭻷𤳹-𤳾𪽥𪽦𭻸疉疊𤳿-𤴁𭻹㽯𤴂-𤴄𬏘𭻺𤴅𤴆𭻻𤴇-𤴍𭻼𤴎𭻽𤴏-𤴒] +[radical 103=⽦疋:疋𤴓-𤴕𭻾疌𤴖𤴘𭻿疍𤴗𭼀𭼁疎疏𤴙-𤴛㽰𤴜𤴝𬏙𭼂疐疑𭼃𭼄𤴞𭼅𤴟-𤴢𪽧𤴣𤴤] +[radical 104=⽧疒:疒𤴥𬏚疓-疗㽱㽲𤴦-𤴮疘-疠㽳-㽶𤴯-𤴶𬏛𬏜疡-疯疺㽷-㽼𤴷-𤵖𪽨-𪽫𬏝-𬏠𭼆𭼇疰-疹疻-痉㽽-㾉𤵗-𤵶𪽬-𪽮𫞬𬏡-𬏦𭼈𭼉痊-痖㾊-㾒𤵷-𤶔𪽯𬏧-𬏬𭼊-𭼍痗-痫㾓-㾡𤶕-𤷁𪽰𪽱𬏭-𬏱𭼎-𭼒痬-瘆㾢-㾩𤷂-𤷺𪽲𬏲-𬏵𭼓-𭼖瘇-瘘瘟瘧㾪-㾵𤷻-𤸩𪽳-𪽵𬏶-𬏸𭼗-𭼝瘙-瘞瘠-瘦瘨-瘫㾶-㿁𤸪-𤹜𪽶𪽷𫞭𬏹𭼞瘬-瘿癊㿂-㿈𤹝-𤺂𤺞𬏺𬏻𭼟-𭼧癀-癉癋-癎㿉㿊𤺃-𤺝𤺟-𤺹𪽸𪽹𬏼𬏽𭼨-𭼭癏-癞㿋-㿐𤺺-𤻔𬏾𭼮𭼯癟-癡癣㿑-㿓𤻕-𤻯𪽺𭼰-𭼴癢癤-癦㿔𤻰-𤻿𭼵-𭼷癧-癫㿕-㿗𤼀-𤼊𬏿𬐀𭼸癬-癮㿘𤼋-𤼏𬐁癯癰㿙𤼐-𤼗癱癲㿚㿛𤼘-𤼛𭼹𭼺𤼜-𤼞癳𤼟-𤼢𭼻癴㿜𤼣𭼼𤼤癵] +[radical 105=⽨癶:癶𭼽𤼥𤼦癷-発𤼧𤼨𭼾𭼿𤼩-𤼮𭽀登發𤼯-𤼲𬐂𭽁𤼳-𤼵𭽂𤼶𭽃𤼷𤼸𭽄𤼹𤼺𤼼𭽅𤼻] +[radical 106=⽩白:白-癿𤼽𤼾𬐃皀-皃㿝𤼿-𤽁𭽆的𤽂-𤽇𭽇-𭽊皅-皈㿞𤽈-𤽗𪽻𪽼𬐄𬐅𭽋-𭽍畠皉-皍㿟𤽘-𤽤𪽽𫞮𬐆𬐇𭽎-𭽓皎-皑㿠㿡𤽥-𤽫𬐈𬐉𭽔-𭽗皒-皖𠌟𤽬-𤽸𪽾𪽿𬐊𭽘皗-皙㿢𤽹-𤾇𪾀𪾁𬐋-𬐎𭽙-𭽜㿣㿤𤾈-𤾓𪾂𪾃𬐏𬐐𭽝𭽞皚-皞㿥𤾔-𤾚𪾄𭽟皟-皡㿦𤾛-𤾟𭽠皢-皥𤾠-𤾦皦-皨𤾧-𤾪𭽡𭽢皩㿧𤾫-𤾳皪皫𤾴-𤾷皬㿨𤾸-𤾺𪾅𤾻-𤾽皭𤾾𤾿𬐑𤿀-𤿃㿩𤿄𤿅] +[radical 107=⽪皮:皮𤿆𤿇皯㿪𤿈-𤿍𪾆㿫㿬𤿎-𤿔𪾇𬐒皰皱㿭㿮𤿕-𤿞𬐓𬐔𭽣𭽤皲㿯㿰𤿟-𤿦𭽥-𭽪皳皴㿱𤿧-𤿮𤿰-𤿲𬐕𭽫皵龾㿲㿳𤿯𤿳-𤿿𭽬-𭽮皶-皹㿴㿵𥀀-𥀌𪾈𪾉𬐖𭽯𭽰皺㿶㿷𥀍-𥀓𭽱-𭽳皻㿸𥀔-𥀞𭽴𭽵皼𥀟-𥀡𭽶皽㿹𥀢-𥀪𭽷𥀫-𥀮𭽸𭽹皾㿺𥀯-𥀸𭽺𥀹𥀺𭽻] +[radical 108=⽫皿:皿-盁𥀿𥁀盂㿻𥁁-𥁅𫞯𬐗盃-盈㿼㿽𥁆-𥁍𪾊𪾋𫞰𬐘𬐙𭽼盉-监㿾-䀀𥁎-𥁝𥁫𪾌𪾍𬐚𬐛𭽽-𭽿盒-盘盛䀁䀂𥁞-𥁪𪾎𬐜-𬐞𭾀𭾁盙盚盜䀃𥁬-𥁶𪾏𪾐𬐟-𬐡𭾂盝-盟䀄䀅𥁷-𥂂𪾑𪾒𫞱𬐢-𬐧𭾃-𭾆盠-監䀆𥂃-𥂆𪾓𪾔𬐨-𬐯𭾇-𭾋盤𥂇-𥂒𪾕𬐰𭾌-𭾏盥-盧䀇䀈𥂓-𥂤𪾖𬐱𭾐盨-盪䀉𥂥-𥂲𥂴-𥂷𪾗𪾘𬐲-𬐵𭾑盫盬𥂸-𥂺𥂼-𥃀𪾙𬐶𬐷𭾒䀊𥂻𥃁-𥃆𪾚𬐸-𬐼𭾓𭾔盭𥃇-𥃑𬐽䀋𥃒𦪹𪾛𬐾-𬑀𭾕䀌𥃓-𥃗𪾜𬑁𬑂𥃘𥃙𥃞𭾖𥃚-𥃝𪾝𥃟𥃠𬑃𬑄𥃡䀍𪾞𥃢𥃣] +[radical 109=⽬目:目𥃤𥃥盯䀎䀏𥃦-𥃱𭾗-𭾙盰-盵䀐-䀔𥃲-𥄂𪾟𪾠𬑅𭾚-𭾝盶-眍䀕-䀞𥄃-𥄰𪾡-𪾣𬑆𬑇𭾞-𭾥眎-眬眿䀟-䀦𥄱-𥅙𪾤-𪾧𫞲𬑈-𬑏𭾦-𭾪眭-眾睁䀧-䀮𠌪𥅚-𥆉𪾨-𪾪𫞳𬑐-𬑕𭾫-𭾲着睂-睑鿃䀯-䁀𥆊-𥇄𥇆-𥇈𥇫𪾫𪾬𬑖𬑗𭾳-𭾸睒-睠睢-睭䁁-䁉𢰿𢾥𣪭𥇅𥇉-𥇪𥇬-𥇳𥇵-𥈁𪾭-𪾰𬑘-𬑛𭾹-𭿂睡睮-瞆䁊-䁖𥈂-𥈻𪾱-𪾴𬑜𬑝𭿃-𭿏瞇-瞓䁗-䁡𥈼-𥉳𥊇𪾵-𪾸𬑞-𬑣𭿐-𭿔瞔-瞣䁢-䁪𥉴-𥊆𥊈-𥊩𥋖𪾹-𪾻𬑤-𬑧𭿕-𭿜瞤-瞷䁫-䁳𥊪-𥋕𥋗𪾼-𪿀𬑨𬑩𭿝-𭿡瞸-矂䁴-䁺𥋘-𥋾𭿢-𭿨矃-矊𥋿-𥌔𥌖-𥌙𪿁𬑪𭿩-𭿭矋-矏䁻-䁾𥌚-𥌬𪿂矐-矓䁿䂀𥌭-𥌹𥍂𪿃𪿄𬑫𭿮-𭿱䂁𥌺-𥍁𥍃𥍅-𥍇𭿲矔䂂䂃𥍈-𥍎矕矗𥍏-𥍒𭿳𭿴矘矙䂄𥍓𬑬矖矚𥍔-𥍜𪿅䂅] +[radical 110=⽭矛:矛𭿵𥍝𭿶䂆𥍞𬑭矜䂇𥍟𥍠𪿆矝𥍡-𥍦𭿷𭿸䂈𥍧-𥍩𭿹𭿺矞矟𥍪-𥍱𪿇矠𠍢𥍲-𥍵𬑮䂉𥍶-𥎁𬑯𥎂-𥎉𭿻𥎊-𥎍𭿼䂊-䂌𥎏-𥎒𥎎𥎓-𥎜䂍𥎞-𥎠𥎝𥎡-𥎣䂎矡𥎤𥎥] +[radical 111=⽮矢:矢矣𥎦𥎧𭿽矤知𥎨矦-矨𥎩-𥎯𪿈𪿉𭿾𭿿矩䂏䂐𥎰-𥎸𬑰𬑱𮀀矪矫䂑䂒𥎹-𥏍𪿊𮀁𮀂矬短䂓𠅰𥏎-𥏗𬑲𬑳矮䂔𥏘-𥏩𪿋𬑴𮀃𮀄䂕𥏪-𥏱𪿌𮀅𥏲-𥏺𪿍𪿎𮀆-𮀈𥏻-𥏿𮀉矯矰𥐀-𥐆𬑵𥐇-𥐋𬑶矱𥐌-𥐏𬑷矲𪿏𮀊𪿐𬑸𥐑𥐒𥐐𥐓𥐔] +[radical 112=⽯石:石䂖𥐕𥐖矴-矶䂗𥐗-𥐜𬑹矷-码䂘䂙𥐝-𥐨𬑺-𬑼𮀋𮀌泵砂-砜䂚-䂞𥐩-𥑅𪿑-𪿓𬑽-𬒂𮀍𮀎砝-硁䂟-䂨𥑆-𥑲𪿔-𪿘𬒃-𬒈𮀏-𮀔硂-硛鿎䂩-䂯𥑳-𥒩𪿙-𪿝𬒉-𬒌𮀕-𮀘硜-硷䂰-䂶𥒪-𥓉𪿞-𪿣𬒍-𬒑𮀙-𮀡硸-硽硿-碜碰䂷-䃇𥓊-𥓹𪿤-𪿩𬒒-𬒕𮀢-𮀫硾碝-碯碱-碹磁䃈-䃐𥓺-𥔬𪿪𪿫𬒖-𬒚𮀬-𮀵確-磀磂-磙磜磤䃑-䃗𥔭-𥕋𪿬-𪿮𬒛𮀶-𮀺磚磛磝-磣磥-磮䃘-䃞䃠𥕌-𥕯𪿯-𪿴𬒜-𬒞𮀻-𮁃磯-礅䃟䃡-䃨𥕰-𥖖𪿵-𪿷𬒟-𬒣𮁄-𮁉礆-礖䃩-䃯𣞏𥖗-𥖩𪿸-𪿺𬒤𬒥𮁊-𮁏礗-礡䃰𥖪-𥖺𪿻-𪿽𬒦𬒧𮁐-𮁓礢-礬䃱-䃳𡕎𥖻-𥗑𬒨𮁔礭-礴䃴-䃷𥗒-𥗜𪿾𮁕礵䃸䃹𥗝-𥗪𬒩𬒪礶礷𥗫-𥗳𪿿𮁖-𮁘礸䃺𥗴𥗵𥗷𥗸𬒫𮁙𮁚礹𥗹䃻𥗺-𥗽𮁛𥗾-𥘄] +[radical 113=⽰示:示礻𥘅礼𥘆礽䃼𥘇-𥘌𮁜𮁝社-祃𥘍-𥘔𫀀𫀁𬒬𮁞祄-祎视鿆䃽-䄀𥘕-𥘪𫀂𫀃𬒭-𬒰𮁟-𮁡祏-祢䄁-䄃𥘫-𥙍𫀄-𫀆𬒱-𬒳𮁢-𮁬祣-祥祧-祯䄄-䄆𥙎-𥙪𫀇-𫀊𫞴𬒴𬒵𮁭-𮁷祦祰-祸禄視䄇-䄊𣂫𥙫-𥚇𫀋-𫀏𫞵𬒶-𬒽𮁸-𮁾祹-禃禅禆䄋-䄒𥚈-𥚥𫀐-𫀙𬒾-𬓈𮁿-𮂃禇-禙䄓-䄗𢿆𥚦-𥛄𫀚𫀛𬓉-𬓍𮂄-𮂉禚-禣䄘䄙𠖟𥛅-𥛗𫀜-𫀟𬓎-𬓐𮂊-𮂎禤-禦䄚-䄞𥛘-𥛭𫀠𫀡𬓑-𬓗𮂏-𮂖禧-禫䄟𥛮-𥜂𫞶𬓘-𬓚𮂗-𮂛禬-禯鿅䄠䄡𥜃-𥜑𫀢𬓛𮂜𮂝禰禱䄢𥜒-𥜙𫀣𬓜𮂞𮂟禲䄣𥜚-𥜟𮂠-𮂢䄤𥜠-𥜤禳禴𥜥-𥜩𬓝𮂣-𮂧禵𥜪-𥜯𮂨禶禷𥜰-𥜳𮂩-𮂫𥜴𥜵𫀤𥜶-𥜸𧆆𥜹𥜺䄥] +[radical 114=⽱禸:禸𥜻禹禺𥜼离𥜽禼𥜾𮂬禽萬𥜿𥝁-𥝃𠎘𠾧𥝄-𥝇𦦔𬓞𣜢𥝈𥝉𫀥𮂭𥝊𬓟𮂮𥝋] +[radical 115=⽲禾:禾𥝌-𥝏𫀦禿-秃䄦䄧𥝐-𥝓𬓠𮂯秄-秊䄨-䄭𥝔-𥝢𫀧𮂰秋-秗䄮-䄵𥝣-𥝽𫀨𫀩𬓡-𬓤𮂱-𮂹秘-称䄶-䄹𥝾-𥞗𫀪-𫀭𬓥𬓦𮂺-𮃀秱-秾稆䄺-䅊𥞘-𥞱𥟅𫀮-𫀱𫞷𬓧-𬓩𮃁-𮃄秿-稅稇-税鿟䅋-䅓𠞜𥞲-𥟄𥟆-𥟌𫀲-𫀸𬓪-𬓬𮃅𮃆稏-稥䅔-䅟𥟍-𥟼𫀹-𫀻𫞸𬓭-𬓰𮃇-𮃒稦-稳穊䅠-䅫𥟽-𥠰𫀼-𫁀𬓱-𬓴𮃓-𮃚稴-穃䅬-䅶𥠱-𥡛𫁁-𫁄𬓵-𬓹𮃛-𮃢穄-穈穋-穒䅷-䅽𥡜-𥢉𫁅𬓺-𬓽𮃣-𮃫穉穓-穞䅾-䆀𥢊-𥢳𫁆𬓾-𬔀𮃬-𮃱穟-穣䆁-䆇𥢴-𥣉𥣋-𥣔𫁇𫁈𬔁𮃲穤-穫𥣊𥣕-𥣡𥣣-𥣧𬔂𮃳穬-穯䆈䆉𥣢𥣨-𥣶𥣸-𥣿𫁉𬔃鿠䆊-䆍𥤀-𥤅𬔄𮃴𮃵穰穳䆎䆏𥤆-𥤉穱𥤊-𥤒穲𥤓𥤕𥤖𮃶𮃷𥤗-𥤟䆐𥤠𥤡] +[radical 116=⽳穴:穴𥤢穵-穷䆑𥤣-𥤦𫞹𬔅穸-穻䆒𥤧-𥤳𮃸穼-窃䆓-䆖𥤴-𥥆𫁊𬔆𬔇𮃹窄-窎䆗-䆙𥥇-𥥟𫁋𬔈𮃺𮃻窏-窕䆚-䆠𥥠-𥥵𫁌𫁍𬔉𬔊𮃼窖-窝䆡-䆥𥥶-𥦚𫁎-𫁐𬔋𬔌𮃽-𮄀窞-窧䆦-䆩𥦛-𥦷𫁑-𫁓𬔍𮄁-𮄇窨-窭䆪䆫𥦸-𥧏𫁔𫁕𮄈-𮄋窮-窴䆬-䆮𥧐-𥧡𥧣-𥧫𫁖𬔎𬔏𮄌-𮄎窵-窽䆯-䆴𥧬-𥧻𥧽-𥨋𫁗-𫁚𬔐-𬔓𮄏-𮄕窾-竃䆵-䆻𥧼𥨌-𥨟𥨩𫁛𮄖-𮄚竄竅䆼䆽𥨠-𥨨𫁜𬔔𮄛-𮄝竆䆾䆿𥨪-𥨯𥨲𮄞-𮄡竇䇀𥨰𥨱𥨳𥨴𥨶-𥨺竈竉𥨵𥨻-𥩈𬔕𮄢竊䇁𥩉𫞺𮄣𥩊𥩋𫁝𮄤𮄥𥩌𥩍𥩏-𥩑𮄦𥩎𥩒-𥩔] +[radical 117=⽴立:立䇂𬔖竌竍𥩕𥩖𫞻竎竏䇃䇄𥩗𥩘𫁞𬔗𮄧竐-竗䇅䇆𥩙-𥩟𫁟𬔘-𬔚𮄨竘-竞䇇-䇊𥩠-𥩰𫁠𫁡𬔛𬔜𮄩-𮄬竡䇋𥩱-𥩽𫁢𫞼𬔝𮄭𮄮竢-竧䇌䇍𥩾-𥪉𫁣𫁤𬔞-𬔠𮄯𮄰竨-竫䇎-䇑𥪊-𥪗𫁥𫁦𬔡-𬔣𮄱-𮄳竬竭端竰𥪘-𥪤𫁧𫁨𬔤-𬔦𮄴-𮄶𥪥-𥪬𫁩-𫁫𬔧𮄷竮竱䇒𥪭𥪮𥪰𥪱𫁬𬔨𬔩𮄸-𮄺竲-竴䇓𥪯𥪲-𥪹𥪻𫁭𬔪𮄻𮄼竵䇔𥪼-𥫁𥫃𥫄䇕𥪺𥫅-𥫇𫁮𮄽競竷𥫈-𥫍𮄾𥫎𥫏𬔫竸𥫐𥫑𫁯𥫓𥫔𥫒𥫕𥫖𮄿] +[radical 118=⽵竹:竹𥫗𥫘竺竻𥫙-𥫜𫁰𬔬竼-笃䇖𥫝-𥫮𫁱𬔭笅-笕䇗-䇝𥫯-𥬋𫁲-𫁷𬔮-𬔲𮅀-𮅃笖-笾䇞-䇦𥬌-𥬩𥬿𫁸-𫁻𬔳-𬔹𮅄-𮅆笄笿-筝䇧-䇴𥬪-𥬾𥭀-𥭏𫁼𫁽𬔺-𬕁𮅇-𮅐筞-简節䇵-䈀𥭐-𥮇𥮉-𥮌𫁾-𫂃𬕂-𬕍𮅑-𮅔箁-箫䈁-䈍𥮈𥮍-𥯐𫂄-𫂉𬕎-𬕙𮅕-𮅠箬-箿篁-篈篊-篓䈎-䈩𥯑-𥰗𫂊-𫂏𫞽-𫞿𬕚-𬕡𮅡-𮅮築篔-篯簑簕䈪-䈷𥰘-𥱴𫂐-𫂗𬕢-𬕨𮅯-𮅵篰-簐簒-簔簖簗䈸-䉇𥱵-𥳀𥳂-𥳅𥴎𫂘-𫂟𬕩-𬕬𮅶-𮆆簘-簲䉈-䉎䉐-䉚䉣𥳁𥳆-𥴍𥴏-𥴠𫂠-𫂤𬕭-𬕲𮆇-𮆓簳-籂䉏䉛-䉢䉤𥴡-𥵛𫂥𫂦𬕳-𬕺𮆔-𮆞籃-籏籕籖䉥𥵜-𥶄𫂧𮆟-𮆧籐-籔䉦-䉭𥶅-𥶴𫂨-𫂫𬕻-𬕿𮆨-𮆵籗-籡䉮-䉱𥶵-𥷓𫂬𬖀-𬖅𮆶-𮆽籢-籨䉲-䉴𥷔-𥷧𫂭𬖆籪䉶𥷨-𥷻𫂮𬖇籩籫-籮𥷼-𥸇𫂯𮆾𮆿籯籰䉷𥸈-𥸏𮇀䉸𥸐-𥸖𬖈-𬖊𮇁𥸗𥸚-𥸝𫂰𥸘𥸙𥸞-𥸠𮇂籱䉹𥸡-𥸣籲𥸤] +[radical 119=⽶米:米𥸥𥸦𬖋籴-籶𥸧-𥸪𫂱𫂲𬖌-𬖎𮇃𮇄娄籷-粂䉺𥸫-𥸲𫂳𫂴𬖏𮇅粃-粑䉻䉼𥸳-𥹀𫂵-𫂷𬖐-𬖒𮇆-𮇊畨粒-粝粣䉽-䊀𥹁-𥹖𥹘𥹙𥹱𫂸-𫂼𬖓-𬖘𮇋-𮇒粞-粢粤-粭䊁-䊆𥹗𥹚-𥹰𫂽-𫃀𬖙-𬖜𮇓-𮇝粮-粵糀䊇-䊌𥹲-𥺗𫃁𬖝-𬖠𮇞-𮇤粶-粿糁䊍-䊒𥺘-𥻀𫃂-𫃅𬖡-𬖥𮇥-𮇫糂-糎䊓-䊙𡢏𥻁-𥻣𫃆-𫃈𬖦-𬖪𮇬-𮇲糏-糘䊚䊛䨀𢐫𥻤-𥻾𫃉-𫃌𬖫-𬖲𮇳-𮇹糙-糢糨䊜-䊢𥻿-𥼖𫃍𫃎𫟀𬖳-𬖵𮇺糣-糧䊣-䊩𥼗-𥼵𫃏-𫃑𬖶-𬖺𮇻𮇼糩-糭䊪-䊬𥼶-𥽎𫃒-𫃕𬖻𮇽𮇾糮-糰䊭䊮𥽏-𥽖𫃖𬖼-𬖾糲䊯𥽗-𥽠𥽢𥽣𬖿𮇿糱糳糴䊰𥽡𥽤-𥽫𫃗-𫃙𬗀𬗁糵䊱䊲𥽬-𥽵𬗂糶䊳䊴𥽶-𥽺𮈀𥽻-𥽿糷𥾀-𥾄] +[radical 120=⽷糸:糸-糿䊵𥾅-𥾋𫃚𫃛紀-紉䊶-䊹𥾌-𥾘𫃜𫃝𬗃𬗄𮈁𮈂紊-紧䊺-䋇𥾙-𥿂𫃞𬗅𬗆𮈃-𮈅紨-経䋈-䋔𥿃-𥿥𫃟-𫃡𬗇-𬗊𮈆-𮈊絍-絚絜-絷䋕-䋞𥿦-𦀑𫃢-𫃤𬗋-𬗔𮈋-𮈐絛絸-綛緐䋟-䋦𦀒-𦁅𫃥-𫃩𬗕-𬗞𮈑-𮈕綜-総緑緒緔緕䋧-䋲𦁆-𦁿𫃪-𫃲𬗟-𬗧𮈖-𮈢緓緖-縇䋳-䌄𦂀-𦂦𦂨-𦃁𫃳-𫃷𫟁𬗨-𬗮𮈣-𮈰縈-縨䌅-䌋𦂧𦃂-𦄁𦄃-𦄈𫃸-𫃼𬗯-𬗲𮈱-𮈸縩-繇繉繊繌繍䌌-䌕𦄂𦄉-𦄻𫃽-𫄀𬗳-𬗺𮈹-𮉃繈繎-繥繧繱䌖-䌛𦄼-𦅴𫄁-𫄄𫟂𬗻-𬘁𮉄-𮉉繋繦繨-繰繲-繺䌜-䌢𦅵-𦆛𦆥𫄅-𫄋𬘂𮉊-𮉏繻-纃䌣-䌧𦆜-𦆣𦆦𦆧𦆩𦆪𦆬-𦆺𫄌-𫄎𬘃-𬘈𮉐-𮉒纄-纐䌨䌩𦆤𦆨𦆫𦆻-𦇁𦇃-𦇓𫄏-𫄑𬘉-𬘌𮉓-𮉖纑纒䌪-䌭𦇂𦇔-𦇦𫄒-𫄔𬘍-𬘏𮉗-𮉙纓-纖䌮𦇧-𦇯𫄕𬘐𬘑𮉚纗䌯-䌲𦇰-𦇷𦇹𬘒𮉛𮉜纘-纛䌳䌴𦇸𦇺𦇻𫄖𮉝𮉞𦇼𦇽𫄗纜纝䌵𦇾-𦈂𫄘𮉟𦈃𦈄纞𦈅-𦈇] +[radical 120'=⺰纟:纟𫄙纠𮉠纡-纫纶䌶𬘓纬-纵纷-纾䌸𫄚-𫄝𬘔-𬘘线-绐䌷䌹𦈈𫄞𫄟𬘙-𬘞𮉡-𮉣绑-统䌺䌻𦈉𫄠-𫄣𫟃𬘟-𬘧𮉤-𮉦绠-绨䌼𦈊-𦈌𫄤-𫄩𫟄𬘨-𬘫𮉧-𮉩绩-缁䌽𦈍-𦈐𫄪𫄫𫟅𬘬-𬘯𮉪-𮉬缂-缘䌾䌿𦈑-𦈕𫄬-𫄮𫟆𬘰-𬘸𮉭缙-缤䍀𦈖-𦈙𫄯𫄰𬘹-𬘽缥-缫𦈚𫄱-𫄴𬘾-𬙂𮉮𮉯缬-缯𦈛-𦈝𫄵𫄶𬙃-𬙈缰-缴䍁𦈞𦈟𫄷𬙉𦈠𦈡𫄸𫟇𬙊缵𬙋𫄹] +[radical 121=⽸缶:缶𦈢缷缸䍂𦈣-𦈥𮉰缹缺缼䍃𦈦-𦈨𬙌𬙍𮉱缻缽䍄-䍉𦈩-𦈮𬙎𮉲缾-罀䍊𦈯-𦈳𬙏𦈴-𦈷𫄺𮉳𮉴罁罂䍋䍌𦈸-𦉀𫄻𬙐𮉵𦉁-𦉇𫄼𫄽𬙑𬙒𮉶罃䍍𦉈-𦉎𫄾𬙓𮉷罄-罆𦉏-𦉔𮉸罇-罉𦉕-𦉘𮉹-𮉻罊罋𤕁𦉙-𦉜𫄿𬙔罌𦉝𦉞罍𦉟𦉠罎罏𦉡䍎𦉢-𦉤罐𤫡𦉥-𦉩] +[radical 122=⽹网:网-罓䍏𦉪𦉫𦉭𦉰𦉯𮉼𦉬𦉮𦉱-𦉶𬙕罔-罗䍐䍑𦉷-𦊀𫅀𬙖-𬙘𮉽罘-罚䍒-䍔𦊁-𦊍𫅁𬙙𮉾-𮊀罛-罢䍕-䍗𦊎-𦊣𦊥-𦊩𦊳𫅂𬙚-𬙜𮊁-𮊄罣䍘𦊪-𦊲𦊴-𦊻𫅃-𫅅𬙝𮊅罤-罦䍙䍚𦊼-𦋄𦋑𬙞𬙟𮊆罧-置署䍛-䍞𦋅-𦋐𦋒-𦋜𫅆𫅇𬙠-𬙣𮊇-𮊉罯-罱罳罴䍟𦋝-𦋩𦋫-𦋮𫅈𮊊-𮊌罵-罸𦋯-𦋼𫅉𬙤-𬙦𮊍-𮊓罹-罼䍠䍡𦋽-𦌑𫅊𮊔-𮊙罽-羁䍢𦌒-𦌞𧷅𬙧𬙨𮊚𮊛羂䍣𦌟-𦌨𧐰𫅋𬙩𮊜羃-羆䍤𦌪-𦌴𫅌𮊝𮊞𦌵-𦌺䍥𦌻𦌼𫅍𬙪𮊟羇𦌽𬙫𮊠羈羉䍦𦌾-𦍅𮊡𦍆-𦍊鿡] +[radical 123=⽺羊:羊𦍋-𦍍羋羌𦍎-𦍐𫅎羍-羑𦍑-𦍖𫟈𬙬𮊢-𮊤羒-羔羖-羙䍧-䍩𦍗-𦍤𦍮𬙭-𬙯羕羚-羟䍪-䍭𦍥-𦍭𦍯-𦍸𫅏-𫅒𬙰𮊥𮊦羠-羢䍮-䍰𦍹-𦎄𫅓𫅔𬙱-𬙳𮊧𮊨羣-羪䍱𦎆-𦎖𫅕𬙴𮊩羫䍲-䍶𦎗-𦎡𬙵𬙶𮊪-𮊭羬-羰䍷𦎢-𦎮𫅖-𫅘𬙷𬙸𮊮𮊯羱羲䍸䍹𦎯-𦎶𫅙𬙹-𬙻𮊰-𮊲䍺𦎷-𦏄𫅚-𫅜𬙼𬙽羳-羵䍻䍼𦌩𦏅-𦏔𫅝𫅞𬙾𮊳羶-羹𦏕-𦏛𬙿𮊴羺𦏜-𦏡𫅟羻羼𡅖𦏢-𦏧𬚀𮊵𮊶䍽𦏨𦏩𫅠𫅡𬚁𮊷𦏪-𦏮𬚂𣌞𦏯-𦏱] +[radical 124=⽻羽:羽𦏳𦏲羾羿𦏴-𦐁𫅢翀-翆䍾䍿𦐂-𦐔𫅣𮊸-𮊻翇-習䎀-䎆𦐕-𦐢𫅤𮊼翓-翚䎇-䎊𦐣-𦐷𫅥-𫅧𮊽-𮋂翛-翝䎋-䎎𦐸-𦑄𦑆𫅨𫅩𬚃𮋃𮋄翞-翤䎏-䎓𦑅𦑇-𦑐𦑒-𦑗𫅪𬚄𮋅-𮋈翥-翭𦑘-𦑯𦑻𫅫𫅬𮋉-𮋌翮-翱䎔䎕𦑰-𦑺𦑼-𦒂𦒞𫅭𫅮𬚅𬚆𮋍-𮋑翲-翶翼𦒃-𦒌𫅯𬚇𬚈𮋒𮋓翷-翻䎖-䎘𦒍-𦒛𦒟𫅰𫅱翽翾𦒜𦒝𦒠𦒡𮋔𮋕翿耀䎙𦒢-𦒥𦒪𦒫𮋖𮋗䎚𦒦𦒨𦒩𦒬𮋘𮋙𦒧𦒭-𦒯𫅲𦒰𮋚] +[radical 125=⽼老:老-考𦒱𦒲𬚉𬚊䎛𦒳-𦒵耄-耆𦒶-𦒹耇-耉𦒺-𦒿𫅳𫅴𬚋𮋛耊耋䎜-䎞𦓀𮋜𮋝𦓁𫅵𬚌𮋞𦓂𫅶𦓄𦓅𫅷𦓆𦓇𦓃𦓈𦓉𬚍𦓊𫅸𬚎𦓋-𦓍] +[radical 126=⽽而:而𦓐𦓎𦓏𦓑耍-耑䎟-䎡𦓒-𦓗𮋟𦓘-𦓜𬚏𦓝𦓞𮋠𮋡𦓟-𦓢𮋢𦓣] +[radical 127=⽾耒:耒𦓤耓𦓥-𦓧𮋣耔䎢𦓨-𦓪耕-耙𦓫𮋤耚-耟䎣𦓬-𦓮𫅹𮋥-𮋧耠𦓯-𦓳𫅺𫅻𬚐𮋨𮋩耡耢䎤䎥𦓴-𦓶𫅼𮋪耣-耥䎦-䎪𦓷-𦔁耦耧䎫䎬𦔂-𦔊𫅽耨-耪𦔋-𦔒𫅾耫耬䎭-䎯𦔓-𦔚耭耮䎰𦔛-𦔞𦔠-𦔤𫅿𮋫𦔟𦔥-𦔨𬚑耯耰䎱𦔩𦔪耱耲𦔫-𦔭] +[radical 128=⽿耳:耳耴䎲𦔮耵𦔯-𦔶𫆀𫟉耶耷𦔷-𦔻𬚒𬚓𮋬𮋭耸-聂䎳䎴𦔼-𦕏𫆁𮋮聃-聍䎵䎶𦕐-𦕟𬚔-𬚖𮋯聎-联聠䎷𦕠-𦕢𦕤-𦕴𫆂𫆃𬚗-𬚙聕-聘䎸䎹𦕣𦕵-𦖇𦖗𫆄-𫆆𬚚-𬚝𮋰-𮋲聙-聟聡-聣鿢䎺-䎾𦖈-𦖖𦖘-𦖡𫆇𫆈𬚞-𬚠𮋳-𮋵聤-聫鿣䎿䏀𥧢𦖢-𦖻𦗇𫆉𬚡𬚢𮋶-𮋸聬聭䏁-䏃𦖼-𦗆𦗈-𦗏𫆊-𫆍𬚣-𬚥𮋹聯-聳䏄-䏇𦗐-𦗞𫆎𫆏𮋺聮聴-職鿤䏈𦗟-𦗲𫆐𫆑𬚦𬚧𮋻聸𦗳-𦗽𫆒聹-聼䏉𦗾-𦘄𬚨𮋼𮋽𦘅-𦘉𮋾𮋿聽聾䏊𦘊-𦘏𮌀𦘐𦘑𫆓𬚩] +[radical 129=⾀聿:聿肀𦘒𮌁𦘓𬚪𮌂𦘔𮌃肁-肃𦘕-𦘚肄-肆䏋𦘛𦘜𫆔𬚫𮌄肇肈𦘝-𦘟𫆕𦘠-𦘢𬚬𮌅𮌆𦘣𬚭𬚮𦘤-𦘨] +[radical 130=⾁肉:肉𮌇肊-肏䏌䏍𦘩-𦘳肐-肠䏎䏏𦘴-𦘾𬚯𮌈-𮌊股-胁䏐-䏝𦘿-𦙩𫆖-𫆘𬚰-𬚳𮌋胂-胬脉䏞-䏥𡋜𣍨𦙪-𦚜𫆙-𫆜𬚴-𬚶𮌌-𮌏胭-脈脊-脔䏦-䏮𣍯𣍰𦚝-𦛓𫆝𫆞𬚷-𬚺𮌐-𮌓脕-脸䏯-䏻𦛔-𦜅𫆟-𫆡𬚻-𬛁𮌔-𮌙脹-腚㬹䏼-䐌𦜆-𦜲𦜴-𦝙𫆢-𫆥𬛂-𬛇𮌚-𮌠幐腛-腾䐍-䐛𦝚-𦞘𦟓𦟔𫆦-𫆨𬛈-𬛋𮌡-𮌥腿-膑䐜-䐪𦞙-𦟒𦟕-𦟗𫆩-𫆮𫟊𬛌-𬛎𮌦-𮌰膒-膣䐫-䐴𦟘-𦠂𫆯-𫆴𬛏-𬛓𮌱-𮌹膥-膶䐵-䐽𦠃-𦠽𦡄𦡮𫆵-𫆸𬛔-𬛘𮌺-𮌿膷-臌䐾-䑁𦠾-𦡃𦡅-𦡍𦡏-𦡕𦡘-𦡭𦡯𫆹-𫆻𬛙-𬛛𮍀𮍁臍-臓䑂-䑅𤑃𦡎𦡰-𦢉𫆼𫆽𬛜𬛝𮍂-𮍆臔臕臗臘䑆-䑈𦢊-𦢤𫆾𫆿𮍇-𮍉臖臙-臜䑉䑊𦢥-𦢷𫇀𬛞𮍊臝㔮䑋-䑎𦢸-𦢾𫇁𬛟臞臟䑏𦢿-𦣅𫇂臠-臢𤓏𦣆-𦣐𫇃𬛠𦣑-𦣕𬛡𮍋𦣖-𦣜𫇄] +[radical 131=⾂臣:臣𦣞𮍌𦣝臤臥𮍍𦣟-𦣣𫇅𬛢𬛣䑐𦣤𦣥𬛤𮍎𮍏臦𦣦-𦣩𫇆𬛥𫇇𬛦臧𦣫𦣬𦣮𫇈𮍐-𮍒𦣭𦣯𬛧𬛨𦣪𮍓臨臩𦣰𦣱𬛩䑑𦣲𦣳𫇉𦣴𦣵𬛪𦣶𬛫𦣷𦣸] +[radical 132=⾃自:自𦣹臫𦣺-𦤀臬臭𦤁-𦤋𮍔𮍕𦤌-𦤏𬛬𮍖-𮍘臮-臰𦤐-𦤓𫇊𮍙𦤔𮍚𮍛𦤕-𦤗𬛭𮍜臱𦤘-𦤝𫇋臲𦤞-𦤤𬛮𦤥𫇌𦤦-𦤪𬛯𦤫-𦤮𬛰𮍝𮍞𦤯-𦤱𮍟𦤲𫇍] +[radical 133=⾄至:至𦤳-𦤵𬛱致䑒𦤶-𦤺𬛲𮍠𮍡𦤻-𦤾臵-臸𦤿𦥀𬛳𮍢臹䑓𦥁𫇎臺𦥂-𦥄𫇏𫇐𮍣𦥅-𦥇臻𦥉-𦥍𬛴𬛵𦥎-𦥐𫇑𬛶𮍤𬛷] +[radical 134=⾅臼:臼𦥑-𦥔臽臾𦥕𦥖𦥙𮍥臿𦥗𦥘𦥚-𦥜𦥧𬛸𬛹舀舁䑔𦥝-𦥤𮍦𮍧舂䑕𦥥𦥦𦥨-𦥬舃舄𦥭-𦥲𫟋𮍨-𮍬舅𦥳-𦥺𬛺𮍭𮍮與䑖𦥻-𦦄𮍯興䑗𦦅-𦦎𬛻𮍰𮍱舆舉䑘𦦏-𦦓𦦕-𦦗𬛼𦦘-𦦠𬛽舊𦦡-𦦧𫇒𬛾舋𠤫𦦩-𦦬𦦯𬛿𬜀𦦭𦦮𦦰-𦦻𬜁𤓟𦦼𬜂𦦽-𦦿𮍲𦧀𫇓𬜃𦧁𦧂𮍳𬜄𦧃-𦧅𠔻] +[radical 135=⾆舌:舌𦧆舍-舏𫇔𦧇𮍴𮍵舐䑙䑚𦧈-𦧐舑䑛𦧑-𦧔𬜅𬜆𮍶𮍷舒𦧕-𦧞𫇕𫇖𬜇𮍸舓-舕𦧟-𦧦𬜈𮍹舖舗䑜𦧧-𦧬𬜉-𬜌𮍺-𮍾舘𦧭-𦧰𫇗𮍿𦧱-𦧳𬜍舙𦧴-𦧶𬜎舚𦧷𫇘𬜏𬜐𦧸-𦧺𫇙𦧻𦧼𮎀𦧽] +[radical 136=⾇舛:舛𮎁舜-舞䑝𦧾𦧿䑞𦨀𦨁䑟𦨃𦨂𦨄𦨅𮎂𦨆] +[radical 137=⾈舟:舟𠂨𦨇舠䑠𦨈-𦨍𬜑舡-舤䑡-䑣𦨎-𦨔𫇚𬜒舥-舱䑤䑥𦨕-𦨠𮎃𮎄舲-舻䑦-䑩𦨡-𦨮𮎅-𮎊舼-舿䑪-䑮𦨯-𦨲𦨴-𦨼𬜓𮎋𮎌艀-艉䑯䑰𦨳𦨽-𦩉𬜔𮎍-𮎑艊-艍䑱-䑸𦩊-𦩜𨦞𫇛𬜕𬜖𮎒𮎓艎-艔䑹-䑻𦩝-𦩳𦩿𫇜𫇝𬜗艕-艙䑼-䑾𦩴-𦩾𦪀-𦪅𬜘-𬜚艚-艝䑿-䒅𦪆-𦪐𫇞𬜛𮎔艞-艠䒆-䒈𦪑-𦪧𫇟艡-艥𦪨-𦪰艦-艩䒉𦪱-𦪵𫇠艪𦪶-𦪸𦪺-𦪼𬜜𮎕艫𦪽-𦫂𫇡-𫇣𮎖𮎗艬𦫃𦫄艭𦫅-𦫇𦫉𦫈𦫊] +[radical 138=⾉艮:艮-艰𦫋-𦫏𮎘𮎙𦫐艱𦫑𮎚𦫒鿥] +[radical 139=⾊色:色𮎛𮎜䒊𦫓艳艴䒋𦫔-𦫚𬜝𦫛-𦫝艵𦫞-𦫣𬜞𦫤-𦫩𮎝䒌䒍𦫪-𦫮𫇤䒎䒏艶𦫯-𦫱𮎞䒐艷𦫲𬜟] +[radical 140=⾋艸:艸艹䒑艺龷𦫳-𦫵艻-节䒒-䒔𦫶-𦬀𫇥𫇦𬜠芃-芗䒕-䒙𦬁-𦬒𫇧𫇨𬜡𬜢芘-芾苀-苏茾䒚-䒥𦬓-𦬶𫇩-𫇭𬜣-𬜥𮎟-𮎣芿苐-茑茓-茕䒦-䒯𦬷-𦭬𫇮-𫇵𫟌𫟍𬜦𬜧𮎤-𮎦茒茖-茜茞-茢茤-茽茿-荒荔-药鿒䒰-䓁𦭭-𦮵𫇶-𫇾𫟎𬜨-𬜮𮎧-𮎸茝茣荰-莬莮-莽鿊䓂-䓔䓖𦮶-𦯰𦯲-𦰕𦰗-𦰩𫇿-𫈏𫟏-𫟑𬜯-𬜺𮎹-𮏏荓莾-萨著龿䓕䓗-䓭𦯱𦰖𦰪-𦳀𫈐-𫈠𬜻-𬝋𮏐-𮏢莭萩-萫萭-葖葘-蒏鿓䓮-䓻𦳁-𦴵𦴷-𦵆𦵈-𦵠𫈡-𫈵𫟒𫟓𬝌-𬝙𮏣-𮐂蒐-蒷蒹-蓤蓦䓼-䔍𤎀𦵇𦵡-𦷾𫈶-𫉇𫟔𬝚-𬝴𮐃-𮐠蓥蓧-蔼䔎-䔬𦷿-𦸼𦸾-𦺄𫉈-𫉜𫟕𬝵-𬞍𮐡-𮐸蔽-蕵䔭-䕄𦸽𦺆-𦻆𦻈-𦻽𦻿-𦼨𦽭𫉝-𫉤𫟖𬞎-𬞙𮐹-𮑙蕶-薨薪-薬薮龩﨟䕅-䕑𦻾𦼩-𦽬𦽮-𦾩𦿡𦿸𫉥-𫉴𬞚-𬞬𮑚-𮑻薩薭薯-藓蘤䕒-䕝𦾪-𦿓𦿖-𦿜𦿞-𦿠𦿢-𦿷𦿹-𧀟𫉵-𫊄𬞭-𬞾𮑼-𮒖藔-藭藯-藵䕞-䕥𦿔𦿕𦿝𧀠-𧁺𧃌𫊅-𫊋𬞿-𬟍𮒗-𮒨藮藶-蘑蘓蘔蘢䕦-䕲𧁻-𧃋𧃎𫊌-𫊏𬟎-𬟕𮒩-𮒷蘒蘕-蘡蘣蘥-蘰䕳-䕷𧃍𧃏-𧄌𫊐-𫊓𬟖-𬟛𮒸-𮓃蘲-蘷鿀鿦䕸-䕺𧄍-𧄵𫊔-𫊖𬟜-𬟟𮓄-𮓍蘱蘸-虁䕻-䕽𧄶-𧅕𫊗𬟠-𬟤𮓎-𮓒虂-虅䕾𧅖-𧅭𫊘-𫊚𬟥𮓓虆-虉䕿䖀𧅮-𧅴𧅶-𧅹𬟦𮓔𮓕䖁𧅺-𧆅𫊛𫊜𮓖虊䖂-䖄𧆇-𧆎䖅䖆𧅵𧆏-𧆒虋虌𧆔𧆕𦺅𧆖𧆚𧆗䖇𧆙𧆓𧆘] +[radical 141=⾌虍:虍𮓗虎虏䖈𧆛𮓘-𮓚彪虐䖉𧆜-𧆞𫊝𫊞𬟧𮓛𮓜虑虓虔䖊-䖍𧆟-𧆢𫊟𬟨𬟩𮓝-𮓠處-虚䖎䖏𧆣-𧆰𮓡虛-虝䖐䖑𧆱-𧆹𫊠𫊡𬟪𮓢-𮓤虞號䖒-䖖𧆺-𧇀𬟫-𬟭𮓥𮓦虠虡𧇁-𧇎𫊢虢虣䖗𧇏-𧇛𮓧𮓨虤-虦䖘𧇜-𧇰𬟮-𬟰𮓩𮓪虧虨䖙𧇱-𧇺𫊣𮓫𮓬虩䖚䖛𧇻-𧈁𧈃𧈄𬟱𮓭䖜𧈂𧈅-𧈊𬟲𮓮𧈋-𧈏𮓯𧈑-𧈛𬟳虪𧈜] +[radical 142=⾍虫:虫𮓰虬䖝𧈝𧈞𮓱虭-虲𧈟-𧈧𫊤𮓲虳-蚃䖞-䖠𡯥𧈨-𧈺𫊥𫊦𬟴𬟵𮓳-𮓷蚄-蚇蚉-蚪蚬䖡-䖣𧈻-𧉝𫊧-𫊫𬟶-𬟻𮓸-𮓼蚫蚭-蛏﨡䖤-䖬𧉞-𧊎𫊬-𫊲𬟼-𬠁𮓽-𮔀蚈蛐-蛕蛗-蛴䖭-䖵𧊏-𧊪𧊬𧊭𧊯-𧋇𫊳-𫊼𬠂-𬠇𮔁-𮔈蛖蛵-蜗蜫蝆䖶-䖾𧊫𧊮𧋈-𧋝𧋟-𧌂𧌞𫊽-𫋁𬠈-𬠍𮔉-𮔖蜘-蜪蜬-蝅蝇-蝋䖿-䗊䗕𧋞𧌃-𧌝𧌟-𧌯𧌱-𧍑𫋂-𫋉𬠎-𬠚𮔗-𮔝蝌-蝸蝺-螀蟡䗋-䗔䗖𧌰𧍒-𧎠𧏇𫋊-𫋎𬠛-𬠞𮔞-𮔧蝹螁-螩蟗䗗-䗞𧎡-𧏆𧏈-𧏷𫋏-𫋕𬠟-𬠤𮔨-𮔲螪-蟒蠁䗟-䗮𢋜𧏸-𧐯𧐱-𧑃𫋖-𫋙𬠥-𬠨𮔳-𮔺蟓-蟖蟘-蟠蟢-蟵蠎䗯-䗳𧑄-𧒍𫋚-𫋞𬠩-𬠮𮔻-𮕁蟶-蠀蠂-蠍蠏䗴-䗻𧒎-𧓈𫋟-𫋢𬠯-𬠱𮕂-𮕇蠐-蠙䗼-䘁𧓉-𧓰𫋣-𫋥𫟗𬠲-𬠷𮕈-𮕋蠚-蠤蠴䘂-䘄𧓱-𧔜𫋦𫋧𬠸𮕌-𮕑蠥-蠬䘅-䘉𧔝-𧕂𫋨𬠹𮕒蠭-蠳䘊-䘌𧕃-𧕒𧕔-𧕚𬠺𮕓-𮕖蠵-蠺𧕓𧕛-𧕮𮕗蠻䘍𧕯-𧕼𬠻𮕘𮕙蠼𧕽-𧖃𧖊𮕚蠽蠾𧖄-𧖉𧖋-𧖐蠿䘎𧖑-𧖗𮕛𠑴𧖘-𧖛𫋩𧖜-𧖟𧖡-𧖦] +[radical 143=⾎血:血𮕜𧖧-𧖩𮕝衁衂䘏𧖪衃衄䘐𧖫-𧖯𫋪衅䘑𧖰-𧖲𫋫𮕞𮕟衆-衉𧖳𧖴𬠼𮕠䘒𧖵-𧖹䘓𧖺-𧖿𧗄䘔𧗀-𧗃𧗅-𧗍𫋬𧗎-𧗗衊𧗘𮕡𧗙-𧗛衋𧗜] +[radical 144=⾏行:行𬠽𧗝-𧗠衍衎𧗡-𧗥𮕢衏䘕𧗦-𧗩𬠾𬠿衐-衔𧗪𫋭衕-衘䘖𢔬𧗫-𧗱𫋮衙𧗲-𧗷𮕣𧗸𧗺𧗻衚-衝𧗹𧗼𧗽𫋯𫟘𬡀衞-衡䘗䘘𢖅𧗾𢖋𧗿-𧘁𫟙𧘂𧘃𫋰𧘄䘙𢖡𧘅𬡁𧘆𫋱衢] +[radical 145=⾐衣:衣衤𧘇𮕤补䘚䘛𧘈-𧘌𬡂𮕥-𮕧衦-衬䘜-䘞𧘍-𧘜𬡃-𬡇𮕨衭-袇䘟-䘡𧘝-𧘼𫋲-𫋴𬡈-𬡊𮕩-𮕯袈-袮袰䘢-䘧𧘽𧘿-𧙝𫋵-𫋷𬡋-𬡐𮕰-𮕸袯袱-裉䘨-䘮𧘾𧙞-𧙿𫋸-𫋼𬡑-𬡘𮕹-𮖀裊-裥䘯-䘲𧚀-𧚣𫋽𫟚𬡙-𬡝𮖁-𮖎裧-褄䘳-䙂𧚤-𧚺𧚼-𧛎𫋾-𫌄𬡞-𬡤𮖏-𮖓裦褅-褝䙃-䙍𧚻𧛏-𧛷𫌅𫌆𬡥𬡦𮖔-𮖠褞-褲褴䙎-䙓𧛸-𧜜𧜨𫌇-𫌉𬡧-𬡩𮖡-𮖩褳褵-襅襔䙔-䙝𧜝-𧜧𧜩-𧜬𧜮-𧝁𫌊-𫌏𬡪-𬡭𮖪-𮖮襆-襓襕鿋䙞-䙣𧜭𧝂-𧝰𫌐-𫌒𬡮𬡯𮖯-𮖶襖-襢䙤䙥𧝱-𧞌𫌓𫌔𬡰𬡱𮖷-𮖺襣-襨䙦-䙩𧞍-𧞖𧞘-𧞦𫌕𬡲-𬡴𮖻𮖼襩-襮䙪𧞗𧞧-𧞱𧞳-𧞵𫌖𬡵𬡶𮖽𮖾襯-襲䙫𧞲𧞶-𧟂𬡷襳襴襽䙬䙭𧟃-𧟇𫌗襵-襷䙮䙯𧟈-𧟋𫌘𫌙襸-襼䙰𧟌-𧟔䙱𧟕-𧟟] +[radical 146=⾑襾:襾-覀𧟠-𧟣要䙲𧟤-𧟦䙳𧟧-𧟩𬡸覂䙴𧟪-𧟬𫌚𮖿𮗀覃覄䙵䙶𧟭𧟮𫟛𮗁-𮗃覅𧟯𧟰𬡹𧟱-𧟸𬡺𮗄𧟹-𧟻𮗅𮗆𧟼-𧟾𫌛𧟿覆𧠀𧠁𬡻覇覈𧠂𮗇𧠃𮗈𧠄𮗉𮗊覉𮗋覊𧠅𮗌] +[radical 147=⾒見:見𧠆𧠇覌覙𧠈覍覎䙷䙸𧠉-𧠍𫌜規-覔䙹-䙻𧠎-𧠛𬡼𮗍覕覗覘覚䙼-䙿𧠜-𧠧𫌝𬡽𮗎覛覜䚀䚁𧠨-𧠺𫌞𮗏-𮗑覝-覡䚂䚃𧠻-𧡊𫌟𫌠𮗒-𮗔覢-覥䚄䚅𧡋-𧡠𫌡𬡾-𬢀𮗕-𮗗覦-親䚆-䚉𧡡-𧡶𫌢𫌣𮗘覫-覯䚊-䚌𧡷-𧢁𬢁𮗙覰-観䚍䚎𧢂-𧢋𫌤𬢂覴-覸䚏-䚓𧢌-𧢑𬢃𬢄𮗚-𮗝覹-覻𧢒-𧢗𫌥𮗞覼覽䚔𧢘-𧢛𬢅覾覿𥍄𧢜-𧢡𫟜𬢆𧢢-𧢥觀𧢦-𧢫𫌦𫌧䚕𧢬-𧢮䚖𧢯-𧢱] [radical 147'=⻅见:见观𬢇觃-觅觇-觉𫌨𫌩𬢈-𬢊觊𫌪𬢋𬢍觋𬢌觌觍𬢎觎𫌫𬢏-𬢑觏𬢒觐觑𫌬𬢓𬢔𫌭] -[radical 148=⾓角:角𧢲𧢳觓觔𧢴-𧢺觕-觙䚗𧢻-𧣐觚觛觝觞𧣑-𧣠𬢕觜觟-觧䚘-䚚𧣡-𧣧𫌮𫌯𬢖觨-觫䚛𧣨-𧣳𬢗觬-觯䚜-䚠𧣴-𧤊𬢘觰觱䚡-䚤𧤋-𧤚𧤢𫌰𫌱觲觳䚥䚦𧤛-𧤡𧤣-𧤮觴鵤䚧𧤯-𧤹觵觶䚨䚩䚬𧤺-𧥃觷-觹䚪䚫𧥄-𧥇𬢙觺𧥈-𧥋觻觼𧥌-𧥐觽觾𧥑-𧥔觿䚭𧥕-𧥚] -[radical 149=⾔言:言訁𧥛-𧥟訂-計䚮-䚰𧥠𬢚𬢛訉-訚䚱䚲𧥡-𧥭𫌲𫌳𬢜-𬢞訛-訳䚳-䛃𧥮-𧦛𫌴𫌵𬢟𬢠訴-詠䛄-䛓𧦜-𧧂𫌶-𫌹𬢡𬢢詡-誊誠鿁䛔-䛜𧧃-𧧳𧨜𫌺𫌻𬢣-𬢩誋-誟誡-誮䛝-䛨𧧴-𧨛𧨝-𧨥𫌼-𫌾𬢪-𬢭誯-諚諩䛩-䛸𧨦-𧩢𫌿𫍀𬢮-𬢳諛-諨諪-謃䛹-䛽𧩣-𧪗𫍁-𫍅𬢴-𬢹謄-謢䛾-䜂𠐜𧪘-𧫑𫍆-𫍈𬢺-𬣄謣-謾䜃-䜊𧫒-𧫽𫍉-𫍌𬣅謿-譌譎-譜龻䜋-䜑𧫾-𧬦𫍍-𫍏𬣆-𬣉譍譝-譲䜒-䜘𧬧-𧭁𫍐𫍑𬣊𬣋譳-譽䜙-䜞𧭂-𧭐𧭒-𧭛𫍒𬣌-𬣑譾-讅䜟-䜡𧭑𧭜-𧭷𫟝𬣒-𬣔讆-讐䜢𧭸-𧮄𫍓𬣕讑-讖𣌚𧮅-𧮐𫍔-𫍖𬣖讗-讙𧮑-𧮘讚讛𧮙-𧮝𫍗讜-讞𧮞-𧮤𧮦𧮧𫍘讟𧮨𬣗𬣘𧮩] -[radical 149'=⻈讠:讠-讱𫍙𬣙𬣚讲-诀䜣𫍚𫍛𫟞𬣛-𬣟证-诒𧮪𫍜-𫍡𫟟𬣠-𬣧诓-诩䜤𫍢-𫍦𬣨-𬣳诪-诶𫍧-𫍪𬣴-𬣼请-谊䜥𫍫-𫍮𫟠𫟡𬣽-𬤆谋-谞𫍯-𫍴𬤇-𬤏谟-谧䜦䜧𫍵-𫍸𫟢𬤐-𬤗谨-谬䜨𫍹𫍺𬤘-𬤜谭-谲𫍻𫍼𬤝-𬤥谳-谵𫍽𬤦-𬤨𫍾𬤩-𬤬𫍿𬤭䜩𬤮谶𬤯-𬤱] -[radical 150=⾕谷:谷𧮫䜪𫎀谸䜫𧮬-𧮮谹-谻𧮯-𧮲𫎁䜬䜭𧮳𧮴𬤲谼𧮵-𧮷谽䜮𧮸𧮹谾䜯𧮺-𧮿𫎂𬤳𧯀-𧯅𬤴谿-豁䜰𧯆-𧯉𬤵豂䜱𧯊豃𡓛𧯋-𧯖豄䜲豅𧯗-𧯙] -[radical 151=⾖豆:豆䜳𧯚豇豈𧯛-𧯝豉䜴𧯞𧯟𬤶䜵𧯠-𧯤豊豋䜶𧯥𧯦𧯨𬤷䜷-䜹𧯩-𧯬豌-豎䜺𧯭-𧯶𫎃䜻-䜿𧯷-𧯻豏䝀-䝂𧯼-𧰂𧰈豐𡕆𧰃-𧰇𫎄𧰉-𧰐𬤸豑𧰑-𧰖𬤹䝃𧰗-𧰟𬤺𧰠豒䝄𧰡𧰢豓𧰣𧰤豔𧰥] -[radical 152=⾗豕:豕𧰧𧰨豖𧰦𫎅𧰩𬤻豗䝅𧰪-𧰭豘-豝䝆䝇𧰮-𧰴𫎆𬤼𬤽豞-象䝈𧰵-𧰾豢-豦䝉𧰿-𧱌豧-豪𧱍-𧱗𫎇𫎈𬤾-𬥀䝊-䝌𧱘-𧱧𬥁-𬥃豫-豮䝍䝎𧱨-𧱱𫎉豯-豳𧱲-𧱺𬥄𬥅豴豵䝏𧱻-𧲁豷䝐䝑𧲂-𧲆豶𧲇-𧲋𬥆䝒𧲌-𧲏𬥇䝓𧲐-𧲓𧲗𧲔-𧲖𧲘𧲙䝔䝕𧲚-𧲟] -[radical 153=⾘豸:豸𧲠𧲡豹-豻𧲢𧲣𫎊豼豽䝖-䝙𧲤-𧲫豾-貃䝚䝛𧲬-𧲽貄-貊𧲾-𧳉𫎋𬥈貋-貍䝜𧳊-𧳘貎貏䝝䝞𧳙-𧳥𧳱𬥉貐-貓䝟𧳦-𧳰𧳲-𧳴𫎌貔-貖䝠𧳵-𧴀𫎍貗-貙䝡䝢𧴁-𧴅𧴇-𧴋𬥊𬥋貚䝣-䝦𧴆𧴌-𧴏𧴑-𧴕𬥌𧴐𧴖-𧴟𬥍𧴠-𧴢貛貜𧴣] -[radical 154=⾙貝:貝-負𧴤-𧴩𫎎𬥎財-貤𧴪-𧴲𫎏-𫎑貥-貮䝧䝨𧴳-𧵈𫎒𫎓𬥏-𬥒貯-賁䝩-䝯𧵉-𧵢𫎔𫎕𬥓賂-賎䝰-䝲𣣬𧵣-𧶄𫎖𬥔𬥕賏-賘㕢䝳-䝵𧶅-𧶚𫎗-𫎙𬥖-𬥚賙-賬䝶-䝿𧶛-𧶰𫎚𫎛𬥛-𬥟賭-賵䞀-䞄𠠋𧶱-𧷄𧷆-𧷋𫎜-𫎞𬥠-𬥢賶-賽䞅䞆𧷌-𧷝𫎟𫎠𬥣-𬥥賾-贀贂-贅䞇𧷞-𧷻𫎡𬥦𬥧贆-贌䞈𧷼-𧸕𫎢𬥨贍-贏䞉𧸖-𧸥𬥩贐-贔𧸦-𧸰𬥪-𬥭贕-贘䞊𧸱-𧸼𧸿𫎣𫎤𬥮-𬥰贙贚䞋𧸽𧸾𧹀-𧹇𫎥𬥱贛𧹈-𧹋贜𧹌-𧹐𬥲] +[radical 148=⾓角:角𧢲𧢳𮗟𮗠觓觔𧢴-𧢺𮗡𮗢觕-觙䚗𧢻-𧣐𮗣-𮗨觚觛觝觞𧣑-𧣠𬢕𮗩𮗪觜觟-觧䚘-䚚𧣡-𧣧𫌮𫌯𬢖𮗫-𮗯觨-觫䚛𧣨-𧣳𬢗𮗰-𮗲觬-觯䚜-䚠𧣴-𧤊𬢘𮗳觰觱䚡-䚤𧤋-𧤚𧤢𫌰𫌱觲觳䚥䚦𧤛-𧤡𧤣-𧤮𮗴𮗵觴鵤䚧𧤯-𧤹觵觶䚨䚩䚬𧤺-𧥃𮗶觷-觹䚪䚫𧥄-𧥇𬢙觺𧥈-𧥋觻觼𧥌-𧥐觽觾𧥑-𧥔觿䚭𧥕-𧥚] +[radical 149=⾔言:言訁𧥛-𧥟訂-計䚮-䚰𧥠𬢚𬢛𮗷𮗸訉-訚䚱䚲𧥡-𧥭𫌲𫌳𬢜-𬢞𮗹𮗺訛-訳䚳-䛃𧥮-𧦛𫌴𫌵𬢟𬢠𮗻-𮗾訴-詠䛄-䛓𧦜-𧧂𫌶-𫌹𬢡𬢢𮗿-𮘇詡-誊誠鿁䛔-䛜𧧃-𧧳𧨜𫌺𫌻𬢣-𬢩𮘈-𮘎誋-誟誡-誮䛝-䛨𧧴-𧨛𧨝-𧨥𫌼-𫌾𬢪-𬢭𮘏-𮘖誯-諚諩䛩-䛸𧨦-𧩢𫌿𫍀𬢮-𬢳𮘗-𮘠諛-諨諪-謃䛹-䛽𧩣-𧪗𫍁-𫍅𬢴-𬢹𮘡-𮘪謄-謢䛾-䜂𠐜𧪘-𧫑𫍆-𫍈𬢺-𬣄𮘫-𮘯謣-謾䜃-䜊𧫒-𧫽𫍉-𫍌𬣅𮘰-𮘸謿-譌譎-譜龻䜋-䜑𧫾-𧬦𫍍-𫍏𬣆-𬣉𮘹-𮘽譍譝-譲䜒-䜘𧬧-𧭁𫍐𫍑𬣊𬣋𮘾-𮙂譳-譽䜙-䜞𧭂-𧭐𧭒-𧭛𫍒𬣌-𬣑𮙃𮙄譾-讅䜟-䜡𧭑𧭜-𧭷𫟝𬣒-𬣔𮙅𮙆讆-讐䜢𧭸-𧮄𫍓𬣕𮙇讑-讖𣌚𧮅-𧮐𫍔-𫍖𬣖讗-讙𧮑-𧮘𮙈讚讛𧮙-𧮝𫍗讜-讞𧮞-𧮤𧮦𧮧𫍘讟𧮨𬣗𬣘𧮩] +[radical 149'=⻈讠:讠-讱𫍙𬣙𬣚讲-诀䜣𫍚𫍛𫟞𬣛-𬣟证-诒𧮪𫍜-𫍡𫟟𬣠-𬣧诓-诩䜤𫍢-𫍦𬣨-𬣳诪-诶𫍧-𫍪𬣴-𬣼𮙉请-谊䜥𫍫-𫍮𫟠𫟡𬣽-𬤆谋-谞𫍯-𫍴𬤇-𬤏谟-谧䜦䜧𫍵-𫍸𫟢𬤐-𬤗谨-谬䜨𫍹𫍺𬤘-𬤜谭-谲𫍻𫍼𬤝-𬤥𮙊谳-谵𫍽𬤦-𬤨𫍾𬤩-𬤬𫍿𬤭𮙋䜩𬤮谶𬤯-𬤱] +[radical 150=⾕谷:谷𧮫䜪𫎀谸䜫𧮬-𧮮谹-谻𧮯-𧮲𫎁𮙌䜬䜭𧮳𧮴𬤲谼𧮵-𧮷𮙍谽䜮𧮸𧮹𮙎谾䜯𧮺-𧮿𫎂𬤳𮙏𧯀-𧯅𬤴𮙐谿-豁䜰𧯆-𧯉𬤵豂䜱𧯊豃𡓛𧯋-𧯒𮙑𧯓-𧯖豄䜲豅𧯗-𧯙] +[radical 151=⾖豆:豆䜳𧯚豇豈𧯛-𧯝豉䜴𧯞𧯟𬤶䜵𧯠-𧯤𮙒豊豋䜶𧯥𧯦𧯨𬤷䜷-䜹𧯩-𧯬𮙓𮙔豌-豎䜺𧯭-𧯶𫎃䜻-䜿𧯷-𧯻𮙕豏䝀-䝂𧯼-𧰂𧰈豐𡕆𧰃-𧰇𫎄𮙖𧰉-𧰐𬤸𮙗豑𧰑-𧰖𬤹䝃𧰗𧰘𮙘𧰙-𧰜𮙙𧰝-𧰟𬤺𧰠豒䝄𧰡𧰢豓𧰣𧰤豔𧰥] +[radical 152=⾗豕:豕𧰧𧰨豖𧰦𫎅𧰩𬤻𮙚豗䝅𧰪-𧰭豘-豝䝆䝇𧰮-𧰴𫎆𬤼𬤽𮙛豞-象䝈𧰵-𧰾𮙜-𮙞豢-豦䝉𧰿-𧱌𮙟𮙠豧-豪𧱍-𧱗𫎇𫎈𬤾-𬥀䝊-䝌𧱘-𧱧𬥁-𬥃豫-豮䝍䝎𧱨-𧱱𫎉𮙡-𮙣豯-豳𧱲-𧱺𬥄𬥅豴豵䝏𧱻-𧲁𮙤豷䝐䝑𧲂-𧲆豶𧲇-𧲋𬥆䝒𧲌-𧲏𬥇䝓𧲐-𧲓𧲗𧲔-𧲖𧲘𧲙䝔䝕𧲚-𧲟] +[radical 153=⾘豸:豸𧲠𧲡𮙥豹-豻𧲢𧲣𫎊豼豽䝖-䝙𧲤-𧲫𮙦𮙧豾-貃䝚䝛𧲬-𧲽𮙨𮙩貄-貊𧲾-𧳉𫎋𬥈貋-貍䝜𧳊-𧳘𮙪貎貏䝝䝞𧳙-𧳥𧳱𬥉貐-貓䝟𧳦-𧳰𧳲-𧳴𫎌𮙫貔-貖䝠𧳵-𧴀𫎍貗-貙䝡䝢𧴁-𧴅𧴇-𧴋𬥊𬥋貚䝣-䝦𧴆𧴌-𧴏𧴑-𧴕𬥌𮙬𧴐𧴖-𧴟𬥍𧴠-𧴢貛貜𧴣] +[radical 154=⾙貝:貝-負𧴤-𧴩𫎎𬥎𮙭財-貤𧴪-𧴲𫎏-𫎑𮙮-𮙱貥-貮䝧䝨𧴳-𧵈𫎒𫎓𬥏-𬥒𮙲-𮙸貯-賁䝩-䝯𧵉-𧵢𫎔𫎕𬥓𮙹-𮚀賂-賎䝰-䝲𣣬𧵣-𧶄𫎖𬥔𬥕𮚁-𮚄賏-賘㕢䝳-䝵𧶅-𧶚𫎗-𫎙𬥖-𬥚𮚅-𮚊賙-賬䝶-䝿𧶛-𧶰𫎚𫎛𬥛-𬥟𮚋-𮚔賭-賵䞀-䞄𠠋𧶱-𧷄𧷆-𧷋𫎜-𫎞𬥠-𬥢𮚕-𮚙賶-賽䞅䞆𧷌-𧷝𫎟𫎠𬥣-𬥥𮚚-𮚝賾-贀贂-贅䞇𧷞-𧷻𫎡𬥦𬥧𮚞-𮚠贆-贌䞈𧷼-𧸕𫎢𬥨𮚡-𮚦贍-贏䞉𧸖-𧸥𬥩𮚧𮚨贐-贔𧸦-𧸰𬥪-𬥭𮚩-𮚫贕-贘䞊𧸱-𧸼𧸿𫎣𫎤𬥮-𬥰𮚬贙贚䞋𧸽𧸾𧹀-𧹇𫎥𬥱𮚭贛𧹈-𧹋贜𧹌-𧹐𮚮-𮚰𬥲] [radical 154'=⻉贝:贝-贯𧹑𬥳贰-贻𧹒𫎦𫎧𬥴-𬥶贼-赆䞌𬥷赇-赊𧹓𫎨𬥸赋-赕䞍䞎𧹔-𧹖𫎩𬥹赖赗䞏䞐𫎪𬥺-𬥽赘-赛𬥾赜𧹗赝-赠𫎫赡赢𫎬𬥿赣𬦀] -[radical 155=⾚赤:赤𧹘-𧹚䞑赥-赧𧹛𧹜𬦁𧹝-𧹟𫎭赨-赪䞒𧹠-𧹢𫎮𬦂赫䞓䞔𧹣-𧹫𫎯赬-赮𧹬-𧹱𬦃赯𧹲-𧹷𫎰𧹸-𧹼䞕𧹽-𧺁𬦄𧺂-𧺅] -[radical 156=⾛走:走赱𧺆𧺇赲-赵龪𧺈-𧺎赶-赸䞖-䞘𧺏-𧺜𬦅赹-赿﨣䞙-䞜𧺝-𧺵𫎱𬦆-𬦈趀-趋䞝-䞤𧺶-𧻏𫎲𬦉-𬦋趌-趔䞥-䞪𧻐-𧻮𫎳𫎴𬦌𬦍趕-趚䞫-䞲𧻯-𧼍𧼝𫎵-𫎷𬦎-𬦑趛-趤䞳-䞸𧼎-𧼜𧼞𧼠-𧼧𫎸-𫎺𬦒𬦓趥-趧䞹-䞼𧼟𧼨-𧽈𫎻𫎼𬦔-𬦗趨䞽-䟀𧽉-𧽝𫎽𬦘-𬦜䟁-䟆𧽞-𧽵𫎾𫎿𬦝𬦞趩-趭䟇𧽶-𧾌𬦟趮䟈-䟋𧾍-𧾘趯趰䟌𧾙-𧾠䟍-䟏𧾡-𧾧趱䟐𧾨-𧾭䟑𧾮𧾯䟒𧾰-𧾴趲𧾵𧾶] -[radical 157=⾜足:足𧾷-𧾹趴䟓䟔𧾺-𧿀𬦠趵-趸䟕䟖𧿁-𧿑𫏀𬦡𬦢趹-趻趽-跄䟗-䟞𧿒-𧿱𫏁-𫏃𬦣-𬦧跅-跞践䟟-䟭𧿲-𨀔𫏄-𫏆𬦨-𬦫趼跟-跴跶-跻䟮-䟳𨀕-𨀿𫏇-𫏋𬦬-𬦱跼-踎䟴-䟻䟽𨁀-𨁴𫏌-𫏎𬦲-𬦵踏-踪踬-踯踺䟼䟾-䠌𨁵-𨂜𨂟𫏏-𫏓𬦶-𬦻踫踰-踹踻-蹅䠍-䠖𨂝𨂞𨂠-𨃒𫏔-𫏘𬦼-𬧃蹆-蹓䠗-䠝𨃓-𨄂𨄄𫏙-𫏛𬧄-𬧉蹔-蹧蹮躀䠞-䠢𨄃𨄅-𨅉𨅚𫏜-𫏟𬧊-𬧐蹨-蹭蹯-蹿䠣-䠧𨅊-𨅙𨅛-𨆀𫏠-𫏢𫟣𬧑-𬧔躁-躉䠨䠩𨆁-𨆩𫏣-𫏦𬧕-𬧗躊-躏䠪䠫𨆪-𨇀𫏧𫏨𬧘躐-躖䠬𨇁-𨇕𬧙躗-躜䠭䠮𨇖-𨇣𫏩𬧚𬧛躝-躠䠯𨇤-𨇭𬧜躡-躥䠰𨇮-𨇺躦躧𨇻-𨈀躩躪𨈁-𨈃𬧝躨䠱𨈄-𨈇𬧞𨈈-𨈊𬧟𨈋-𨈎] -[radical 158=⾝身:身𨈏-𨈑𬧠𨈒躬𨈓-𨈗躭-躯𨈘-𨈨𬧡躰䠲-䠶𨈩-𨈷𬧢躱躲䠷-䠺𨈸-𨉇𫏪𫏫𬧣躳-躵𨉈-𨉓𫏬躶-躼䠻𨉔-𨉡𬧤-𬧪躽躾䠼𨉢-𨉥𨉧-𨉭𬧫躿䠽䠾𨉦𨉮-𨉸𫏭𫏮𬧬-𬧮軀軁𨉹-𨉾𫏯𬧯軂-軅䠿𨉿-𨊌𫏰𬧰軆䡀𨊍-𨊒𫏱軇𨊓-𨊚䡁𨊛𨊜軈𨊝-𨊟軉] -[radical 159=⾞車:車-軍䡂-䡄𨊠-𨊦軎-軕䡅𨊧-𨊲𫏲軖-軣䡆-䡎𨊳-𨋍𫏳𬧱軤-軬軮-軽龫䡏-䡒𨋎-𨋧𫏴𫏵𬧲-𬧴軭軾-輌䡓-䡗𨋨-𨌁𬧵輍-輕䡘-䡛𨌂-𨌟𫏶-𫏸輖-輬䡜-䡟𨌠-𨍆𫏹𬧶𬧷輭-輼䡠-䡤𨍇-𨍨𫏺𫏻𬧸𬧹輽-轅䡥-䡪𨍩-𨎉𫏼𫏽𬧺轆-轌鿂䡫-䡱𨎊-𨎣𫏾𫏿𬧻-𬧽轍-轔䡲-䡵𨎤-𨎱𫐀轕-轚䡶𨎲-𨏇𨘼𫐁𬧾轛-轟䡷-䡹𨏈-𨏐𫐂轠-轢䡺䡻𨏑-𨏝𬧿𬨀轣轤𨏞-𨏨䡼𨏩-𨏴䡽𨏵-𨏸𨏽轥䡾𨏹𨏻𨏾𨏺𨏼𨏿-𨐂䡿𨐃𫐃𨐄] -[radical 159'=⻋车:车-轫䢀𫐄𫐅转-轰䢁𨐅𨐆𫐆𫐇𬨁-𬨃轱-轻䢂𨐇𫐈-𫐊𫟤𬨄𬨅轼-较𨐈𫐋𫐌𬨆𬨇辄-辆𫐍𬨈-𬨋辇-辎𫐎-𫐑𬨌辏-辔𫐒𫐓𬨍-𬨏辕-辗𫐔𫟥𬨐𬨑辘𫐕𫐖𬨒𬨓辙辚𨐉𫐗𫐘𫟦𬨔𬨕𫐙𨐊] -[radical 160=⾟辛:辛𨐋𨐌𬨖𨐍-𨐑辜辝𨐒𨐓𫐚𬨗-𬨙辞-辠𨐔-𨐗𫐛𫐜辡-辣𨐘-𨐛𬨚辤䢃𨐜-𨐟辥-辪𨐠-𨐧辫𨐨-𨐯辬𨐰-𨐲辭𨐵-𨐹辮䢄𨐺-𨐼𫐝辯𨐽-𨐿𬨛𨑀-𨑂] -[radical 161=⾠辰:辰𨑃𨑄辱農䢅𨑅-𨑇䢆辳䢇𨑈𨑉辴𨑊䢈䢉𨑋𨑌] -[radical 162=⾡辵:辵辶𠔇辷𫐞辸-辽𨑍-𨑐𫟧𬨜巡达-迉䢊䢋𨑑-𨑡𫐟迊-迟迬﨤䢌-䢏𨑢-𨒁𫐠𫐡𬨝-𬨠迠-迫迭-迳䢐䢑𨒂-𨒤𫐢-𫐤𬨡-𬨣迴-逊䢒-䢘𨒥-𨓄𫐥𬨤𬨥逋-逧䢙-䢛𨓅-𨓪𫐦-𫐪𬨦-𬨬逨-逻䢜-䢠𨓫-𨔍𨔏-𨔜𨔠𫐫-𫐲𬨭-𬨲逼-遗䢡𨔎𨔝-𨔟𨔡-𨕜𫐳-𫐹𫟨𫟩𬨳-𬨹遘-遥䢢-䢥𨕝-𨖅𫐺-𫐽𬨺-𬨿遦-遱遳䢦-䢩𨖆-𨖳𫐾-𫑃𬩀-𬩈遲遴-遼邆䢪-䢭𨖴-𨗒𨗔-𨗤𫑄-𫑊𬩉-𬩐遽-邅邉䢮𨗥-𨘆𫑋𫟪𬩑-𬩛邇邈䢯䢰𨘇-𨘠𩄮𫑌-𫑏𬩜-𬩣邊-邌䢱𨘡-𨘶𫑐𫑑𬩤-𬩪邍𨘷-𨘻𨘽-𨙁𬩫-𬩮邎𨙂-𨙑𫑒-𫑕𨙒-𨙘𫑖𬩯-𬩲邏邐𨙙-𨙞䢲𨙟-𨙧] -[radical 163=⾢邑:邑𨙨邒邓䢳𨙩𨙪𬩳𬩴邔-邝䢴𨙫-𨙵𫑗邞-邬䢵-䢷𨙶-𨚒𫑘𫑙𬩵𬩶邭-邻䢸-䢺𨚓-𨚮𫑚𫑛𫟫𬩷-𬩹邼-郑郓䢻-䣂𨚯-𨛊𫑜𬩺-𬩽郒郔-郧䣃-䣉𨛋-𨛪𫑝-𫑟𬩾-𬪄部-郸䣊-䣏𨛫-𨜎𫑠-𫑢𫟬𬪅-𬪊郹-鄊䣐-䣒𨜏-𨜖𨜘-𨜱𫑣𫑤𫟭𬪋-𬪐鄋-鄗䣓-䣗𨜗𨜲-𨝊𫑥𫑦鄘-鄥䣘-䣜𨝋-𨝪𨝹𫑧-𫑩𬪑-𬪔鄦-鄲䣝-䣠𨝫-𨝸𨝺-𨞐𬪕𬪖鄳-鄷䣡𨞑-𨞦𫑪𫑫𬪗-𬪛鄸鄹䣢𨞧-𨞹𫑬𬪜鄺-鄾𨞺-𨟌𫑭𬪝-𬪟鄿酀酂𨟍-𨟘𫑮-𫑰𬪠-𬪢酁酃𨟙-𨟟𬪣𬪤酄-酆𨟠-𨟣𫑱酇酈𨟤-𨟧䣣䣤𨟨-𨟮𬪥𨟯𫑲] -[radical 164=⾣酉:酉-酋䣥䣦酌-酒䣧䣨𨟰-𨟳𫑳酓-酞䣩-䣭𨟴-𨠊𬪦𬪧酟-酥䣮-䣳𨠋-𨠣𬪨酦-酱䣴-䣹𨠤-𨠶𫑴𫑵𫟮𬪩酲-酿䣺䣻𨠷-𨡋𫑶-𫑸𬪪-𬪬醀-醌䣼-䣿𨡌-𨡨𫑹醍-醗䤀-䤈𨡩-𨢄𬪭-𬪱醘-醤䤉-䤌𨢅-𨢠𫑺𬪲-𬪵醥-醬䤍𨢡-𨢼𫑻𬪶醭-醱䤎-䤒𨢽-𨣕𫑼𫑽醲-醸𨣖-𨣥𬪷-𬪹醹-醻䤓䤔𨣦-𨣭𫑾䤕䤖𨣮-𨣵醼𨣶-𨣽𫑿醽-釀䤗䤘𨣾-𨤂釁釂𨤃𨤄釃釄𨤅𨤆釅𨤇-𨤉䤙𨤊-𨤎] -[radical 165=⾤釆:釆采𨤏𬪺釈𨤐𨤑釉释𫒀𬪻𨤒-𨤙𤳛𨤚-𨤝釋𨤞-𨤡] -[radical 166=⾥里:里重𫟯𨤣𨤤野䤚𨤢𨤥𫒁量𨤦-𨤩𫒂𬪼𬪽𨤪𨤫𬪾𨤬𫒃𨤭-𨤱𡣢𨤲𨤳𫒄𬪿𬫀釐𨤴-𨤷𫒅𥣷𨤸𬫁𨤹-𨤼] -[radical 167=⾦金:金-釢䤛𨤽-𨥁釣-釼䤜𨥂-𨥉𫒆-𫒉釽-鈬䤝-䤠𨥊-𨥤𫒊-𫒎𬫂-𬫅鈭-鉴銏龯䤡-䤣𨥥-𨦁𫒏-𫒔𬫆-𬫌鉵-鉻鉽-銎銐-銱䤤-䤪𨦂-𨦝𨦟-𨦫𫒕-𫒜𫟰𬫍-𬫓銲-鋶﨧䤫-䤲𨦬-𨧥𫒝-𫒥𬫔-𬫠鉼鋷-錧錩-鍆鍈龬﨨䤳-䤶𨧦-𨨮𫒦-𫒯𬫡-𬫬錨鍇鍉-鎇䤷-䤼𨨯-𨪆𫒰-𫒷𬫭-𬫲鎈-鎨鎪-鎿龲䤽-䥇𨪇-𨫎𫒸-𫒾𫟱𬫳-𬫾鎩鏀-鏲鏹䥈-䥓𨫏-𨬌𫒿-𫓃𬫿-𬬄鏳鏵-鏸鏺-鐨䥔-䥜𨬍-𨬔𨬖-𨭔𫓄-𫓎𬬅-𬬊鏴鐩-鑁䥝-䥦𨬕𨭕-𨮑𫓏-𫓕𬬋-𬬑鑂-鑔鑧䥧-䥮𨮒-𨮷𫓖-𫓚𬬒-𬬗鑕-鑦䥯-䥴𨮸-𨯜𫓛𫓜𬬘-𬬛鑨-鑬䥵-䥷𨯝-𨯹𫓝-𫓟𬬜-𬬞鑭-鑳䥸𨯺-𨰈𨰱𫓠-𫓢𬬟𬬠鑴-鑺𨰉-𨰝𫓣𬬡𬬢鑻-鑿𨰞-𨰨𫓤钀-钂𨰩-𨰰𬬣钃钄䥹𨰲-𨰶𬬤𨰷-𨰹𬬥𨰺𬬦𨰻-𨰽] -[radical 167'=⻐钅:钅-钌𫓥𫟲钍-钗𨰾𨰿𫓦𫟳𬬧-𬬪钘-钯䥺-䥼𨱀-𨱂𫓧-𫓫𫟴𫟵𬬫-𬬶钰-铎䥽-䥿𨱃-𨱆𫓬-𫓮𫟶𫟷𬬷-𬭂铏-铷䦀𫓯-𫓴𫟸-𫟻𬭃-𬭉铸-锕鿏䦁𨱇𨱈𫓵-𫓷𫟼𬭊-𬭐锖-锱𨱉-𨱌𫓸-𫓿𫟽𬭑-𬭝锲-镅𨱎𫔀-𫔄𫟾𫟿𬭞-𬭥镆-镕鿔䦂𨱍𨱏𫔅-𫔈𫠀𬭦-𬭫镖-镠𨱐𨱒𫔉𫔊𬭬-𬭲镡-镫䦃-䦅𨱑𨱓𨱔𫔋-𫔏𬭳-𬭹镬-镱𨱕𨱖𫔐𫔑𬭺-𬭽镲𫔒𫠁𬭾镳镴𬭿𫔓𬮀镵镶𬮁𫔔𫔕𬮂䦆𬮃] -[radical 168=⾧長:長镸𨱗-𨱙镹䦇镺𨱚-𨱥镻䦈䦉𨱦-𨱱䦊𨱲-𨱿𫔖𬮄𨲀-𨲆镼𨲇-𨲒𫔗𡑺𨲓-𨲕𨲗-𨲝𨲖𨲞-𨲤䦋𨲥-𨲬镽𨲭-𨲷镾𨲸-𨳆] +[radical 155=⾚赤:赤𧹘-𧹚䞑赥-赧𧹛𧹜𬦁𧹝-𧹟𫎭赨-赪䞒𧹠-𧹢𫎮𬦂赫䞓䞔𧹣-𧹫𫎯赬-赮𧹬-𧹱𬦃𮚱赯𧹲-𧹷𫎰𧹸-𧹼䞕𧹽-𧺁𬦄𧺂-𧺅] +[radical 156=⾛走:走赱𧺆𧺇𮚲赲-赵龪𧺈-𧺎赶-赸䞖-䞘𧺏-𧺜𬦅𮚳赹-赿﨣䞙-䞜𧺝-𧺵𫎱𬦆-𬦈𮚴𮚵趀-趋䞝-䞤𧺶-𧻏𫎲𬦉-𬦋𮚶𮚷趌-趔䞥-䞪𧻐-𧻮𫎳𫎴𬦌𬦍𮚸𮚹趕-趚䞫-䞲𧻯-𧼍𧼝𫎵-𫎷𬦎-𬦑𮚺𮚻趛-趤䞳-䞸𧼎-𧼜𧼞𧼠-𧼧𫎸-𫎺𬦒𬦓趥-趧䞹-䞼𧼟𧼨-𧽈𫎻𫎼𬦔-𬦗𮚼趨䞽-䟀𧽉-𧽝𫎽𬦘-𬦜𮚽𮚾䟁-䟆𧽞-𧽵𫎾𫎿𬦝𬦞趩-趭䟇𧽶-𧾌𬦟𮚿趮䟈-䟋𧾍-𧾘趯趰䟌𧾙-𧾠䟍-䟏𧾡-𧾧𮛀趱䟐𧾨-𧾭䟑𧾮𧾯䟒𧾰-𧾴趲𧾵𧾶] +[radical 157=⾜足:足𧾷-𧾹𮛁趴䟓䟔𧾺-𧿀𬦠𮛂趵-趸䟕䟖𧿁-𧿑𫏀𬦡𬦢𮛃-𮛈趹-趻趽-跄䟗-䟞𧿒-𧿱𫏁-𫏃𬦣-𬦧𮛉-𮛎跅-跞践䟟-䟭𧿲-𨀔𫏄-𫏆𬦨-𬦫𮛏-𮛖趼跟-跴跶-跻䟮-䟳𨀕-𨀿𫏇-𫏋𬦬-𬦱𮛗𮛘跼-踎䟴-䟻䟽𨁀-𨁴𫏌-𫏎𬦲-𬦵𮛙-𮛟踏-踪踬-踯踺䟼䟾-䠌𨁵-𨂜𨂟𫏏-𫏓𬦶-𬦻𮛠-𮛮踫踰-踹踻-蹅䠍-䠖𨂝𨂞𨂠-𨃒𫏔-𫏘𬦼-𬧃𮛯-𮛿蹆-蹓䠗-䠝𨃓-𨄂𨄄𫏙-𫏛𬧄-𬧉𮜀-𮜈蹔-蹧蹮躀䠞-䠢𨄃𨄅-𨅉𨅚𫏜-𫏟𬧊-𬧐𮜉-𮜓蹨-蹭蹯-蹿䠣-䠧𨅊-𨅙𨅛-𨆀𫏠-𫏢𫟣𬧑-𬧔𮜔-𮜘躁-躉䠨䠩𨆁-𨆩𫏣-𫏦𬧕-𬧗𮜙-𮜛躊-躏䠪䠫𨆪-𨇀𫏧𫏨𬧘𮜜-𮜠躐-躖䠬𨇁-𨇕𬧙𮜡-𮜥躗-躜䠭䠮𨇖-𨇣𫏩𬧚𬧛𮜦-𮜪躝-躠䠯𨇤-𨇭𬧜𮜫𮜬躡-躥䠰𨇮-𨇺躦躧𨇻-𨈀𮜭躩躪𨈁-𨈃𬧝躨䠱𨈄-𨈇𬧞𨈈-𨈊𬧟𨈋-𨈎] +[radical 158=⾝身:身𨈏-𨈑𬧠𨈒躬𨈓-𨈗𮜮躭-躯𨈘-𨈨𬧡𮜯躰䠲-䠶𨈩-𨈷𬧢𮜰躱躲䠷-䠺𨈸-𨉇𫏪𫏫𬧣𮜱-𮜵躳-躵𨉈-𨉓𫏬𮜶-𮜹躶-躼䠻𨉔-𨉡𬧤-𬧪躽躾䠼𨉢-𨉥𨉧-𨉭𬧫躿䠽䠾𨉦𨉮-𨉸𫏭𫏮𬧬-𬧮軀軁𨉹-𨉾𫏯𬧯軂-軅䠿𨉿-𨊌𫏰𬧰軆䡀𨊍-𨊒𫏱𮜺-𮜼軇𨊓-𨊚䡁𨊛𨊜𮜽軈𨊝𨊞𮜾𨊟軉] +[radical 159=⾞車:車-軍䡂-䡄𨊠-𨊦軎-軕䡅𨊧-𨊲𫏲𮜿軖-軣䡆-䡎𨊳-𨋍𫏳𬧱𮝀-𮝅軤-軬軮-軽龫䡏-䡒𨋎-𨋧𫏴𫏵𬧲-𬧴𮝆-𮝌軭軾-輌䡓-䡗𨋨-𨌁𬧵𮝍-𮝑輍-輕䡘-䡛𨌂-𨌟𫏶-𫏸𮝒𮝓輖-輬䡜-䡟𨌠-𨍆𫏹𬧶𬧷𮝔-𮝜輭-輼䡠-䡤𨍇-𨍨𫏺𫏻𬧸𬧹𮝝-𮝟輽-轅䡥-䡪𨍩-𨎉𫏼𫏽𬧺𮝠-𮝢轆-轌鿂䡫-䡱𨎊-𨎣𫏾𫏿𬧻-𬧽𮝣-𮝥轍-轔䡲-䡵𨎤-𨎱𫐀𮝦-𮝨轕-轚䡶𨎲-𨏇𨘼𫐁𬧾𮝩-𮝫轛-轟䡷-䡹𨏈-𨏐𫐂𮝬-𮝯轠-轢䡺䡻𨏑-𨏝𬧿𬨀𮝰-𮝲轣轤𨏞-𨏨䡼𨏩-𨏴䡽𨏵-𨏸𨏽轥䡾𨏹𨏻𨏾𨏺𨏼𨏿-𨐂䡿𨐃𫐃𨐄] +[radical 159'=⻋车:车-轫䢀𫐄𫐅转-轰䢁𨐅𨐆𫐆𫐇𬨁-𬨃𮝳轱-轻䢂𨐇𫐈-𫐊𫟤𬨄𬨅𮝴轼-较𨐈𫐋𫐌𬨆𬨇𮝵辄-辆𫐍𬨈-𬨋𮝶辇-辎𫐎-𫐑𬨌辏-辔𫐒𫐓𬨍-𬨏𮝷𮝸辕-辗𫐔𫟥𬨐𬨑辘𫐕𫐖𬨒𬨓辙辚𨐉𫐗𫐘𫟦𬨔𮝹𮝺𬨕𫐙𨐊] +[radical 160=⾟辛:辛𨐋𨐌𬨖𨐍-𨐑辜辝𨐒𨐓𫐚𬨗-𬨙辞-辠𨐔-𨐗𫐛𫐜辡-辣𨐘-𨐛𬨚𮝻辤䢃𨐜-𨐟𮝼辥-辪𨐠-𨐧辫𨐨-𨐯辬𨐰-𨐲𮝽辭𨐵-𨐹辮䢄𨐺-𨐼𫐝辯𨐽-𨐿𬨛𨑀-𨑂] +[radical 161=⾠辰:辰𨑃𨑄𮝾辱農䢅𨑅-𨑇䢆辳䢇𨑈𨑉𮝿𮞀辴𨑊䢈䢉𨑋𨑌] +[radical 162=⾡辵:辵辶𠔇辷𫐞辸-辽𨑍-𨑐𫟧𬨜巡达-迉䢊䢋𨑑-𨑡𫐟𮞁-𮞃迊-迟迬﨤䢌-䢏𨑢-𨒁𫐠𫐡𬨝-𬨠𮞄𮞅迠-迫迭-迳䢐䢑𨒂-𨒤𫐢-𫐤𬨡-𬨣𮞆-𮞎迴-逊䢒-䢘𨒥-𨓄𫐥𬨤𬨥𮞏-𮞑逋-逧䢙-䢛𨓅-𨓪𫐦-𫐪𬨦-𬨬𮞒-𮞕逨-逻䢜-䢠𨓫-𨔍𨔏-𨔜𨔠𫐫-𫐲𬨭-𬨲𮞖-𮞨逼-遗䢡𨔎𨔝-𨔟𨔡-𨕜𫐳-𫐹𫟨𫟩𬨳-𬨹𮞩-𮞵遘-遥䢢-䢥𨕝-𨖅𫐺-𫐽𬨺-𬨿𮞶-𮞼遦-遱遳䢦-䢩𨖆-𨖳𫐾-𫑃𬩀-𬩈𮞽-𮟈遲遴-遼邆䢪-䢭𨖴-𨗒𨗔-𨗤𫑄-𫑊𬩉-𬩐𮟉-𮟏遽-邅邉䢮𨗥-𨘆𫑋𫟪𬩑-𬩛𮟐-𮟗邇邈䢯䢰𨘇-𨘠𩄮𫑌-𫑏𬩜-𬩣𮟘-𮟜邊-邌䢱𨘡-𨘶𫑐𫑑𬩤-𬩪𮟝-𮟡邍𨘷-𨘻𨘽-𨙁𬩫-𬩮𮟢𮟣邎𨙂-𨙑𫑒-𫑕𮟤-𮟦𨙒-𨙘𫑖𬩯-𬩲𮟧邏邐𨙙-𨙞䢲𨙟-𨙥𮟨𨙦𮟩𨙧] +[radical 163=⾢邑:邑𨙨邒邓䢳𨙩𨙪𬩳𬩴邔-邝䢴𨙫-𨙵𫑗𮟪𮟫邞-邬䢵-䢷𨙶-𨚒𫑘𫑙𬩵𬩶𮟬-𮟮邭-邻䢸-䢺𨚓-𨚮𫑚𫑛𫟫𬩷-𬩹𮟯-𮟶邼-郑郓䢻-䣂𨚯-𨛊𫑜𬩺-𬩽𮟷-𮟺郒郔-郧䣃-䣉𨛋-𨛪𫑝-𫑟𬩾-𬪄𮟻𮟼部-郸䣊-䣏𨛫-𨜎𫑠-𫑢𫟬𬪅-𬪊𮟽-𮟿郹-鄊䣐-䣒𨜏-𨜖𨜘-𨜱𫑣𫑤𫟭𬪋-𬪐𮠀-𮠂鄋-鄗䣓-䣗𨜗𨜲-𨝊𫑥𫑦𮠃-𮠅鄘-鄥䣘-䣜𨝋-𨝪𨝹𫑧-𫑩𬪑-𬪔𮠆鄦-鄲䣝-䣠𨝫-𨝸𨝺-𨞐𬪕𬪖𮠇-𮠉鄳-鄷䣡𨞑-𨞦𫑪𫑫𬪗-𬪛𮠊-𮠎鄸鄹䣢𨞧-𨞹𫑬𬪜𮠏𮠐鄺-鄾𨞺-𨟌𫑭𬪝-𬪟𮠑𮠒鄿酀酂𨟍-𨟘𫑮-𫑰𬪠-𬪢酁酃𨟙-𨟟𬪣𬪤𮠓酄-酆𨟠-𨟣𫑱𮠔酇酈𨟤-𨟧䣣䣤𨟨-𨟮𬪥𨟯𫑲] +[radical 164=⾣酉:酉𮠕酊酋䣥䣦𮠖𮠗酌-酒䣧䣨𨟰-𨟳𫑳𮠘-𮠚酓-酞䣩-䣭𨟴-𨠊𬪦𬪧𮠛-𮠠酟-酥䣮-䣳𨠋-𨠣𬪨𮠡-𮠤酦-酱䣴-䣹𨠤-𨠶𫑴𫑵𫟮𬪩𮠥-𮠪酲-酿䣺䣻𨠷-𨡋𫑶-𫑸𬪪-𬪬𮠫-𮠭醀-醌䣼-䣿𨡌-𨡨𫑹𮠮-𮠴醍-醗䤀-䤈𨡩-𨢄𬪭-𬪱𮠵-𮠻醘-醤䤉-䤌𨢅-𨢠𫑺𬪲-𬪵𮠼醥-醬䤍𨢡-𨢼𫑻𬪶𮠽-𮡀醭-醱䤎-䤒𨢽-𨣕𫑼𫑽𮡁-𮡄醲-醸𨣖-𨣥𬪷-𬪹𮡅𮡆醹-醻䤓䤔𨣦-𨣭𫑾𮡇-𮡊䤕䤖𨣮-𨣵𮡋𮡌醼𨣶-𨣽𫑿醽-釀䤗䤘𨣾-𨤂𮡍釁釂𨤃𨤄釃釄𨤅𨤆釅𨤇-𨤉䤙𨤊-𨤎] +[radical 165=⾤釆:釆采𨤏𬪺𮡎釈𨤐𨤑𮡏釉释𫒀𬪻𨤒-𨤙𮡐𤳛𨤚-𨤝𮡑釋𨤞-𨤡] +[radical 166=⾥里:里重𫟯𨤣𨤤野䤚𨤢𨤥𫒁𮡒量𨤦-𨤩𫒂𬪼𬪽𮡓𨤪𨤫𬪾𮡔-𮡖𨤬𫒃𮡗𮡘𨤭-𨤯𮡙𨤰𨤱𮡚𡣢𨤲𨤳𫒄𬪿𬫀釐𨤴-𨤷𮡛𫒅𮡜𮡝𥣷𨤸𬫁𮡞-𮡢𨤹𨤺𮡣𨤻𨤼] +[radical 167=⾦金:金-釢䤛𨤽-𨥁釣-釼䤜𨥂-𨥉𫒆-𫒉𮡤-𮡦釽-鈬䤝-䤠𨥊-𨥤𫒊-𫒎𬫂-𬫅𮡧-𮡭鈭-鉴銏龯䤡-䤣𨥥-𨦁𫒏-𫒔𬫆-𬫌𮡮-𮡰鉵-鉻鉽-銎銐-銱䤤-䤪𨦂-𨦝𨦟-𨦫𫒕-𫒜𫟰𬫍-𬫓𮡱-𮡷銲-鋶﨧䤫-䤲𨦬-𨧥𫒝-𫒥𬫔-𬫠𮡸-𮢁鉼鋷-錧錩-鍆鍈龬﨨䤳-䤶𨧦-𨨮𫒦-𫒯𬫡-𬫬𮢂-𮢘錨鍇鍉-鎇䤷-䤼𨨯-𨪆𫒰-𫒷𬫭-𬫲𮢙-𮢧鎈-鎨鎪-鎿龲䤽-䥇𨪇-𨫎𫒸-𫒾𫟱𬫳-𬫾𮢨-𮢳鎩鏀-鏲鏹䥈-䥓𨫏-𨬌𫒿-𫓃𬫿-𬬄𮢴-𮢽鏳鏵-鏸鏺-鐨䥔-䥜𨬍-𨬔𨬖-𨭔𫓄-𫓎𬬅-𬬊𮢾-𮣎鏴鐩-鑁䥝-䥦𨬕𨭕-𨮑𫓏-𫓕𬬋-𬬑𮣏-𮣘鑂-鑔鑧䥧-䥮𨮒-𨮷𫓖-𫓚𬬒-𬬗𮣙-𮣝鑕-鑦䥯-䥴𨮸-𨯜𫓛𫓜𬬘-𬬛𮣞-𮣤鑨-鑬䥵-䥷𨯝-𨯹𫓝-𫓟𬬜-𬬞𮣥-𮣩鑭-鑳䥸𨯺-𨰈𨰱𫓠-𫓢𬬟𬬠𮣪𮣫鑴-鑺𨰉-𨰝𫓣𬬡𬬢𮣬𮣭鑻-鑿𨰞-𨰨𫓤𮣮钀-钂𨰩-𨰰𬬣𮣯钃钄䥹𨰲-𨰶𬬤𨰷-𨰹𬬥𨰺𬬦𨰻𮣰𨰼𨰽𮣱] +[radical 167'=⻐钅:钅-钌𫓥𫟲钍-钗𨰾𨰿𫓦𫟳𬬧-𬬪𮣲钘-钯䥺-䥼𨱀-𨱂𫓧-𫓫𫟴𫟵𬬫-𬬶𮣳钰-铎䥽-䥿𨱃-𨱆𫓬-𫓮𫟶𫟷𬬷-𬭂铏-铷䦀𫓯-𫓴𫟸-𫟻𬭃-𬭉铸-锕鿏䦁𨱇𨱈𫓵-𫓷𫟼𬭊-𬭐𮣴锖-锱𨱉-𨱌𫓸-𫓿𫟽𬭑-𬭝𮣵锲-镅𨱎𫔀-𫔄𫟾𫟿𬭞-𬭥镆-镕鿔䦂𨱍𨱏𫔅-𫔈𫠀𬭦-𬭫𮣶镖-镠𨱐𨱒𫔉𫔊𬭬-𬭲镡-镫䦃-䦅𨱑𨱓𨱔𫔋-𫔏𬭳-𬭹镬-镱𨱕𨱖𫔐𫔑𬭺-𬭽𮣷镲𫔒𫠁𬭾镳镴𬭿𫔓𬮀镵镶𬮁𫔔𫔕𬮂䦆𬮃] +[radical 168=⾧長:長镸𨱗-𨱙镹䦇𮣸镺𨱚-𨱥𮣹𮣺镻䦈䦉𨱦-𨱱𮣻䦊𨱲-𨱿𫔖𬮄𮣼𮣽𨲀-𨲆𮣾𮣿镼𨲇-𨲒𫔗𮤀𮤁𡑺𨲓-𨲕𨲗-𨲝𨲖𨲞-𨲤𮤂䦋𨲥-𨲬𮤃𮤄镽𨲭-𨲷𮤅𮤆镾𨲸-𨳆] [radical 168'=⻓长:长] -[radical 169=⾨門:門𨳇𨳈閁閂𨳉𫔘閃-閅𨳊-𨳏𬮅閆-閊䦌䦍𨳐-𨳖𫔙𬮆開-閗䦎-䦑𨳗-𨳲𫔚𫔛𬮇𬮈閘-閠䦒-䦔𨳳-𨴌𫔜-𫔠𬮉閡-閪䦕-䦛𨴍-𨴦閫-閴䦜-䦟𨴧-𨵇𫔡-𫔤𬮊-𬮌閵閶閸-闂䦠-䦨𨵈-𨵤𫔥-𫔧閷闃-闏䦩-䦯𨵥-𨵿𫔨𬮍𬮎闐-闘𨶀-𨶛𬮏-𬮑闙-闝䦰𨶜-𨶫𫔩𬮒闞-闡䦱𨶬-𨷂𬮓闢-闦䦲-䦴𨷃-𨷓𨷕-𨷗𫔪𬮔𬮕闧䦵𨷔𨷘-𨷞𬮖𨷟-𨷥𬮗𨷦-𨷮𨷶𨷯-𨷵𨷸𫔫𨷷𨷹-𨷾] -[radical 169'=⻔门:门-闪𬮘闫-闯𨷿-𨸁𫔬𬮙-𬮛闰-闷𨸂𨸃𫔭-𫔯𬮜-𬮟闸闹𫔰𫠂𬮠𬮡闺-阂䦶𨸄𨸅𫔱𬮢-𬮧阃-阆䦷𫔲𫔳𬮨-𬮪阇-阐𫔴𬮫-𬮰阑-阕䦸𨸆-𨸈𬮱-𬮵阖-阙𨸉𨸊𫔵𫔶阚𫔷𫔸𬮶𬮷𨸋𨸌𬮸𬮹阛𨸍𫔹𨸎] -[radical 170=⾩阜:阜阝𨸏阞队䦹䦺𨸐-𨸕阠-阤䦻𨸖-𨸙𫔺𬮺阥-阶䦼-䧀𠁲𨸚-𨸩𫔻𬮻-𬮽阷-陉䧁-䧃𨸪-𨹀𫔼𫔽𬮾陊-陕䧄-䧈𨹁-𨹗𫔾-𫕀𬮿𬯀陖-陙陛-险䧉-䧏𨹘-𨹳𫕁-𫕃𬯁-𬯃陚陪-険䧐-䧖𨹵-𨺝𫕄𫕅𬯄-𬯊陻-隐䧗-䧙𨺞-𨺿𫕆-𫕍𫠃𬯋-𬯏隑-隙﨩䧚-䧟𨻀-𨻭𫕎𫕏𬯐-𬯓隚-隡䧠-䧣𨻮-𨼉𫕐-𫕓𬯔-𬯘隢-隥䧤-䧦䧩𨼊-𨼩𫕔-𫕗𬯙-𬯛隦-隫䧧䧨䧪𨼪-𨼾𬯜-𬯟隬-隲䧫-䧭𨼿-𨽌𬯠隳𨽍-𨽕𬯡隴䧮𨽖-𨽡𫕘隵䧯𨽢-𨽥𬯢-𬯤䧰𨽦-𨽫𬯥-𬯧𨽬𨽭𬯨𨽮-𨽱𬯩𨽲-𨽵] -[radical 171=⾪隶:隶𨽶-𨽻𫕙隷𨽼-𨽾隸𨽿-𨾄] -[radical 172=⾫隹:隹-难䧱𨾅-𨾇隿雀䧲䧳𨾈-𨾑雁-雈䧴-䧶𨾒-𨾟𫕚𬯪雉-雏䧷-䧺𨾠-𨾱𬯫雐-雒䧻𨾲-𨿊𫕛𬯬𬯭雓䧼䧽𨿋-𨿟𬯮雔雕䧾䧿𨿠-𨿾𬯯𬯰雖䨁䨂𨿿-𩀖𬯱雗-雠䨃𩀗-𩀣𫕜雡-難䨄𩀤-𩀳䨅-䨇𩀴-𩁆𬯲-𬯴雤𩁇-𩁒䨈𩁓-𩁛𬯵𬯶𩁜-𩁥𬯷雥雦𩁦-𩁫䨉𩁬-𩁱雧𩁲𩁳䨊𩁴𩁵] -[radical 173=⾬雨:雨𩁶-𩁸𫕝雩-雫䨋𩁹-𩂁𫕞𬯸雬-雳䨌䨍𩂂-𩂑𫕟𫕠𬯹𬯺雴-雾䨎𩂒-𩂡𫕡𫕢𬯻雿-霁䨏-䨖𩂢-𩂶𫕣𫕤霂-霊䨗-䨙𩂷-𩃑𫕥𫕦𬯼𬯽霋-霗䨚-䨝𩃒-𩃴𫕧𫕨𬯾-𬰃霘-霠䨞-䨤𩃵-𩃽𩃿-𩄖𫕩𫕪𬰄-𬰇霡-霥䨥-䨪𩃾𩄗-𩄭𩄯-𩄺𫕫𬰈霦-霭䨫-䨯𩄻-𩅜𫕬𫕭𬰉𬰊霮-霴䨰䨱𩅝-𩅻𫕮-𫕱𬰋-𬰍霵-霻𩅼-𩆐𫕲𬰎-𬰐霼-靀䨲-䨴𩆑-𩆣𫕳𫕴𬰑-𬰔靁䨵䨶𩆤-𩆬靂-靈䨷𩆭-𩆴𫕵𫕶靉䨸𩆵-𩆾靊𩆿-𩇇靋-靎䨹𬰕𩇈𩇉靏𩇊-𩇎𫕷𬰖𩇏-𩇑䨺𩇒靐𩇓𩇔䨻] -[radical 174=⾭靑:靑青𩇕𫕸靓靔𩇖𩇗靕靖𩇘-𩇛𫕹𫕺𬰗𬰘靗-静𩇜靚-靜𩇝𩇞𫕻𩇟靝𩇠𩇡𫕼𩇢𩇣䨼𩇤𩇥] -[radical 175=⾮非:非𩇦-𩇨䨽䨾𩇩-𩇬𬰙靟䨿𩇭-𩇶𬰚𬰛𩇷𫕽靠䩀𩇸-𩇻𬰜𩇼𩇽𬰝靡𬰞䩁𩇾-𩈁𫕾𬰟𫕿𩈂] -[radical 176=⾯面:面靣𠚑𩈃-𩈅䩂-䩄𩈆-𩈌靤䩅-䩇𩈍-𩈘𫖀𬰠靥𤎂𩈙-𩈠𫖁靦䩈䩉𩈡-𩈪𫖂䩊𩈫-𩈱𬰡𩈲-𩈷𫖃𩈸-𩈺䩋𩈻-𩉀𬰢𬰣靧䩌䩍𩉁-𩉉𫖄䩎𩉊𩉋靨𩉌-𩉐䩏𩉑-𩉚] -[radical 177=⾰革:革靪𩉛𩉜靫-靱䩐-䩒𩉝-𩉠靲-靹䩓-䩘𩉡-𩉷靺-鞆䩙-䩞𩉸-𩊏𫖅𫖆鞇-鞒䩟𩊐-𩊨𫖇𫖈𬰤鞓-鞙䩠-䩧𩊩-𩊾𬰥鞚-鞡䩨-䩮𩊿-𩋞𬰦鞢-鞰䩯-䩵𩋟-𩌂𬰧鞱-鞷䩶-䩻𥌕𩌃-𩌥鞸-鞻䩼-䩾𩌦-𩍂𫖉鞼-鞿䩿-䪄𩍃-𩍒𫖊𬰨𬰩韀-韃䪅䪆𩍓-𩍤𫖋韄韅䪇䪈𩍥-𩍱韆-韈䪉𩍲-𩍷䪊䪋𩍸-𩍺𩍼-𩍾韉䪌䪍𩍿-𩎆䪎𩎇-𩎊韊𩎋-𩎑] -[radical 178=⾱韋:韋𫖌韌𩎒䪏𩎓-𩎗𫖍𬰪韍韎䪐-䪓𩎘-𩎣韏-韑𩎤-𩎮𫠄𬰫-𬰭韒䪔𩎯-𩎷韓-韕䪕𩎸-𩏄𫖎韖-韚䪖-䪘𩏅-𩏎𬰮韜-韟䪙䪚𩏏-𩏗韛韠𩏘-𩏟𫖏韡韢䪛𩏠-𩏧韣䪜𩏨-𩏭䪝𩏮-𩏱𬰯韤韥𩏲𩏳𫖐𩏴𩏵𬰰𩏶-𩏻] -[radical 178'=⻙韦:韦韧𬰱𩏼𫖑𬰲韨𩏽𩏾𬰳𬰴𫖒韩𫖓韪韫𩏿𩐀𫠅𬰵韬𫖔-𫖖𬰶-𬰸] +[radical 169=⾨門:門𨳇𨳈閁閂𨳉𫔘閃-閅𨳊-𨳏𬮅閆-閊䦌䦍𨳐-𨳖𫔙𬮆𮤇開-閗䦎-䦑𨳗-𨳲𫔚𫔛𬮇𬮈𮤈𮤉閘-閠䦒-䦔𨳳-𨴌𫔜-𫔠𬮉𮤊-𮤍閡-閪䦕-䦛𨴍-𨴦𮤎𮤏閫-閴䦜-䦟𨴧-𨵇𫔡-𫔤𬮊-𬮌閵閶閸-闂䦠-䦨𨵈-𨵤𫔥-𫔧𮤐-𮤖閷闃-闏䦩-䦯𨵥-𨵿𫔨𬮍𬮎𮤗-𮤛闐-闘𨶀-𨶛𬮏-𬮑𮤜-𮤞闙-闝䦰𨶜-𨶫𫔩𬮒𮤟-𮤡闞-闡䦱𨶬-𨷂𬮓𮤢-𮤥闢-闦䦲-䦴𨷃-𨷓𨷕-𨷗𫔪𬮔𬮕𮤦𮤧闧䦵𨷔𨷘-𨷞𬮖𮤨𨷟-𨷥𬮗𨷦-𨷮𨷶𮤩𨷯-𨷵𨷸𫔫𮤪𨷷𨷹-𨷾] +[radical 169'=⻔门:门-闪𬮘𮤫闫-闯𨷿-𨸁𫔬𬮙-𬮛𮤬𮤭闰-闷𨸂𨸃𫔭-𫔯𬮜-𬮟𮤮-𮤰闸闹𫔰𫠂𬮠𬮡𮤱𮤲闺-阂䦶𨸄𨸅𫔱𬮢-𬮧𮤳阃-阆䦷𫔲𫔳𬮨-𬮪阇-阐𫔴𬮫-𬮰𮤴-𮤶阑-阕䦸𨸆-𨸈𬮱-𬮵𮤷阖-阙𨸉𨸊𫔵𫔶阚𫔷𫔸𬮶𬮷𨸋𨸌𬮸𬮹𮤸阛𨸍𫔹𨸎] +[radical 170=⾩阜:阜阝𨸏阞队䦹䦺𨸐-𨸕阠-阤䦻𨸖-𨸙𫔺𬮺𮤹阥-阶䦼-䧀𠁲𨸚-𨸩𫔻𬮻-𬮽𮤺𮤻阷-陉䧁-䧃𨸪-𨹀𫔼𫔽𬮾𮤼-𮤿陊-陕䧄-䧈𨹁-𨹗𫔾-𫕀𬮿𬯀𮥀-𮥅陖-陙陛-险䧉-䧏𨹘-𨹳𫕁-𫕃𬯁-𬯃𮥆-𮥋陚陪-険䧐-䧖𨹵-𨺝𫕄𫕅𬯄-𬯊𮥌-𮥑陻-隐䧗-䧙𨺞-𨺿𫕆-𫕍𫠃𬯋-𬯏𮥒隑-隙﨩䧚-䧟𨻀-𨻭𫕎𫕏𬯐-𬯓𮥓-𮥚隚-隡䧠-䧣𨻮-𨼉𫕐-𫕓𬯔-𬯘𮥛-𮥟隢-隥䧤-䧦䧩𨼊-𨼩𫕔-𫕗𬯙-𬯛𮥠-𮥤隦-隫䧧䧨䧪𨼪-𨼾𬯜-𬯟𮥥-𮥩隬-隲䧫-䧭𨼿-𨽌𬯠𮥪-𮥮隳𨽍-𨽕𬯡𮥯隴䧮𨽖-𨽡𫕘𮥰隵䧯𨽢-𨽥𬯢-𬯤𮥱䧰𨽦-𨽫𬯥-𬯧𨽬𨽭𬯨𨽮𨽯𮥲𨽰𨽱𬯩𮥳鿧𨽲-𨽵] +[radical 171=⾪隶:隶𮥴𨽶-𨽻𫕙隷𨽼-𨽾隸𨽿𮥵𨾀-𨾄] +[radical 172=⾫隹:隹-难䧱𨾅-𨾇隿雀䧲䧳𨾈-𨾑𮥶雁-雈䧴-䧶𨾒-𨾟𫕚𬯪𮥷-𮥺雉-雏䧷-䧺𨾠-𨾱𬯫𮥻雐-雒䧻𨾲-𨿊𫕛𬯬𬯭雓䧼䧽𨿋-𨿟𬯮𮥼雔雕䧾䧿𨿠-𨿾𬯯𬯰𮥽-𮥿雖䨁䨂𨿿-𩀖𬯱𮦀雗-雠䨃𩀗-𩀣𫕜𮦁雡-難䨄𩀤-𩀳䨅-䨇𩀴-𩁆𬯲-𬯴雤𩁇-𩁒䨈𩁓-𩁛𬯵𬯶𩁜-𩁥𬯷雥雦𩁦-𩁫𮦂䨉𩁬-𩁱𮦃雧𩁲𩁳䨊𩁴𩁵] +[radical 173=⾬雨:雨𮦄𩁶-𩁸𫕝雩-雫䨋𩁹-𩂁𫕞𬯸𮦅雬-雳䨌䨍𩂂-𩂑𫕟𫕠𬯹𬯺𮦆-𮦉雴-雾䨎𩂒-𩂡𫕡𫕢𬯻𮦊-𮦍雿-霁䨏-䨖𩂢-𩂶𫕣𫕤𮦎𮦏霂-霊䨗-䨙𩂷-𩃑𫕥𫕦𬯼𬯽𮦐-𮦓霋-霗䨚-䨝𩃒-𩃴𫕧𫕨𬯾-𬰃𮦔-𮦛霘-霠䨞-䨤𩃵-𩃽𩃿-𩄖𫕩𫕪𬰄-𬰇𮦜-𮦣霡-霥䨥-䨪𩃾𩄗-𩄭𩄯-𩄺𫕫𬰈𮦤-𮦫霦-霭䨫-䨯𩄻-𩅜𫕬𫕭𬰉𬰊𮦬霮-霴䨰䨱𩅝-𩅻𫕮-𫕱𬰋-𬰍𮦭-𮦲霵-霻𩅼-𩆐𫕲𬰎-𬰐𮦳-𮦶霼-靀䨲-䨴𩆑-𩆣𫕳𫕴𬰑-𬰔𮦷-𮦻靁䨵䨶𩆤-𩆬𮦼靂-靈䨷𩆭-𩆴𫕵𫕶𮦽靉䨸𩆵-𩆾𮦾靊𩆿-𩇇𮦿靋-靎鿨䨹𬰕𮧀𮧁𩇈𩇉靏𩇊-𩇎𫕷𬰖𮧂𩇏-𩇑䨺𩇒靐𩇓𩇔䨻] +[radical 174=⾭靑:靑青𩇕𫕸靓靔𩇖𩇗靕靖𩇘-𩇛𫕹𫕺𬰗𬰘𮧃靗-静𩇜靚-靜𩇝𩇞𫕻𩇟靝𩇠𩇡𫕼𩇢𩇣䨼𩇤𩇥] +[radical 175=⾮非:非𩇦-𩇨䨽䨾𩇩-𩇬𬰙靟䨿𩇭-𩇴𮧄𩇵𩇶𬰚𬰛𮧅𮧆𩇷𫕽𮧇靠䩀𩇸-𩇻𬰜𩇼𩇽𬰝靡𬰞䩁𩇾-𩈁𫕾𬰟𮧈𫕿𩈂] +[radical 176=⾯面:面靣𠚑𩈃-𩈅𮧉䩂-䩄𩈆-𩈌靤䩅-䩇𩈍-𩈘𫖀𬰠𮧊𮧋靥𤎂𩈙-𩈠𫖁𮧌靦䩈䩉𩈡-𩈪𫖂𮧍䩊𩈫-𩈱𬰡𮧎𩈲-𩈷𫖃𮧏𩈸-𩈺䩋𩈻-𩉀𬰢𬰣𮧐靧䩌䩍𩉁-𩉉𫖄𮧑𮧒䩎𩉊𩉋靨𩉌-𩉐䩏𩉑-𩉚] +[radical 177=⾰革:革𮧓靪𩉛𩉜靫-靱䩐-䩒𩉝-𩉠靲-靹䩓-䩘𩉡-𩉷𮧔靺-鞆䩙-䩞𩉸-𩊏𫖅𫖆𮧕-𮧗鞇-鞒䩟𩊐-𩊨𫖇𫖈𬰤𮧘𮧙鞓-鞙䩠-䩧𩊩-𩊾𬰥𮧚-𮧝鞚-鞡䩨-䩮𩊿-𩋞𬰦𮧞鞢-鞰䩯-䩵𩋟-𩌂𬰧𮧟-𮧢鞱-鞷䩶-䩻𥌕𩌃-𩌥𮧣-𮧥鞸-鞻䩼-䩾𩌦-𩍂𫖉𮧦-𮧩鞼-鞿䩿-䪄𩍃-𩍒𫖊𬰨𬰩𮧪𮧫韀-韃䪅䪆𩍓-𩍤𫖋𮧬𮧭韄韅䪇䪈𩍥-𩍱韆-韈䪉𩍲-𩍷䪊䪋𩍸-𩍺𩍼-𩍾韉䪌䪍𩍿-𩎆䪎𩎇-𩎊韊𩎋-𩎑] +[radical 178=⾱韋:韋𮧮-𮧰𫖌韌𩎒䪏𩎓-𩎗𫖍𬰪韍韎䪐-䪓𩎘-𩎣韏-韑𩎤-𩎮𫠄𬰫-𬰭𮧱韒䪔𩎯-𩎷韓-韕䪕𩎸-𩏄𫖎韖-韚䪖-䪘𩏅-𩏎𬰮𮧲韜-韟䪙䪚𩏏-𩏗韛韠𩏘-𩏟𫖏韡韢䪛𩏠-𩏧𮧳韣䪜𩏨-𩏭䪝𩏮-𩏱𬰯韤韥𩏲𩏳𫖐𩏴𩏵𬰰𩏶-𩏻] +[radical 178'=⻙韦:韦韧𬰱𩏼𫖑𬰲𮧴韨𩏽𩏾𬰳𬰴𫖒𮧵韩𫖓韪韫𩏿𩐀𫠅𬰵韬𫖔-𫖖𬰶-𬰸] [radical 179=⾲韭:韭韮䪞𩐁𩐂韯䪟𩐃韰𩐄韱䪠𩐅-𩐈韲䪡䪢𩐉𩐊䪣𩐋𩐍𩐎䪤𩐌𩐏-𩐓䪥𩐔-𩐖] -[radical 180=⾳音:音竟章䪦-䪨𩐗韴韵䪩𩐘𩐙𫖗韶韷䪪𩐚-𩐝𫖘𬰹-𬰻𩐞-𩐦𬰼韸䪫䪬𩐧-𩐬𬰽𩐭-𩐰韹韺䪭𩐱-𩐴𫖙韻韼䪮䪯𩐵-𩐸韽-響𩐹-𩐾𫖚𩐿-𩑁𫖛䪰𩑂-𩑆頀𩑇𩑈𫖜𬰾𩑉𩑊] -[radical 181=⾴頁:頁𩑋頂-頄𩑌-𩑏𬰿項-頉䪱䪲𩑐-𩑘𬱀頊-頓頙䪳-䪵𩑙-𩑯𫖝頔-領頚䪶-䪾𩑰-𩒎𫖞𬱁𬱂頛-頣頦-頬䪿-䫂𩒏-𩒭𬱃頤頥頭-頽䫃-䫊𩒮-𩓜𫖟𫖠𬱄-𬱇頿-顊䫋-䫓𩓝-𩓿𫖡𬱈𬱉頾顋-顕䫔-䫝𩔀-𩔘𫖢𫖣𬱊𬱋顖-類䫞-䫧𩔙-𩔲𫖤顟-顣䫨-䫫𩔳-𩕈𫖥𫖦𬱌𬱍顤-顨䫬-䫱𩕉-𩕞𫖧𬱎顩-顫䫲-䫴𩕟-𩕫𫖨𬱏顬-顯𩕬-𩕽顰䫵䫶𩕾-𩖅𫖩𬱐顱顲䫷𩖆-𩖎𬱑顳顴𩖏-𩖓𬱒] +[radical 180=⾳音:音竟章䪦-䪨𩐗𮧶𮧷韴韵䪩𩐘𩐙𫖗韶韷䪪𩐚-𩐝𫖘𬰹-𬰻𮧸𩐞-𩐦𬰼𮧹𮧺韸䪫䪬𩐧-𩐬𬰽𮧻𩐭-𩐰韹韺䪭𩐱-𩐴𫖙𮧼韻韼䪮䪯𩐵-𩐸𮧽韽-響𩐹-𩐾𫖚𩐿-𩑁𫖛𮧾䪰𩑂-𩑆𮧿頀𩑇𩑈𫖜𬰾𩑉𩑊] +[radical 181=⾴頁:頁𩑋頂-頄𩑌-𩑏𬰿項-頉䪱䪲𩑐-𩑘𬱀頊-頓頙䪳-䪵𩑙-𩑯𫖝𮨀-𮨂頔-領頚䪶-䪾𩑰-𩒎𫖞𬱁𬱂𮨃-𮨆頛-頣頦-頬䪿-䫂𩒏-𩒭𬱃𮨇-𮨊頤頥頭-頽䫃-䫊𩒮-𩓜𫖟𫖠𬱄-𬱇𮨋𮨌頿-顊䫋-䫓𩓝-𩓿𫖡𬱈𬱉𮨍-𮨔頾顋-顕䫔-䫝𩔀-𩔘𫖢𫖣𬱊𬱋𮨕𮨖顖-類䫞-䫧𩔙-𩔲𫖤𮨗-𮨛顟-顣䫨-䫫𩔳-𩕈𫖥𫖦𬱌𬱍𮨜𮨝顤-顨䫬-䫱𩕉-𩕞𫖧𬱎𮨞𮨟顩-顫䫲-䫴𩕟-𩕫𫖨𬱏𮨠𮨡顬-顯𩕬-𩕽顰䫵䫶𩕾-𩖅𫖩𬱐𮨢𮨣顱顲䫷𩖆-𩖈𮨤𮨥𩖉-𩖎𬱑顳顴𩖏-𩖓𬱒] [radical 181'=⻚页:页-顷𬱓顸-须𫖪顼-预𫖫𫠆𬱔𬱕颅-颈𫖬𫖭𬱖-𬱚颉-颏𫖮-𫖱𬱛-𬱢颐-颖𫖲𫖳𬱣-𬱥颗𩖕𩖖𫖴-𫖶𬱦-𬱬题-额𫖷𬱭-𬱯颞-颡𫖸𬱰𫖹颢颣𬱱颤𩖗颥𬱲颦𫖺颧𬱳] -[radical 182=⾵風:風䫸𩖘𩖙颩颪䫹𩖚-𩖡颫颬䫺-䫽𩖢-𩖯𩖱-𩖳𫖻颭-颱䫾-䬃𩖴-𩗃𫖼颲颳䬄䬅𠙬𩗄-𩗒颴颵䬆-䬊𩗓-𩗧颶颷䬋-䬐𩗨-𩘄𫖽颸-颺䬑-䬗𩘅-𩘍𩘏-𩘛𫖾𫖿𬱴颻-飀䬘-䬚𩘎𩘜-𩘬𫗀-𫗂飁-飄䬛䬜𩘭-𩘷飅-飊䬝𩘸-𩙇飋𩙈-𩙍𫗃𫗄䬞𩙎-𩙐𫗅䬟𩙑-𩙕𫗆𩙖-𩙜飌飍𩙝-𩙤] -[radical 182'=⻛风:风飏𫗇𫠇𬱵-𬱷飐-飒𩙥𩙦𫠈𬱸-𬱼𩙧𫗈𬱽飓𩙨-𩙪𫗉𬱾-𬲀飔飖𩙫𩙬𫗊𬲁𬲂飕飗𩙭𩙮𬲃𬲄飘-飚𩙯𬲅𬲆𩙰𫗋𬲇𬲈] +[radical 182=⾵風:風䫸𩖘𩖙𮨦颩颪䫹𩖚-𩖡颫颬䫺-䫽𩖢-𩖯𩖱-𩖳𫖻𮨧颭-颱䫾-䬃𩖴-𩗃𫖼𮨨颲颳䬄䬅𠙬𩗄-𩗒𮨩-𮨫颴颵䬆-䬊𩗓-𩗧𮨬颶颷䬋-䬐𩗨-𩘄𫖽𮨭-𮨯颸-颺䬑-䬗𩘅-𩘍𩘏-𩘛𫖾𫖿𬱴颻-飀䬘-䬚𩘎𩘜-𩘬𫗀-𫗂𮨰飁-飄䬛䬜𩘭-𩘷𮨱飅-飊䬝𩘸-𩙇飋𩙈-𩙍𫗃𫗄𮨲䬞𩙎-𩙐𫗅䬟𩙑-𩙕𫗆𩙖-𩙜飌飍𩙝-𩙟𮨳𩙠-𩙤] +[radical 182'=⻛风:风飏𫗇𫠇𬱵-𬱷飐-飒𩙥𩙦𫠈𬱸-𬱼𩙧𫗈𬱽飓𩙨-𩙪𫗉𬱾-𬲀𮨴飔飖𩙫𩙬𫗊𬲁𬲂飕飗𩙭𩙮𬲃𬲄飘𮨵飙飚𩙯𬲅𬲆𩙰𫗋𬲇𬲈] [radical 183=⾶飛:飛𩙱-𩙳𬲉𩙴䬠𫗌䬡𩙵-𩙹飜𩙺-𩙽𬲊飝𩙾] -[radical 183'=⻜飞:飞] -[radical 184=⾷食:食飠𠋑𩙿-𩚁𩚃𩚂飡-飤䬢𩚄-𩚆飥-飨䬣-䬥𩚇-𩚔飩-飲䬦-䬪𩚕-𩚧𫗍𬲋-𬲎飳-飹飻-飿䬫-䬴𩚨-𩛈𫗎飺餀-餏䬵-䬻𩛉-𩛜𫗏-𫗒𬲏-𬲑餐-餙餝䬼-䭂𩛝-𩛹𫗓𬲒-𬲔餚-餜餞-餩䭃-䭇𩛺-𩜢𩜤-𩜬𬲕𬲖餪-餵餷䭈-䭏𩜣𩜭-𩝘𫗔-𫗗𬲗-𬲙餶餸-饃䭐-䭔𩝙-𩝳𩝵-𩝼𫗘饄-饉䭕-䭗𧈐𩝴𩝽-𩞠𫗙𫗚𬲚饊-饓䭘-䭜𡓷𩞡-𩞵𩞷-𩞽𫗛𬲛-𬲞饔-饙䭝-䭠𩞶𩞾-𩟒𬲟𬲠饚-饜䉵䭡-䭤𩟓-𩟣𫗜𫗝䭥𩟤-𩟬𬲡饝𩟭-𩟵饞饟䭦䭧𩟶䭨𩟷-𩟺𬲢𬲣饠饡䭩𬲤𩟻饢𩟼𩟽] -[radical 184'=⻠饣:饣-饥𬲥𬲦饦饧𫗞𬲧𬲨饨-饮𩟾-𩠀𫗟𫗠𬲩𬲪饯-饴𩠁𩠂𫗡-𫗣𬲫-𬲳饵-饼𩠃𫗤𫗥𬲴-𬲷饽-馂𩠄𩠅𩠇𫗦-𫗨𬲸-𬲻馃-馆𩠆𩠈𩠉𫗩𫗪𬲼-𬳂馇馈馊馋𩠊𩠋𫗫-𫗯𬳃-𬳇馉馌-馐𩠌𫗰𫗱𬳈-𬳍馑馒𩠍𩠎𬳎-𬳐馓馔䭪𩠏𫗲𫗳𬳑𬳒𫗴𬳓𬳔𫗵馕] -[radical 185=⾸首:首𩠐馗𩠑-𩠙𫗶䭫䭬𩠚-𩠠𬳕𬳖𩠡-𩠧𫗷𬳗𬳘馘𩠨𩠩𫗸𬳙䭭𩠪-𩠭䭮𩠯𩠱𫗹𬳚𩠲𫗺𩠳𩠴𬳛𩠵-𩠷𫗻𩠸𩠹] -[radical 186=⾹香:香𩠺馚𩠻-𩠽𬳜馛-馝䭯𩠾-𩡁𩡃𩡄𩡂𩡅𩡆𫗼𫗽馞-馠𩡇𩡈馡-馣䭰-䭲𩡉-𩡋𩡏𫗾𬳝𬳞馤馥𩡌-𩡎𩡐-𩡒𫗿𬳟𬳠馦馧𩡓-𩡘𬳡-𬳣馨𩡙-𩡜𫘀𫘁𬳤-𬳦馩𩡝-𩡡𫘂𬳧𩡢𩡣𫘃馪𩡤𥗶𩡥馫䭳𩡦𫘄] -[radical 187=⾺馬:馬𩡧𫠉𩡨馭馮䭴𩡩-𩡯馯-馵䭵䭶𩡰-𩡶𫘅𬳨馶-駇䭷-䭾𩡷-𩡾𩢀-𩢅𩢇-𩢌𫘆-𫘉𬳩𬳪駈-駠䭿-䮅𩡿𩢆𩢍-𩢭駡-駲䮆-䮍𩢮-𩣕𫘊𬳫駴-騃䮎-䮒𩣖-𩣬𩤷𬳬駳騄-験䮓-䮛𩣭-𩤖𩤞𫘋-𫘎𬳭-𬳯騔-騨䮜-䮢𩤗-𩤝𩤟-𩤶𩤸-𩤼𫘏-𫘑騩-騸䮣-䮩𩤽-𩥪𫘒-𫘖騹-驇龭䮪-䮱𩥫-𩦁𬳰驈-驕䮲-䮶𩦂-𩦝𫘗𬳱驖-驜䮷-䮹𩦞-𩦵𫘘驝-驟䮺-䮼𩦶-𩧁𫘙䮽𩧂-𩧎驠-驣䮾𩧏-𩧓驤-驧龮䮿𩧔-𩧗𫘚驨驩䯀𩧘-𩧞驪䯁𩧟𩧠驫𩧡-𩧤𬳲䯂𩧥] -[radical 187'=⻢马:马-驰𫘛驱-驴𩧦𫘜𫘝𬳳驵-骀𩧧-𩧭𩧯𫘞𫘟𫠊𬳴-𬳸骁-骉䯃𩧮𩧰-𩧶𫘠𫘡𬳹-𬳾骊-骏䯄𩧷-𩧺𫘢-𫘤𬳿𬴀骐-骖𩧻-𩧽𫘥-𫘧𬴁𬴂骗-骛𩧾-𩨃𩨅-𩨊𫘨𫘩𬴃𬴄骜-骟䯅𩨄𩨋-𩨍𫘪-𫘬𬴅骠-骢𫘭𫘮𫠋𬴆-𬴈骣𩨎𩨏𫘯𬴉𬴊𫘰𫠌𬴋骤𬴌𩨐𬴍骥𬴎骦骧𬴏𫘱𬴐] -[radical 188=⾻骨:骨䯆骩䯇𩨑-𩨓骪-骮𩨔-𩨛骯-骱䯈䯉𩨜-𩨫骲-骷䯊-䯎𩨬-𩨼骸-骼䯏-䯔𩨽-𩩈𫘲骽骾䯕-䯚𩩉-𩩖𬴑𬴒骿-髁䯛䯜𩩗-𩩬髂-髅䯝-䯠𩩭-𩩿𫘳𫘴髆-髌䯡𩪀-𩪈髍-髏䯢𩪉-𩪖髐䯣𩪗-𩪟髑-體䯤𩪠-𩪫髕䯥𩪬-𩪱髖䯦𩪲-𩪶髗𩪷-𩪺𬴓𩪻-𩪾] -[radical 189=⾼高:高髙䯧𫘵𬴔䯨𩪿𩫀髚䯩𩫁-𩫉𬴕髛𩫊-𩫍𫘶𩫎-𩫔𫘷𬴖𬴗𩫕-𩫙𬴘髜𩫚-𩫝𬴙𬴚䯪𩫞-𩫤𬴛𩫥𩫦𬴜髝䯫𩫧𬴝-𬴟髞𩫨-𩫪𬴠𩫫𩫬𬴡䯬𩫭𬴢𩫮𩫯𬴣𩫰-𩫲𬴤-𬴦𩫳] -[radical 190=⾽髟:髟𫘸髠䯭䯮𩫴-𩫸髡髢𩫹-𩫾𫘹𫘺髣-髪䯯-䯴𩫿-𩬐𫘻𬴧髫-髴䯵䯶𩬑-𩬯𫘼髵-髻鬇䯷䯸𩬰-𩭆𫘽𬴨𬴩髼-鬂䯹-䯼𩭇-𩭝𫘾𫘿𬴪鬃-鬆鬈䯽-䰃𩭞-𩭹𫙀𫙁𬴫𬴬鬉-鬏䰄-䰇𩭺-𩮕𫙂𬴭𬴮鬐-鬓䰈-䰋𩮖-𩮮鬔-鬘鬝䰌䰍𩮯-𩯂𫙃鬙-鬜䰎𩯃-𩯚鬞-鬠𩯛-𩯥𬴯鬡鬢䰏-䰒𩯦-𩯯鬣䰓䰔𩯰-𩯹䰕𩯺-𩰀鬤𩰁-𩰇䰖𩰈𩰉] -[radical 191=⾾鬥:鬥𩰊-𩰌鬦𩰍-𩰏鬧𩰐鬨𩰑𩰒鬩𩰓𩰔𬴰鬪䰗𩰕䰘𩰖-𩰘鬫𩰙-𩰛鬬鬭𩰜-𩰞𬴱鬮𩰟] -[radical 192=⾿鬯:鬯𩰠-𩰨鬰𩰩𩰪鬱] -[radical 193=⿀鬲:鬲𬴲𩰫𩰬𬴳䰙䰚𩰭𩰮𫙄䰛𩰯𩰰𫙅𬴴鬳䰜𩰱-𩰸𬴵鬴𩰹-𩰽𬴶鬵鬶𩰾-𩱂鬷𩱃-𩱆𬴷鬸𩱇-𩱋鬹鬺𩱌-𩱑𫙆鬻䰝𩱒-𩱕𬴸𩱖-𩱣𬴹䰞𩍻𩱤𩱥𬴺𩱦-𩱮𫙇𩱯-𩱳𬴻𬴼𩱴-𩱸] -[radical 194=⿁鬼:鬼𩱹-𩱼𫙈𬴽鬽𩱽-𩲉𬴾鬾-魂䰟𩲊-𩲠𫙉魃-魆䰠䰡𩲡-𩲹魇䰢䰣𩲺-𩳋𫙊𬴿魈魉𩳌-𩳡𫙋𬵀魊-魏䰤-䰧𩳢-𩳴𫙌𫙍䰨䰩𩳵-𩴅魐䰪𩴆-𩴏魑-魔𩴐-𩴛魕魖䰫-䰭𩴜-𩴭𫙎䰮𩴮-𩴰魗-魙䰯䰰𩴱-𩵊䰱] -[radical 195=⿂魚:魚𤋳𩵋䰲魛-魞䰳𩵌-𩵓𫙏𬵁𬵂魟-魢䰴-䰶𩵔-𩵟𩶷𫙐𬵃𬵄魣-魹䰷-䰾𩵠-𩶀𫙑𫙒𬵅𬵆魺-鮘鮣䰿-䱉𩶁-𩶠𩾀𫙓-𫙗𬵇-𬵌鮙-鮢鮤-鮴鮺䱊-䱎𩶡-𩶶𩶸-𩷌𫙘-𫙟𬵍-𬵑鮵-鮹鮻-鯓鯽䱏-䱘𩷍-𩷶𩾉𫙠-𫙣𬵒-𬵖鯔-鯵鯻䱙-䱪𩷷-𩸽𫙤-𫙧𬵗-𬵛鯶-鯺鯼鯾-鰛鰠䱫-䱴𩸾-𩹰𫙨-𫙪𬵜-𬵟鰜-鰟鰡-鰰鿐䱵-䱽𩹱-𩺬𫙫-𫙯𫠍𬵠-𬵣鰱-鱈鷠䱾-䲈𩺭-𩻗𫙰-𫙶𬵤-𬵩鱉-鱛䲉-䲏𩻘-𩼁𫙷-𫙼𬵪-𬵭鱜-鱧鱩-鱫䲐-䲕𩼂-𩼤𩾍𫙽-𫚁𫠎𬵮-𬵱鱨鱬-鱰䲖-䲘𩼥-𩼺𫚂𫚃𬵲-𬵵鱱-鱶䲙𩼻-𩽌𫚄𬵶鱷鱸䲚䲛𩽍-𩽙𬵷-𬵹𩽚-𩽦𫚅𬵺鱹𩽧-𩽯𬵻𬵼鱺𩽰-𩽲𫚆𬵽𬵾𩽳-𩽸𫚇𬵿鱻䲜] -[radical 195'=⻥鱼:鱼鱽𬶀𬶁鱾𫚈-𫚊𬶂-𬶄鱿-鲃鿕䲝𩽹-𩽻𫚋-𫚍𫠏𬶅-𬶉鲄-鲐䲞䲟𫚎-𫚒𫠐𬶊-𬶍鲑-鲟𩽼-𩽿𫚓-𫚘𬶎-𬶐鲠-鲬𩾁-𩾄𫚙-𫚛𬶑-𬶕鲭-鲻𩾅-𩾈𫚜-𫚡𬶖𬶗𬶙-𬶝鲼鲽鲿-鳋䲠䲡𩾊𩾋𫚢-𫚥𫠑𬶘𬶞-𬶨鲾鳌-鳒䲢-䲤𫚦𬶩𬶪鳓-鳛𩾌𫚧𫚨𫠒𬶫-𬶭鳜-鳟𫚩𫚪𬶮-𬶴鳠-鳣𫚫𬶵𬶶鳤𫚬𬶷𩾎𫚭𬶸-𬶻] -[radical 196=⿃鳥:鳥𫠓鳦𩾏-𩾑𫚮鳧-鳰䲥𩾒-𩾜𬶼鳱-鳶䲦-䲫𩾝-𩾯𬶽-𬶿鳷-鴉鴋-鴎䲬-䲸𩾰-𩿛𫚯-𫚲𬷀-𬷄鴊鴏-鴬䲹-䳊𩿜-𪀑𫚳-𫚷𫠔𬷅-𬷌鴭-鵉䳋-䳔𪀒-𪁉𫚸-𫚻𬷍-𬷒鵊-鵣鵥䳕-䳜𪁊-𪁶𫚼-𫛀𬷓𬷔𬷖-𬷛鵦-鶏鶑䳝-䳥𪁷-𪂵𫛁-𫛈𬷜-𬷡鶐鶒-鶫䳦-䳰𪂶-𪃹𫛉-𫛋𬷢-𬷧鶬-鷊鷌-鷏䳱-䳶𪃺-𪄬𫛌-𫛏𬷨-𬷭鷋鷐-鷟䳷-䳽𪄭-𪅮𫛐𫠕𬷮-𬷰鷡-鷸鷺-鷼䳾-䴆𪅯-𪆫𪆭𫛑-𫛕𬷱-𬷳鷹鷽-鸊䴇-䴋𪆬𪆮-𪇐𫛖𬷴-𬷶鸋-鸒䴌䴍𪇑-𪇝𪇟-𪇬𫛗𬷷鸓鸔䴎𪇭-𪈂𫛘𬷸鸕-鸗䴏𪈃-𪈗𬷹鸘-鸚𪈘-𪈤鸛鸜𪈥-𪈭鸝鸞𧖠𪈮-𪈳𫛙䴐𩖔𪈴-𪈷𬷺𪈸-𪈽䴑䴒𪈾-𪉀] -[radical 196'=⻦鸟:鸟𬷻鸠鸡𬷼𬷽鸢-鸤𬷾鸥-鸩䴓𪉁-𪉃𫛚-𫛞𫠖𬷿𬸀鸪-鸶𪉄𫛟-𫛤𬸁-𬸇鸷-鸿䴔䴕𪉅-𪉋𫛥-𫛪𬸈-𬸌鹀-鹈𪉌𪉍𫛫-𫛯𬷕𬸍-𬸑鹉-鹔䴖𪉎𫛰-𫛵𬸒-𬸗鹕-鹗鹙-鹜䴗𪉏𪉐𫛶-𫛼𬸘-𬸟鹘鹝-鹤䴘𪉑-𪉔𫛽𫛾𬸠-𬸣鹥-鹨𫛿-𫜂𬸤-𬸦鹩-鹬𫜃𫜄𬸧-𬸫鹭-鹰䴙𫜅𬸬-𬸯鹱鹲𫜆𪉕𬸰鹳鹴𬸱] -[radical 197=⿄鹵:鹵𠧸𪉖𪉗鹶䴚𪉘-𪉛𬸲鹷𪉜-𪉢𫜇䴛𪉣-𪉥𫜈𬸳鹸𪉦-𪉬鹹𪉭-𪉴𫜉鹺鹻䴜𪉵-𪉾䴝𪉿-𪊂鹼鹽𪊃-𪊅𬸴䴞𪊆-𪊊] -[radical 197'=⻧卤:𬸵𫠗𬸶鹾𫜊𬸷-𬸹] -[radical 198=⿅鹿:鹿𢉖𬸺麀-麂𪊋𪊌𫜋䴟𪊍𪊎麃麄䴠-䴢𪊏-𪊚𫜌𬸻麅-麈䴣-䴥𪊛-𪊤𬸼麉-麋𪊥-𪊳𫜍𬸽𬸾麌-麐䴦𪊴-𪋃𫜎麑-麗䴧𪋄-𪋍𬸿麘-麛𪋎-𪋖麜麝䴨𪋗-𪋛𬹀麞䴩𪋜-𪋠𬹁麟𪋡-𪋩𫜏麠䴪䴫𪋪-𪋭麡𪋮-𪋵麢𪋶-𪋸麣𪋹麤𪋺𪋻] -[radical 199=⿆麥:麥𪋼-𪌀麧䴬-䴮𪌁-𪌄麨-麫䴯䴰𪌅-𪌓麬-麮䴱-䴴𪌔-𪌚𪌜-𪌡麯麰䴵𪌢-𪌬𬹂麱麲䴶-䴸𪌭-𪌻麳麴䴹-䴽𪌼-𪍋𫜐𬹃麵𪍌-𪍚䴾-䵀𪍛-𪍢麶䵁䵂䵅𪍣-𪍱䵃𪍲-𪍷𬹄䵄𪍸-𪍾䵆𪍿-𪎅麷𪎆𪎇] -[radical 199'=⻨麦:麦𪎍𪎈𬹅麸𪎉𪎊𫜑𪎋𫜒𬹆𪎌𫜓𬹇-𬹉麹𪎎𪎏𫜔𬹊-𬹌麺𫜕𪎐𬹍𬹎] -[radical 200=⿇麻:麻𪎑麼麽𪎒-𪎔麾䵇𪎕-𪎢𫜖麿𪎣𪎤𬹏黀𪎥-𪎧𫜗黁䵈䵉𪎨-𪎯黂𪎰-𪎲] -[radical 201=⿈黃:黃黄𪎳𪎴𬹐黅黆䵊𪎵-𪎹𫜘黇-黉𪎺黊黋䵋𪎻-𪏁䵌𪏂-𪏅𬹑䵍𪏆-𪏒䵎𪏓-𪏞𬹒䵏𪏟-𪏣𬹓䵐𪏤-𪏦黌𪏧-𪏬] -[radical 202=⿉黍:黍𪏭黎䵑𪏮𪏯䵒䵓𪏰-𪏵𬹔黏𪏶-𪐁䵔-䵖𪐂-𪐆䵗-䵙𪐇-𪐊黐䵚𪐋䵛𪐌-𪐐䵜𪐒𪐑𪐓-𪐖] -[radical 203=⿊黑:黑黒𪐗䵝𪐘䵞𪐙-𪐛墨黓䵟䵠𪐜-𪐣黔-默䵡𪐤-𪐱黚-點䵢䵣𪐲-𪐾黟-黡䵤-䵧𪐿-𪑇𬹕𬹖黢黣䵨䵩𢖛𪑈-𪑑𬹗黤-黪䵪-䵬𪑒-𪑢𪑤𫜙𫜚黫-黯䵭-䵯𪑣𪑥-𪑽𫜛𬹘黰黱𪑾-𪒎𬹙𬹚黲-黴䵰𪒏-𪒗䵱𪒘-𪒨黵䵲-䵴𪒩-𪒳黶䵵𪒴-𪒸黷𪒹-𪒾𬹛黸𪒿-𪓊] -[radical 204=⿋黹:黹黺𫜜黻𪓋黼𪓌-𪓐𬹜] -[radical 205=⿌黽:黽𪓑-𪓓𬹝𬹞黿𪓔-𪓙鼀-鼂䵶𪓚-𪓠𬹟鼃鼄䵷𪓡-𪓦𫜝𪓧-𪓫𬹠𬹡鼅𪓬𪓭𬹢䵸𪓮-𪓶鼆鼇𪓷𪓸䵹𪓹鼈鼉𪓺𪓽𫜞鼊𪓼𪓾-𪔁] +[radical 183'=⻜飞:飞𮨶] +[radical 184=⾷食:食飠𠋑𩙿-𩚁𩚃𩚂飡-飤䬢𩚄-𩚆飥-飨䬣-䬥𩚇-𩚔𮨷𮨸飩-飲䬦-䬪𩚕-𩚧𫗍𬲋-𬲎飳-飹飻-飿䬫-䬴𩚨-𩛈𫗎𮨹-𮨻飺餀-餏䬵-䬻𩛉-𩛜𫗏-𫗒𬲏-𬲑𮨼餐-餙餝䬼-䭂𩛝-𩛹𫗓𬲒-𬲔餚-餜餞-餩䭃-䭇𩛺-𩜢𩜤-𩜬𬲕𬲖𮨽-𮩀餪-餵餷䭈-䭏𩜣𩜭-𩝘𫗔-𫗗𬲗-𬲙𮩁-𮩇餶餸-饃䭐-䭔𩝙-𩝳𩝵-𩝼𫗘𮩈-𮩋饄-饉䭕-䭗𧈐𩝴𩝽-𩞠𫗙𫗚𬲚𮩌-𮩏饊-饓䭘-䭜𡓷𩞡-𩞵𩞷-𩞽𫗛𬲛-𬲞𮩐饔-饙䭝-䭠𩞶𩞾-𩟒𬲟𬲠𮩑-𮩕饚-饜䉵䭡-䭤𩟓-𩟣𫗜𫗝䭥𩟤-𩟬𬲡𮩖𮩗饝𩟭-𩟵𮩘饞饟䭦䭧𩟶𮩙𮩚䭨𩟷-𩟺𬲢𬲣饠饡䭩𬲤𩟻饢𩟼𩟽] +[radical 184'=⻠饣:饣-饥𬲥𬲦饦饧𫗞𬲧𬲨饨-饮𩟾-𩠀𫗟𫗠𬲩𬲪饯-饴𩠁𩠂𫗡-𫗣𬲫-𬲳饵-饼𩠃𫗤𫗥𬲴-𬲷𮩛𮩜饽-馂𩠄𩠅𩠇𫗦-𫗨𬲸-𬲻馃-馆𩠆𩠈𩠉𫗩𫗪𬲼-𬳂馇馈馊馋𩠊𩠋𫗫-𫗯𬳃-𬳇𮩝馉馌-馐𩠌𫗰𫗱𬳈-𬳍馑馒𩠍𩠎𬳎-𬳐馓馔䭪𩠏𫗲𫗳𬳑𬳒𮩞𫗴𬳓𬳔𫗵馕] +[radical 185=⾸首:首𩠐馗𩠑-𩠓𮩟𩠔-𩠙𫗶𮩠䭫䭬𩠚-𩠠𬳕𬳖𮩡𩠡-𩠧𫗷𬳗𬳘𮩢𮩣馘𩠨𩠩𫗸𬳙𮩤䭭𩠪-𩠭𮩥𮩦䭮𩠯𩠱𫗹𬳚𩠲𫗺𩠳𩠴𬳛𩠵-𩠷𫗻𩠸𩠹] +[radical 186=⾹香:香𩠺馚𩠻-𩠽𬳜馛-馝䭯𩠾-𩡁𩡃𩡄𩡂𩡅𩡆𫗼𫗽𮩧𮩨馞-馠𩡇𩡈馡-馣䭰-䭲𩡉-𩡋𩡏𫗾𬳝𬳞𮩩𮩪馤馥𩡌-𩡎𩡐-𩡒𫗿𬳟𬳠馦馧𩡓-𩡘𬳡-𬳣𮩫𮩬馨𩡙-𩡜𫘀𫘁𬳤-𬳦𮩭馩𩡝-𩡡𫘂𬳧𮩮𩡢𩡣𫘃𮩯𮩰馪𩡤𮩱𥗶𩡥馫䭳𩡦𫘄] +[radical 187=⾺馬:馬𩡧𫠉𩡨馭馮䭴𩡩-𩡯𮩲馯-馵䭵䭶𩡰-𩡶𫘅𬳨𮩳-𮩶馶-駇䭷-䭾𩡷-𩡾𩢀-𩢅𩢇-𩢌𫘆-𫘉𬳩𬳪𮩷-𮩹駈-駠䭿-䮅𩡿𩢆𩢍-𩢭𮩺-𮩽駡-駲䮆-䮍𩢮-𩣕𫘊𬳫𮩾-𮪄駴-騃䮎-䮒𩣖-𩣬𩤷𬳬𮪅-𮪇駳騄-験䮓-䮛𩣭-𩤖𩤞𫘋-𫘎𬳭-𬳯𮪈-𮪌騔-騨䮜-䮢𩤗-𩤝𩤟-𩤶𩤸-𩤼𫘏-𫘑𮪍-𮪔騩-騸䮣-䮩𩤽-𩥪𫘒-𫘖𮪕騹-驇龭䮪-䮱𩥫-𩦁𬳰𮪖-𮪙驈-驕䮲-䮶𩦂-𩦝𫘗𬳱驖-驜䮷-䮹𩦞-𩦵𫘘𮪚驝-驟䮺-䮼𩦶-𩧁𫘙𮪛䮽𩧂-𩧎𮪜驠-驣䮾𩧏-𩧓𮪝𮪞驤-驧龮䮿𩧔-𩧗𫘚𮪟驨驩䯀𩧘-𩧞𮪠驪䯁𩧟𩧠驫𩧡-𩧤𬳲䯂𩧥] +[radical 187'=⻢马:马-驰𫘛驱-驴𩧦𫘜𫘝𬳳驵-骀𩧧-𩧭𩧯𫘞𫘟𫠊𬳴-𬳸骁-骉䯃𩧮𩧰-𩧶𫘠𫘡𬳹-𬳾骊-骏䯄𩧷-𩧺𫘢-𫘤𬳿𬴀𮪡𮪢骐-骖𩧻-𩧽𫘥-𫘧𬴁𬴂骗-骛𩧾-𩨃𩨅-𩨊𫘨𫘩𬴃𬴄𮪣骜-骟䯅𩨄𩨋-𩨍𫘪-𫘬𬴅𮪤骠-骢𫘭𫘮𫠋𬴆-𬴈骣𩨎𩨏𫘯𬴉𬴊𮪥𫘰𫠌𬴋骤𬴌𩨐𬴍骥𬴎骦骧𬴏𫘱𬴐] +[radical 188=⾻骨:骨䯆骩䯇𩨑-𩨓𮪦骪-骮𩨔-𩨛骯-骱䯈䯉𩨜-𩨫骲-骷䯊-䯎𩨬-𩨼𮪧𮪨骸-骼䯏-䯔𩨽-𩩈𫘲𮪩骽骾䯕-䯚𩩉-𩩖𬴑𬴒𮪪-𮪬骿-髁䯛䯜𩩗-𩩬𮪭-𮪯髂-髅䯝-䯠𩩭-𩩿𫘳𫘴𮪰𮪱髆-髌䯡𩪀-𩪈𮪲髍-髏䯢𩪉-𩪖𮪳𮪴髐䯣𩪗-𩪟髑-體䯤𩪠-𩪫𮪵髕䯥𩪬-𩪱髖䯦𩪲-𩪶𮪶髗𩪷-𩪺𬴓𮪷𩪻-𩪾] +[radical 189=⾼高:高髙䯧𫘵𬴔䯨𩪿𩫀髚䯩𩫁-𩫉𬴕𮪸髛𩫊-𩫍𫘶𮪹𩫎-𩫔𫘷𬴖𬴗𩫕-𩫙𬴘髜𩫚-𩫝𬴙𬴚𮪺䯪𩫞-𩫤𬴛𮪻𮪼𩫥𩫦𬴜髝䯫𩫧𬴝-𬴟髞𩫨-𩫪𬴠𩫫𩫬𬴡䯬𩫭𬴢𩫮𩫯𬴣𩫰-𩫲𬴤-𬴦𩫳] +[radical 190=⾽髟:髟𫘸髠䯭䯮𩫴-𩫸髡髢𩫹-𩫾𫘹𫘺髣-髪䯯-䯴𩫿-𩬐𫘻𬴧𮪽-𮪿髫-髴䯵䯶𩬑-𩬯𫘼𮫀-𮫂髵-髻鬇䯷䯸𩬰-𩭆𫘽𬴨𬴩𮫃-𮫅髼-鬂䯹-䯼𩭇-𩭝𫘾𫘿𬴪𮫆-𮫈鬃-鬆鬈䯽-䰃𩭞-𩭹𫙀𫙁𬴫𬴬𮫉-𮫌鬉-鬏䰄-䰇𩭺-𩮕𫙂𬴭𬴮𮫍𮫎鬐-鬓䰈-䰋𩮖-𩮮𮫏鬔-鬘鬝䰌䰍𩮯-𩯂𫙃鬙-鬜䰎𩯃-𩯚𮫐𮫑鬞-鬠𩯛-𩯥𬴯𮫒鬡鬢䰏-䰒𩯦-𩯯鬣䰓䰔𩯰-𩯹䰕𩯺-𩰀𮫓鬤𩰁-𩰇䰖𩰈𩰉] +[radical 191=⾾鬥:鬥𩰊-𩰌鬦𩰍-𩰏鬧𩰐鬨𩰑𩰒鬩𩰓𩰔𬴰𮫔鬪䰗𩰕𮫕䰘𩰖-𩰘鬫𩰙-𩰛鬬鬭𩰜-𩰞𬴱鬮𩰟] +[radical 192=⾿鬯:鬯𮫖𩰠-𩰦𮫗𩰧𩰨𮫘鬰𩰩𩰪鬱] +[radical 193=⿀鬲:鬲𮫙𬴲𩰫𩰬𬴳䰙䰚𩰭𩰮𫙄䰛𩰯𩰰𫙅𬴴鬳䰜𩰱-𩰸𬴵鬴𩰹-𩰽𬴶鬵鬶𩰾-𩱂鬷𩱃-𩱆𬴷鬸𩱇-𩱋鬹鬺𩱌-𩱑𫙆鬻䰝𩱒-𩱕𬴸𩱖-𩱣𬴹䰞𩍻𩱤𩱥𬴺𮫚𩱦-𩱬𮫛𩱭𩱮𫙇𩱯-𩱳𬴻𬴼𩱴-𩱸] +[radical 194=⿁鬼:鬼𩱹-𩱼𫙈𬴽鬽𩱽-𩲉𬴾鬾-魂䰟𩲊-𩲠𫙉𮫜𮫝魃-魆䰠䰡𩲡-𩲹魇䰢䰣𩲺-𩳋𫙊𬴿𮫞𮫟魈魉𩳌-𩳡𫙋𬵀𮫠魊-魏䰤-䰧𩳢-𩳴𫙌𫙍𮫡-𮫣䰨䰩𩳵-𩴅𮫤魐䰪𩴆-𩴏𮫥𮫦魑-魔𩴐-𩴛𮫧魕魖䰫-䰭𩴜-𩴭𫙎䰮𩴮-𩴰𮫨魗-魙䰯䰰𩴱-𩴿𮫩𩵀-𩵃𮫪𩵄-𩵈𮫫𩵉𩵊䰱] +[radical 195=⿂魚:魚𤋳𩵋𮫬-𮫯䰲魛-魞䰳𩵌-𩵓𫙏𬵁𬵂魟-魢䰴-䰶𩵔-𩵟𩶷𫙐𬵃𬵄𮫰魣-魹䰷-䰾𩵠-𩶀𫙑𫙒𬵅𬵆𮫱𮫲魺-鮘鮣䰿-䱉𩶁-𩶠𩾀𫙓-𫙗𬵇-𬵌𮫳𮫴鮙-鮢鮤-鮴鮺䱊-䱎𩶡-𩶶𩶸-𩷌𫙘-𫙟𬵍-𬵑𮫵-𮫸鮵-鮹鮻-鯓鯽䱏-䱘𩷍-𩷶𩾉𫙠-𫙣𬵒-𬵖𮫹-𮫽鯔-鯵鯻䱙-䱪𩷷-𩸽𫙤-𫙧𬵗-𬵛𮫾𮫿鯶-鯺鯼鯾-鰛鰠䱫-䱴𩸾-𩹰𫙨-𫙪𬵜-𬵟𮬀-𮬅鰜-鰟鰡-鰰鿐䱵-䱽𩹱-𩺬𫙫-𫙯𫠍𬵠-𬵣𮬆-𮬊鰱-鱈鷠䱾-䲈𩺭-𩻗𫙰-𫙶𬵤-𬵩𮬋-𮬍鱉-鱛䲉-䲏𩻘-𩼁𫙷-𫙼𬵪-𬵭𮬎-𮬒鱜-鱧鱩-鱫䲐-䲕𩼂-𩼤𩾍𫙽-𫚁𫠎𬵮-𬵱𮬓𮬔鱨鱬-鱰䲖-䲘𩼥-𩼺𫚂𫚃𬵲-𬵵𮬕鱱-鱶䲙𩼻-𩽌𫚄𬵶𮬖鱷鱸䲚䲛𩽍-𩽙𬵷-𬵹𮬗𮬘𩽚-𩽦𫚅𬵺𮬙𮬚鱹鿩𩽧-𩽯𬵻𬵼鱺𩽰-𩽲𫚆𬵽𬵾𩽳-𩽸𫚇𬵿鱻䲜] +[radical 195'=⻥鱼:鱼鱽𬶀𬶁鱾𫚈-𫚊𬶂-𬶄鱿-鲃鿕䲝𩽹-𩽻𫚋-𫚍𫠏𬶅-𬶉𮬛鲄-鲐䲞䲟𫚎-𫚒𫠐𬶊-𬶍鲑-鲟𩽼-𩽿𫚓-𫚘𬶎-𬶐𮬜𮬝鲠-鲬𩾁-𩾄𫚙-𫚛𬶑-𬶕𮬞鲭-鲻𩾅-𩾈𫚜-𫚡𬶖𬶗𬶙-𬶝𮬟𮬠鲼鲽鲿-鳋䲠䲡𩾊𩾋𫚢-𫚥𫠑𬶘𬶞-𬶨鲾鳌-鳒䲢-䲤𫚦𬶩𬶪𮬡𮬢鳓-鳛𩾌𫚧𫚨𫠒𬶫-𬶭𮬣鳜-鳟𫚩𫚪𬶮-𬶴鳠-鳣𫚫𬶵𬶶鳤𫚬𬶷𩾎𫚭𬶸𮬤𬶹-𬶻] +[radical 196=⿃鳥:鳥𫠓鳦𩾏-𩾑𫚮鳧-鳰䲥𩾒-𩾜𬶼𮬥鳱-鳶䲦-䲫𩾝-𩾯𬶽-𬶿𮬦-𮬪鳷-鴉鴋-鴎䲬-䲸𩾰-𩿛𫚯-𫚲𬷀-𬷄𮬫-𮬯鴊鴏-鴬䲹-䳊𩿜-𪀑𫚳-𫚷𫠔𬷅-𬷌𮬰-𮬲鴭-鵉䳋-䳔𪀒-𪁉𫚸-𫚻𬷍-𬷒𮬳-𮬸鵊-鵣鵥䳕-䳜𪁊-𪁶𫚼-𫛀𬷓𬷔𬷖-𬷛𮬹-𮬻鵦-鶏鶑䳝-䳥𪁷-𪂵𫛁-𫛈𬷜-𬷡𮬼-𮭃鶐鶒-鶫䳦-䳰𪂶-𪃹𫛉-𫛋𬷢-𬷧𮭄-𮭇鶬-鷊鷌-鷏䳱-䳶𪃺-𪄬𫛌-𫛏𬷨-𬷭𮭈-𮭏鷋鷐-鷟䳷-䳽𪄭-𪅮𫛐𫠕𬷮-𬷰𮭐-𮭕鷡-鷸鷺-鷼䳾-䴆𪅯-𪆫𪆭𫛑-𫛕𬷱-𬷳𮭖鷹鷽-鸊䴇-䴋𪆬𪆮-𪇐𫛖𬷴-𬷶𮭗𮭘鸋-鸒䴌䴍𪇑-𪇝𪇟-𪇬𫛗𬷷𮭙𮭚鸓鸔䴎𪇭-𪈂𫛘𬷸𮭛𮭜鸕-鸗䴏𪈃-𪈗𬷹𮭝𮭞鸘-鸚𪈘-𪈤鸛鸜𪈥-𪈭𮭟鸝鸞𧖠𪈮-𪈳𫛙䴐𩖔𪈴-𪈷𬷺𪈸-𪈽𮭠䴑䴒𪈾-𪉀] +[radical 196'=⻦鸟:鸟𬷻鸠鸡𬷼𬷽鸢-鸤𬷾鸥-鸩䴓𪉁-𪉃𫛚-𫛞𫠖𬷿𬸀𮭡-𮭣鸪-鸶𪉄𫛟-𫛤𬸁-𬸇𮭤鸷-鸿䴔䴕𪉅-𪉋𫛥-𫛪𬸈-𬸌𮭥鹀-鹈𪉌𪉍𫛫-𫛯𬷕𬸍-𬸑𮭦𮭧鹉-鹔䴖𪉎𫛰-𫛵𬸒-𬸗鹕-鹗鹙-鹜䴗𪉏𪉐𫛶-𫛼𬸘-𬸟鹘鹝-鹤䴘𪉑-𪉔𫛽𫛾𬸠-𬸣𮭨𮭩鹥-鹨𫛿-𫜂𬸤-𬸦𮭪鹩-鹬𫜃𫜄𬸧-𬸫鹭-鹰䴙𫜅𬸬-𬸯鹱鹲𫜆𪉕𬸰鹳鹴𬸱] +[radical 197=⿄鹵:鹵𠧸𪉖𪉗鹶䴚𪉘-𪉛𬸲鹷𪉜-𪉡𮭫𪉢𫜇䴛𪉣-𪉥𫜈𬸳𮭬鹸𪉦-𪉬𮭭𮭮鹹𪉭-𪉴𫜉𮭯鹺鹻䴜𪉵-𪉾䴝𪉿-𪊂鹼鹽𪊃-𪊅𬸴䴞𪊆-𪊊] +[radical 197'=⻧卤:𮭰𬸵𫠗𬸶鹾𫜊𬸷-𬸹] +[radical 198=⿅鹿:鹿𢉖𮭱𬸺麀-麂𪊋𪊌𫜋䴟𪊍𪊎𮭲麃麄䴠-䴢𪊏-𪊚𫜌𬸻麅-麈䴣-䴥𪊛-𪊤𬸼𮭳麉-麋𪊥-𪊳𫜍𬸽𬸾𮭴麌-麐䴦𪊴-𪋃𫜎𮭵麑-麗䴧𪋄-𪋍𬸿𮭶𮭷麘-麛𪋎-𪋖𮭸麜麝䴨𪋗-𪋛𬹀𮭹𮭺麞䴩𪋜-𪋠𬹁麟𪋡-𪋩𫜏麠䴪䴫𪋪-𪋭麡𪋮-𪋵麢𪋶-𪋸麣𪋹麤𪋺𪋻] +[radical 199=⿆麥:麥𪋼-𪌀麧䴬-䴮𪌁-𪌄麨-麫䴯䴰𪌅-𪌓麬-麮䴱-䴴𪌔-𪌚𪌜-𪌡𮭻麯麰䴵𪌢-𪌬𬹂麱麲䴶-䴸𪌭-𪌻麳麴䴹-䴽𪌼-𪍋𫜐𬹃𮭼𮭽麵𪍌-𪍚𮭾䴾-䵀𪍛-𪍢𮭿𮮀麶䵁䵂䵅𪍣-𪍱𮮁䵃𪍲-𪍷𬹄䵄𪍸-𪍾䵆𪍿-𪎅𮮂麷𪎆𪎇] +[radical 199'=⻨麦:麦𪎍𮮃𪎈𬹅麸𪎉𪎊𫜑𮮄𮮅𪎋𫜒𮮆𬹆𮮇𪎌𫜓𬹇-𬹉麹𪎎𪎏𫜔𬹊-𬹌麺𫜕𪎐𬹍𬹎] +[radical 200=⿇麻:麻𪎑麼麽𪎒-𪎔麾䵇𪎕-𪎚𮮈-𮮊𪎛-𪎢𫜖麿𪎣𪎤𬹏𮮋黀𪎥-𪎧𫜗黁䵈䵉𪎨-𪎯𮮌黂𪎰𪎱𮮍𪎲𮮎] +[radical 201=⿈黃:黃黄𪎳𪎴𬹐黅黆䵊𪎵-𪎹𫜘黇-黉𪎺𮮏黊黋䵋𪎻-𪏁䵌𪏂-𪏅𬹑䵍𪏆-𪏒䵎𪏓-𪏞𬹒䵏𪏟-𪏣𬹓䵐𪏤-𪏦黌𪏧-𪏬] +[radical 202=⿉黍:黍𮮐𮮑𪏭黎䵑𪏮𪏯䵒䵓𪏰-𪏵𬹔黏𪏶-𪐀𮮒𪐁䵔-䵖𪐂-𪐆䵗-䵙𪐇-𪐊黐䵚𪐋䵛𪐌-𪐐䵜𪐒𮮓𪐑𪐓-𪐖] +[radical 203=⿊黑:黑黒𪐗䵝𪐘䵞𪐙-𪐛墨黓䵟䵠𪐜-𪐣黔-默䵡𪐤-𪐱𮮔𮮕黚-點䵢䵣𪐲-𪐾𮮖黟-黡䵤-䵧𪐿-𪑇𬹕𬹖𮮗𮮘黢黣䵨䵩𢖛𪑈-𪑑𬹗黤-黪䵪-䵬𪑒-𪑢𪑤𫜙𫜚𮮙-𮮛黫-黯䵭-䵯𪑣𪑥-𪑽𫜛𬹘𮮜黰黱𪑾-𪒎𬹙𬹚黲-黴䵰𪒏-𪒗𮮝䵱𪒘-𪒨黵䵲-䵴𪒩-𪒳黶䵵𪒴-𪒸𮮞黷𪒹-𪒾𬹛𮮟黸𪒿-𪓊] +[radical 204=⿋黹:黹𮮠黺𫜜黻𪓋黼𪓌-𪓐𬹜] +[radical 205=⿌黽:黽𪓑-𪓓𬹝𮮡𬹞黿𪓔-𪓙𮮢鼀-鼂䵶𪓚-𪓠𬹟鼃鼄䵷𪓡-𪓦𫜝𮮣𪓧-𪓫𬹠𬹡𮮤鼅𪓬𪓭𬹢䵸𪓮-𪓶鼆鼇𪓷𪓸䵹𪓹鼈鼉𪓺𪓽𫜞鼊𪓼𪓾-𪔁] [radical 205'=⻪黾:黾鼋鼌𬹣𬹤𫜟鼍] -[radical 206=⿍鼎:鼎𪔂鼏-鼑𪔃鼒䵺𪔄-𪔆𫜠𬹥𪔇𬹦-𬹨𪔈𬹩𪔉𫜡𬹪䵻䵼𬹫𪔊𬹬] -[radical 207=⿎鼓:鼓鼔𡔷𪔋𪔌𡒡𪔍-𪔏鼕鼖䵽-䵿𪔐-𪔓鼗䶀𪔔-𪔡鼘-鼛䶁𪔢-𪔭鼜𪔮鼝鼞𪔯-𪔲鼟𥀻𪇞𪔳𪔴𥀼𪔵𪔶𥀽𪔷𥀾] -[radical 208=⿏鼠:鼠鼡𫜢𪔸𪔹䶂𪔺-𪔼鼢-鼤䶃𪔽-𪕈鼥-鼬䶄𪕉-𪕑𫠘𬹭鼭䶅𪕒-𪕙𪕟鼮-鼰𪕚-𪕞𪕠-𪕧鼱䶆𪕨-𪕪𬹮鼲-鼵䶇𪕫-𪕴鼶-鼹䶈䶉𪕵-𪕾𪖀-𪖉𫜣𪖊𪖋鼺𪖌-𪖏] -[radical 209=⿐鼻:鼻𪖐鼼鼽𪖑𪖒鼾鼿𪖓𪖔䶊䶋𪖕-𪖙𫜤齀齁䶌𪖚-𪖠䶍䶎𪖡-𪖤𬹯䶏𪖥-𪖬齂𪖭𪖮𬹰齃齄𪖯-𪖲齅齆𪕿𪖳-𪖵齇𪖶-𪖽齈䶐𪖾-𪗀䶑𪗁-𪗃齉] -[radical 210=⿑齊:齊𪗄𬹱𪗅齋䶒䶓𪗆齌𠆜𪗇𪗈齍𪗉𪗊𬹲𪗋𪗌齎𪗎𪗍齏𪗏-𪗓] +[radical 206=⿍鼎:鼎𪔂鼏-鼑𪔃鼒䵺𪔄-𪔆𫜠𬹥𮮥𪔇𬹦-𬹨𪔈𬹩𪔉𫜡𬹪䵻䵼𬹫𪔊𬹬] +[radical 207=⿎鼓:鼓鼔𡔷𮮦𪔋𪔌𡒡𪔍-𪔏鼕鼖䵽-䵿𪔐-𪔓𮮧鼗䶀𪔔-𪔛𮮨𪔜-𪔡𮮩鼘-鼛䶁𪔢-𪔭鼜𪔮鼝鼞𪔯-𪔲鼟𥀻𪇞𪔳𪔴𮮪𮮫𥀼𪔵𪔶𥀽𪔷𥀾] +[radical 208=⿏鼠:鼠鼡𫜢𪔸𪔹䶂𪔺-𪔼鼢-鼤䶃𪔽-𪕈𮮬鼥-鼬䶄𪕉-𪕑𫠘𬹭𮮭鼭䶅𪕒-𪕙𪕟鼮-鼰𪕚-𪕞𪕠-𪕧鼱䶆𪕨-𪕪𬹮𮮮鼲-鼵䶇𪕫-𪕴鼶-鼹䶈䶉𪕵-𪕾𪖀-𪖉𫜣𮮯𪖊𪖋鼺𪖌-𪖏] +[radical 209=⿐鼻:鼻𮮰-𮮵𪖐鼼鼽𪖑𪖒鼾鼿𪖓𪖔𮮶䶊䶋𪖕-𪖙𫜤齀齁䶌𪖚-𪖠䶍䶎𪖡-𪖤𬹯𮮷䶏𪖥-𪖬齂𪖭𪖮𬹰齃齄𪖯-𪖲齅齆𪕿𪖳-𪖵齇𪖶-𪖽𮮸齈䶐𪖾-𪗀䶑𪗁𪗂𮮹𪗃齉] +[radical 210=⿑齊:齊𪗄𬹱𮮺-𮮼𪗅齋䶒䶓𪗆齌𠆜𪗇𪗈齍𪗉𪗊𬹲𪗋𪗌齎𪗎𪗍齏𪗏-𪗓] [radical 210'=⻬齐:齐𬹳齑] -[radical 211=⿒齒:齒𣦋齓齔𪗔-𪗗齕䶔𪗘-𪗚齖-齘䶕䶖𪗛-𪗤𫠙齙-齣䶗-䶙𠎜𪗥-𪗶𬹴齤-齩䶚䶛𪗷-𪘍𫜥𬹵-𬹷齪-齬䶜䶝𪘎-𪘤𫜦齭-齱䶞䶟𪘥-𪘸齲-齷䶠-䶢𪘹-𪙈𫠛齸-齻䶣䶤𪙉-𪙙䶥䶦𪙚-𪙢䶧𪙣-𪙯𫜧𬹸齼齽䶨𪙰-𪙵䶩䶪𪙶-𪚀𬹹𪚁-𪚉齾䶫𪚊-𪚎] -[radical 211'=⻮齿:齿-龂𫜨𬹺-𬹽龃-龆𫠚𬹾-𬺀龇龈𪚏𫜩𫜪𬺁-𬺅龉龊𫜫𬺆𬺇𪚐𫜬𫜭𫠜𬺈-𬺌龋龌𫜮𬺍𬺎𫜯𬺏-𬺒𫜰𬺓-𬺖] -[radical 212=⿓龍:龍-龏𪚑-𪚔𬺗𬺘龑𪚕-𪚘𪚚𪚛龒𪚙龓-龕䶬𪚜-𪚡𫜱𬺙𬺚𪚢-𪚤龖-龘𪚥] +[radical 211=⿒齒:齒𣦋𮮽齓齔𪗔-𪗗𮮾齕䶔𪗘-𪗚𮮿齖-齘䶕䶖𪗛-𪗤𫠙𮯀𮯁齙-齣䶗-䶙𠎜𪗥-𪗶𬹴𮯂𮯃齤-齩䶚䶛𪗷-𪘍𫜥𬹵-𬹷𮯄-𮯆齪-齬䶜䶝𪘎-𪘤𫜦𮯇齭-齱䶞䶟𪘥-𪘸𮯈-𮯊齲-齷䶠-䶢𪘹-𪙈𫠛𮯋-𮯎齸-齻䶣䶤𪙉-𪙙𮯏𮯐䶥䶦𪙚-𪙢𮯑-𮯓䶧𪙣-𪙯𫜧𬹸𮯔-𮯖齼齽䶨𪙰-𪙵𮯗䶩䶪𪙶-𪚀𬹹𪚁-𪚄𮯘𪚅-𪚉齾䶫𪚊-𪚎] +[radical 211'=⻮齿:齿-龂𫜨𬹺-𬹽龃-龆𫠚𬹾-𬺀𮯙龇龈𪚏𫜩𫜪𬺁-𬺅龉龊𫜫𬺆𬺇𪚐𫜬𫜭𫠜𬺈-𬺌龋龌𫜮𬺍𬺎𫜯𬺏-𬺒𫜰𬺓-𬺖] +[radical 212=⿓龍:龍-龏𪚑-𪚔𬺗𬺘龑𪚕-𪚘𪚚𪚛龒𪚙龓-龕䶬𪚜-𪚟𮯚𪚠𪚡𫜱𬺙𬺚𪚢-𪚤龖-龘𪚥] [radical 212'=⻰龙:龙𬺛䶭䶮𬺜龚龛𫜲𬺝] -[radical 213=⿔龜:龜𪚦𪛉𪚨䶯𪚩𪚪䶰𪚫-𪚵龝䶱䶲𪚧𪚶-𪛀𪓻𪛁-𪛄龞𪛅𪛆𫠝𪛇𪛈] +[radical 213=⿔龜:龜𪚦𪛉𮯛-𮯟𪚨䶯𪚩𪚪䶰𪚫-𪚵龝䶱䶲𪚧𪚶-𪛀𪓻𪛁-𪛄龞𪛅𪛆𫠝𪛇𪛈] [radical 213'=⻳龟:龟𬺞𫜳] -[radical 214=⿕龠:龠龡䶳𪛊𬺟龢龣䶴𪛋-𪛍𬺠龤龥𪛎-𪛑䶵𪛒𪛓𫜴𬺡𪛔-𪛖] +[radical 214=⿕龠:龠龡䶳𪛊𬺟龢龣䶴𪛋-𪛍𬺠𮯠龤龥𪛎-𪛑䶵𪛒𪛓𫜴𬺡𪛔-𪛖] [radical end] # Top Byte => Reordering Tokens [top_byte 00 TERMINATOR ] [top_byte 01 LEVEL-SEPARATOR ] [top_byte 02 FIELD-SEPARATOR ] -[top_byte 03 SPACE PUNCTUATION ] # 644 primary weights +[top_byte 03 SPACE PUNCTUATION ] # 666 primary weights [top_byte 04 SPACE PUNCTUATION ] [top_byte 05 SPACE PUNCTUATION ] [top_byte 06 SPACE PUNCTUATION ] @@ -263,7 +261,7 @@ [top_byte 09 SPACE PUNCTUATION ] [top_byte 0A SPACE PUNCTUATION ] [top_byte 0B SPACE PUNCTUATION ] -[top_byte 0C SYMBOL CURRENCY ] # 5725 primary weights +[top_byte 0C SYMBOL CURRENCY ] # 5805 primary weights [top_byte 0D SYMBOL CURRENCY ] [top_byte 0E DIGIT ] # 365 primary weights [top_byte 0F DIGIT ] @@ -353,9 +351,9 @@ [top_byte 63 Armn COMPRESS ] # 40 primary weights [top_byte 64 Hebr Phnx Samr COMPRESS ] # 73 primary weights [top_byte 65 Arab COMPRESS ] # 219 primary weights -[top_byte 66 Syrc Mand Thaa Nkoo Tfng Ethi COMPRESS ] # 650 primary weights +[top_byte 66 Syrc Mand Thaa Nkoo Tfng Ethi COMPRESS ] # 661 primary weights [top_byte 67 Deva COMPRESS ] # 101 primary weights -[top_byte 68 Beng COMPRESS ] # 66 primary weights +[top_byte 68 Beng COMPRESS ] # 67 primary weights [top_byte 69 Guru COMPRESS ] # 58 primary weights [top_byte 6A Gujr COMPRESS ] # 70 primary weights [top_byte 6B Orya COMPRESS ] # 68 primary weights @@ -363,19 +361,19 @@ [top_byte 6D Telu COMPRESS ] # 75 primary weights [top_byte 6E Knda COMPRESS ] # 75 primary weights [top_byte 6F Mlym COMPRESS ] # 74 primary weights -[top_byte 70 Sinh Mtei Sylo Saur Kthi Mahj Shrd Khoj Sind Mult Gran Newa Tirh Sidd Modi Takr Ahom Sund Brah Khar Bhks COMPRESS ] # 1208 primary weights +[top_byte 70 Sinh Mtei Sylo Saur Kthi Mahj Shrd Khoj Sind Mult Gran Newa Tirh Sidd Modi Takr Ahom Gonm Sund Brah Khar Bhks COMPRESS ] # 1268 primary weights [top_byte 71 Thai COMPRESS ] # 65 primary weights [top_byte 72 Laoo Tavt COMPRESS ] # 117 primary weights -[top_byte 73 Tibt Marc Lepc Phag Limb Tglg Hano Buhd Tagb Bugi COMPRESS ] # 437 primary weights -[top_byte 74 Batk Rjng Kali Mymr Cakm Khmr Tale Talu Lana Cham Bali Java COMPRESS ] # 787 primary weights -[top_byte 75 Mong Olck Cher Osge Cans Ogam COMPRESS ] # 1028 primary weights +[top_byte 73 Tibt Zanb Soyo COMPRESS ] # 205 primary weights +[top_byte 74 Marc Lepc Phag Limb Tglg Hano Buhd Tagb Bugi Batk Rjng Kali Mymr Cakm Khmr COMPRESS ] # 741 primary weights +[top_byte 75 Tale Talu Lana Cham Bali Java Mong Olck Cher Osge Cans Ogam COMPRESS ] # 1414 primary weights [top_byte 76 Runr Hung Orkh COMPRESS ] # 135 primary weights [top_byte 77 Vaii Bamu Bass Mend Adlm COMPRESS ] # 1184 primary weights [top_byte 78 Hang COMPRESS ] # 358 primary weights -[top_byte 79 Hira Hrkt Kana COMPRESS ] # 51 primary weights -[top_byte 7A Bopo Yiii Lisu Plrd Wara Pauc Hmng Lyci Cari Lydi Ital Goth COMPRESS ] # 1746 primary weights +[top_byte 79 Hira Hrkt Kana COMPRESS ] # 336 primary weights +[top_byte 7A Bopo Yiii Lisu Plrd Wara Pauc Hmng Lyci Cari Lydi Ital Goth COMPRESS ] # 1749 primary weights [top_byte 7B Dsrt Shaw Dupl Osma Elba Aghb Sora Mroo Linb Lina Cprt Sarb Narb Avst Palm Nbat Hatr Armi Prti Phli Phlp Mani Ugar Xpeo Xsux Egyp COMPRESS ] # 3594 primary weights -[top_byte 7C Merc Hluw Tang COMPRESS ] # 7494 primary weights +[top_byte 7C Merc Hluw Tang Nshu COMPRESS ] # 7891 primary weights [top_byte 7D Hani Hans Hant ] [top_byte 7E Hani Hans Hant ] [top_byte 7F Hani Hans Hant ] @@ -732,6 +730,7 @@ 1CE7; [,,] 1CE8; [,,] 1CF4; [,,] +1CF7; [,,] 1CF8; [,,] 1CF9; [,,] 200B; [,,] @@ -1424,6 +1423,9 @@ FFFB; [,,] 1DCE; [, A6, 05] 1DD1; [, A6, 05] 1DF5; [, A6, 05] +1DF6; [, A6, 05] +1DF7; [, A6, 05] +1DF8; [, A6, 05] 1DFB; [, A6, 05] 1DFE; [, A6, 05] 20F0; [, A6, 05] @@ -1479,6 +1481,7 @@ A67D; [, A6, 05] 1DC2; [, A8, 05] 1DCF; [, A8, 05] 1DD0; [, A8, 05] +1DF9; [, A8, 05] 1DFC; [, A8, 05] 1DFD; [, A8, 05] 1DFF; [, A8, 05] @@ -1615,15 +1618,18 @@ FC62; [, E7 E4, 2E][, E8 4C, 2E] 08E6; [, E8 08, 05] 08F6; [, E8 2A, 05] 0651; [, E8 4C, 05] +0AFB; [, E8 4C, 05] 11237; [, E8 4C, 05] FE7D; [, E8 4C, 20] FE7C; [, E8 4C, 2E] FC63; [, E8 4C, 2E][, EB 82, 2C] 0652; [, E8 6E, 05] +0AFA; [, E8 6E, 05] 1123E; [, E8 6E, 05] FE7F; [, E8 6E, 20] FE7E; [, E8 6E, 2E] 0653; [, E8 90, 05] +0AFC; [, E8 90, 05] 0654; [, E8 B2, 05] 0655; [, E8 D4, 05] 065F; [, E8 F6, 05] @@ -1693,6 +1699,9 @@ A6F1; [, EF A8, 05] 09BC; [, F1 22, 05] 0A3C; [, F1 22, 05] 0ABC; [, F1 22, 05] +0AFD; [, F1 22, 05] +0AFE; [, F1 22, 05] +0AFF; [, F1 22, 05] 0B3C; [, F1 22, 05] 0CBC; [, F1 22, 05] 1B34; [, F1 22, 05] @@ -1709,6 +1718,8 @@ A9B3; [, F1 22, 05] 114C3; [, F1 22, 05] 115C0; [, F1 22, 05] 116B7; [, F1 22, 05] +11A33; [, F1 22, 05] +11D42; [, F1 22, 05] 0900; [, F1 44, 05] 0901; [, F1 44, 05] 0981; [, F1 44, 05] @@ -1732,8 +1743,12 @@ A980; [, F1 44, 05] 114BF; [, F1 44, 05] 115BC; [, F1 44, 05] 11640; [, F1 44, 05] +11A35; [, F1 44, 05] +11A36; [, F1 44, 05] +11A37; [, F1 44, 05] 11C3C; [, F1 44, 05] 11CB6; [, F1 44, 05] +11D43; [, F1 44, 05] 0902; [, F1 66, 05] 0982; [, F1 66, 05] 0A02; [, F1 66, 05] @@ -1742,6 +1757,7 @@ A980; [, F1 44, 05] 0B82; [, F1 66, 05] 0C02; [, F1 66, 05] 0C82; [, F1 66, 05] +0D00; [, F1 66, 05] 0D02; [, F1 66, 05] 0D82; [, F1 66, 05] 0F7E; [, F1 66, 05] @@ -1768,8 +1784,11 @@ A981; [, F1 66, 05] 115BD; [, F1 66, 05] 1163D; [, F1 66, 05] 116AB; [, F1 66, 05] +11A38; [, F1 66, 05] +11A96; [, F1 66, 05] 11C3D; [, F1 66, 05] 11CB5; [, F1 66, 05] +11D40; [, F1 66, 05] 0903; [, F1 88, 05] 0983; [, F1 88, 05] 0A03; [, F1 88, 05] @@ -1799,7 +1818,10 @@ A983; [, F1 88, 05] 115BE; [, F1 88, 05] 1163E; [, F1 88, 05] 116AC; [, F1 88, 05] +11A39; [, F1 88, 05] +11A97; [, F1 88, 05] 11C3E; [, F1 88, 05] +11D41; [, F1 88, 05] 0A70; [, F1 AA, 05] 0A71; [, F1 CC, 05] 1B03; [, F1 EE, 05] @@ -1811,74 +1833,75 @@ ABEC; [, F2 56, 05] 10A3A; [, F2 BC, 05] 111CB; [, F2 DE, 05] 111CC; [, F3 02, 05] -0E4E; [, F3 24, 05] -0E47; [, F3 46, 05] -0E48; [, F3 68, 05] -0E49; [, F3 8A, 05] -0E4A; [, F3 AC, 05] -0E4B; [, F3 CE, 05] -0E4C; [, F3 F0, 05] -0E4D; [, F4 14, 05] -0EC8; [, F4 36, 05] -0EC9; [, F4 58, 05] -0ECA; [, F4 7A, 05] -0ECB; [, F4 9C, 05] -0ECC; [, F4 BE, 05] -0ECD; [, F4 E0, 05] -AABF; [, F5 04, 05] -AAC1; [, F5 26, 05] -0F39; [, F5 48, 05] -A92B; [, F5 6A, 05] -A92C; [, F5 8C, 05] -A92D; [, F5 AE, 05] -1037; [, F5 D0, 05] -17C8; [, F5 F2, 05] -17C9; [, F6 16, 05] -17CA; [, F6 38, 05] -1A75; [, F6 5A, 05] -1A76; [, F6 7C, 05] -1A77; [, F6 9E, 05] -1A78; [, F6 C0, 05] -1A79; [, F6 E2, 05] -1A7A; [, F7 06, 05] -1A7B; [, F7 28, 05] -1A7C; [, F7 4A, 05] -1939; [, F7 6C, 05] -193A; [, F7 8E, 05] -193B; [, F7 B0, 05] -16B30; [, F7 D2, 05] -16B31; [, F7 F4, 05] -16B32; [, F8 18, 05] -16B33; [, F8 3A, 05] -16B34; [, F8 5C, 05] -16B35; [, F8 7E, 05] -16B36; [, F8 A0, 05] -302A; [, F8 C2, 05] -302B; [, F8 E4, 05] -302C; [, F9 08, 05] -302D; [, F9 2A, 05] -302E; [, F9 4C, 05] -302F; [, F9 6E, 05] -20D0; [, F9 90, 05] -20D1; [, F9 B2, 05] -20D2; [, F9 D4, 05] -20D3; [, F9 D4, 05] -20D4; [, F9 F6, 05] -20D5; [, FA 1A, 05] -20D6; [, FA 3C, 05] -20D7; [, FA 5E, 05] -20DB; [, FA 80, 05] -20DC; [, FA A2, 05] -20E1; [, FA C4, 05] -20E6; [, FA E6, 05] -20E7; [, FB 0A, 05] -20E8; [, FB 2C, 05] -20E9; [, FB 4E, 05] -101FD; [, FB 70, 05] -004C | 00B7; [, FB 92, 05] -006C | 00B7; [, FB 92, 05] -004C | 0387; [, FB 92, 05] -006C | 0387; [, FB 92, 05] +11A98; [, F3 24, 05] +0E4E; [, F3 46, 05] +0E47; [, F3 68, 05] +0E48; [, F3 8A, 05] +0E49; [, F3 AC, 05] +0E4A; [, F3 CE, 05] +0E4B; [, F3 F0, 05] +0E4C; [, F4 14, 05] +0E4D; [, F4 36, 05] +0EC8; [, F4 58, 05] +0EC9; [, F4 7A, 05] +0ECA; [, F4 9C, 05] +0ECB; [, F4 BE, 05] +0ECC; [, F4 E0, 05] +0ECD; [, F5 04, 05] +AABF; [, F5 26, 05] +AAC1; [, F5 48, 05] +0F39; [, F5 6A, 05] +A92B; [, F5 8C, 05] +A92C; [, F5 AE, 05] +A92D; [, F5 D0, 05] +1037; [, F5 F2, 05] +17C8; [, F6 16, 05] +17C9; [, F6 38, 05] +17CA; [, F6 5A, 05] +1A75; [, F6 7C, 05] +1A76; [, F6 9E, 05] +1A77; [, F6 C0, 05] +1A78; [, F6 E2, 05] +1A79; [, F7 06, 05] +1A7A; [, F7 28, 05] +1A7B; [, F7 4A, 05] +1A7C; [, F7 6C, 05] +1939; [, F7 8E, 05] +193A; [, F7 B0, 05] +193B; [, F7 D2, 05] +16B30; [, F7 F4, 05] +16B31; [, F8 18, 05] +16B32; [, F8 3A, 05] +16B33; [, F8 5C, 05] +16B34; [, F8 7E, 05] +16B35; [, F8 A0, 05] +16B36; [, F8 C2, 05] +302A; [, F8 E4, 05] +302B; [, F9 08, 05] +302C; [, F9 2A, 05] +302D; [, F9 4C, 05] +302E; [, F9 6E, 05] +302F; [, F9 90, 05] +20D0; [, F9 B2, 05] +20D1; [, F9 D4, 05] +20D2; [, F9 F6, 05] +20D3; [, F9 F6, 05] +20D4; [, FA 1A, 05] +20D5; [, FA 3C, 05] +20D6; [, FA 5E, 05] +20D7; [, FA 80, 05] +20DB; [, FA A2, 05] +20DC; [, FA C4, 05] +20E1; [, FA E6, 05] +20E6; [, FB 0A, 05] +20E7; [, FB 2C, 05] +20E8; [, FB 4E, 05] +20E9; [, FB 70, 05] +101FD; [, FB 92, 05] +004C | 00B7; [, FB B4, 05] +006C | 00B7; [, FB B4, 05] +004C | 0387; [, FB B4, 05] +006C | 0387; [, FB B4, 05] FDD1 00A0; [03 02 02, 05, 05] # SPACE first primary starts new lead byte @@ -2039,143 +2062,145 @@ FE14; [07 22, 05, 2C] A6F6; [07 2A, 05, 05] -003A; [07 2C, 05, 05] -FF1A; [07 2C, 05, 10] -FE55; [07 2C, 05, 26] -FE13; [07 2C, 05, 31] -2A74; [07 2C, 05, 1B][07 2C, 05, 1B][0C 80, 05, 18] +2E49; [07 2C, 05, 05] -0589; [07 2E, 05, 05] +003A; [07 2E, 05, 05] +FF1A; [07 2E, 05, 10] +FE55; [07 2E, 05, 26] +FE13; [07 2E, 05, 31] +2A74; [07 2E, 05, 1B][07 2E, 05, 1B][0C 80, 05, 18] -061E; [07 30, 05, 05] +0589; [07 30, 05, 05] -0703; [07 32 02, 05, 05] +061E; [07 32, 05, 05] -0704; [07 32 09, 05, 05] +0703; [07 34 02, 05, 05] -0705; [07 32 10, 05, 05] +0704; [07 34 09, 05, 05] -0706; [07 32 17, 05, 05] +0705; [07 34 10, 05, 05] -0707; [07 32 1E, 05, 05] +0706; [07 34 17, 05, 05] -0708; [07 32 25, 05, 05] +0707; [07 34 1E, 05, 05] -0830; [07 32 2C, 05, 05] +0708; [07 34 25, 05, 05] -0831; [07 32 33, 05, 05] +0830; [07 34 2C, 05, 05] -0832; [07 32 3A, 05, 05] +0831; [07 34 33, 05, 05] -0833; [07 32 41, 05, 05] +0832; [07 34 3A, 05, 05] -0834; [07 32 48, 05, 05] +0833; [07 34 41, 05, 05] -0835; [07 32 4F, 05, 05] +0834; [07 34 48, 05, 05] -0836; [07 32 56, 05, 05] +0835; [07 34 4F, 05, 05] -0837; [07 32 5D, 05, 05] +0836; [07 34 56, 05, 05] -0838; [07 32 64, 05, 05] +0837; [07 34 5D, 05, 05] -0839; [07 32 6B, 05, 05] +0838; [07 34 64, 05, 05] -083A; [07 32 72, 05, 05] +0839; [07 34 6B, 05, 05] -083B; [07 32 79, 05, 05] +083A; [07 34 72, 05, 05] -083C; [07 32 80, 05, 05] +083B; [07 34 79, 05, 05] -083D; [07 32 87, 05, 05] +083C; [07 34 80, 05, 05] -083E; [07 32 8E, 05, 05] +083D; [07 34 87, 05, 05] -1361; [07 34, 05, 05] +083E; [07 34 8E, 05, 05] -1363; [07 36, 05, 05] +1361; [07 36, 05, 05] -1364; [07 38, 05, 05] +1363; [07 38, 05, 05] -1365; [07 3A, 05, 05] +1364; [07 3A, 05, 05] -1366; [07 3C, 05, 05] +1365; [07 3C, 05, 05] -1804; [07 3E, 05, 05] +1366; [07 3E, 05, 05] -1805; [07 40, 05, 05] +1804; [07 40, 05, 05] -0F14; [07 42, 05, 05] +1805; [07 42, 05, 05] -17D6; [07 44, 05, 05] +0F14; [07 44, 05, 05] -1B5D; [07 46 02, 05, 05] +17D6; [07 46, 05, 05] -A9C7; [07 46 09, 05, 05] +1B5D; [07 48 02, 05, 05] -16EB; [07 48, 05, 05] +A9C7; [07 48 09, 05, 05] -16EC; [07 4A, 05, 05] +16EB; [07 4A, 05, 05] -16ED; [07 4C, 05, 05] +16EC; [07 4C, 05, 05] -A6F4; [07 4E, 05, 05] +16ED; [07 4E, 05, 05] -0021; [07 50, 05, 05] -FF01; [07 50, 05, 10] -FE57; [07 50, 05, 20] -FE15; [07 50, 05, 28] -203C; [07 50, 05, 18][07 50, 05, 18] -2049; [07 50, 05, 18][07 58, 05, 1B] +A6F4; [07 50, 05, 05] -00A1; [07 52, 05, 05] +0021; [07 52, 05, 05] +FF01; [07 52, 05, 10] +FE57; [07 52, 05, 20] +FE15; [07 52, 05, 28] +203C; [07 52, 05, 18][07 52, 05, 18] +2049; [07 52, 05, 18][07 5A, 05, 1B] -055C; [07 54, 05, 05] +00A1; [07 54, 05, 05] -07F9; [07 56 02, 05, 05] +055C; [07 56, 05, 05] -1944; [07 56 09, 05, 05] +07F9; [07 58 02, 05, 05] -1E95E; [07 56 10, 05, 05] +1944; [07 58 09, 05, 05] -003F; [07 58, 05, 05] -FF1F; [07 58, 05, 10] -FE56; [07 58, 05, 26] -FE16; [07 58, 05, 31] -2048; [07 58, 05, 1B][07 50, 05, 18] -2047; [07 58, 05, 1B][07 58, 05, 1B] +1E95E; [07 58 10, 05, 05] -00BF; [07 5A, 05, 05] +003F; [07 5A, 05, 05] +FF1F; [07 5A, 05, 10] +FE56; [07 5A, 05, 26] +FE16; [07 5A, 05, 31] +2048; [07 5A, 05, 1B][07 52, 05, 18] +2047; [07 5A, 05, 1B][07 5A, 05, 1B] -2E2E; [07 5C, 05, 05] +00BF; [07 5C, 05, 05] -055E; [07 5E, 05, 05] +2E2E; [07 5E, 05, 05] -061F; [07 60, 05, 05] +055E; [07 60, 05, 05] -0709; [07 62, 05, 05] +061F; [07 62, 05, 05] -1367; [07 64, 05, 05] +0709; [07 64, 05, 05] -1945; [07 66 02, 05, 05] +1367; [07 66, 05, 05] -2CFA; [07 66 09, 05, 05] +1945; [07 68 02, 05, 05] -2CFB; [07 66 10, 05, 05] +2CFA; [07 68 09, 05, 05] -A60F; [07 66 17, 05, 05] +2CFB; [07 68 10, 05, 05] -A6F7; [07 66 1E, 05, 05] +A60F; [07 68 17, 05, 05] -AAF1; [07 66 25, 05, 05] +A6F7; [07 68 1E, 05, 05] -11143; [07 66 2C, 05, 05] +AAF1; [07 68 25, 05, 05] -1E95F; [07 66 33, 05, 05] +11143; [07 68 2C, 05, 05] -203D; [07 68, 05, 05] +1E95F; [07 68 33, 05, 05] -2E18; [07 6A, 05, 05] +203D; [07 6A, 05, 05] + +2E18; [07 6C, 05, 05] 002E; [08, 05, 05] FF0E; [08, 05, 10] @@ -3076,376 +3101,418 @@ FE6A; [0A 91, 05, 2E] 2E44; [0A F1, 05, 05] -A67E; [0A F3, 05, 05] +2E45; [0A F3, 05, 05] + +2E46; [0A F5, 05, 05] + +2E47; [0A F7, 05, 05] + +2E48; [0A F9, 05, 05] + +A67E; [0A FB, 05, 05] + +055A; [0A FD, 05, 05] + +055B; [0A FF, 05, 05] + +055F; [0B 03, 05, 05] + +05BE; [0B 05, 05, 05] + +05C0; [0B 07, 05, 05] + +05C3; [0B 09, 05, 05] + +05C6; [0B 0B, 05, 05] + +05F3; [0B 0D, 05, 05] + +05F4; [0B 0F, 05, 05] + +070A; [0B 11 02, 05, 05] + +070B; [0B 11 09, 05, 05] + +070C; [0B 11 10, 05, 05] + +070D; [0B 11 17, 05, 05] -055A; [0A F5, 05, 05] +085E; [0B 11 1E, 05, 05] -055B; [0A F7, 05, 05] +1800; [0B 11 25, 05, 05] -055F; [0A F9, 05, 05] +11660; [0B 11 2C, 05, 05] -05BE; [0A FB, 05, 05] +11661; [0B 11 33, 05, 05] -05C0; [0A FD, 05, 05] +11662; [0B 11 3A, 05, 05] -05C3; [0A FF, 05, 05] +11663; [0B 11 41, 05, 05] -05C6; [0B 03, 05, 05] +11664; [0B 11 48, 05, 05] -05F3; [0B 05, 05, 05] +11665; [0B 11 4F, 05, 05] -05F4; [0B 07, 05, 05] +11666; [0B 11 56, 05, 05] -070A; [0B 09 02, 05, 05] +11667; [0B 11 5D, 05, 05] -070B; [0B 09 09, 05, 05] +11668; [0B 11 64, 05, 05] -070C; [0B 09 10, 05, 05] +11669; [0B 11 6B, 05, 05] -070D; [0B 09 17, 05, 05] +1166A; [0B 11 72, 05, 05] -085E; [0B 09 1E, 05, 05] +1166B; [0B 11 79, 05, 05] -1800; [0B 09 25, 05, 05] +1166C; [0B 11 80, 05, 05] -11660; [0B 09 2C, 05, 05] +0970; [0B 13, 05, 05] -11661; [0B 09 33, 05, 05] +A8F8; [0B 15, 05, 05] -11662; [0B 09 3A, 05, 05] +A8F9; [0B 17, 05, 05] -11663; [0B 09 41, 05, 05] +A8FA; [0B 19, 05, 05] -11664; [0B 09 48, 05, 05] +A8FC; [0B 1B, 05, 05] -11665; [0B 09 4F, 05, 05] +09FD; [0B 1D, 05, 05] -11666; [0B 09 56, 05, 05] +0AF0; [0B 1F, 05, 05] -11667; [0B 09 5D, 05, 05] +0DF4; [0B 21, 05, 05] -11668; [0B 09 64, 05, 05] +0E4F; [0B 23, 05, 05] -11669; [0B 09 6B, 05, 05] +0E5A; [0B 25, 05, 05] -1166A; [0B 09 72, 05, 05] +0E5B; [0B 27, 05, 05] -1166B; [0B 09 79, 05, 05] +AADE; [0B 29 02, 05, 05] -1166C; [0B 09 80, 05, 05] +AADF; [0B 29 09, 05, 05] -0970; [0B 0B, 05, 05] +0F04; [0B 2B, 05, 05] -A8F8; [0B 0D, 05, 05] +0F05; [0B 2D, 05, 05] -A8F9; [0B 0F, 05, 05] +0F06; [0B 2F, 05, 05] -A8FA; [0B 11, 05, 05] +0F07; [0B 31, 05, 05] -A8FC; [0B 13, 05, 05] +0F08; [0B 33, 05, 05] -0AF0; [0B 15, 05, 05] +0F09; [0B 35, 05, 05] -0DF4; [0B 17, 05, 05] +0F0A; [0B 37, 05, 05] -0E4F; [0B 19, 05, 05] +0FD0; [0B 39, 05, 05] -0E5A; [0B 1B, 05, 05] +0FD1; [0B 3B, 05, 05] -0E5B; [0B 1D, 05, 05] +0F0B; [0B 3D, 05, 05] +0F0C; [0B 3D, 05, 20] -AADE; [0B 1F 02, 05, 05] +0F0D; [0B 3F, 05, 05] -AADF; [0B 1F 09, 05, 05] +0F0E; [0B 41, 05, 05] -0F04; [0B 21, 05, 05] +0F0F; [0B 43, 05, 05] -0F05; [0B 23, 05, 05] +0F10; [0B 45, 05, 05] -0F06; [0B 25, 05, 05] +0F11; [0B 47, 05, 05] -0F07; [0B 27, 05, 05] +0F12; [0B 49, 05, 05] -0F08; [0B 29, 05, 05] +0F85; [0B 4B, 05, 05] -0F09; [0B 2B, 05, 05] +0FD2; [0B 4D, 05, 05] -0F0A; [0B 2D, 05, 05] +0FD3; [0B 4F, 05, 05] -0FD0; [0B 2F, 05, 05] +0FD4; [0B 51, 05, 05] -0FD1; [0B 31, 05, 05] +0FD9; [0B 53, 05, 05] -0F0B; [0B 33, 05, 05] -0F0C; [0B 33, 05, 20] +0FDA; [0B 55, 05, 05] -0F0D; [0B 35, 05, 05] +11A3F; [0B 57 02, 05, 05] -0F0E; [0B 37, 05, 05] +11A40; [0B 57 09, 05, 05] -0F0F; [0B 39, 05, 05] +11A41; [0B 57 10, 05, 05] -0F10; [0B 3B, 05, 05] +11A42; [0B 57 17, 05, 05] -0F11; [0B 3D, 05, 05] +11A43; [0B 57 1E, 05, 05] -0F12; [0B 3F, 05, 05] +11A44; [0B 57 25, 05, 05] -0F85; [0B 41, 05, 05] +11A45; [0B 57 2C, 05, 05] -0FD2; [0B 43, 05, 05] +11A46; [0B 57 33, 05, 05] -0FD3; [0B 45, 05, 05] +11A9A; [0B 57 3A, 05, 05] -0FD4; [0B 47, 05, 05] +11A9B; [0B 57 41, 05, 05] -0FD9; [0B 49, 05, 05] +11A9C; [0B 57 48, 05, 05] -0FDA; [0B 4B, 05, 05] +11A9E; [0B 57 4F, 05, 05] -11C70; [0B 4D 02, 05, 05] +11A9F; [0B 57 56, 05, 05] -11C71; [0B 4D 09, 05, 05] +11AA0; [0B 57 5D, 05, 05] -1C3D; [0B 4D 10, 05, 05] +11AA1; [0B 57 64, 05, 05] -1C3E; [0B 4D 17, 05, 05] +11AA2; [0B 57 6B, 05, 05] -1C3F; [0B 4D 1E, 05, 05] +11C70; [0B 57 72, 05, 05] -104C; [0B 4F, 05, 05] +11C71; [0B 57 79, 05, 05] -104D; [0B 51, 05, 05] +1C3D; [0B 57 80, 05, 05] -104E; [0B 53, 05, 05] +1C3E; [0B 57 87, 05, 05] -104F; [0B 55, 05, 05] +1C3F; [0B 57 8E, 05, 05] -17D8; [0B 57, 05, 05] +104C; [0B 59, 05, 05] -17D9; [0B 59, 05, 05] +104D; [0B 5B, 05, 05] -17DA; [0B 5B, 05, 05] +104E; [0B 5D, 05, 05] -1AA0; [0B 5D 02, 05, 05] +104F; [0B 5F, 05, 05] -1AA1; [0B 5D 09, 05, 05] +17D8; [0B 61, 05, 05] -1AA2; [0B 5D 10, 05, 05] +17D9; [0B 63, 05, 05] -1AA3; [0B 5D 17, 05, 05] +17DA; [0B 65, 05, 05] -1AA4; [0B 5D 1E, 05, 05] +1AA0; [0B 67 02, 05, 05] -1AA5; [0B 5D 25, 05, 05] +1AA1; [0B 67 09, 05, 05] -1AA6; [0B 5D 2C, 05, 05] +1AA2; [0B 67 10, 05, 05] -1AAC; [0B 5D 33, 05, 05] +1AA3; [0B 67 17, 05, 05] -1AAD; [0B 5D 3A, 05, 05] +1AA4; [0B 67 1E, 05, 05] -166D; [0B 5D 41, 05, 05] +1AA5; [0B 67 25, 05, 05] -1CC0; [0B 5D 48, 05, 05] +1AA6; [0B 67 2C, 05, 05] -1CC1; [0B 5D 4F, 05, 05] +1AAC; [0B 67 33, 05, 05] -1CC2; [0B 5D 56, 05, 05] +1AAD; [0B 67 3A, 05, 05] -1CC3; [0B 5D 5D, 05, 05] +166D; [0B 67 41, 05, 05] -1CC4; [0B 5D 64, 05, 05] +1CC0; [0B 67 48, 05, 05] -1CC5; [0B 5D 6B, 05, 05] +1CC1; [0B 67 4F, 05, 05] -1CC6; [0B 5D 72, 05, 05] +1CC2; [0B 67 56, 05, 05] -1CC7; [0B 5D 79, 05, 05] +1CC3; [0B 67 5D, 05, 05] -2D70; [0B 5D 80, 05, 05] +1CC4; [0B 67 64, 05, 05] -A874; [0B 5D 87, 05, 05] +1CC5; [0B 67 6B, 05, 05] -A875; [0B 5D 8E, 05, 05] +1CC6; [0B 67 72, 05, 05] -1BFC; [0B 5D 95, 05, 05] +1CC7; [0B 67 79, 05, 05] -1BFD; [0B 5D 9C, 05, 05] +2D70; [0B 67 80, 05, 05] -1BFE; [0B 5D A3, 05, 05] +A874; [0B 67 87, 05, 05] -1BFF; [0B 5D AA, 05, 05] +A875; [0B 67 8E, 05, 05] -A92E; [0B 5F, 05, 05] +1BFC; [0B 67 95, 05, 05] -A9DE; [0B 61 02, 05, 05] +1BFD; [0B 67 9C, 05, 05] -A9DF; [0B 61 09, 05, 05] +1BFE; [0B 67 A3, 05, 05] -AA5C; [0B 61 10, 05, 05] +1BFF; [0B 67 AA, 05, 05] -1056F; [0B 61 17, 05, 05] +A92E; [0B 69, 05, 05] -11049; [0B 61 1E, 05, 05] +A9DE; [0B 6B 02, 05, 05] -1104A; [0B 61 25, 05, 05] +A9DF; [0B 6B 09, 05, 05] -1104B; [0B 61 2C, 05, 05] +AA5C; [0B 6B 10, 05, 05] -1104C; [0B 61 33, 05, 05] +1056F; [0B 6B 17, 05, 05] -1104D; [0B 61 3A, 05, 05] +11049; [0B 6B 1E, 05, 05] -10A50; [0B 61 41, 05, 05] +1104A; [0B 6B 25, 05, 05] -10A51; [0B 61 48, 05, 05] +1104B; [0B 6B 2C, 05, 05] -10A52; [0B 61 4F, 05, 05] +1104C; [0B 6B 33, 05, 05] -10A53; [0B 61 56, 05, 05] +1104D; [0B 6B 3A, 05, 05] -10A54; [0B 61 5D, 05, 05] +10A50; [0B 6B 41, 05, 05] -10A55; [0B 61 64, 05, 05] +10A51; [0B 6B 48, 05, 05] -10A58; [0B 61 6B, 05, 05] +10A52; [0B 6B 4F, 05, 05] -11C43; [0B 61 72, 05, 05] +10A53; [0B 6B 56, 05, 05] -11C44; [0B 61 79, 05, 05] +10A54; [0B 6B 5D, 05, 05] -11C45; [0B 61 80, 05, 05] +10A55; [0B 6B 64, 05, 05] -10B39; [0B 61 87, 05, 05] +10A58; [0B 6B 6B, 05, 05] -10AF0; [0B 61 8E, 05, 05] +11C43; [0B 6B 72, 05, 05] -10AF1; [0B 61 95, 05, 05] +11C44; [0B 6B 79, 05, 05] -10AF2; [0B 61 9C, 05, 05] +11C45; [0B 6B 80, 05, 05] -10AF3; [0B 61 A3, 05, 05] +10B39; [0B 6B 87, 05, 05] -10AF4; [0B 61 AA, 05, 05] +10AF0; [0B 6B 8E, 05, 05] -10AF5; [0B 61 B1, 05, 05] +10AF1; [0B 6B 95, 05, 05] -10AF6; [0B 61 B8, 05, 05] +10AF2; [0B 6B 9C, 05, 05] -10B99; [0B 61 BF, 05, 05] +10AF3; [0B 6B A3, 05, 05] -10B9A; [0B 61 C6, 05, 05] +10AF4; [0B 6B AA, 05, 05] -10B9B; [0B 61 CD, 05, 05] +10AF5; [0B 6B B1, 05, 05] -10B9C; [0B 61 D4, 05, 05] +10AF6; [0B 6B B8, 05, 05] -110BB; [0B 61 DB, 05, 05] +10B99; [0B 6B BF, 05, 05] -110BC; [0B 61 E2, 05, 05] +10B9A; [0B 6B C6, 05, 05] -11174; [0B 61 E9, 05, 05] +10B9B; [0B 6B CD, 05, 05] -11175; [0B 61 F0, 05, 05] +10B9C; [0B 6B D4, 05, 05] -111CD; [0B 61 F7, 05, 05] +110BB; [0B 6B DB, 05, 05] -111C7; [0B 61 FE, 05, 05] +110BC; [0B 6B E2, 05, 05] -111C9; [0B 62 07, 05, 05] +11174; [0B 6B E9, 05, 05] -111DB; [0B 62 0E, 05, 05] +11175; [0B 6B F0, 05, 05] -111DD; [0B 62 15, 05, 05] +111CD; [0B 6B F7, 05, 05] -1123A; [0B 62 1C, 05, 05] +111C7; [0B 6B FE, 05, 05] -1123B; [0B 62 23, 05, 05] +111C9; [0B 6C 07, 05, 05] -1123C; [0B 62 2A, 05, 05] +111DB; [0B 6C 0E, 05, 05] -1123D; [0B 62 31, 05, 05] +111DD; [0B 6C 15, 05, 05] -1144D; [0B 62 38, 05, 05] +1123A; [0B 6C 1C, 05, 05] -1144E; [0B 62 3F, 05, 05] +1123B; [0B 6C 23, 05, 05] -1144F; [0B 62 46, 05, 05] +1123C; [0B 6C 2A, 05, 05] -1145B; [0B 62 4D, 05, 05] +1123D; [0B 6C 31, 05, 05] -1145D; [0B 62 54, 05, 05] +1144D; [0B 6C 38, 05, 05] -114C6; [0B 62 5B, 05, 05] +1144E; [0B 6C 3F, 05, 05] -115C1; [0B 62 62, 05, 05] +1144F; [0B 6C 46, 05, 05] -115C4; [0B 62 69, 05, 05] +1145B; [0B 6C 4D, 05, 05] -115C5; [0B 62 70, 05, 05] +1145D; [0B 6C 54, 05, 05] -115C6; [0B 62 77, 05, 05] +114C6; [0B 6C 5B, 05, 05] -115C7; [0B 62 7E, 05, 05] +115C1; [0B 6C 62, 05, 05] -115C8; [0B 62 85, 05, 05] +115C4; [0B 6C 69, 05, 05] -115C9; [0B 62 8C, 05, 05] +115C5; [0B 6C 70, 05, 05] -115CA; [0B 62 93, 05, 05] +115C6; [0B 6C 77, 05, 05] -115CB; [0B 62 9A, 05, 05] +115C7; [0B 6C 7E, 05, 05] -115CC; [0B 62 A1, 05, 05] +115C8; [0B 6C 85, 05, 05] -115CD; [0B 62 A8, 05, 05] +115C9; [0B 6C 8C, 05, 05] -115CE; [0B 62 AF, 05, 05] +115CA; [0B 6C 93, 05, 05] -115CF; [0B 62 B6, 05, 05] +115CB; [0B 6C 9A, 05, 05] -115D0; [0B 62 BD, 05, 05] +115CC; [0B 6C A1, 05, 05] -115D1; [0B 62 C4, 05, 05] +115CD; [0B 6C A8, 05, 05] -115D2; [0B 62 CB, 05, 05] +115CE; [0B 6C AF, 05, 05] -115D3; [0B 62 D2, 05, 05] +115CF; [0B 6C B6, 05, 05] -115D4; [0B 62 D9, 05, 05] +115D0; [0B 6C BD, 05, 05] -115D5; [0B 62 E0, 05, 05] +115D1; [0B 6C C4, 05, 05] -115D6; [0B 62 E7, 05, 05] +115D2; [0B 6C CB, 05, 05] -115D7; [0B 62 EE, 05, 05] +115D3; [0B 6C D2, 05, 05] -11643; [0B 62 F5, 05, 05] +115D4; [0B 6C D9, 05, 05] -16B37; [0B 62 FC, 05, 05] +115D5; [0B 6C E0, 05, 05] -16B38; [0B 63 05, 05, 05] +115D6; [0B 6C E7, 05, 05] -16B39; [0B 63 0C, 05, 05] +115D7; [0B 6C EE, 05, 05] -16B3A; [0B 63 13, 05, 05] +11643; [0B 6C F5, 05, 05] -16B3B; [0B 63 1A, 05, 05] +16B37; [0B 6C FC, 05, 05] -16B44; [0B 63 21, 05, 05] +16B38; [0B 6D 05, 05, 05] -1DA87; [0B 63 28, 05, 05] +16B39; [0B 6D 0C, 05, 05] -1DA88; [0B 63 2F, 05, 05] +16B3A; [0B 6D 13, 05, 05] -1DA89; [0B 63 36, 05, 05] +16B3B; [0B 6D 1A, 05, 05] -1DA8A; [0B 63 3D, 05, 05] +16B44; [0B 6D 21, 05, 05] -1DA8B; [0B 63 44, 05, 05] +1DA87; [0B 6D 28, 05, 05] -10A7F; [0B 63 4B, 05, 05] +1DA88; [0B 6D 2F, 05, 05] + +1DA89; [0B 6D 36, 05, 05] + +1DA8A; [0B 6D 3D, 05, 05] + +1DA8B; [0B 6D 44, 05, 05] + +10A7F; [0B 6D 4B, 05, 05] FDD1 263A; [0C 02 02, 05, 05] # SYMBOL first primary starts new lead byte @@ -5290,109 +5357,111 @@ FF5E; [0C 8A, 05, 20] 23FE; [0C A5 A9, 05, 05] -2400; [0C A5 B0, 05, 05] +23FF; [0C A5 B0, 05, 05] + +2400; [0C A5 B7, 05, 05] -2401; [0C A5 B7, 05, 05] +2401; [0C A5 BE, 05, 05] -2402; [0C A5 BE, 05, 05] +2402; [0C A5 C5, 05, 05] -2403; [0C A5 C5, 05, 05] +2403; [0C A5 CC, 05, 05] -2404; [0C A5 CC, 05, 05] +2404; [0C A5 D3, 05, 05] -2405; [0C A5 D3, 05, 05] +2405; [0C A5 DA, 05, 05] -2406; [0C A5 DA, 05, 05] +2406; [0C A5 E1, 05, 05] -2407; [0C A5 E1, 05, 05] +2407; [0C A5 E8, 05, 05] -2408; [0C A5 E8, 05, 05] +2408; [0C A5 EF, 05, 05] -2409; [0C A5 EF, 05, 05] +2409; [0C A5 F6, 05, 05] -240A; [0C A5 F6, 05, 05] +240A; [0C A5 FD, 05, 05] -240B; [0C A5 FD, 05, 05] +240B; [0C A6 06, 05, 05] -240C; [0C A6 06, 05, 05] +240C; [0C A6 0D, 05, 05] -240D; [0C A6 0D, 05, 05] +240D; [0C A6 14, 05, 05] -240E; [0C A6 14, 05, 05] +240E; [0C A6 1B, 05, 05] -240F; [0C A6 1B, 05, 05] +240F; [0C A6 22, 05, 05] -2410; [0C A6 22, 05, 05] +2410; [0C A6 29, 05, 05] -2411; [0C A6 29, 05, 05] +2411; [0C A6 30, 05, 05] -2412; [0C A6 30, 05, 05] +2412; [0C A6 37, 05, 05] -2413; [0C A6 37, 05, 05] +2413; [0C A6 3E, 05, 05] -2414; [0C A6 3E, 05, 05] +2414; [0C A6 45, 05, 05] -2415; [0C A6 45, 05, 05] +2415; [0C A6 4C, 05, 05] -2416; [0C A6 4C, 05, 05] +2416; [0C A6 53, 05, 05] -2417; [0C A6 53, 05, 05] +2417; [0C A6 5A, 05, 05] -2418; [0C A6 5A, 05, 05] +2418; [0C A6 61, 05, 05] -2419; [0C A6 61, 05, 05] +2419; [0C A6 68, 05, 05] -241A; [0C A6 68, 05, 05] +241A; [0C A6 6F, 05, 05] -241B; [0C A6 6F, 05, 05] +241B; [0C A6 76, 05, 05] -241C; [0C A6 76, 05, 05] +241C; [0C A6 7D, 05, 05] -241D; [0C A6 7D, 05, 05] +241D; [0C A6 84, 05, 05] -241E; [0C A6 84, 05, 05] +241E; [0C A6 8B, 05, 05] -241F; [0C A6 8B, 05, 05] +241F; [0C A6 92, 05, 05] -2420; [0C A6 92, 05, 05] +2420; [0C A6 99, 05, 05] -2421; [0C A6 99, 05, 05] +2421; [0C A6 A0, 05, 05] -2422; [0C A6 A0, 05, 05] +2422; [0C A6 A7, 05, 05] -2423; [0C A6 A7, 05, 05] +2423; [0C A6 AE, 05, 05] -2424; [0C A6 AE, 05, 05] +2424; [0C A6 B5, 05, 05] -2425; [0C A6 B5, 05, 05] +2425; [0C A6 BC, 05, 05] -2426; [0C A6 BC, 05, 05] +2426; [0C A6 C3, 05, 05] -2440; [0C A6 C3, 05, 05] +2440; [0C A6 CA, 05, 05] -2441; [0C A6 CA, 05, 05] +2441; [0C A6 D1, 05, 05] -2442; [0C A6 D1, 05, 05] +2442; [0C A6 D8, 05, 05] -2443; [0C A6 D8, 05, 05] +2443; [0C A6 DF, 05, 05] -2444; [0C A6 DF, 05, 05] +2444; [0C A6 E6, 05, 05] -2445; [0C A6 E6, 05, 05] +2445; [0C A6 ED, 05, 05] -2446; [0C A6 ED, 05, 05] +2446; [0C A6 F4, 05, 05] -2447; [0C A6 F4, 05, 05] +2447; [0C A6 FB, 05, 05] -2448; [0C A6 FB, 05, 05] +2448; [0C A7 04, 05, 05] -2449; [0C A7 04, 05, 05] +2449; [0C A7 0B, 05, 05] -244A; [0C A7 0B, 05, 05] +244A; [0C A7 12, 05, 05] -2500; [0C A7 12, 05, 05] +2500; [0C A7 19, 05, 05] -2501; [0C A7 19, 05, 05] +2501; [0C A7 20, 05, 05] 2502; [0C A9, 05, 05] FFE8; [0C A9, 05, A0] @@ -8198,6838 +8267,6996 @@ FFEE; [0C B6, 05, A0] 2BD1; [0C D8 FD, 05, 05] -2BEC; [0C D9 06, 05, 05] +2BD2; [0C D9 06, 05, 05] + +2BEC; [0C D9 0D, 05, 05] + +2BED; [0C D9 14, 05, 05] + +2BEE; [0C D9 1B, 05, 05] + +2BEF; [0C D9 22, 05, 05] + +2CE5; [0C D9 29, 05, 05] + +2CE6; [0C D9 30, 05, 05] + +2CE7; [0C D9 37, 05, 05] + +2CE8; [0C D9 3E, 05, 05] + +2CE9; [0C D9 45, 05, 05] + +2CEA; [0C D9 4C, 05, 05] + +2800; [0C D9 53, 05, 05] + +2801; [0C D9 5A, 05, 05] + +2802; [0C D9 61, 05, 05] + +2803; [0C D9 68, 05, 05] + +2804; [0C D9 6F, 05, 05] + +2805; [0C D9 76, 05, 05] + +2806; [0C D9 7D, 05, 05] + +2807; [0C D9 84, 05, 05] + +2808; [0C D9 8B, 05, 05] + +2809; [0C D9 92, 05, 05] + +280A; [0C D9 99, 05, 05] + +280B; [0C D9 A0, 05, 05] + +280C; [0C D9 A7, 05, 05] + +280D; [0C D9 AE, 05, 05] + +280E; [0C D9 B5, 05, 05] + +280F; [0C D9 BC, 05, 05] + +2810; [0C D9 C3, 05, 05] + +2811; [0C D9 CA, 05, 05] + +2812; [0C D9 D1, 05, 05] + +2813; [0C D9 D8, 05, 05] + +2814; [0C D9 DF, 05, 05] + +2815; [0C D9 E6, 05, 05] + +2816; [0C D9 ED, 05, 05] + +2817; [0C D9 F4, 05, 05] + +2818; [0C D9 FB, 05, 05] + +2819; [0C DA 04, 05, 05] + +281A; [0C DA 0B, 05, 05] + +281B; [0C DA 12, 05, 05] + +281C; [0C DA 19, 05, 05] + +281D; [0C DA 20, 05, 05] + +281E; [0C DA 27, 05, 05] + +281F; [0C DA 2E, 05, 05] + +2820; [0C DA 35, 05, 05] + +2821; [0C DA 3C, 05, 05] + +2822; [0C DA 43, 05, 05] + +2823; [0C DA 4A, 05, 05] + +2824; [0C DA 51, 05, 05] + +2825; [0C DA 58, 05, 05] -2BED; [0C D9 0D, 05, 05] +2826; [0C DA 5F, 05, 05] -2BEE; [0C D9 14, 05, 05] +2827; [0C DA 66, 05, 05] -2BEF; [0C D9 1B, 05, 05] +2828; [0C DA 6D, 05, 05] -2CE5; [0C D9 22, 05, 05] +2829; [0C DA 74, 05, 05] -2CE6; [0C D9 29, 05, 05] +282A; [0C DA 7B, 05, 05] -2CE7; [0C D9 30, 05, 05] +282B; [0C DA 82, 05, 05] -2CE8; [0C D9 37, 05, 05] +282C; [0C DA 89, 05, 05] -2CE9; [0C D9 3E, 05, 05] +282D; [0C DA 90, 05, 05] -2CEA; [0C D9 45, 05, 05] +282E; [0C DA 97, 05, 05] -2800; [0C D9 4C, 05, 05] +282F; [0C DA 9E, 05, 05] -2801; [0C D9 53, 05, 05] +2830; [0C DA A5, 05, 05] -2802; [0C D9 5A, 05, 05] +2831; [0C DA AC, 05, 05] -2803; [0C D9 61, 05, 05] +2832; [0C DA B3, 05, 05] -2804; [0C D9 68, 05, 05] +2833; [0C DA BA, 05, 05] -2805; [0C D9 6F, 05, 05] +2834; [0C DA C1, 05, 05] -2806; [0C D9 76, 05, 05] +2835; [0C DA C8, 05, 05] -2807; [0C D9 7D, 05, 05] +2836; [0C DA CF, 05, 05] -2808; [0C D9 84, 05, 05] +2837; [0C DA D6, 05, 05] -2809; [0C D9 8B, 05, 05] +2838; [0C DA DD, 05, 05] -280A; [0C D9 92, 05, 05] +2839; [0C DA E4, 05, 05] -280B; [0C D9 99, 05, 05] +283A; [0C DA EB, 05, 05] -280C; [0C D9 A0, 05, 05] +283B; [0C DA F2, 05, 05] -280D; [0C D9 A7, 05, 05] +283C; [0C DA F9, 05, 05] -280E; [0C D9 AE, 05, 05] +283D; [0C DB 02, 05, 05] -280F; [0C D9 B5, 05, 05] +283E; [0C DB 09, 05, 05] -2810; [0C D9 BC, 05, 05] +283F; [0C DB 10, 05, 05] -2811; [0C D9 C3, 05, 05] +2840; [0C DB 17, 05, 05] -2812; [0C D9 CA, 05, 05] +2841; [0C DB 1E, 05, 05] -2813; [0C D9 D1, 05, 05] +2842; [0C DB 25, 05, 05] -2814; [0C D9 D8, 05, 05] +2843; [0C DB 2C, 05, 05] -2815; [0C D9 DF, 05, 05] +2844; [0C DB 33, 05, 05] -2816; [0C D9 E6, 05, 05] +2845; [0C DB 3A, 05, 05] -2817; [0C D9 ED, 05, 05] +2846; [0C DB 41, 05, 05] -2818; [0C D9 F4, 05, 05] +2847; [0C DB 48, 05, 05] -2819; [0C D9 FB, 05, 05] +2848; [0C DB 4F, 05, 05] -281A; [0C DA 04, 05, 05] +2849; [0C DB 56, 05, 05] -281B; [0C DA 0B, 05, 05] +284A; [0C DB 5D, 05, 05] -281C; [0C DA 12, 05, 05] +284B; [0C DB 64, 05, 05] -281D; [0C DA 19, 05, 05] +284C; [0C DB 6B, 05, 05] -281E; [0C DA 20, 05, 05] +284D; [0C DB 72, 05, 05] -281F; [0C DA 27, 05, 05] +284E; [0C DB 79, 05, 05] -2820; [0C DA 2E, 05, 05] +284F; [0C DB 80, 05, 05] -2821; [0C DA 35, 05, 05] +2850; [0C DB 87, 05, 05] -2822; [0C DA 3C, 05, 05] +2851; [0C DB 8E, 05, 05] -2823; [0C DA 43, 05, 05] +2852; [0C DB 95, 05, 05] -2824; [0C DA 4A, 05, 05] +2853; [0C DB 9C, 05, 05] -2825; [0C DA 51, 05, 05] +2854; [0C DB A3, 05, 05] -2826; [0C DA 58, 05, 05] +2855; [0C DB AA, 05, 05] -2827; [0C DA 5F, 05, 05] +2856; [0C DB B1, 05, 05] -2828; [0C DA 66, 05, 05] +2857; [0C DB B8, 05, 05] -2829; [0C DA 6D, 05, 05] +2858; [0C DB BF, 05, 05] -282A; [0C DA 74, 05, 05] +2859; [0C DB C6, 05, 05] -282B; [0C DA 7B, 05, 05] +285A; [0C DB CD, 05, 05] -282C; [0C DA 82, 05, 05] +285B; [0C DB D4, 05, 05] -282D; [0C DA 89, 05, 05] +285C; [0C DB DB, 05, 05] -282E; [0C DA 90, 05, 05] +285D; [0C DB E2, 05, 05] -282F; [0C DA 97, 05, 05] +285E; [0C DB E9, 05, 05] -2830; [0C DA 9E, 05, 05] +285F; [0C DB F0, 05, 05] -2831; [0C DA A5, 05, 05] +2860; [0C DB F7, 05, 05] -2832; [0C DA AC, 05, 05] +2861; [0C DB FE, 05, 05] -2833; [0C DA B3, 05, 05] +2862; [0C DC 07, 05, 05] -2834; [0C DA BA, 05, 05] +2863; [0C DC 0E, 05, 05] -2835; [0C DA C1, 05, 05] +2864; [0C DC 15, 05, 05] -2836; [0C DA C8, 05, 05] +2865; [0C DC 1C, 05, 05] -2837; [0C DA CF, 05, 05] +2866; [0C DC 23, 05, 05] -2838; [0C DA D6, 05, 05] +2867; [0C DC 2A, 05, 05] -2839; [0C DA DD, 05, 05] +2868; [0C DC 31, 05, 05] -283A; [0C DA E4, 05, 05] +2869; [0C DC 38, 05, 05] -283B; [0C DA EB, 05, 05] +286A; [0C DC 3F, 05, 05] -283C; [0C DA F2, 05, 05] +286B; [0C DC 46, 05, 05] -283D; [0C DA F9, 05, 05] +286C; [0C DC 4D, 05, 05] -283E; [0C DB 02, 05, 05] +286D; [0C DC 54, 05, 05] -283F; [0C DB 09, 05, 05] +286E; [0C DC 5B, 05, 05] -2840; [0C DB 10, 05, 05] +286F; [0C DC 62, 05, 05] -2841; [0C DB 17, 05, 05] +2870; [0C DC 69, 05, 05] -2842; [0C DB 1E, 05, 05] +2871; [0C DC 70, 05, 05] -2843; [0C DB 25, 05, 05] +2872; [0C DC 77, 05, 05] -2844; [0C DB 2C, 05, 05] +2873; [0C DC 7E, 05, 05] -2845; [0C DB 33, 05, 05] +2874; [0C DC 85, 05, 05] -2846; [0C DB 3A, 05, 05] +2875; [0C DC 8C, 05, 05] -2847; [0C DB 41, 05, 05] +2876; [0C DC 93, 05, 05] -2848; [0C DB 48, 05, 05] +2877; [0C DC 9A, 05, 05] -2849; [0C DB 4F, 05, 05] +2878; [0C DC A1, 05, 05] -284A; [0C DB 56, 05, 05] +2879; [0C DC A8, 05, 05] -284B; [0C DB 5D, 05, 05] +287A; [0C DC AF, 05, 05] -284C; [0C DB 64, 05, 05] +287B; [0C DC B6, 05, 05] -284D; [0C DB 6B, 05, 05] +287C; [0C DC BD, 05, 05] -284E; [0C DB 72, 05, 05] +287D; [0C DC C4, 05, 05] -284F; [0C DB 79, 05, 05] +287E; [0C DC CB, 05, 05] -2850; [0C DB 80, 05, 05] +287F; [0C DC D2, 05, 05] -2851; [0C DB 87, 05, 05] +2880; [0C DC D9, 05, 05] -2852; [0C DB 8E, 05, 05] +2881; [0C DC E0, 05, 05] -2853; [0C DB 95, 05, 05] +2882; [0C DC E7, 05, 05] -2854; [0C DB 9C, 05, 05] +2883; [0C DC EE, 05, 05] -2855; [0C DB A3, 05, 05] +2884; [0C DC F5, 05, 05] -2856; [0C DB AA, 05, 05] +2885; [0C DC FC, 05, 05] -2857; [0C DB B1, 05, 05] +2886; [0C DD 05, 05, 05] -2858; [0C DB B8, 05, 05] +2887; [0C DD 0C, 05, 05] -2859; [0C DB BF, 05, 05] +2888; [0C DD 13, 05, 05] -285A; [0C DB C6, 05, 05] +2889; [0C DD 1A, 05, 05] -285B; [0C DB CD, 05, 05] +288A; [0C DD 21, 05, 05] -285C; [0C DB D4, 05, 05] +288B; [0C DD 28, 05, 05] -285D; [0C DB DB, 05, 05] +288C; [0C DD 2F, 05, 05] -285E; [0C DB E2, 05, 05] +288D; [0C DD 36, 05, 05] -285F; [0C DB E9, 05, 05] +288E; [0C DD 3D, 05, 05] -2860; [0C DB F0, 05, 05] +288F; [0C DD 44, 05, 05] -2861; [0C DB F7, 05, 05] +2890; [0C DD 4B, 05, 05] -2862; [0C DB FE, 05, 05] +2891; [0C DD 52, 05, 05] -2863; [0C DC 07, 05, 05] +2892; [0C DD 59, 05, 05] -2864; [0C DC 0E, 05, 05] +2893; [0C DD 60, 05, 05] -2865; [0C DC 15, 05, 05] +2894; [0C DD 67, 05, 05] -2866; [0C DC 1C, 05, 05] +2895; [0C DD 6E, 05, 05] -2867; [0C DC 23, 05, 05] +2896; [0C DD 75, 05, 05] -2868; [0C DC 2A, 05, 05] +2897; [0C DD 7C, 05, 05] -2869; [0C DC 31, 05, 05] +2898; [0C DD 83, 05, 05] -286A; [0C DC 38, 05, 05] +2899; [0C DD 8A, 05, 05] -286B; [0C DC 3F, 05, 05] +289A; [0C DD 91, 05, 05] -286C; [0C DC 46, 05, 05] +289B; [0C DD 98, 05, 05] -286D; [0C DC 4D, 05, 05] +289C; [0C DD 9F, 05, 05] -286E; [0C DC 54, 05, 05] +289D; [0C DD A6, 05, 05] -286F; [0C DC 5B, 05, 05] +289E; [0C DD AD, 05, 05] -2870; [0C DC 62, 05, 05] +289F; [0C DD B4, 05, 05] -2871; [0C DC 69, 05, 05] +28A0; [0C DD BB, 05, 05] -2872; [0C DC 70, 05, 05] +28A1; [0C DD C2, 05, 05] -2873; [0C DC 77, 05, 05] +28A2; [0C DD C9, 05, 05] -2874; [0C DC 7E, 05, 05] +28A3; [0C DD D0, 05, 05] -2875; [0C DC 85, 05, 05] +28A4; [0C DD D7, 05, 05] -2876; [0C DC 8C, 05, 05] +28A5; [0C DD DE, 05, 05] -2877; [0C DC 93, 05, 05] +28A6; [0C DD E5, 05, 05] -2878; [0C DC 9A, 05, 05] +28A7; [0C DD EC, 05, 05] -2879; [0C DC A1, 05, 05] +28A8; [0C DD F3, 05, 05] -287A; [0C DC A8, 05, 05] +28A9; [0C DD FA, 05, 05] -287B; [0C DC AF, 05, 05] +28AA; [0C DE 03, 05, 05] -287C; [0C DC B6, 05, 05] +28AB; [0C DE 0A, 05, 05] -287D; [0C DC BD, 05, 05] +28AC; [0C DE 11, 05, 05] -287E; [0C DC C4, 05, 05] +28AD; [0C DE 18, 05, 05] -287F; [0C DC CB, 05, 05] +28AE; [0C DE 1F, 05, 05] -2880; [0C DC D2, 05, 05] +28AF; [0C DE 26, 05, 05] -2881; [0C DC D9, 05, 05] +28B0; [0C DE 2D, 05, 05] -2882; [0C DC E0, 05, 05] +28B1; [0C DE 34, 05, 05] -2883; [0C DC E7, 05, 05] +28B2; [0C DE 3B, 05, 05] -2884; [0C DC EE, 05, 05] +28B3; [0C DE 42, 05, 05] -2885; [0C DC F5, 05, 05] +28B4; [0C DE 49, 05, 05] -2886; [0C DC FC, 05, 05] +28B5; [0C DE 50, 05, 05] -2887; [0C DD 05, 05, 05] +28B6; [0C DE 57, 05, 05] -2888; [0C DD 0C, 05, 05] +28B7; [0C DE 5E, 05, 05] -2889; [0C DD 13, 05, 05] +28B8; [0C DE 65, 05, 05] -288A; [0C DD 1A, 05, 05] +28B9; [0C DE 6C, 05, 05] -288B; [0C DD 21, 05, 05] +28BA; [0C DE 73, 05, 05] -288C; [0C DD 28, 05, 05] +28BB; [0C DE 7A, 05, 05] -288D; [0C DD 2F, 05, 05] +28BC; [0C DE 81, 05, 05] -288E; [0C DD 36, 05, 05] +28BD; [0C DE 88, 05, 05] -288F; [0C DD 3D, 05, 05] +28BE; [0C DE 8F, 05, 05] -2890; [0C DD 44, 05, 05] +28BF; [0C DE 96, 05, 05] -2891; [0C DD 4B, 05, 05] +28C0; [0C DE 9D, 05, 05] -2892; [0C DD 52, 05, 05] +28C1; [0C DE A4, 05, 05] -2893; [0C DD 59, 05, 05] +28C2; [0C DE AB, 05, 05] -2894; [0C DD 60, 05, 05] +28C3; [0C DE B2, 05, 05] -2895; [0C DD 67, 05, 05] +28C4; [0C DE B9, 05, 05] -2896; [0C DD 6E, 05, 05] +28C5; [0C DE C0, 05, 05] -2897; [0C DD 75, 05, 05] +28C6; [0C DE C7, 05, 05] -2898; [0C DD 7C, 05, 05] +28C7; [0C DE CE, 05, 05] -2899; [0C DD 83, 05, 05] +28C8; [0C DE D5, 05, 05] -289A; [0C DD 8A, 05, 05] +28C9; [0C DE DC, 05, 05] -289B; [0C DD 91, 05, 05] +28CA; [0C DE E3, 05, 05] -289C; [0C DD 98, 05, 05] +28CB; [0C DE EA, 05, 05] -289D; [0C DD 9F, 05, 05] +28CC; [0C DE F1, 05, 05] -289E; [0C DD A6, 05, 05] +28CD; [0C DE F8, 05, 05] -289F; [0C DD AD, 05, 05] +28CE; [0C DE FF, 05, 05] -28A0; [0C DD B4, 05, 05] +28CF; [0C DF 08, 05, 05] -28A1; [0C DD BB, 05, 05] +28D0; [0C DF 0F, 05, 05] -28A2; [0C DD C2, 05, 05] +28D1; [0C DF 16, 05, 05] -28A3; [0C DD C9, 05, 05] +28D2; [0C DF 1D, 05, 05] -28A4; [0C DD D0, 05, 05] +28D3; [0C DF 24, 05, 05] -28A5; [0C DD D7, 05, 05] +28D4; [0C DF 2B, 05, 05] -28A6; [0C DD DE, 05, 05] +28D5; [0C DF 32, 05, 05] -28A7; [0C DD E5, 05, 05] +28D6; [0C DF 39, 05, 05] -28A8; [0C DD EC, 05, 05] +28D7; [0C DF 40, 05, 05] -28A9; [0C DD F3, 05, 05] +28D8; [0C DF 47, 05, 05] -28AA; [0C DD FA, 05, 05] +28D9; [0C DF 4E, 05, 05] -28AB; [0C DE 03, 05, 05] +28DA; [0C DF 55, 05, 05] -28AC; [0C DE 0A, 05, 05] +28DB; [0C DF 5C, 05, 05] -28AD; [0C DE 11, 05, 05] +28DC; [0C DF 63, 05, 05] -28AE; [0C DE 18, 05, 05] +28DD; [0C DF 6A, 05, 05] -28AF; [0C DE 1F, 05, 05] +28DE; [0C DF 71, 05, 05] -28B0; [0C DE 26, 05, 05] +28DF; [0C DF 78, 05, 05] -28B1; [0C DE 2D, 05, 05] +28E0; [0C DF 7F, 05, 05] -28B2; [0C DE 34, 05, 05] +28E1; [0C DF 86, 05, 05] -28B3; [0C DE 3B, 05, 05] +28E2; [0C DF 8D, 05, 05] -28B4; [0C DE 42, 05, 05] +28E3; [0C DF 94, 05, 05] -28B5; [0C DE 49, 05, 05] +28E4; [0C DF 9B, 05, 05] -28B6; [0C DE 50, 05, 05] +28E5; [0C DF A2, 05, 05] -28B7; [0C DE 57, 05, 05] +28E6; [0C DF A9, 05, 05] -28B8; [0C DE 5E, 05, 05] +28E7; [0C DF B0, 05, 05] -28B9; [0C DE 65, 05, 05] +28E8; [0C DF B7, 05, 05] -28BA; [0C DE 6C, 05, 05] +28E9; [0C DF BE, 05, 05] -28BB; [0C DE 73, 05, 05] +28EA; [0C DF C5, 05, 05] -28BC; [0C DE 7A, 05, 05] +28EB; [0C DF CC, 05, 05] -28BD; [0C DE 81, 05, 05] +28EC; [0C DF D3, 05, 05] -28BE; [0C DE 88, 05, 05] +28ED; [0C DF DA, 05, 05] -28BF; [0C DE 8F, 05, 05] +28EE; [0C DF E1, 05, 05] -28C0; [0C DE 96, 05, 05] +28EF; [0C DF E8, 05, 05] -28C1; [0C DE 9D, 05, 05] +28F0; [0C DF EF, 05, 05] -28C2; [0C DE A4, 05, 05] +28F1; [0C DF F6, 05, 05] -28C3; [0C DE AB, 05, 05] +28F2; [0C DF FD, 05, 05] -28C4; [0C DE B2, 05, 05] +28F3; [0C E0 06, 05, 05] -28C5; [0C DE B9, 05, 05] +28F4; [0C E0 0D, 05, 05] -28C6; [0C DE C0, 05, 05] +28F5; [0C E0 14, 05, 05] -28C7; [0C DE C7, 05, 05] +28F6; [0C E0 1B, 05, 05] -28C8; [0C DE CE, 05, 05] +28F7; [0C E0 22, 05, 05] -28C9; [0C DE D5, 05, 05] +28F8; [0C E0 29, 05, 05] -28CA; [0C DE DC, 05, 05] +28F9; [0C E0 30, 05, 05] -28CB; [0C DE E3, 05, 05] +28FA; [0C E0 37, 05, 05] -28CC; [0C DE EA, 05, 05] +28FB; [0C E0 3E, 05, 05] -28CD; [0C DE F1, 05, 05] +28FC; [0C E0 45, 05, 05] -28CE; [0C DE F8, 05, 05] +28FD; [0C E0 4C, 05, 05] -28CF; [0C DE FF, 05, 05] +28FE; [0C E0 53, 05, 05] -28D0; [0C DF 08, 05, 05] +28FF; [0C E0 5A, 05, 05] -28D1; [0C DF 0F, 05, 05] +268A; [0C E0 61, 05, 05] -28D2; [0C DF 16, 05, 05] +268B; [0C E0 68, 05, 05] -28D3; [0C DF 1D, 05, 05] +268C; [0C E0 6F, 05, 05] -28D4; [0C DF 24, 05, 05] +268D; [0C E0 76, 05, 05] -28D5; [0C DF 2B, 05, 05] +268E; [0C E0 7D, 05, 05] -28D6; [0C DF 32, 05, 05] +268F; [0C E0 84, 05, 05] -28D7; [0C DF 39, 05, 05] +2630; [0C E0 8B, 05, 05] -28D8; [0C DF 40, 05, 05] +2631; [0C E0 92, 05, 05] -28D9; [0C DF 47, 05, 05] +2632; [0C E0 99, 05, 05] -28DA; [0C DF 4E, 05, 05] +2633; [0C E0 A0, 05, 05] -28DB; [0C DF 55, 05, 05] +2634; [0C E0 A7, 05, 05] -28DC; [0C DF 5C, 05, 05] +2635; [0C E0 AE, 05, 05] -28DD; [0C DF 63, 05, 05] +2636; [0C E0 B5, 05, 05] -28DE; [0C DF 6A, 05, 05] +2637; [0C E0 BC, 05, 05] -28DF; [0C DF 71, 05, 05] +4DC0; [0C E0 C3, 05, 05] -28E0; [0C DF 78, 05, 05] +4DC1; [0C E0 CA, 05, 05] -28E1; [0C DF 7F, 05, 05] +4DC2; [0C E0 D1, 05, 05] -28E2; [0C DF 86, 05, 05] +4DC3; [0C E0 D8, 05, 05] -28E3; [0C DF 8D, 05, 05] +4DC4; [0C E0 DF, 05, 05] -28E4; [0C DF 94, 05, 05] +4DC5; [0C E0 E6, 05, 05] -28E5; [0C DF 9B, 05, 05] +4DC6; [0C E0 ED, 05, 05] -28E6; [0C DF A2, 05, 05] +4DC7; [0C E0 F4, 05, 05] -28E7; [0C DF A9, 05, 05] +4DC8; [0C E0 FB, 05, 05] -28E8; [0C DF B0, 05, 05] +4DC9; [0C E1 04, 05, 05] -28E9; [0C DF B7, 05, 05] +4DCA; [0C E1 0B, 05, 05] -28EA; [0C DF BE, 05, 05] +4DCB; [0C E1 12, 05, 05] -28EB; [0C DF C5, 05, 05] +4DCC; [0C E1 19, 05, 05] -28EC; [0C DF CC, 05, 05] +4DCD; [0C E1 20, 05, 05] -28ED; [0C DF D3, 05, 05] +4DCE; [0C E1 27, 05, 05] -28EE; [0C DF DA, 05, 05] +4DCF; [0C E1 2E, 05, 05] -28EF; [0C DF E1, 05, 05] +4DD0; [0C E1 35, 05, 05] -28F0; [0C DF E8, 05, 05] +4DD1; [0C E1 3C, 05, 05] -28F1; [0C DF EF, 05, 05] +4DD2; [0C E1 43, 05, 05] -28F2; [0C DF F6, 05, 05] +4DD3; [0C E1 4A, 05, 05] -28F3; [0C DF FD, 05, 05] +4DD4; [0C E1 51, 05, 05] -28F4; [0C E0 06, 05, 05] +4DD5; [0C E1 58, 05, 05] -28F5; [0C E0 0D, 05, 05] +4DD6; [0C E1 5F, 05, 05] -28F6; [0C E0 14, 05, 05] +4DD7; [0C E1 66, 05, 05] -28F7; [0C E0 1B, 05, 05] +4DD8; [0C E1 6D, 05, 05] -28F8; [0C E0 22, 05, 05] +4DD9; [0C E1 74, 05, 05] -28F9; [0C E0 29, 05, 05] +4DDA; [0C E1 7B, 05, 05] -28FA; [0C E0 30, 05, 05] +4DDB; [0C E1 82, 05, 05] -28FB; [0C E0 37, 05, 05] +4DDC; [0C E1 89, 05, 05] -28FC; [0C E0 3E, 05, 05] +4DDD; [0C E1 90, 05, 05] -28FD; [0C E0 45, 05, 05] +4DDE; [0C E1 97, 05, 05] -28FE; [0C E0 4C, 05, 05] +4DDF; [0C E1 9E, 05, 05] -28FF; [0C E0 53, 05, 05] +4DE0; [0C E1 A5, 05, 05] -268A; [0C E0 5A, 05, 05] +4DE1; [0C E1 AC, 05, 05] -268B; [0C E0 61, 05, 05] +4DE2; [0C E1 B3, 05, 05] -268C; [0C E0 68, 05, 05] +4DE3; [0C E1 BA, 05, 05] -268D; [0C E0 6F, 05, 05] +4DE4; [0C E1 C1, 05, 05] -268E; [0C E0 76, 05, 05] +4DE5; [0C E1 C8, 05, 05] -268F; [0C E0 7D, 05, 05] +4DE6; [0C E1 CF, 05, 05] -2630; [0C E0 84, 05, 05] +4DE7; [0C E1 D6, 05, 05] -2631; [0C E0 8B, 05, 05] +4DE8; [0C E1 DD, 05, 05] -2632; [0C E0 92, 05, 05] +4DE9; [0C E1 E4, 05, 05] -2633; [0C E0 99, 05, 05] +4DEA; [0C E1 EB, 05, 05] -2634; [0C E0 A0, 05, 05] +4DEB; [0C E1 F2, 05, 05] -2635; [0C E0 A7, 05, 05] +4DEC; [0C E1 F9, 05, 05] -2636; [0C E0 AE, 05, 05] +4DED; [0C E2 02, 05, 05] -2637; [0C E0 B5, 05, 05] +4DEE; [0C E2 09, 05, 05] -4DC0; [0C E0 BC, 05, 05] +4DEF; [0C E2 10, 05, 05] -4DC1; [0C E0 C3, 05, 05] +4DF0; [0C E2 17, 05, 05] -4DC2; [0C E0 CA, 05, 05] +4DF1; [0C E2 1E, 05, 05] -4DC3; [0C E0 D1, 05, 05] +4DF2; [0C E2 25, 05, 05] -4DC4; [0C E0 D8, 05, 05] +4DF3; [0C E2 2C, 05, 05] -4DC5; [0C E0 DF, 05, 05] +4DF4; [0C E2 33, 05, 05] -4DC6; [0C E0 E6, 05, 05] +4DF5; [0C E2 3A, 05, 05] -4DC7; [0C E0 ED, 05, 05] +4DF6; [0C E2 41, 05, 05] -4DC8; [0C E0 F4, 05, 05] +4DF7; [0C E2 48, 05, 05] -4DC9; [0C E0 FB, 05, 05] +4DF8; [0C E2 4F, 05, 05] -4DCA; [0C E1 04, 05, 05] +4DF9; [0C E2 56, 05, 05] -4DCB; [0C E1 0B, 05, 05] +4DFA; [0C E2 5D, 05, 05] -4DCC; [0C E1 12, 05, 05] +4DFB; [0C E2 64, 05, 05] -4DCD; [0C E1 19, 05, 05] +4DFC; [0C E2 6B, 05, 05] -4DCE; [0C E1 20, 05, 05] +4DFD; [0C E2 72, 05, 05] -4DCF; [0C E1 27, 05, 05] +4DFE; [0C E2 79, 05, 05] -4DD0; [0C E1 2E, 05, 05] +4DFF; [0C E2 80, 05, 05] -4DD1; [0C E1 35, 05, 05] +1D300; [0C E2 87, 05, 05] -4DD2; [0C E1 3C, 05, 05] +1D301; [0C E2 8E, 05, 05] -4DD3; [0C E1 43, 05, 05] +1D302; [0C E2 95, 05, 05] -4DD4; [0C E1 4A, 05, 05] +1D303; [0C E2 9C, 05, 05] -4DD5; [0C E1 51, 05, 05] +1D304; [0C E2 A3, 05, 05] -4DD6; [0C E1 58, 05, 05] +1D305; [0C E2 AA, 05, 05] -4DD7; [0C E1 5F, 05, 05] +1D306; [0C E2 B1, 05, 05] -4DD8; [0C E1 66, 05, 05] +1D307; [0C E2 B8, 05, 05] -4DD9; [0C E1 6D, 05, 05] +1D308; [0C E2 BF, 05, 05] -4DDA; [0C E1 74, 05, 05] +1D309; [0C E2 C6, 05, 05] -4DDB; [0C E1 7B, 05, 05] +1D30A; [0C E2 CD, 05, 05] -4DDC; [0C E1 82, 05, 05] +1D30B; [0C E2 D4, 05, 05] -4DDD; [0C E1 89, 05, 05] +1D30C; [0C E2 DB, 05, 05] -4DDE; [0C E1 90, 05, 05] +1D30D; [0C E2 E2, 05, 05] -4DDF; [0C E1 97, 05, 05] +1D30E; [0C E2 E9, 05, 05] -4DE0; [0C E1 9E, 05, 05] +1D30F; [0C E2 F0, 05, 05] -4DE1; [0C E1 A5, 05, 05] +1D310; [0C E2 F7, 05, 05] -4DE2; [0C E1 AC, 05, 05] +1D311; [0C E2 FE, 05, 05] -4DE3; [0C E1 B3, 05, 05] +1D312; [0C E3 07, 05, 05] -4DE4; [0C E1 BA, 05, 05] +1D313; [0C E3 0E, 05, 05] -4DE5; [0C E1 C1, 05, 05] +1D314; [0C E3 15, 05, 05] -4DE6; [0C E1 C8, 05, 05] +1D315; [0C E3 1C, 05, 05] -4DE7; [0C E1 CF, 05, 05] +1D316; [0C E3 23, 05, 05] -4DE8; [0C E1 D6, 05, 05] +1D317; [0C E3 2A, 05, 05] -4DE9; [0C E1 DD, 05, 05] +1D318; [0C E3 31, 05, 05] -4DEA; [0C E1 E4, 05, 05] +1D319; [0C E3 38, 05, 05] -4DEB; [0C E1 EB, 05, 05] +1D31A; [0C E3 3F, 05, 05] -4DEC; [0C E1 F2, 05, 05] +1D31B; [0C E3 46, 05, 05] -4DED; [0C E1 F9, 05, 05] +1D31C; [0C E3 4D, 05, 05] -4DEE; [0C E2 02, 05, 05] +1D31D; [0C E3 54, 05, 05] -4DEF; [0C E2 09, 05, 05] +1D31E; [0C E3 5B, 05, 05] -4DF0; [0C E2 10, 05, 05] +1D31F; [0C E3 62, 05, 05] -4DF1; [0C E2 17, 05, 05] +1D320; [0C E3 69, 05, 05] -4DF2; [0C E2 1E, 05, 05] +1D321; [0C E3 70, 05, 05] -4DF3; [0C E2 25, 05, 05] +1D322; [0C E3 77, 05, 05] -4DF4; [0C E2 2C, 05, 05] +1D323; [0C E3 7E, 05, 05] -4DF5; [0C E2 33, 05, 05] +1D324; [0C E3 85, 05, 05] -4DF6; [0C E2 3A, 05, 05] +1D325; [0C E3 8C, 05, 05] -4DF7; [0C E2 41, 05, 05] +1D326; [0C E3 93, 05, 05] -4DF8; [0C E2 48, 05, 05] +1D327; [0C E3 9A, 05, 05] -4DF9; [0C E2 4F, 05, 05] +1D328; [0C E3 A1, 05, 05] -4DFA; [0C E2 56, 05, 05] +1D329; [0C E3 A8, 05, 05] -4DFB; [0C E2 5D, 05, 05] +1D32A; [0C E3 AF, 05, 05] -4DFC; [0C E2 64, 05, 05] +1D32B; [0C E3 B6, 05, 05] -4DFD; [0C E2 6B, 05, 05] +1D32C; [0C E3 BD, 05, 05] -4DFE; [0C E2 72, 05, 05] +1D32D; [0C E3 C4, 05, 05] -4DFF; [0C E2 79, 05, 05] +1D32E; [0C E3 CB, 05, 05] -1D300; [0C E2 80, 05, 05] +1D32F; [0C E3 D2, 05, 05] -1D301; [0C E2 87, 05, 05] +1D330; [0C E3 D9, 05, 05] -1D302; [0C E2 8E, 05, 05] +1D331; [0C E3 E0, 05, 05] -1D303; [0C E2 95, 05, 05] +1D332; [0C E3 E7, 05, 05] -1D304; [0C E2 9C, 05, 05] +1D333; [0C E3 EE, 05, 05] -1D305; [0C E2 A3, 05, 05] +1D334; [0C E3 F5, 05, 05] -1D306; [0C E2 AA, 05, 05] +1D335; [0C E3 FC, 05, 05] -1D307; [0C E2 B1, 05, 05] +1D336; [0C E4 05, 05, 05] -1D308; [0C E2 B8, 05, 05] +1D337; [0C E4 0C, 05, 05] -1D309; [0C E2 BF, 05, 05] +1D338; [0C E4 13, 05, 05] -1D30A; [0C E2 C6, 05, 05] +1D339; [0C E4 1A, 05, 05] -1D30B; [0C E2 CD, 05, 05] +1D33A; [0C E4 21, 05, 05] -1D30C; [0C E2 D4, 05, 05] +1D33B; [0C E4 28, 05, 05] -1D30D; [0C E2 DB, 05, 05] +1D33C; [0C E4 2F, 05, 05] -1D30E; [0C E2 E2, 05, 05] +1D33D; [0C E4 36, 05, 05] -1D30F; [0C E2 E9, 05, 05] +1D33E; [0C E4 3D, 05, 05] -1D310; [0C E2 F0, 05, 05] +1D33F; [0C E4 44, 05, 05] -1D311; [0C E2 F7, 05, 05] +1D340; [0C E4 4B, 05, 05] -1D312; [0C E2 FE, 05, 05] +1D341; [0C E4 52, 05, 05] -1D313; [0C E3 07, 05, 05] +1D342; [0C E4 59, 05, 05] -1D314; [0C E3 0E, 05, 05] +1D343; [0C E4 60, 05, 05] -1D315; [0C E3 15, 05, 05] +1D344; [0C E4 67, 05, 05] -1D316; [0C E3 1C, 05, 05] +1D345; [0C E4 6E, 05, 05] -1D317; [0C E3 23, 05, 05] +1D346; [0C E4 75, 05, 05] -1D318; [0C E3 2A, 05, 05] +1D347; [0C E4 7C, 05, 05] -1D319; [0C E3 31, 05, 05] +1D348; [0C E4 83, 05, 05] -1D31A; [0C E3 38, 05, 05] +1D349; [0C E4 8A, 05, 05] -1D31B; [0C E3 3F, 05, 05] +1D34A; [0C E4 91, 05, 05] -1D31C; [0C E3 46, 05, 05] +1D34B; [0C E4 98, 05, 05] -1D31D; [0C E3 4D, 05, 05] +1D34C; [0C E4 9F, 05, 05] -1D31E; [0C E3 54, 05, 05] +1D34D; [0C E4 A6, 05, 05] -1D31F; [0C E3 5B, 05, 05] +1D34E; [0C E4 AD, 05, 05] -1D320; [0C E3 62, 05, 05] +1D34F; [0C E4 B4, 05, 05] -1D321; [0C E3 69, 05, 05] +1D350; [0C E4 BB, 05, 05] -1D322; [0C E3 70, 05, 05] +1D351; [0C E4 C2, 05, 05] -1D323; [0C E3 77, 05, 05] +1D352; [0C E4 C9, 05, 05] -1D324; [0C E3 7E, 05, 05] +1D353; [0C E4 D0, 05, 05] -1D325; [0C E3 85, 05, 05] +1D354; [0C E4 D7, 05, 05] -1D326; [0C E3 8C, 05, 05] +1D355; [0C E4 DE, 05, 05] -1D327; [0C E3 93, 05, 05] +1D356; [0C E4 E5, 05, 05] -1D328; [0C E3 9A, 05, 05] +A490; [0C E4 EC, 05, 05] -1D329; [0C E3 A1, 05, 05] +A491; [0C E4 F3, 05, 05] -1D32A; [0C E3 A8, 05, 05] +A492; [0C E4 FA, 05, 05] -1D32B; [0C E3 AF, 05, 05] +A493; [0C E5 03, 05, 05] -1D32C; [0C E3 B6, 05, 05] +A494; [0C E5 0A, 05, 05] -1D32D; [0C E3 BD, 05, 05] +A495; [0C E5 11, 05, 05] -1D32E; [0C E3 C4, 05, 05] +A496; [0C E5 18, 05, 05] -1D32F; [0C E3 CB, 05, 05] +A497; [0C E5 1F, 05, 05] -1D330; [0C E3 D2, 05, 05] +A498; [0C E5 26, 05, 05] -1D331; [0C E3 D9, 05, 05] +A499; [0C E5 2D, 05, 05] -1D332; [0C E3 E0, 05, 05] +A49A; [0C E5 34, 05, 05] -1D333; [0C E3 E7, 05, 05] +A49B; [0C E5 3B, 05, 05] -1D334; [0C E3 EE, 05, 05] +A49C; [0C E5 42, 05, 05] -1D335; [0C E3 F5, 05, 05] +A49D; [0C E5 49, 05, 05] -1D336; [0C E3 FC, 05, 05] +A49E; [0C E5 50, 05, 05] -1D337; [0C E4 05, 05, 05] +A49F; [0C E5 57, 05, 05] -1D338; [0C E4 0C, 05, 05] +A4A0; [0C E5 5E, 05, 05] -1D339; [0C E4 13, 05, 05] +A4A1; [0C E5 65, 05, 05] -1D33A; [0C E4 1A, 05, 05] +A4A2; [0C E5 6C, 05, 05] -1D33B; [0C E4 21, 05, 05] +A4A3; [0C E5 73, 05, 05] -1D33C; [0C E4 28, 05, 05] +A4A4; [0C E5 7A, 05, 05] -1D33D; [0C E4 2F, 05, 05] +A4A5; [0C E5 81, 05, 05] -1D33E; [0C E4 36, 05, 05] +A4A6; [0C E5 88, 05, 05] -1D33F; [0C E4 3D, 05, 05] +A4A7; [0C E5 8F, 05, 05] -1D340; [0C E4 44, 05, 05] +A4A8; [0C E5 96, 05, 05] -1D341; [0C E4 4B, 05, 05] +A4A9; [0C E5 9D, 05, 05] -1D342; [0C E4 52, 05, 05] +A4AA; [0C E5 A4, 05, 05] -1D343; [0C E4 59, 05, 05] +A4AB; [0C E5 AB, 05, 05] -1D344; [0C E4 60, 05, 05] +A4AC; [0C E5 B2, 05, 05] -1D345; [0C E4 67, 05, 05] +A4AD; [0C E5 B9, 05, 05] -1D346; [0C E4 6E, 05, 05] +A4AE; [0C E5 C0, 05, 05] -1D347; [0C E4 75, 05, 05] +A4AF; [0C E5 C7, 05, 05] -1D348; [0C E4 7C, 05, 05] +A4B0; [0C E5 CE, 05, 05] -1D349; [0C E4 83, 05, 05] +A4B1; [0C E5 D5, 05, 05] -1D34A; [0C E4 8A, 05, 05] +A4B2; [0C E5 DC, 05, 05] -1D34B; [0C E4 91, 05, 05] +A4B3; [0C E5 E3, 05, 05] -1D34C; [0C E4 98, 05, 05] +A4B4; [0C E5 EA, 05, 05] -1D34D; [0C E4 9F, 05, 05] +A4B5; [0C E5 F1, 05, 05] -1D34E; [0C E4 A6, 05, 05] +A4B6; [0C E5 F8, 05, 05] -1D34F; [0C E4 AD, 05, 05] +A4B7; [0C E5 FF, 05, 05] -1D350; [0C E4 B4, 05, 05] +A4B8; [0C E6 08, 05, 05] -1D351; [0C E4 BB, 05, 05] +A4B9; [0C E6 0F, 05, 05] -1D352; [0C E4 C2, 05, 05] +A4BA; [0C E6 16, 05, 05] -1D353; [0C E4 C9, 05, 05] +A4BB; [0C E6 1D, 05, 05] -1D354; [0C E4 D0, 05, 05] +A4BC; [0C E6 24, 05, 05] -1D355; [0C E4 D7, 05, 05] +A4BD; [0C E6 2B, 05, 05] -1D356; [0C E4 DE, 05, 05] +A4BE; [0C E6 32, 05, 05] -A490; [0C E4 E5, 05, 05] +A4BF; [0C E6 39, 05, 05] -A491; [0C E4 EC, 05, 05] +A4C0; [0C E6 40, 05, 05] -A492; [0C E4 F3, 05, 05] +A4C1; [0C E6 47, 05, 05] -A493; [0C E4 FA, 05, 05] +A4C2; [0C E6 4E, 05, 05] -A494; [0C E5 03, 05, 05] +A4C3; [0C E6 55, 05, 05] -A495; [0C E5 0A, 05, 05] +A4C4; [0C E6 5C, 05, 05] -A496; [0C E5 11, 05, 05] +A4C5; [0C E6 63, 05, 05] -A497; [0C E5 18, 05, 05] +A4C6; [0C E6 6A, 05, 05] -A498; [0C E5 1F, 05, 05] +10137; [0C E6 71, 05, 05] -A499; [0C E5 26, 05, 05] +10138; [0C E6 78, 05, 05] -A49A; [0C E5 2D, 05, 05] +10139; [0C E6 7F, 05, 05] -A49B; [0C E5 34, 05, 05] +1013A; [0C E6 86, 05, 05] -A49C; [0C E5 3B, 05, 05] +1013B; [0C E6 8D, 05, 05] -A49D; [0C E5 42, 05, 05] +1013C; [0C E6 94, 05, 05] -A49E; [0C E5 49, 05, 05] +1013D; [0C E6 9B, 05, 05] -A49F; [0C E5 50, 05, 05] +1013E; [0C E6 A2, 05, 05] -A4A0; [0C E5 57, 05, 05] +1013F; [0C E6 A9, 05, 05] -A4A1; [0C E5 5E, 05, 05] +10179; [0C E6 B0, 05, 05] -A4A2; [0C E5 65, 05, 05] +1017A; [0C E6 B7, 05, 05] -A4A3; [0C E5 6C, 05, 05] +1017B; [0C E6 BE, 05, 05] -A4A4; [0C E5 73, 05, 05] +1017C; [0C E6 C5, 05, 05] -A4A5; [0C E5 7A, 05, 05] +1017D; [0C E6 CC, 05, 05] -A4A6; [0C E5 81, 05, 05] +1017E; [0C E6 D3, 05, 05] -A4A7; [0C E5 88, 05, 05] +1017F; [0C E6 DA, 05, 05] -A4A8; [0C E5 8F, 05, 05] +10180; [0C E6 E1, 05, 05] -A4A9; [0C E5 96, 05, 05] +10181; [0C E6 E8, 05, 05] -A4AA; [0C E5 9D, 05, 05] +10182; [0C E6 EF, 05, 05] -A4AB; [0C E5 A4, 05, 05] +10183; [0C E6 F6, 05, 05] -A4AC; [0C E5 AB, 05, 05] +10184; [0C E6 FD, 05, 05] -A4AD; [0C E5 B2, 05, 05] +10185; [0C E7 06, 05, 05] -A4AE; [0C E5 B9, 05, 05] +10186; [0C E7 0D, 05, 05] -A4AF; [0C E5 C0, 05, 05] +10187; [0C E7 14, 05, 05] -A4B0; [0C E5 C7, 05, 05] +10188; [0C E7 1B, 05, 05] -A4B1; [0C E5 CE, 05, 05] +10189; [0C E7 22, 05, 05] -A4B2; [0C E5 D5, 05, 05] +1018C; [0C E7 29, 05, 05] -A4B3; [0C E5 DC, 05, 05] +1018D; [0C E7 30, 05, 05] -A4B4; [0C E5 E3, 05, 05] +1018E; [0C E7 37, 05, 05] -A4B5; [0C E5 EA, 05, 05] +10190; [0C E7 3E, 05, 05] -A4B6; [0C E5 F1, 05, 05] +10191; [0C E7 45, 05, 05] -A4B7; [0C E5 F8, 05, 05] +10192; [0C E7 4C, 05, 05] -A4B8; [0C E5 FF, 05, 05] +10193; [0C E7 53, 05, 05] -A4B9; [0C E6 08, 05, 05] +10194; [0C E7 5A, 05, 05] -A4BA; [0C E6 0F, 05, 05] +10195; [0C E7 61, 05, 05] -A4BB; [0C E6 16, 05, 05] +10196; [0C E7 68, 05, 05] -A4BC; [0C E6 1D, 05, 05] +10197; [0C E7 6F, 05, 05] -A4BD; [0C E6 24, 05, 05] +10198; [0C E7 76, 05, 05] -A4BE; [0C E6 2B, 05, 05] +10199; [0C E7 7D, 05, 05] -A4BF; [0C E6 32, 05, 05] +1019A; [0C E7 84, 05, 05] -A4C0; [0C E6 39, 05, 05] +1019B; [0C E7 8B, 05, 05] -A4C1; [0C E6 40, 05, 05] +101A0; [0C E7 92, 05, 05] -A4C2; [0C E6 47, 05, 05] +101D0; [0C E7 99, 05, 05] -A4C3; [0C E6 4E, 05, 05] +101D1; [0C E7 A0, 05, 05] -A4C4; [0C E6 55, 05, 05] +101D2; [0C E7 A7, 05, 05] -A4C5; [0C E6 5C, 05, 05] +101D3; [0C E7 AE, 05, 05] -A4C6; [0C E6 63, 05, 05] +101D4; [0C E7 B5, 05, 05] -10137; [0C E6 6A, 05, 05] +101D5; [0C E7 BC, 05, 05] -10138; [0C E6 71, 05, 05] +101D6; [0C E7 C3, 05, 05] -10139; [0C E6 78, 05, 05] +101D7; [0C E7 CA, 05, 05] -1013A; [0C E6 7F, 05, 05] +101D8; [0C E7 D1, 05, 05] -1013B; [0C E6 86, 05, 05] +101D9; [0C E7 D8, 05, 05] -1013C; [0C E6 8D, 05, 05] +101DA; [0C E7 DF, 05, 05] -1013D; [0C E6 94, 05, 05] +101DB; [0C E7 E6, 05, 05] -1013E; [0C E6 9B, 05, 05] +101DC; [0C E7 ED, 05, 05] -1013F; [0C E6 A2, 05, 05] +101DD; [0C E7 F4, 05, 05] -10179; [0C E6 A9, 05, 05] +101DE; [0C E7 FB, 05, 05] -1017A; [0C E6 B0, 05, 05] +101DF; [0C E8 04, 05, 05] -1017B; [0C E6 B7, 05, 05] +101E0; [0C E8 0B, 05, 05] -1017C; [0C E6 BE, 05, 05] +101E1; [0C E8 12, 05, 05] -1017D; [0C E6 C5, 05, 05] +101E2; [0C E8 19, 05, 05] -1017E; [0C E6 CC, 05, 05] +101E3; [0C E8 20, 05, 05] -1017F; [0C E6 D3, 05, 05] +101E4; [0C E8 27, 05, 05] -10180; [0C E6 DA, 05, 05] +101E5; [0C E8 2E, 05, 05] -10181; [0C E6 E1, 05, 05] +101E6; [0C E8 35, 05, 05] -10182; [0C E6 E8, 05, 05] +101E7; [0C E8 3C, 05, 05] -10183; [0C E6 EF, 05, 05] +101E8; [0C E8 43, 05, 05] -10184; [0C E6 F6, 05, 05] +101E9; [0C E8 4A, 05, 05] -10185; [0C E6 FD, 05, 05] +101EA; [0C E8 51, 05, 05] -10186; [0C E7 06, 05, 05] +101EB; [0C E8 58, 05, 05] -10187; [0C E7 0D, 05, 05] +101EC; [0C E8 5F, 05, 05] -10188; [0C E7 14, 05, 05] +101ED; [0C E8 66, 05, 05] -10189; [0C E7 1B, 05, 05] +101EE; [0C E8 6D, 05, 05] -1018C; [0C E7 22, 05, 05] +101EF; [0C E8 74, 05, 05] -1018D; [0C E7 29, 05, 05] +101F0; [0C E8 7B, 05, 05] -1018E; [0C E7 30, 05, 05] +101F1; [0C E8 82, 05, 05] -10190; [0C E7 37, 05, 05] +101F2; [0C E8 89, 05, 05] -10191; [0C E7 3E, 05, 05] +101F3; [0C E8 90, 05, 05] -10192; [0C E7 45, 05, 05] +101F4; [0C E8 97, 05, 05] -10193; [0C E7 4C, 05, 05] +101F5; [0C E8 9E, 05, 05] -10194; [0C E7 53, 05, 05] +101F6; [0C E8 A5, 05, 05] -10195; [0C E7 5A, 05, 05] +101F7; [0C E8 AC, 05, 05] -10196; [0C E7 61, 05, 05] +101F8; [0C E8 B3, 05, 05] -10197; [0C E7 68, 05, 05] +101F9; [0C E8 BA, 05, 05] -10198; [0C E7 6F, 05, 05] +101FA; [0C E8 C1, 05, 05] -10199; [0C E7 76, 05, 05] +101FB; [0C E8 C8, 05, 05] -1019A; [0C E7 7D, 05, 05] +101FC; [0C E8 CF, 05, 05] -1019B; [0C E7 84, 05, 05] +10877; [0C E8 D6, 05, 05] -101A0; [0C E7 8B, 05, 05] +10878; [0C E8 DD, 05, 05] -101D0; [0C E7 92, 05, 05] +16B3C; [0C E8 E4, 05, 05] -101D1; [0C E7 99, 05, 05] +16B3D; [0C E8 EB, 05, 05] -101D2; [0C E7 A0, 05, 05] +16B3E; [0C E8 F2, 05, 05] -101D3; [0C E7 A7, 05, 05] +16B3F; [0C E8 F9, 05, 05] -101D4; [0C E7 AE, 05, 05] +16B45; [0C E9 02, 05, 05] -101D5; [0C E7 B5, 05, 05] +1D000; [0C E9 09, 05, 05] -101D6; [0C E7 BC, 05, 05] +1D001; [0C E9 10, 05, 05] -101D7; [0C E7 C3, 05, 05] +1D002; [0C E9 17, 05, 05] -101D8; [0C E7 CA, 05, 05] +1D003; [0C E9 1E, 05, 05] -101D9; [0C E7 D1, 05, 05] +1D004; [0C E9 25, 05, 05] -101DA; [0C E7 D8, 05, 05] +1D005; [0C E9 2C, 05, 05] -101DB; [0C E7 DF, 05, 05] +1D006; [0C E9 33, 05, 05] -101DC; [0C E7 E6, 05, 05] +1D007; [0C E9 3A, 05, 05] -101DD; [0C E7 ED, 05, 05] +1D008; [0C E9 41, 05, 05] -101DE; [0C E7 F4, 05, 05] +1D009; [0C E9 48, 05, 05] -101DF; [0C E7 FB, 05, 05] +1D00A; [0C E9 4F, 05, 05] -101E0; [0C E8 04, 05, 05] +1D00B; [0C E9 56, 05, 05] -101E1; [0C E8 0B, 05, 05] +1D00C; [0C E9 5D, 05, 05] -101E2; [0C E8 12, 05, 05] +1D00D; [0C E9 64, 05, 05] -101E3; [0C E8 19, 05, 05] +1D00E; [0C E9 6B, 05, 05] -101E4; [0C E8 20, 05, 05] +1D00F; [0C E9 72, 05, 05] -101E5; [0C E8 27, 05, 05] +1D010; [0C E9 79, 05, 05] -101E6; [0C E8 2E, 05, 05] +1D011; [0C E9 80, 05, 05] -101E7; [0C E8 35, 05, 05] +1D012; [0C E9 87, 05, 05] -101E8; [0C E8 3C, 05, 05] +1D013; [0C E9 8E, 05, 05] -101E9; [0C E8 43, 05, 05] +1D014; [0C E9 95, 05, 05] -101EA; [0C E8 4A, 05, 05] +1D015; [0C E9 9C, 05, 05] -101EB; [0C E8 51, 05, 05] +1D016; [0C E9 A3, 05, 05] -101EC; [0C E8 58, 05, 05] +1D017; [0C E9 AA, 05, 05] -101ED; [0C E8 5F, 05, 05] +1D018; [0C E9 B1, 05, 05] -101EE; [0C E8 66, 05, 05] +1D019; [0C E9 B8, 05, 05] -101EF; [0C E8 6D, 05, 05] +1D01A; [0C E9 BF, 05, 05] -101F0; [0C E8 74, 05, 05] +1D01B; [0C E9 C6, 05, 05] -101F1; [0C E8 7B, 05, 05] +1D01C; [0C E9 CD, 05, 05] -101F2; [0C E8 82, 05, 05] +1D01D; [0C E9 D4, 05, 05] -101F3; [0C E8 89, 05, 05] +1D01E; [0C E9 DB, 05, 05] -101F4; [0C E8 90, 05, 05] +1D01F; [0C E9 E2, 05, 05] -101F5; [0C E8 97, 05, 05] +1D020; [0C E9 E9, 05, 05] -101F6; [0C E8 9E, 05, 05] +1D021; [0C E9 F0, 05, 05] -101F7; [0C E8 A5, 05, 05] +1D022; [0C E9 F7, 05, 05] -101F8; [0C E8 AC, 05, 05] +1D023; [0C E9 FE, 05, 05] -101F9; [0C E8 B3, 05, 05] +1D024; [0C EA 07, 05, 05] -101FA; [0C E8 BA, 05, 05] +1D025; [0C EA 0E, 05, 05] -101FB; [0C E8 C1, 05, 05] +1D026; [0C EA 15, 05, 05] -101FC; [0C E8 C8, 05, 05] +1D027; [0C EA 1C, 05, 05] -10877; [0C E8 CF, 05, 05] +1D028; [0C EA 23, 05, 05] -10878; [0C E8 D6, 05, 05] +1D029; [0C EA 2A, 05, 05] -16B3C; [0C E8 DD, 05, 05] +1D02A; [0C EA 31, 05, 05] -16B3D; [0C E8 E4, 05, 05] +1D02B; [0C EA 38, 05, 05] -16B3E; [0C E8 EB, 05, 05] +1D02C; [0C EA 3F, 05, 05] -16B3F; [0C E8 F2, 05, 05] +1D02D; [0C EA 46, 05, 05] -16B45; [0C E8 F9, 05, 05] +1D02E; [0C EA 4D, 05, 05] -1D000; [0C E9 02, 05, 05] +1D02F; [0C EA 54, 05, 05] -1D001; [0C E9 09, 05, 05] +1D030; [0C EA 5B, 05, 05] -1D002; [0C E9 10, 05, 05] +1D031; [0C EA 62, 05, 05] -1D003; [0C E9 17, 05, 05] +1D032; [0C EA 69, 05, 05] -1D004; [0C E9 1E, 05, 05] +1D033; [0C EA 70, 05, 05] -1D005; [0C E9 25, 05, 05] +1D034; [0C EA 77, 05, 05] -1D006; [0C E9 2C, 05, 05] +1D035; [0C EA 7E, 05, 05] -1D007; [0C E9 33, 05, 05] +1D036; [0C EA 85, 05, 05] -1D008; [0C E9 3A, 05, 05] +1D037; [0C EA 8C, 05, 05] -1D009; [0C E9 41, 05, 05] +1D038; [0C EA 93, 05, 05] -1D00A; [0C E9 48, 05, 05] +1D039; [0C EA 9A, 05, 05] -1D00B; [0C E9 4F, 05, 05] +1D03A; [0C EA A1, 05, 05] -1D00C; [0C E9 56, 05, 05] +1D03B; [0C EA A8, 05, 05] -1D00D; [0C E9 5D, 05, 05] +1D03C; [0C EA AF, 05, 05] -1D00E; [0C E9 64, 05, 05] +1D03D; [0C EA B6, 05, 05] -1D00F; [0C E9 6B, 05, 05] +1D03E; [0C EA BD, 05, 05] -1D010; [0C E9 72, 05, 05] +1D03F; [0C EA C4, 05, 05] -1D011; [0C E9 79, 05, 05] +1D040; [0C EA CB, 05, 05] -1D012; [0C E9 80, 05, 05] +1D041; [0C EA D2, 05, 05] -1D013; [0C E9 87, 05, 05] +1D042; [0C EA D9, 05, 05] -1D014; [0C E9 8E, 05, 05] +1D043; [0C EA E0, 05, 05] -1D015; [0C E9 95, 05, 05] +1D044; [0C EA E7, 05, 05] -1D016; [0C E9 9C, 05, 05] +1D045; [0C EA EE, 05, 05] -1D017; [0C E9 A3, 05, 05] +1D046; [0C EA F5, 05, 05] -1D018; [0C E9 AA, 05, 05] +1D047; [0C EA FC, 05, 05] -1D019; [0C E9 B1, 05, 05] +1D048; [0C EB 05, 05, 05] -1D01A; [0C E9 B8, 05, 05] +1D049; [0C EB 0C, 05, 05] -1D01B; [0C E9 BF, 05, 05] +1D04A; [0C EB 13, 05, 05] -1D01C; [0C E9 C6, 05, 05] +1D04B; [0C EB 1A, 05, 05] -1D01D; [0C E9 CD, 05, 05] +1D04C; [0C EB 21, 05, 05] -1D01E; [0C E9 D4, 05, 05] +1D04D; [0C EB 28, 05, 05] -1D01F; [0C E9 DB, 05, 05] +1D04E; [0C EB 2F, 05, 05] -1D020; [0C E9 E2, 05, 05] +1D04F; [0C EB 36, 05, 05] -1D021; [0C E9 E9, 05, 05] +1D050; [0C EB 3D, 05, 05] -1D022; [0C E9 F0, 05, 05] +1D051; [0C EB 44, 05, 05] -1D023; [0C E9 F7, 05, 05] +1D052; [0C EB 4B, 05, 05] -1D024; [0C E9 FE, 05, 05] +1D053; [0C EB 52, 05, 05] -1D025; [0C EA 07, 05, 05] +1D054; [0C EB 59, 05, 05] -1D026; [0C EA 0E, 05, 05] +1D055; [0C EB 60, 05, 05] -1D027; [0C EA 15, 05, 05] +1D056; [0C EB 67, 05, 05] -1D028; [0C EA 1C, 05, 05] +1D057; [0C EB 6E, 05, 05] -1D029; [0C EA 23, 05, 05] +1D058; [0C EB 75, 05, 05] -1D02A; [0C EA 2A, 05, 05] +1D059; [0C EB 7C, 05, 05] -1D02B; [0C EA 31, 05, 05] +1D05A; [0C EB 83, 05, 05] -1D02C; [0C EA 38, 05, 05] +1D05B; [0C EB 8A, 05, 05] -1D02D; [0C EA 3F, 05, 05] +1D05C; [0C EB 91, 05, 05] -1D02E; [0C EA 46, 05, 05] +1D05D; [0C EB 98, 05, 05] -1D02F; [0C EA 4D, 05, 05] +1D05E; [0C EB 9F, 05, 05] -1D030; [0C EA 54, 05, 05] +1D05F; [0C EB A6, 05, 05] -1D031; [0C EA 5B, 05, 05] +1D060; [0C EB AD, 05, 05] -1D032; [0C EA 62, 05, 05] +1D061; [0C EB B4, 05, 05] -1D033; [0C EA 69, 05, 05] +1D062; [0C EB BB, 05, 05] -1D034; [0C EA 70, 05, 05] +1D063; [0C EB C2, 05, 05] -1D035; [0C EA 77, 05, 05] +1D064; [0C EB C9, 05, 05] -1D036; [0C EA 7E, 05, 05] +1D065; [0C EB D0, 05, 05] -1D037; [0C EA 85, 05, 05] +1D066; [0C EB D7, 05, 05] -1D038; [0C EA 8C, 05, 05] +1D067; [0C EB DE, 05, 05] -1D039; [0C EA 93, 05, 05] +1D068; [0C EB E5, 05, 05] -1D03A; [0C EA 9A, 05, 05] +1D069; [0C EB EC, 05, 05] -1D03B; [0C EA A1, 05, 05] +1D06A; [0C EB F3, 05, 05] -1D03C; [0C EA A8, 05, 05] +1D06B; [0C EB FA, 05, 05] -1D03D; [0C EA AF, 05, 05] +1D06C; [0C EC 03, 05, 05] -1D03E; [0C EA B6, 05, 05] +1D06D; [0C EC 0A, 05, 05] -1D03F; [0C EA BD, 05, 05] +1D06E; [0C EC 11, 05, 05] -1D040; [0C EA C4, 05, 05] +1D06F; [0C EC 18, 05, 05] -1D041; [0C EA CB, 05, 05] +1D070; [0C EC 1F, 05, 05] -1D042; [0C EA D2, 05, 05] +1D071; [0C EC 26, 05, 05] -1D043; [0C EA D9, 05, 05] +1D072; [0C EC 2D, 05, 05] -1D044; [0C EA E0, 05, 05] +1D073; [0C EC 34, 05, 05] -1D045; [0C EA E7, 05, 05] +1D074; [0C EC 3B, 05, 05] -1D046; [0C EA EE, 05, 05] +1D075; [0C EC 42, 05, 05] -1D047; [0C EA F5, 05, 05] +1D076; [0C EC 49, 05, 05] -1D048; [0C EA FC, 05, 05] +1D077; [0C EC 50, 05, 05] -1D049; [0C EB 05, 05, 05] +1D078; [0C EC 57, 05, 05] -1D04A; [0C EB 0C, 05, 05] +1D079; [0C EC 5E, 05, 05] -1D04B; [0C EB 13, 05, 05] +1D07A; [0C EC 65, 05, 05] -1D04C; [0C EB 1A, 05, 05] +1D07B; [0C EC 6C, 05, 05] -1D04D; [0C EB 21, 05, 05] +1D07C; [0C EC 73, 05, 05] -1D04E; [0C EB 28, 05, 05] +1D07D; [0C EC 7A, 05, 05] -1D04F; [0C EB 2F, 05, 05] +1D07E; [0C EC 81, 05, 05] -1D050; [0C EB 36, 05, 05] +1D07F; [0C EC 88, 05, 05] -1D051; [0C EB 3D, 05, 05] +1D080; [0C EC 8F, 05, 05] -1D052; [0C EB 44, 05, 05] +1D081; [0C EC 96, 05, 05] -1D053; [0C EB 4B, 05, 05] +1D082; [0C EC 9D, 05, 05] -1D054; [0C EB 52, 05, 05] +1D083; [0C EC A4, 05, 05] -1D055; [0C EB 59, 05, 05] +1D084; [0C EC AB, 05, 05] -1D056; [0C EB 60, 05, 05] +1D085; [0C EC B2, 05, 05] -1D057; [0C EB 67, 05, 05] +1D086; [0C EC B9, 05, 05] -1D058; [0C EB 6E, 05, 05] +1D087; [0C EC C0, 05, 05] -1D059; [0C EB 75, 05, 05] +1D088; [0C EC C7, 05, 05] -1D05A; [0C EB 7C, 05, 05] +1D089; [0C EC CE, 05, 05] -1D05B; [0C EB 83, 05, 05] +1D08A; [0C EC D5, 05, 05] -1D05C; [0C EB 8A, 05, 05] +1D08B; [0C EC DC, 05, 05] -1D05D; [0C EB 91, 05, 05] +1D08C; [0C EC E3, 05, 05] -1D05E; [0C EB 98, 05, 05] +1D08D; [0C EC EA, 05, 05] -1D05F; [0C EB 9F, 05, 05] +1D08E; [0C EC F1, 05, 05] -1D060; [0C EB A6, 05, 05] +1D08F; [0C EC F8, 05, 05] -1D061; [0C EB AD, 05, 05] +1D090; [0C EC FF, 05, 05] -1D062; [0C EB B4, 05, 05] +1D091; [0C ED 08, 05, 05] -1D063; [0C EB BB, 05, 05] +1D092; [0C ED 0F, 05, 05] -1D064; [0C EB C2, 05, 05] +1D093; [0C ED 16, 05, 05] -1D065; [0C EB C9, 05, 05] +1D094; [0C ED 1D, 05, 05] -1D066; [0C EB D0, 05, 05] +1D095; [0C ED 24, 05, 05] -1D067; [0C EB D7, 05, 05] +1D096; [0C ED 2B, 05, 05] -1D068; [0C EB DE, 05, 05] +1D097; [0C ED 32, 05, 05] -1D069; [0C EB E5, 05, 05] +1D098; [0C ED 39, 05, 05] -1D06A; [0C EB EC, 05, 05] +1D099; [0C ED 40, 05, 05] -1D06B; [0C EB F3, 05, 05] +1D09A; [0C ED 47, 05, 05] -1D06C; [0C EB FA, 05, 05] +1D09B; [0C ED 4E, 05, 05] -1D06D; [0C EC 03, 05, 05] +1D09C; [0C ED 55, 05, 05] -1D06E; [0C EC 0A, 05, 05] +1D09D; [0C ED 5C, 05, 05] -1D06F; [0C EC 11, 05, 05] +1D09E; [0C ED 63, 05, 05] -1D070; [0C EC 18, 05, 05] +1D09F; [0C ED 6A, 05, 05] -1D071; [0C EC 1F, 05, 05] +1D0A0; [0C ED 71, 05, 05] -1D072; [0C EC 26, 05, 05] +1D0A1; [0C ED 78, 05, 05] -1D073; [0C EC 2D, 05, 05] +1D0A2; [0C ED 7F, 05, 05] -1D074; [0C EC 34, 05, 05] +1D0A3; [0C ED 86, 05, 05] -1D075; [0C EC 3B, 05, 05] +1D0A4; [0C ED 8D, 05, 05] -1D076; [0C EC 42, 05, 05] +1D0A5; [0C ED 94, 05, 05] -1D077; [0C EC 49, 05, 05] +1D0A6; [0C ED 9B, 05, 05] -1D078; [0C EC 50, 05, 05] +1D0A7; [0C ED A2, 05, 05] -1D079; [0C EC 57, 05, 05] +1D0A8; [0C ED A9, 05, 05] -1D07A; [0C EC 5E, 05, 05] +1D0A9; [0C ED B0, 05, 05] -1D07B; [0C EC 65, 05, 05] +1D0AA; [0C ED B7, 05, 05] -1D07C; [0C EC 6C, 05, 05] +1D0AB; [0C ED BE, 05, 05] -1D07D; [0C EC 73, 05, 05] +1D0AC; [0C ED C5, 05, 05] -1D07E; [0C EC 7A, 05, 05] +1D0AD; [0C ED CC, 05, 05] -1D07F; [0C EC 81, 05, 05] +1D0AE; [0C ED D3, 05, 05] -1D080; [0C EC 88, 05, 05] +1D0AF; [0C ED DA, 05, 05] -1D081; [0C EC 8F, 05, 05] +1D0B0; [0C ED E1, 05, 05] -1D082; [0C EC 96, 05, 05] +1D0B1; [0C ED E8, 05, 05] -1D083; [0C EC 9D, 05, 05] +1D0B2; [0C ED EF, 05, 05] -1D084; [0C EC A4, 05, 05] +1D0B3; [0C ED F6, 05, 05] -1D085; [0C EC AB, 05, 05] +1D0B4; [0C ED FD, 05, 05] -1D086; [0C EC B2, 05, 05] +1D0B5; [0C EE 06, 05, 05] -1D087; [0C EC B9, 05, 05] +1D0B6; [0C EE 0D, 05, 05] -1D088; [0C EC C0, 05, 05] +1D0B7; [0C EE 14, 05, 05] -1D089; [0C EC C7, 05, 05] +1D0B8; [0C EE 1B, 05, 05] -1D08A; [0C EC CE, 05, 05] +1D0B9; [0C EE 22, 05, 05] -1D08B; [0C EC D5, 05, 05] +1D0BA; [0C EE 29, 05, 05] -1D08C; [0C EC DC, 05, 05] +1D0BB; [0C EE 30, 05, 05] -1D08D; [0C EC E3, 05, 05] +1D0BC; [0C EE 37, 05, 05] -1D08E; [0C EC EA, 05, 05] +1D0BD; [0C EE 3E, 05, 05] -1D08F; [0C EC F1, 05, 05] +1D0BE; [0C EE 45, 05, 05] -1D090; [0C EC F8, 05, 05] +1D0BF; [0C EE 4C, 05, 05] -1D091; [0C EC FF, 05, 05] +1D0C0; [0C EE 53, 05, 05] -1D092; [0C ED 08, 05, 05] +1D0C1; [0C EE 5A, 05, 05] -1D093; [0C ED 0F, 05, 05] +1D0C2; [0C EE 61, 05, 05] -1D094; [0C ED 16, 05, 05] +1D0C3; [0C EE 68, 05, 05] -1D095; [0C ED 1D, 05, 05] +1D0C4; [0C EE 6F, 05, 05] -1D096; [0C ED 24, 05, 05] +1D0C5; [0C EE 76, 05, 05] -1D097; [0C ED 2B, 05, 05] +1D0C6; [0C EE 7D, 05, 05] -1D098; [0C ED 32, 05, 05] +1D0C7; [0C EE 84, 05, 05] -1D099; [0C ED 39, 05, 05] +1D0C8; [0C EE 8B, 05, 05] -1D09A; [0C ED 40, 05, 05] +1D0C9; [0C EE 92, 05, 05] -1D09B; [0C ED 47, 05, 05] +1D0CA; [0C EE 99, 05, 05] -1D09C; [0C ED 4E, 05, 05] +1D0CB; [0C EE A0, 05, 05] -1D09D; [0C ED 55, 05, 05] +1D0CC; [0C EE A7, 05, 05] -1D09E; [0C ED 5C, 05, 05] +1D0CD; [0C EE AE, 05, 05] -1D09F; [0C ED 63, 05, 05] +1D0CE; [0C EE B5, 05, 05] -1D0A0; [0C ED 6A, 05, 05] +1D0CF; [0C EE BC, 05, 05] -1D0A1; [0C ED 71, 05, 05] +1D0D0; [0C EE C3, 05, 05] -1D0A2; [0C ED 78, 05, 05] +1D0D1; [0C EE CA, 05, 05] -1D0A3; [0C ED 7F, 05, 05] +1D0D2; [0C EE D1, 05, 05] -1D0A4; [0C ED 86, 05, 05] +1D0D3; [0C EE D8, 05, 05] -1D0A5; [0C ED 8D, 05, 05] +1D0D4; [0C EE DF, 05, 05] -1D0A6; [0C ED 94, 05, 05] +1D0D5; [0C EE E6, 05, 05] -1D0A7; [0C ED 9B, 05, 05] +1D0D6; [0C EE ED, 05, 05] -1D0A8; [0C ED A2, 05, 05] +1D0D7; [0C EE F4, 05, 05] -1D0A9; [0C ED A9, 05, 05] +1D0D8; [0C EE FB, 05, 05] -1D0AA; [0C ED B0, 05, 05] +1D0D9; [0C EF 04, 05, 05] -1D0AB; [0C ED B7, 05, 05] +1D0DA; [0C EF 0B, 05, 05] -1D0AC; [0C ED BE, 05, 05] +1D0DB; [0C EF 12, 05, 05] -1D0AD; [0C ED C5, 05, 05] +1D0DC; [0C EF 19, 05, 05] -1D0AE; [0C ED CC, 05, 05] +1D0DD; [0C EF 20, 05, 05] -1D0AF; [0C ED D3, 05, 05] +1D0DE; [0C EF 27, 05, 05] -1D0B0; [0C ED DA, 05, 05] +1D0DF; [0C EF 2E, 05, 05] -1D0B1; [0C ED E1, 05, 05] +1D0E0; [0C EF 35, 05, 05] -1D0B2; [0C ED E8, 05, 05] +1D0E1; [0C EF 3C, 05, 05] -1D0B3; [0C ED EF, 05, 05] +1D0E2; [0C EF 43, 05, 05] -1D0B4; [0C ED F6, 05, 05] +1D0E3; [0C EF 4A, 05, 05] -1D0B5; [0C ED FD, 05, 05] +1D0E4; [0C EF 51, 05, 05] -1D0B6; [0C EE 06, 05, 05] +1D0E5; [0C EF 58, 05, 05] -1D0B7; [0C EE 0D, 05, 05] +1D0E6; [0C EF 5F, 05, 05] -1D0B8; [0C EE 14, 05, 05] +1D0E7; [0C EF 66, 05, 05] -1D0B9; [0C EE 1B, 05, 05] +1D0E8; [0C EF 6D, 05, 05] -1D0BA; [0C EE 22, 05, 05] +1D0E9; [0C EF 74, 05, 05] -1D0BB; [0C EE 29, 05, 05] +1D0EA; [0C EF 7B, 05, 05] -1D0BC; [0C EE 30, 05, 05] +1D0EB; [0C EF 82, 05, 05] -1D0BD; [0C EE 37, 05, 05] +1D0EC; [0C EF 89, 05, 05] -1D0BE; [0C EE 3E, 05, 05] +1D0ED; [0C EF 90, 05, 05] -1D0BF; [0C EE 45, 05, 05] +1D0EE; [0C EF 97, 05, 05] -1D0C0; [0C EE 4C, 05, 05] +1D0EF; [0C EF 9E, 05, 05] -1D0C1; [0C EE 53, 05, 05] +1D0F0; [0C EF A5, 05, 05] -1D0C2; [0C EE 5A, 05, 05] +1D0F1; [0C EF AC, 05, 05] -1D0C3; [0C EE 61, 05, 05] +1D0F2; [0C EF B3, 05, 05] -1D0C4; [0C EE 68, 05, 05] +1D0F3; [0C EF BA, 05, 05] -1D0C5; [0C EE 6F, 05, 05] +1D0F4; [0C EF C1, 05, 05] -1D0C6; [0C EE 76, 05, 05] +1D0F5; [0C EF C8, 05, 05] -1D0C7; [0C EE 7D, 05, 05] +1D100; [0C EF CF, 05, 05] -1D0C8; [0C EE 84, 05, 05] +1D101; [0C EF D6, 05, 05] -1D0C9; [0C EE 8B, 05, 05] +1D102; [0C EF DD, 05, 05] -1D0CA; [0C EE 92, 05, 05] +1D103; [0C EF E4, 05, 05] -1D0CB; [0C EE 99, 05, 05] +1D104; [0C EF EB, 05, 05] -1D0CC; [0C EE A0, 05, 05] +1D105; [0C EF F2, 05, 05] -1D0CD; [0C EE A7, 05, 05] +1D106; [0C EF F9, 05, 05] -1D0CE; [0C EE AE, 05, 05] +1D107; [0C F0 02, 05, 05] -1D0CF; [0C EE B5, 05, 05] +1D108; [0C F0 09, 05, 05] -1D0D0; [0C EE BC, 05, 05] +1D109; [0C F0 10, 05, 05] -1D0D1; [0C EE C3, 05, 05] +1D10A; [0C F0 17, 05, 05] -1D0D2; [0C EE CA, 05, 05] +1D10B; [0C F0 1E, 05, 05] -1D0D3; [0C EE D1, 05, 05] +1D10C; [0C F0 25, 05, 05] -1D0D4; [0C EE D8, 05, 05] +1D10D; [0C F0 2C, 05, 05] -1D0D5; [0C EE DF, 05, 05] +1D10E; [0C F0 33, 05, 05] -1D0D6; [0C EE E6, 05, 05] +1D10F; [0C F0 3A, 05, 05] -1D0D7; [0C EE ED, 05, 05] +1D110; [0C F0 41, 05, 05] -1D0D8; [0C EE F4, 05, 05] +1D111; [0C F0 48, 05, 05] -1D0D9; [0C EE FB, 05, 05] +1D112; [0C F0 4F, 05, 05] -1D0DA; [0C EF 04, 05, 05] +1D113; [0C F0 56, 05, 05] -1D0DB; [0C EF 0B, 05, 05] +1D114; [0C F0 5D, 05, 05] -1D0DC; [0C EF 12, 05, 05] +1D115; [0C F0 64, 05, 05] -1D0DD; [0C EF 19, 05, 05] +1D116; [0C F0 6B, 05, 05] -1D0DE; [0C EF 20, 05, 05] +1D117; [0C F0 72, 05, 05] -1D0DF; [0C EF 27, 05, 05] +1D118; [0C F0 79, 05, 05] -1D0E0; [0C EF 2E, 05, 05] +1D119; [0C F0 80, 05, 05] -1D0E1; [0C EF 35, 05, 05] +1D11A; [0C F0 87, 05, 05] -1D0E2; [0C EF 3C, 05, 05] +1D11B; [0C F0 8E, 05, 05] -1D0E3; [0C EF 43, 05, 05] +1D11C; [0C F0 95, 05, 05] -1D0E4; [0C EF 4A, 05, 05] +1D11D; [0C F0 9C, 05, 05] -1D0E5; [0C EF 51, 05, 05] +1D11E; [0C F0 A3, 05, 05] -1D0E6; [0C EF 58, 05, 05] +1D11F; [0C F0 AA, 05, 05] -1D0E7; [0C EF 5F, 05, 05] +1D120; [0C F0 B1, 05, 05] -1D0E8; [0C EF 66, 05, 05] +1D121; [0C F0 B8, 05, 05] -1D0E9; [0C EF 6D, 05, 05] +1D122; [0C F0 BF, 05, 05] -1D0EA; [0C EF 74, 05, 05] +1D123; [0C F0 C6, 05, 05] -1D0EB; [0C EF 7B, 05, 05] +1D124; [0C F0 CD, 05, 05] -1D0EC; [0C EF 82, 05, 05] +1D125; [0C F0 D4, 05, 05] -1D0ED; [0C EF 89, 05, 05] +1D126; [0C F0 DB, 05, 05] -1D0EE; [0C EF 90, 05, 05] +266D; [0C F0 E2, 05, 05] -1D0EF; [0C EF 97, 05, 05] +266E; [0C F0 E9, 05, 05] -1D0F0; [0C EF 9E, 05, 05] +266F; [0C F0 F0, 05, 05] -1D0F1; [0C EF A5, 05, 05] +1D12A; [0C F0 F7, 05, 05] -1D0F2; [0C EF AC, 05, 05] +1D12B; [0C F0 FE, 05, 05] -1D0F3; [0C EF B3, 05, 05] +1D12C; [0C F1 07, 05, 05] -1D0F4; [0C EF BA, 05, 05] +1D12D; [0C F1 0E, 05, 05] -1D0F5; [0C EF C1, 05, 05] +1D12E; [0C F1 15, 05, 05] -1D100; [0C EF C8, 05, 05] +1D12F; [0C F1 1C, 05, 05] -1D101; [0C EF CF, 05, 05] +1D130; [0C F1 23, 05, 05] -1D102; [0C EF D6, 05, 05] +1D131; [0C F1 2A, 05, 05] -1D103; [0C EF DD, 05, 05] +1D132; [0C F1 31, 05, 05] -1D104; [0C EF E4, 05, 05] +1D133; [0C F1 38, 05, 05] -1D105; [0C EF EB, 05, 05] +1D134; [0C F1 3F, 05, 05] -1D106; [0C EF F2, 05, 05] +1D135; [0C F1 46, 05, 05] -1D107; [0C EF F9, 05, 05] +1D136; [0C F1 4D, 05, 05] -1D108; [0C F0 02, 05, 05] +1D137; [0C F1 54, 05, 05] -1D109; [0C F0 09, 05, 05] +1D138; [0C F1 5B, 05, 05] -1D10A; [0C F0 10, 05, 05] +1D139; [0C F1 62, 05, 05] -1D10B; [0C F0 17, 05, 05] +1D129; [0C F1 69, 05, 05] -1D10C; [0C F0 1E, 05, 05] +1D13A; [0C F1 70, 05, 05] -1D10D; [0C F0 25, 05, 05] +1D13B; [0C F1 77, 05, 05] -1D10E; [0C F0 2C, 05, 05] +1D13C; [0C F1 7E, 05, 05] -1D10F; [0C F0 33, 05, 05] +1D13D; [0C F1 85, 05, 05] -1D110; [0C F0 3A, 05, 05] +1D13E; [0C F1 8C, 05, 05] -1D111; [0C F0 41, 05, 05] +1D13F; [0C F1 93, 05, 05] -1D112; [0C F0 48, 05, 05] +1D140; [0C F1 9A, 05, 05] -1D113; [0C F0 4F, 05, 05] +1D141; [0C F1 A1, 05, 05] -1D114; [0C F0 56, 05, 05] +1D142; [0C F1 A8, 05, 05] -1D115; [0C F0 5D, 05, 05] +1D143; [0C F1 AF, 05, 05] -1D116; [0C F0 64, 05, 05] +1D144; [0C F1 B6, 05, 05] -1D117; [0C F0 6B, 05, 05] +1D145; [0C F1 BD, 05, 05] -1D118; [0C F0 72, 05, 05] +1D146; [0C F1 C4, 05, 05] -1D119; [0C F0 79, 05, 05] +1D147; [0C F1 CB, 05, 05] -1D11A; [0C F0 80, 05, 05] +1D148; [0C F1 D2, 05, 05] -1D11B; [0C F0 87, 05, 05] +1D149; [0C F1 D9, 05, 05] -1D11C; [0C F0 8E, 05, 05] +1D14A; [0C F1 E0, 05, 05] -1D11D; [0C F0 95, 05, 05] +1D14B; [0C F1 E7, 05, 05] -1D11E; [0C F0 9C, 05, 05] +1D14C; [0C F1 EE, 05, 05] -1D11F; [0C F0 A3, 05, 05] +1D14D; [0C F1 F5, 05, 05] -1D120; [0C F0 AA, 05, 05] +1D14E; [0C F1 FC, 05, 05] -1D121; [0C F0 B1, 05, 05] +1D14F; [0C F2 05, 05, 05] -1D122; [0C F0 B8, 05, 05] +1D150; [0C F2 0C, 05, 05] -1D123; [0C F0 BF, 05, 05] +1D151; [0C F2 13, 05, 05] -1D124; [0C F0 C6, 05, 05] +1D152; [0C F2 1A, 05, 05] -1D125; [0C F0 CD, 05, 05] +1D153; [0C F2 21, 05, 05] -1D126; [0C F0 D4, 05, 05] +1D154; [0C F2 28, 05, 05] -266D; [0C F0 DB, 05, 05] +1D155; [0C F2 2F, 05, 05] -266E; [0C F0 E2, 05, 05] +1D156; [0C F2 36, 05, 05] -266F; [0C F0 E9, 05, 05] +1D157; [0C F2 3D, 05, 05] +1D15E; [0C F2 3D, 05, 05] -1D12A; [0C F0 F0, 05, 05] +1D158; [0C F2 44, 05, 05] +1D15F; [0C F2 44, 05, 05] +1D160; [0C F2 44, 05, 05] +1D161; [0C F2 44, 05, 05] +1D162; [0C F2 44, 05, 05] +1D163; [0C F2 44, 05, 05] +1D164; [0C F2 44, 05, 05] -1D12B; [0C F0 F7, 05, 05] +1D159; [0C F2 4B, 05, 05] -1D12C; [0C F0 FE, 05, 05] +1D15A; [0C F2 52, 05, 05] -1D12D; [0C F1 07, 05, 05] +1D15B; [0C F2 59, 05, 05] -1D12E; [0C F1 0E, 05, 05] +1D15C; [0C F2 60, 05, 05] -1D12F; [0C F1 15, 05, 05] +1D15D; [0C F2 67, 05, 05] -1D130; [0C F1 1C, 05, 05] +1D16A; [0C F2 6E, 05, 05] -1D131; [0C F1 23, 05, 05] +1D16B; [0C F2 75, 05, 05] -1D132; [0C F1 2A, 05, 05] +1D16C; [0C F2 7C, 05, 05] -1D133; [0C F1 31, 05, 05] +1D183; [0C F2 83, 05, 05] -1D134; [0C F1 38, 05, 05] +1D184; [0C F2 8A, 05, 05] -1D135; [0C F1 3F, 05, 05] +1D18C; [0C F2 91, 05, 05] -1D136; [0C F1 46, 05, 05] +1D18D; [0C F2 98, 05, 05] -1D137; [0C F1 4D, 05, 05] +1D18E; [0C F2 9F, 05, 05] -1D138; [0C F1 54, 05, 05] +1D18F; [0C F2 A6, 05, 05] -1D139; [0C F1 5B, 05, 05] +1D190; [0C F2 AD, 05, 05] -1D129; [0C F1 62, 05, 05] +1D191; [0C F2 B4, 05, 05] -1D13A; [0C F1 69, 05, 05] +1D192; [0C F2 BB, 05, 05] -1D13B; [0C F1 70, 05, 05] +1D193; [0C F2 C2, 05, 05] -1D13C; [0C F1 77, 05, 05] +1D194; [0C F2 C9, 05, 05] -1D13D; [0C F1 7E, 05, 05] +1D195; [0C F2 D0, 05, 05] -1D13E; [0C F1 85, 05, 05] +1D196; [0C F2 D7, 05, 05] -1D13F; [0C F1 8C, 05, 05] +1D197; [0C F2 DE, 05, 05] -1D140; [0C F1 93, 05, 05] +1D198; [0C F2 E5, 05, 05] -1D141; [0C F1 9A, 05, 05] +1D199; [0C F2 EC, 05, 05] -1D142; [0C F1 A1, 05, 05] +1D19A; [0C F2 F3, 05, 05] -1D143; [0C F1 A8, 05, 05] +1D19B; [0C F2 FA, 05, 05] -1D144; [0C F1 AF, 05, 05] +1D19C; [0C F3 03, 05, 05] -1D145; [0C F1 B6, 05, 05] +1D19D; [0C F3 0A, 05, 05] -1D146; [0C F1 BD, 05, 05] +1D19E; [0C F3 11, 05, 05] -1D147; [0C F1 C4, 05, 05] +1D19F; [0C F3 18, 05, 05] -1D148; [0C F1 CB, 05, 05] +1D1A0; [0C F3 1F, 05, 05] -1D149; [0C F1 D2, 05, 05] +1D1A1; [0C F3 26, 05, 05] -1D14A; [0C F1 D9, 05, 05] +1D1A2; [0C F3 2D, 05, 05] -1D14B; [0C F1 E0, 05, 05] +1D1A3; [0C F3 34, 05, 05] -1D14C; [0C F1 E7, 05, 05] +1D1A4; [0C F3 3B, 05, 05] -1D14D; [0C F1 EE, 05, 05] +1D1A5; [0C F3 42, 05, 05] -1D14E; [0C F1 F5, 05, 05] +1D1A6; [0C F3 49, 05, 05] -1D14F; [0C F1 FC, 05, 05] +1D1A7; [0C F3 50, 05, 05] -1D150; [0C F2 05, 05, 05] +1D1A8; [0C F3 57, 05, 05] -1D151; [0C F2 0C, 05, 05] +1D1A9; [0C F3 5E, 05, 05] -1D152; [0C F2 13, 05, 05] +1D1AE; [0C F3 65, 05, 05] -1D153; [0C F2 1A, 05, 05] +1D1AF; [0C F3 6C, 05, 05] -1D154; [0C F2 21, 05, 05] +1D1B0; [0C F3 73, 05, 05] -1D155; [0C F2 28, 05, 05] +1D1B1; [0C F3 7A, 05, 05] -1D156; [0C F2 2F, 05, 05] +1D1B2; [0C F3 81, 05, 05] -1D157; [0C F2 36, 05, 05] -1D15E; [0C F2 36, 05, 05] +1D1B3; [0C F3 88, 05, 05] -1D158; [0C F2 3D, 05, 05] -1D15F; [0C F2 3D, 05, 05] -1D160; [0C F2 3D, 05, 05] -1D161; [0C F2 3D, 05, 05] -1D162; [0C F2 3D, 05, 05] -1D163; [0C F2 3D, 05, 05] -1D164; [0C F2 3D, 05, 05] +1D1B4; [0C F3 8F, 05, 05] -1D159; [0C F2 44, 05, 05] +1D1B5; [0C F3 96, 05, 05] -1D15A; [0C F2 4B, 05, 05] +1D1B6; [0C F3 9D, 05, 05] -1D15B; [0C F2 52, 05, 05] +1D1B7; [0C F3 A4, 05, 05] -1D15C; [0C F2 59, 05, 05] +1D1B8; [0C F3 AB, 05, 05] -1D15D; [0C F2 60, 05, 05] +1D1B9; [0C F3 B2, 05, 05] +1D1BB; [0C F3 B2, 05, 05] +1D1BD; [0C F3 B2, 05, 05] +1D1BF; [0C F3 B2, 05, 05] -1D16A; [0C F2 67, 05, 05] +1D1BA; [0C F3 B9, 05, 05] +1D1BC; [0C F3 B9, 05, 05] +1D1BE; [0C F3 B9, 05, 05] +1D1C0; [0C F3 B9, 05, 05] -1D16B; [0C F2 6E, 05, 05] +1D1C1; [0C F3 C0, 05, 05] -1D16C; [0C F2 75, 05, 05] +1D1C2; [0C F3 C7, 05, 05] -1D183; [0C F2 7C, 05, 05] +1D1C3; [0C F3 CE, 05, 05] -1D184; [0C F2 83, 05, 05] +1D1C4; [0C F3 D5, 05, 05] -1D18C; [0C F2 8A, 05, 05] +1D1C5; [0C F3 DC, 05, 05] -1D18D; [0C F2 91, 05, 05] +1D1C6; [0C F3 E3, 05, 05] -1D18E; [0C F2 98, 05, 05] +1D1C7; [0C F3 EA, 05, 05] -1D18F; [0C F2 9F, 05, 05] +1D1C8; [0C F3 F1, 05, 05] -1D190; [0C F2 A6, 05, 05] +1D1C9; [0C F3 F8, 05, 05] -1D191; [0C F2 AD, 05, 05] +1D1CA; [0C F3 FF, 05, 05] -1D192; [0C F2 B4, 05, 05] +1D1CB; [0C F4 08, 05, 05] -1D193; [0C F2 BB, 05, 05] +1D1CC; [0C F4 0F, 05, 05] -1D194; [0C F2 C2, 05, 05] +1D1CD; [0C F4 16, 05, 05] -1D195; [0C F2 C9, 05, 05] +1D1CE; [0C F4 1D, 05, 05] -1D196; [0C F2 D0, 05, 05] +1D1CF; [0C F4 24, 05, 05] -1D197; [0C F2 D7, 05, 05] +1D1D0; [0C F4 2B, 05, 05] -1D198; [0C F2 DE, 05, 05] +1D1D1; [0C F4 32, 05, 05] -1D199; [0C F2 E5, 05, 05] +1D1D2; [0C F4 39, 05, 05] -1D19A; [0C F2 EC, 05, 05] +1D1D3; [0C F4 40, 05, 05] -1D19B; [0C F2 F3, 05, 05] +1D1D4; [0C F4 47, 05, 05] -1D19C; [0C F2 FA, 05, 05] +1D1D5; [0C F4 4E, 05, 05] -1D19D; [0C F3 03, 05, 05] +1D1D6; [0C F4 55, 05, 05] -1D19E; [0C F3 0A, 05, 05] +1D1D7; [0C F4 5C, 05, 05] -1D19F; [0C F3 11, 05, 05] +1D1D8; [0C F4 63, 05, 05] -1D1A0; [0C F3 18, 05, 05] +1D1D9; [0C F4 6A, 05, 05] -1D1A1; [0C F3 1F, 05, 05] +1D1DA; [0C F4 71, 05, 05] -1D1A2; [0C F3 26, 05, 05] +1D1DB; [0C F4 78, 05, 05] -1D1A3; [0C F3 2D, 05, 05] +1D1DC; [0C F4 7F, 05, 05] -1D1A4; [0C F3 34, 05, 05] +1D1DD; [0C F4 86, 05, 05] -1D1A5; [0C F3 3B, 05, 05] +1D1DE; [0C F4 8D, 05, 05] -1D1A6; [0C F3 42, 05, 05] +1D1DF; [0C F4 94, 05, 05] -1D1A7; [0C F3 49, 05, 05] +1D1E0; [0C F4 9B, 05, 05] -1D1A8; [0C F3 50, 05, 05] +1D1E1; [0C F4 A2, 05, 05] -1D1A9; [0C F3 57, 05, 05] +1D1E2; [0C F4 A9, 05, 05] -1D1AE; [0C F3 5E, 05, 05] +1D1E3; [0C F4 B0, 05, 05] -1D1AF; [0C F3 65, 05, 05] +1D1E4; [0C F4 B7, 05, 05] -1D1B0; [0C F3 6C, 05, 05] +1D1E5; [0C F4 BE, 05, 05] -1D1B1; [0C F3 73, 05, 05] +1D1E6; [0C F4 C5, 05, 05] -1D1B2; [0C F3 7A, 05, 05] +1D1E7; [0C F4 CC, 05, 05] -1D1B3; [0C F3 81, 05, 05] +1D1E8; [0C F4 D3, 05, 05] -1D1B4; [0C F3 88, 05, 05] +1D200; [0C F4 DA, 05, 05] -1D1B5; [0C F3 8F, 05, 05] +1D201; [0C F4 E1, 05, 05] -1D1B6; [0C F3 96, 05, 05] +1D202; [0C F4 E8, 05, 05] -1D1B7; [0C F3 9D, 05, 05] +1D203; [0C F4 EF, 05, 05] -1D1B8; [0C F3 A4, 05, 05] +1D204; [0C F4 F6, 05, 05] -1D1B9; [0C F3 AB, 05, 05] -1D1BB; [0C F3 AB, 05, 05] -1D1BD; [0C F3 AB, 05, 05] -1D1BF; [0C F3 AB, 05, 05] +1D205; [0C F4 FD, 05, 05] -1D1BA; [0C F3 B2, 05, 05] -1D1BC; [0C F3 B2, 05, 05] -1D1BE; [0C F3 B2, 05, 05] -1D1C0; [0C F3 B2, 05, 05] +1D206; [0C F5 06, 05, 05] -1D1C1; [0C F3 B9, 05, 05] +1D207; [0C F5 0D, 05, 05] -1D1C2; [0C F3 C0, 05, 05] +1D208; [0C F5 14, 05, 05] -1D1C3; [0C F3 C7, 05, 05] +1D209; [0C F5 1B, 05, 05] -1D1C4; [0C F3 CE, 05, 05] +1D20A; [0C F5 22, 05, 05] -1D1C5; [0C F3 D5, 05, 05] +1D20B; [0C F5 29, 05, 05] -1D1C6; [0C F3 DC, 05, 05] +1D20C; [0C F5 30, 05, 05] -1D1C7; [0C F3 E3, 05, 05] +1D20D; [0C F5 37, 05, 05] -1D1C8; [0C F3 EA, 05, 05] +1D20E; [0C F5 3E, 05, 05] -1D1C9; [0C F3 F1, 05, 05] +1D20F; [0C F5 45, 05, 05] -1D1CA; [0C F3 F8, 05, 05] +1D210; [0C F5 4C, 05, 05] -1D1CB; [0C F3 FF, 05, 05] +1D211; [0C F5 53, 05, 05] -1D1CC; [0C F4 08, 05, 05] +1D212; [0C F5 5A, 05, 05] -1D1CD; [0C F4 0F, 05, 05] +1D213; [0C F5 61, 05, 05] -1D1CE; [0C F4 16, 05, 05] +1D214; [0C F5 68, 05, 05] -1D1CF; [0C F4 1D, 05, 05] +1D215; [0C F5 6F, 05, 05] -1D1D0; [0C F4 24, 05, 05] +1D216; [0C F5 76, 05, 05] -1D1D1; [0C F4 2B, 05, 05] +1D217; [0C F5 7D, 05, 05] -1D1D2; [0C F4 32, 05, 05] +1D218; [0C F5 84, 05, 05] -1D1D3; [0C F4 39, 05, 05] +1D219; [0C F5 8B, 05, 05] -1D1D4; [0C F4 40, 05, 05] +1D21A; [0C F5 92, 05, 05] -1D1D5; [0C F4 47, 05, 05] +1D21B; [0C F5 99, 05, 05] -1D1D6; [0C F4 4E, 05, 05] +1D21C; [0C F5 A0, 05, 05] -1D1D7; [0C F4 55, 05, 05] +1D21D; [0C F5 A7, 05, 05] -1D1D8; [0C F4 5C, 05, 05] +1D21E; [0C F5 AE, 05, 05] -1D1D9; [0C F4 63, 05, 05] +1D21F; [0C F5 B5, 05, 05] -1D1DA; [0C F4 6A, 05, 05] +1D220; [0C F5 BC, 05, 05] -1D1DB; [0C F4 71, 05, 05] +1D221; [0C F5 C3, 05, 05] -1D1DC; [0C F4 78, 05, 05] +1D222; [0C F5 CA, 05, 05] -1D1DD; [0C F4 7F, 05, 05] +1D223; [0C F5 D1, 05, 05] -1D1DE; [0C F4 86, 05, 05] +1D224; [0C F5 D8, 05, 05] -1D1DF; [0C F4 8D, 05, 05] +1D225; [0C F5 DF, 05, 05] -1D1E0; [0C F4 94, 05, 05] +1D226; [0C F5 E6, 05, 05] -1D1E1; [0C F4 9B, 05, 05] +1D227; [0C F5 ED, 05, 05] -1D1E2; [0C F4 A2, 05, 05] +1D228; [0C F5 F4, 05, 05] -1D1E3; [0C F4 A9, 05, 05] +1D229; [0C F5 FB, 05, 05] -1D1E4; [0C F4 B0, 05, 05] +1D22A; [0C F6 04, 05, 05] -1D1E5; [0C F4 B7, 05, 05] +1D22B; [0C F6 0B, 05, 05] -1D1E6; [0C F4 BE, 05, 05] +1D22C; [0C F6 12, 05, 05] -1D1E7; [0C F4 C5, 05, 05] +1D22D; [0C F6 19, 05, 05] -1D1E8; [0C F4 CC, 05, 05] +1D22E; [0C F6 20, 05, 05] -1D200; [0C F4 D3, 05, 05] +1D22F; [0C F6 27, 05, 05] -1D201; [0C F4 DA, 05, 05] +1D230; [0C F6 2E, 05, 05] -1D202; [0C F4 E1, 05, 05] +1D231; [0C F6 35, 05, 05] -1D203; [0C F4 E8, 05, 05] +1D232; [0C F6 3C, 05, 05] -1D204; [0C F4 EF, 05, 05] +1D233; [0C F6 43, 05, 05] -1D205; [0C F4 F6, 05, 05] +1D234; [0C F6 4A, 05, 05] -1D206; [0C F4 FD, 05, 05] +1D235; [0C F6 51, 05, 05] -1D207; [0C F5 06, 05, 05] +1D236; [0C F6 58, 05, 05] -1D208; [0C F5 0D, 05, 05] +1D237; [0C F6 5F, 05, 05] -1D209; [0C F5 14, 05, 05] +1D238; [0C F6 66, 05, 05] -1D20A; [0C F5 1B, 05, 05] +1D239; [0C F6 6D, 05, 05] -1D20B; [0C F5 22, 05, 05] +1D23A; [0C F6 74, 05, 05] -1D20C; [0C F5 29, 05, 05] +1D23B; [0C F6 7B, 05, 05] -1D20D; [0C F5 30, 05, 05] +1D23C; [0C F6 82, 05, 05] -1D20E; [0C F5 37, 05, 05] +1D23D; [0C F6 89, 05, 05] -1D20F; [0C F5 3E, 05, 05] +1D23E; [0C F6 90, 05, 05] -1D210; [0C F5 45, 05, 05] +1D23F; [0C F6 97, 05, 05] -1D211; [0C F5 4C, 05, 05] +1D240; [0C F6 9E, 05, 05] -1D212; [0C F5 53, 05, 05] +1D241; [0C F6 A5, 05, 05] -1D213; [0C F5 5A, 05, 05] +1D245; [0C F6 AC, 05, 05] -1D214; [0C F5 61, 05, 05] +1BC9C; [0C F6 B3, 05, 05] -1D215; [0C F5 68, 05, 05] +1F000; [0C F6 BA, 05, 05] -1D216; [0C F5 6F, 05, 05] +1F001; [0C F6 C1, 05, 05] -1D217; [0C F5 76, 05, 05] +1F002; [0C F6 C8, 05, 05] -1D218; [0C F5 7D, 05, 05] +1F003; [0C F6 CF, 05, 05] -1D219; [0C F5 84, 05, 05] +1F004; [0C F6 D6, 05, 05] -1D21A; [0C F5 8B, 05, 05] +1F005; [0C F6 DD, 05, 05] -1D21B; [0C F5 92, 05, 05] +1F006; [0C F6 E4, 05, 05] -1D21C; [0C F5 99, 05, 05] +1F007; [0C F6 EB, 05, 05] -1D21D; [0C F5 A0, 05, 05] +1F008; [0C F6 F2, 05, 05] -1D21E; [0C F5 A7, 05, 05] +1F009; [0C F6 F9, 05, 05] -1D21F; [0C F5 AE, 05, 05] +1F00A; [0C F7 02, 05, 05] -1D220; [0C F5 B5, 05, 05] +1F00B; [0C F7 09, 05, 05] -1D221; [0C F5 BC, 05, 05] +1F00C; [0C F7 10, 05, 05] -1D222; [0C F5 C3, 05, 05] +1F00D; [0C F7 17, 05, 05] -1D223; [0C F5 CA, 05, 05] +1F00E; [0C F7 1E, 05, 05] -1D224; [0C F5 D1, 05, 05] +1F00F; [0C F7 25, 05, 05] -1D225; [0C F5 D8, 05, 05] +1F010; [0C F7 2C, 05, 05] -1D226; [0C F5 DF, 05, 05] +1F011; [0C F7 33, 05, 05] -1D227; [0C F5 E6, 05, 05] +1F012; [0C F7 3A, 05, 05] -1D228; [0C F5 ED, 05, 05] +1F013; [0C F7 41, 05, 05] -1D229; [0C F5 F4, 05, 05] +1F014; [0C F7 48, 05, 05] -1D22A; [0C F5 FB, 05, 05] +1F015; [0C F7 4F, 05, 05] -1D22B; [0C F6 04, 05, 05] +1F016; [0C F7 56, 05, 05] -1D22C; [0C F6 0B, 05, 05] +1F017; [0C F7 5D, 05, 05] -1D22D; [0C F6 12, 05, 05] +1F018; [0C F7 64, 05, 05] -1D22E; [0C F6 19, 05, 05] +1F019; [0C F7 6B, 05, 05] -1D22F; [0C F6 20, 05, 05] +1F01A; [0C F7 72, 05, 05] -1D230; [0C F6 27, 05, 05] +1F01B; [0C F7 79, 05, 05] -1D231; [0C F6 2E, 05, 05] +1F01C; [0C F7 80, 05, 05] -1D232; [0C F6 35, 05, 05] +1F01D; [0C F7 87, 05, 05] -1D233; [0C F6 3C, 05, 05] +1F01E; [0C F7 8E, 05, 05] -1D234; [0C F6 43, 05, 05] +1F01F; [0C F7 95, 05, 05] -1D235; [0C F6 4A, 05, 05] +1F020; [0C F7 9C, 05, 05] -1D236; [0C F6 51, 05, 05] +1F021; [0C F7 A3, 05, 05] -1D237; [0C F6 58, 05, 05] +1F022; [0C F7 AA, 05, 05] -1D238; [0C F6 5F, 05, 05] +1F023; [0C F7 B1, 05, 05] -1D239; [0C F6 66, 05, 05] +1F024; [0C F7 B8, 05, 05] -1D23A; [0C F6 6D, 05, 05] +1F025; [0C F7 BF, 05, 05] -1D23B; [0C F6 74, 05, 05] +1F026; [0C F7 C6, 05, 05] -1D23C; [0C F6 7B, 05, 05] +1F027; [0C F7 CD, 05, 05] -1D23D; [0C F6 82, 05, 05] +1F028; [0C F7 D4, 05, 05] -1D23E; [0C F6 89, 05, 05] +1F029; [0C F7 DB, 05, 05] -1D23F; [0C F6 90, 05, 05] +1F02A; [0C F7 E2, 05, 05] -1D240; [0C F6 97, 05, 05] +1F02B; [0C F7 E9, 05, 05] -1D241; [0C F6 9E, 05, 05] +1F030; [0C F7 F0, 05, 05] -1D245; [0C F6 A5, 05, 05] +1F031; [0C F7 F7, 05, 05] -1BC9C; [0C F6 AC, 05, 05] +1F032; [0C F7 FE, 05, 05] -1F000; [0C F6 B3, 05, 05] +1F033; [0C F8 07, 05, 05] -1F001; [0C F6 BA, 05, 05] +1F034; [0C F8 0E, 05, 05] -1F002; [0C F6 C1, 05, 05] +1F035; [0C F8 15, 05, 05] -1F003; [0C F6 C8, 05, 05] +1F036; [0C F8 1C, 05, 05] -1F004; [0C F6 CF, 05, 05] +1F037; [0C F8 23, 05, 05] -1F005; [0C F6 D6, 05, 05] +1F038; [0C F8 2A, 05, 05] -1F006; [0C F6 DD, 05, 05] +1F039; [0C F8 31, 05, 05] -1F007; [0C F6 E4, 05, 05] +1F03A; [0C F8 38, 05, 05] -1F008; [0C F6 EB, 05, 05] +1F03B; [0C F8 3F, 05, 05] -1F009; [0C F6 F2, 05, 05] +1F03C; [0C F8 46, 05, 05] -1F00A; [0C F6 F9, 05, 05] +1F03D; [0C F8 4D, 05, 05] -1F00B; [0C F7 02, 05, 05] +1F03E; [0C F8 54, 05, 05] -1F00C; [0C F7 09, 05, 05] +1F03F; [0C F8 5B, 05, 05] -1F00D; [0C F7 10, 05, 05] +1F040; [0C F8 62, 05, 05] -1F00E; [0C F7 17, 05, 05] +1F041; [0C F8 69, 05, 05] -1F00F; [0C F7 1E, 05, 05] +1F042; [0C F8 70, 05, 05] -1F010; [0C F7 25, 05, 05] +1F043; [0C F8 77, 05, 05] -1F011; [0C F7 2C, 05, 05] +1F044; [0C F8 7E, 05, 05] -1F012; [0C F7 33, 05, 05] +1F045; [0C F8 85, 05, 05] -1F013; [0C F7 3A, 05, 05] +1F046; [0C F8 8C, 05, 05] -1F014; [0C F7 41, 05, 05] +1F047; [0C F8 93, 05, 05] -1F015; [0C F7 48, 05, 05] +1F048; [0C F8 9A, 05, 05] -1F016; [0C F7 4F, 05, 05] +1F049; [0C F8 A1, 05, 05] -1F017; [0C F7 56, 05, 05] +1F04A; [0C F8 A8, 05, 05] -1F018; [0C F7 5D, 05, 05] +1F04B; [0C F8 AF, 05, 05] -1F019; [0C F7 64, 05, 05] +1F04C; [0C F8 B6, 05, 05] -1F01A; [0C F7 6B, 05, 05] +1F04D; [0C F8 BD, 05, 05] -1F01B; [0C F7 72, 05, 05] +1F04E; [0C F8 C4, 05, 05] -1F01C; [0C F7 79, 05, 05] +1F04F; [0C F8 CB, 05, 05] -1F01D; [0C F7 80, 05, 05] +1F050; [0C F8 D2, 05, 05] -1F01E; [0C F7 87, 05, 05] +1F051; [0C F8 D9, 05, 05] -1F01F; [0C F7 8E, 05, 05] +1F052; [0C F8 E0, 05, 05] -1F020; [0C F7 95, 05, 05] +1F053; [0C F8 E7, 05, 05] -1F021; [0C F7 9C, 05, 05] +1F054; [0C F8 EE, 05, 05] -1F022; [0C F7 A3, 05, 05] +1F055; [0C F8 F5, 05, 05] -1F023; [0C F7 AA, 05, 05] +1F056; [0C F8 FC, 05, 05] -1F024; [0C F7 B1, 05, 05] +1F057; [0C F9 05, 05, 05] -1F025; [0C F7 B8, 05, 05] +1F058; [0C F9 0C, 05, 05] -1F026; [0C F7 BF, 05, 05] +1F059; [0C F9 13, 05, 05] -1F027; [0C F7 C6, 05, 05] +1F05A; [0C F9 1A, 05, 05] -1F028; [0C F7 CD, 05, 05] +1F05B; [0C F9 21, 05, 05] -1F029; [0C F7 D4, 05, 05] +1F05C; [0C F9 28, 05, 05] -1F02A; [0C F7 DB, 05, 05] +1F05D; [0C F9 2F, 05, 05] -1F02B; [0C F7 E2, 05, 05] +1F05E; [0C F9 36, 05, 05] -1F030; [0C F7 E9, 05, 05] +1F05F; [0C F9 3D, 05, 05] -1F031; [0C F7 F0, 05, 05] +1F060; [0C F9 44, 05, 05] -1F032; [0C F7 F7, 05, 05] +1F061; [0C F9 4B, 05, 05] -1F033; [0C F7 FE, 05, 05] +1F062; [0C F9 52, 05, 05] -1F034; [0C F8 07, 05, 05] +1F063; [0C F9 59, 05, 05] -1F035; [0C F8 0E, 05, 05] +1F064; [0C F9 60, 05, 05] -1F036; [0C F8 15, 05, 05] +1F065; [0C F9 67, 05, 05] -1F037; [0C F8 1C, 05, 05] +1F066; [0C F9 6E, 05, 05] -1F038; [0C F8 23, 05, 05] +1F067; [0C F9 75, 05, 05] -1F039; [0C F8 2A, 05, 05] +1F068; [0C F9 7C, 05, 05] -1F03A; [0C F8 31, 05, 05] +1F069; [0C F9 83, 05, 05] -1F03B; [0C F8 38, 05, 05] +1F06A; [0C F9 8A, 05, 05] -1F03C; [0C F8 3F, 05, 05] +1F06B; [0C F9 91, 05, 05] -1F03D; [0C F8 46, 05, 05] +1F06C; [0C F9 98, 05, 05] -1F03E; [0C F8 4D, 05, 05] +1F06D; [0C F9 9F, 05, 05] -1F03F; [0C F8 54, 05, 05] +1F06E; [0C F9 A6, 05, 05] -1F040; [0C F8 5B, 05, 05] +1F06F; [0C F9 AD, 05, 05] -1F041; [0C F8 62, 05, 05] +1F070; [0C F9 B4, 05, 05] -1F042; [0C F8 69, 05, 05] +1F071; [0C F9 BB, 05, 05] -1F043; [0C F8 70, 05, 05] +1F072; [0C F9 C2, 05, 05] -1F044; [0C F8 77, 05, 05] +1F073; [0C F9 C9, 05, 05] -1F045; [0C F8 7E, 05, 05] +1F074; [0C F9 D0, 05, 05] -1F046; [0C F8 85, 05, 05] +1F075; [0C F9 D7, 05, 05] -1F047; [0C F8 8C, 05, 05] +1F076; [0C F9 DE, 05, 05] -1F048; [0C F8 93, 05, 05] +1F077; [0C F9 E5, 05, 05] -1F049; [0C F8 9A, 05, 05] +1F078; [0C F9 EC, 05, 05] -1F04A; [0C F8 A1, 05, 05] +1F079; [0C F9 F3, 05, 05] -1F04B; [0C F8 A8, 05, 05] +1F07A; [0C F9 FA, 05, 05] -1F04C; [0C F8 AF, 05, 05] +1F07B; [0C FA 03, 05, 05] -1F04D; [0C F8 B6, 05, 05] +1F07C; [0C FA 0A, 05, 05] -1F04E; [0C F8 BD, 05, 05] +1F07D; [0C FA 11, 05, 05] -1F04F; [0C F8 C4, 05, 05] +1F07E; [0C FA 18, 05, 05] -1F050; [0C F8 CB, 05, 05] +1F07F; [0C FA 1F, 05, 05] -1F051; [0C F8 D2, 05, 05] +1F080; [0C FA 26, 05, 05] -1F052; [0C F8 D9, 05, 05] +1F081; [0C FA 2D, 05, 05] -1F053; [0C F8 E0, 05, 05] +1F082; [0C FA 34, 05, 05] -1F054; [0C F8 E7, 05, 05] +1F083; [0C FA 3B, 05, 05] -1F055; [0C F8 EE, 05, 05] +1F084; [0C FA 42, 05, 05] -1F056; [0C F8 F5, 05, 05] +1F085; [0C FA 49, 05, 05] -1F057; [0C F8 FC, 05, 05] +1F086; [0C FA 50, 05, 05] -1F058; [0C F9 05, 05, 05] +1F087; [0C FA 57, 05, 05] -1F059; [0C F9 0C, 05, 05] +1F088; [0C FA 5E, 05, 05] -1F05A; [0C F9 13, 05, 05] +1F089; [0C FA 65, 05, 05] -1F05B; [0C F9 1A, 05, 05] +1F08A; [0C FA 6C, 05, 05] -1F05C; [0C F9 21, 05, 05] +1F08B; [0C FA 73, 05, 05] -1F05D; [0C F9 28, 05, 05] +1F08C; [0C FA 7A, 05, 05] -1F05E; [0C F9 2F, 05, 05] +1F08D; [0C FA 81, 05, 05] -1F05F; [0C F9 36, 05, 05] +1F08E; [0C FA 88, 05, 05] -1F060; [0C F9 3D, 05, 05] +1F08F; [0C FA 8F, 05, 05] -1F061; [0C F9 44, 05, 05] +1F090; [0C FA 96, 05, 05] -1F062; [0C F9 4B, 05, 05] +1F091; [0C FA 9D, 05, 05] -1F063; [0C F9 52, 05, 05] +1F092; [0C FA A4, 05, 05] -1F064; [0C F9 59, 05, 05] +1F093; [0C FA AB, 05, 05] -1F065; [0C F9 60, 05, 05] +1F0A0; [0C FA B2, 05, 05] -1F066; [0C F9 67, 05, 05] +1F0A1; [0C FA B9, 05, 05] -1F067; [0C F9 6E, 05, 05] +1F0A2; [0C FA C0, 05, 05] -1F068; [0C F9 75, 05, 05] +1F0A3; [0C FA C7, 05, 05] -1F069; [0C F9 7C, 05, 05] +1F0A4; [0C FA CE, 05, 05] -1F06A; [0C F9 83, 05, 05] +1F0A5; [0C FA D5, 05, 05] -1F06B; [0C F9 8A, 05, 05] +1F0A6; [0C FA DC, 05, 05] -1F06C; [0C F9 91, 05, 05] +1F0A7; [0C FA E3, 05, 05] -1F06D; [0C F9 98, 05, 05] +1F0A8; [0C FA EA, 05, 05] -1F06E; [0C F9 9F, 05, 05] +1F0A9; [0C FA F1, 05, 05] -1F06F; [0C F9 A6, 05, 05] +1F0AA; [0C FA F8, 05, 05] -1F070; [0C F9 AD, 05, 05] +1F0AB; [0C FA FF, 05, 05] -1F071; [0C F9 B4, 05, 05] +1F0AC; [0C FB 08, 05, 05] -1F072; [0C F9 BB, 05, 05] +1F0AD; [0C FB 0F, 05, 05] -1F073; [0C F9 C2, 05, 05] +1F0AE; [0C FB 16, 05, 05] -1F074; [0C F9 C9, 05, 05] +1F0B1; [0C FB 1D, 05, 05] -1F075; [0C F9 D0, 05, 05] +1F0B2; [0C FB 24, 05, 05] -1F076; [0C F9 D7, 05, 05] +1F0B3; [0C FB 2B, 05, 05] -1F077; [0C F9 DE, 05, 05] +1F0B4; [0C FB 32, 05, 05] -1F078; [0C F9 E5, 05, 05] +1F0B5; [0C FB 39, 05, 05] -1F079; [0C F9 EC, 05, 05] +1F0B6; [0C FB 40, 05, 05] -1F07A; [0C F9 F3, 05, 05] +1F0B7; [0C FB 47, 05, 05] -1F07B; [0C F9 FA, 05, 05] +1F0B8; [0C FB 4E, 05, 05] -1F07C; [0C FA 03, 05, 05] +1F0B9; [0C FB 55, 05, 05] -1F07D; [0C FA 0A, 05, 05] +1F0BA; [0C FB 5C, 05, 05] -1F07E; [0C FA 11, 05, 05] +1F0BB; [0C FB 63, 05, 05] -1F07F; [0C FA 18, 05, 05] +1F0BC; [0C FB 6A, 05, 05] -1F080; [0C FA 1F, 05, 05] +1F0BD; [0C FB 71, 05, 05] -1F081; [0C FA 26, 05, 05] +1F0BE; [0C FB 78, 05, 05] -1F082; [0C FA 2D, 05, 05] +1F0BF; [0C FB 7F, 05, 05] -1F083; [0C FA 34, 05, 05] +1F0C1; [0C FB 86, 05, 05] -1F084; [0C FA 3B, 05, 05] +1F0C2; [0C FB 8D, 05, 05] -1F085; [0C FA 42, 05, 05] +1F0C3; [0C FB 94, 05, 05] -1F086; [0C FA 49, 05, 05] +1F0C4; [0C FB 9B, 05, 05] -1F087; [0C FA 50, 05, 05] +1F0C5; [0C FB A2, 05, 05] -1F088; [0C FA 57, 05, 05] +1F0C6; [0C FB A9, 05, 05] -1F089; [0C FA 5E, 05, 05] +1F0C7; [0C FB B0, 05, 05] -1F08A; [0C FA 65, 05, 05] +1F0C8; [0C FB B7, 05, 05] -1F08B; [0C FA 6C, 05, 05] +1F0C9; [0C FB BE, 05, 05] -1F08C; [0C FA 73, 05, 05] +1F0CA; [0C FB C5, 05, 05] -1F08D; [0C FA 7A, 05, 05] +1F0CB; [0C FB CC, 05, 05] -1F08E; [0C FA 81, 05, 05] +1F0CC; [0C FB D3, 05, 05] -1F08F; [0C FA 88, 05, 05] +1F0CD; [0C FB DA, 05, 05] -1F090; [0C FA 8F, 05, 05] +1F0CE; [0C FB E1, 05, 05] -1F091; [0C FA 96, 05, 05] +1F0CF; [0C FB E8, 05, 05] -1F092; [0C FA 9D, 05, 05] +1F0D1; [0C FB EF, 05, 05] -1F093; [0C FA A4, 05, 05] +1F0D2; [0C FB F6, 05, 05] -1F0A0; [0C FA AB, 05, 05] +1F0D3; [0C FB FD, 05, 05] -1F0A1; [0C FA B2, 05, 05] +1F0D4; [0C FC 06, 05, 05] -1F0A2; [0C FA B9, 05, 05] +1F0D5; [0C FC 0D, 05, 05] -1F0A3; [0C FA C0, 05, 05] +1F0D6; [0C FC 14, 05, 05] -1F0A4; [0C FA C7, 05, 05] +1F0D7; [0C FC 1B, 05, 05] -1F0A5; [0C FA CE, 05, 05] +1F0D8; [0C FC 22, 05, 05] -1F0A6; [0C FA D5, 05, 05] +1F0D9; [0C FC 29, 05, 05] -1F0A7; [0C FA DC, 05, 05] +1F0DA; [0C FC 30, 05, 05] -1F0A8; [0C FA E3, 05, 05] +1F0DB; [0C FC 37, 05, 05] -1F0A9; [0C FA EA, 05, 05] +1F0DC; [0C FC 3E, 05, 05] -1F0AA; [0C FA F1, 05, 05] +1F0DD; [0C FC 45, 05, 05] -1F0AB; [0C FA F8, 05, 05] +1F0DE; [0C FC 4C, 05, 05] -1F0AC; [0C FA FF, 05, 05] +1F0DF; [0C FC 53, 05, 05] -1F0AD; [0C FB 08, 05, 05] +1F0E0; [0C FC 5A, 05, 05] -1F0AE; [0C FB 0F, 05, 05] +1F0E1; [0C FC 61, 05, 05] -1F0B1; [0C FB 16, 05, 05] +1F0E2; [0C FC 68, 05, 05] -1F0B2; [0C FB 1D, 05, 05] +1F0E3; [0C FC 6F, 05, 05] -1F0B3; [0C FB 24, 05, 05] +1F0E4; [0C FC 76, 05, 05] -1F0B4; [0C FB 2B, 05, 05] +1F0E5; [0C FC 7D, 05, 05] -1F0B5; [0C FB 32, 05, 05] +1F0E6; [0C FC 84, 05, 05] -1F0B6; [0C FB 39, 05, 05] +1F0E7; [0C FC 8B, 05, 05] -1F0B7; [0C FB 40, 05, 05] +1F0E8; [0C FC 92, 05, 05] -1F0B8; [0C FB 47, 05, 05] +1F0E9; [0C FC 99, 05, 05] -1F0B9; [0C FB 4E, 05, 05] +1F0EA; [0C FC A0, 05, 05] -1F0BA; [0C FB 55, 05, 05] +1F0EB; [0C FC A7, 05, 05] -1F0BB; [0C FB 5C, 05, 05] +1F0EC; [0C FC AE, 05, 05] -1F0BC; [0C FB 63, 05, 05] +1F0ED; [0C FC B5, 05, 05] -1F0BD; [0C FB 6A, 05, 05] +1F0EE; [0C FC BC, 05, 05] -1F0BE; [0C FB 71, 05, 05] +1F0EF; [0C FC C3, 05, 05] -1F0BF; [0C FB 78, 05, 05] +1F0F0; [0C FC CA, 05, 05] -1F0C1; [0C FB 7F, 05, 05] +1F0F1; [0C FC D1, 05, 05] -1F0C2; [0C FB 86, 05, 05] +1F0F2; [0C FC D8, 05, 05] -1F0C3; [0C FB 8D, 05, 05] +1F0F3; [0C FC DF, 05, 05] -1F0C4; [0C FB 94, 05, 05] +1F0F4; [0C FC E6, 05, 05] -1F0C5; [0C FB 9B, 05, 05] +1F0F5; [0C FC ED, 05, 05] -1F0C6; [0C FB A2, 05, 05] +1F260; [0C FC F4, 05, 05] -1F0C7; [0C FB A9, 05, 05] +1F261; [0C FC FB, 05, 05] -1F0C8; [0C FB B0, 05, 05] +1F262; [0C FD 04, 05, 05] -1F0C9; [0C FB B7, 05, 05] +1F263; [0C FD 0B, 05, 05] -1F0CA; [0C FB BE, 05, 05] +1F264; [0C FD 12, 05, 05] -1F0CB; [0C FB C5, 05, 05] +1F265; [0C FD 19, 05, 05] -1F0CC; [0C FB CC, 05, 05] +1F300; [0C FD 20, 05, 05] -1F0CD; [0C FB D3, 05, 05] +1F301; [0C FD 27, 05, 05] -1F0CE; [0C FB DA, 05, 05] +1F302; [0C FD 2E, 05, 05] -1F0CF; [0C FB E1, 05, 05] +1F303; [0C FD 35, 05, 05] -1F0D1; [0C FB E8, 05, 05] +1F304; [0C FD 3C, 05, 05] -1F0D2; [0C FB EF, 05, 05] +1F305; [0C FD 43, 05, 05] -1F0D3; [0C FB F6, 05, 05] +1F306; [0C FD 4A, 05, 05] -1F0D4; [0C FB FD, 05, 05] +1F307; [0C FD 51, 05, 05] -1F0D5; [0C FC 06, 05, 05] +1F308; [0C FD 58, 05, 05] -1F0D6; [0C FC 0D, 05, 05] +1F309; [0C FD 5F, 05, 05] -1F0D7; [0C FC 14, 05, 05] +1F30A; [0C FD 66, 05, 05] -1F0D8; [0C FC 1B, 05, 05] +1F30B; [0C FD 6D, 05, 05] -1F0D9; [0C FC 22, 05, 05] +1F30C; [0C FD 74, 05, 05] -1F0DA; [0C FC 29, 05, 05] +1F30D; [0C FD 7B, 05, 05] -1F0DB; [0C FC 30, 05, 05] +1F30E; [0C FD 82, 05, 05] -1F0DC; [0C FC 37, 05, 05] +1F30F; [0C FD 89, 05, 05] -1F0DD; [0C FC 3E, 05, 05] +1F310; [0C FD 90, 05, 05] -1F0DE; [0C FC 45, 05, 05] +1F311; [0C FD 97, 05, 05] -1F0DF; [0C FC 4C, 05, 05] +1F312; [0C FD 9E, 05, 05] -1F0E0; [0C FC 53, 05, 05] +1F313; [0C FD A5, 05, 05] -1F0E1; [0C FC 5A, 05, 05] +1F314; [0C FD AC, 05, 05] -1F0E2; [0C FC 61, 05, 05] +1F315; [0C FD B3, 05, 05] -1F0E3; [0C FC 68, 05, 05] +1F316; [0C FD BA, 05, 05] -1F0E4; [0C FC 6F, 05, 05] +1F317; [0C FD C1, 05, 05] -1F0E5; [0C FC 76, 05, 05] +1F318; [0C FD C8, 05, 05] -1F0E6; [0C FC 7D, 05, 05] +1F319; [0C FD CF, 05, 05] -1F0E7; [0C FC 84, 05, 05] +1F31A; [0C FD D6, 05, 05] -1F0E8; [0C FC 8B, 05, 05] +1F31B; [0C FD DD, 05, 05] -1F0E9; [0C FC 92, 05, 05] +1F31C; [0C FD E4, 05, 05] -1F0EA; [0C FC 99, 05, 05] +1F31D; [0C FD EB, 05, 05] -1F0EB; [0C FC A0, 05, 05] +1F31E; [0C FD F2, 05, 05] -1F0EC; [0C FC A7, 05, 05] +1F31F; [0C FD F9, 05, 05] -1F0ED; [0C FC AE, 05, 05] +1F320; [0C FE 02, 05, 05] -1F0EE; [0C FC B5, 05, 05] +1F321; [0C FE 09, 05, 05] -1F0EF; [0C FC BC, 05, 05] +1F322; [0C FE 10, 05, 05] -1F0F0; [0C FC C3, 05, 05] +1F323; [0C FE 17, 05, 05] -1F0F1; [0C FC CA, 05, 05] +1F324; [0C FE 1E, 05, 05] -1F0F2; [0C FC D1, 05, 05] +1F325; [0C FE 25, 05, 05] -1F0F3; [0C FC D8, 05, 05] +1F326; [0C FE 2C, 05, 05] -1F0F4; [0C FC DF, 05, 05] +1F327; [0C FE 33, 05, 05] -1F0F5; [0C FC E6, 05, 05] +1F328; [0C FE 3A, 05, 05] -1F300; [0C FC ED, 05, 05] +1F329; [0C FE 41, 05, 05] -1F301; [0C FC F4, 05, 05] +1F32A; [0C FE 48, 05, 05] -1F302; [0C FC FB, 05, 05] +1F32B; [0C FE 4F, 05, 05] -1F303; [0C FD 04, 05, 05] +1F32C; [0C FE 56, 05, 05] -1F304; [0C FD 0B, 05, 05] +1F32D; [0C FE 5D, 05, 05] -1F305; [0C FD 12, 05, 05] +1F32E; [0C FE 64, 05, 05] -1F306; [0C FD 19, 05, 05] +1F32F; [0C FE 6B, 05, 05] -1F307; [0C FD 20, 05, 05] +1F330; [0C FE 72, 05, 05] -1F308; [0C FD 27, 05, 05] +1F331; [0C FE 79, 05, 05] -1F309; [0C FD 2E, 05, 05] +1F332; [0C FE 80, 05, 05] -1F30A; [0C FD 35, 05, 05] +1F333; [0C FE 87, 05, 05] -1F30B; [0C FD 3C, 05, 05] +1F334; [0C FE 8E, 05, 05] -1F30C; [0C FD 43, 05, 05] +1F335; [0C FE 95, 05, 05] -1F30D; [0C FD 4A, 05, 05] +1F336; [0C FE 9C, 05, 05] -1F30E; [0C FD 51, 05, 05] +1F337; [0C FE A3, 05, 05] -1F30F; [0C FD 58, 05, 05] +1F338; [0C FE AA, 05, 05] -1F310; [0C FD 5F, 05, 05] +1F339; [0C FE B1, 05, 05] -1F311; [0C FD 66, 05, 05] +1F33A; [0C FE B8, 05, 05] -1F312; [0C FD 6D, 05, 05] +1F33B; [0C FE BF, 05, 05] -1F313; [0C FD 74, 05, 05] +1F33C; [0C FE C6, 05, 05] -1F314; [0C FD 7B, 05, 05] +1F33D; [0C FE CD, 05, 05] -1F315; [0C FD 82, 05, 05] +1F33E; [0C FE D4, 05, 05] -1F316; [0C FD 89, 05, 05] +1F33F; [0C FE DB, 05, 05] -1F317; [0C FD 90, 05, 05] +1F340; [0C FE E2, 05, 05] -1F318; [0C FD 97, 05, 05] +1F341; [0C FE E9, 05, 05] -1F319; [0C FD 9E, 05, 05] +1F342; [0C FE F0, 05, 05] -1F31A; [0C FD A5, 05, 05] +1F343; [0C FE F7, 05, 05] -1F31B; [0C FD AC, 05, 05] +1F344; [0C FE FE, 05, 05] -1F31C; [0C FD B3, 05, 05] +1F345; [0C FF 07, 05, 05] -1F31D; [0C FD BA, 05, 05] +1F346; [0C FF 0E, 05, 05] -1F31E; [0C FD C1, 05, 05] +1F347; [0C FF 15, 05, 05] -1F31F; [0C FD C8, 05, 05] +1F348; [0C FF 1C, 05, 05] -1F320; [0C FD CF, 05, 05] +1F349; [0C FF 23, 05, 05] -1F321; [0C FD D6, 05, 05] +1F34A; [0C FF 2A, 05, 05] -1F322; [0C FD DD, 05, 05] +1F34B; [0C FF 31, 05, 05] -1F323; [0C FD E4, 05, 05] +1F34C; [0C FF 38, 05, 05] -1F324; [0C FD EB, 05, 05] +1F34D; [0C FF 3F, 05, 05] -1F325; [0C FD F2, 05, 05] +1F34E; [0C FF 46, 05, 05] -1F326; [0C FD F9, 05, 05] +1F34F; [0C FF 4D, 05, 05] -1F327; [0C FE 02, 05, 05] +1F350; [0C FF 54, 05, 05] -1F328; [0C FE 09, 05, 05] +1F351; [0C FF 5B, 05, 05] -1F329; [0C FE 10, 05, 05] +1F352; [0C FF 62, 05, 05] -1F32A; [0C FE 17, 05, 05] +1F353; [0C FF 69, 05, 05] -1F32B; [0C FE 1E, 05, 05] +1F354; [0C FF 70, 05, 05] -1F32C; [0C FE 25, 05, 05] +1F355; [0C FF 77, 05, 05] -1F32D; [0C FE 2C, 05, 05] +1F356; [0C FF 7E, 05, 05] -1F32E; [0C FE 33, 05, 05] +1F357; [0C FF 85, 05, 05] -1F32F; [0C FE 3A, 05, 05] +1F358; [0C FF 8C, 05, 05] -1F330; [0C FE 41, 05, 05] +1F359; [0C FF 93, 05, 05] -1F331; [0C FE 48, 05, 05] +1F35A; [0C FF 9A, 05, 05] -1F332; [0C FE 4F, 05, 05] +1F35B; [0C FF A1, 05, 05] -1F333; [0C FE 56, 05, 05] +1F35C; [0C FF A8, 05, 05] -1F334; [0C FE 5D, 05, 05] +1F35D; [0C FF AF, 05, 05] -1F335; [0C FE 64, 05, 05] +1F35E; [0C FF B6, 05, 05] -1F336; [0C FE 6B, 05, 05] +1F35F; [0C FF BD, 05, 05] -1F337; [0C FE 72, 05, 05] +1F360; [0C FF C4, 05, 05] -1F338; [0C FE 79, 05, 05] +1F361; [0C FF CB, 05, 05] -1F339; [0C FE 80, 05, 05] +1F362; [0C FF D2, 05, 05] -1F33A; [0C FE 87, 05, 05] +1F363; [0C FF D9, 05, 05] -1F33B; [0C FE 8E, 05, 05] +1F364; [0C FF E0, 05, 05] -1F33C; [0C FE 95, 05, 05] +1F365; [0C FF E7, 05, 05] -1F33D; [0C FE 9C, 05, 05] +1F366; [0C FF EE, 05, 05] -1F33E; [0C FE A3, 05, 05] +1F367; [0C FF F5, 05, 05] -1F33F; [0C FE AA, 05, 05] +1F368; [0C FF FC, 05, 05] -1F340; [0C FE B1, 05, 05] +1F369; [0D 02 05, 05, 05] -1F341; [0C FE B8, 05, 05] +1F36A; [0D 02 0C, 05, 05] -1F342; [0C FE BF, 05, 05] +1F36B; [0D 02 13, 05, 05] -1F343; [0C FE C6, 05, 05] +1F36C; [0D 02 1A, 05, 05] -1F344; [0C FE CD, 05, 05] +1F36D; [0D 02 21, 05, 05] -1F345; [0C FE D4, 05, 05] +1F36E; [0D 02 28, 05, 05] -1F346; [0C FE DB, 05, 05] +1F36F; [0D 02 2F, 05, 05] -1F347; [0C FE E2, 05, 05] +1F370; [0D 02 36, 05, 05] -1F348; [0C FE E9, 05, 05] +1F371; [0D 02 3D, 05, 05] -1F349; [0C FE F0, 05, 05] +1F372; [0D 02 44, 05, 05] -1F34A; [0C FE F7, 05, 05] +1F373; [0D 02 4B, 05, 05] -1F34B; [0C FE FE, 05, 05] +1F374; [0D 02 52, 05, 05] -1F34C; [0C FF 07, 05, 05] +1F375; [0D 02 59, 05, 05] -1F34D; [0C FF 0E, 05, 05] +1F376; [0D 02 60, 05, 05] -1F34E; [0C FF 15, 05, 05] +1F377; [0D 02 67, 05, 05] -1F34F; [0C FF 1C, 05, 05] +1F378; [0D 02 6E, 05, 05] -1F350; [0C FF 23, 05, 05] +1F379; [0D 02 75, 05, 05] -1F351; [0C FF 2A, 05, 05] +1F37A; [0D 02 7C, 05, 05] -1F352; [0C FF 31, 05, 05] +1F37B; [0D 02 83, 05, 05] -1F353; [0C FF 38, 05, 05] +1F37C; [0D 02 8A, 05, 05] -1F354; [0C FF 3F, 05, 05] +1F37D; [0D 02 91, 05, 05] -1F355; [0C FF 46, 05, 05] +1F37E; [0D 02 98, 05, 05] -1F356; [0C FF 4D, 05, 05] +1F37F; [0D 02 9F, 05, 05] -1F357; [0C FF 54, 05, 05] +1F380; [0D 02 A6, 05, 05] -1F358; [0C FF 5B, 05, 05] +1F381; [0D 02 AD, 05, 05] -1F359; [0C FF 62, 05, 05] +1F382; [0D 02 B4, 05, 05] -1F35A; [0C FF 69, 05, 05] +1F383; [0D 02 BB, 05, 05] -1F35B; [0C FF 70, 05, 05] +1F384; [0D 02 C2, 05, 05] -1F35C; [0C FF 77, 05, 05] +1F385; [0D 02 C9, 05, 05] -1F35D; [0C FF 7E, 05, 05] +1F386; [0D 02 D0, 05, 05] -1F35E; [0C FF 85, 05, 05] +1F387; [0D 02 D7, 05, 05] -1F35F; [0C FF 8C, 05, 05] +1F388; [0D 02 DE, 05, 05] -1F360; [0C FF 93, 05, 05] +1F389; [0D 02 E5, 05, 05] -1F361; [0C FF 9A, 05, 05] +1F38A; [0D 02 EC, 05, 05] -1F362; [0C FF A1, 05, 05] +1F38B; [0D 02 F3, 05, 05] -1F363; [0C FF A8, 05, 05] +1F38C; [0D 02 FA, 05, 05] -1F364; [0C FF AF, 05, 05] +1F38D; [0D 03 03, 05, 05] -1F365; [0C FF B6, 05, 05] +1F38E; [0D 03 0A, 05, 05] -1F366; [0C FF BD, 05, 05] +1F38F; [0D 03 11, 05, 05] -1F367; [0C FF C4, 05, 05] +1F390; [0D 03 18, 05, 05] -1F368; [0C FF CB, 05, 05] +1F391; [0D 03 1F, 05, 05] -1F369; [0C FF D2, 05, 05] +1F392; [0D 03 26, 05, 05] -1F36A; [0C FF D9, 05, 05] +1F393; [0D 03 2D, 05, 05] -1F36B; [0C FF E0, 05, 05] +1F394; [0D 03 34, 05, 05] -1F36C; [0C FF E7, 05, 05] +1F395; [0D 03 3B, 05, 05] -1F36D; [0C FF EE, 05, 05] +1F396; [0D 03 42, 05, 05] -1F36E; [0C FF F5, 05, 05] +1F397; [0D 03 49, 05, 05] -1F36F; [0C FF FC, 05, 05] +1F398; [0D 03 50, 05, 05] -1F370; [0D 02 05, 05, 05] +1F399; [0D 03 57, 05, 05] -1F371; [0D 02 0C, 05, 05] +1F39A; [0D 03 5E, 05, 05] -1F372; [0D 02 13, 05, 05] +1F39B; [0D 03 65, 05, 05] -1F373; [0D 02 1A, 05, 05] +1F39C; [0D 03 6C, 05, 05] -1F374; [0D 02 21, 05, 05] +1F39D; [0D 03 73, 05, 05] -1F375; [0D 02 28, 05, 05] +1F39E; [0D 03 7A, 05, 05] -1F376; [0D 02 2F, 05, 05] +1F39F; [0D 03 81, 05, 05] -1F377; [0D 02 36, 05, 05] +1F3A0; [0D 03 88, 05, 05] -1F378; [0D 02 3D, 05, 05] +1F3A1; [0D 03 8F, 05, 05] -1F379; [0D 02 44, 05, 05] +1F3A2; [0D 03 96, 05, 05] -1F37A; [0D 02 4B, 05, 05] +1F3A3; [0D 03 9D, 05, 05] -1F37B; [0D 02 52, 05, 05] +1F3A4; [0D 03 A4, 05, 05] -1F37C; [0D 02 59, 05, 05] +1F3A5; [0D 03 AB, 05, 05] -1F37D; [0D 02 60, 05, 05] +1F3A6; [0D 03 B2, 05, 05] -1F37E; [0D 02 67, 05, 05] +1F3A7; [0D 03 B9, 05, 05] -1F37F; [0D 02 6E, 05, 05] +1F3A8; [0D 03 C0, 05, 05] -1F380; [0D 02 75, 05, 05] +1F3A9; [0D 03 C7, 05, 05] -1F381; [0D 02 7C, 05, 05] +1F3AA; [0D 03 CE, 05, 05] -1F382; [0D 02 83, 05, 05] +1F3AB; [0D 03 D5, 05, 05] -1F383; [0D 02 8A, 05, 05] +1F3AC; [0D 03 DC, 05, 05] -1F384; [0D 02 91, 05, 05] +1F3AD; [0D 03 E3, 05, 05] -1F385; [0D 02 98, 05, 05] +1F3AE; [0D 03 EA, 05, 05] -1F386; [0D 02 9F, 05, 05] +1F3AF; [0D 03 F1, 05, 05] -1F387; [0D 02 A6, 05, 05] +1F3B0; [0D 03 F8, 05, 05] -1F388; [0D 02 AD, 05, 05] +1F3B1; [0D 03 FF, 05, 05] -1F389; [0D 02 B4, 05, 05] +1F3B2; [0D 04 08, 05, 05] -1F38A; [0D 02 BB, 05, 05] +1F3B3; [0D 04 0F, 05, 05] -1F38B; [0D 02 C2, 05, 05] +1F3B4; [0D 04 16, 05, 05] -1F38C; [0D 02 C9, 05, 05] +1F3B5; [0D 04 1D, 05, 05] -1F38D; [0D 02 D0, 05, 05] +1F3B6; [0D 04 24, 05, 05] -1F38E; [0D 02 D7, 05, 05] +1F3B7; [0D 04 2B, 05, 05] -1F38F; [0D 02 DE, 05, 05] +1F3B8; [0D 04 32, 05, 05] -1F390; [0D 02 E5, 05, 05] +1F3B9; [0D 04 39, 05, 05] -1F391; [0D 02 EC, 05, 05] +1F3BA; [0D 04 40, 05, 05] -1F392; [0D 02 F3, 05, 05] +1F3BB; [0D 04 47, 05, 05] -1F393; [0D 02 FA, 05, 05] +1F3BC; [0D 04 4E, 05, 05] -1F394; [0D 03 03, 05, 05] +1F3BD; [0D 04 55, 05, 05] -1F395; [0D 03 0A, 05, 05] +1F3BE; [0D 04 5C, 05, 05] -1F396; [0D 03 11, 05, 05] +1F3BF; [0D 04 63, 05, 05] -1F397; [0D 03 18, 05, 05] +1F3C0; [0D 04 6A, 05, 05] -1F398; [0D 03 1F, 05, 05] +1F3C1; [0D 04 71, 05, 05] -1F399; [0D 03 26, 05, 05] +1F3C2; [0D 04 78, 05, 05] -1F39A; [0D 03 2D, 05, 05] +1F3C3; [0D 04 7F, 05, 05] -1F39B; [0D 03 34, 05, 05] +1F3C4; [0D 04 86, 05, 05] -1F39C; [0D 03 3B, 05, 05] +1F3C5; [0D 04 8D, 05, 05] -1F39D; [0D 03 42, 05, 05] +1F3C6; [0D 04 94, 05, 05] -1F39E; [0D 03 49, 05, 05] +1F3C7; [0D 04 9B, 05, 05] -1F39F; [0D 03 50, 05, 05] +1F3C8; [0D 04 A2, 05, 05] -1F3A0; [0D 03 57, 05, 05] +1F3C9; [0D 04 A9, 05, 05] -1F3A1; [0D 03 5E, 05, 05] +1F3CA; [0D 04 B0, 05, 05] -1F3A2; [0D 03 65, 05, 05] +1F3CB; [0D 04 B7, 05, 05] -1F3A3; [0D 03 6C, 05, 05] +1F3CC; [0D 04 BE, 05, 05] -1F3A4; [0D 03 73, 05, 05] +1F3CD; [0D 04 C5, 05, 05] -1F3A5; [0D 03 7A, 05, 05] +1F3CE; [0D 04 CC, 05, 05] -1F3A6; [0D 03 81, 05, 05] +1F3CF; [0D 04 D3, 05, 05] -1F3A7; [0D 03 88, 05, 05] +1F3D0; [0D 04 DA, 05, 05] -1F3A8; [0D 03 8F, 05, 05] +1F3D1; [0D 04 E1, 05, 05] -1F3A9; [0D 03 96, 05, 05] +1F3D2; [0D 04 E8, 05, 05] -1F3AA; [0D 03 9D, 05, 05] +1F3D3; [0D 04 EF, 05, 05] -1F3AB; [0D 03 A4, 05, 05] +1F3D4; [0D 04 F6, 05, 05] -1F3AC; [0D 03 AB, 05, 05] +1F3D5; [0D 04 FD, 05, 05] -1F3AD; [0D 03 B2, 05, 05] +1F3D6; [0D 05 06, 05, 05] -1F3AE; [0D 03 B9, 05, 05] +1F3D7; [0D 05 0D, 05, 05] -1F3AF; [0D 03 C0, 05, 05] +1F3D8; [0D 05 14, 05, 05] -1F3B0; [0D 03 C7, 05, 05] +1F3D9; [0D 05 1B, 05, 05] -1F3B1; [0D 03 CE, 05, 05] +1F3DA; [0D 05 22, 05, 05] -1F3B2; [0D 03 D5, 05, 05] +1F3DB; [0D 05 29, 05, 05] -1F3B3; [0D 03 DC, 05, 05] +1F3DC; [0D 05 30, 05, 05] -1F3B4; [0D 03 E3, 05, 05] +1F3DD; [0D 05 37, 05, 05] -1F3B5; [0D 03 EA, 05, 05] +1F3DE; [0D 05 3E, 05, 05] -1F3B6; [0D 03 F1, 05, 05] +1F3DF; [0D 05 45, 05, 05] -1F3B7; [0D 03 F8, 05, 05] +1F3E0; [0D 05 4C, 05, 05] -1F3B8; [0D 03 FF, 05, 05] +1F3E1; [0D 05 53, 05, 05] -1F3B9; [0D 04 08, 05, 05] +1F3E2; [0D 05 5A, 05, 05] -1F3BA; [0D 04 0F, 05, 05] +1F3E3; [0D 05 61, 05, 05] -1F3BB; [0D 04 16, 05, 05] +1F3E4; [0D 05 68, 05, 05] -1F3BC; [0D 04 1D, 05, 05] +1F3E5; [0D 05 6F, 05, 05] -1F3BD; [0D 04 24, 05, 05] +1F3E6; [0D 05 76, 05, 05] -1F3BE; [0D 04 2B, 05, 05] +1F3E7; [0D 05 7D, 05, 05] -1F3BF; [0D 04 32, 05, 05] +1F3E8; [0D 05 84, 05, 05] -1F3C0; [0D 04 39, 05, 05] +1F3E9; [0D 05 8B, 05, 05] -1F3C1; [0D 04 40, 05, 05] +1F3EA; [0D 05 92, 05, 05] -1F3C2; [0D 04 47, 05, 05] +1F3EB; [0D 05 99, 05, 05] -1F3C3; [0D 04 4E, 05, 05] +1F3EC; [0D 05 A0, 05, 05] -1F3C4; [0D 04 55, 05, 05] +1F3ED; [0D 05 A7, 05, 05] -1F3C5; [0D 04 5C, 05, 05] +1F3EE; [0D 05 AE, 05, 05] -1F3C6; [0D 04 63, 05, 05] +1F3EF; [0D 05 B5, 05, 05] -1F3C7; [0D 04 6A, 05, 05] +1F3F0; [0D 05 BC, 05, 05] -1F3C8; [0D 04 71, 05, 05] +1F3F1; [0D 05 C3, 05, 05] -1F3C9; [0D 04 78, 05, 05] +1F3F2; [0D 05 CA, 05, 05] -1F3CA; [0D 04 7F, 05, 05] +1F3F3; [0D 05 D1, 05, 05] -1F3CB; [0D 04 86, 05, 05] +1F3F4; [0D 05 D8, 05, 05] -1F3CC; [0D 04 8D, 05, 05] +1F3F5; [0D 05 DF, 05, 05] -1F3CD; [0D 04 94, 05, 05] +1F3F6; [0D 05 E6, 05, 05] -1F3CE; [0D 04 9B, 05, 05] +1F3F7; [0D 05 ED, 05, 05] -1F3CF; [0D 04 A2, 05, 05] +1F3F8; [0D 05 F4, 05, 05] -1F3D0; [0D 04 A9, 05, 05] +1F3F9; [0D 05 FB, 05, 05] -1F3D1; [0D 04 B0, 05, 05] +1F3FA; [0D 06 04, 05, 05] -1F3D2; [0D 04 B7, 05, 05] +1F3FB; [0D 06 0B, 05, 05] -1F3D3; [0D 04 BE, 05, 05] +1F3FC; [0D 06 12, 05, 05] -1F3D4; [0D 04 C5, 05, 05] +1F3FD; [0D 06 19, 05, 05] -1F3D5; [0D 04 CC, 05, 05] +1F3FE; [0D 06 20, 05, 05] -1F3D6; [0D 04 D3, 05, 05] +1F3FF; [0D 06 27, 05, 05] -1F3D7; [0D 04 DA, 05, 05] +1F400; [0D 06 2E, 05, 05] -1F3D8; [0D 04 E1, 05, 05] +1F401; [0D 06 35, 05, 05] -1F3D9; [0D 04 E8, 05, 05] +1F402; [0D 06 3C, 05, 05] -1F3DA; [0D 04 EF, 05, 05] +1F403; [0D 06 43, 05, 05] -1F3DB; [0D 04 F6, 05, 05] +1F404; [0D 06 4A, 05, 05] -1F3DC; [0D 04 FD, 05, 05] +1F405; [0D 06 51, 05, 05] -1F3DD; [0D 05 06, 05, 05] +1F406; [0D 06 58, 05, 05] -1F3DE; [0D 05 0D, 05, 05] +1F407; [0D 06 5F, 05, 05] -1F3DF; [0D 05 14, 05, 05] +1F408; [0D 06 66, 05, 05] -1F3E0; [0D 05 1B, 05, 05] +1F409; [0D 06 6D, 05, 05] -1F3E1; [0D 05 22, 05, 05] +1F40A; [0D 06 74, 05, 05] -1F3E2; [0D 05 29, 05, 05] +1F40B; [0D 06 7B, 05, 05] -1F3E3; [0D 05 30, 05, 05] +1F40C; [0D 06 82, 05, 05] -1F3E4; [0D 05 37, 05, 05] +1F40D; [0D 06 89, 05, 05] -1F3E5; [0D 05 3E, 05, 05] +1F40E; [0D 06 90, 05, 05] -1F3E6; [0D 05 45, 05, 05] +1F40F; [0D 06 97, 05, 05] -1F3E7; [0D 05 4C, 05, 05] +1F410; [0D 06 9E, 05, 05] -1F3E8; [0D 05 53, 05, 05] +1F411; [0D 06 A5, 05, 05] -1F3E9; [0D 05 5A, 05, 05] +1F412; [0D 06 AC, 05, 05] -1F3EA; [0D 05 61, 05, 05] +1F413; [0D 06 B3, 05, 05] -1F3EB; [0D 05 68, 05, 05] +1F414; [0D 06 BA, 05, 05] -1F3EC; [0D 05 6F, 05, 05] +1F415; [0D 06 C1, 05, 05] -1F3ED; [0D 05 76, 05, 05] +1F416; [0D 06 C8, 05, 05] -1F3EE; [0D 05 7D, 05, 05] +1F417; [0D 06 CF, 05, 05] -1F3EF; [0D 05 84, 05, 05] +1F418; [0D 06 D6, 05, 05] -1F3F0; [0D 05 8B, 05, 05] +1F419; [0D 06 DD, 05, 05] -1F3F1; [0D 05 92, 05, 05] +1F41A; [0D 06 E4, 05, 05] -1F3F2; [0D 05 99, 05, 05] +1F41B; [0D 06 EB, 05, 05] -1F3F3; [0D 05 A0, 05, 05] +1F41C; [0D 06 F2, 05, 05] -1F3F4; [0D 05 A7, 05, 05] +1F41D; [0D 06 F9, 05, 05] -1F3F5; [0D 05 AE, 05, 05] +1F41E; [0D 07 02, 05, 05] -1F3F6; [0D 05 B5, 05, 05] +1F41F; [0D 07 09, 05, 05] -1F3F7; [0D 05 BC, 05, 05] +1F420; [0D 07 10, 05, 05] -1F3F8; [0D 05 C3, 05, 05] +1F421; [0D 07 17, 05, 05] -1F3F9; [0D 05 CA, 05, 05] +1F422; [0D 07 1E, 05, 05] -1F3FA; [0D 05 D1, 05, 05] +1F423; [0D 07 25, 05, 05] -1F3FB; [0D 05 D8, 05, 05] +1F424; [0D 07 2C, 05, 05] -1F3FC; [0D 05 DF, 05, 05] +1F425; [0D 07 33, 05, 05] -1F3FD; [0D 05 E6, 05, 05] +1F426; [0D 07 3A, 05, 05] -1F3FE; [0D 05 ED, 05, 05] +1F427; [0D 07 41, 05, 05] -1F3FF; [0D 05 F4, 05, 05] +1F428; [0D 07 48, 05, 05] -1F400; [0D 05 FB, 05, 05] +1F429; [0D 07 4F, 05, 05] -1F401; [0D 06 04, 05, 05] +1F42A; [0D 07 56, 05, 05] -1F402; [0D 06 0B, 05, 05] +1F42B; [0D 07 5D, 05, 05] -1F403; [0D 06 12, 05, 05] +1F42C; [0D 07 64, 05, 05] -1F404; [0D 06 19, 05, 05] +1F42D; [0D 07 6B, 05, 05] -1F405; [0D 06 20, 05, 05] +1F42E; [0D 07 72, 05, 05] -1F406; [0D 06 27, 05, 05] +1F42F; [0D 07 79, 05, 05] -1F407; [0D 06 2E, 05, 05] +1F430; [0D 07 80, 05, 05] -1F408; [0D 06 35, 05, 05] +1F431; [0D 07 87, 05, 05] -1F409; [0D 06 3C, 05, 05] +1F432; [0D 07 8E, 05, 05] -1F40A; [0D 06 43, 05, 05] +1F433; [0D 07 95, 05, 05] -1F40B; [0D 06 4A, 05, 05] +1F434; [0D 07 9C, 05, 05] -1F40C; [0D 06 51, 05, 05] +1F435; [0D 07 A3, 05, 05] -1F40D; [0D 06 58, 05, 05] +1F436; [0D 07 AA, 05, 05] -1F40E; [0D 06 5F, 05, 05] +1F437; [0D 07 B1, 05, 05] -1F40F; [0D 06 66, 05, 05] +1F438; [0D 07 B8, 05, 05] -1F410; [0D 06 6D, 05, 05] +1F439; [0D 07 BF, 05, 05] -1F411; [0D 06 74, 05, 05] +1F43A; [0D 07 C6, 05, 05] -1F412; [0D 06 7B, 05, 05] +1F43B; [0D 07 CD, 05, 05] -1F413; [0D 06 82, 05, 05] +1F43C; [0D 07 D4, 05, 05] -1F414; [0D 06 89, 05, 05] +1F43D; [0D 07 DB, 05, 05] -1F415; [0D 06 90, 05, 05] +1F43E; [0D 07 E2, 05, 05] -1F416; [0D 06 97, 05, 05] +1F43F; [0D 07 E9, 05, 05] -1F417; [0D 06 9E, 05, 05] +1F440; [0D 07 F0, 05, 05] -1F418; [0D 06 A5, 05, 05] +1F441; [0D 07 F7, 05, 05] -1F419; [0D 06 AC, 05, 05] +1F442; [0D 07 FE, 05, 05] -1F41A; [0D 06 B3, 05, 05] +1F443; [0D 08 07, 05, 05] -1F41B; [0D 06 BA, 05, 05] +1F444; [0D 08 0E, 05, 05] -1F41C; [0D 06 C1, 05, 05] +1F445; [0D 08 15, 05, 05] -1F41D; [0D 06 C8, 05, 05] +1F446; [0D 08 1C, 05, 05] -1F41E; [0D 06 CF, 05, 05] +1F447; [0D 08 23, 05, 05] -1F41F; [0D 06 D6, 05, 05] +1F448; [0D 08 2A, 05, 05] -1F420; [0D 06 DD, 05, 05] +1F449; [0D 08 31, 05, 05] -1F421; [0D 06 E4, 05, 05] +1F44A; [0D 08 38, 05, 05] -1F422; [0D 06 EB, 05, 05] +1F44B; [0D 08 3F, 05, 05] -1F423; [0D 06 F2, 05, 05] +1F44C; [0D 08 46, 05, 05] -1F424; [0D 06 F9, 05, 05] +1F44D; [0D 08 4D, 05, 05] -1F425; [0D 07 02, 05, 05] +1F44E; [0D 08 54, 05, 05] -1F426; [0D 07 09, 05, 05] +1F44F; [0D 08 5B, 05, 05] -1F427; [0D 07 10, 05, 05] +1F450; [0D 08 62, 05, 05] -1F428; [0D 07 17, 05, 05] +1F451; [0D 08 69, 05, 05] -1F429; [0D 07 1E, 05, 05] +1F452; [0D 08 70, 05, 05] -1F42A; [0D 07 25, 05, 05] +1F453; [0D 08 77, 05, 05] -1F42B; [0D 07 2C, 05, 05] +1F454; [0D 08 7E, 05, 05] -1F42C; [0D 07 33, 05, 05] +1F455; [0D 08 85, 05, 05] -1F42D; [0D 07 3A, 05, 05] +1F456; [0D 08 8C, 05, 05] -1F42E; [0D 07 41, 05, 05] +1F457; [0D 08 93, 05, 05] -1F42F; [0D 07 48, 05, 05] +1F458; [0D 08 9A, 05, 05] -1F430; [0D 07 4F, 05, 05] +1F459; [0D 08 A1, 05, 05] -1F431; [0D 07 56, 05, 05] +1F45A; [0D 08 A8, 05, 05] -1F432; [0D 07 5D, 05, 05] +1F45B; [0D 08 AF, 05, 05] -1F433; [0D 07 64, 05, 05] +1F45C; [0D 08 B6, 05, 05] -1F434; [0D 07 6B, 05, 05] +1F45D; [0D 08 BD, 05, 05] -1F435; [0D 07 72, 05, 05] +1F45E; [0D 08 C4, 05, 05] -1F436; [0D 07 79, 05, 05] +1F45F; [0D 08 CB, 05, 05] -1F437; [0D 07 80, 05, 05] +1F460; [0D 08 D2, 05, 05] -1F438; [0D 07 87, 05, 05] +1F461; [0D 08 D9, 05, 05] -1F439; [0D 07 8E, 05, 05] +1F462; [0D 08 E0, 05, 05] -1F43A; [0D 07 95, 05, 05] +1F463; [0D 08 E7, 05, 05] -1F43B; [0D 07 9C, 05, 05] +1F464; [0D 08 EE, 05, 05] -1F43C; [0D 07 A3, 05, 05] +1F465; [0D 08 F5, 05, 05] -1F43D; [0D 07 AA, 05, 05] +1F466; [0D 08 FC, 05, 05] -1F43E; [0D 07 B1, 05, 05] +1F467; [0D 09 05, 05, 05] -1F43F; [0D 07 B8, 05, 05] +1F468; [0D 09 0C, 05, 05] -1F440; [0D 07 BF, 05, 05] +1F469; [0D 09 13, 05, 05] -1F441; [0D 07 C6, 05, 05] +1F46A; [0D 09 1A, 05, 05] -1F442; [0D 07 CD, 05, 05] +1F46B; [0D 09 21, 05, 05] -1F443; [0D 07 D4, 05, 05] +1F46C; [0D 09 28, 05, 05] -1F444; [0D 07 DB, 05, 05] +1F46D; [0D 09 2F, 05, 05] -1F445; [0D 07 E2, 05, 05] +1F46E; [0D 09 36, 05, 05] -1F446; [0D 07 E9, 05, 05] +1F46F; [0D 09 3D, 05, 05] -1F447; [0D 07 F0, 05, 05] +1F470; [0D 09 44, 05, 05] -1F448; [0D 07 F7, 05, 05] +1F471; [0D 09 4B, 05, 05] -1F449; [0D 07 FE, 05, 05] +1F472; [0D 09 52, 05, 05] -1F44A; [0D 08 07, 05, 05] +1F473; [0D 09 59, 05, 05] -1F44B; [0D 08 0E, 05, 05] +1F474; [0D 09 60, 05, 05] -1F44C; [0D 08 15, 05, 05] +1F475; [0D 09 67, 05, 05] -1F44D; [0D 08 1C, 05, 05] +1F476; [0D 09 6E, 05, 05] -1F44E; [0D 08 23, 05, 05] +1F477; [0D 09 75, 05, 05] -1F44F; [0D 08 2A, 05, 05] +1F478; [0D 09 7C, 05, 05] -1F450; [0D 08 31, 05, 05] +1F479; [0D 09 83, 05, 05] -1F451; [0D 08 38, 05, 05] +1F47A; [0D 09 8A, 05, 05] -1F452; [0D 08 3F, 05, 05] +1F47B; [0D 09 91, 05, 05] -1F453; [0D 08 46, 05, 05] +1F47C; [0D 09 98, 05, 05] -1F454; [0D 08 4D, 05, 05] +1F47D; [0D 09 9F, 05, 05] -1F455; [0D 08 54, 05, 05] +1F47E; [0D 09 A6, 05, 05] -1F456; [0D 08 5B, 05, 05] +1F47F; [0D 09 AD, 05, 05] -1F457; [0D 08 62, 05, 05] +1F480; [0D 09 B4, 05, 05] -1F458; [0D 08 69, 05, 05] +1F481; [0D 09 BB, 05, 05] -1F459; [0D 08 70, 05, 05] +1F482; [0D 09 C2, 05, 05] -1F45A; [0D 08 77, 05, 05] +1F483; [0D 09 C9, 05, 05] -1F45B; [0D 08 7E, 05, 05] +1F484; [0D 09 D0, 05, 05] -1F45C; [0D 08 85, 05, 05] +1F485; [0D 09 D7, 05, 05] -1F45D; [0D 08 8C, 05, 05] +1F486; [0D 09 DE, 05, 05] -1F45E; [0D 08 93, 05, 05] +1F487; [0D 09 E5, 05, 05] -1F45F; [0D 08 9A, 05, 05] +1F488; [0D 09 EC, 05, 05] -1F460; [0D 08 A1, 05, 05] +1F489; [0D 09 F3, 05, 05] -1F461; [0D 08 A8, 05, 05] +1F48A; [0D 09 FA, 05, 05] -1F462; [0D 08 AF, 05, 05] +1F48B; [0D 0A 03, 05, 05] -1F463; [0D 08 B6, 05, 05] +1F48C; [0D 0A 0A, 05, 05] -1F464; [0D 08 BD, 05, 05] +1F48D; [0D 0A 11, 05, 05] -1F465; [0D 08 C4, 05, 05] +1F48E; [0D 0A 18, 05, 05] -1F466; [0D 08 CB, 05, 05] +1F48F; [0D 0A 1F, 05, 05] -1F467; [0D 08 D2, 05, 05] +1F490; [0D 0A 26, 05, 05] -1F468; [0D 08 D9, 05, 05] +1F491; [0D 0A 2D, 05, 05] -1F469; [0D 08 E0, 05, 05] +1F492; [0D 0A 34, 05, 05] -1F46A; [0D 08 E7, 05, 05] +1F493; [0D 0A 3B, 05, 05] -1F46B; [0D 08 EE, 05, 05] +1F494; [0D 0A 42, 05, 05] -1F46C; [0D 08 F5, 05, 05] +1F495; [0D 0A 49, 05, 05] -1F46D; [0D 08 FC, 05, 05] +1F496; [0D 0A 50, 05, 05] -1F46E; [0D 09 05, 05, 05] +1F497; [0D 0A 57, 05, 05] -1F46F; [0D 09 0C, 05, 05] +1F498; [0D 0A 5E, 05, 05] -1F470; [0D 09 13, 05, 05] +1F499; [0D 0A 65, 05, 05] -1F471; [0D 09 1A, 05, 05] +1F49A; [0D 0A 6C, 05, 05] -1F472; [0D 09 21, 05, 05] +1F49B; [0D 0A 73, 05, 05] -1F473; [0D 09 28, 05, 05] +1F49C; [0D 0A 7A, 05, 05] -1F474; [0D 09 2F, 05, 05] +1F49D; [0D 0A 81, 05, 05] -1F475; [0D 09 36, 05, 05] +1F49E; [0D 0A 88, 05, 05] -1F476; [0D 09 3D, 05, 05] +1F49F; [0D 0A 8F, 05, 05] -1F477; [0D 09 44, 05, 05] +1F4A0; [0D 0A 96, 05, 05] -1F478; [0D 09 4B, 05, 05] +1F4A1; [0D 0A 9D, 05, 05] -1F479; [0D 09 52, 05, 05] +1F4A2; [0D 0A A4, 05, 05] -1F47A; [0D 09 59, 05, 05] +1F4A3; [0D 0A AB, 05, 05] -1F47B; [0D 09 60, 05, 05] +1F4A4; [0D 0A B2, 05, 05] -1F47C; [0D 09 67, 05, 05] +1F4A5; [0D 0A B9, 05, 05] -1F47D; [0D 09 6E, 05, 05] +1F4A6; [0D 0A C0, 05, 05] -1F47E; [0D 09 75, 05, 05] +1F4A7; [0D 0A C7, 05, 05] -1F47F; [0D 09 7C, 05, 05] +1F4A8; [0D 0A CE, 05, 05] -1F480; [0D 09 83, 05, 05] +1F4A9; [0D 0A D5, 05, 05] -1F481; [0D 09 8A, 05, 05] +1F4AA; [0D 0A DC, 05, 05] -1F482; [0D 09 91, 05, 05] +1F4AB; [0D 0A E3, 05, 05] -1F483; [0D 09 98, 05, 05] +1F4AC; [0D 0A EA, 05, 05] -1F484; [0D 09 9F, 05, 05] +1F4AD; [0D 0A F1, 05, 05] -1F485; [0D 09 A6, 05, 05] +1F4AE; [0D 0A F8, 05, 05] -1F486; [0D 09 AD, 05, 05] +1F4AF; [0D 0A FF, 05, 05] -1F487; [0D 09 B4, 05, 05] +1F4B0; [0D 0B 08, 05, 05] -1F488; [0D 09 BB, 05, 05] +1F4B1; [0D 0B 0F, 05, 05] -1F489; [0D 09 C2, 05, 05] +1F4B2; [0D 0B 16, 05, 05] -1F48A; [0D 09 C9, 05, 05] +1F4B3; [0D 0B 1D, 05, 05] -1F48B; [0D 09 D0, 05, 05] +1F4B4; [0D 0B 24, 05, 05] -1F48C; [0D 09 D7, 05, 05] +1F4B5; [0D 0B 2B, 05, 05] -1F48D; [0D 09 DE, 05, 05] +1F4B6; [0D 0B 32, 05, 05] -1F48E; [0D 09 E5, 05, 05] +1F4B7; [0D 0B 39, 05, 05] -1F48F; [0D 09 EC, 05, 05] +1F4B8; [0D 0B 40, 05, 05] -1F490; [0D 09 F3, 05, 05] +1F4B9; [0D 0B 47, 05, 05] -1F491; [0D 09 FA, 05, 05] +1F4BA; [0D 0B 4E, 05, 05] -1F492; [0D 0A 03, 05, 05] +1F4BB; [0D 0B 55, 05, 05] -1F493; [0D 0A 0A, 05, 05] +1F4BC; [0D 0B 5C, 05, 05] -1F494; [0D 0A 11, 05, 05] +1F4BD; [0D 0B 63, 05, 05] -1F495; [0D 0A 18, 05, 05] +1F4BE; [0D 0B 6A, 05, 05] -1F496; [0D 0A 1F, 05, 05] +1F4BF; [0D 0B 71, 05, 05] -1F497; [0D 0A 26, 05, 05] +1F4C0; [0D 0B 78, 05, 05] -1F498; [0D 0A 2D, 05, 05] +1F4C1; [0D 0B 7F, 05, 05] -1F499; [0D 0A 34, 05, 05] +1F4C2; [0D 0B 86, 05, 05] -1F49A; [0D 0A 3B, 05, 05] +1F4C3; [0D 0B 8D, 05, 05] -1F49B; [0D 0A 42, 05, 05] +1F4C4; [0D 0B 94, 05, 05] -1F49C; [0D 0A 49, 05, 05] +1F4C5; [0D 0B 9B, 05, 05] -1F49D; [0D 0A 50, 05, 05] +1F4C6; [0D 0B A2, 05, 05] -1F49E; [0D 0A 57, 05, 05] +1F4C7; [0D 0B A9, 05, 05] -1F49F; [0D 0A 5E, 05, 05] +1F4C8; [0D 0B B0, 05, 05] -1F4A0; [0D 0A 65, 05, 05] +1F4C9; [0D 0B B7, 05, 05] -1F4A1; [0D 0A 6C, 05, 05] +1F4CA; [0D 0B BE, 05, 05] -1F4A2; [0D 0A 73, 05, 05] +1F4CB; [0D 0B C5, 05, 05] -1F4A3; [0D 0A 7A, 05, 05] +1F4CC; [0D 0B CC, 05, 05] -1F4A4; [0D 0A 81, 05, 05] +1F4CD; [0D 0B D3, 05, 05] -1F4A5; [0D 0A 88, 05, 05] +1F4CE; [0D 0B DA, 05, 05] -1F4A6; [0D 0A 8F, 05, 05] +1F4CF; [0D 0B E1, 05, 05] -1F4A7; [0D 0A 96, 05, 05] +1F4D0; [0D 0B E8, 05, 05] -1F4A8; [0D 0A 9D, 05, 05] +1F4D1; [0D 0B EF, 05, 05] -1F4A9; [0D 0A A4, 05, 05] +1F4D2; [0D 0B F6, 05, 05] -1F4AA; [0D 0A AB, 05, 05] +1F4D3; [0D 0B FD, 05, 05] -1F4AB; [0D 0A B2, 05, 05] +1F4D4; [0D 0C 06, 05, 05] -1F4AC; [0D 0A B9, 05, 05] +1F4D5; [0D 0C 0D, 05, 05] -1F4AD; [0D 0A C0, 05, 05] +1F4D6; [0D 0C 14, 05, 05] -1F4AE; [0D 0A C7, 05, 05] +1F4D7; [0D 0C 1B, 05, 05] -1F4AF; [0D 0A CE, 05, 05] +1F4D8; [0D 0C 22, 05, 05] -1F4B0; [0D 0A D5, 05, 05] +1F4D9; [0D 0C 29, 05, 05] -1F4B1; [0D 0A DC, 05, 05] +1F4DA; [0D 0C 30, 05, 05] -1F4B2; [0D 0A E3, 05, 05] +1F4DB; [0D 0C 37, 05, 05] -1F4B3; [0D 0A EA, 05, 05] +1F4DC; [0D 0C 3E, 05, 05] -1F4B4; [0D 0A F1, 05, 05] +1F4DD; [0D 0C 45, 05, 05] -1F4B5; [0D 0A F8, 05, 05] +1F4DE; [0D 0C 4C, 05, 05] -1F4B6; [0D 0A FF, 05, 05] +1F4DF; [0D 0C 53, 05, 05] -1F4B7; [0D 0B 08, 05, 05] +1F4E0; [0D 0C 5A, 05, 05] -1F4B8; [0D 0B 0F, 05, 05] +1F4E1; [0D 0C 61, 05, 05] -1F4B9; [0D 0B 16, 05, 05] +1F4E2; [0D 0C 68, 05, 05] -1F4BA; [0D 0B 1D, 05, 05] +1F4E3; [0D 0C 6F, 05, 05] -1F4BB; [0D 0B 24, 05, 05] +1F4E4; [0D 0C 76, 05, 05] -1F4BC; [0D 0B 2B, 05, 05] +1F4E5; [0D 0C 7D, 05, 05] -1F4BD; [0D 0B 32, 05, 05] +1F4E6; [0D 0C 84, 05, 05] -1F4BE; [0D 0B 39, 05, 05] +1F4E7; [0D 0C 8B, 05, 05] -1F4BF; [0D 0B 40, 05, 05] +1F4E8; [0D 0C 92, 05, 05] -1F4C0; [0D 0B 47, 05, 05] +1F4E9; [0D 0C 99, 05, 05] -1F4C1; [0D 0B 4E, 05, 05] +1F4EA; [0D 0C A0, 05, 05] -1F4C2; [0D 0B 55, 05, 05] +1F4EB; [0D 0C A7, 05, 05] -1F4C3; [0D 0B 5C, 05, 05] +1F4EC; [0D 0C AE, 05, 05] -1F4C4; [0D 0B 63, 05, 05] +1F4ED; [0D 0C B5, 05, 05] -1F4C5; [0D 0B 6A, 05, 05] +1F4EE; [0D 0C BC, 05, 05] -1F4C6; [0D 0B 71, 05, 05] +1F4EF; [0D 0C C3, 05, 05] -1F4C7; [0D 0B 78, 05, 05] +1F4F0; [0D 0C CA, 05, 05] -1F4C8; [0D 0B 7F, 05, 05] +1F4F1; [0D 0C D1, 05, 05] -1F4C9; [0D 0B 86, 05, 05] +1F4F2; [0D 0C D8, 05, 05] -1F4CA; [0D 0B 8D, 05, 05] +1F4F3; [0D 0C DF, 05, 05] -1F4CB; [0D 0B 94, 05, 05] +1F4F4; [0D 0C E6, 05, 05] -1F4CC; [0D 0B 9B, 05, 05] +1F4F5; [0D 0C ED, 05, 05] -1F4CD; [0D 0B A2, 05, 05] +1F4F6; [0D 0C F4, 05, 05] -1F4CE; [0D 0B A9, 05, 05] +1F4F7; [0D 0C FB, 05, 05] -1F4CF; [0D 0B B0, 05, 05] +1F4F8; [0D 0D 04, 05, 05] -1F4D0; [0D 0B B7, 05, 05] +1F4F9; [0D 0D 0B, 05, 05] -1F4D1; [0D 0B BE, 05, 05] +1F4FA; [0D 0D 12, 05, 05] -1F4D2; [0D 0B C5, 05, 05] +1F4FB; [0D 0D 19, 05, 05] -1F4D3; [0D 0B CC, 05, 05] +1F4FC; [0D 0D 20, 05, 05] -1F4D4; [0D 0B D3, 05, 05] +1F4FD; [0D 0D 27, 05, 05] -1F4D5; [0D 0B DA, 05, 05] +1F4FE; [0D 0D 2E, 05, 05] -1F4D6; [0D 0B E1, 05, 05] +1F4FF; [0D 0D 35, 05, 05] -1F4D7; [0D 0B E8, 05, 05] +1F500; [0D 0D 3C, 05, 05] -1F4D8; [0D 0B EF, 05, 05] +1F501; [0D 0D 43, 05, 05] -1F4D9; [0D 0B F6, 05, 05] +1F502; [0D 0D 4A, 05, 05] -1F4DA; [0D 0B FD, 05, 05] +1F503; [0D 0D 51, 05, 05] -1F4DB; [0D 0C 06, 05, 05] +1F504; [0D 0D 58, 05, 05] -1F4DC; [0D 0C 0D, 05, 05] +1F505; [0D 0D 5F, 05, 05] -1F4DD; [0D 0C 14, 05, 05] +1F506; [0D 0D 66, 05, 05] -1F4DE; [0D 0C 1B, 05, 05] +1F507; [0D 0D 6D, 05, 05] -1F4DF; [0D 0C 22, 05, 05] +1F508; [0D 0D 74, 05, 05] -1F4E0; [0D 0C 29, 05, 05] +1F509; [0D 0D 7B, 05, 05] -1F4E1; [0D 0C 30, 05, 05] +1F50A; [0D 0D 82, 05, 05] -1F4E2; [0D 0C 37, 05, 05] +1F50B; [0D 0D 89, 05, 05] -1F4E3; [0D 0C 3E, 05, 05] +1F50C; [0D 0D 90, 05, 05] -1F4E4; [0D 0C 45, 05, 05] +1F50D; [0D 0D 97, 05, 05] -1F4E5; [0D 0C 4C, 05, 05] +1F50E; [0D 0D 9E, 05, 05] -1F4E6; [0D 0C 53, 05, 05] +1F50F; [0D 0D A5, 05, 05] -1F4E7; [0D 0C 5A, 05, 05] +1F510; [0D 0D AC, 05, 05] -1F4E8; [0D 0C 61, 05, 05] +1F511; [0D 0D B3, 05, 05] -1F4E9; [0D 0C 68, 05, 05] +1F512; [0D 0D BA, 05, 05] -1F4EA; [0D 0C 6F, 05, 05] +1F513; [0D 0D C1, 05, 05] -1F4EB; [0D 0C 76, 05, 05] +1F514; [0D 0D C8, 05, 05] -1F4EC; [0D 0C 7D, 05, 05] +1F515; [0D 0D CF, 05, 05] -1F4ED; [0D 0C 84, 05, 05] +1F516; [0D 0D D6, 05, 05] -1F4EE; [0D 0C 8B, 05, 05] +1F517; [0D 0D DD, 05, 05] -1F4EF; [0D 0C 92, 05, 05] +1F518; [0D 0D E4, 05, 05] -1F4F0; [0D 0C 99, 05, 05] +1F519; [0D 0D EB, 05, 05] -1F4F1; [0D 0C A0, 05, 05] +1F51A; [0D 0D F2, 05, 05] -1F4F2; [0D 0C A7, 05, 05] +1F51B; [0D 0D F9, 05, 05] -1F4F3; [0D 0C AE, 05, 05] +1F51C; [0D 0E 02, 05, 05] -1F4F4; [0D 0C B5, 05, 05] +1F51D; [0D 0E 09, 05, 05] -1F4F5; [0D 0C BC, 05, 05] +1F51E; [0D 0E 10, 05, 05] -1F4F6; [0D 0C C3, 05, 05] +1F51F; [0D 0E 17, 05, 05] -1F4F7; [0D 0C CA, 05, 05] +1F520; [0D 0E 1E, 05, 05] -1F4F8; [0D 0C D1, 05, 05] +1F521; [0D 0E 25, 05, 05] -1F4F9; [0D 0C D8, 05, 05] +1F522; [0D 0E 2C, 05, 05] -1F4FA; [0D 0C DF, 05, 05] +1F523; [0D 0E 33, 05, 05] -1F4FB; [0D 0C E6, 05, 05] +1F524; [0D 0E 3A, 05, 05] -1F4FC; [0D 0C ED, 05, 05] +1F525; [0D 0E 41, 05, 05] -1F4FD; [0D 0C F4, 05, 05] +1F526; [0D 0E 48, 05, 05] -1F4FE; [0D 0C FB, 05, 05] +1F527; [0D 0E 4F, 05, 05] -1F4FF; [0D 0D 04, 05, 05] +1F528; [0D 0E 56, 05, 05] -1F500; [0D 0D 0B, 05, 05] +1F529; [0D 0E 5D, 05, 05] -1F501; [0D 0D 12, 05, 05] +1F52A; [0D 0E 64, 05, 05] -1F502; [0D 0D 19, 05, 05] +1F52B; [0D 0E 6B, 05, 05] -1F503; [0D 0D 20, 05, 05] +1F52C; [0D 0E 72, 05, 05] -1F504; [0D 0D 27, 05, 05] +1F52D; [0D 0E 79, 05, 05] -1F505; [0D 0D 2E, 05, 05] +1F52E; [0D 0E 80, 05, 05] -1F506; [0D 0D 35, 05, 05] +1F52F; [0D 0E 87, 05, 05] -1F507; [0D 0D 3C, 05, 05] +1F530; [0D 0E 8E, 05, 05] -1F508; [0D 0D 43, 05, 05] +1F531; [0D 0E 95, 05, 05] -1F509; [0D 0D 4A, 05, 05] +1F532; [0D 0E 9C, 05, 05] -1F50A; [0D 0D 51, 05, 05] +1F533; [0D 0E A3, 05, 05] -1F50B; [0D 0D 58, 05, 05] +1F534; [0D 0E AA, 05, 05] -1F50C; [0D 0D 5F, 05, 05] +1F535; [0D 0E B1, 05, 05] -1F50D; [0D 0D 66, 05, 05] +1F536; [0D 0E B8, 05, 05] -1F50E; [0D 0D 6D, 05, 05] +1F537; [0D 0E BF, 05, 05] -1F50F; [0D 0D 74, 05, 05] +1F538; [0D 0E C6, 05, 05] -1F510; [0D 0D 7B, 05, 05] +1F539; [0D 0E CD, 05, 05] -1F511; [0D 0D 82, 05, 05] +1F53A; [0D 0E D4, 05, 05] -1F512; [0D 0D 89, 05, 05] +1F53B; [0D 0E DB, 05, 05] -1F513; [0D 0D 90, 05, 05] +1F53C; [0D 0E E2, 05, 05] -1F514; [0D 0D 97, 05, 05] +1F53D; [0D 0E E9, 05, 05] -1F515; [0D 0D 9E, 05, 05] +1F53E; [0D 0E F0, 05, 05] -1F516; [0D 0D A5, 05, 05] +1F53F; [0D 0E F7, 05, 05] -1F517; [0D 0D AC, 05, 05] +1F540; [0D 0E FE, 05, 05] -1F518; [0D 0D B3, 05, 05] +1F541; [0D 0F 07, 05, 05] -1F519; [0D 0D BA, 05, 05] +1F542; [0D 0F 0E, 05, 05] -1F51A; [0D 0D C1, 05, 05] +1F543; [0D 0F 15, 05, 05] -1F51B; [0D 0D C8, 05, 05] +1F544; [0D 0F 1C, 05, 05] -1F51C; [0D 0D CF, 05, 05] +1F545; [0D 0F 23, 05, 05] -1F51D; [0D 0D D6, 05, 05] +1F546; [0D 0F 2A, 05, 05] -1F51E; [0D 0D DD, 05, 05] +1F547; [0D 0F 31, 05, 05] -1F51F; [0D 0D E4, 05, 05] +1F548; [0D 0F 38, 05, 05] -1F520; [0D 0D EB, 05, 05] +1F549; [0D 0F 3F, 05, 05] -1F521; [0D 0D F2, 05, 05] +1F54A; [0D 0F 46, 05, 05] -1F522; [0D 0D F9, 05, 05] +1F54B; [0D 0F 4D, 05, 05] -1F523; [0D 0E 02, 05, 05] +1F54C; [0D 0F 54, 05, 05] -1F524; [0D 0E 09, 05, 05] +1F54D; [0D 0F 5B, 05, 05] -1F525; [0D 0E 10, 05, 05] +1F54E; [0D 0F 62, 05, 05] -1F526; [0D 0E 17, 05, 05] +1F54F; [0D 0F 69, 05, 05] -1F527; [0D 0E 1E, 05, 05] +1F550; [0D 0F 70, 05, 05] -1F528; [0D 0E 25, 05, 05] +1F551; [0D 0F 77, 05, 05] -1F529; [0D 0E 2C, 05, 05] +1F552; [0D 0F 7E, 05, 05] -1F52A; [0D 0E 33, 05, 05] +1F553; [0D 0F 85, 05, 05] -1F52B; [0D 0E 3A, 05, 05] +1F554; [0D 0F 8C, 05, 05] -1F52C; [0D 0E 41, 05, 05] +1F555; [0D 0F 93, 05, 05] -1F52D; [0D 0E 48, 05, 05] +1F556; [0D 0F 9A, 05, 05] -1F52E; [0D 0E 4F, 05, 05] +1F557; [0D 0F A1, 05, 05] -1F52F; [0D 0E 56, 05, 05] +1F558; [0D 0F A8, 05, 05] -1F530; [0D 0E 5D, 05, 05] +1F559; [0D 0F AF, 05, 05] -1F531; [0D 0E 64, 05, 05] +1F55A; [0D 0F B6, 05, 05] -1F532; [0D 0E 6B, 05, 05] +1F55B; [0D 0F BD, 05, 05] -1F533; [0D 0E 72, 05, 05] +1F55C; [0D 0F C4, 05, 05] -1F534; [0D 0E 79, 05, 05] +1F55D; [0D 0F CB, 05, 05] -1F535; [0D 0E 80, 05, 05] +1F55E; [0D 0F D2, 05, 05] -1F536; [0D 0E 87, 05, 05] +1F55F; [0D 0F D9, 05, 05] -1F537; [0D 0E 8E, 05, 05] +1F560; [0D 0F E0, 05, 05] -1F538; [0D 0E 95, 05, 05] +1F561; [0D 0F E7, 05, 05] -1F539; [0D 0E 9C, 05, 05] +1F562; [0D 0F EE, 05, 05] -1F53A; [0D 0E A3, 05, 05] +1F563; [0D 0F F5, 05, 05] -1F53B; [0D 0E AA, 05, 05] +1F564; [0D 0F FC, 05, 05] -1F53C; [0D 0E B1, 05, 05] +1F565; [0D 10 05, 05, 05] -1F53D; [0D 0E B8, 05, 05] +1F566; [0D 10 0C, 05, 05] -1F53E; [0D 0E BF, 05, 05] +1F567; [0D 10 13, 05, 05] -1F53F; [0D 0E C6, 05, 05] +1F568; [0D 10 1A, 05, 05] -1F540; [0D 0E CD, 05, 05] +1F569; [0D 10 21, 05, 05] -1F541; [0D 0E D4, 05, 05] +1F56A; [0D 10 28, 05, 05] -1F542; [0D 0E DB, 05, 05] +1F56B; [0D 10 2F, 05, 05] -1F543; [0D 0E E2, 05, 05] +1F56C; [0D 10 36, 05, 05] -1F544; [0D 0E E9, 05, 05] +1F56D; [0D 10 3D, 05, 05] -1F545; [0D 0E F0, 05, 05] +1F56E; [0D 10 44, 05, 05] -1F546; [0D 0E F7, 05, 05] +1F56F; [0D 10 4B, 05, 05] -1F547; [0D 0E FE, 05, 05] +1F570; [0D 10 52, 05, 05] -1F548; [0D 0F 07, 05, 05] +1F571; [0D 10 59, 05, 05] -1F549; [0D 0F 0E, 05, 05] +1F572; [0D 10 60, 05, 05] -1F54A; [0D 0F 15, 05, 05] +1F573; [0D 10 67, 05, 05] -1F54B; [0D 0F 1C, 05, 05] +1F574; [0D 10 6E, 05, 05] -1F54C; [0D 0F 23, 05, 05] +1F575; [0D 10 75, 05, 05] -1F54D; [0D 0F 2A, 05, 05] +1F576; [0D 10 7C, 05, 05] -1F54E; [0D 0F 31, 05, 05] +1F577; [0D 10 83, 05, 05] -1F54F; [0D 0F 38, 05, 05] +1F578; [0D 10 8A, 05, 05] -1F550; [0D 0F 3F, 05, 05] +1F579; [0D 10 91, 05, 05] -1F551; [0D 0F 46, 05, 05] +1F57A; [0D 10 98, 05, 05] -1F552; [0D 0F 4D, 05, 05] +1F57B; [0D 10 9F, 05, 05] -1F553; [0D 0F 54, 05, 05] +1F57C; [0D 10 A6, 05, 05] -1F554; [0D 0F 5B, 05, 05] +1F57D; [0D 10 AD, 05, 05] -1F555; [0D 0F 62, 05, 05] +1F57E; [0D 10 B4, 05, 05] -1F556; [0D 0F 69, 05, 05] +1F57F; [0D 10 BB, 05, 05] -1F557; [0D 0F 70, 05, 05] +1F580; [0D 10 C2, 05, 05] -1F558; [0D 0F 77, 05, 05] +1F581; [0D 10 C9, 05, 05] -1F559; [0D 0F 7E, 05, 05] +1F582; [0D 10 D0, 05, 05] -1F55A; [0D 0F 85, 05, 05] +1F583; [0D 10 D7, 05, 05] -1F55B; [0D 0F 8C, 05, 05] +1F584; [0D 10 DE, 05, 05] -1F55C; [0D 0F 93, 05, 05] +1F585; [0D 10 E5, 05, 05] -1F55D; [0D 0F 9A, 05, 05] +1F586; [0D 10 EC, 05, 05] -1F55E; [0D 0F A1, 05, 05] +1F587; [0D 10 F3, 05, 05] -1F55F; [0D 0F A8, 05, 05] +1F588; [0D 10 FA, 05, 05] -1F560; [0D 0F AF, 05, 05] +1F589; [0D 11 03, 05, 05] -1F561; [0D 0F B6, 05, 05] +1F58A; [0D 11 0A, 05, 05] -1F562; [0D 0F BD, 05, 05] +1F58B; [0D 11 11, 05, 05] -1F563; [0D 0F C4, 05, 05] +1F58C; [0D 11 18, 05, 05] -1F564; [0D 0F CB, 05, 05] +1F58D; [0D 11 1F, 05, 05] -1F565; [0D 0F D2, 05, 05] +1F58E; [0D 11 26, 05, 05] -1F566; [0D 0F D9, 05, 05] +1F58F; [0D 11 2D, 05, 05] -1F567; [0D 0F E0, 05, 05] +1F590; [0D 11 34, 05, 05] -1F568; [0D 0F E7, 05, 05] +1F591; [0D 11 3B, 05, 05] -1F569; [0D 0F EE, 05, 05] +1F592; [0D 11 42, 05, 05] -1F56A; [0D 0F F5, 05, 05] +1F593; [0D 11 49, 05, 05] -1F56B; [0D 0F FC, 05, 05] +1F594; [0D 11 50, 05, 05] -1F56C; [0D 10 05, 05, 05] +1F595; [0D 11 57, 05, 05] -1F56D; [0D 10 0C, 05, 05] +1F596; [0D 11 5E, 05, 05] -1F56E; [0D 10 13, 05, 05] +1F597; [0D 11 65, 05, 05] -1F56F; [0D 10 1A, 05, 05] +1F598; [0D 11 6C, 05, 05] -1F570; [0D 10 21, 05, 05] +1F599; [0D 11 73, 05, 05] -1F571; [0D 10 28, 05, 05] +1F59A; [0D 11 7A, 05, 05] -1F572; [0D 10 2F, 05, 05] +1F59B; [0D 11 81, 05, 05] -1F573; [0D 10 36, 05, 05] +1F59C; [0D 11 88, 05, 05] -1F574; [0D 10 3D, 05, 05] +1F59D; [0D 11 8F, 05, 05] -1F575; [0D 10 44, 05, 05] +1F59E; [0D 11 96, 05, 05] -1F576; [0D 10 4B, 05, 05] +1F59F; [0D 11 9D, 05, 05] -1F577; [0D 10 52, 05, 05] +1F5A0; [0D 11 A4, 05, 05] -1F578; [0D 10 59, 05, 05] +1F5A1; [0D 11 AB, 05, 05] -1F579; [0D 10 60, 05, 05] +1F5A2; [0D 11 B2, 05, 05] -1F57A; [0D 10 67, 05, 05] +1F5A3; [0D 11 B9, 05, 05] -1F57B; [0D 10 6E, 05, 05] +1F5A4; [0D 11 C0, 05, 05] -1F57C; [0D 10 75, 05, 05] +1F5A5; [0D 11 C7, 05, 05] -1F57D; [0D 10 7C, 05, 05] +1F5A6; [0D 11 CE, 05, 05] -1F57E; [0D 10 83, 05, 05] +1F5A7; [0D 11 D5, 05, 05] -1F57F; [0D 10 8A, 05, 05] +1F5A8; [0D 11 DC, 05, 05] -1F580; [0D 10 91, 05, 05] +1F5A9; [0D 11 E3, 05, 05] -1F581; [0D 10 98, 05, 05] +1F5AA; [0D 11 EA, 05, 05] -1F582; [0D 10 9F, 05, 05] +1F5AB; [0D 11 F1, 05, 05] -1F583; [0D 10 A6, 05, 05] +1F5AC; [0D 11 F8, 05, 05] -1F584; [0D 10 AD, 05, 05] +1F5AD; [0D 11 FF, 05, 05] -1F585; [0D 10 B4, 05, 05] +1F5AE; [0D 12 08, 05, 05] -1F586; [0D 10 BB, 05, 05] +1F5AF; [0D 12 0F, 05, 05] -1F587; [0D 10 C2, 05, 05] +1F5B0; [0D 12 16, 05, 05] -1F588; [0D 10 C9, 05, 05] +1F5B1; [0D 12 1D, 05, 05] -1F589; [0D 10 D0, 05, 05] +1F5B2; [0D 12 24, 05, 05] -1F58A; [0D 10 D7, 05, 05] +1F5B3; [0D 12 2B, 05, 05] -1F58B; [0D 10 DE, 05, 05] +1F5B4; [0D 12 32, 05, 05] -1F58C; [0D 10 E5, 05, 05] +1F5B5; [0D 12 39, 05, 05] -1F58D; [0D 10 EC, 05, 05] +1F5B6; [0D 12 40, 05, 05] -1F58E; [0D 10 F3, 05, 05] +1F5B7; [0D 12 47, 05, 05] -1F58F; [0D 10 FA, 05, 05] +1F5B8; [0D 12 4E, 05, 05] -1F590; [0D 11 03, 05, 05] +1F5B9; [0D 12 55, 05, 05] -1F591; [0D 11 0A, 05, 05] +1F5BA; [0D 12 5C, 05, 05] -1F592; [0D 11 11, 05, 05] +1F5BB; [0D 12 63, 05, 05] -1F593; [0D 11 18, 05, 05] +1F5BC; [0D 12 6A, 05, 05] -1F594; [0D 11 1F, 05, 05] +1F5BD; [0D 12 71, 05, 05] -1F595; [0D 11 26, 05, 05] +1F5BE; [0D 12 78, 05, 05] -1F596; [0D 11 2D, 05, 05] +1F5BF; [0D 12 7F, 05, 05] -1F597; [0D 11 34, 05, 05] +1F5C0; [0D 12 86, 05, 05] -1F598; [0D 11 3B, 05, 05] +1F5C1; [0D 12 8D, 05, 05] -1F599; [0D 11 42, 05, 05] +1F5C2; [0D 12 94, 05, 05] -1F59A; [0D 11 49, 05, 05] +1F5C3; [0D 12 9B, 05, 05] -1F59B; [0D 11 50, 05, 05] +1F5C4; [0D 12 A2, 05, 05] -1F59C; [0D 11 57, 05, 05] +1F5C5; [0D 12 A9, 05, 05] -1F59D; [0D 11 5E, 05, 05] +1F5C6; [0D 12 B0, 05, 05] -1F59E; [0D 11 65, 05, 05] +1F5C7; [0D 12 B7, 05, 05] -1F59F; [0D 11 6C, 05, 05] +1F5C8; [0D 12 BE, 05, 05] -1F5A0; [0D 11 73, 05, 05] +1F5C9; [0D 12 C5, 05, 05] -1F5A1; [0D 11 7A, 05, 05] +1F5CA; [0D 12 CC, 05, 05] -1F5A2; [0D 11 81, 05, 05] +1F5CB; [0D 12 D3, 05, 05] -1F5A3; [0D 11 88, 05, 05] +1F5CC; [0D 12 DA, 05, 05] -1F5A4; [0D 11 8F, 05, 05] +1F5CD; [0D 12 E1, 05, 05] -1F5A5; [0D 11 96, 05, 05] +1F5CE; [0D 12 E8, 05, 05] -1F5A6; [0D 11 9D, 05, 05] +1F5CF; [0D 12 EF, 05, 05] -1F5A7; [0D 11 A4, 05, 05] +1F5D0; [0D 12 F6, 05, 05] -1F5A8; [0D 11 AB, 05, 05] +1F5D1; [0D 12 FD, 05, 05] -1F5A9; [0D 11 B2, 05, 05] +1F5D2; [0D 13 06, 05, 05] -1F5AA; [0D 11 B9, 05, 05] +1F5D3; [0D 13 0D, 05, 05] -1F5AB; [0D 11 C0, 05, 05] +1F5D4; [0D 13 14, 05, 05] -1F5AC; [0D 11 C7, 05, 05] +1F5D5; [0D 13 1B, 05, 05] -1F5AD; [0D 11 CE, 05, 05] +1F5D6; [0D 13 22, 05, 05] -1F5AE; [0D 11 D5, 05, 05] +1F5D7; [0D 13 29, 05, 05] -1F5AF; [0D 11 DC, 05, 05] +1F5D8; [0D 13 30, 05, 05] -1F5B0; [0D 11 E3, 05, 05] +1F5D9; [0D 13 37, 05, 05] -1F5B1; [0D 11 EA, 05, 05] +1F5DA; [0D 13 3E, 05, 05] -1F5B2; [0D 11 F1, 05, 05] +1F5DB; [0D 13 45, 05, 05] -1F5B3; [0D 11 F8, 05, 05] +1F5DC; [0D 13 4C, 05, 05] -1F5B4; [0D 11 FF, 05, 05] +1F5DD; [0D 13 53, 05, 05] -1F5B5; [0D 12 08, 05, 05] +1F5DE; [0D 13 5A, 05, 05] -1F5B6; [0D 12 0F, 05, 05] +1F5DF; [0D 13 61, 05, 05] -1F5B7; [0D 12 16, 05, 05] +1F5E0; [0D 13 68, 05, 05] -1F5B8; [0D 12 1D, 05, 05] +1F5E1; [0D 13 6F, 05, 05] -1F5B9; [0D 12 24, 05, 05] +1F5E2; [0D 13 76, 05, 05] -1F5BA; [0D 12 2B, 05, 05] +1F5E3; [0D 13 7D, 05, 05] -1F5BB; [0D 12 32, 05, 05] +1F5E4; [0D 13 84, 05, 05] -1F5BC; [0D 12 39, 05, 05] +1F5E5; [0D 13 8B, 05, 05] -1F5BD; [0D 12 40, 05, 05] +1F5E6; [0D 13 92, 05, 05] -1F5BE; [0D 12 47, 05, 05] +1F5E7; [0D 13 99, 05, 05] -1F5BF; [0D 12 4E, 05, 05] +1F5E8; [0D 13 A0, 05, 05] -1F5C0; [0D 12 55, 05, 05] +1F5E9; [0D 13 A7, 05, 05] -1F5C1; [0D 12 5C, 05, 05] +1F5EA; [0D 13 AE, 05, 05] -1F5C2; [0D 12 63, 05, 05] +1F5EB; [0D 13 B5, 05, 05] -1F5C3; [0D 12 6A, 05, 05] +1F5EC; [0D 13 BC, 05, 05] -1F5C4; [0D 12 71, 05, 05] +1F5ED; [0D 13 C3, 05, 05] -1F5C5; [0D 12 78, 05, 05] +1F5EE; [0D 13 CA, 05, 05] -1F5C6; [0D 12 7F, 05, 05] +1F5EF; [0D 13 D1, 05, 05] -1F5C7; [0D 12 86, 05, 05] +1F5F0; [0D 13 D8, 05, 05] -1F5C8; [0D 12 8D, 05, 05] +1F5F1; [0D 13 DF, 05, 05] -1F5C9; [0D 12 94, 05, 05] +1F5F2; [0D 13 E6, 05, 05] -1F5CA; [0D 12 9B, 05, 05] +1F5F3; [0D 13 ED, 05, 05] -1F5CB; [0D 12 A2, 05, 05] +1F5F4; [0D 13 F4, 05, 05] -1F5CC; [0D 12 A9, 05, 05] +1F5F5; [0D 13 FB, 05, 05] -1F5CD; [0D 12 B0, 05, 05] +1F5F6; [0D 14 04, 05, 05] -1F5CE; [0D 12 B7, 05, 05] +1F5F7; [0D 14 0B, 05, 05] -1F5CF; [0D 12 BE, 05, 05] +1F5F8; [0D 14 12, 05, 05] -1F5D0; [0D 12 C5, 05, 05] +1F5F9; [0D 14 19, 05, 05] -1F5D1; [0D 12 CC, 05, 05] +1F5FA; [0D 14 20, 05, 05] -1F5D2; [0D 12 D3, 05, 05] +1F5FB; [0D 14 27, 05, 05] -1F5D3; [0D 12 DA, 05, 05] +1F5FC; [0D 14 2E, 05, 05] -1F5D4; [0D 12 E1, 05, 05] +1F5FD; [0D 14 35, 05, 05] -1F5D5; [0D 12 E8, 05, 05] +1F5FE; [0D 14 3C, 05, 05] -1F5D6; [0D 12 EF, 05, 05] +1F5FF; [0D 14 43, 05, 05] -1F5D7; [0D 12 F6, 05, 05] +1F900; [0D 14 4A, 05, 05] -1F5D8; [0D 12 FD, 05, 05] +1F901; [0D 14 51, 05, 05] -1F5D9; [0D 13 06, 05, 05] +1F902; [0D 14 58, 05, 05] -1F5DA; [0D 13 0D, 05, 05] +1F903; [0D 14 5F, 05, 05] -1F5DB; [0D 13 14, 05, 05] +1F904; [0D 14 66, 05, 05] -1F5DC; [0D 13 1B, 05, 05] +1F905; [0D 14 6D, 05, 05] -1F5DD; [0D 13 22, 05, 05] +1F906; [0D 14 74, 05, 05] -1F5DE; [0D 13 29, 05, 05] +1F907; [0D 14 7B, 05, 05] -1F5DF; [0D 13 30, 05, 05] +1F908; [0D 14 82, 05, 05] -1F5E0; [0D 13 37, 05, 05] +1F909; [0D 14 89, 05, 05] -1F5E1; [0D 13 3E, 05, 05] +1F90A; [0D 14 90, 05, 05] -1F5E2; [0D 13 45, 05, 05] +1F90B; [0D 14 97, 05, 05] -1F5E3; [0D 13 4C, 05, 05] +1F910; [0D 14 9E, 05, 05] -1F5E4; [0D 13 53, 05, 05] +1F911; [0D 14 A5, 05, 05] -1F5E5; [0D 13 5A, 05, 05] +1F912; [0D 14 AC, 05, 05] -1F5E6; [0D 13 61, 05, 05] +1F913; [0D 14 B3, 05, 05] -1F5E7; [0D 13 68, 05, 05] +1F914; [0D 14 BA, 05, 05] -1F5E8; [0D 13 6F, 05, 05] +1F915; [0D 14 C1, 05, 05] -1F5E9; [0D 13 76, 05, 05] +1F916; [0D 14 C8, 05, 05] -1F5EA; [0D 13 7D, 05, 05] +1F917; [0D 14 CF, 05, 05] -1F5EB; [0D 13 84, 05, 05] +1F918; [0D 14 D6, 05, 05] -1F5EC; [0D 13 8B, 05, 05] +1F919; [0D 14 DD, 05, 05] -1F5ED; [0D 13 92, 05, 05] +1F91A; [0D 14 E4, 05, 05] -1F5EE; [0D 13 99, 05, 05] +1F91B; [0D 14 EB, 05, 05] -1F5EF; [0D 13 A0, 05, 05] +1F91C; [0D 14 F2, 05, 05] -1F5F0; [0D 13 A7, 05, 05] +1F91D; [0D 14 F9, 05, 05] -1F5F1; [0D 13 AE, 05, 05] +1F91E; [0D 15 02, 05, 05] -1F5F2; [0D 13 B5, 05, 05] +1F91F; [0D 15 09, 05, 05] -1F5F3; [0D 13 BC, 05, 05] +1F920; [0D 15 10, 05, 05] -1F5F4; [0D 13 C3, 05, 05] +1F921; [0D 15 17, 05, 05] -1F5F5; [0D 13 CA, 05, 05] +1F922; [0D 15 1E, 05, 05] -1F5F6; [0D 13 D1, 05, 05] +1F923; [0D 15 25, 05, 05] -1F5F7; [0D 13 D8, 05, 05] +1F924; [0D 15 2C, 05, 05] -1F5F8; [0D 13 DF, 05, 05] +1F925; [0D 15 33, 05, 05] -1F5F9; [0D 13 E6, 05, 05] +1F926; [0D 15 3A, 05, 05] -1F5FA; [0D 13 ED, 05, 05] +1F927; [0D 15 41, 05, 05] -1F5FB; [0D 13 F4, 05, 05] +1F928; [0D 15 48, 05, 05] -1F5FC; [0D 13 FB, 05, 05] +1F929; [0D 15 4F, 05, 05] -1F5FD; [0D 14 04, 05, 05] +1F92A; [0D 15 56, 05, 05] -1F5FE; [0D 14 0B, 05, 05] +1F92B; [0D 15 5D, 05, 05] -1F5FF; [0D 14 12, 05, 05] +1F92C; [0D 15 64, 05, 05] -1F910; [0D 14 19, 05, 05] +1F92D; [0D 15 6B, 05, 05] -1F911; [0D 14 20, 05, 05] +1F92E; [0D 15 72, 05, 05] -1F912; [0D 14 27, 05, 05] +1F92F; [0D 15 79, 05, 05] -1F913; [0D 14 2E, 05, 05] +1F930; [0D 15 80, 05, 05] -1F914; [0D 14 35, 05, 05] +1F931; [0D 15 87, 05, 05] -1F915; [0D 14 3C, 05, 05] +1F932; [0D 15 8E, 05, 05] -1F916; [0D 14 43, 05, 05] +1F933; [0D 15 95, 05, 05] -1F917; [0D 14 4A, 05, 05] +1F934; [0D 15 9C, 05, 05] -1F918; [0D 14 51, 05, 05] +1F935; [0D 15 A3, 05, 05] -1F919; [0D 14 58, 05, 05] +1F936; [0D 15 AA, 05, 05] -1F91A; [0D 14 5F, 05, 05] +1F937; [0D 15 B1, 05, 05] -1F91B; [0D 14 66, 05, 05] +1F938; [0D 15 B8, 05, 05] -1F91C; [0D 14 6D, 05, 05] +1F939; [0D 15 BF, 05, 05] -1F91D; [0D 14 74, 05, 05] +1F93A; [0D 15 C6, 05, 05] -1F91E; [0D 14 7B, 05, 05] +1F93B; [0D 15 CD, 05, 05] -1F920; [0D 14 82, 05, 05] +1F93C; [0D 15 D4, 05, 05] -1F921; [0D 14 89, 05, 05] +1F93D; [0D 15 DB, 05, 05] -1F922; [0D 14 90, 05, 05] +1F93E; [0D 15 E2, 05, 05] -1F923; [0D 14 97, 05, 05] +1F940; [0D 15 E9, 05, 05] -1F924; [0D 14 9E, 05, 05] +1F941; [0D 15 F0, 05, 05] -1F925; [0D 14 A5, 05, 05] +1F942; [0D 15 F7, 05, 05] -1F926; [0D 14 AC, 05, 05] +1F943; [0D 15 FE, 05, 05] -1F927; [0D 14 B3, 05, 05] +1F944; [0D 16 07, 05, 05] -1F930; [0D 14 BA, 05, 05] +1F945; [0D 16 0E, 05, 05] -1F933; [0D 14 C1, 05, 05] +1F946; [0D 16 15, 05, 05] -1F934; [0D 14 C8, 05, 05] +1F947; [0D 16 1C, 05, 05] -1F935; [0D 14 CF, 05, 05] +1F948; [0D 16 23, 05, 05] -1F936; [0D 14 D6, 05, 05] +1F949; [0D 16 2A, 05, 05] -1F937; [0D 14 DD, 05, 05] +1F94A; [0D 16 31, 05, 05] -1F938; [0D 14 E4, 05, 05] +1F94B; [0D 16 38, 05, 05] -1F939; [0D 14 EB, 05, 05] +1F94C; [0D 16 3F, 05, 05] -1F93A; [0D 14 F2, 05, 05] +1F950; [0D 16 46, 05, 05] -1F93B; [0D 14 F9, 05, 05] +1F951; [0D 16 4D, 05, 05] -1F93C; [0D 15 02, 05, 05] +1F952; [0D 16 54, 05, 05] -1F93D; [0D 15 09, 05, 05] +1F953; [0D 16 5B, 05, 05] -1F93E; [0D 15 10, 05, 05] +1F954; [0D 16 62, 05, 05] -1F940; [0D 15 17, 05, 05] +1F955; [0D 16 69, 05, 05] -1F941; [0D 15 1E, 05, 05] +1F956; [0D 16 70, 05, 05] -1F942; [0D 15 25, 05, 05] +1F957; [0D 16 77, 05, 05] -1F943; [0D 15 2C, 05, 05] +1F958; [0D 16 7E, 05, 05] -1F944; [0D 15 33, 05, 05] +1F959; [0D 16 85, 05, 05] -1F945; [0D 15 3A, 05, 05] +1F95A; [0D 16 8C, 05, 05] -1F946; [0D 15 41, 05, 05] +1F95B; [0D 16 93, 05, 05] -1F947; [0D 15 48, 05, 05] +1F95C; [0D 16 9A, 05, 05] -1F948; [0D 15 4F, 05, 05] +1F95D; [0D 16 A1, 05, 05] -1F949; [0D 15 56, 05, 05] +1F95E; [0D 16 A8, 05, 05] -1F94A; [0D 15 5D, 05, 05] +1F95F; [0D 16 AF, 05, 05] -1F94B; [0D 15 64, 05, 05] +1F960; [0D 16 B6, 05, 05] -1F950; [0D 15 6B, 05, 05] +1F961; [0D 16 BD, 05, 05] -1F951; [0D 15 72, 05, 05] +1F962; [0D 16 C4, 05, 05] -1F952; [0D 15 79, 05, 05] +1F963; [0D 16 CB, 05, 05] -1F953; [0D 15 80, 05, 05] +1F964; [0D 16 D2, 05, 05] -1F954; [0D 15 87, 05, 05] +1F965; [0D 16 D9, 05, 05] -1F955; [0D 15 8E, 05, 05] +1F966; [0D 16 E0, 05, 05] -1F956; [0D 15 95, 05, 05] +1F967; [0D 16 E7, 05, 05] -1F957; [0D 15 9C, 05, 05] +1F968; [0D 16 EE, 05, 05] -1F958; [0D 15 A3, 05, 05] +1F969; [0D 16 F5, 05, 05] -1F959; [0D 15 AA, 05, 05] +1F96A; [0D 16 FC, 05, 05] -1F95A; [0D 15 B1, 05, 05] +1F96B; [0D 17 05, 05, 05] -1F95B; [0D 15 B8, 05, 05] +1F980; [0D 17 0C, 05, 05] -1F95C; [0D 15 BF, 05, 05] +1F981; [0D 17 13, 05, 05] -1F95D; [0D 15 C6, 05, 05] +1F982; [0D 17 1A, 05, 05] -1F95E; [0D 15 CD, 05, 05] +1F983; [0D 17 21, 05, 05] -1F980; [0D 15 D4, 05, 05] +1F984; [0D 17 28, 05, 05] -1F981; [0D 15 DB, 05, 05] +1F985; [0D 17 2F, 05, 05] -1F982; [0D 15 E2, 05, 05] +1F986; [0D 17 36, 05, 05] -1F983; [0D 15 E9, 05, 05] +1F987; [0D 17 3D, 05, 05] -1F984; [0D 15 F0, 05, 05] +1F988; [0D 17 44, 05, 05] -1F985; [0D 15 F7, 05, 05] +1F989; [0D 17 4B, 05, 05] -1F986; [0D 15 FE, 05, 05] +1F98A; [0D 17 52, 05, 05] -1F987; [0D 16 07, 05, 05] +1F98B; [0D 17 59, 05, 05] -1F988; [0D 16 0E, 05, 05] +1F98C; [0D 17 60, 05, 05] -1F989; [0D 16 15, 05, 05] +1F98D; [0D 17 67, 05, 05] -1F98A; [0D 16 1C, 05, 05] +1F98E; [0D 17 6E, 05, 05] -1F98B; [0D 16 23, 05, 05] +1F98F; [0D 17 75, 05, 05] -1F98C; [0D 16 2A, 05, 05] +1F990; [0D 17 7C, 05, 05] -1F98D; [0D 16 31, 05, 05] +1F991; [0D 17 83, 05, 05] -1F98E; [0D 16 38, 05, 05] +1F992; [0D 17 8A, 05, 05] -1F98F; [0D 16 3F, 05, 05] +1F993; [0D 17 91, 05, 05] -1F990; [0D 16 46, 05, 05] +1F994; [0D 17 98, 05, 05] -1F991; [0D 16 4D, 05, 05] +1F995; [0D 17 9F, 05, 05] -1F9C0; [0D 16 54, 05, 05] +1F996; [0D 17 A6, 05, 05] -1F600; [0D 16 5B, 05, 05] +1F997; [0D 17 AD, 05, 05] -1F601; [0D 16 62, 05, 05] +1F9C0; [0D 17 B4, 05, 05] -1F602; [0D 16 69, 05, 05] +1F9D0; [0D 17 BB, 05, 05] -1F603; [0D 16 70, 05, 05] +1F9D1; [0D 17 C2, 05, 05] -1F604; [0D 16 77, 05, 05] +1F9D2; [0D 17 C9, 05, 05] -1F605; [0D 16 7E, 05, 05] +1F9D3; [0D 17 D0, 05, 05] -1F606; [0D 16 85, 05, 05] +1F9D4; [0D 17 D7, 05, 05] -1F607; [0D 16 8C, 05, 05] +1F9D5; [0D 17 DE, 05, 05] -1F608; [0D 16 93, 05, 05] +1F9D6; [0D 17 E5, 05, 05] -1F609; [0D 16 9A, 05, 05] +1F9D7; [0D 17 EC, 05, 05] -1F60A; [0D 16 A1, 05, 05] +1F9D8; [0D 17 F3, 05, 05] -1F60B; [0D 16 A8, 05, 05] +1F9D9; [0D 17 FA, 05, 05] -1F60C; [0D 16 AF, 05, 05] +1F9DA; [0D 18 03, 05, 05] -1F60D; [0D 16 B6, 05, 05] +1F9DB; [0D 18 0A, 05, 05] -1F60E; [0D 16 BD, 05, 05] +1F9DC; [0D 18 11, 05, 05] -1F60F; [0D 16 C4, 05, 05] +1F9DD; [0D 18 18, 05, 05] -1F610; [0D 16 CB, 05, 05] +1F9DE; [0D 18 1F, 05, 05] -1F611; [0D 16 D2, 05, 05] +1F9DF; [0D 18 26, 05, 05] -1F612; [0D 16 D9, 05, 05] +1F9E0; [0D 18 2D, 05, 05] -1F613; [0D 16 E0, 05, 05] +1F9E1; [0D 18 34, 05, 05] -1F614; [0D 16 E7, 05, 05] +1F9E2; [0D 18 3B, 05, 05] -1F615; [0D 16 EE, 05, 05] +1F9E3; [0D 18 42, 05, 05] -1F616; [0D 16 F5, 05, 05] +1F9E4; [0D 18 49, 05, 05] -1F617; [0D 16 FC, 05, 05] +1F9E5; [0D 18 50, 05, 05] -1F618; [0D 17 05, 05, 05] +1F9E6; [0D 18 57, 05, 05] -1F619; [0D 17 0C, 05, 05] +1F600; [0D 18 5E, 05, 05] -1F61A; [0D 17 13, 05, 05] +1F601; [0D 18 65, 05, 05] -1F61B; [0D 17 1A, 05, 05] +1F602; [0D 18 6C, 05, 05] -1F61C; [0D 17 21, 05, 05] +1F603; [0D 18 73, 05, 05] -1F61D; [0D 17 28, 05, 05] +1F604; [0D 18 7A, 05, 05] -1F61E; [0D 17 2F, 05, 05] +1F605; [0D 18 81, 05, 05] -1F61F; [0D 17 36, 05, 05] +1F606; [0D 18 88, 05, 05] -1F620; [0D 17 3D, 05, 05] +1F607; [0D 18 8F, 05, 05] -1F621; [0D 17 44, 05, 05] +1F608; [0D 18 96, 05, 05] -1F622; [0D 17 4B, 05, 05] +1F609; [0D 18 9D, 05, 05] -1F623; [0D 17 52, 05, 05] +1F60A; [0D 18 A4, 05, 05] -1F624; [0D 17 59, 05, 05] +1F60B; [0D 18 AB, 05, 05] -1F625; [0D 17 60, 05, 05] +1F60C; [0D 18 B2, 05, 05] -1F626; [0D 17 67, 05, 05] +1F60D; [0D 18 B9, 05, 05] -1F627; [0D 17 6E, 05, 05] +1F60E; [0D 18 C0, 05, 05] -1F628; [0D 17 75, 05, 05] +1F60F; [0D 18 C7, 05, 05] -1F629; [0D 17 7C, 05, 05] +1F610; [0D 18 CE, 05, 05] -1F62A; [0D 17 83, 05, 05] +1F611; [0D 18 D5, 05, 05] -1F62B; [0D 17 8A, 05, 05] +1F612; [0D 18 DC, 05, 05] -1F62C; [0D 17 91, 05, 05] +1F613; [0D 18 E3, 05, 05] -1F62D; [0D 17 98, 05, 05] +1F614; [0D 18 EA, 05, 05] -1F62E; [0D 17 9F, 05, 05] +1F615; [0D 18 F1, 05, 05] -1F62F; [0D 17 A6, 05, 05] +1F616; [0D 18 F8, 05, 05] -1F630; [0D 17 AD, 05, 05] +1F617; [0D 18 FF, 05, 05] -1F631; [0D 17 B4, 05, 05] +1F618; [0D 19 08, 05, 05] -1F632; [0D 17 BB, 05, 05] +1F619; [0D 19 0F, 05, 05] -1F633; [0D 17 C2, 05, 05] +1F61A; [0D 19 16, 05, 05] -1F634; [0D 17 C9, 05, 05] +1F61B; [0D 19 1D, 05, 05] -1F635; [0D 17 D0, 05, 05] +1F61C; [0D 19 24, 05, 05] -1F636; [0D 17 D7, 05, 05] +1F61D; [0D 19 2B, 05, 05] -1F637; [0D 17 DE, 05, 05] +1F61E; [0D 19 32, 05, 05] -1F638; [0D 17 E5, 05, 05] +1F61F; [0D 19 39, 05, 05] -1F639; [0D 17 EC, 05, 05] +1F620; [0D 19 40, 05, 05] -1F63A; [0D 17 F3, 05, 05] +1F621; [0D 19 47, 05, 05] -1F63B; [0D 17 FA, 05, 05] +1F622; [0D 19 4E, 05, 05] -1F63C; [0D 18 03, 05, 05] +1F623; [0D 19 55, 05, 05] -1F63D; [0D 18 0A, 05, 05] +1F624; [0D 19 5C, 05, 05] -1F63E; [0D 18 11, 05, 05] +1F625; [0D 19 63, 05, 05] -1F63F; [0D 18 18, 05, 05] +1F626; [0D 19 6A, 05, 05] -1F640; [0D 18 1F, 05, 05] +1F627; [0D 19 71, 05, 05] -1F641; [0D 18 26, 05, 05] +1F628; [0D 19 78, 05, 05] -1F642; [0D 18 2D, 05, 05] +1F629; [0D 19 7F, 05, 05] -1F643; [0D 18 34, 05, 05] +1F62A; [0D 19 86, 05, 05] -1F644; [0D 18 3B, 05, 05] +1F62B; [0D 19 8D, 05, 05] -1F645; [0D 18 42, 05, 05] +1F62C; [0D 19 94, 05, 05] -1F646; [0D 18 49, 05, 05] +1F62D; [0D 19 9B, 05, 05] -1F647; [0D 18 50, 05, 05] +1F62E; [0D 19 A2, 05, 05] -1F648; [0D 18 57, 05, 05] +1F62F; [0D 19 A9, 05, 05] -1F649; [0D 18 5E, 05, 05] +1F630; [0D 19 B0, 05, 05] -1F64A; [0D 18 65, 05, 05] +1F631; [0D 19 B7, 05, 05] -1F64B; [0D 18 6C, 05, 05] +1F632; [0D 19 BE, 05, 05] -1F64C; [0D 18 73, 05, 05] +1F633; [0D 19 C5, 05, 05] -1F64D; [0D 18 7A, 05, 05] +1F634; [0D 19 CC, 05, 05] -1F64E; [0D 18 81, 05, 05] +1F635; [0D 19 D3, 05, 05] -1F64F; [0D 18 88, 05, 05] +1F636; [0D 19 DA, 05, 05] -1F650; [0D 18 8F, 05, 05] +1F637; [0D 19 E1, 05, 05] -1F651; [0D 18 96, 05, 05] +1F638; [0D 19 E8, 05, 05] -1F652; [0D 18 9D, 05, 05] +1F639; [0D 19 EF, 05, 05] -1F653; [0D 18 A4, 05, 05] +1F63A; [0D 19 F6, 05, 05] -1F654; [0D 18 AB, 05, 05] +1F63B; [0D 19 FD, 05, 05] -1F655; [0D 18 B2, 05, 05] +1F63C; [0D 1A 06, 05, 05] -1F656; [0D 18 B9, 05, 05] +1F63D; [0D 1A 0D, 05, 05] -1F657; [0D 18 C0, 05, 05] +1F63E; [0D 1A 14, 05, 05] -1F658; [0D 18 C7, 05, 05] +1F63F; [0D 1A 1B, 05, 05] -1F659; [0D 18 CE, 05, 05] +1F640; [0D 1A 22, 05, 05] -1F65A; [0D 18 D5, 05, 05] +1F641; [0D 1A 29, 05, 05] -1F65B; [0D 18 DC, 05, 05] +1F642; [0D 1A 30, 05, 05] -1F65C; [0D 18 E3, 05, 05] +1F643; [0D 1A 37, 05, 05] -1F65D; [0D 18 EA, 05, 05] +1F644; [0D 1A 3E, 05, 05] -1F65E; [0D 18 F1, 05, 05] +1F645; [0D 1A 45, 05, 05] -1F65F; [0D 18 F8, 05, 05] +1F646; [0D 1A 4C, 05, 05] -1F660; [0D 18 FF, 05, 05] +1F647; [0D 1A 53, 05, 05] -1F661; [0D 19 08, 05, 05] +1F648; [0D 1A 5A, 05, 05] -1F662; [0D 19 0F, 05, 05] +1F649; [0D 1A 61, 05, 05] -1F663; [0D 19 16, 05, 05] +1F64A; [0D 1A 68, 05, 05] -1F664; [0D 19 1D, 05, 05] +1F64B; [0D 1A 6F, 05, 05] -1F665; [0D 19 24, 05, 05] +1F64C; [0D 1A 76, 05, 05] -1F666; [0D 19 2B, 05, 05] +1F64D; [0D 1A 7D, 05, 05] -1F667; [0D 19 32, 05, 05] +1F64E; [0D 1A 84, 05, 05] -1F668; [0D 19 39, 05, 05] +1F64F; [0D 1A 8B, 05, 05] -1F669; [0D 19 40, 05, 05] +1F650; [0D 1A 92, 05, 05] -1F66A; [0D 19 47, 05, 05] +1F651; [0D 1A 99, 05, 05] -1F66B; [0D 19 4E, 05, 05] +1F652; [0D 1A A0, 05, 05] -1F66C; [0D 19 55, 05, 05] +1F653; [0D 1A A7, 05, 05] -1F66D; [0D 19 5C, 05, 05] +1F654; [0D 1A AE, 05, 05] -1F66E; [0D 19 63, 05, 05] +1F655; [0D 1A B5, 05, 05] -1F66F; [0D 19 6A, 05, 05] +1F656; [0D 1A BC, 05, 05] -1F670; [0D 19 71, 05, 05] +1F657; [0D 1A C3, 05, 05] -1F671; [0D 19 78, 05, 05] +1F658; [0D 1A CA, 05, 05] -1F672; [0D 19 7F, 05, 05] +1F659; [0D 1A D1, 05, 05] -1F673; [0D 19 86, 05, 05] +1F65A; [0D 1A D8, 05, 05] -1F674; [0D 19 8D, 05, 05] +1F65B; [0D 1A DF, 05, 05] -1F675; [0D 19 94, 05, 05] +1F65C; [0D 1A E6, 05, 05] -1F676; [0D 19 9B, 05, 05] +1F65D; [0D 1A ED, 05, 05] -1F677; [0D 19 A2, 05, 05] +1F65E; [0D 1A F4, 05, 05] -1F678; [0D 19 A9, 05, 05] +1F65F; [0D 1A FB, 05, 05] -1F679; [0D 19 B0, 05, 05] +1F660; [0D 1B 04, 05, 05] -1F67A; [0D 19 B7, 05, 05] +1F661; [0D 1B 0B, 05, 05] -1F67B; [0D 19 BE, 05, 05] +1F662; [0D 1B 12, 05, 05] -1F67C; [0D 19 C5, 05, 05] +1F663; [0D 1B 19, 05, 05] -1F67D; [0D 19 CC, 05, 05] +1F664; [0D 1B 20, 05, 05] -1F67E; [0D 19 D3, 05, 05] +1F665; [0D 1B 27, 05, 05] -1F67F; [0D 19 DA, 05, 05] +1F666; [0D 1B 2E, 05, 05] -1F680; [0D 19 E1, 05, 05] +1F667; [0D 1B 35, 05, 05] -1F681; [0D 19 E8, 05, 05] +1F668; [0D 1B 3C, 05, 05] -1F682; [0D 19 EF, 05, 05] +1F669; [0D 1B 43, 05, 05] -1F683; [0D 19 F6, 05, 05] +1F66A; [0D 1B 4A, 05, 05] -1F684; [0D 19 FD, 05, 05] +1F66B; [0D 1B 51, 05, 05] -1F685; [0D 1A 06, 05, 05] +1F66C; [0D 1B 58, 05, 05] -1F686; [0D 1A 0D, 05, 05] +1F66D; [0D 1B 5F, 05, 05] -1F687; [0D 1A 14, 05, 05] +1F66E; [0D 1B 66, 05, 05] -1F688; [0D 1A 1B, 05, 05] +1F66F; [0D 1B 6D, 05, 05] -1F689; [0D 1A 22, 05, 05] +1F670; [0D 1B 74, 05, 05] -1F68A; [0D 1A 29, 05, 05] +1F671; [0D 1B 7B, 05, 05] -1F68B; [0D 1A 30, 05, 05] +1F672; [0D 1B 82, 05, 05] -1F68C; [0D 1A 37, 05, 05] +1F673; [0D 1B 89, 05, 05] -1F68D; [0D 1A 3E, 05, 05] +1F674; [0D 1B 90, 05, 05] -1F68E; [0D 1A 45, 05, 05] +1F675; [0D 1B 97, 05, 05] -1F68F; [0D 1A 4C, 05, 05] +1F676; [0D 1B 9E, 05, 05] -1F690; [0D 1A 53, 05, 05] +1F677; [0D 1B A5, 05, 05] -1F691; [0D 1A 5A, 05, 05] +1F678; [0D 1B AC, 05, 05] -1F692; [0D 1A 61, 05, 05] +1F679; [0D 1B B3, 05, 05] -1F693; [0D 1A 68, 05, 05] +1F67A; [0D 1B BA, 05, 05] -1F694; [0D 1A 6F, 05, 05] +1F67B; [0D 1B C1, 05, 05] -1F695; [0D 1A 76, 05, 05] +1F67C; [0D 1B C8, 05, 05] -1F696; [0D 1A 7D, 05, 05] +1F67D; [0D 1B CF, 05, 05] -1F697; [0D 1A 84, 05, 05] +1F67E; [0D 1B D6, 05, 05] -1F698; [0D 1A 8B, 05, 05] +1F67F; [0D 1B DD, 05, 05] -1F699; [0D 1A 92, 05, 05] +1F680; [0D 1B E4, 05, 05] -1F69A; [0D 1A 99, 05, 05] +1F681; [0D 1B EB, 05, 05] -1F69B; [0D 1A A0, 05, 05] +1F682; [0D 1B F2, 05, 05] -1F69C; [0D 1A A7, 05, 05] +1F683; [0D 1B F9, 05, 05] -1F69D; [0D 1A AE, 05, 05] +1F684; [0D 1C 02, 05, 05] -1F69E; [0D 1A B5, 05, 05] +1F685; [0D 1C 09, 05, 05] -1F69F; [0D 1A BC, 05, 05] +1F686; [0D 1C 10, 05, 05] -1F6A0; [0D 1A C3, 05, 05] +1F687; [0D 1C 17, 05, 05] -1F6A1; [0D 1A CA, 05, 05] +1F688; [0D 1C 1E, 05, 05] -1F6A2; [0D 1A D1, 05, 05] +1F689; [0D 1C 25, 05, 05] -1F6A3; [0D 1A D8, 05, 05] +1F68A; [0D 1C 2C, 05, 05] -1F6A4; [0D 1A DF, 05, 05] +1F68B; [0D 1C 33, 05, 05] -1F6A5; [0D 1A E6, 05, 05] +1F68C; [0D 1C 3A, 05, 05] -1F6A6; [0D 1A ED, 05, 05] +1F68D; [0D 1C 41, 05, 05] -1F6A7; [0D 1A F4, 05, 05] +1F68E; [0D 1C 48, 05, 05] -1F6A8; [0D 1A FB, 05, 05] +1F68F; [0D 1C 4F, 05, 05] -1F6A9; [0D 1B 04, 05, 05] +1F690; [0D 1C 56, 05, 05] -1F6AA; [0D 1B 0B, 05, 05] +1F691; [0D 1C 5D, 05, 05] -1F6AB; [0D 1B 12, 05, 05] +1F692; [0D 1C 64, 05, 05] -1F6AC; [0D 1B 19, 05, 05] +1F693; [0D 1C 6B, 05, 05] -1F6AD; [0D 1B 20, 05, 05] +1F694; [0D 1C 72, 05, 05] -1F6AE; [0D 1B 27, 05, 05] +1F695; [0D 1C 79, 05, 05] -1F6AF; [0D 1B 2E, 05, 05] +1F696; [0D 1C 80, 05, 05] -1F6B0; [0D 1B 35, 05, 05] +1F697; [0D 1C 87, 05, 05] -1F6B1; [0D 1B 3C, 05, 05] +1F698; [0D 1C 8E, 05, 05] -1F6B2; [0D 1B 43, 05, 05] +1F699; [0D 1C 95, 05, 05] -1F6B3; [0D 1B 4A, 05, 05] +1F69A; [0D 1C 9C, 05, 05] -1F6B4; [0D 1B 51, 05, 05] +1F69B; [0D 1C A3, 05, 05] -1F6B5; [0D 1B 58, 05, 05] +1F69C; [0D 1C AA, 05, 05] -1F6B6; [0D 1B 5F, 05, 05] +1F69D; [0D 1C B1, 05, 05] -1F6B7; [0D 1B 66, 05, 05] +1F69E; [0D 1C B8, 05, 05] -1F6B8; [0D 1B 6D, 05, 05] +1F69F; [0D 1C BF, 05, 05] -1F6B9; [0D 1B 74, 05, 05] +1F6A0; [0D 1C C6, 05, 05] -1F6BA; [0D 1B 7B, 05, 05] +1F6A1; [0D 1C CD, 05, 05] -1F6BB; [0D 1B 82, 05, 05] +1F6A2; [0D 1C D4, 05, 05] -1F6BC; [0D 1B 89, 05, 05] +1F6A3; [0D 1C DB, 05, 05] -1F6BD; [0D 1B 90, 05, 05] +1F6A4; [0D 1C E2, 05, 05] -1F6BE; [0D 1B 97, 05, 05] +1F6A5; [0D 1C E9, 05, 05] -1F6BF; [0D 1B 9E, 05, 05] +1F6A6; [0D 1C F0, 05, 05] -1F6C0; [0D 1B A5, 05, 05] +1F6A7; [0D 1C F7, 05, 05] -1F6C1; [0D 1B AC, 05, 05] +1F6A8; [0D 1C FE, 05, 05] -1F6C2; [0D 1B B3, 05, 05] +1F6A9; [0D 1D 07, 05, 05] -1F6C3; [0D 1B BA, 05, 05] +1F6AA; [0D 1D 0E, 05, 05] -1F6C4; [0D 1B C1, 05, 05] +1F6AB; [0D 1D 15, 05, 05] -1F6C5; [0D 1B C8, 05, 05] +1F6AC; [0D 1D 1C, 05, 05] -1F6C6; [0D 1B CF, 05, 05] +1F6AD; [0D 1D 23, 05, 05] -1F6C7; [0D 1B D6, 05, 05] +1F6AE; [0D 1D 2A, 05, 05] -1F6C8; [0D 1B DD, 05, 05] +1F6AF; [0D 1D 31, 05, 05] -1F6C9; [0D 1B E4, 05, 05] +1F6B0; [0D 1D 38, 05, 05] -1F6CA; [0D 1B EB, 05, 05] +1F6B1; [0D 1D 3F, 05, 05] -1F6CB; [0D 1B F2, 05, 05] +1F6B2; [0D 1D 46, 05, 05] -1F6CC; [0D 1B F9, 05, 05] +1F6B3; [0D 1D 4D, 05, 05] -1F6CD; [0D 1C 02, 05, 05] +1F6B4; [0D 1D 54, 05, 05] -1F6CE; [0D 1C 09, 05, 05] +1F6B5; [0D 1D 5B, 05, 05] -1F6CF; [0D 1C 10, 05, 05] +1F6B6; [0D 1D 62, 05, 05] -1F6D0; [0D 1C 17, 05, 05] +1F6B7; [0D 1D 69, 05, 05] -1F6D1; [0D 1C 1E, 05, 05] +1F6B8; [0D 1D 70, 05, 05] -1F6D2; [0D 1C 25, 05, 05] +1F6B9; [0D 1D 77, 05, 05] -1F6E0; [0D 1C 2C, 05, 05] +1F6BA; [0D 1D 7E, 05, 05] -1F6E1; [0D 1C 33, 05, 05] +1F6BB; [0D 1D 85, 05, 05] -1F6E2; [0D 1C 3A, 05, 05] +1F6BC; [0D 1D 8C, 05, 05] -1F6E3; [0D 1C 41, 05, 05] +1F6BD; [0D 1D 93, 05, 05] -1F6E4; [0D 1C 48, 05, 05] +1F6BE; [0D 1D 9A, 05, 05] -1F6E5; [0D 1C 4F, 05, 05] +1F6BF; [0D 1D A1, 05, 05] -1F6E6; [0D 1C 56, 05, 05] +1F6C0; [0D 1D A8, 05, 05] -1F6E7; [0D 1C 5D, 05, 05] +1F6C1; [0D 1D AF, 05, 05] -1F6E8; [0D 1C 64, 05, 05] +1F6C2; [0D 1D B6, 05, 05] -1F6E9; [0D 1C 6B, 05, 05] +1F6C3; [0D 1D BD, 05, 05] -1F6EA; [0D 1C 72, 05, 05] +1F6C4; [0D 1D C4, 05, 05] -1F6EB; [0D 1C 79, 05, 05] +1F6C5; [0D 1D CB, 05, 05] -1F6EC; [0D 1C 80, 05, 05] +1F6C6; [0D 1D D2, 05, 05] -1F6F0; [0D 1C 87, 05, 05] +1F6C7; [0D 1D D9, 05, 05] -1F6F1; [0D 1C 8E, 05, 05] +1F6C8; [0D 1D E0, 05, 05] -1F6F2; [0D 1C 95, 05, 05] +1F6C9; [0D 1D E7, 05, 05] -1F6F3; [0D 1C 9C, 05, 05] +1F6CA; [0D 1D EE, 05, 05] -1F6F4; [0D 1C A3, 05, 05] +1F6CB; [0D 1D F5, 05, 05] -1F6F5; [0D 1C AA, 05, 05] +1F6CC; [0D 1D FC, 05, 05] -1F6F6; [0D 1C B1, 05, 05] +1F6CD; [0D 1E 05, 05, 05] -1F700; [0D 1C B8, 05, 05] +1F6CE; [0D 1E 0C, 05, 05] -1F701; [0D 1C BF, 05, 05] +1F6CF; [0D 1E 13, 05, 05] -1F702; [0D 1C C6, 05, 05] +1F6D0; [0D 1E 1A, 05, 05] -1F703; [0D 1C CD, 05, 05] +1F6D1; [0D 1E 21, 05, 05] -1F704; [0D 1C D4, 05, 05] +1F6D2; [0D 1E 28, 05, 05] -1F705; [0D 1C DB, 05, 05] +1F6D3; [0D 1E 2F, 05, 05] -1F706; [0D 1C E2, 05, 05] +1F6D4; [0D 1E 36, 05, 05] -1F707; [0D 1C E9, 05, 05] +1F6E0; [0D 1E 3D, 05, 05] -1F708; [0D 1C F0, 05, 05] +1F6E1; [0D 1E 44, 05, 05] -1F709; [0D 1C F7, 05, 05] +1F6E2; [0D 1E 4B, 05, 05] -1F70A; [0D 1C FE, 05, 05] +1F6E3; [0D 1E 52, 05, 05] -1F70B; [0D 1D 07, 05, 05] +1F6E4; [0D 1E 59, 05, 05] -1F70C; [0D 1D 0E, 05, 05] +1F6E5; [0D 1E 60, 05, 05] -1F70D; [0D 1D 15, 05, 05] +1F6E6; [0D 1E 67, 05, 05] -1F70E; [0D 1D 1C, 05, 05] +1F6E7; [0D 1E 6E, 05, 05] -1F70F; [0D 1D 23, 05, 05] +1F6E8; [0D 1E 75, 05, 05] -1F710; [0D 1D 2A, 05, 05] +1F6E9; [0D 1E 7C, 05, 05] -1F711; [0D 1D 31, 05, 05] +1F6EA; [0D 1E 83, 05, 05] -1F712; [0D 1D 38, 05, 05] +1F6EB; [0D 1E 8A, 05, 05] -1F713; [0D 1D 3F, 05, 05] +1F6EC; [0D 1E 91, 05, 05] -1F714; [0D 1D 46, 05, 05] +1F6F0; [0D 1E 98, 05, 05] -1F715; [0D 1D 4D, 05, 05] +1F6F1; [0D 1E 9F, 05, 05] -1F716; [0D 1D 54, 05, 05] +1F6F2; [0D 1E A6, 05, 05] -1F717; [0D 1D 5B, 05, 05] +1F6F3; [0D 1E AD, 05, 05] -1F718; [0D 1D 62, 05, 05] +1F6F4; [0D 1E B4, 05, 05] -1F719; [0D 1D 69, 05, 05] +1F6F5; [0D 1E BB, 05, 05] -1F71A; [0D 1D 70, 05, 05] +1F6F6; [0D 1E C2, 05, 05] -1F71B; [0D 1D 77, 05, 05] +1F6F7; [0D 1E C9, 05, 05] -1F71C; [0D 1D 7E, 05, 05] +1F6F8; [0D 1E D0, 05, 05] -1F71D; [0D 1D 85, 05, 05] +1F700; [0D 1E D7, 05, 05] -1F71E; [0D 1D 8C, 05, 05] +1F701; [0D 1E DE, 05, 05] -1F71F; [0D 1D 93, 05, 05] +1F702; [0D 1E E5, 05, 05] -1F720; [0D 1D 9A, 05, 05] +1F703; [0D 1E EC, 05, 05] -1F721; [0D 1D A1, 05, 05] +1F704; [0D 1E F3, 05, 05] -1F722; [0D 1D A8, 05, 05] +1F705; [0D 1E FA, 05, 05] -1F723; [0D 1D AF, 05, 05] +1F706; [0D 1F 03, 05, 05] -1F724; [0D 1D B6, 05, 05] +1F707; [0D 1F 0A, 05, 05] -1F725; [0D 1D BD, 05, 05] +1F708; [0D 1F 11, 05, 05] -1F726; [0D 1D C4, 05, 05] +1F709; [0D 1F 18, 05, 05] -1F727; [0D 1D CB, 05, 05] +1F70A; [0D 1F 1F, 05, 05] -1F728; [0D 1D D2, 05, 05] +1F70B; [0D 1F 26, 05, 05] -1F729; [0D 1D D9, 05, 05] +1F70C; [0D 1F 2D, 05, 05] -1F72A; [0D 1D E0, 05, 05] +1F70D; [0D 1F 34, 05, 05] -1F72B; [0D 1D E7, 05, 05] +1F70E; [0D 1F 3B, 05, 05] -1F72C; [0D 1D EE, 05, 05] +1F70F; [0D 1F 42, 05, 05] -1F72D; [0D 1D F5, 05, 05] +1F710; [0D 1F 49, 05, 05] -1F72E; [0D 1D FC, 05, 05] +1F711; [0D 1F 50, 05, 05] -1F72F; [0D 1E 05, 05, 05] +1F712; [0D 1F 57, 05, 05] -1F730; [0D 1E 0C, 05, 05] +1F713; [0D 1F 5E, 05, 05] -1F731; [0D 1E 13, 05, 05] +1F714; [0D 1F 65, 05, 05] -1F732; [0D 1E 1A, 05, 05] +1F715; [0D 1F 6C, 05, 05] -1F733; [0D 1E 21, 05, 05] +1F716; [0D 1F 73, 05, 05] -1F734; [0D 1E 28, 05, 05] +1F717; [0D 1F 7A, 05, 05] -1F735; [0D 1E 2F, 05, 05] +1F718; [0D 1F 81, 05, 05] -1F736; [0D 1E 36, 05, 05] +1F719; [0D 1F 88, 05, 05] -1F737; [0D 1E 3D, 05, 05] +1F71A; [0D 1F 8F, 05, 05] -1F738; [0D 1E 44, 05, 05] +1F71B; [0D 1F 96, 05, 05] -1F739; [0D 1E 4B, 05, 05] +1F71C; [0D 1F 9D, 05, 05] -1F73A; [0D 1E 52, 05, 05] +1F71D; [0D 1F A4, 05, 05] -1F73B; [0D 1E 59, 05, 05] +1F71E; [0D 1F AB, 05, 05] -1F73C; [0D 1E 60, 05, 05] +1F71F; [0D 1F B2, 05, 05] -1F73D; [0D 1E 67, 05, 05] +1F720; [0D 1F B9, 05, 05] -1F73E; [0D 1E 6E, 05, 05] +1F721; [0D 1F C0, 05, 05] -1F73F; [0D 1E 75, 05, 05] +1F722; [0D 1F C7, 05, 05] -1F740; [0D 1E 7C, 05, 05] +1F723; [0D 1F CE, 05, 05] -1F741; [0D 1E 83, 05, 05] +1F724; [0D 1F D5, 05, 05] -1F742; [0D 1E 8A, 05, 05] +1F725; [0D 1F DC, 05, 05] -1F743; [0D 1E 91, 05, 05] +1F726; [0D 1F E3, 05, 05] -1F744; [0D 1E 98, 05, 05] +1F727; [0D 1F EA, 05, 05] -1F745; [0D 1E 9F, 05, 05] +1F728; [0D 1F F1, 05, 05] -1F746; [0D 1E A6, 05, 05] +1F729; [0D 1F F8, 05, 05] -1F747; [0D 1E AD, 05, 05] +1F72A; [0D 1F FF, 05, 05] -1F748; [0D 1E B4, 05, 05] +1F72B; [0D 20 08, 05, 05] -1F749; [0D 1E BB, 05, 05] +1F72C; [0D 20 0F, 05, 05] -1F74A; [0D 1E C2, 05, 05] +1F72D; [0D 20 16, 05, 05] -1F74B; [0D 1E C9, 05, 05] +1F72E; [0D 20 1D, 05, 05] -1F74C; [0D 1E D0, 05, 05] +1F72F; [0D 20 24, 05, 05] -1F74D; [0D 1E D7, 05, 05] +1F730; [0D 20 2B, 05, 05] -1F74E; [0D 1E DE, 05, 05] +1F731; [0D 20 32, 05, 05] -1F74F; [0D 1E E5, 05, 05] +1F732; [0D 20 39, 05, 05] -1F750; [0D 1E EC, 05, 05] +1F733; [0D 20 40, 05, 05] -1F751; [0D 1E F3, 05, 05] +1F734; [0D 20 47, 05, 05] -1F752; [0D 1E FA, 05, 05] +1F735; [0D 20 4E, 05, 05] -1F753; [0D 1F 03, 05, 05] +1F736; [0D 20 55, 05, 05] -1F754; [0D 1F 0A, 05, 05] +1F737; [0D 20 5C, 05, 05] -1F755; [0D 1F 11, 05, 05] +1F738; [0D 20 63, 05, 05] -1F756; [0D 1F 18, 05, 05] +1F739; [0D 20 6A, 05, 05] -1F757; [0D 1F 1F, 05, 05] +1F73A; [0D 20 71, 05, 05] -1F758; [0D 1F 26, 05, 05] +1F73B; [0D 20 78, 05, 05] -1F759; [0D 1F 2D, 05, 05] +1F73C; [0D 20 7F, 05, 05] -1F75A; [0D 1F 34, 05, 05] +1F73D; [0D 20 86, 05, 05] -1F75B; [0D 1F 3B, 05, 05] +1F73E; [0D 20 8D, 05, 05] -1F75C; [0D 1F 42, 05, 05] +1F73F; [0D 20 94, 05, 05] -1F75D; [0D 1F 49, 05, 05] +1F740; [0D 20 9B, 05, 05] -1F75E; [0D 1F 50, 05, 05] +1F741; [0D 20 A2, 05, 05] -1F75F; [0D 1F 57, 05, 05] +1F742; [0D 20 A9, 05, 05] -1F760; [0D 1F 5E, 05, 05] +1F743; [0D 20 B0, 05, 05] -1F761; [0D 1F 65, 05, 05] +1F744; [0D 20 B7, 05, 05] -1F762; [0D 1F 6C, 05, 05] +1F745; [0D 20 BE, 05, 05] -1F763; [0D 1F 73, 05, 05] +1F746; [0D 20 C5, 05, 05] -1F764; [0D 1F 7A, 05, 05] +1F747; [0D 20 CC, 05, 05] -1F765; [0D 1F 81, 05, 05] +1F748; [0D 20 D3, 05, 05] -1F766; [0D 1F 88, 05, 05] +1F749; [0D 20 DA, 05, 05] -1F767; [0D 1F 8F, 05, 05] +1F74A; [0D 20 E1, 05, 05] -1F768; [0D 1F 96, 05, 05] +1F74B; [0D 20 E8, 05, 05] -1F769; [0D 1F 9D, 05, 05] +1F74C; [0D 20 EF, 05, 05] -1F76A; [0D 1F A4, 05, 05] +1F74D; [0D 20 F6, 05, 05] -1F76B; [0D 1F AB, 05, 05] +1F74E; [0D 20 FD, 05, 05] -1F76C; [0D 1F B2, 05, 05] +1F74F; [0D 21 06, 05, 05] -1F76D; [0D 1F B9, 05, 05] +1F750; [0D 21 0D, 05, 05] -1F76E; [0D 1F C0, 05, 05] +1F751; [0D 21 14, 05, 05] -1F76F; [0D 1F C7, 05, 05] +1F752; [0D 21 1B, 05, 05] -1F770; [0D 1F CE, 05, 05] +1F753; [0D 21 22, 05, 05] -1F771; [0D 1F D5, 05, 05] +1F754; [0D 21 29, 05, 05] -1F772; [0D 1F DC, 05, 05] +1F755; [0D 21 30, 05, 05] -1F773; [0D 1F E3, 05, 05] +1F756; [0D 21 37, 05, 05] -1F780; [0D 1F EA, 05, 05] +1F757; [0D 21 3E, 05, 05] -1F781; [0D 1F F1, 05, 05] +1F758; [0D 21 45, 05, 05] -1F782; [0D 1F F8, 05, 05] +1F759; [0D 21 4C, 05, 05] -1F783; [0D 1F FF, 05, 05] +1F75A; [0D 21 53, 05, 05] -1F784; [0D 20 08, 05, 05] +1F75B; [0D 21 5A, 05, 05] -1F785; [0D 20 0F, 05, 05] +1F75C; [0D 21 61, 05, 05] -1F786; [0D 20 16, 05, 05] +1F75D; [0D 21 68, 05, 05] -1F787; [0D 20 1D, 05, 05] +1F75E; [0D 21 6F, 05, 05] -1F788; [0D 20 24, 05, 05] +1F75F; [0D 21 76, 05, 05] -1F789; [0D 20 2B, 05, 05] +1F760; [0D 21 7D, 05, 05] -1F78A; [0D 20 32, 05, 05] +1F761; [0D 21 84, 05, 05] -1F78B; [0D 20 39, 05, 05] +1F762; [0D 21 8B, 05, 05] -1F78C; [0D 20 40, 05, 05] +1F763; [0D 21 92, 05, 05] -1F78D; [0D 20 47, 05, 05] +1F764; [0D 21 99, 05, 05] -1F78E; [0D 20 4E, 05, 05] +1F765; [0D 21 A0, 05, 05] -1F78F; [0D 20 55, 05, 05] +1F766; [0D 21 A7, 05, 05] -1F790; [0D 20 5C, 05, 05] +1F767; [0D 21 AE, 05, 05] -1F791; [0D 20 63, 05, 05] +1F768; [0D 21 B5, 05, 05] -1F792; [0D 20 6A, 05, 05] +1F769; [0D 21 BC, 05, 05] -1F793; [0D 20 71, 05, 05] +1F76A; [0D 21 C3, 05, 05] -1F794; [0D 20 78, 05, 05] +1F76B; [0D 21 CA, 05, 05] -1F795; [0D 20 7F, 05, 05] +1F76C; [0D 21 D1, 05, 05] -1F796; [0D 20 86, 05, 05] +1F76D; [0D 21 D8, 05, 05] -1F797; [0D 20 8D, 05, 05] +1F76E; [0D 21 DF, 05, 05] -1F798; [0D 20 94, 05, 05] +1F76F; [0D 21 E6, 05, 05] -1F799; [0D 20 9B, 05, 05] +1F770; [0D 21 ED, 05, 05] -1F79A; [0D 20 A2, 05, 05] +1F771; [0D 21 F4, 05, 05] -1F79B; [0D 20 A9, 05, 05] +1F772; [0D 21 FB, 05, 05] -1F79C; [0D 20 B0, 05, 05] +1F773; [0D 22 04, 05, 05] -1F79D; [0D 20 B7, 05, 05] +1F780; [0D 22 0B, 05, 05] -1F79E; [0D 20 BE, 05, 05] +1F781; [0D 22 12, 05, 05] -1F79F; [0D 20 C5, 05, 05] +1F782; [0D 22 19, 05, 05] -1F7A0; [0D 20 CC, 05, 05] +1F783; [0D 22 20, 05, 05] -1F7A1; [0D 20 D3, 05, 05] +1F784; [0D 22 27, 05, 05] -1F7A2; [0D 20 DA, 05, 05] +1F785; [0D 22 2E, 05, 05] -1F7A3; [0D 20 E1, 05, 05] +1F786; [0D 22 35, 05, 05] -1F7A4; [0D 20 E8, 05, 05] +1F787; [0D 22 3C, 05, 05] -1F7A5; [0D 20 EF, 05, 05] +1F788; [0D 22 43, 05, 05] -1F7A6; [0D 20 F6, 05, 05] +1F789; [0D 22 4A, 05, 05] -1F7A7; [0D 20 FD, 05, 05] +1F78A; [0D 22 51, 05, 05] -1F7A8; [0D 21 06, 05, 05] +1F78B; [0D 22 58, 05, 05] -1F7A9; [0D 21 0D, 05, 05] +1F78C; [0D 22 5F, 05, 05] -1F7AA; [0D 21 14, 05, 05] +1F78D; [0D 22 66, 05, 05] -1F7AB; [0D 21 1B, 05, 05] +1F78E; [0D 22 6D, 05, 05] -1F7AC; [0D 21 22, 05, 05] +1F78F; [0D 22 74, 05, 05] -1F7AD; [0D 21 29, 05, 05] +1F790; [0D 22 7B, 05, 05] -1F7AE; [0D 21 30, 05, 05] +1F791; [0D 22 82, 05, 05] -1F7AF; [0D 21 37, 05, 05] +1F792; [0D 22 89, 05, 05] -1F7B0; [0D 21 3E, 05, 05] +1F793; [0D 22 90, 05, 05] -1F7B1; [0D 21 45, 05, 05] +1F794; [0D 22 97, 05, 05] -1F7B2; [0D 21 4C, 05, 05] +1F795; [0D 22 9E, 05, 05] -1F7B3; [0D 21 53, 05, 05] +1F796; [0D 22 A5, 05, 05] -1F7B4; [0D 21 5A, 05, 05] +1F797; [0D 22 AC, 05, 05] -1F7B5; [0D 21 61, 05, 05] +1F798; [0D 22 B3, 05, 05] -1F7B6; [0D 21 68, 05, 05] +1F799; [0D 22 BA, 05, 05] -1F7B7; [0D 21 6F, 05, 05] +1F79A; [0D 22 C1, 05, 05] -1F7B8; [0D 21 76, 05, 05] +1F79B; [0D 22 C8, 05, 05] -1F7B9; [0D 21 7D, 05, 05] +1F79C; [0D 22 CF, 05, 05] -1F7BA; [0D 21 84, 05, 05] +1F79D; [0D 22 D6, 05, 05] -1F7BB; [0D 21 8B, 05, 05] +1F79E; [0D 22 DD, 05, 05] -1F7BC; [0D 21 92, 05, 05] +1F79F; [0D 22 E4, 05, 05] -1F7BD; [0D 21 99, 05, 05] +1F7A0; [0D 22 EB, 05, 05] -1F7BE; [0D 21 A0, 05, 05] +1F7A1; [0D 22 F2, 05, 05] -1F7BF; [0D 21 A7, 05, 05] +1F7A2; [0D 22 F9, 05, 05] -1F7C0; [0D 21 AE, 05, 05] +1F7A3; [0D 23 02, 05, 05] -1F7C1; [0D 21 B5, 05, 05] +1F7A4; [0D 23 09, 05, 05] -1F7C2; [0D 21 BC, 05, 05] +1F7A5; [0D 23 10, 05, 05] -1F7C3; [0D 21 C3, 05, 05] +1F7A6; [0D 23 17, 05, 05] -1F7C4; [0D 21 CA, 05, 05] +1F7A7; [0D 23 1E, 05, 05] -1F7C5; [0D 21 D1, 05, 05] +1F7A8; [0D 23 25, 05, 05] -1F7C6; [0D 21 D8, 05, 05] +1F7A9; [0D 23 2C, 05, 05] -1F7C7; [0D 21 DF, 05, 05] +1F7AA; [0D 23 33, 05, 05] -1F7C8; [0D 21 E6, 05, 05] +1F7AB; [0D 23 3A, 05, 05] -1F7C9; [0D 21 ED, 05, 05] +1F7AC; [0D 23 41, 05, 05] -1F7CA; [0D 21 F4, 05, 05] +1F7AD; [0D 23 48, 05, 05] -1F7CB; [0D 21 FB, 05, 05] +1F7AE; [0D 23 4F, 05, 05] -1F7CC; [0D 22 04, 05, 05] +1F7AF; [0D 23 56, 05, 05] -1F7CD; [0D 22 0B, 05, 05] +1F7B0; [0D 23 5D, 05, 05] -1F7CE; [0D 22 12, 05, 05] +1F7B1; [0D 23 64, 05, 05] -1F7CF; [0D 22 19, 05, 05] +1F7B2; [0D 23 6B, 05, 05] -1F7D0; [0D 22 20, 05, 05] +1F7B3; [0D 23 72, 05, 05] -1F7D1; [0D 22 27, 05, 05] +1F7B4; [0D 23 79, 05, 05] -1F7D2; [0D 22 2E, 05, 05] +1F7B5; [0D 23 80, 05, 05] -1F7D3; [0D 22 35, 05, 05] +1F7B6; [0D 23 87, 05, 05] -1F7D4; [0D 22 3C, 05, 05] +1F7B7; [0D 23 8E, 05, 05] -1F800; [0D 22 43, 05, 05] +1F7B8; [0D 23 95, 05, 05] -1F801; [0D 22 4A, 05, 05] +1F7B9; [0D 23 9C, 05, 05] -1F802; [0D 22 51, 05, 05] +1F7BA; [0D 23 A3, 05, 05] -1F803; [0D 22 58, 05, 05] +1F7BB; [0D 23 AA, 05, 05] -1F804; [0D 22 5F, 05, 05] +1F7BC; [0D 23 B1, 05, 05] -1F805; [0D 22 66, 05, 05] +1F7BD; [0D 23 B8, 05, 05] -1F806; [0D 22 6D, 05, 05] +1F7BE; [0D 23 BF, 05, 05] -1F807; [0D 22 74, 05, 05] +1F7BF; [0D 23 C6, 05, 05] -1F808; [0D 22 7B, 05, 05] +1F7C0; [0D 23 CD, 05, 05] -1F809; [0D 22 82, 05, 05] +1F7C1; [0D 23 D4, 05, 05] -1F80A; [0D 22 89, 05, 05] +1F7C2; [0D 23 DB, 05, 05] -1F80B; [0D 22 90, 05, 05] +1F7C3; [0D 23 E2, 05, 05] -1F810; [0D 22 97, 05, 05] +1F7C4; [0D 23 E9, 05, 05] -1F811; [0D 22 9E, 05, 05] +1F7C5; [0D 23 F0, 05, 05] -1F812; [0D 22 A5, 05, 05] +1F7C6; [0D 23 F7, 05, 05] -1F813; [0D 22 AC, 05, 05] +1F7C7; [0D 23 FE, 05, 05] -1F814; [0D 22 B3, 05, 05] +1F7C8; [0D 24 07, 05, 05] -1F815; [0D 22 BA, 05, 05] +1F7C9; [0D 24 0E, 05, 05] -1F816; [0D 22 C1, 05, 05] +1F7CA; [0D 24 15, 05, 05] -1F817; [0D 22 C8, 05, 05] +1F7CB; [0D 24 1C, 05, 05] -1F818; [0D 22 CF, 05, 05] +1F7CC; [0D 24 23, 05, 05] -1F819; [0D 22 D6, 05, 05] +1F7CD; [0D 24 2A, 05, 05] -1F81A; [0D 22 DD, 05, 05] +1F7CE; [0D 24 31, 05, 05] -1F81B; [0D 22 E4, 05, 05] +1F7CF; [0D 24 38, 05, 05] -1F81C; [0D 22 EB, 05, 05] +1F7D0; [0D 24 3F, 05, 05] -1F81D; [0D 22 F2, 05, 05] +1F7D1; [0D 24 46, 05, 05] -1F81E; [0D 22 F9, 05, 05] +1F7D2; [0D 24 4D, 05, 05] -1F81F; [0D 23 02, 05, 05] +1F7D3; [0D 24 54, 05, 05] -1F820; [0D 23 09, 05, 05] +1F7D4; [0D 24 5B, 05, 05] -1F821; [0D 23 10, 05, 05] +1F800; [0D 24 62, 05, 05] -1F822; [0D 23 17, 05, 05] +1F801; [0D 24 69, 05, 05] -1F823; [0D 23 1E, 05, 05] +1F802; [0D 24 70, 05, 05] -1F824; [0D 23 25, 05, 05] +1F803; [0D 24 77, 05, 05] -1F825; [0D 23 2C, 05, 05] +1F804; [0D 24 7E, 05, 05] -1F826; [0D 23 33, 05, 05] +1F805; [0D 24 85, 05, 05] -1F827; [0D 23 3A, 05, 05] +1F806; [0D 24 8C, 05, 05] -1F828; [0D 23 41, 05, 05] +1F807; [0D 24 93, 05, 05] -1F829; [0D 23 48, 05, 05] +1F808; [0D 24 9A, 05, 05] -1F82A; [0D 23 4F, 05, 05] +1F809; [0D 24 A1, 05, 05] -1F82B; [0D 23 56, 05, 05] +1F80A; [0D 24 A8, 05, 05] -1F82C; [0D 23 5D, 05, 05] +1F80B; [0D 24 AF, 05, 05] -1F82D; [0D 23 64, 05, 05] +1F810; [0D 24 B6, 05, 05] -1F82E; [0D 23 6B, 05, 05] +1F811; [0D 24 BD, 05, 05] -1F82F; [0D 23 72, 05, 05] +1F812; [0D 24 C4, 05, 05] -1F830; [0D 23 79, 05, 05] +1F813; [0D 24 CB, 05, 05] -1F831; [0D 23 80, 05, 05] +1F814; [0D 24 D2, 05, 05] -1F832; [0D 23 87, 05, 05] +1F815; [0D 24 D9, 05, 05] -1F833; [0D 23 8E, 05, 05] +1F816; [0D 24 E0, 05, 05] -1F834; [0D 23 95, 05, 05] +1F817; [0D 24 E7, 05, 05] -1F835; [0D 23 9C, 05, 05] +1F818; [0D 24 EE, 05, 05] -1F836; [0D 23 A3, 05, 05] +1F819; [0D 24 F5, 05, 05] -1F837; [0D 23 AA, 05, 05] +1F81A; [0D 24 FC, 05, 05] -1F838; [0D 23 B1, 05, 05] +1F81B; [0D 25 05, 05, 05] -1F839; [0D 23 B8, 05, 05] +1F81C; [0D 25 0C, 05, 05] -1F83A; [0D 23 BF, 05, 05] +1F81D; [0D 25 13, 05, 05] -1F83B; [0D 23 C6, 05, 05] +1F81E; [0D 25 1A, 05, 05] -1F83C; [0D 23 CD, 05, 05] +1F81F; [0D 25 21, 05, 05] -1F83D; [0D 23 D4, 05, 05] +1F820; [0D 25 28, 05, 05] -1F83E; [0D 23 DB, 05, 05] +1F821; [0D 25 2F, 05, 05] -1F83F; [0D 23 E2, 05, 05] +1F822; [0D 25 36, 05, 05] -1F840; [0D 23 E9, 05, 05] +1F823; [0D 25 3D, 05, 05] -1F841; [0D 23 F0, 05, 05] +1F824; [0D 25 44, 05, 05] -1F842; [0D 23 F7, 05, 05] +1F825; [0D 25 4B, 05, 05] -1F843; [0D 23 FE, 05, 05] +1F826; [0D 25 52, 05, 05] -1F844; [0D 24 07, 05, 05] +1F827; [0D 25 59, 05, 05] -1F845; [0D 24 0E, 05, 05] +1F828; [0D 25 60, 05, 05] -1F846; [0D 24 15, 05, 05] +1F829; [0D 25 67, 05, 05] -1F847; [0D 24 1C, 05, 05] +1F82A; [0D 25 6E, 05, 05] -1F850; [0D 24 23, 05, 05] +1F82B; [0D 25 75, 05, 05] -1F851; [0D 24 2A, 05, 05] +1F82C; [0D 25 7C, 05, 05] -1F852; [0D 24 31, 05, 05] +1F82D; [0D 25 83, 05, 05] -1F853; [0D 24 38, 05, 05] +1F82E; [0D 25 8A, 05, 05] -1F854; [0D 24 3F, 05, 05] +1F82F; [0D 25 91, 05, 05] -1F855; [0D 24 46, 05, 05] +1F830; [0D 25 98, 05, 05] -1F856; [0D 24 4D, 05, 05] +1F831; [0D 25 9F, 05, 05] -1F857; [0D 24 54, 05, 05] +1F832; [0D 25 A6, 05, 05] -1F858; [0D 24 5B, 05, 05] +1F833; [0D 25 AD, 05, 05] -1F859; [0D 24 62, 05, 05] +1F834; [0D 25 B4, 05, 05] -1F860; [0D 24 69, 05, 05] +1F835; [0D 25 BB, 05, 05] -1F861; [0D 24 70, 05, 05] +1F836; [0D 25 C2, 05, 05] -1F862; [0D 24 77, 05, 05] +1F837; [0D 25 C9, 05, 05] -1F863; [0D 24 7E, 05, 05] +1F838; [0D 25 D0, 05, 05] -1F864; [0D 24 85, 05, 05] +1F839; [0D 25 D7, 05, 05] -1F865; [0D 24 8C, 05, 05] +1F83A; [0D 25 DE, 05, 05] -1F866; [0D 24 93, 05, 05] +1F83B; [0D 25 E5, 05, 05] -1F867; [0D 24 9A, 05, 05] +1F83C; [0D 25 EC, 05, 05] -1F868; [0D 24 A1, 05, 05] +1F83D; [0D 25 F3, 05, 05] -1F869; [0D 24 A8, 05, 05] +1F83E; [0D 25 FA, 05, 05] -1F86A; [0D 24 AF, 05, 05] +1F83F; [0D 26 03, 05, 05] -1F86B; [0D 24 B6, 05, 05] +1F840; [0D 26 0A, 05, 05] -1F86C; [0D 24 BD, 05, 05] +1F841; [0D 26 11, 05, 05] -1F86D; [0D 24 C4, 05, 05] +1F842; [0D 26 18, 05, 05] -1F86E; [0D 24 CB, 05, 05] +1F843; [0D 26 1F, 05, 05] -1F86F; [0D 24 D2, 05, 05] +1F844; [0D 26 26, 05, 05] -1F870; [0D 24 D9, 05, 05] +1F845; [0D 26 2D, 05, 05] -1F871; [0D 24 E0, 05, 05] +1F846; [0D 26 34, 05, 05] -1F872; [0D 24 E7, 05, 05] +1F847; [0D 26 3B, 05, 05] -1F873; [0D 24 EE, 05, 05] +1F850; [0D 26 42, 05, 05] -1F874; [0D 24 F5, 05, 05] +1F851; [0D 26 49, 05, 05] -1F875; [0D 24 FC, 05, 05] +1F852; [0D 26 50, 05, 05] -1F876; [0D 25 05, 05, 05] +1F853; [0D 26 57, 05, 05] -1F877; [0D 25 0C, 05, 05] +1F854; [0D 26 5E, 05, 05] -1F878; [0D 25 13, 05, 05] +1F855; [0D 26 65, 05, 05] -1F879; [0D 25 1A, 05, 05] +1F856; [0D 26 6C, 05, 05] -1F87A; [0D 25 21, 05, 05] +1F857; [0D 26 73, 05, 05] -1F87B; [0D 25 28, 05, 05] +1F858; [0D 26 7A, 05, 05] -1F87C; [0D 25 2F, 05, 05] +1F859; [0D 26 81, 05, 05] -1F87D; [0D 25 36, 05, 05] +1F860; [0D 26 88, 05, 05] -1F87E; [0D 25 3D, 05, 05] +1F861; [0D 26 8F, 05, 05] -1F87F; [0D 25 44, 05, 05] +1F862; [0D 26 96, 05, 05] -1F880; [0D 25 4B, 05, 05] +1F863; [0D 26 9D, 05, 05] -1F881; [0D 25 52, 05, 05] +1F864; [0D 26 A4, 05, 05] -1F882; [0D 25 59, 05, 05] +1F865; [0D 26 AB, 05, 05] -1F883; [0D 25 60, 05, 05] +1F866; [0D 26 B2, 05, 05] -1F884; [0D 25 67, 05, 05] +1F867; [0D 26 B9, 05, 05] -1F885; [0D 25 6E, 05, 05] +1F868; [0D 26 C0, 05, 05] -1F886; [0D 25 75, 05, 05] +1F869; [0D 26 C7, 05, 05] -1F887; [0D 25 7C, 05, 05] +1F86A; [0D 26 CE, 05, 05] -1F890; [0D 25 83, 05, 05] +1F86B; [0D 26 D5, 05, 05] -1F891; [0D 25 8A, 05, 05] +1F86C; [0D 26 DC, 05, 05] -1F892; [0D 25 91, 05, 05] +1F86D; [0D 26 E3, 05, 05] -1F893; [0D 25 98, 05, 05] +1F86E; [0D 26 EA, 05, 05] -1F894; [0D 25 9F, 05, 05] +1F86F; [0D 26 F1, 05, 05] -1F895; [0D 25 A6, 05, 05] +1F870; [0D 26 F8, 05, 05] -1F896; [0D 25 AD, 05, 05] +1F871; [0D 26 FF, 05, 05] -1F897; [0D 25 B4, 05, 05] +1F872; [0D 27 08, 05, 05] -1F898; [0D 25 BB, 05, 05] +1F873; [0D 27 0F, 05, 05] -1F899; [0D 25 C2, 05, 05] +1F874; [0D 27 16, 05, 05] -1F89A; [0D 25 C9, 05, 05] +1F875; [0D 27 1D, 05, 05] -1F89B; [0D 25 D0, 05, 05] +1F876; [0D 27 24, 05, 05] -1F89C; [0D 25 D7, 05, 05] +1F877; [0D 27 2B, 05, 05] -1F89D; [0D 25 DE, 05, 05] +1F878; [0D 27 32, 05, 05] -1F89E; [0D 25 E5, 05, 05] +1F879; [0D 27 39, 05, 05] -1F89F; [0D 25 EC, 05, 05] +1F87A; [0D 27 40, 05, 05] -1F8A0; [0D 25 F3, 05, 05] +1F87B; [0D 27 47, 05, 05] -1F8A1; [0D 25 FA, 05, 05] +1F87C; [0D 27 4E, 05, 05] -1F8A2; [0D 26 03, 05, 05] +1F87D; [0D 27 55, 05, 05] -1F8A3; [0D 26 0A, 05, 05] +1F87E; [0D 27 5C, 05, 05] -1F8A4; [0D 26 11, 05, 05] +1F87F; [0D 27 63, 05, 05] -1F8A5; [0D 26 18, 05, 05] +1F880; [0D 27 6A, 05, 05] -1F8A6; [0D 26 1F, 05, 05] +1F881; [0D 27 71, 05, 05] -1F8A7; [0D 26 26, 05, 05] +1F882; [0D 27 78, 05, 05] -1F8A8; [0D 26 2D, 05, 05] +1F883; [0D 27 7F, 05, 05] -1F8A9; [0D 26 34, 05, 05] +1F884; [0D 27 86, 05, 05] -1F8AA; [0D 26 3B, 05, 05] +1F885; [0D 27 8D, 05, 05] -1F8AB; [0D 26 42, 05, 05] +1F886; [0D 27 94, 05, 05] -1F8AC; [0D 26 49, 05, 05] +1F887; [0D 27 9B, 05, 05] -1F8AD; [0D 26 50, 05, 05] +1F890; [0D 27 A2, 05, 05] -1D800; [0D 26 57, 05, 05] +1F891; [0D 27 A9, 05, 05] -1D801; [0D 26 5E, 05, 05] +1F892; [0D 27 B0, 05, 05] -1D802; [0D 26 65, 05, 05] +1F893; [0D 27 B7, 05, 05] -1D803; [0D 26 6C, 05, 05] +1F894; [0D 27 BE, 05, 05] -1D804; [0D 26 73, 05, 05] +1F895; [0D 27 C5, 05, 05] -1D805; [0D 26 7A, 05, 05] +1F896; [0D 27 CC, 05, 05] -1D806; [0D 26 81, 05, 05] +1F897; [0D 27 D3, 05, 05] -1D807; [0D 26 88, 05, 05] +1F898; [0D 27 DA, 05, 05] -1D808; [0D 26 8F, 05, 05] +1F899; [0D 27 E1, 05, 05] -1D809; [0D 26 96, 05, 05] +1F89A; [0D 27 E8, 05, 05] -1D80A; [0D 26 9D, 05, 05] +1F89B; [0D 27 EF, 05, 05] -1D80B; [0D 26 A4, 05, 05] +1F89C; [0D 27 F6, 05, 05] -1D80C; [0D 26 AB, 05, 05] +1F89D; [0D 27 FD, 05, 05] -1D80D; [0D 26 B2, 05, 05] +1F89E; [0D 28 06, 05, 05] -1D80E; [0D 26 B9, 05, 05] +1F89F; [0D 28 0D, 05, 05] -1D80F; [0D 26 C0, 05, 05] +1F8A0; [0D 28 14, 05, 05] -1D810; [0D 26 C7, 05, 05] +1F8A1; [0D 28 1B, 05, 05] -1D811; [0D 26 CE, 05, 05] +1F8A2; [0D 28 22, 05, 05] -1D812; [0D 26 D5, 05, 05] +1F8A3; [0D 28 29, 05, 05] -1D813; [0D 26 DC, 05, 05] +1F8A4; [0D 28 30, 05, 05] -1D814; [0D 26 E3, 05, 05] +1F8A5; [0D 28 37, 05, 05] -1D815; [0D 26 EA, 05, 05] +1F8A6; [0D 28 3E, 05, 05] -1D816; [0D 26 F1, 05, 05] +1F8A7; [0D 28 45, 05, 05] -1D817; [0D 26 F8, 05, 05] +1F8A8; [0D 28 4C, 05, 05] -1D818; [0D 26 FF, 05, 05] +1F8A9; [0D 28 53, 05, 05] -1D819; [0D 27 08, 05, 05] +1F8AA; [0D 28 5A, 05, 05] -1D81A; [0D 27 0F, 05, 05] +1F8AB; [0D 28 61, 05, 05] -1D81B; [0D 27 16, 05, 05] +1F8AC; [0D 28 68, 05, 05] -1D81C; [0D 27 1D, 05, 05] +1F8AD; [0D 28 6F, 05, 05] -1D81D; [0D 27 24, 05, 05] +1D800; [0D 28 76, 05, 05] -1D81E; [0D 27 2B, 05, 05] +1D801; [0D 28 7D, 05, 05] -1D81F; [0D 27 32, 05, 05] +1D802; [0D 28 84, 05, 05] -1D820; [0D 27 39, 05, 05] +1D803; [0D 28 8B, 05, 05] -1D821; [0D 27 40, 05, 05] +1D804; [0D 28 92, 05, 05] -1D822; [0D 27 47, 05, 05] +1D805; [0D 28 99, 05, 05] -1D823; [0D 27 4E, 05, 05] +1D806; [0D 28 A0, 05, 05] -1D824; [0D 27 55, 05, 05] +1D807; [0D 28 A7, 05, 05] -1D825; [0D 27 5C, 05, 05] +1D808; [0D 28 AE, 05, 05] -1D826; [0D 27 63, 05, 05] +1D809; [0D 28 B5, 05, 05] -1D827; [0D 27 6A, 05, 05] +1D80A; [0D 28 BC, 05, 05] -1D828; [0D 27 71, 05, 05] +1D80B; [0D 28 C3, 05, 05] -1D829; [0D 27 78, 05, 05] +1D80C; [0D 28 CA, 05, 05] -1D82A; [0D 27 7F, 05, 05] +1D80D; [0D 28 D1, 05, 05] -1D82B; [0D 27 86, 05, 05] +1D80E; [0D 28 D8, 05, 05] -1D82C; [0D 27 8D, 05, 05] +1D80F; [0D 28 DF, 05, 05] -1D82D; [0D 27 94, 05, 05] +1D810; [0D 28 E6, 05, 05] -1D82E; [0D 27 9B, 05, 05] +1D811; [0D 28 ED, 05, 05] -1D82F; [0D 27 A2, 05, 05] +1D812; [0D 28 F4, 05, 05] -1D830; [0D 27 A9, 05, 05] +1D813; [0D 28 FB, 05, 05] -1D831; [0D 27 B0, 05, 05] +1D814; [0D 29 04, 05, 05] -1D832; [0D 27 B7, 05, 05] +1D815; [0D 29 0B, 05, 05] -1D833; [0D 27 BE, 05, 05] +1D816; [0D 29 12, 05, 05] -1D834; [0D 27 C5, 05, 05] +1D817; [0D 29 19, 05, 05] -1D835; [0D 27 CC, 05, 05] +1D818; [0D 29 20, 05, 05] -1D836; [0D 27 D3, 05, 05] +1D819; [0D 29 27, 05, 05] -1D837; [0D 27 DA, 05, 05] +1D81A; [0D 29 2E, 05, 05] -1D838; [0D 27 E1, 05, 05] +1D81B; [0D 29 35, 05, 05] -1D839; [0D 27 E8, 05, 05] +1D81C; [0D 29 3C, 05, 05] -1D83A; [0D 27 EF, 05, 05] +1D81D; [0D 29 43, 05, 05] -1D83B; [0D 27 F6, 05, 05] +1D81E; [0D 29 4A, 05, 05] -1D83C; [0D 27 FD, 05, 05] +1D81F; [0D 29 51, 05, 05] -1D83D; [0D 28 06, 05, 05] +1D820; [0D 29 58, 05, 05] -1D83E; [0D 28 0D, 05, 05] +1D821; [0D 29 5F, 05, 05] -1D83F; [0D 28 14, 05, 05] +1D822; [0D 29 66, 05, 05] -1D840; [0D 28 1B, 05, 05] +1D823; [0D 29 6D, 05, 05] -1D841; [0D 28 22, 05, 05] +1D824; [0D 29 74, 05, 05] -1D842; [0D 28 29, 05, 05] +1D825; [0D 29 7B, 05, 05] -1D843; [0D 28 30, 05, 05] +1D826; [0D 29 82, 05, 05] -1D844; [0D 28 37, 05, 05] +1D827; [0D 29 89, 05, 05] -1D845; [0D 28 3E, 05, 05] +1D828; [0D 29 90, 05, 05] -1D846; [0D 28 45, 05, 05] +1D829; [0D 29 97, 05, 05] -1D847; [0D 28 4C, 05, 05] +1D82A; [0D 29 9E, 05, 05] -1D848; [0D 28 53, 05, 05] +1D82B; [0D 29 A5, 05, 05] -1D849; [0D 28 5A, 05, 05] +1D82C; [0D 29 AC, 05, 05] -1D84A; [0D 28 61, 05, 05] +1D82D; [0D 29 B3, 05, 05] -1D84B; [0D 28 68, 05, 05] +1D82E; [0D 29 BA, 05, 05] -1D84C; [0D 28 6F, 05, 05] +1D82F; [0D 29 C1, 05, 05] -1D84D; [0D 28 76, 05, 05] +1D830; [0D 29 C8, 05, 05] -1D84E; [0D 28 7D, 05, 05] +1D831; [0D 29 CF, 05, 05] -1D84F; [0D 28 84, 05, 05] +1D832; [0D 29 D6, 05, 05] -1D850; [0D 28 8B, 05, 05] +1D833; [0D 29 DD, 05, 05] -1D851; [0D 28 92, 05, 05] +1D834; [0D 29 E4, 05, 05] -1D852; [0D 28 99, 05, 05] +1D835; [0D 29 EB, 05, 05] -1D853; [0D 28 A0, 05, 05] +1D836; [0D 29 F2, 05, 05] -1D854; [0D 28 A7, 05, 05] +1D837; [0D 29 F9, 05, 05] -1D855; [0D 28 AE, 05, 05] +1D838; [0D 2A 02, 05, 05] -1D856; [0D 28 B5, 05, 05] +1D839; [0D 2A 09, 05, 05] -1D857; [0D 28 BC, 05, 05] +1D83A; [0D 2A 10, 05, 05] -1D858; [0D 28 C3, 05, 05] +1D83B; [0D 2A 17, 05, 05] -1D859; [0D 28 CA, 05, 05] +1D83C; [0D 2A 1E, 05, 05] -1D85A; [0D 28 D1, 05, 05] +1D83D; [0D 2A 25, 05, 05] -1D85B; [0D 28 D8, 05, 05] +1D83E; [0D 2A 2C, 05, 05] -1D85C; [0D 28 DF, 05, 05] +1D83F; [0D 2A 33, 05, 05] -1D85D; [0D 28 E6, 05, 05] +1D840; [0D 2A 3A, 05, 05] -1D85E; [0D 28 ED, 05, 05] +1D841; [0D 2A 41, 05, 05] -1D85F; [0D 28 F4, 05, 05] +1D842; [0D 2A 48, 05, 05] -1D860; [0D 28 FB, 05, 05] +1D843; [0D 2A 4F, 05, 05] -1D861; [0D 29 04, 05, 05] +1D844; [0D 2A 56, 05, 05] -1D862; [0D 29 0B, 05, 05] +1D845; [0D 2A 5D, 05, 05] -1D863; [0D 29 12, 05, 05] +1D846; [0D 2A 64, 05, 05] -1D864; [0D 29 19, 05, 05] +1D847; [0D 2A 6B, 05, 05] -1D865; [0D 29 20, 05, 05] +1D848; [0D 2A 72, 05, 05] -1D866; [0D 29 27, 05, 05] +1D849; [0D 2A 79, 05, 05] -1D867; [0D 29 2E, 05, 05] +1D84A; [0D 2A 80, 05, 05] -1D868; [0D 29 35, 05, 05] +1D84B; [0D 2A 87, 05, 05] -1D869; [0D 29 3C, 05, 05] +1D84C; [0D 2A 8E, 05, 05] -1D86A; [0D 29 43, 05, 05] +1D84D; [0D 2A 95, 05, 05] -1D86B; [0D 29 4A, 05, 05] +1D84E; [0D 2A 9C, 05, 05] -1D86C; [0D 29 51, 05, 05] +1D84F; [0D 2A A3, 05, 05] -1D86D; [0D 29 58, 05, 05] +1D850; [0D 2A AA, 05, 05] -1D86E; [0D 29 5F, 05, 05] +1D851; [0D 2A B1, 05, 05] -1D86F; [0D 29 66, 05, 05] +1D852; [0D 2A B8, 05, 05] -1D870; [0D 29 6D, 05, 05] +1D853; [0D 2A BF, 05, 05] -1D871; [0D 29 74, 05, 05] +1D854; [0D 2A C6, 05, 05] -1D872; [0D 29 7B, 05, 05] +1D855; [0D 2A CD, 05, 05] -1D873; [0D 29 82, 05, 05] +1D856; [0D 2A D4, 05, 05] -1D874; [0D 29 89, 05, 05] +1D857; [0D 2A DB, 05, 05] -1D875; [0D 29 90, 05, 05] +1D858; [0D 2A E2, 05, 05] -1D876; [0D 29 97, 05, 05] +1D859; [0D 2A E9, 05, 05] -1D877; [0D 29 9E, 05, 05] +1D85A; [0D 2A F0, 05, 05] -1D878; [0D 29 A5, 05, 05] +1D85B; [0D 2A F7, 05, 05] -1D879; [0D 29 AC, 05, 05] +1D85C; [0D 2A FE, 05, 05] -1D87A; [0D 29 B3, 05, 05] +1D85D; [0D 2B 07, 05, 05] -1D87B; [0D 29 BA, 05, 05] +1D85E; [0D 2B 0E, 05, 05] -1D87C; [0D 29 C1, 05, 05] +1D85F; [0D 2B 15, 05, 05] -1D87D; [0D 29 C8, 05, 05] +1D860; [0D 2B 1C, 05, 05] -1D87E; [0D 29 CF, 05, 05] +1D861; [0D 2B 23, 05, 05] -1D87F; [0D 29 D6, 05, 05] +1D862; [0D 2B 2A, 05, 05] -1D880; [0D 29 DD, 05, 05] +1D863; [0D 2B 31, 05, 05] -1D881; [0D 29 E4, 05, 05] +1D864; [0D 2B 38, 05, 05] -1D882; [0D 29 EB, 05, 05] +1D865; [0D 2B 3F, 05, 05] -1D883; [0D 29 F2, 05, 05] +1D866; [0D 2B 46, 05, 05] -1D884; [0D 29 F9, 05, 05] +1D867; [0D 2B 4D, 05, 05] -1D885; [0D 2A 02, 05, 05] +1D868; [0D 2B 54, 05, 05] -1D886; [0D 2A 09, 05, 05] +1D869; [0D 2B 5B, 05, 05] -1D887; [0D 2A 10, 05, 05] +1D86A; [0D 2B 62, 05, 05] -1D888; [0D 2A 17, 05, 05] +1D86B; [0D 2B 69, 05, 05] -1D889; [0D 2A 1E, 05, 05] +1D86C; [0D 2B 70, 05, 05] -1D88A; [0D 2A 25, 05, 05] +1D86D; [0D 2B 77, 05, 05] -1D88B; [0D 2A 2C, 05, 05] +1D86E; [0D 2B 7E, 05, 05] -1D88C; [0D 2A 33, 05, 05] +1D86F; [0D 2B 85, 05, 05] -1D88D; [0D 2A 3A, 05, 05] +1D870; [0D 2B 8C, 05, 05] -1D88E; [0D 2A 41, 05, 05] +1D871; [0D 2B 93, 05, 05] -1D88F; [0D 2A 48, 05, 05] +1D872; [0D 2B 9A, 05, 05] -1D890; [0D 2A 4F, 05, 05] +1D873; [0D 2B A1, 05, 05] -1D891; [0D 2A 56, 05, 05] +1D874; [0D 2B A8, 05, 05] -1D892; [0D 2A 5D, 05, 05] +1D875; [0D 2B AF, 05, 05] -1D893; [0D 2A 64, 05, 05] +1D876; [0D 2B B6, 05, 05] -1D894; [0D 2A 6B, 05, 05] +1D877; [0D 2B BD, 05, 05] -1D895; [0D 2A 72, 05, 05] +1D878; [0D 2B C4, 05, 05] -1D896; [0D 2A 79, 05, 05] +1D879; [0D 2B CB, 05, 05] -1D897; [0D 2A 80, 05, 05] +1D87A; [0D 2B D2, 05, 05] -1D898; [0D 2A 87, 05, 05] +1D87B; [0D 2B D9, 05, 05] -1D899; [0D 2A 8E, 05, 05] +1D87C; [0D 2B E0, 05, 05] -1D89A; [0D 2A 95, 05, 05] +1D87D; [0D 2B E7, 05, 05] -1D89B; [0D 2A 9C, 05, 05] +1D87E; [0D 2B EE, 05, 05] -1D89C; [0D 2A A3, 05, 05] +1D87F; [0D 2B F5, 05, 05] -1D89D; [0D 2A AA, 05, 05] +1D880; [0D 2B FC, 05, 05] -1D89E; [0D 2A B1, 05, 05] +1D881; [0D 2C 05, 05, 05] -1D89F; [0D 2A B8, 05, 05] +1D882; [0D 2C 0C, 05, 05] -1D8A0; [0D 2A BF, 05, 05] +1D883; [0D 2C 13, 05, 05] -1D8A1; [0D 2A C6, 05, 05] +1D884; [0D 2C 1A, 05, 05] -1D8A2; [0D 2A CD, 05, 05] +1D885; [0D 2C 21, 05, 05] -1D8A3; [0D 2A D4, 05, 05] +1D886; [0D 2C 28, 05, 05] -1D8A4; [0D 2A DB, 05, 05] +1D887; [0D 2C 2F, 05, 05] -1D8A5; [0D 2A E2, 05, 05] +1D888; [0D 2C 36, 05, 05] -1D8A6; [0D 2A E9, 05, 05] +1D889; [0D 2C 3D, 05, 05] -1D8A7; [0D 2A F0, 05, 05] +1D88A; [0D 2C 44, 05, 05] -1D8A8; [0D 2A F7, 05, 05] +1D88B; [0D 2C 4B, 05, 05] -1D8A9; [0D 2A FE, 05, 05] +1D88C; [0D 2C 52, 05, 05] -1D8AA; [0D 2B 07, 05, 05] +1D88D; [0D 2C 59, 05, 05] -1D8AB; [0D 2B 0E, 05, 05] +1D88E; [0D 2C 60, 05, 05] -1D8AC; [0D 2B 15, 05, 05] +1D88F; [0D 2C 67, 05, 05] -1D8AD; [0D 2B 1C, 05, 05] +1D890; [0D 2C 6E, 05, 05] -1D8AE; [0D 2B 23, 05, 05] +1D891; [0D 2C 75, 05, 05] -1D8AF; [0D 2B 2A, 05, 05] +1D892; [0D 2C 7C, 05, 05] -1D8B0; [0D 2B 31, 05, 05] +1D893; [0D 2C 83, 05, 05] -1D8B1; [0D 2B 38, 05, 05] +1D894; [0D 2C 8A, 05, 05] -1D8B2; [0D 2B 3F, 05, 05] +1D895; [0D 2C 91, 05, 05] -1D8B3; [0D 2B 46, 05, 05] +1D896; [0D 2C 98, 05, 05] -1D8B4; [0D 2B 4D, 05, 05] +1D897; [0D 2C 9F, 05, 05] -1D8B5; [0D 2B 54, 05, 05] +1D898; [0D 2C A6, 05, 05] -1D8B6; [0D 2B 5B, 05, 05] +1D899; [0D 2C AD, 05, 05] -1D8B7; [0D 2B 62, 05, 05] +1D89A; [0D 2C B4, 05, 05] -1D8B8; [0D 2B 69, 05, 05] +1D89B; [0D 2C BB, 05, 05] -1D8B9; [0D 2B 70, 05, 05] +1D89C; [0D 2C C2, 05, 05] -1D8BA; [0D 2B 77, 05, 05] +1D89D; [0D 2C C9, 05, 05] -1D8BB; [0D 2B 7E, 05, 05] +1D89E; [0D 2C D0, 05, 05] -1D8BC; [0D 2B 85, 05, 05] +1D89F; [0D 2C D7, 05, 05] -1D8BD; [0D 2B 8C, 05, 05] +1D8A0; [0D 2C DE, 05, 05] -1D8BE; [0D 2B 93, 05, 05] +1D8A1; [0D 2C E5, 05, 05] -1D8BF; [0D 2B 9A, 05, 05] +1D8A2; [0D 2C EC, 05, 05] -1D8C0; [0D 2B A1, 05, 05] +1D8A3; [0D 2C F3, 05, 05] -1D8C1; [0D 2B A8, 05, 05] +1D8A4; [0D 2C FA, 05, 05] -1D8C2; [0D 2B AF, 05, 05] +1D8A5; [0D 2D 03, 05, 05] -1D8C3; [0D 2B B6, 05, 05] +1D8A6; [0D 2D 0A, 05, 05] -1D8C4; [0D 2B BD, 05, 05] +1D8A7; [0D 2D 11, 05, 05] -1D8C5; [0D 2B C4, 05, 05] +1D8A8; [0D 2D 18, 05, 05] -1D8C6; [0D 2B CB, 05, 05] +1D8A9; [0D 2D 1F, 05, 05] -1D8C7; [0D 2B D2, 05, 05] +1D8AA; [0D 2D 26, 05, 05] -1D8C8; [0D 2B D9, 05, 05] +1D8AB; [0D 2D 2D, 05, 05] -1D8C9; [0D 2B E0, 05, 05] +1D8AC; [0D 2D 34, 05, 05] -1D8CA; [0D 2B E7, 05, 05] +1D8AD; [0D 2D 3B, 05, 05] -1D8CB; [0D 2B EE, 05, 05] +1D8AE; [0D 2D 42, 05, 05] -1D8CC; [0D 2B F5, 05, 05] +1D8AF; [0D 2D 49, 05, 05] -1D8CD; [0D 2B FC, 05, 05] +1D8B0; [0D 2D 50, 05, 05] -1D8CE; [0D 2C 05, 05, 05] +1D8B1; [0D 2D 57, 05, 05] -1D8CF; [0D 2C 0C, 05, 05] +1D8B2; [0D 2D 5E, 05, 05] -1D8D0; [0D 2C 13, 05, 05] +1D8B3; [0D 2D 65, 05, 05] -1D8D1; [0D 2C 1A, 05, 05] +1D8B4; [0D 2D 6C, 05, 05] -1D8D2; [0D 2C 21, 05, 05] +1D8B5; [0D 2D 73, 05, 05] -1D8D3; [0D 2C 28, 05, 05] +1D8B6; [0D 2D 7A, 05, 05] -1D8D4; [0D 2C 2F, 05, 05] +1D8B7; [0D 2D 81, 05, 05] -1D8D5; [0D 2C 36, 05, 05] +1D8B8; [0D 2D 88, 05, 05] -1D8D6; [0D 2C 3D, 05, 05] +1D8B9; [0D 2D 8F, 05, 05] -1D8D7; [0D 2C 44, 05, 05] +1D8BA; [0D 2D 96, 05, 05] -1D8D8; [0D 2C 4B, 05, 05] +1D8BB; [0D 2D 9D, 05, 05] -1D8D9; [0D 2C 52, 05, 05] +1D8BC; [0D 2D A4, 05, 05] -1D8DA; [0D 2C 59, 05, 05] +1D8BD; [0D 2D AB, 05, 05] -1D8DB; [0D 2C 60, 05, 05] +1D8BE; [0D 2D B2, 05, 05] -1D8DC; [0D 2C 67, 05, 05] +1D8BF; [0D 2D B9, 05, 05] -1D8DD; [0D 2C 6E, 05, 05] +1D8C0; [0D 2D C0, 05, 05] -1D8DE; [0D 2C 75, 05, 05] +1D8C1; [0D 2D C7, 05, 05] -1D8DF; [0D 2C 7C, 05, 05] +1D8C2; [0D 2D CE, 05, 05] -1D8E0; [0D 2C 83, 05, 05] +1D8C3; [0D 2D D5, 05, 05] -1D8E1; [0D 2C 8A, 05, 05] +1D8C4; [0D 2D DC, 05, 05] -1D8E2; [0D 2C 91, 05, 05] +1D8C5; [0D 2D E3, 05, 05] -1D8E3; [0D 2C 98, 05, 05] +1D8C6; [0D 2D EA, 05, 05] -1D8E4; [0D 2C 9F, 05, 05] +1D8C7; [0D 2D F1, 05, 05] -1D8E5; [0D 2C A6, 05, 05] +1D8C8; [0D 2D F8, 05, 05] -1D8E6; [0D 2C AD, 05, 05] +1D8C9; [0D 2D FF, 05, 05] -1D8E7; [0D 2C B4, 05, 05] +1D8CA; [0D 2E 08, 05, 05] -1D8E8; [0D 2C BB, 05, 05] +1D8CB; [0D 2E 0F, 05, 05] -1D8E9; [0D 2C C2, 05, 05] +1D8CC; [0D 2E 16, 05, 05] -1D8EA; [0D 2C C9, 05, 05] +1D8CD; [0D 2E 1D, 05, 05] -1D8EB; [0D 2C D0, 05, 05] +1D8CE; [0D 2E 24, 05, 05] -1D8EC; [0D 2C D7, 05, 05] +1D8CF; [0D 2E 2B, 05, 05] -1D8ED; [0D 2C DE, 05, 05] +1D8D0; [0D 2E 32, 05, 05] -1D8EE; [0D 2C E5, 05, 05] +1D8D1; [0D 2E 39, 05, 05] -1D8EF; [0D 2C EC, 05, 05] +1D8D2; [0D 2E 40, 05, 05] -1D8F0; [0D 2C F3, 05, 05] +1D8D3; [0D 2E 47, 05, 05] -1D8F1; [0D 2C FA, 05, 05] +1D8D4; [0D 2E 4E, 05, 05] -1D8F2; [0D 2D 03, 05, 05] +1D8D5; [0D 2E 55, 05, 05] -1D8F3; [0D 2D 0A, 05, 05] +1D8D6; [0D 2E 5C, 05, 05] -1D8F4; [0D 2D 11, 05, 05] +1D8D7; [0D 2E 63, 05, 05] -1D8F5; [0D 2D 18, 05, 05] +1D8D8; [0D 2E 6A, 05, 05] -1D8F6; [0D 2D 1F, 05, 05] +1D8D9; [0D 2E 71, 05, 05] -1D8F7; [0D 2D 26, 05, 05] +1D8DA; [0D 2E 78, 05, 05] -1D8F8; [0D 2D 2D, 05, 05] +1D8DB; [0D 2E 7F, 05, 05] -1D8F9; [0D 2D 34, 05, 05] +1D8DC; [0D 2E 86, 05, 05] -1D8FA; [0D 2D 3B, 05, 05] +1D8DD; [0D 2E 8D, 05, 05] -1D8FB; [0D 2D 42, 05, 05] +1D8DE; [0D 2E 94, 05, 05] -1D8FC; [0D 2D 49, 05, 05] +1D8DF; [0D 2E 9B, 05, 05] -1D8FD; [0D 2D 50, 05, 05] +1D8E0; [0D 2E A2, 05, 05] -1D8FE; [0D 2D 57, 05, 05] +1D8E1; [0D 2E A9, 05, 05] -1D8FF; [0D 2D 5E, 05, 05] +1D8E2; [0D 2E B0, 05, 05] -1D900; [0D 2D 65, 05, 05] +1D8E3; [0D 2E B7, 05, 05] -1D901; [0D 2D 6C, 05, 05] +1D8E4; [0D 2E BE, 05, 05] -1D902; [0D 2D 73, 05, 05] +1D8E5; [0D 2E C5, 05, 05] -1D903; [0D 2D 7A, 05, 05] +1D8E6; [0D 2E CC, 05, 05] -1D904; [0D 2D 81, 05, 05] +1D8E7; [0D 2E D3, 05, 05] -1D905; [0D 2D 88, 05, 05] +1D8E8; [0D 2E DA, 05, 05] -1D906; [0D 2D 8F, 05, 05] +1D8E9; [0D 2E E1, 05, 05] -1D907; [0D 2D 96, 05, 05] +1D8EA; [0D 2E E8, 05, 05] -1D908; [0D 2D 9D, 05, 05] +1D8EB; [0D 2E EF, 05, 05] -1D909; [0D 2D A4, 05, 05] +1D8EC; [0D 2E F6, 05, 05] -1D90A; [0D 2D AB, 05, 05] +1D8ED; [0D 2E FD, 05, 05] -1D90B; [0D 2D B2, 05, 05] +1D8EE; [0D 2F 06, 05, 05] -1D90C; [0D 2D B9, 05, 05] +1D8EF; [0D 2F 0D, 05, 05] -1D90D; [0D 2D C0, 05, 05] +1D8F0; [0D 2F 14, 05, 05] -1D90E; [0D 2D C7, 05, 05] +1D8F1; [0D 2F 1B, 05, 05] -1D90F; [0D 2D CE, 05, 05] +1D8F2; [0D 2F 22, 05, 05] -1D910; [0D 2D D5, 05, 05] +1D8F3; [0D 2F 29, 05, 05] -1D911; [0D 2D DC, 05, 05] +1D8F4; [0D 2F 30, 05, 05] -1D912; [0D 2D E3, 05, 05] +1D8F5; [0D 2F 37, 05, 05] -1D913; [0D 2D EA, 05, 05] +1D8F6; [0D 2F 3E, 05, 05] -1D914; [0D 2D F1, 05, 05] +1D8F7; [0D 2F 45, 05, 05] -1D915; [0D 2D F8, 05, 05] +1D8F8; [0D 2F 4C, 05, 05] -1D916; [0D 2D FF, 05, 05] +1D8F9; [0D 2F 53, 05, 05] -1D917; [0D 2E 08, 05, 05] +1D8FA; [0D 2F 5A, 05, 05] -1D918; [0D 2E 0F, 05, 05] +1D8FB; [0D 2F 61, 05, 05] -1D919; [0D 2E 16, 05, 05] +1D8FC; [0D 2F 68, 05, 05] -1D91A; [0D 2E 1D, 05, 05] +1D8FD; [0D 2F 6F, 05, 05] -1D91B; [0D 2E 24, 05, 05] +1D8FE; [0D 2F 76, 05, 05] -1D91C; [0D 2E 2B, 05, 05] +1D8FF; [0D 2F 7D, 05, 05] -1D91D; [0D 2E 32, 05, 05] +1D900; [0D 2F 84, 05, 05] -1D91E; [0D 2E 39, 05, 05] +1D901; [0D 2F 8B, 05, 05] -1D91F; [0D 2E 40, 05, 05] +1D902; [0D 2F 92, 05, 05] -1D920; [0D 2E 47, 05, 05] +1D903; [0D 2F 99, 05, 05] -1D921; [0D 2E 4E, 05, 05] +1D904; [0D 2F A0, 05, 05] -1D922; [0D 2E 55, 05, 05] +1D905; [0D 2F A7, 05, 05] -1D923; [0D 2E 5C, 05, 05] +1D906; [0D 2F AE, 05, 05] -1D924; [0D 2E 63, 05, 05] +1D907; [0D 2F B5, 05, 05] -1D925; [0D 2E 6A, 05, 05] +1D908; [0D 2F BC, 05, 05] -1D926; [0D 2E 71, 05, 05] +1D909; [0D 2F C3, 05, 05] -1D927; [0D 2E 78, 05, 05] +1D90A; [0D 2F CA, 05, 05] -1D928; [0D 2E 7F, 05, 05] +1D90B; [0D 2F D1, 05, 05] -1D929; [0D 2E 86, 05, 05] +1D90C; [0D 2F D8, 05, 05] -1D92A; [0D 2E 8D, 05, 05] +1D90D; [0D 2F DF, 05, 05] -1D92B; [0D 2E 94, 05, 05] +1D90E; [0D 2F E6, 05, 05] -1D92C; [0D 2E 9B, 05, 05] +1D90F; [0D 2F ED, 05, 05] -1D92D; [0D 2E A2, 05, 05] +1D910; [0D 2F F4, 05, 05] -1D92E; [0D 2E A9, 05, 05] +1D911; [0D 2F FB, 05, 05] -1D92F; [0D 2E B0, 05, 05] +1D912; [0D 30 04, 05, 05] -1D930; [0D 2E B7, 05, 05] +1D913; [0D 30 0B, 05, 05] -1D931; [0D 2E BE, 05, 05] +1D914; [0D 30 12, 05, 05] -1D932; [0D 2E C5, 05, 05] +1D915; [0D 30 19, 05, 05] -1D933; [0D 2E CC, 05, 05] +1D916; [0D 30 20, 05, 05] -1D934; [0D 2E D3, 05, 05] +1D917; [0D 30 27, 05, 05] -1D935; [0D 2E DA, 05, 05] +1D918; [0D 30 2E, 05, 05] -1D936; [0D 2E E1, 05, 05] +1D919; [0D 30 35, 05, 05] -1D937; [0D 2E E8, 05, 05] +1D91A; [0D 30 3C, 05, 05] -1D938; [0D 2E EF, 05, 05] +1D91B; [0D 30 43, 05, 05] -1D939; [0D 2E F6, 05, 05] +1D91C; [0D 30 4A, 05, 05] -1D93A; [0D 2E FD, 05, 05] +1D91D; [0D 30 51, 05, 05] -1D93B; [0D 2F 06, 05, 05] +1D91E; [0D 30 58, 05, 05] -1D93C; [0D 2F 0D, 05, 05] +1D91F; [0D 30 5F, 05, 05] -1D93D; [0D 2F 14, 05, 05] +1D920; [0D 30 66, 05, 05] -1D93E; [0D 2F 1B, 05, 05] +1D921; [0D 30 6D, 05, 05] -1D93F; [0D 2F 22, 05, 05] +1D922; [0D 30 74, 05, 05] -1D940; [0D 2F 29, 05, 05] +1D923; [0D 30 7B, 05, 05] -1D941; [0D 2F 30, 05, 05] +1D924; [0D 30 82, 05, 05] -1D942; [0D 2F 37, 05, 05] +1D925; [0D 30 89, 05, 05] -1D943; [0D 2F 3E, 05, 05] +1D926; [0D 30 90, 05, 05] -1D944; [0D 2F 45, 05, 05] +1D927; [0D 30 97, 05, 05] -1D945; [0D 2F 4C, 05, 05] +1D928; [0D 30 9E, 05, 05] -1D946; [0D 2F 53, 05, 05] +1D929; [0D 30 A5, 05, 05] -1D947; [0D 2F 5A, 05, 05] +1D92A; [0D 30 AC, 05, 05] -1D948; [0D 2F 61, 05, 05] +1D92B; [0D 30 B3, 05, 05] -1D949; [0D 2F 68, 05, 05] +1D92C; [0D 30 BA, 05, 05] -1D94A; [0D 2F 6F, 05, 05] +1D92D; [0D 30 C1, 05, 05] -1D94B; [0D 2F 76, 05, 05] +1D92E; [0D 30 C8, 05, 05] -1D94C; [0D 2F 7D, 05, 05] +1D92F; [0D 30 CF, 05, 05] -1D94D; [0D 2F 84, 05, 05] +1D930; [0D 30 D6, 05, 05] -1D94E; [0D 2F 8B, 05, 05] +1D931; [0D 30 DD, 05, 05] -1D94F; [0D 2F 92, 05, 05] +1D932; [0D 30 E4, 05, 05] -1D950; [0D 2F 99, 05, 05] +1D933; [0D 30 EB, 05, 05] -1D951; [0D 2F A0, 05, 05] +1D934; [0D 30 F2, 05, 05] -1D952; [0D 2F A7, 05, 05] +1D935; [0D 30 F9, 05, 05] -1D953; [0D 2F AE, 05, 05] +1D936; [0D 31 02, 05, 05] -1D954; [0D 2F B5, 05, 05] +1D937; [0D 31 09, 05, 05] -1D955; [0D 2F BC, 05, 05] +1D938; [0D 31 10, 05, 05] -1D956; [0D 2F C3, 05, 05] +1D939; [0D 31 17, 05, 05] -1D957; [0D 2F CA, 05, 05] +1D93A; [0D 31 1E, 05, 05] -1D958; [0D 2F D1, 05, 05] +1D93B; [0D 31 25, 05, 05] -1D959; [0D 2F D8, 05, 05] +1D93C; [0D 31 2C, 05, 05] -1D95A; [0D 2F DF, 05, 05] +1D93D; [0D 31 33, 05, 05] -1D95B; [0D 2F E6, 05, 05] +1D93E; [0D 31 3A, 05, 05] -1D95C; [0D 2F ED, 05, 05] +1D93F; [0D 31 41, 05, 05] -1D95D; [0D 2F F4, 05, 05] +1D940; [0D 31 48, 05, 05] -1D95E; [0D 2F FB, 05, 05] +1D941; [0D 31 4F, 05, 05] -1D95F; [0D 30 04, 05, 05] +1D942; [0D 31 56, 05, 05] -1D960; [0D 30 0B, 05, 05] +1D943; [0D 31 5D, 05, 05] -1D961; [0D 30 12, 05, 05] +1D944; [0D 31 64, 05, 05] -1D962; [0D 30 19, 05, 05] +1D945; [0D 31 6B, 05, 05] -1D963; [0D 30 20, 05, 05] +1D946; [0D 31 72, 05, 05] -1D964; [0D 30 27, 05, 05] +1D947; [0D 31 79, 05, 05] -1D965; [0D 30 2E, 05, 05] +1D948; [0D 31 80, 05, 05] -1D966; [0D 30 35, 05, 05] +1D949; [0D 31 87, 05, 05] -1D967; [0D 30 3C, 05, 05] +1D94A; [0D 31 8E, 05, 05] -1D968; [0D 30 43, 05, 05] +1D94B; [0D 31 95, 05, 05] -1D969; [0D 30 4A, 05, 05] +1D94C; [0D 31 9C, 05, 05] -1D96A; [0D 30 51, 05, 05] +1D94D; [0D 31 A3, 05, 05] -1D96B; [0D 30 58, 05, 05] +1D94E; [0D 31 AA, 05, 05] -1D96C; [0D 30 5F, 05, 05] +1D94F; [0D 31 B1, 05, 05] -1D96D; [0D 30 66, 05, 05] +1D950; [0D 31 B8, 05, 05] -1D96E; [0D 30 6D, 05, 05] +1D951; [0D 31 BF, 05, 05] -1D96F; [0D 30 74, 05, 05] +1D952; [0D 31 C6, 05, 05] -1D970; [0D 30 7B, 05, 05] +1D953; [0D 31 CD, 05, 05] -1D971; [0D 30 82, 05, 05] +1D954; [0D 31 D4, 05, 05] -1D972; [0D 30 89, 05, 05] +1D955; [0D 31 DB, 05, 05] -1D973; [0D 30 90, 05, 05] +1D956; [0D 31 E2, 05, 05] -1D974; [0D 30 97, 05, 05] +1D957; [0D 31 E9, 05, 05] -1D975; [0D 30 9E, 05, 05] +1D958; [0D 31 F0, 05, 05] -1D976; [0D 30 A5, 05, 05] +1D959; [0D 31 F7, 05, 05] -1D977; [0D 30 AC, 05, 05] +1D95A; [0D 31 FE, 05, 05] -1D978; [0D 30 B3, 05, 05] +1D95B; [0D 32 07, 05, 05] -1D979; [0D 30 BA, 05, 05] +1D95C; [0D 32 0E, 05, 05] -1D97A; [0D 30 C1, 05, 05] +1D95D; [0D 32 15, 05, 05] -1D97B; [0D 30 C8, 05, 05] +1D95E; [0D 32 1C, 05, 05] -1D97C; [0D 30 CF, 05, 05] +1D95F; [0D 32 23, 05, 05] -1D97D; [0D 30 D6, 05, 05] +1D960; [0D 32 2A, 05, 05] -1D97E; [0D 30 DD, 05, 05] +1D961; [0D 32 31, 05, 05] -1D97F; [0D 30 E4, 05, 05] +1D962; [0D 32 38, 05, 05] -1D980; [0D 30 EB, 05, 05] +1D963; [0D 32 3F, 05, 05] -1D981; [0D 30 F2, 05, 05] +1D964; [0D 32 46, 05, 05] -1D982; [0D 30 F9, 05, 05] +1D965; [0D 32 4D, 05, 05] -1D983; [0D 31 02, 05, 05] +1D966; [0D 32 54, 05, 05] -1D984; [0D 31 09, 05, 05] +1D967; [0D 32 5B, 05, 05] -1D985; [0D 31 10, 05, 05] +1D968; [0D 32 62, 05, 05] -1D986; [0D 31 17, 05, 05] +1D969; [0D 32 69, 05, 05] -1D987; [0D 31 1E, 05, 05] +1D96A; [0D 32 70, 05, 05] -1D988; [0D 31 25, 05, 05] +1D96B; [0D 32 77, 05, 05] -1D989; [0D 31 2C, 05, 05] +1D96C; [0D 32 7E, 05, 05] -1D98A; [0D 31 33, 05, 05] +1D96D; [0D 32 85, 05, 05] -1D98B; [0D 31 3A, 05, 05] +1D96E; [0D 32 8C, 05, 05] -1D98C; [0D 31 41, 05, 05] +1D96F; [0D 32 93, 05, 05] -1D98D; [0D 31 48, 05, 05] +1D970; [0D 32 9A, 05, 05] -1D98E; [0D 31 4F, 05, 05] +1D971; [0D 32 A1, 05, 05] -1D98F; [0D 31 56, 05, 05] +1D972; [0D 32 A8, 05, 05] -1D990; [0D 31 5D, 05, 05] +1D973; [0D 32 AF, 05, 05] -1D991; [0D 31 64, 05, 05] +1D974; [0D 32 B6, 05, 05] -1D992; [0D 31 6B, 05, 05] +1D975; [0D 32 BD, 05, 05] -1D993; [0D 31 72, 05, 05] +1D976; [0D 32 C4, 05, 05] -1D994; [0D 31 79, 05, 05] +1D977; [0D 32 CB, 05, 05] -1D995; [0D 31 80, 05, 05] +1D978; [0D 32 D2, 05, 05] -1D996; [0D 31 87, 05, 05] +1D979; [0D 32 D9, 05, 05] -1D997; [0D 31 8E, 05, 05] +1D97A; [0D 32 E0, 05, 05] -1D998; [0D 31 95, 05, 05] +1D97B; [0D 32 E7, 05, 05] -1D999; [0D 31 9C, 05, 05] +1D97C; [0D 32 EE, 05, 05] -1D99A; [0D 31 A3, 05, 05] +1D97D; [0D 32 F5, 05, 05] -1D99B; [0D 31 AA, 05, 05] +1D97E; [0D 32 FC, 05, 05] -1D99C; [0D 31 B1, 05, 05] +1D97F; [0D 33 05, 05, 05] -1D99D; [0D 31 B8, 05, 05] +1D980; [0D 33 0C, 05, 05] -1D99E; [0D 31 BF, 05, 05] +1D981; [0D 33 13, 05, 05] -1D99F; [0D 31 C6, 05, 05] +1D982; [0D 33 1A, 05, 05] -1D9A0; [0D 31 CD, 05, 05] +1D983; [0D 33 21, 05, 05] -1D9A1; [0D 31 D4, 05, 05] +1D984; [0D 33 28, 05, 05] -1D9A2; [0D 31 DB, 05, 05] +1D985; [0D 33 2F, 05, 05] -1D9A3; [0D 31 E2, 05, 05] +1D986; [0D 33 36, 05, 05] -1D9A4; [0D 31 E9, 05, 05] +1D987; [0D 33 3D, 05, 05] -1D9A5; [0D 31 F0, 05, 05] +1D988; [0D 33 44, 05, 05] -1D9A6; [0D 31 F7, 05, 05] +1D989; [0D 33 4B, 05, 05] -1D9A7; [0D 31 FE, 05, 05] +1D98A; [0D 33 52, 05, 05] -1D9A8; [0D 32 07, 05, 05] +1D98B; [0D 33 59, 05, 05] -1D9A9; [0D 32 0E, 05, 05] +1D98C; [0D 33 60, 05, 05] -1D9AA; [0D 32 15, 05, 05] +1D98D; [0D 33 67, 05, 05] -1D9AB; [0D 32 1C, 05, 05] +1D98E; [0D 33 6E, 05, 05] -1D9AC; [0D 32 23, 05, 05] +1D98F; [0D 33 75, 05, 05] -1D9AD; [0D 32 2A, 05, 05] +1D990; [0D 33 7C, 05, 05] -1D9AE; [0D 32 31, 05, 05] +1D991; [0D 33 83, 05, 05] -1D9AF; [0D 32 38, 05, 05] +1D992; [0D 33 8A, 05, 05] -1D9B0; [0D 32 3F, 05, 05] +1D993; [0D 33 91, 05, 05] -1D9B1; [0D 32 46, 05, 05] +1D994; [0D 33 98, 05, 05] -1D9B2; [0D 32 4D, 05, 05] +1D995; [0D 33 9F, 05, 05] -1D9B3; [0D 32 54, 05, 05] +1D996; [0D 33 A6, 05, 05] -1D9B4; [0D 32 5B, 05, 05] +1D997; [0D 33 AD, 05, 05] -1D9B5; [0D 32 62, 05, 05] +1D998; [0D 33 B4, 05, 05] -1D9B6; [0D 32 69, 05, 05] +1D999; [0D 33 BB, 05, 05] -1D9B7; [0D 32 70, 05, 05] +1D99A; [0D 33 C2, 05, 05] -1D9B8; [0D 32 77, 05, 05] +1D99B; [0D 33 C9, 05, 05] -1D9B9; [0D 32 7E, 05, 05] +1D99C; [0D 33 D0, 05, 05] -1D9BA; [0D 32 85, 05, 05] +1D99D; [0D 33 D7, 05, 05] -1D9BB; [0D 32 8C, 05, 05] +1D99E; [0D 33 DE, 05, 05] -1D9BC; [0D 32 93, 05, 05] +1D99F; [0D 33 E5, 05, 05] -1D9BD; [0D 32 9A, 05, 05] +1D9A0; [0D 33 EC, 05, 05] -1D9BE; [0D 32 A1, 05, 05] +1D9A1; [0D 33 F3, 05, 05] -1D9BF; [0D 32 A8, 05, 05] +1D9A2; [0D 33 FA, 05, 05] -1D9C0; [0D 32 AF, 05, 05] +1D9A3; [0D 34 03, 05, 05] -1D9C1; [0D 32 B6, 05, 05] +1D9A4; [0D 34 0A, 05, 05] -1D9C2; [0D 32 BD, 05, 05] +1D9A5; [0D 34 11, 05, 05] -1D9C3; [0D 32 C4, 05, 05] +1D9A6; [0D 34 18, 05, 05] -1D9C4; [0D 32 CB, 05, 05] +1D9A7; [0D 34 1F, 05, 05] -1D9C5; [0D 32 D2, 05, 05] +1D9A8; [0D 34 26, 05, 05] -1D9C6; [0D 32 D9, 05, 05] +1D9A9; [0D 34 2D, 05, 05] -1D9C7; [0D 32 E0, 05, 05] +1D9AA; [0D 34 34, 05, 05] -1D9C8; [0D 32 E7, 05, 05] +1D9AB; [0D 34 3B, 05, 05] -1D9C9; [0D 32 EE, 05, 05] +1D9AC; [0D 34 42, 05, 05] -1D9CA; [0D 32 F5, 05, 05] +1D9AD; [0D 34 49, 05, 05] -1D9CB; [0D 32 FC, 05, 05] +1D9AE; [0D 34 50, 05, 05] -1D9CC; [0D 33 05, 05, 05] +1D9AF; [0D 34 57, 05, 05] -1D9CD; [0D 33 0C, 05, 05] +1D9B0; [0D 34 5E, 05, 05] -1D9CE; [0D 33 13, 05, 05] +1D9B1; [0D 34 65, 05, 05] -1D9CF; [0D 33 1A, 05, 05] +1D9B2; [0D 34 6C, 05, 05] -1D9D0; [0D 33 21, 05, 05] +1D9B3; [0D 34 73, 05, 05] -1D9D1; [0D 33 28, 05, 05] +1D9B4; [0D 34 7A, 05, 05] -1D9D2; [0D 33 2F, 05, 05] +1D9B5; [0D 34 81, 05, 05] -1D9D3; [0D 33 36, 05, 05] +1D9B6; [0D 34 88, 05, 05] -1D9D4; [0D 33 3D, 05, 05] +1D9B7; [0D 34 8F, 05, 05] -1D9D5; [0D 33 44, 05, 05] +1D9B8; [0D 34 96, 05, 05] -1D9D6; [0D 33 4B, 05, 05] +1D9B9; [0D 34 9D, 05, 05] -1D9D7; [0D 33 52, 05, 05] +1D9BA; [0D 34 A4, 05, 05] -1D9D8; [0D 33 59, 05, 05] +1D9BB; [0D 34 AB, 05, 05] -1D9D9; [0D 33 60, 05, 05] +1D9BC; [0D 34 B2, 05, 05] -1D9DA; [0D 33 67, 05, 05] +1D9BD; [0D 34 B9, 05, 05] -1D9DB; [0D 33 6E, 05, 05] +1D9BE; [0D 34 C0, 05, 05] -1D9DC; [0D 33 75, 05, 05] +1D9BF; [0D 34 C7, 05, 05] -1D9DD; [0D 33 7C, 05, 05] +1D9C0; [0D 34 CE, 05, 05] -1D9DE; [0D 33 83, 05, 05] +1D9C1; [0D 34 D5, 05, 05] -1D9DF; [0D 33 8A, 05, 05] +1D9C2; [0D 34 DC, 05, 05] -1D9E0; [0D 33 91, 05, 05] +1D9C3; [0D 34 E3, 05, 05] -1D9E1; [0D 33 98, 05, 05] +1D9C4; [0D 34 EA, 05, 05] -1D9E2; [0D 33 9F, 05, 05] +1D9C5; [0D 34 F1, 05, 05] -1D9E3; [0D 33 A6, 05, 05] +1D9C6; [0D 34 F8, 05, 05] -1D9E4; [0D 33 AD, 05, 05] +1D9C7; [0D 34 FF, 05, 05] -1D9E5; [0D 33 B4, 05, 05] +1D9C8; [0D 35 08, 05, 05] -1D9E6; [0D 33 BB, 05, 05] +1D9C9; [0D 35 0F, 05, 05] -1D9E7; [0D 33 C2, 05, 05] +1D9CA; [0D 35 16, 05, 05] -1D9E8; [0D 33 C9, 05, 05] +1D9CB; [0D 35 1D, 05, 05] -1D9E9; [0D 33 D0, 05, 05] +1D9CC; [0D 35 24, 05, 05] -1D9EA; [0D 33 D7, 05, 05] +1D9CD; [0D 35 2B, 05, 05] -1D9EB; [0D 33 DE, 05, 05] +1D9CE; [0D 35 32, 05, 05] -1D9EC; [0D 33 E5, 05, 05] +1D9CF; [0D 35 39, 05, 05] -1D9ED; [0D 33 EC, 05, 05] +1D9D0; [0D 35 40, 05, 05] -1D9EE; [0D 33 F3, 05, 05] +1D9D1; [0D 35 47, 05, 05] -1D9EF; [0D 33 FA, 05, 05] +1D9D2; [0D 35 4E, 05, 05] -1D9F0; [0D 34 03, 05, 05] +1D9D3; [0D 35 55, 05, 05] -1D9F1; [0D 34 0A, 05, 05] +1D9D4; [0D 35 5C, 05, 05] -1D9F2; [0D 34 11, 05, 05] +1D9D5; [0D 35 63, 05, 05] -1D9F3; [0D 34 18, 05, 05] +1D9D6; [0D 35 6A, 05, 05] -1D9F4; [0D 34 1F, 05, 05] +1D9D7; [0D 35 71, 05, 05] -1D9F5; [0D 34 26, 05, 05] +1D9D8; [0D 35 78, 05, 05] -1D9F6; [0D 34 2D, 05, 05] +1D9D9; [0D 35 7F, 05, 05] -1D9F7; [0D 34 34, 05, 05] +1D9DA; [0D 35 86, 05, 05] -1D9F8; [0D 34 3B, 05, 05] +1D9DB; [0D 35 8D, 05, 05] -1D9F9; [0D 34 42, 05, 05] +1D9DC; [0D 35 94, 05, 05] -1D9FA; [0D 34 49, 05, 05] +1D9DD; [0D 35 9B, 05, 05] -1D9FB; [0D 34 50, 05, 05] +1D9DE; [0D 35 A2, 05, 05] -1D9FC; [0D 34 57, 05, 05] +1D9DF; [0D 35 A9, 05, 05] -1D9FD; [0D 34 5E, 05, 05] +1D9E0; [0D 35 B0, 05, 05] -1D9FE; [0D 34 65, 05, 05] +1D9E1; [0D 35 B7, 05, 05] -1D9FF; [0D 34 6C, 05, 05] +1D9E2; [0D 35 BE, 05, 05] -1DA37; [0D 34 73, 05, 05] +1D9E3; [0D 35 C5, 05, 05] -1DA38; [0D 34 7A, 05, 05] +1D9E4; [0D 35 CC, 05, 05] -1DA39; [0D 34 81, 05, 05] +1D9E5; [0D 35 D3, 05, 05] -1DA3A; [0D 34 88, 05, 05] +1D9E6; [0D 35 DA, 05, 05] -1DA6D; [0D 34 8F, 05, 05] +1D9E7; [0D 35 E1, 05, 05] -1DA6E; [0D 34 96, 05, 05] +1D9E8; [0D 35 E8, 05, 05] -1DA6F; [0D 34 9D, 05, 05] +1D9E9; [0D 35 EF, 05, 05] -1DA70; [0D 34 A4, 05, 05] +1D9EA; [0D 35 F6, 05, 05] -1DA71; [0D 34 AB, 05, 05] +1D9EB; [0D 35 FD, 05, 05] -1DA72; [0D 34 B2, 05, 05] +1D9EC; [0D 36 06, 05, 05] -1DA73; [0D 34 B9, 05, 05] +1D9ED; [0D 36 0D, 05, 05] -1DA74; [0D 34 C0, 05, 05] +1D9EE; [0D 36 14, 05, 05] -1DA76; [0D 34 C7, 05, 05] +1D9EF; [0D 36 1B, 05, 05] -1DA77; [0D 34 CE, 05, 05] +1D9F0; [0D 36 22, 05, 05] -1DA78; [0D 34 D5, 05, 05] +1D9F1; [0D 36 29, 05, 05] -1DA79; [0D 34 DC, 05, 05] +1D9F2; [0D 36 30, 05, 05] -1DA7A; [0D 34 E3, 05, 05] +1D9F3; [0D 36 37, 05, 05] -1DA7B; [0D 34 EA, 05, 05] +1D9F4; [0D 36 3E, 05, 05] -1DA7C; [0D 34 F1, 05, 05] +1D9F5; [0D 36 45, 05, 05] -1DA7D; [0D 34 F8, 05, 05] +1D9F6; [0D 36 4C, 05, 05] -1DA7E; [0D 34 FF, 05, 05] +1D9F7; [0D 36 53, 05, 05] -1DA7F; [0D 35 08, 05, 05] +1D9F8; [0D 36 5A, 05, 05] -1DA80; [0D 35 0F, 05, 05] +1D9F9; [0D 36 61, 05, 05] -1DA81; [0D 35 16, 05, 05] +1D9FA; [0D 36 68, 05, 05] -1DA82; [0D 35 1D, 05, 05] +1D9FB; [0D 36 6F, 05, 05] -1DA83; [0D 35 24, 05, 05] +1D9FC; [0D 36 76, 05, 05] -1DA85; [0D 35 2B, 05, 05] +1D9FD; [0D 36 7D, 05, 05] -1DA86; [0D 35 32, 05, 05] +1D9FE; [0D 36 84, 05, 05] -2FF0; [0D 35 39, 05, 05] +1D9FF; [0D 36 8B, 05, 05] -2FF1; [0D 35 40, 05, 05] +1DA37; [0D 36 92, 05, 05] -2FF2; [0D 35 47, 05, 05] +1DA38; [0D 36 99, 05, 05] -2FF3; [0D 35 4E, 05, 05] +1DA39; [0D 36 A0, 05, 05] -2FF4; [0D 35 55, 05, 05] +1DA3A; [0D 36 A7, 05, 05] -2FF5; [0D 35 5C, 05, 05] +1DA6D; [0D 36 AE, 05, 05] -2FF6; [0D 35 63, 05, 05] +1DA6E; [0D 36 B5, 05, 05] -2FF7; [0D 35 6A, 05, 05] +1DA6F; [0D 36 BC, 05, 05] -2FF8; [0D 35 71, 05, 05] +1DA70; [0D 36 C3, 05, 05] -2FF9; [0D 35 78, 05, 05] +1DA71; [0D 36 CA, 05, 05] -2FFA; [0D 35 7F, 05, 05] +1DA72; [0D 36 D1, 05, 05] -2FFB; [0D 35 86, 05, 05] +1DA73; [0D 36 D8, 05, 05] -31C0; [0D 35 8D, 05, 05] +1DA74; [0D 36 DF, 05, 05] -31C1; [0D 35 94, 05, 05] +1DA76; [0D 36 E6, 05, 05] -31C2; [0D 35 9B, 05, 05] +1DA77; [0D 36 ED, 05, 05] -31C3; [0D 35 A2, 05, 05] +1DA78; [0D 36 F4, 05, 05] -31C4; [0D 35 A9, 05, 05] +1DA79; [0D 36 FB, 05, 05] -31C5; [0D 35 B0, 05, 05] +1DA7A; [0D 37 04, 05, 05] -31C6; [0D 35 B7, 05, 05] +1DA7B; [0D 37 0B, 05, 05] -31C7; [0D 35 BE, 05, 05] +1DA7C; [0D 37 12, 05, 05] -31C8; [0D 35 C5, 05, 05] +1DA7D; [0D 37 19, 05, 05] -31C9; [0D 35 CC, 05, 05] +1DA7E; [0D 37 20, 05, 05] -31CA; [0D 35 D3, 05, 05] +1DA7F; [0D 37 27, 05, 05] -31CB; [0D 35 DA, 05, 05] +1DA80; [0D 37 2E, 05, 05] -31CC; [0D 35 E1, 05, 05] +1DA81; [0D 37 35, 05, 05] -31CD; [0D 35 E8, 05, 05] +1DA82; [0D 37 3C, 05, 05] -31CE; [0D 35 EF, 05, 05] +1DA83; [0D 37 43, 05, 05] -31CF; [0D 35 F6, 05, 05] +1DA85; [0D 37 4A, 05, 05] -31D0; [0D 35 FD, 05, 05] +1DA86; [0D 37 51, 05, 05] -31D1; [0D 36 06, 05, 05] +2FF0; [0D 37 58, 05, 05] -31D2; [0D 36 0D, 05, 05] +2FF1; [0D 37 5F, 05, 05] -31D3; [0D 36 14, 05, 05] +2FF2; [0D 37 66, 05, 05] -31D4; [0D 36 1B, 05, 05] +2FF3; [0D 37 6D, 05, 05] -31D5; [0D 36 22, 05, 05] +2FF4; [0D 37 74, 05, 05] -31D6; [0D 36 29, 05, 05] +2FF5; [0D 37 7B, 05, 05] -31D7; [0D 36 30, 05, 05] +2FF6; [0D 37 82, 05, 05] -31D8; [0D 36 37, 05, 05] +2FF7; [0D 37 89, 05, 05] -31D9; [0D 36 3E, 05, 05] +2FF8; [0D 37 90, 05, 05] -31DA; [0D 36 45, 05, 05] +2FF9; [0D 37 97, 05, 05] -31DB; [0D 36 4C, 05, 05] +2FFA; [0D 37 9E, 05, 05] -31DC; [0D 36 53, 05, 05] +2FFB; [0D 37 A5, 05, 05] -31DD; [0D 36 5A, 05, 05] +31C0; [0D 37 AC, 05, 05] -31DE; [0D 36 61, 05, 05] +31C1; [0D 37 B3, 05, 05] -31DF; [0D 36 68, 05, 05] +31C2; [0D 37 BA, 05, 05] -31E0; [0D 36 6F, 05, 05] +31C3; [0D 37 C1, 05, 05] -31E1; [0D 36 76, 05, 05] +31C4; [0D 37 C8, 05, 05] -31E2; [0D 36 7D, 05, 05] +31C5; [0D 37 CF, 05, 05] -31E3; [0D 36 84, 05, 05] +31C6; [0D 37 D6, 05, 05] -3004; [0D 36 8B, 05, 05] +31C7; [0D 37 DD, 05, 05] -3012; [0D 38, 05, 05] -3036; [0D 38, 05, 20] +31C8; [0D 37 E4, 05, 05] -3013; [0D 3A 02, 05, 05] +31C9; [0D 37 EB, 05, 05] -3020; [0D 3A 09, 05, 05] +31CA; [0D 37 F2, 05, 05] -3037; [0D 3A 10, 05, 05] +31CB; [0D 37 F9, 05, 05] -303E; [0D 3A 17, 05, 05] +31CC; [0D 38 02, 05, 05] -303F; [0D 3A 1E, 05, 05] +31CD; [0D 38 09, 05, 05] -3190; [0D 3A 25, 05, 05] +31CE; [0D 38 10, 05, 05] -3191; [0D 3A 2C, 05, 05] +31CF; [0D 38 17, 05, 05] -327F; [0D 3A 33, 05, 05] +31D0; [0D 38 1E, 05, 05] -FFFC; [0D 3A 3A, 05, 05] +31D1; [0D 38 25, 05, 05] -02D0; [0D 3C, 05, 05] +31D2; [0D 38 2C, 05, 05] -02D1; [0D 3E, 05, 05] +31D3; [0D 38 33, 05, 05] -0971; [0D 40, 05, 05] +31D4; [0D 38 3A, 05, 05] -0E46; [0D 42, 05, 05] +31D5; [0D 38 41, 05, 05] -0EC6; [0D 44, 05, 05] +31D6; [0D 38 48, 05, 05] -17D7; [0D 46, 05, 05] +31D7; [0D 38 4F, 05, 05] -1AA7; [0D 48, 05, 05] +31D8; [0D 38 56, 05, 05] -A9CF; [0D 4A, 05, 05] +31D9; [0D 38 5D, 05, 05] -A9E6; [0D 4C, 05, 05] +31DA; [0D 38 64, 05, 05] -AA70; [0D 4E, 05, 05] +31DB; [0D 38 6B, 05, 05] -AADD; [0D 50 02, 05, 05] +31DC; [0D 38 72, 05, 05] -AAF3; [0D 50 09, 05, 05] +31DD; [0D 38 79, 05, 05] -AAF4; [0D 50 10, 05, 05] +31DE; [0D 38 80, 05, 05] -16B42; [0D 50 17, 05, 05] +31DF; [0D 38 87, 05, 05] -16B43; [0D 50 1E, 05, 05] +31E0; [0D 38 8E, 05, 05] -3005; [0D 52, 05, 05] +31E1; [0D 38 95, 05, 05] -303B; [0D 54, 05, 05] +31E2; [0D 38 9C, 05, 05] -16FE0; [0D 56, 05, 05] +31E3; [0D 38 A3, 05, 05] -3031; [0D 58, 05, 05] -3032; [0D 58, 05, 05][, AE, 05] +3004; [0D 38 AA, 05, 05] -3033; [0D 5A, 05, 05] -3034; [0D 5A, 05, 05][, AE, 05] +3012; [0D 3A, 05, 05] +3036; [0D 3A, 05, 20] -3035; [0D 5C, 05, 05] +3013; [0D 3C 02, 05, 05] -309D; [0D 5E, 05, 05] -309E; [0D 5E, 05, 05][, AE, 05] +3020; [0D 3C 09, 05, 05] -30FC; [0D 60, 05, 05] -FF70; [0D 60, 05, A0] +3037; [0D 3C 10, 05, 05] -30FD; [0D 62, 05, 05] -30FE; [0D 62, 05, 05][, AE, 05] +303E; [0D 3C 17, 05, 05] -FDD1 20AC; [0D 64 02, 05, 05] # CURRENCY first primary +303F; [0D 3C 1E, 05, 05] -00A4; [0D 66, 05, 05] +3190; [0D 3C 25, 05, 05] -00A2; [0D 68, 05, 05] -FFE0; [0D 68, 05, 20] +3191; [0D 3C 2C, 05, 05] -0024; [0D 6A, 05, 05] -FF04; [0D 6A, 05, 20] -FE69; [0D 6A, 05, 2E] +327F; [0D 3C 33, 05, 05] -00A3; [0D 6C, 05, 05] -FFE1; [0D 6C, 05, 20] +FFFC; [0D 3C 3A, 05, 05] -00A5; [0D 6E, 05, 05] -FFE5; [0D 6E, 05, 20] +02D0; [0D 3E, 05, 05] -058F; [0D 70, 05, 05] +02D1; [0D 40, 05, 05] -060B; [0D 72, 05, 05] +0971; [0D 42, 05, 05] -09F2; [0D 74, 05, 05] +0E46; [0D 44, 05, 05] -09F3; [0D 76, 05, 05] +0EC6; [0D 46, 05, 05] -09FB; [0D 78, 05, 05] +17D7; [0D 48, 05, 05] -0AF1; [0D 7A, 05, 05] +1AA7; [0D 4A, 05, 05] -A838; [0D 7C, 05, 05] +A9CF; [0D 4C, 05, 05] -0BF9; [0D 7E, 05, 05] +A9E6; [0D 4E, 05, 05] -0E3F; [0D 80, 05, 05] +AA70; [0D 50, 05, 05] -17DB; [0D 82, 05, 05] +AADD; [0D 52 02, 05, 05] -20A0; [0D 84, 05, 05] +AAF3; [0D 52 09, 05, 05] -20A1; [0D 86, 05, 05] +AAF4; [0D 52 10, 05, 05] -20A2; [0D 88, 05, 05] +16B42; [0D 52 17, 05, 05] -20A3; [0D 8A, 05, 05] +16B43; [0D 52 1E, 05, 05] -20A4; [0D 8C, 05, 05] +3005; [0D 54, 05, 05] -20A5; [0D 8E, 05, 05] +303B; [0D 56, 05, 05] -20A6; [0D 90, 05, 05] +16FE0; [0D 58 02, 05, 05] -20A7; [0D 92, 05, 05] +16FE1; [0D 58 09, 05, 05] -20A9; [0D 94, 05, 05] -FFE6; [0D 94, 05, 20] +3031; [0D 5A, 05, 05] +3032; [0D 5A, 05, 05][, AE, 05] -20AA; [0D 96, 05, 05] +3033; [0D 5C, 05, 05] +3034; [0D 5C, 05, 05][, AE, 05] -20AB; [0D 98, 05, 05] +3035; [0D 5E, 05, 05] -20AC; [0D 9A, 05, 05] +309D; [0D 60, 05, 05] +309E; [0D 60, 05, 05][, AE, 05] -20AD; [0D 9C, 05, 05] +30FC; [0D 62, 05, 05] +FF70; [0D 62, 05, A0] -20AE; [0D 9E, 05, 05] +30FD; [0D 64, 05, 05] +30FE; [0D 64, 05, 05][, AE, 05] -20AF; [0D A0, 05, 05] +FDD1 20AC; [0D 70 02, 05, 05] # CURRENCY first primary -20B0; [0D A2, 05, 05] +00A4; [0D 72, 05, 05] -20B1; [0D A4, 05, 05] +00A2; [0D 74, 05, 05] +FFE0; [0D 74, 05, 20] -20B2; [0D A6, 05, 05] +0024; [0D 76, 05, 05] +FF04; [0D 76, 05, 20] +FE69; [0D 76, 05, 2E] -20B3; [0D A8, 05, 05] +00A3; [0D 78, 05, 05] +FFE1; [0D 78, 05, 20] -20B4; [0D AA, 05, 05] +00A5; [0D 7A, 05, 05] +FFE5; [0D 7A, 05, 20] -20B5; [0D AC, 05, 05] +058F; [0D 7C, 05, 05] -20B6; [0D AE, 05, 05] +060B; [0D 7E, 05, 05] -20B7; [0D B0, 05, 05] +09F2; [0D 80, 05, 05] -20B8; [0D B2, 05, 05] +09F3; [0D 82, 05, 05] -20B9; [0D B4, 05, 05] +09FB; [0D 84, 05, 05] -20BA; [0D B6, 05, 05] +0AF1; [0D 86, 05, 05] -20BB; [0D B8, 05, 05] +A838; [0D 88, 05, 05] -20BC; [0D BA, 05, 05] +0BF9; [0D 8A, 05, 05] -20BD; [0D BC, 05, 05] +0E3F; [0D 8C, 05, 05] -20BE; [0D BE, 05, 05] +17DB; [0D 8E, 05, 05] -20A8; [0D C0, 05, 05] +20A0; [0D 90, 05, 05] -FDFC; [0D C2, 05, 05] +20A1; [0D 92, 05, 05] + +20A2; [0D 94, 05, 05] + +20A3; [0D 96, 05, 05] + +20A4; [0D 98, 05, 05] + +20A5; [0D 9A, 05, 05] + +20A6; [0D 9C, 05, 05] + +20A7; [0D 9E, 05, 05] + +20A9; [0D A0, 05, 05] +FFE6; [0D A0, 05, 20] + +20AA; [0D A2, 05, 05] + +20AB; [0D A4, 05, 05] + +20AC; [0D A6, 05, 05] + +20AD; [0D A8, 05, 05] + +20AE; [0D AA, 05, 05] + +20AF; [0D AC, 05, 05] + +20B0; [0D AE, 05, 05] + +20B1; [0D B0, 05, 05] + +20B2; [0D B2, 05, 05] + +20B3; [0D B4, 05, 05] + +20B4; [0D B6, 05, 05] + +20B5; [0D B8, 05, 05] + +20B6; [0D BA, 05, 05] + +20B7; [0D BC, 05, 05] + +20B8; [0D BE, 05, 05] + +20B9; [0D C0, 05, 05] + +20BA; [0D C2, 05, 05] + +20BB; [0D C4, 05, 05] + +20BC; [0D C6, 05, 05] + +20BD; [0D C8, 05, 05] + +20BE; [0D CA, 05, 05] + +20BF; [0D CC, 05, 05] + +20A8; [0D CE, 05, 05] + +FDFC; [0D D0, 05, 05] FDD1 0034; [0E 02 02, 05, 05] # DIGIT first primary starts new lead byte @@ -15794,6 +16021,7 @@ ABF0; [12, 05, 05] 11730; [12, 05, 05] 118E0; [12, 05, 05] 11C50; [12, 05, 05] +11D50; [12, 05, 05] 16A60; [12, 05, 05] 16B50; [12, 05, 05] 1E950; [12, 05, 05] @@ -15896,6 +16124,7 @@ ABF1; [14, 05, 05] 118E1; [14, 05, 05] 11C51; [14, 05, 05] 11C5A; [14, 05, 05] +11D51; [14, 05, 05] 12415; [14, 05, 05] 1241E; [14, 05, 05] 1242C; [14, 05, 05] @@ -16069,6 +16298,7 @@ ABF2; [16, 05, 05] 118E2; [16, 05, 05] 11C52; [16, 05, 05] 11C5B; [16, 05, 05] +11D52; [16, 05, 05] 12400; [16, 05, 05] 12416; [16, 05, 05] 1241F; [16, 05, 05] @@ -16206,6 +16436,7 @@ ABF3; [18, 05, 05] 118E3; [18, 05, 05] 11C53; [18, 05, 05] 11C5C; [18, 05, 05] +11D53; [18, 05, 05] 12401; [18, 05, 05] 12408; [18, 05, 05] 12417; [18, 05, 05] @@ -16329,6 +16560,7 @@ ABF4; [1A, 05, 05] 118E4; [1A, 05, 05] 11C54; [1A, 05, 05] 11C5D; [1A, 05, 05] +11D54; [1A, 05, 05] 12402; [1A, 05, 05] 12409; [1A, 05, 05] 1240F; [1A, 05, 05] @@ -16453,6 +16685,7 @@ ABF5; [1C, 05, 05] 118E5; [1C, 05, 05] 11C55; [1C, 05, 05] 11C5E; [1C, 05, 05] +11D55; [1C, 05, 05] 12403; [1C, 05, 05] 1240A; [1C, 05, 05] 12410; [1C, 05, 05] @@ -16555,6 +16788,7 @@ ABF6; [1E, 05, 05] 118E6; [1E, 05, 05] 11C56; [1E, 05, 05] 11C5F; [1E, 05, 05] +11D56; [1E, 05, 05] 12404; [1E, 05, 05] 1240B; [1E, 05, 05] 12411; [1E, 05, 05] @@ -16649,6 +16883,7 @@ ABF7; [20, 05, 05] 118E7; [20, 05, 05] 11C57; [20, 05, 05] 11C60; [20, 05, 05] +11D57; [20, 05, 05] 12405; [20, 05, 05] 1240C; [20, 05, 05] 12412; [20, 05, 05] @@ -16745,6 +16980,7 @@ ABF8; [22, 05, 05] 118E8; [22, 05, 05] 11C58; [22, 05, 05] 11C61; [22, 05, 05] +11D58; [22, 05, 05] 12406; [22, 05, 05] 1240D; [22, 05, 05] 12413; [22, 05, 05] @@ -16839,6 +17075,7 @@ ABF9; [24, 05, 05] 118E9; [24, 05, 05] 11C59; [24, 05, 05] 11C62; [24, 05, 05] +11D59; [24, 05, 05] 12407; [24, 05, 05] 1240E; [24, 05, 05] 12414; [24, 05, 05] @@ -18049,8 +18286,8 @@ FF2C; [3F, 05, 9F] 1E3C; [3F, 05, 9C][, CC, 05] 1E3B; [3F, 05, 05][, D2, 05] 1E3A; [3F, 05, 9C][, D2, 05] -0140; [3F, 05, 05][, FB 92, 05] -013F; [3F, 05, 9C][, FB 92, 05] +0140; [3F, 05, 05][, FB B4, 05] +013F; [3F, 05, 9C][, FB B4, 05] 01C9; [3F, 05, 13][3B, 05, 13] 01C8; [3F, 05, A2][3B, 05, 13] 01C7; [3F, 05, A2][3B, 05, A2] @@ -19089,7 +19326,7 @@ A79E; [51, 05, A2][, 96, 20] 1E75; [51, 05, 05][, D0, 05] 1E74; [51, 05, 9C][, D0, 05] 1F1AB; [51, 05, B1][37, 05, B4][2F, 05, B1] -1F199; [51, 05, B1][47, 05, B4][07 50, 05, 30] +1F199; [51, 05, B1][47, 05, B4][07 52, 05, 30] 1D1C; [52 06, 05, 05] 1DB8; [52 06, 05, 20] @@ -23271,6 +23508,28 @@ FDD1 0710; [66 04 02, 05, 05] # SYRIAC first primary starts new lead byte (compr 072C; [66 1A 25, 05, 05] +0860; [66 1A 2C, 05, 05] + +0861; [66 1A 33, 05, 05] + +0862; [66 1A 3A, 05, 05] + +0863; [66 1A 41, 05, 05] + +0864; [66 1A 48, 05, 05] + +0865; [66 1A 4F, 05, 05] + +0866; [66 1A 56, 05, 05] + +0867; [66 1A 5D, 05, 05] + +0868; [66 1A 64, 05, 05] + +0869; [66 1A 6B, 05, 05] + +086A; [66 1A 72, 05, 05] + FDD1 0840; [66 1B 02, 05, 05] # Mandaic first primary (compressible) 0840; [66 1B 09, 05, 05] @@ -24881,6 +25140,8 @@ FDD1 0995; [68 04 02, 05, 05] # BENGALI first primary starts new lead byte (comp 09D7; [68 86, 05, 05] +09FC; [68 88, 05, 05] + FDD1 0A15; [69 04 02, 05, 05] # GURMUKHI first primary starts new lead byte (compressible) 0A74; [69 06, 05, 05] @@ -25857,6 +26118,8 @@ FDD1 0D15; [6F 04 02, 05, 05] # MALAYALAM first primary starts new lead byte (co 0D57; [6F 94, 05, 05] 0D4D; [6F 96, 05, 05] +0D3B; [6F 96, 05, 20] +0D3C; [6F 96, 05, 20] FDD1 0D85; [70 04 02, 05, 05] # SINHALA first primary starts new lead byte (compressible) @@ -27851,454 +28114,576 @@ FDD1 11717; [70 CC 02, 05, 05] # Ahom first primary (compressible) 1171F; [70 D4 79, 05, 05] -FDD1 1B83; [70 D5 02, 05, 05] # Sundanese first primary (compressible) +FDD1 11D10; [70 D5 02, 05, 05] # Masaram_Gondi first primary (compressible) + +11D00; [70 D5 09, 05, 05] + +11D01; [70 D5 10, 05, 05] + +11D02; [70 D5 17, 05, 05] + +11D03; [70 D5 1E, 05, 05] + +11D04; [70 D5 25, 05, 05] + +11D05; [70 D5 2C, 05, 05] + +11D06; [70 D5 33, 05, 05] + +11D08; [70 D5 3A, 05, 05] + +11D09; [70 D5 41, 05, 05] + +11D0B; [70 D5 48, 05, 05] + +11D0C; [70 D5 4F, 05, 05] + +11D0D; [70 D5 56, 05, 05] + +11D0E; [70 D5 5D, 05, 05] + +11D0F; [70 D5 64, 05, 05] + +11D10; [70 D5 6B, 05, 05] + +11D11; [70 D5 72, 05, 05] + +11D12; [70 D5 79, 05, 05] + +11D13; [70 D5 80, 05, 05] + +11D14; [70 D5 87, 05, 05] + +11D15; [70 D5 8E, 05, 05] + +11D16; [70 D5 95, 05, 05] + +11D17; [70 D5 9C, 05, 05] + +11D18; [70 D5 A3, 05, 05] + +11D19; [70 D5 AA, 05, 05] + +11D1A; [70 D5 B1, 05, 05] + +11D1B; [70 D5 B8, 05, 05] + +11D1C; [70 D5 BF, 05, 05] -1B83; [70 D7, 05, 05] -1BBA; [70 D7, 05, 20] +11D1D; [70 D5 C6, 05, 05] -1B84; [70 D9 02, 05, 05] +11D1E; [70 D5 CD, 05, 05] -1B85; [70 D9 09, 05, 05] +11D1F; [70 D5 D4, 05, 05] -1B86; [70 D9 10, 05, 05] +11D20; [70 D5 DB, 05, 05] -1B87; [70 D9 17, 05, 05] +11D21; [70 D5 E2, 05, 05] -1B88; [70 D9 1E, 05, 05] +11D22; [70 D5 E9, 05, 05] -1B89; [70 D9 25, 05, 05] +11D23; [70 D5 F0, 05, 05] -1B8A; [70 DB, 05, 05] -1BBE; [70 DB, 05, 20] +11D24; [70 D5 F7, 05, 05] -1BAE; [70 DD 02, 05, 05] +11D25; [70 D5 FE, 05, 05] -1B8B; [70 DD 09, 05, 05] +11D26; [70 D7, 05, 05] +11D46; [70 D7, 05, 20] +11D47; [70 D7, 05, 2E] -1B8C; [70 DD 10, 05, 05] +11D27; [70 D9 02, 05, 05] -1B8D; [70 DD 17, 05, 05] +11D28; [70 D9 09, 05, 05] -1B8E; [70 DD 1E, 05, 05] +11D29; [70 D9 10, 05, 05] -1B8F; [70 DD 25, 05, 05] +11D2A; [70 D9 17, 05, 05] -1B90; [70 DD 2C, 05, 05] +11D2B; [70 D9 1E, 05, 05] -1B91; [70 DD 33, 05, 05] +11D2C; [70 D9 25, 05, 05] -1B92; [70 DD 3A, 05, 05] +11D2D; [70 D9 2C, 05, 05] -1B93; [70 DD 41, 05, 05] +11D2E; [70 D9 33, 05, 05] -1B94; [70 DD 48, 05, 05] +11D2F; [70 D9 3A, 05, 05] -1B95; [70 DD 4F, 05, 05] +11D30; [70 D9 41, 05, 05] -1B96; [70 DD 56, 05, 05] +11D31; [70 D9 48, 05, 05] -1B97; [70 DD 5D, 05, 05] +11D32; [70 D9 4F, 05, 05] -1B98; [70 DD 64, 05, 05] +11D33; [70 D9 56, 05, 05] -1BBD; [70 DD 6B, 05, 05] +11D34; [70 D9 5D, 05, 05] -1B99; [70 DF, 05, 05] -1BBF; [70 DF, 05, 20] +11D35; [70 D9 64, 05, 05] -1BAC; [70 E1 02, 05, 05] +11D36; [70 D9 6B, 05, 05] -1B9A; [70 E1 09, 05, 05] +11D3A; [70 D9 72, 05, 05] -1BA1; [70 E1 10, 05, 05] +11D3C; [70 D9 79, 05, 05] -1B9B; [70 E1 17, 05, 05] +11D3D; [70 D9 80, 05, 05] -1BA2; [70 E1 1E, 05, 05] +11D3F; [70 D9 87, 05, 05] -1BBB; [70 E1 25, 05, 05] +11D44; [70 D9 8E, 05, 05] -1B9C; [70 E1 2C, 05, 05] +11D45; [70 D9 95, 05, 05] -1BA3; [70 E1 33, 05, 05] +FDD1 1B83; [70 DA 02, 05, 05] # Sundanese first primary (compressible) -1BBC; [70 E1 3A, 05, 05] +1B83; [70 DC, 05, 05] +1BBA; [70 DC, 05, 20] -1B9D; [70 E1 41, 05, 05] +1B84; [70 DE 02, 05, 05] -1BAD; [70 E1 48, 05, 05] +1B85; [70 DE 09, 05, 05] -1B9E; [70 E1 4F, 05, 05] +1B86; [70 DE 10, 05, 05] -1B9F; [70 E1 56, 05, 05] +1B87; [70 DE 17, 05, 05] -1BAF; [70 E1 5D, 05, 05] +1B88; [70 DE 1E, 05, 05] -1BA0; [70 E1 64, 05, 05] +1B89; [70 DE 25, 05, 05] -1BA4; [70 E1 6B, 05, 05] +1B8A; [70 E0, 05, 05] +1BBE; [70 E0, 05, 20] -1BA5; [70 E1 72, 05, 05] +1BAE; [70 E2 02, 05, 05] -1BA6; [70 E1 79, 05, 05] +1B8B; [70 E2 09, 05, 05] -1BA7; [70 E1 80, 05, 05] +1B8C; [70 E2 10, 05, 05] -1BA8; [70 E1 87, 05, 05] +1B8D; [70 E2 17, 05, 05] -1BA9; [70 E1 8E, 05, 05] +1B8E; [70 E2 1E, 05, 05] -1BAA; [70 E1 95, 05, 05] +1B8F; [70 E2 25, 05, 05] -1BAB; [70 E1 9C, 05, 05] +1B90; [70 E2 2C, 05, 05] -FDD1 11005; [70 E2 02, 05, 05] # Brahmi first primary (compressible) +1B91; [70 E2 33, 05, 05] -11005; [70 E2 09, 05, 05] +1B92; [70 E2 3A, 05, 05] -11006; [70 E2 10, 05, 05] +1B93; [70 E2 41, 05, 05] -11007; [70 E2 17, 05, 05] +1B94; [70 E2 48, 05, 05] -11008; [70 E2 1E, 05, 05] +1B95; [70 E2 4F, 05, 05] -11009; [70 E2 25, 05, 05] +1B96; [70 E2 56, 05, 05] -1100A; [70 E2 2C, 05, 05] +1B97; [70 E2 5D, 05, 05] -1100B; [70 E2 33, 05, 05] +1B98; [70 E2 64, 05, 05] -1100C; [70 E2 3A, 05, 05] +1BBD; [70 E2 6B, 05, 05] -1100D; [70 E2 41, 05, 05] +1B99; [70 E4, 05, 05] +1BBF; [70 E4, 05, 20] -1100E; [70 E2 48, 05, 05] +1BAC; [70 E6 02, 05, 05] -1100F; [70 E2 4F, 05, 05] +1B9A; [70 E6 09, 05, 05] -11010; [70 E2 56, 05, 05] +1BA1; [70 E6 10, 05, 05] -11011; [70 E2 5D, 05, 05] +1B9B; [70 E6 17, 05, 05] -11012; [70 E2 64, 05, 05] +1BA2; [70 E6 1E, 05, 05] -11013; [70 E2 6B, 05, 05] +1BBB; [70 E6 25, 05, 05] -11014; [70 E2 72, 05, 05] +1B9C; [70 E6 2C, 05, 05] -11015; [70 E2 79, 05, 05] +1BA3; [70 E6 33, 05, 05] -11016; [70 E2 80, 05, 05] +1BBC; [70 E6 3A, 05, 05] -11017; [70 E2 87, 05, 05] +1B9D; [70 E6 41, 05, 05] -11018; [70 E2 8E, 05, 05] +1BAD; [70 E6 48, 05, 05] -11019; [70 E2 95, 05, 05] +1B9E; [70 E6 4F, 05, 05] -1101A; [70 E2 9C, 05, 05] +1B9F; [70 E6 56, 05, 05] -1101B; [70 E2 A3, 05, 05] +1BAF; [70 E6 5D, 05, 05] -1101C; [70 E2 AA, 05, 05] +1BA0; [70 E6 64, 05, 05] -1101D; [70 E2 B1, 05, 05] +1BA4; [70 E6 6B, 05, 05] -1101E; [70 E2 B8, 05, 05] +1BA5; [70 E6 72, 05, 05] -1101F; [70 E2 BF, 05, 05] +1BA6; [70 E6 79, 05, 05] -11020; [70 E2 C6, 05, 05] +1BA7; [70 E6 80, 05, 05] -11021; [70 E2 CD, 05, 05] +1BA8; [70 E6 87, 05, 05] -11022; [70 E2 D4, 05, 05] +1BA9; [70 E6 8E, 05, 05] -11023; [70 E2 DB, 05, 05] +1BAA; [70 E6 95, 05, 05] -11024; [70 E2 E2, 05, 05] +1BAB; [70 E6 9C, 05, 05] -11025; [70 E2 E9, 05, 05] +FDD1 11005; [70 E7 02, 05, 05] # Brahmi first primary (compressible) -11026; [70 E2 F0, 05, 05] +11005; [70 E7 09, 05, 05] -11027; [70 E2 F7, 05, 05] +11006; [70 E7 10, 05, 05] -11028; [70 E2 FE, 05, 05] +11007; [70 E7 17, 05, 05] -11029; [70 E3 07, 05, 05] +11008; [70 E7 1E, 05, 05] -1102A; [70 E3 0E, 05, 05] +11009; [70 E7 25, 05, 05] -1102B; [70 E3 15, 05, 05] +1100A; [70 E7 2C, 05, 05] -1102C; [70 E3 1C, 05, 05] +1100B; [70 E7 33, 05, 05] -1102D; [70 E3 23, 05, 05] +1100C; [70 E7 3A, 05, 05] -1102E; [70 E3 2A, 05, 05] +1100D; [70 E7 41, 05, 05] -1102F; [70 E3 31, 05, 05] +1100E; [70 E7 48, 05, 05] -11030; [70 E3 38, 05, 05] +1100F; [70 E7 4F, 05, 05] -11031; [70 E3 3F, 05, 05] +11010; [70 E7 56, 05, 05] -11032; [70 E3 46, 05, 05] +11011; [70 E7 5D, 05, 05] -11033; [70 E3 4D, 05, 05] +11012; [70 E7 64, 05, 05] -11003; [70 E3 54, 05, 05] +11013; [70 E7 6B, 05, 05] -11004; [70 E3 5B, 05, 05] +11014; [70 E7 72, 05, 05] -11034; [70 E3 62, 05, 05] +11015; [70 E7 79, 05, 05] -11035; [70 E3 69, 05, 05] +11016; [70 E7 80, 05, 05] -11036; [70 E3 70, 05, 05] +11017; [70 E7 87, 05, 05] -11037; [70 E3 77, 05, 05] +11018; [70 E7 8E, 05, 05] -11038; [70 E3 7E, 05, 05] +11019; [70 E7 95, 05, 05] -11039; [70 E3 85, 05, 05] +1101A; [70 E7 9C, 05, 05] -1103A; [70 E3 8C, 05, 05] +1101B; [70 E7 A3, 05, 05] -1103B; [70 E3 93, 05, 05] +1101C; [70 E7 AA, 05, 05] -1103C; [70 E3 9A, 05, 05] +1101D; [70 E7 B1, 05, 05] -1103D; [70 E3 A1, 05, 05] +1101E; [70 E7 B8, 05, 05] -1103E; [70 E3 A8, 05, 05] +1101F; [70 E7 BF, 05, 05] -1103F; [70 E3 AF, 05, 05] +11020; [70 E7 C6, 05, 05] -11040; [70 E3 B6, 05, 05] +11021; [70 E7 CD, 05, 05] -11041; [70 E3 BD, 05, 05] +11022; [70 E7 D4, 05, 05] -11042; [70 E3 C4, 05, 05] +11023; [70 E7 DB, 05, 05] -11043; [70 E3 CB, 05, 05] +11024; [70 E7 E2, 05, 05] -11044; [70 E3 D2, 05, 05] +11025; [70 E7 E9, 05, 05] -11045; [70 E3 D9, 05, 05] +11026; [70 E7 F0, 05, 05] -11046; [70 E3 E0, 05, 05] +11027; [70 E7 F7, 05, 05] -1107F; [70 E3 E7, 05, 05] +11028; [70 E7 FE, 05, 05] -FDD1 10A00; [70 E4 02, 05, 05] # KHAROSHTHI first primary (compressible) +11029; [70 E8 07, 05, 05] -10A00; [70 E4 09, 05, 05] +1102A; [70 E8 0E, 05, 05] -10A01; [70 E4 10, 05, 05] +1102B; [70 E8 15, 05, 05] -10A02; [70 E4 17, 05, 05] +1102C; [70 E8 1C, 05, 05] -10A03; [70 E4 1E, 05, 05] +1102D; [70 E8 23, 05, 05] -10A05; [70 E4 25, 05, 05] +1102E; [70 E8 2A, 05, 05] -10A06; [70 E4 2C, 05, 05] +1102F; [70 E8 31, 05, 05] -10A0C; [70 E4 33, 05, 05] +11030; [70 E8 38, 05, 05] -10A10; [70 E4 3A, 05, 05] +11031; [70 E8 3F, 05, 05] -10A11; [70 E4 41, 05, 05] +11032; [70 E8 46, 05, 05] -10A12; [70 E4 48, 05, 05] +11033; [70 E8 4D, 05, 05] -10A13; [70 E4 4F, 05, 05] +11003; [70 E8 54, 05, 05] -10A15; [70 E4 56, 05, 05] +11004; [70 E8 5B, 05, 05] -10A16; [70 E4 5D, 05, 05] +11034; [70 E8 62, 05, 05] -10A17; [70 E4 64, 05, 05] +11035; [70 E8 69, 05, 05] -10A19; [70 E4 6B, 05, 05] +11036; [70 E8 70, 05, 05] -10A1A; [70 E4 72, 05, 05] +11037; [70 E8 77, 05, 05] -10A1B; [70 E4 79, 05, 05] +11038; [70 E8 7E, 05, 05] -10A1C; [70 E4 80, 05, 05] +11039; [70 E8 85, 05, 05] -10A1D; [70 E4 87, 05, 05] +1103A; [70 E8 8C, 05, 05] -10A1E; [70 E4 8E, 05, 05] +1103B; [70 E8 93, 05, 05] -10A1F; [70 E4 95, 05, 05] +1103C; [70 E8 9A, 05, 05] -10A20; [70 E4 9C, 05, 05] +1103D; [70 E8 A1, 05, 05] -10A21; [70 E4 A3, 05, 05] +1103E; [70 E8 A8, 05, 05] -10A22; [70 E4 AA, 05, 05] +1103F; [70 E8 AF, 05, 05] -10A23; [70 E4 B1, 05, 05] +11040; [70 E8 B6, 05, 05] -10A24; [70 E4 B8, 05, 05] +11041; [70 E8 BD, 05, 05] -10A25; [70 E4 BF, 05, 05] +11042; [70 E8 C4, 05, 05] -10A26; [70 E4 C6, 05, 05] +11043; [70 E8 CB, 05, 05] -10A27; [70 E4 CD, 05, 05] +11044; [70 E8 D2, 05, 05] -10A28; [70 E4 D4, 05, 05] +11045; [70 E8 D9, 05, 05] -10A29; [70 E4 DB, 05, 05] +11046; [70 E8 E0, 05, 05] -10A2A; [70 E4 E2, 05, 05] +1107F; [70 E8 E7, 05, 05] -10A2B; [70 E4 E9, 05, 05] +FDD1 10A00; [70 E9 02, 05, 05] # KHAROSHTHI first primary (compressible) -10A2C; [70 E4 F0, 05, 05] +10A00; [70 E9 09, 05, 05] -10A2D; [70 E4 F7, 05, 05] +10A01; [70 E9 10, 05, 05] -10A2E; [70 E4 FE, 05, 05] +10A02; [70 E9 17, 05, 05] -10A2F; [70 E5 07, 05, 05] +10A03; [70 E9 1E, 05, 05] -10A30; [70 E5 0E, 05, 05] +10A05; [70 E9 25, 05, 05] -10A31; [70 E5 15, 05, 05] +10A06; [70 E9 2C, 05, 05] -10A32; [70 E5 1C, 05, 05] +10A0C; [70 E9 33, 05, 05] -10A33; [70 E5 23, 05, 05] +10A10; [70 E9 3A, 05, 05] -10A3F; [70 E5 2A, 05, 05] +10A11; [70 E9 41, 05, 05] -FDD1 11C0E; [70 E6 02, 05, 05] # Bhaiksuki first primary (compressible) +10A12; [70 E9 48, 05, 05] -11C00; [70 E6 09, 05, 05] +10A13; [70 E9 4F, 05, 05] -11C01; [70 E6 10, 05, 05] +10A15; [70 E9 56, 05, 05] -11C02; [70 E6 17, 05, 05] +10A16; [70 E9 5D, 05, 05] -11C03; [70 E6 1E, 05, 05] +10A17; [70 E9 64, 05, 05] -11C04; [70 E6 25, 05, 05] +10A19; [70 E9 6B, 05, 05] -11C05; [70 E6 2C, 05, 05] +10A1A; [70 E9 72, 05, 05] -11C06; [70 E6 33, 05, 05] +10A1B; [70 E9 79, 05, 05] -11C07; [70 E6 3A, 05, 05] +10A1C; [70 E9 80, 05, 05] -11C08; [70 E6 41, 05, 05] +10A1D; [70 E9 87, 05, 05] -11C0A; [70 E6 48, 05, 05] +10A1E; [70 E9 8E, 05, 05] -11C0B; [70 E6 4F, 05, 05] +10A1F; [70 E9 95, 05, 05] -11C0C; [70 E6 56, 05, 05] +10A20; [70 E9 9C, 05, 05] -11C0D; [70 E6 5D, 05, 05] +10A21; [70 E9 A3, 05, 05] -11C0E; [70 E6 64, 05, 05] +10A22; [70 E9 AA, 05, 05] -11C0F; [70 E6 6B, 05, 05] +10A23; [70 E9 B1, 05, 05] -11C10; [70 E6 72, 05, 05] +10A24; [70 E9 B8, 05, 05] -11C11; [70 E6 79, 05, 05] +10A25; [70 E9 BF, 05, 05] -11C12; [70 E6 80, 05, 05] +10A26; [70 E9 C6, 05, 05] -11C13; [70 E6 87, 05, 05] +10A27; [70 E9 CD, 05, 05] -11C14; [70 E6 8E, 05, 05] +10A28; [70 E9 D4, 05, 05] -11C15; [70 E6 95, 05, 05] +10A29; [70 E9 DB, 05, 05] -11C16; [70 E6 9C, 05, 05] +10A2A; [70 E9 E2, 05, 05] -11C17; [70 E6 A3, 05, 05] +10A2B; [70 E9 E9, 05, 05] -11C18; [70 E6 AA, 05, 05] +10A2C; [70 E9 F0, 05, 05] -11C19; [70 E6 B1, 05, 05] +10A2D; [70 E9 F7, 05, 05] -11C1A; [70 E6 B8, 05, 05] +10A2E; [70 E9 FE, 05, 05] -11C1B; [70 E6 BF, 05, 05] +10A2F; [70 EA 07, 05, 05] -11C1C; [70 E6 C6, 05, 05] +10A30; [70 EA 0E, 05, 05] -11C1D; [70 E6 CD, 05, 05] +10A31; [70 EA 15, 05, 05] -11C1E; [70 E6 D4, 05, 05] +10A32; [70 EA 1C, 05, 05] -11C1F; [70 E6 DB, 05, 05] +10A33; [70 EA 23, 05, 05] -11C20; [70 E6 E2, 05, 05] +10A3F; [70 EA 2A, 05, 05] -11C21; [70 E6 E9, 05, 05] +FDD1 11C0E; [70 EB 02, 05, 05] # Bhaiksuki first primary (compressible) -11C22; [70 E6 F0, 05, 05] +11C00; [70 EB 09, 05, 05] -11C23; [70 E6 F7, 05, 05] +11C01; [70 EB 10, 05, 05] -11C24; [70 E6 FE, 05, 05] +11C02; [70 EB 17, 05, 05] -11C25; [70 E7 07, 05, 05] +11C03; [70 EB 1E, 05, 05] -11C26; [70 E7 0E, 05, 05] +11C04; [70 EB 25, 05, 05] -11C27; [70 E7 15, 05, 05] +11C05; [70 EB 2C, 05, 05] -11C28; [70 E7 1C, 05, 05] +11C06; [70 EB 33, 05, 05] -11C29; [70 E7 23, 05, 05] +11C07; [70 EB 3A, 05, 05] -11C2A; [70 E7 2A, 05, 05] +11C08; [70 EB 41, 05, 05] -11C2B; [70 E7 31, 05, 05] +11C0A; [70 EB 48, 05, 05] -11C2C; [70 E7 38, 05, 05] +11C0B; [70 EB 4F, 05, 05] -11C2D; [70 E7 3F, 05, 05] +11C0C; [70 EB 56, 05, 05] -11C2E; [70 E7 46, 05, 05] +11C0D; [70 EB 5D, 05, 05] -11C40; [70 E7 4D, 05, 05] +11C0E; [70 EB 64, 05, 05] -11C2F; [70 E7 54, 05, 05] +11C0F; [70 EB 6B, 05, 05] -11C30; [70 E7 5B, 05, 05] +11C10; [70 EB 72, 05, 05] -11C31; [70 E7 62, 05, 05] +11C11; [70 EB 79, 05, 05] -11C32; [70 E7 69, 05, 05] +11C12; [70 EB 80, 05, 05] -11C33; [70 E7 70, 05, 05] +11C13; [70 EB 87, 05, 05] -11C34; [70 E7 77, 05, 05] +11C14; [70 EB 8E, 05, 05] -11C35; [70 E7 7E, 05, 05] +11C15; [70 EB 95, 05, 05] -11C36; [70 E7 85, 05, 05] +11C16; [70 EB 9C, 05, 05] -11C38; [70 E7 8C, 05, 05] +11C17; [70 EB A3, 05, 05] -11C39; [70 E7 93, 05, 05] +11C18; [70 EB AA, 05, 05] -11C3A; [70 E7 9A, 05, 05] +11C19; [70 EB B1, 05, 05] -11C3B; [70 E7 A1, 05, 05] +11C1A; [70 EB B8, 05, 05] -11C3F; [70 E7 A8, 05, 05] +11C1B; [70 EB BF, 05, 05] + +11C1C; [70 EB C6, 05, 05] + +11C1D; [70 EB CD, 05, 05] + +11C1E; [70 EB D4, 05, 05] + +11C1F; [70 EB DB, 05, 05] + +11C20; [70 EB E2, 05, 05] + +11C21; [70 EB E9, 05, 05] + +11C22; [70 EB F0, 05, 05] + +11C23; [70 EB F7, 05, 05] + +11C24; [70 EB FE, 05, 05] + +11C25; [70 EC 07, 05, 05] + +11C26; [70 EC 0E, 05, 05] + +11C27; [70 EC 15, 05, 05] + +11C28; [70 EC 1C, 05, 05] + +11C29; [70 EC 23, 05, 05] + +11C2A; [70 EC 2A, 05, 05] + +11C2B; [70 EC 31, 05, 05] + +11C2C; [70 EC 38, 05, 05] + +11C2D; [70 EC 3F, 05, 05] + +11C2E; [70 EC 46, 05, 05] + +11C40; [70 EC 4D, 05, 05] + +11C2F; [70 EC 54, 05, 05] + +11C30; [70 EC 5B, 05, 05] + +11C31; [70 EC 62, 05, 05] + +11C32; [70 EC 69, 05, 05] + +11C33; [70 EC 70, 05, 05] + +11C34; [70 EC 77, 05, 05] + +11C35; [70 EC 7E, 05, 05] + +11C36; [70 EC 85, 05, 05] + +11C38; [70 EC 8C, 05, 05] + +11C39; [70 EC 93, 05, 05] + +11C3A; [70 EC 9A, 05, 05] + +11C3B; [70 EC A1, 05, 05] + +11C3F; [70 EC A8, 05, 05] FDD1 0E17; [71 04 02, 05, 05] # THAI first primary starts new lead byte (compressible) @@ -29523,4660 +29908,4897 @@ FDD1 0F40; [73 04 02, 05, 05] # TIBETAN first primary starts new lead byte (comp 0F84; [73 C4, 05, 05] -FDD1 11C72; [73 C6 02, 05, 05] # Marchen first primary (compressible) +FDD1 11A0B; [73 C6 02, 05, 05] # Zanabazar_Square first primary (compressible) + +11A0B; [73 C6 09, 05, 05] + +11A32; [73 C6 10, 05, 05] + +11A0C; [73 C6 17, 05, 05] + +11A0D; [73 C6 1E, 05, 05] + +11A0E; [73 C6 25, 05, 05] + +11A0F; [73 C6 2C, 05, 05] + +11A10; [73 C6 33, 05, 05] + +11A11; [73 C6 3A, 05, 05] + +11A12; [73 C6 41, 05, 05] + +11A13; [73 C6 48, 05, 05] + +11A14; [73 C6 4F, 05, 05] + +11A15; [73 C6 56, 05, 05] + +11A16; [73 C6 5D, 05, 05] + +11A17; [73 C6 64, 05, 05] + +11A18; [73 C6 6B, 05, 05] + +11A19; [73 C6 72, 05, 05] + +11A1A; [73 C6 79, 05, 05] + +11A1B; [73 C6 80, 05, 05] + +11A1C; [73 C6 87, 05, 05] + +11A1D; [73 C6 8E, 05, 05] + +11A1E; [73 C6 95, 05, 05] + +11A1F; [73 C6 9C, 05, 05] + +11A20; [73 C6 A3, 05, 05] + +11A21; [73 C6 AA, 05, 05] + +11A22; [73 C6 B1, 05, 05] + +11A23; [73 C6 B8, 05, 05] + +11A24; [73 C6 BF, 05, 05] + +11A25; [73 C6 C6, 05, 05] + +11A26; [73 C6 CD, 05, 05] + +11A27; [73 C6 D4, 05, 05] + +11A28; [73 C6 DB, 05, 05] + +11A29; [73 C6 E2, 05, 05] + +11A2A; [73 C8, 05, 05] +11A3B; [73 C8, 05, 20] + +11A2B; [73 CA, 05, 05] +11A3A; [73 CA, 05, 20] +11A3C; [73 CA, 05, 2E] + +11A2C; [73 CC, 05, 05] +11A3D; [73 CC, 05, 20] + +11A2D; [73 CE, 05, 05] +11A3E; [73 CE, 05, 20] + +11A2E; [73 D0 02, 05, 05] + +11A2F; [73 D0 09, 05, 05] + +11A30; [73 D0 10, 05, 05] + +11A31; [73 D0 17, 05, 05] + +11A00; [73 D0 1E, 05, 05] + +11A01; [73 D0 25, 05, 05] + +11A02; [73 D0 2C, 05, 05] + +11A03; [73 D0 33, 05, 05] + +11A04; [73 D0 3A, 05, 05] + +11A05; [73 D0 41, 05, 05] + +11A06; [73 D0 48, 05, 05] + +11A07; [73 D0 4F, 05, 05] + +11A08; [73 D0 56, 05, 05] + +11A09; [73 D0 5D, 05, 05] + +11A0A; [73 D0 64, 05, 05] + +11A34; [73 D0 6B, 05, 05] + +11A47; [73 D0 72, 05, 05] + +FDD1 11A5C; [73 D1 02, 05, 05] # Soyombo first primary (compressible) + +11A50; [73 D1 09, 05, 05] + +11A51; [73 D1 10, 05, 05] + +11A52; [73 D1 17, 05, 05] + +11A53; [73 D1 1E, 05, 05] + +11A59; [73 D1 25, 05, 05] + +11A5A; [73 D1 2C, 05, 05] + +11A54; [73 D1 33, 05, 05] + +11A56; [73 D1 3A, 05, 05] + +11A55; [73 D1 41, 05, 05] + +11A57; [73 D1 48, 05, 05] + +11A58; [73 D1 4F, 05, 05] + +11A5B; [73 D1 56, 05, 05] + +11A5C; [73 D3, 05, 05] +11A8A; [73 D3, 05, 20] + +11A83; [73 D5, 05, 05] + +11A5D; [73 D7, 05, 05] +11A8B; [73 D7, 05, 20] + +11A5E; [73 D9 02, 05, 05] + +11A5F; [73 D9 09, 05, 05] + +11A60; [73 DB, 05, 05] +11A8C; [73 DB, 05, 20] + +11A61; [73 DD 02, 05, 05] + +11A62; [73 DD 09, 05, 05] + +11A63; [73 DD 10, 05, 05] + +11A64; [73 DD 17, 05, 05] + +11A65; [73 DD 1E, 05, 05] + +11A66; [73 DD 25, 05, 05] + +11A67; [73 DD 2C, 05, 05] + +11A68; [73 DD 33, 05, 05] + +11A69; [73 DD 3A, 05, 05] + +11A6A; [73 DD 41, 05, 05] + +11A6B; [73 DF, 05, 05] +11A8D; [73 DF, 05, 20] + +11A6C; [73 E1 02, 05, 05] + +11A6D; [73 E1 09, 05, 05] + +11A6E; [73 E1 10, 05, 05] + +11A6F; [73 E3, 05, 05] +11A8E; [73 E3, 05, 20] + +11A70; [73 E5, 05, 05] +11A8F; [73 E5, 05, 20] + +11A71; [73 E7 02, 05, 05] + +11A72; [73 E7 09, 05, 05] + +11A73; [73 E7 10, 05, 05] + +11A74; [73 E9, 05, 05] +11A90; [73 E9, 05, 20] + +11A75; [73 EB 02, 05, 05] + +11A76; [73 EB 09, 05, 05] + +11A77; [73 EB 10, 05, 05] + +11A78; [73 EB 17, 05, 05] + +11A79; [73 EB 1E, 05, 05] + +11A7A; [73 ED, 05, 05] +11A95; [73 ED, 05, 20] + +11A7B; [73 EF, 05, 05] + +11A7C; [73 F1, 05, 05] +11A86; [73 F1, 05, 20] +11A91; [73 F1, 05, 2E] + +11A7D; [73 F3, 05, 05] +11A87; [73 F3, 05, 20] +11A92; [73 F3, 05, 2E] + +11A7E; [73 F5, 05, 05] + +11A7F; [73 F7, 05, 05] +11A88; [73 F7, 05, 20] +11A93; [73 F7, 05, 2E] + +11A80; [73 F9, 05, 05] + +11A81; [73 FB, 05, 05] +11A89; [73 FB, 05, 20] +11A94; [73 FB, 05, 2E] + +11A82; [73 FD 02, 05, 05] + +11A99; [73 FD 09, 05, 05] + +FDD1 11C72; [74 04 02, 05, 05] # Marchen first primary starts new lead byte (compressible) -11C72; [73 C6 09, 05, 05] +11C72; [74 04 09, 05, 05] -11C92; [73 C6 10, 05, 05] +11C92; [74 04 10, 05, 05] -11C73; [73 C6 17, 05, 05] +11C73; [74 04 17, 05, 05] -11C93; [73 C6 1E, 05, 05] +11C93; [74 04 1E, 05, 05] -11C74; [73 C6 25, 05, 05] +11C74; [74 04 25, 05, 05] -11C94; [73 C6 2C, 05, 05] +11C94; [74 04 2C, 05, 05] -11C75; [73 C6 33, 05, 05] +11C75; [74 04 33, 05, 05] -11C95; [73 C6 3A, 05, 05] +11C95; [74 04 3A, 05, 05] -11C76; [73 C6 41, 05, 05] +11C76; [74 04 41, 05, 05] -11C96; [73 C6 48, 05, 05] +11C96; [74 04 48, 05, 05] -11C77; [73 C6 4F, 05, 05] +11C77; [74 04 4F, 05, 05] -11C97; [73 C6 56, 05, 05] +11C97; [74 04 56, 05, 05] -11C78; [73 C6 5D, 05, 05] +11C78; [74 04 5D, 05, 05] -11C98; [73 C6 64, 05, 05] +11C98; [74 04 64, 05, 05] -11C79; [73 C6 6B, 05, 05] +11C79; [74 04 6B, 05, 05] -11C99; [73 C6 72, 05, 05] +11C99; [74 04 72, 05, 05] -11C7A; [73 C6 79, 05, 05] +11C7A; [74 04 79, 05, 05] -11C9A; [73 C6 80, 05, 05] +11C9A; [74 04 80, 05, 05] -11C7B; [73 C6 87, 05, 05] +11C7B; [74 04 87, 05, 05] -11C9B; [73 C6 8E, 05, 05] +11C9B; [74 04 8E, 05, 05] -11C7C; [73 C6 95, 05, 05] +11C7C; [74 04 95, 05, 05] -11C9C; [73 C6 9C, 05, 05] +11C9C; [74 04 9C, 05, 05] -11C7D; [73 C6 A3, 05, 05] +11C7D; [74 04 A3, 05, 05] -11C9D; [73 C6 AA, 05, 05] +11C9D; [74 04 AA, 05, 05] -11C7E; [73 C6 B1, 05, 05] +11C7E; [74 04 B1, 05, 05] -11C9E; [73 C6 B8, 05, 05] +11C9E; [74 04 B8, 05, 05] -11C7F; [73 C6 BF, 05, 05] +11C7F; [74 04 BF, 05, 05] -11C9F; [73 C6 C6, 05, 05] +11C9F; [74 04 C6, 05, 05] -11C80; [73 C6 CD, 05, 05] +11C80; [74 04 CD, 05, 05] -11CA0; [73 C6 D4, 05, 05] +11CA0; [74 04 D4, 05, 05] -11C81; [73 C6 DB, 05, 05] +11C81; [74 04 DB, 05, 05] -11CA1; [73 C6 E2, 05, 05] +11CA1; [74 04 E2, 05, 05] -11C82; [73 C6 E9, 05, 05] +11C82; [74 04 E9, 05, 05] -11CA2; [73 C6 F0, 05, 05] +11CA2; [74 04 F0, 05, 05] -11C83; [73 C6 F7, 05, 05] +11C83; [74 04 F7, 05, 05] -11CA3; [73 C6 FE, 05, 05] +11CA3; [74 04 FE, 05, 05] -11C84; [73 C7 07, 05, 05] +11C84; [74 05 07, 05, 05] -11CA4; [73 C7 0E, 05, 05] +11CA4; [74 05 0E, 05, 05] -11C85; [73 C7 15, 05, 05] +11C85; [74 05 15, 05, 05] -11CA5; [73 C7 1C, 05, 05] +11CA5; [74 05 1C, 05, 05] -11C86; [73 C7 23, 05, 05] +11C86; [74 05 23, 05, 05] -11CA6; [73 C7 2A, 05, 05] +11CA6; [74 05 2A, 05, 05] -11C87; [73 C7 31, 05, 05] +11C87; [74 05 31, 05, 05] -11CA7; [73 C7 38, 05, 05] +11CA7; [74 05 38, 05, 05] -11C88; [73 C7 3F, 05, 05] +11C88; [74 05 3F, 05, 05] -11C89; [73 C7 46, 05, 05] +11C89; [74 05 46, 05, 05] -11CA9; [73 C7 4D, 05, 05] +11CA9; [74 05 4D, 05, 05] -11C8A; [73 C7 54, 05, 05] +11C8A; [74 05 54, 05, 05] -11CAA; [73 C7 5B, 05, 05] +11CAA; [74 05 5B, 05, 05] -11C8B; [73 C7 62, 05, 05] +11C8B; [74 05 62, 05, 05] -11CAB; [73 C7 69, 05, 05] +11CAB; [74 05 69, 05, 05] -11C8C; [73 C7 70, 05, 05] +11C8C; [74 05 70, 05, 05] -11CAC; [73 C7 77, 05, 05] +11CAC; [74 05 77, 05, 05] -11C8D; [73 C7 7E, 05, 05] +11C8D; [74 05 7E, 05, 05] -11CAD; [73 C7 85, 05, 05] +11CAD; [74 05 85, 05, 05] -11C8E; [73 C7 8C, 05, 05] +11C8E; [74 05 8C, 05, 05] -11CAE; [73 C7 93, 05, 05] +11CAE; [74 05 93, 05, 05] -11C8F; [73 C7 9A, 05, 05] +11C8F; [74 05 9A, 05, 05] -11CAF; [73 C7 A1, 05, 05] +11CAF; [74 05 A1, 05, 05] -11CB0; [73 C7 A8, 05, 05] +11CB0; [74 05 A8, 05, 05] -11CB1; [73 C7 AF, 05, 05] +11CB1; [74 05 AF, 05, 05] -11CB2; [73 C7 B6, 05, 05] +11CB2; [74 05 B6, 05, 05] -11CB3; [73 C7 BD, 05, 05] +11CB3; [74 05 BD, 05, 05] -11CB4; [73 C7 C4, 05, 05] +11CB4; [74 05 C4, 05, 05] -FDD1 1C00; [73 C8 02, 05, 05] # Lepcha first primary (compressible) +FDD1 1C00; [74 06 02, 05, 05] # Lepcha first primary (compressible) -1C00; [73 C8 09, 05, 05] +1C00; [74 06 09, 05, 05] -1C01; [73 C8 10, 05, 05] +1C01; [74 06 10, 05, 05] -1C02; [73 C8 17, 05, 05] +1C02; [74 06 17, 05, 05] -1C03; [73 C8 1E, 05, 05] +1C03; [74 06 1E, 05, 05] -1C04; [73 C8 25, 05, 05] +1C04; [74 06 25, 05, 05] -1C05; [73 C8 2C, 05, 05] +1C05; [74 06 2C, 05, 05] -1C06; [73 C8 33, 05, 05] +1C06; [74 06 33, 05, 05] -1C07; [73 C8 3A, 05, 05] +1C07; [74 06 3A, 05, 05] -1C08; [73 C8 41, 05, 05] +1C08; [74 06 41, 05, 05] -1C09; [73 C8 48, 05, 05] +1C09; [74 06 48, 05, 05] -1C4D; [73 C8 4F, 05, 05] +1C4D; [74 06 4F, 05, 05] -1C4E; [73 C8 56, 05, 05] +1C4E; [74 06 56, 05, 05] -1C4F; [73 C8 5D, 05, 05] +1C4F; [74 06 5D, 05, 05] -1C0A; [73 C8 64, 05, 05] +1C0A; [74 06 64, 05, 05] -1C0B; [73 C8 6B, 05, 05] +1C0B; [74 06 6B, 05, 05] -1C0C; [73 C8 72, 05, 05] +1C0C; [74 06 72, 05, 05] -1C0D; [73 C8 79, 05, 05] +1C0D; [74 06 79, 05, 05] -1C0E; [73 C8 80, 05, 05] +1C0E; [74 06 80, 05, 05] -1C0F; [73 C8 87, 05, 05] +1C0F; [74 06 87, 05, 05] -1C10; [73 C8 8E, 05, 05] +1C10; [74 06 8E, 05, 05] -1C11; [73 C8 95, 05, 05] +1C11; [74 06 95, 05, 05] -1C12; [73 C8 9C, 05, 05] +1C12; [74 06 9C, 05, 05] -1C13; [73 C8 A3, 05, 05] +1C13; [74 06 A3, 05, 05] -1C14; [73 C8 AA, 05, 05] +1C14; [74 06 AA, 05, 05] -1C15; [73 C8 B1, 05, 05] +1C15; [74 06 B1, 05, 05] -1C16; [73 C8 B8, 05, 05] +1C16; [74 06 B8, 05, 05] -1C17; [73 C8 BF, 05, 05] +1C17; [74 06 BF, 05, 05] -1C18; [73 C8 C6, 05, 05] +1C18; [74 06 C6, 05, 05] -1C19; [73 C8 CD, 05, 05] +1C19; [74 06 CD, 05, 05] -1C1A; [73 C8 D4, 05, 05] +1C1A; [74 06 D4, 05, 05] -1C24; [73 C8 DB, 05, 05] +1C24; [74 06 DB, 05, 05] -1C1B; [73 C8 E2, 05, 05] +1C1B; [74 06 E2, 05, 05] -1C25; [73 C8 E9, 05, 05] +1C25; [74 06 E9, 05, 05] -1C1C; [73 C8 F0, 05, 05] +1C1C; [74 06 F0, 05, 05] -1C1D; [73 C8 F7, 05, 05] +1C1D; [74 06 F7, 05, 05] -1C1E; [73 C8 FE, 05, 05] +1C1E; [74 06 FE, 05, 05] -1C1F; [73 C9 07, 05, 05] +1C1F; [74 07 07, 05, 05] -1C20; [73 C9 0E, 05, 05] +1C20; [74 07 0E, 05, 05] -1C21; [73 C9 15, 05, 05] +1C21; [74 07 15, 05, 05] -1C22; [73 C9 1C, 05, 05] +1C22; [74 07 1C, 05, 05] -1C23; [73 C9 23, 05, 05] +1C23; [74 07 23, 05, 05] -1C36; [73 C9 2A, 05, 05] +1C36; [74 07 2A, 05, 05] -1C26; [73 C9 31, 05, 05] +1C26; [74 07 31, 05, 05] -1C27; [73 C9 38, 05, 05] +1C27; [74 07 38, 05, 05] -1C28; [73 C9 3F, 05, 05] +1C28; [74 07 3F, 05, 05] -1C29; [73 C9 46, 05, 05] +1C29; [74 07 46, 05, 05] -1C2A; [73 C9 4D, 05, 05] +1C2A; [74 07 4D, 05, 05] -1C2B; [73 C9 54, 05, 05] +1C2B; [74 07 54, 05, 05] -1C2C; [73 C9 5B, 05, 05] +1C2C; [74 07 5B, 05, 05] -1C2D; [73 C9 62, 05, 05] +1C2D; [74 07 62, 05, 05] -1C2E; [73 C9 69, 05, 05] +1C2E; [74 07 69, 05, 05] -1C2F; [73 C9 70, 05, 05] +1C2F; [74 07 70, 05, 05] -1C30; [73 C9 77, 05, 05] +1C30; [74 07 77, 05, 05] -1C31; [73 C9 7E, 05, 05] +1C31; [74 07 7E, 05, 05] -1C32; [73 C9 85, 05, 05] +1C32; [74 07 85, 05, 05] -1C33; [73 C9 8C, 05, 05] +1C33; [74 07 8C, 05, 05] -1C34; [73 C9 93, 05, 05] +1C34; [74 07 93, 05, 05] -1C35; [73 C9 9A, 05, 05] +1C35; [74 07 9A, 05, 05] -FDD1 A840; [73 CA 02, 05, 05] # Phags-pa first primary (compressible) +FDD1 A840; [74 08 02, 05, 05] # Phags-pa first primary (compressible) -A840; [73 CA 09, 05, 05] +A840; [74 08 09, 05, 05] -A841; [73 CA 10, 05, 05] +A841; [74 08 10, 05, 05] -A842; [73 CA 17, 05, 05] +A842; [74 08 17, 05, 05] -A843; [73 CA 1E, 05, 05] +A843; [74 08 1E, 05, 05] -A844; [73 CA 25, 05, 05] +A844; [74 08 25, 05, 05] -A845; [73 CA 2C, 05, 05] +A845; [74 08 2C, 05, 05] -A846; [73 CA 33, 05, 05] +A846; [74 08 33, 05, 05] -A847; [73 CA 3A, 05, 05] +A847; [74 08 3A, 05, 05] -A869; [73 CA 41, 05, 05] +A869; [74 08 41, 05, 05] -A86A; [73 CA 48, 05, 05] +A86A; [74 08 48, 05, 05] -A86B; [73 CA 4F, 05, 05] +A86B; [74 08 4F, 05, 05] -A86C; [73 CA 56, 05, 05] +A86C; [74 08 56, 05, 05] -A848; [73 CA 5D, 05, 05] +A848; [74 08 5D, 05, 05] -A849; [73 CA 64, 05, 05] +A849; [74 08 64, 05, 05] -A84A; [73 CA 6B, 05, 05] +A84A; [74 08 6B, 05, 05] -A84B; [73 CA 72, 05, 05] +A84B; [74 08 72, 05, 05] -A84C; [73 CA 79, 05, 05] +A84C; [74 08 79, 05, 05] -A84D; [73 CA 80, 05, 05] +A84D; [74 08 80, 05, 05] -A84E; [73 CA 87, 05, 05] +A84E; [74 08 87, 05, 05] -A84F; [73 CA 8E, 05, 05] +A84F; [74 08 8E, 05, 05] -A850; [73 CA 95, 05, 05] +A850; [74 08 95, 05, 05] -A851; [73 CA 9C, 05, 05] +A851; [74 08 9C, 05, 05] -A852; [73 CA A3, 05, 05] +A852; [74 08 A3, 05, 05] -A853; [73 CA AA, 05, 05] +A853; [74 08 AA, 05, 05] -A867; [73 CA B1, 05, 05] +A867; [74 08 B1, 05, 05] -A854; [73 CA B8, 05, 05] +A854; [74 08 B8, 05, 05] -A855; [73 CA BF, 05, 05] +A855; [74 08 BF, 05, 05] -A856; [73 CA C6, 05, 05] +A856; [74 08 C6, 05, 05] -A857; [73 CA CD, 05, 05] +A857; [74 08 CD, 05, 05] -A868; [73 CA D4, 05, 05] +A868; [74 08 D4, 05, 05] -A86D; [73 CA DB, 05, 05] +A86D; [74 08 DB, 05, 05] -A858; [73 CA E2, 05, 05] +A858; [74 08 E2, 05, 05] -A871; [73 CA E9, 05, 05] +A871; [74 08 E9, 05, 05] -A872; [73 CA F0, 05, 05] +A872; [74 08 F0, 05, 05] -A859; [73 CA F7, 05, 05] +A859; [74 08 F7, 05, 05] -A85A; [73 CA FE, 05, 05] +A85A; [74 08 FE, 05, 05] -A86E; [73 CB 07, 05, 05] +A86E; [74 09 07, 05, 05] -A85B; [73 CB 0E, 05, 05] +A85B; [74 09 0E, 05, 05] -A85C; [73 CB 15, 05, 05] +A85C; [74 09 15, 05, 05] -A86F; [73 CB 1C, 05, 05] +A86F; [74 09 1C, 05, 05] -A870; [73 CB 23, 05, 05] +A870; [74 09 23, 05, 05] -A85D; [73 CB 2A, 05, 05] +A85D; [74 09 2A, 05, 05] -A862; [73 CB 31, 05, 05] +A862; [74 09 31, 05, 05] -A863; [73 CB 38, 05, 05] +A863; [74 09 38, 05, 05] -A864; [73 CB 3F, 05, 05] +A864; [74 09 3F, 05, 05] -A865; [73 CB 46, 05, 05] +A865; [74 09 46, 05, 05] -A85E; [73 CB 4D, 05, 05] +A85E; [74 09 4D, 05, 05] -A85F; [73 CB 54, 05, 05] +A85F; [74 09 54, 05, 05] -A860; [73 CB 5B, 05, 05] +A860; [74 09 5B, 05, 05] -A861; [73 CB 62, 05, 05] +A861; [74 09 62, 05, 05] -A866; [73 CB 69, 05, 05] +A866; [74 09 69, 05, 05] -A873; [73 CB 70, 05, 05] +A873; [74 09 70, 05, 05] -FDD1 1900; [73 CC 02, 05, 05] # LIMBU first primary (compressible) +FDD1 1900; [74 0A 02, 05, 05] # LIMBU first primary (compressible) -1900; [73 CC 09, 05, 05] +1900; [74 0A 09, 05, 05] -1901; [73 CC 10, 05, 05] +1901; [74 0A 10, 05, 05] -1902; [73 CC 17, 05, 05] +1902; [74 0A 17, 05, 05] -1903; [73 CC 1E, 05, 05] +1903; [74 0A 1E, 05, 05] -1904; [73 CC 25, 05, 05] +1904; [74 0A 25, 05, 05] -1905; [73 CC 2C, 05, 05] +1905; [74 0A 2C, 05, 05] -1906; [73 CC 33, 05, 05] +1906; [74 0A 33, 05, 05] -1907; [73 CC 3A, 05, 05] +1907; [74 0A 3A, 05, 05] -1908; [73 CE, 05, 05] -191D; [73 CE, 05, 20][73 D6, 05, 20] +1908; [74 0C, 05, 05] +191D; [74 0C, 05, 20][74 14, 05, 20] -1909; [73 D0 02, 05, 05] +1909; [74 0E 02, 05, 05] -190A; [73 D0 09, 05, 05] +190A; [74 0E 09, 05, 05] -190B; [73 D2, 05, 05] -191E; [73 D2, 05, 20][73 D8, 05, 20] +190B; [74 10, 05, 05] +191E; [74 10, 05, 20][74 16, 05, 20] -190C; [73 D4 02, 05, 05] +190C; [74 12 02, 05, 05] -190D; [73 D4 09, 05, 05] +190D; [74 12 09, 05, 05] -190E; [73 D4 10, 05, 05] +190E; [74 12 10, 05, 05] -190F; [73 D4 17, 05, 05] +190F; [74 12 17, 05, 05] -1910; [73 D4 1E, 05, 05] +1910; [74 12 1E, 05, 05] -1911; [73 D4 25, 05, 05] +1911; [74 12 25, 05, 05] -1912; [73 D4 2C, 05, 05] +1912; [74 12 2C, 05, 05] -1913; [73 D4 33, 05, 05] +1913; [74 12 33, 05, 05] -1914; [73 D4 3A, 05, 05] +1914; [74 12 3A, 05, 05] -1915; [73 D4 41, 05, 05] +1915; [74 12 41, 05, 05] -1916; [73 D4 48, 05, 05] +1916; [74 12 48, 05, 05] -1917; [73 D4 4F, 05, 05] +1917; [74 12 4F, 05, 05] -1918; [73 D4 56, 05, 05] +1918; [74 12 56, 05, 05] -1919; [73 D4 5D, 05, 05] +1919; [74 12 5D, 05, 05] -191A; [73 D4 64, 05, 05] +191A; [74 12 64, 05, 05] -191B; [73 D4 6B, 05, 05] +191B; [74 12 6B, 05, 05] -191C; [73 D4 72, 05, 05] +191C; [74 12 72, 05, 05] -1920; [73 D4 79, 05, 05] +1920; [74 12 79, 05, 05] -1921; [73 D4 80, 05, 05] +1921; [74 12 80, 05, 05] -1922; [73 D4 87, 05, 05] +1922; [74 12 87, 05, 05] -1923; [73 D4 8E, 05, 05] +1923; [74 12 8E, 05, 05] -1924; [73 D4 95, 05, 05] +1924; [74 12 95, 05, 05] -1925; [73 D4 9C, 05, 05] +1925; [74 12 9C, 05, 05] -1926; [73 D4 A3, 05, 05] +1926; [74 12 A3, 05, 05] -1927; [73 D4 AA, 05, 05] +1927; [74 12 AA, 05, 05] -1928; [73 D4 B1, 05, 05] +1928; [74 12 B1, 05, 05] -1929; [73 D6, 05, 05] +1929; [74 14, 05, 05] -192A; [73 D8, 05, 05] +192A; [74 16, 05, 05] -192B; [73 DA 02, 05, 05] +192B; [74 18 02, 05, 05] -1930; [73 DA 09, 05, 05] +1930; [74 18 09, 05, 05] -1931; [73 DA 10, 05, 05] +1931; [74 18 10, 05, 05] -1932; [73 DA 17, 05, 05] +1932; [74 18 17, 05, 05] -1933; [73 DA 1E, 05, 05] +1933; [74 18 1E, 05, 05] -1934; [73 DA 25, 05, 05] +1934; [74 18 25, 05, 05] -1935; [73 DA 2C, 05, 05] +1935; [74 18 2C, 05, 05] -1936; [73 DA 33, 05, 05] +1936; [74 18 33, 05, 05] -1937; [73 DA 3A, 05, 05] +1937; [74 18 3A, 05, 05] -1938; [73 DA 41, 05, 05] +1938; [74 18 41, 05, 05] -FDD1 1703; [73 DB 02, 05, 05] # TAGALOG first primary (compressible) +FDD1 1703; [74 19 02, 05, 05] # TAGALOG first primary (compressible) -1700; [73 DB 09, 05, 05] +1700; [74 19 09, 05, 05] -1701; [73 DB 10, 05, 05] +1701; [74 19 10, 05, 05] -1702; [73 DB 17, 05, 05] +1702; [74 19 17, 05, 05] -1703; [73 DB 1E, 05, 05] +1703; [74 19 1E, 05, 05] -1704; [73 DB 25, 05, 05] +1704; [74 19 25, 05, 05] -1705; [73 DB 2C, 05, 05] +1705; [74 19 2C, 05, 05] -1706; [73 DB 33, 05, 05] +1706; [74 19 33, 05, 05] -1707; [73 DB 3A, 05, 05] +1707; [74 19 3A, 05, 05] -1708; [73 DB 41, 05, 05] +1708; [74 19 41, 05, 05] -1709; [73 DB 48, 05, 05] +1709; [74 19 48, 05, 05] -170A; [73 DB 4F, 05, 05] +170A; [74 19 4F, 05, 05] -170B; [73 DB 56, 05, 05] +170B; [74 19 56, 05, 05] -170C; [73 DB 5D, 05, 05] +170C; [74 19 5D, 05, 05] -170E; [73 DB 64, 05, 05] +170E; [74 19 64, 05, 05] -170F; [73 DB 6B, 05, 05] +170F; [74 19 6B, 05, 05] -1710; [73 DB 72, 05, 05] +1710; [74 19 72, 05, 05] -1711; [73 DB 79, 05, 05] +1711; [74 19 79, 05, 05] -1712; [73 DB 80, 05, 05] +1712; [74 19 80, 05, 05] -1713; [73 DB 87, 05, 05] +1713; [74 19 87, 05, 05] -1714; [73 DB 8E, 05, 05] +1714; [74 19 8E, 05, 05] -FDD1 1723; [73 DC 02, 05, 05] # HANUNOO first primary (compressible) +FDD1 1723; [74 1A 02, 05, 05] # HANUNOO first primary (compressible) -1720; [73 DC 09, 05, 05] +1720; [74 1A 09, 05, 05] -1721; [73 DC 10, 05, 05] +1721; [74 1A 10, 05, 05] -1722; [73 DC 17, 05, 05] +1722; [74 1A 17, 05, 05] -1723; [73 DC 1E, 05, 05] +1723; [74 1A 1E, 05, 05] -1724; [73 DC 25, 05, 05] +1724; [74 1A 25, 05, 05] -1725; [73 DC 2C, 05, 05] +1725; [74 1A 2C, 05, 05] -1726; [73 DC 33, 05, 05] +1726; [74 1A 33, 05, 05] -1727; [73 DC 3A, 05, 05] +1727; [74 1A 3A, 05, 05] -1728; [73 DC 41, 05, 05] +1728; [74 1A 41, 05, 05] -1729; [73 DC 48, 05, 05] +1729; [74 1A 48, 05, 05] -172A; [73 DC 4F, 05, 05] +172A; [74 1A 4F, 05, 05] -172B; [73 DC 56, 05, 05] +172B; [74 1A 56, 05, 05] -172C; [73 DC 5D, 05, 05] +172C; [74 1A 5D, 05, 05] -172D; [73 DC 64, 05, 05] +172D; [74 1A 64, 05, 05] -172E; [73 DC 6B, 05, 05] +172E; [74 1A 6B, 05, 05] -172F; [73 DC 72, 05, 05] +172F; [74 1A 72, 05, 05] -1730; [73 DC 79, 05, 05] +1730; [74 1A 79, 05, 05] -1731; [73 DC 80, 05, 05] +1731; [74 1A 80, 05, 05] -1732; [73 DC 87, 05, 05] +1732; [74 1A 87, 05, 05] -1733; [73 DC 8E, 05, 05] +1733; [74 1A 8E, 05, 05] -1734; [73 DC 95, 05, 05] +1734; [74 1A 95, 05, 05] -FDD1 1743; [73 DD 02, 05, 05] # BUHID first primary (compressible) +FDD1 1743; [74 1B 02, 05, 05] # BUHID first primary (compressible) -1740; [73 DD 09, 05, 05] +1740; [74 1B 09, 05, 05] -1741; [73 DD 10, 05, 05] +1741; [74 1B 10, 05, 05] -1742; [73 DD 17, 05, 05] +1742; [74 1B 17, 05, 05] -1743; [73 DD 1E, 05, 05] +1743; [74 1B 1E, 05, 05] -1744; [73 DD 25, 05, 05] +1744; [74 1B 25, 05, 05] -1745; [73 DD 2C, 05, 05] +1745; [74 1B 2C, 05, 05] -1746; [73 DD 33, 05, 05] +1746; [74 1B 33, 05, 05] -1747; [73 DD 3A, 05, 05] +1747; [74 1B 3A, 05, 05] -1748; [73 DD 41, 05, 05] +1748; [74 1B 41, 05, 05] -1749; [73 DD 48, 05, 05] +1749; [74 1B 48, 05, 05] -174A; [73 DD 4F, 05, 05] +174A; [74 1B 4F, 05, 05] -174B; [73 DD 56, 05, 05] +174B; [74 1B 56, 05, 05] -174C; [73 DD 5D, 05, 05] +174C; [74 1B 5D, 05, 05] -174D; [73 DD 64, 05, 05] +174D; [74 1B 64, 05, 05] -174E; [73 DD 6B, 05, 05] +174E; [74 1B 6B, 05, 05] -174F; [73 DD 72, 05, 05] +174F; [74 1B 72, 05, 05] -1750; [73 DD 79, 05, 05] +1750; [74 1B 79, 05, 05] -1751; [73 DD 80, 05, 05] +1751; [74 1B 80, 05, 05] -1752; [73 DD 87, 05, 05] +1752; [74 1B 87, 05, 05] -1753; [73 DD 8E, 05, 05] +1753; [74 1B 8E, 05, 05] -FDD1 1763; [73 DE 02, 05, 05] # TAGBANWA first primary (compressible) +FDD1 1763; [74 1C 02, 05, 05] # TAGBANWA first primary (compressible) -1760; [73 DE 09, 05, 05] +1760; [74 1C 09, 05, 05] -1761; [73 DE 10, 05, 05] +1761; [74 1C 10, 05, 05] -1762; [73 DE 17, 05, 05] +1762; [74 1C 17, 05, 05] -1763; [73 DE 1E, 05, 05] +1763; [74 1C 1E, 05, 05] -1764; [73 DE 25, 05, 05] +1764; [74 1C 25, 05, 05] -1765; [73 DE 2C, 05, 05] +1765; [74 1C 2C, 05, 05] -1766; [73 DE 33, 05, 05] +1766; [74 1C 33, 05, 05] -1767; [73 DE 3A, 05, 05] +1767; [74 1C 3A, 05, 05] -1768; [73 DE 41, 05, 05] +1768; [74 1C 41, 05, 05] -1769; [73 DE 48, 05, 05] +1769; [74 1C 48, 05, 05] -176A; [73 DE 4F, 05, 05] +176A; [74 1C 4F, 05, 05] -176B; [73 DE 56, 05, 05] +176B; [74 1C 56, 05, 05] -176C; [73 DE 5D, 05, 05] +176C; [74 1C 5D, 05, 05] -176E; [73 DE 64, 05, 05] +176E; [74 1C 64, 05, 05] -176F; [73 DE 6B, 05, 05] +176F; [74 1C 6B, 05, 05] -1770; [73 DE 72, 05, 05] +1770; [74 1C 72, 05, 05] -1772; [73 DE 79, 05, 05] +1772; [74 1C 79, 05, 05] -1773; [73 DE 80, 05, 05] +1773; [74 1C 80, 05, 05] -FDD1 1A00; [73 DF 02, 05, 05] # BUGINESE first primary (compressible) +FDD1 1A00; [74 1D 02, 05, 05] # BUGINESE first primary (compressible) -1A00; [73 DF 09, 05, 05] +1A00; [74 1D 09, 05, 05] -1A01; [73 DF 10, 05, 05] +1A01; [74 1D 10, 05, 05] -1A02; [73 DF 17, 05, 05] +1A02; [74 1D 17, 05, 05] -1A03; [73 DF 1E, 05, 05] +1A03; [74 1D 1E, 05, 05] -1A04; [73 DF 25, 05, 05] +1A04; [74 1D 25, 05, 05] -1A05; [73 DF 2C, 05, 05] +1A05; [74 1D 2C, 05, 05] -1A06; [73 DF 33, 05, 05] +1A06; [74 1D 33, 05, 05] -1A07; [73 DF 3A, 05, 05] +1A07; [74 1D 3A, 05, 05] -1A08; [73 DF 41, 05, 05] +1A08; [74 1D 41, 05, 05] -1A09; [73 DF 48, 05, 05] +1A09; [74 1D 48, 05, 05] -1A0A; [73 DF 4F, 05, 05] +1A0A; [74 1D 4F, 05, 05] -1A0B; [73 DF 56, 05, 05] +1A0B; [74 1D 56, 05, 05] -1A0C; [73 DF 5D, 05, 05] +1A0C; [74 1D 5D, 05, 05] -1A0D; [73 DF 64, 05, 05] +1A0D; [74 1D 64, 05, 05] -1A0E; [73 DF 6B, 05, 05] +1A0E; [74 1D 6B, 05, 05] -1A0F; [73 DF 72, 05, 05] +1A0F; [74 1D 72, 05, 05] -1A10; [73 DF 79, 05, 05] +1A10; [74 1D 79, 05, 05] -1A11; [73 DF 80, 05, 05] +1A11; [74 1D 80, 05, 05] -1A12; [73 DF 87, 05, 05] +1A12; [74 1D 87, 05, 05] -1A13; [73 DF 8E, 05, 05] +1A13; [74 1D 8E, 05, 05] -1A14; [73 DF 95, 05, 05] +1A14; [74 1D 95, 05, 05] -1A15; [73 DF 9C, 05, 05] +1A15; [74 1D 9C, 05, 05] -1A16; [73 DF A3, 05, 05] +1A16; [74 1D A3, 05, 05] -1A17; [73 DF AA, 05, 05] +1A17; [74 1D AA, 05, 05] -1A18; [73 DF B1, 05, 05] +1A18; [74 1D B1, 05, 05] -1A19; [73 DF B8, 05, 05] +1A19; [74 1D B8, 05, 05] -1A1A; [73 DF BF, 05, 05] +1A1A; [74 1D BF, 05, 05] -1A1B; [73 DF C6, 05, 05] +1A1B; [74 1D C6, 05, 05] -FDD1 1BC0; [74 04 02, 05, 05] # Batak first primary starts new lead byte (compressible) +FDD1 1BC0; [74 1E 02, 05, 05] # Batak first primary (compressible) -1BC0; [74 06, 05, 05] -1BC1; [74 06, 05, 20] +1BC0; [74 20, 05, 05] +1BC1; [74 20, 05, 20] -1BC2; [74 08, 05, 05] -1BC3; [74 08, 05, 20] -1BC4; [74 08, 05, 20] +1BC2; [74 22, 05, 05] +1BC3; [74 22, 05, 20] +1BC4; [74 22, 05, 20] -1BC5; [74 0A, 05, 05] -1BC6; [74 0A, 05, 20] +1BC5; [74 24, 05, 05] +1BC6; [74 24, 05, 20] -1BC7; [74 0C, 05, 05] -1BC8; [74 0C, 05, 20] +1BC7; [74 26, 05, 05] +1BC8; [74 26, 05, 20] -1BC9; [74 0E, 05, 05] -1BCA; [74 0E, 05, 20] +1BC9; [74 28, 05, 05] +1BCA; [74 28, 05, 20] -1BCB; [74 10, 05, 05] -1BCC; [74 10, 05, 20] -1BCD; [74 10, 05, 20] +1BCB; [74 2A, 05, 05] +1BCC; [74 2A, 05, 20] +1BCD; [74 2A, 05, 20] -1BCE; [74 12, 05, 05] -1BCF; [74 12, 05, 20] +1BCE; [74 2C, 05, 05] +1BCF; [74 2C, 05, 20] -1BD0; [74 14 02, 05, 05] +1BD0; [74 2E 02, 05, 05] -1BD1; [74 14 09, 05, 05] +1BD1; [74 2E 09, 05, 05] -1BD2; [74 16, 05, 05] -1BD3; [74 16, 05, 20] +1BD2; [74 30, 05, 05] +1BD3; [74 30, 05, 20] -1BD4; [74 18, 05, 05] -1BD5; [74 18, 05, 20] +1BD4; [74 32, 05, 05] +1BD5; [74 32, 05, 20] -1BD6; [74 1A, 05, 05] -1BD7; [74 1A, 05, 20] +1BD6; [74 34, 05, 05] +1BD7; [74 34, 05, 20] -1BD8; [74 1C, 05, 05] -1BD9; [74 1C, 05, 20] -1BDA; [74 1C, 05, 20] +1BD8; [74 36, 05, 05] +1BD9; [74 36, 05, 20] +1BDA; [74 36, 05, 20] -1BDB; [74 1E, 05, 05] -1BDC; [74 1E, 05, 20] +1BDB; [74 38, 05, 05] +1BDC; [74 38, 05, 20] -1BDD; [74 20, 05, 05] +1BDD; [74 3A, 05, 05] -1BDE; [74 22, 05, 05] -1BDF; [74 22, 05, 20] +1BDE; [74 3C, 05, 05] +1BDF; [74 3C, 05, 20] -1BE0; [74 24 02, 05, 05] +1BE0; [74 3E 02, 05, 05] -1BE1; [74 24 09, 05, 05] +1BE1; [74 3E 09, 05, 05] -1BE2; [74 24 10, 05, 05] +1BE2; [74 3E 10, 05, 05] -1BE3; [74 24 17, 05, 05] +1BE3; [74 3E 17, 05, 05] -1BE4; [74 24 1E, 05, 05] +1BE4; [74 3E 1E, 05, 05] -1BE5; [74 24 25, 05, 05] +1BE5; [74 3E 25, 05, 05] -1BE7; [74 26, 05, 05] -1BE8; [74 26, 05, 20] +1BE7; [74 40, 05, 05] +1BE8; [74 40, 05, 20] -1BE9; [74 28, 05, 05] +1BE9; [74 42, 05, 05] -1BEA; [74 2A, 05, 05] -1BEB; [74 2A, 05, 20] +1BEA; [74 44, 05, 05] +1BEB; [74 44, 05, 20] -1BEC; [74 2C, 05, 05] -1BED; [74 2C, 05, 20] +1BEC; [74 46, 05, 05] +1BED; [74 46, 05, 20] -1BEE; [74 2E, 05, 05] -1BEF; [74 2E, 05, 20] +1BEE; [74 48, 05, 05] +1BEF; [74 48, 05, 20] -1BF0; [74 30 02, 05, 05] +1BF0; [74 4A 02, 05, 05] -1BF1; [74 30 09, 05, 05] +1BF1; [74 4A 09, 05, 05] -1BF2; [74 30 10, 05, 05] +1BF2; [74 4A 10, 05, 05] -1BF3; [74 30 17, 05, 05] +1BF3; [74 4A 17, 05, 05] -FDD1 A930; [74 31 02, 05, 05] # Rejang first primary (compressible) +FDD1 A930; [74 4B 02, 05, 05] # Rejang first primary (compressible) -A930; [74 31 09, 05, 05] +A930; [74 4B 09, 05, 05] -A931; [74 31 10, 05, 05] +A931; [74 4B 10, 05, 05] -A932; [74 31 17, 05, 05] +A932; [74 4B 17, 05, 05] -A933; [74 31 1E, 05, 05] +A933; [74 4B 1E, 05, 05] -A934; [74 31 25, 05, 05] +A934; [74 4B 25, 05, 05] -A935; [74 31 2C, 05, 05] +A935; [74 4B 2C, 05, 05] -A936; [74 31 33, 05, 05] +A936; [74 4B 33, 05, 05] -A937; [74 31 3A, 05, 05] +A937; [74 4B 3A, 05, 05] -A938; [74 31 41, 05, 05] +A938; [74 4B 41, 05, 05] -A939; [74 31 48, 05, 05] +A939; [74 4B 48, 05, 05] -A93A; [74 31 4F, 05, 05] +A93A; [74 4B 4F, 05, 05] -A93B; [74 31 56, 05, 05] +A93B; [74 4B 56, 05, 05] -A93C; [74 31 5D, 05, 05] +A93C; [74 4B 5D, 05, 05] -A93D; [74 31 64, 05, 05] +A93D; [74 4B 64, 05, 05] -A93E; [74 31 6B, 05, 05] +A93E; [74 4B 6B, 05, 05] -A93F; [74 31 72, 05, 05] +A93F; [74 4B 72, 05, 05] -A940; [74 31 79, 05, 05] +A940; [74 4B 79, 05, 05] -A941; [74 31 80, 05, 05] +A941; [74 4B 80, 05, 05] -A942; [74 31 87, 05, 05] +A942; [74 4B 87, 05, 05] -A943; [74 31 8E, 05, 05] +A943; [74 4B 8E, 05, 05] -A944; [74 31 95, 05, 05] +A944; [74 4B 95, 05, 05] -A945; [74 31 9C, 05, 05] +A945; [74 4B 9C, 05, 05] -A946; [74 31 A3, 05, 05] +A946; [74 4B A3, 05, 05] -A947; [74 31 AA, 05, 05] +A947; [74 4B AA, 05, 05] -A948; [74 31 B1, 05, 05] +A948; [74 4B B1, 05, 05] -A949; [74 31 B8, 05, 05] +A949; [74 4B B8, 05, 05] -A94A; [74 31 BF, 05, 05] +A94A; [74 4B BF, 05, 05] -A94B; [74 31 C6, 05, 05] +A94B; [74 4B C6, 05, 05] -A94C; [74 31 CD, 05, 05] +A94C; [74 4B CD, 05, 05] -A94D; [74 31 D4, 05, 05] +A94D; [74 4B D4, 05, 05] -A94E; [74 31 DB, 05, 05] +A94E; [74 4B DB, 05, 05] -A94F; [74 31 E2, 05, 05] +A94F; [74 4B E2, 05, 05] -A950; [74 31 E9, 05, 05] +A950; [74 4B E9, 05, 05] -A951; [74 31 F0, 05, 05] +A951; [74 4B F0, 05, 05] -A952; [74 31 F7, 05, 05] +A952; [74 4B F7, 05, 05] -A953; [74 31 FE, 05, 05] +A953; [74 4B FE, 05, 05] -FDD1 A90A; [74 33 02, 05, 05] # Kayah Li first primary (compressible) +FDD1 A90A; [74 4D 02, 05, 05] # Kayah Li first primary (compressible) -A90A; [74 33 09, 05, 05] +A90A; [74 4D 09, 05, 05] -A90B; [74 33 10, 05, 05] +A90B; [74 4D 10, 05, 05] -A90C; [74 33 17, 05, 05] +A90C; [74 4D 17, 05, 05] -A90D; [74 33 1E, 05, 05] +A90D; [74 4D 1E, 05, 05] -A90E; [74 33 25, 05, 05] +A90E; [74 4D 25, 05, 05] -A90F; [74 33 2C, 05, 05] +A90F; [74 4D 2C, 05, 05] -A910; [74 33 33, 05, 05] +A910; [74 4D 33, 05, 05] -A911; [74 33 3A, 05, 05] +A911; [74 4D 3A, 05, 05] -A912; [74 33 41, 05, 05] +A912; [74 4D 41, 05, 05] -A913; [74 33 48, 05, 05] +A913; [74 4D 48, 05, 05] -A914; [74 33 4F, 05, 05] +A914; [74 4D 4F, 05, 05] -A915; [74 33 56, 05, 05] +A915; [74 4D 56, 05, 05] -A916; [74 33 5D, 05, 05] +A916; [74 4D 5D, 05, 05] -A917; [74 33 64, 05, 05] +A917; [74 4D 64, 05, 05] -A918; [74 33 6B, 05, 05] +A918; [74 4D 6B, 05, 05] -A919; [74 33 72, 05, 05] +A919; [74 4D 72, 05, 05] -A91A; [74 33 79, 05, 05] +A91A; [74 4D 79, 05, 05] -A91B; [74 33 80, 05, 05] +A91B; [74 4D 80, 05, 05] -A91C; [74 33 87, 05, 05] +A91C; [74 4D 87, 05, 05] -A91D; [74 33 8E, 05, 05] +A91D; [74 4D 8E, 05, 05] -A91E; [74 33 95, 05, 05] +A91E; [74 4D 95, 05, 05] -A91F; [74 33 9C, 05, 05] +A91F; [74 4D 9C, 05, 05] -A920; [74 33 A3, 05, 05] +A920; [74 4D A3, 05, 05] -A921; [74 33 AA, 05, 05] +A921; [74 4D AA, 05, 05] -A922; [74 33 B1, 05, 05] +A922; [74 4D B1, 05, 05] -A923; [74 33 B8, 05, 05] +A923; [74 4D B8, 05, 05] -A924; [74 33 BF, 05, 05] +A924; [74 4D BF, 05, 05] -A925; [74 33 C6, 05, 05] +A925; [74 4D C6, 05, 05] -A926; [74 33 CD, 05, 05] +A926; [74 4D CD, 05, 05] -A927; [74 33 D4, 05, 05] +A927; [74 4D D4, 05, 05] -A928; [74 33 DB, 05, 05] +A928; [74 4D DB, 05, 05] -A929; [74 33 E2, 05, 05] +A929; [74 4D E2, 05, 05] -A92A; [74 33 E9, 05, 05] +A92A; [74 4D E9, 05, 05] -FDD1 1000; [74 34 02, 05, 05] # MYANMAR first primary (compressible) +FDD1 1000; [74 4E 02, 05, 05] # MYANMAR first primary (compressible) -1000; [74 34 09, 05, 05] +1000; [74 4E 09, 05, 05] -1075; [74 34 10, 05, 05] +1075; [74 4E 10, 05, 05] -1001; [74 34 17, 05, 05] +1001; [74 4E 17, 05, 05] -1076; [74 34 1E, 05, 05] +1076; [74 4E 1E, 05, 05] -1002; [74 34 25, 05, 05] +1002; [74 4E 25, 05, 05] -1077; [74 34 2C, 05, 05] +1077; [74 4E 2C, 05, 05] -AA60; [74 34 33, 05, 05] +AA60; [74 4E 33, 05, 05] -A9E9; [74 34 3A, 05, 05] +A9E9; [74 4E 3A, 05, 05] -1003; [74 34 41, 05, 05] +1003; [74 4E 41, 05, 05] -A9E0; [74 34 48, 05, 05] +A9E0; [74 4E 48, 05, 05] -A9EA; [74 34 4F, 05, 05] +A9EA; [74 4E 4F, 05, 05] -1004; [74 34 56, 05, 05] +1004; [74 4E 56, 05, 05] -105A; [74 34 5D, 05, 05] +105A; [74 4E 5D, 05, 05] -1005; [74 34 64, 05, 05] +1005; [74 4E 64, 05, 05] -1078; [74 34 6B, 05, 05] +1078; [74 4E 6B, 05, 05] -AA61; [74 34 72, 05, 05] +AA61; [74 4E 72, 05, 05] -1006; [74 34 79, 05, 05] +1006; [74 4E 79, 05, 05] -A9E1; [74 34 80, 05, 05] +A9E1; [74 4E 80, 05, 05] -AA62; [74 34 87, 05, 05] +AA62; [74 4E 87, 05, 05] -AA7E; [74 34 8E, 05, 05] +AA7E; [74 4E 8E, 05, 05] -1007; [74 34 95, 05, 05] +1007; [74 4E 95, 05, 05] -AA63; [74 34 9C, 05, 05] +AA63; [74 4E 9C, 05, 05] -A9EB; [74 34 A3, 05, 05] +A9EB; [74 4E A3, 05, 05] -1079; [74 34 AA, 05, 05] +1079; [74 4E AA, 05, 05] -AA72; [74 34 B1, 05, 05] +AA72; [74 4E B1, 05, 05] -1008; [74 34 B8, 05, 05] +1008; [74 4E B8, 05, 05] -105B; [74 34 BF, 05, 05] +105B; [74 4E BF, 05, 05] -A9E2; [74 34 C6, 05, 05] +A9E2; [74 4E C6, 05, 05] -AA64; [74 34 CD, 05, 05] +AA64; [74 4E CD, 05, 05] -A9EC; [74 34 D4, 05, 05] +A9EC; [74 4E D4, 05, 05] -1061; [74 34 DB, 05, 05] +1061; [74 4E DB, 05, 05] -AA7F; [74 34 E2, 05, 05] +AA7F; [74 4E E2, 05, 05] -1009; [74 34 E9, 05, 05] +1009; [74 4E E9, 05, 05] -107A; [74 34 F0, 05, 05] +107A; [74 4E F0, 05, 05] -AA65; [74 34 F7, 05, 05] +AA65; [74 4E F7, 05, 05] -A9E7; [74 34 FE, 05, 05] +A9E7; [74 4E FE, 05, 05] -100A; [74 35 07, 05, 05] +100A; [74 4F 07, 05, 05] -100B; [74 35 0E, 05, 05] +100B; [74 4F 0E, 05, 05] -AA66; [74 35 15, 05, 05] +AA66; [74 4F 15, 05, 05] -100C; [74 35 1C, 05, 05] +100C; [74 4F 1C, 05, 05] -AA67; [74 35 23, 05, 05] +AA67; [74 4F 23, 05, 05] -100D; [74 35 2A, 05, 05] +100D; [74 4F 2A, 05, 05] -AA68; [74 35 31, 05, 05] +AA68; [74 4F 31, 05, 05] -A9ED; [74 35 38, 05, 05] +A9ED; [74 4F 38, 05, 05] -100E; [74 35 3F, 05, 05] +100E; [74 4F 3F, 05, 05] -AA69; [74 35 46, 05, 05] +AA69; [74 4F 46, 05, 05] -A9EE; [74 35 4D, 05, 05] +A9EE; [74 4F 4D, 05, 05] -100F; [74 35 54, 05, 05] +100F; [74 4F 54, 05, 05] -106E; [74 35 5B, 05, 05] +106E; [74 4F 5B, 05, 05] -A9E3; [74 35 62, 05, 05] +A9E3; [74 4F 62, 05, 05] -A9EF; [74 35 69, 05, 05] +A9EF; [74 4F 69, 05, 05] -1010; [74 35 70, 05, 05] +1010; [74 4F 70, 05, 05] -1011; [74 35 77, 05, 05] +1011; [74 4F 77, 05, 05] -1012; [74 35 7E, 05, 05] +1012; [74 4F 7E, 05, 05] -107B; [74 35 85, 05, 05] +107B; [74 4F 85, 05, 05] -A9FB; [74 35 8C, 05, 05] +A9FB; [74 4F 8C, 05, 05] -1013; [74 35 93, 05, 05] +1013; [74 4F 93, 05, 05] -AA6A; [74 35 9A, 05, 05] +AA6A; [74 4F 9A, 05, 05] -A9FC; [74 35 A1, 05, 05] +A9FC; [74 4F A1, 05, 05] -1014; [74 35 A8, 05, 05] +1014; [74 4F A8, 05, 05] -107C; [74 35 AF, 05, 05] +107C; [74 4F AF, 05, 05] -AA6B; [74 35 B6, 05, 05] +AA6B; [74 4F B6, 05, 05] -105E; [74 35 BD, 05, 05] +105E; [74 4F BD, 05, 05] -1015; [74 35 C4, 05, 05] +1015; [74 4F C4, 05, 05] -1016; [74 35 CB, 05, 05] +1016; [74 4F CB, 05, 05] -107D; [74 35 D2, 05, 05] +107D; [74 4F D2, 05, 05] -107E; [74 35 D9, 05, 05] +107E; [74 4F D9, 05, 05] -AA6F; [74 35 E0, 05, 05] +AA6F; [74 4F E0, 05, 05] -108E; [74 35 E7, 05, 05] +108E; [74 4F E7, 05, 05] -A9E8; [74 35 EE, 05, 05] +A9E8; [74 4F EE, 05, 05] -1017; [74 35 F5, 05, 05] +1017; [74 4F F5, 05, 05] -107F; [74 35 FC, 05, 05] +107F; [74 4F FC, 05, 05] -A9FD; [74 36 05, 05, 05] +A9FD; [74 50 05, 05, 05] -1018; [74 36 0C, 05, 05] +1018; [74 50 0C, 05, 05] -A9E4; [74 36 13, 05, 05] +A9E4; [74 50 13, 05, 05] -A9FE; [74 36 1A, 05, 05] +A9FE; [74 50 1A, 05, 05] -1019; [74 36 21, 05, 05] +1019; [74 50 21, 05, 05] -105F; [74 36 28, 05, 05] +105F; [74 50 28, 05, 05] -101A; [74 36 2F, 05, 05] +101A; [74 50 2F, 05, 05] -103B; [74 36 36, 05, 05] +103B; [74 50 36, 05, 05] -101B; [74 36 3D, 05, 05] +101B; [74 50 3D, 05, 05] -AA73; [74 36 44, 05, 05] +AA73; [74 50 44, 05, 05] -AA7A; [74 36 4B, 05, 05] +AA7A; [74 50 4B, 05, 05] -103C; [74 36 52, 05, 05] +103C; [74 50 52, 05, 05] -101C; [74 36 59, 05, 05] +101C; [74 50 59, 05, 05] -1060; [74 36 60, 05, 05] +1060; [74 50 60, 05, 05] -101D; [74 36 67, 05, 05] +101D; [74 50 67, 05, 05] -103D; [74 36 6E, 05, 05] +103D; [74 50 6E, 05, 05] -1082; [74 36 75, 05, 05] +1082; [74 50 75, 05, 05] -1080; [74 36 7C, 05, 05] +1080; [74 50 7C, 05, 05] -1050; [74 36 83, 05, 05] +1050; [74 50 83, 05, 05] -1051; [74 36 8A, 05, 05] +1051; [74 50 8A, 05, 05] -1065; [74 36 91, 05, 05] +1065; [74 50 91, 05, 05] -101E; [74 38, 05, 05] -103F; [74 38, 05, 20][74 40, 05, 20][74 38, 05, 20] +101E; [74 52, 05, 05] +103F; [74 52, 05, 20][74 5A, 05, 20][74 52, 05, 20] -AA6C; [74 3A 02, 05, 05] +AA6C; [74 54 02, 05, 05] -101F; [74 3A 09, 05, 05] +101F; [74 54 09, 05, 05] -1081; [74 3A 10, 05, 05] +1081; [74 54 10, 05, 05] -AA6D; [74 3A 17, 05, 05] +AA6D; [74 54 17, 05, 05] -103E; [74 3A 1E, 05, 05] +103E; [74 54 1E, 05, 05] -AA6E; [74 3A 25, 05, 05] +AA6E; [74 54 25, 05, 05] -AA71; [74 3A 2C, 05, 05] +AA71; [74 54 2C, 05, 05] -1020; [74 3A 33, 05, 05] +1020; [74 54 33, 05, 05] -A9FA; [74 3A 3A, 05, 05] +A9FA; [74 54 3A, 05, 05] -105C; [74 3A 41, 05, 05] +105C; [74 54 41, 05, 05] -105D; [74 3A 48, 05, 05] +105D; [74 54 48, 05, 05] -106F; [74 3A 4F, 05, 05] +106F; [74 54 4F, 05, 05] -1070; [74 3A 56, 05, 05] +1070; [74 54 56, 05, 05] -1066; [74 3A 5D, 05, 05] +1066; [74 54 5D, 05, 05] -1021; [74 3A 64, 05, 05] +1021; [74 54 64, 05, 05] -1022; [74 3A 6B, 05, 05] +1022; [74 54 6B, 05, 05] -1023; [74 3A 72, 05, 05] +1023; [74 54 72, 05, 05] -1024; [74 3A 79, 05, 05] +1024; [74 54 79, 05, 05] -1025; [74 3A 80, 05, 05] +1025; [74 54 80, 05, 05] -1025 102E; [74 3A 87, 05, 05] -1026; [74 3A 87, 05, 05] +1025 102E; [74 54 87, 05, 05] +1026; [74 54 87, 05, 05] -1052; [74 3A 8E, 05, 05] +1052; [74 54 8E, 05, 05] -1053; [74 3A 95, 05, 05] +1053; [74 54 95, 05, 05] -1054; [74 3A 9C, 05, 05] +1054; [74 54 9C, 05, 05] -1055; [74 3A A3, 05, 05] +1055; [74 54 A3, 05, 05] -1027; [74 3A AA, 05, 05] +1027; [74 54 AA, 05, 05] -1028; [74 3A B1, 05, 05] +1028; [74 54 B1, 05, 05] -1029; [74 3A B8, 05, 05] +1029; [74 54 B8, 05, 05] -102A; [74 3A BF, 05, 05] +102A; [74 54 BF, 05, 05] -102C; [74 3C, 05, 05] -102B; [74 3C, 05, 20] +102C; [74 56, 05, 05] +102B; [74 56, 05, 20] -1083; [74 3E 02, 05, 05] +1083; [74 58 02, 05, 05] -1072; [74 3E 09, 05, 05] +1072; [74 58 09, 05, 05] -109C; [74 3E 10, 05, 05] +109C; [74 58 10, 05, 05] -102D; [74 3E 17, 05, 05] +102D; [74 58 17, 05, 05] -1071; [74 3E 1E, 05, 05] +1071; [74 58 1E, 05, 05] -102E; [74 3E 25, 05, 05] +102E; [74 58 25, 05, 05] -1033; [74 3E 2C, 05, 05] +1033; [74 58 2C, 05, 05] -102F; [74 3E 33, 05, 05] +102F; [74 58 33, 05, 05] -1073; [74 3E 3A, 05, 05] +1073; [74 58 3A, 05, 05] -1074; [74 3E 41, 05, 05] +1074; [74 58 41, 05, 05] -1030; [74 3E 48, 05, 05] +1030; [74 58 48, 05, 05] -1056; [74 3E 4F, 05, 05] +1056; [74 58 4F, 05, 05] -1057; [74 3E 56, 05, 05] +1057; [74 58 56, 05, 05] -1058; [74 3E 5D, 05, 05] +1058; [74 58 5D, 05, 05] -1059; [74 3E 64, 05, 05] +1059; [74 58 64, 05, 05] -1031; [74 3E 6B, 05, 05] +1031; [74 58 6B, 05, 05] -1084; [74 3E 72, 05, 05] +1084; [74 58 72, 05, 05] -1035; [74 3E 79, 05, 05] +1035; [74 58 79, 05, 05] -1085; [74 3E 80, 05, 05] +1085; [74 58 80, 05, 05] -1032; [74 3E 87, 05, 05] +1032; [74 58 87, 05, 05] -109D; [74 3E 8E, 05, 05] +109D; [74 58 8E, 05, 05] -1034; [74 3E 95, 05, 05] +1034; [74 58 95, 05, 05] -1062; [74 3E 9C, 05, 05] +1062; [74 58 9C, 05, 05] -1067; [74 3E A3, 05, 05] +1067; [74 58 A3, 05, 05] -1068; [74 3E AA, 05, 05] +1068; [74 58 AA, 05, 05] -A9E5; [74 3E B1, 05, 05] +A9E5; [74 58 B1, 05, 05] -1086; [74 3E B8, 05, 05] +1086; [74 58 B8, 05, 05] -1039; [74 40, 05, 05] +1039; [74 5A, 05, 05] -103A; [74 42 02, 05, 05] +103A; [74 5C 02, 05, 05] -1063; [74 42 09, 05, 05] +1063; [74 5C 09, 05, 05] -1064; [74 42 10, 05, 05] +1064; [74 5C 10, 05, 05] -1069; [74 42 17, 05, 05] +1069; [74 5C 17, 05, 05] -106A; [74 42 1E, 05, 05] +106A; [74 5C 1E, 05, 05] -106B; [74 42 25, 05, 05] +106B; [74 5C 25, 05, 05] -106C; [74 42 2C, 05, 05] +106C; [74 5C 2C, 05, 05] -106D; [74 42 33, 05, 05] +106D; [74 5C 33, 05, 05] -1087; [74 42 3A, 05, 05] +1087; [74 5C 3A, 05, 05] -108B; [74 42 41, 05, 05] +108B; [74 5C 41, 05, 05] -1088; [74 42 48, 05, 05] +1088; [74 5C 48, 05, 05] -108C; [74 42 4F, 05, 05] +108C; [74 5C 4F, 05, 05] -108D; [74 42 56, 05, 05] +108D; [74 5C 56, 05, 05] -1089; [74 42 5D, 05, 05] +1089; [74 5C 5D, 05, 05] -108A; [74 42 64, 05, 05] +108A; [74 5C 64, 05, 05] -108F; [74 42 6B, 05, 05] +108F; [74 5C 6B, 05, 05] -109A; [74 42 72, 05, 05] +109A; [74 5C 72, 05, 05] -109B; [74 42 79, 05, 05] +109B; [74 5C 79, 05, 05] -AA7B; [74 42 80, 05, 05] +AA7B; [74 5C 80, 05, 05] -AA7C; [74 42 87, 05, 05] +AA7C; [74 5C 87, 05, 05] -AA7D; [74 42 8E, 05, 05] +AA7D; [74 5C 8E, 05, 05] -AA74; [74 42 95, 05, 05] +AA74; [74 5C 95, 05, 05] -AA75; [74 42 9C, 05, 05] +AA75; [74 5C 9C, 05, 05] -AA76; [74 42 A3, 05, 05] +AA76; [74 5C A3, 05, 05] -FDD1 11103; [74 43 02, 05, 05] # Chakma first primary (compressible) +FDD1 11103; [74 5D 02, 05, 05] # Chakma first primary (compressible) -11103; [74 43 09, 05, 05] +11103; [74 5D 09, 05, 05] -11104; [74 43 10, 05, 05] +11104; [74 5D 10, 05, 05] -11105; [74 43 17, 05, 05] +11105; [74 5D 17, 05, 05] -11106; [74 43 1E, 05, 05] +11106; [74 5D 1E, 05, 05] -11107; [74 43 25, 05, 05] +11107; [74 5D 25, 05, 05] -11108; [74 43 2C, 05, 05] +11108; [74 5D 2C, 05, 05] -11109; [74 43 33, 05, 05] +11109; [74 5D 33, 05, 05] -1110A; [74 43 3A, 05, 05] +1110A; [74 5D 3A, 05, 05] -1110B; [74 43 41, 05, 05] +1110B; [74 5D 41, 05, 05] -1110C; [74 43 48, 05, 05] +1110C; [74 5D 48, 05, 05] -1110D; [74 43 4F, 05, 05] +1110D; [74 5D 4F, 05, 05] -1110E; [74 43 56, 05, 05] +1110E; [74 5D 56, 05, 05] -1110F; [74 43 5D, 05, 05] +1110F; [74 5D 5D, 05, 05] -11110; [74 43 64, 05, 05] +11110; [74 5D 64, 05, 05] -11111; [74 43 6B, 05, 05] +11111; [74 5D 6B, 05, 05] -11112; [74 43 72, 05, 05] +11112; [74 5D 72, 05, 05] -11113; [74 43 79, 05, 05] +11113; [74 5D 79, 05, 05] -11114; [74 43 80, 05, 05] +11114; [74 5D 80, 05, 05] -11115; [74 43 87, 05, 05] +11115; [74 5D 87, 05, 05] -11116; [74 43 8E, 05, 05] +11116; [74 5D 8E, 05, 05] -11117; [74 43 95, 05, 05] +11117; [74 5D 95, 05, 05] -11118; [74 43 9C, 05, 05] +11118; [74 5D 9C, 05, 05] -11119; [74 43 A3, 05, 05] +11119; [74 5D A3, 05, 05] -1111A; [74 43 AA, 05, 05] +1111A; [74 5D AA, 05, 05] -1111B; [74 43 B1, 05, 05] +1111B; [74 5D B1, 05, 05] -1111C; [74 43 B8, 05, 05] +1111C; [74 5D B8, 05, 05] -1111D; [74 43 BF, 05, 05] +1111D; [74 5D BF, 05, 05] -1111E; [74 43 C6, 05, 05] +1111E; [74 5D C6, 05, 05] -1111F; [74 43 CD, 05, 05] +1111F; [74 5D CD, 05, 05] -11120; [74 43 D4, 05, 05] +11120; [74 5D D4, 05, 05] -11121; [74 43 DB, 05, 05] +11121; [74 5D DB, 05, 05] -11122; [74 43 E2, 05, 05] +11122; [74 5D E2, 05, 05] -11123; [74 43 E9, 05, 05] +11123; [74 5D E9, 05, 05] -11124; [74 43 F0, 05, 05] +11124; [74 5D F0, 05, 05] -11125; [74 43 F7, 05, 05] +11125; [74 5D F7, 05, 05] -11126; [74 43 FE, 05, 05] +11126; [74 5D FE, 05, 05] -11127; [74 44 07, 05, 05] +11127; [74 5E 07, 05, 05] -11128; [74 44 0E, 05, 05] +11128; [74 5E 0E, 05, 05] -11129; [74 44 15, 05, 05] +11129; [74 5E 15, 05, 05] -1112A; [74 44 1C, 05, 05] +1112A; [74 5E 1C, 05, 05] -1112B; [74 44 23, 05, 05] +1112B; [74 5E 23, 05, 05] -1112C; [74 44 2A, 05, 05] +1112C; [74 5E 2A, 05, 05] -1112D; [74 44 31, 05, 05] +1112D; [74 5E 31, 05, 05] -1112E; [74 44 38, 05, 05] -11131 11127; [74 44 38, 05, 05] +1112E; [74 5E 38, 05, 05] +11131 11127; [74 5E 38, 05, 05] -1112F; [74 44 3F, 05, 05] -11132 11127; [74 44 3F, 05, 05] +1112F; [74 5E 3F, 05, 05] +11132 11127; [74 5E 3F, 05, 05] -11130; [74 44 46, 05, 05] +11130; [74 5E 46, 05, 05] -11131; [74 44 4D, 05, 05] +11131; [74 5E 4D, 05, 05] -11132; [74 44 54, 05, 05] +11132; [74 5E 54, 05, 05] -11133; [74 44 5B, 05, 05] +11133; [74 5E 5B, 05, 05] -11134; [74 44 62, 05, 05] +11134; [74 5E 62, 05, 05] -FDD1 1780; [74 45 02, 05, 05] # KHMER first primary (compressible) +FDD1 1780; [74 5F 02, 05, 05] # KHMER first primary (compressible) -1780; [74 47, 05, 05] +1780; [74 61, 05, 05] -1781; [74 49, 05, 05] +1781; [74 63, 05, 05] -1782; [74 4B, 05, 05] +1782; [74 65, 05, 05] -1783; [74 4D, 05, 05] +1783; [74 67, 05, 05] -1784; [74 4F, 05, 05] +1784; [74 69, 05, 05] -1785; [74 51, 05, 05] +1785; [74 6B, 05, 05] -1786; [74 53, 05, 05] +1786; [74 6D, 05, 05] -1787; [74 55, 05, 05] +1787; [74 6F, 05, 05] -1788; [74 57, 05, 05] +1788; [74 71, 05, 05] -1789; [74 59, 05, 05] +1789; [74 73, 05, 05] -178A; [74 5B, 05, 05] +178A; [74 75, 05, 05] -178B; [74 5D, 05, 05] +178B; [74 77, 05, 05] -178C; [74 5F, 05, 05] +178C; [74 79, 05, 05] -178D; [74 61, 05, 05] +178D; [74 7B, 05, 05] -178E; [74 63, 05, 05] +178E; [74 7D, 05, 05] -178F; [74 65, 05, 05] +178F; [74 7F, 05, 05] -1790; [74 67, 05, 05] +1790; [74 81, 05, 05] -1791; [74 69, 05, 05] +1791; [74 83, 05, 05] -1792; [74 6B, 05, 05] +1792; [74 85, 05, 05] -1793; [74 6D, 05, 05] +1793; [74 87, 05, 05] -1794; [74 6F, 05, 05] +1794; [74 89, 05, 05] -1795; [74 71, 05, 05] +1795; [74 8B, 05, 05] -1796; [74 73, 05, 05] +1796; [74 8D, 05, 05] -1797; [74 75, 05, 05] +1797; [74 8F, 05, 05] -1798; [74 77, 05, 05] +1798; [74 91, 05, 05] -1799; [74 79, 05, 05] +1799; [74 93, 05, 05] -179A; [74 7B, 05, 05] +179A; [74 95, 05, 05] -179B; [74 7D, 05, 05] +179B; [74 97, 05, 05] -179C; [74 7F, 05, 05] +179C; [74 99, 05, 05] -179D; [74 81, 05, 05] +179D; [74 9B, 05, 05] -179E; [74 83, 05, 05] +179E; [74 9D, 05, 05] -179F; [74 85, 05, 05] +179F; [74 9F, 05, 05] -17A0; [74 87, 05, 05] +17A0; [74 A1, 05, 05] -17A1; [74 89, 05, 05] +17A1; [74 A3, 05, 05] -17A2; [74 8B, 05, 05] +17A2; [74 A5, 05, 05] -17DC; [74 8D, 05, 05] +17DC; [74 A7, 05, 05] -17A3; [74 8F, 05, 05] +17A3; [74 A9, 05, 05] -17A4; [74 91, 05, 05] +17A4; [74 AB, 05, 05] -17A5; [74 93, 05, 05] +17A5; [74 AD, 05, 05] -17A6; [74 95, 05, 05] +17A6; [74 AF, 05, 05] -17A7; [74 97, 05, 05] +17A7; [74 B1, 05, 05] -17A8; [74 99, 05, 05] +17A8; [74 B3, 05, 05] -17A9; [74 9B, 05, 05] +17A9; [74 B5, 05, 05] -17AA; [74 9D, 05, 05] +17AA; [74 B7, 05, 05] -17AB; [74 9F, 05, 05] +17AB; [74 B9, 05, 05] -17AC; [74 A1, 05, 05] +17AC; [74 BB, 05, 05] -17AD; [74 A3, 05, 05] +17AD; [74 BD, 05, 05] -17AE; [74 A5, 05, 05] +17AE; [74 BF, 05, 05] -17AF; [74 A7, 05, 05] +17AF; [74 C1, 05, 05] -17B0; [74 A9, 05, 05] +17B0; [74 C3, 05, 05] -17B1; [74 AB, 05, 05] +17B1; [74 C5, 05, 05] -17B2; [74 AD, 05, 05] +17B2; [74 C7, 05, 05] -17B3; [74 AF, 05, 05] +17B3; [74 C9, 05, 05] -17B6; [74 B1, 05, 05] +17B6; [74 CB, 05, 05] -17B7; [74 B3, 05, 05] +17B7; [74 CD, 05, 05] -17B8; [74 B5, 05, 05] +17B8; [74 CF, 05, 05] -17B9; [74 B7, 05, 05] +17B9; [74 D1, 05, 05] -17BA; [74 B9, 05, 05] +17BA; [74 D3, 05, 05] -17BB; [74 BB, 05, 05] +17BB; [74 D5, 05, 05] -17BC; [74 BD, 05, 05] +17BC; [74 D7, 05, 05] -17BD; [74 BF, 05, 05] +17BD; [74 D9, 05, 05] -17BE; [74 C1, 05, 05] +17BE; [74 DB, 05, 05] -17BF; [74 C3, 05, 05] +17BF; [74 DD, 05, 05] -17C0; [74 C5, 05, 05] +17C0; [74 DF, 05, 05] -17C1; [74 C7, 05, 05] +17C1; [74 E1, 05, 05] -17C2; [74 C9, 05, 05] +17C2; [74 E3, 05, 05] -17C3; [74 CB, 05, 05] +17C3; [74 E5, 05, 05] -17C4; [74 CD, 05, 05] +17C4; [74 E7, 05, 05] -17C5; [74 CF, 05, 05] +17C5; [74 E9, 05, 05] -17D2; [74 D1, 05, 05] +17D2; [74 EB, 05, 05] -FDD1 1950; [74 D3 02, 05, 05] # TAI_LE first primary (compressible) +FDD1 1950; [75 04 02, 05, 05] # TAI_LE first primary starts new lead byte (compressible) -1950; [74 D3 09, 05, 05] +1950; [75 04 09, 05, 05] -1951; [74 D3 10, 05, 05] +1951; [75 04 10, 05, 05] -1952; [74 D3 17, 05, 05] +1952; [75 04 17, 05, 05] -1953; [74 D3 1E, 05, 05] +1953; [75 04 1E, 05, 05] -1954; [74 D3 25, 05, 05] +1954; [75 04 25, 05, 05] -1955; [74 D3 2C, 05, 05] +1955; [75 04 2C, 05, 05] -1956; [74 D3 33, 05, 05] +1956; [75 04 33, 05, 05] -1957; [74 D3 3A, 05, 05] +1957; [75 04 3A, 05, 05] -1958; [74 D3 41, 05, 05] +1958; [75 04 41, 05, 05] -1959; [74 D3 48, 05, 05] +1959; [75 04 48, 05, 05] -195A; [74 D3 4F, 05, 05] +195A; [75 04 4F, 05, 05] -195B; [74 D3 56, 05, 05] +195B; [75 04 56, 05, 05] -195C; [74 D3 5D, 05, 05] +195C; [75 04 5D, 05, 05] -195D; [74 D3 64, 05, 05] +195D; [75 04 64, 05, 05] -195E; [74 D3 6B, 05, 05] +195E; [75 04 6B, 05, 05] -195F; [74 D3 72, 05, 05] +195F; [75 04 72, 05, 05] -1960; [74 D3 79, 05, 05] +1960; [75 04 79, 05, 05] -1961; [74 D3 80, 05, 05] +1961; [75 04 80, 05, 05] -1962; [74 D3 87, 05, 05] +1962; [75 04 87, 05, 05] -1963; [74 D3 8E, 05, 05] +1963; [75 04 8E, 05, 05] -1964; [74 D3 95, 05, 05] +1964; [75 04 95, 05, 05] -1965; [74 D3 9C, 05, 05] +1965; [75 04 9C, 05, 05] -1966; [74 D3 A3, 05, 05] +1966; [75 04 A3, 05, 05] -1967; [74 D3 AA, 05, 05] +1967; [75 04 AA, 05, 05] -1968; [74 D3 B1, 05, 05] +1968; [75 04 B1, 05, 05] -1969; [74 D3 B8, 05, 05] +1969; [75 04 B8, 05, 05] -196A; [74 D3 BF, 05, 05] +196A; [75 04 BF, 05, 05] -196B; [74 D3 C6, 05, 05] +196B; [75 04 C6, 05, 05] -196C; [74 D3 CD, 05, 05] +196C; [75 04 CD, 05, 05] -196D; [74 D3 D4, 05, 05] +196D; [75 04 D4, 05, 05] -1970; [74 D3 DB, 05, 05] +1970; [75 04 DB, 05, 05] -1971; [74 D3 E2, 05, 05] +1971; [75 04 E2, 05, 05] -1972; [74 D3 E9, 05, 05] +1972; [75 04 E9, 05, 05] -1973; [74 D3 F0, 05, 05] +1973; [75 04 F0, 05, 05] -1974; [74 D3 F7, 05, 05] +1974; [75 04 F7, 05, 05] -FDD1 1980; [74 D4 02, 05, 05] # NEW_TAI_LUE first primary (compressible) +FDD1 1980; [75 05 02, 05, 05] # NEW_TAI_LUE first primary (compressible) -1980; [74 D4 09, 05, 05] -19B5 1980; [74 D4 09, 05, 05][74 D8 8E, 05, 05] -19B6 1980; [74 D4 09, 05, 05][74 DA, 05, 05] -19B7 1980; [74 D4 09, 05, 05][74 DC 02, 05, 05] -19BA 1980; [74 D4 09, 05, 05][74 DC 17, 05, 05] +1980; [75 05 09, 05, 05] +19B5 1980; [75 05 09, 05, 05][75 09 8E, 05, 05] +19B6 1980; [75 05 09, 05, 05][75 0B, 05, 05] +19B7 1980; [75 05 09, 05, 05][75 0D 02, 05, 05] +19BA 1980; [75 05 09, 05, 05][75 0D 17, 05, 05] -1981; [74 D4 10, 05, 05] -19B5 1981; [74 D4 10, 05, 05][74 D8 8E, 05, 05] -19B6 1981; [74 D4 10, 05, 05][74 DA, 05, 05] -19B7 1981; [74 D4 10, 05, 05][74 DC 02, 05, 05] -19BA 1981; [74 D4 10, 05, 05][74 DC 17, 05, 05] +1981; [75 05 10, 05, 05] +19B5 1981; [75 05 10, 05, 05][75 09 8E, 05, 05] +19B6 1981; [75 05 10, 05, 05][75 0B, 05, 05] +19B7 1981; [75 05 10, 05, 05][75 0D 02, 05, 05] +19BA 1981; [75 05 10, 05, 05][75 0D 17, 05, 05] -1982; [74 D4 17, 05, 05] -19B5 1982; [74 D4 17, 05, 05][74 D8 8E, 05, 05] -19B6 1982; [74 D4 17, 05, 05][74 DA, 05, 05] -19B7 1982; [74 D4 17, 05, 05][74 DC 02, 05, 05] -19BA 1982; [74 D4 17, 05, 05][74 DC 17, 05, 05] +1982; [75 05 17, 05, 05] +19B5 1982; [75 05 17, 05, 05][75 09 8E, 05, 05] +19B6 1982; [75 05 17, 05, 05][75 0B, 05, 05] +19B7 1982; [75 05 17, 05, 05][75 0D 02, 05, 05] +19BA 1982; [75 05 17, 05, 05][75 0D 17, 05, 05] -1983; [74 D4 1E, 05, 05] -19B5 1983; [74 D4 1E, 05, 05][74 D8 8E, 05, 05] -19B6 1983; [74 D4 1E, 05, 05][74 DA, 05, 05] -19B7 1983; [74 D4 1E, 05, 05][74 DC 02, 05, 05] -19BA 1983; [74 D4 1E, 05, 05][74 DC 17, 05, 05] +1983; [75 05 1E, 05, 05] +19B5 1983; [75 05 1E, 05, 05][75 09 8E, 05, 05] +19B6 1983; [75 05 1E, 05, 05][75 0B, 05, 05] +19B7 1983; [75 05 1E, 05, 05][75 0D 02, 05, 05] +19BA 1983; [75 05 1E, 05, 05][75 0D 17, 05, 05] -1984; [74 D4 25, 05, 05] -19B5 1984; [74 D4 25, 05, 05][74 D8 8E, 05, 05] -19B6 1984; [74 D4 25, 05, 05][74 DA, 05, 05] -19B7 1984; [74 D4 25, 05, 05][74 DC 02, 05, 05] -19BA 1984; [74 D4 25, 05, 05][74 DC 17, 05, 05] +1984; [75 05 25, 05, 05] +19B5 1984; [75 05 25, 05, 05][75 09 8E, 05, 05] +19B6 1984; [75 05 25, 05, 05][75 0B, 05, 05] +19B7 1984; [75 05 25, 05, 05][75 0D 02, 05, 05] +19BA 1984; [75 05 25, 05, 05][75 0D 17, 05, 05] -1985; [74 D4 2C, 05, 05] -19B5 1985; [74 D4 2C, 05, 05][74 D8 8E, 05, 05] -19B6 1985; [74 D4 2C, 05, 05][74 DA, 05, 05] -19B7 1985; [74 D4 2C, 05, 05][74 DC 02, 05, 05] -19BA 1985; [74 D4 2C, 05, 05][74 DC 17, 05, 05] +1985; [75 05 2C, 05, 05] +19B5 1985; [75 05 2C, 05, 05][75 09 8E, 05, 05] +19B6 1985; [75 05 2C, 05, 05][75 0B, 05, 05] +19B7 1985; [75 05 2C, 05, 05][75 0D 02, 05, 05] +19BA 1985; [75 05 2C, 05, 05][75 0D 17, 05, 05] -1986; [74 D4 33, 05, 05] -19B5 1986; [74 D4 33, 05, 05][74 D8 8E, 05, 05] -19B6 1986; [74 D4 33, 05, 05][74 DA, 05, 05] -19B7 1986; [74 D4 33, 05, 05][74 DC 02, 05, 05] -19BA 1986; [74 D4 33, 05, 05][74 DC 17, 05, 05] +1986; [75 05 33, 05, 05] +19B5 1986; [75 05 33, 05, 05][75 09 8E, 05, 05] +19B6 1986; [75 05 33, 05, 05][75 0B, 05, 05] +19B7 1986; [75 05 33, 05, 05][75 0D 02, 05, 05] +19BA 1986; [75 05 33, 05, 05][75 0D 17, 05, 05] -1987; [74 D4 3A, 05, 05] -19B5 1987; [74 D4 3A, 05, 05][74 D8 8E, 05, 05] -19B6 1987; [74 D4 3A, 05, 05][74 DA, 05, 05] -19B7 1987; [74 D4 3A, 05, 05][74 DC 02, 05, 05] -19BA 1987; [74 D4 3A, 05, 05][74 DC 17, 05, 05] +1987; [75 05 3A, 05, 05] +19B5 1987; [75 05 3A, 05, 05][75 09 8E, 05, 05] +19B6 1987; [75 05 3A, 05, 05][75 0B, 05, 05] +19B7 1987; [75 05 3A, 05, 05][75 0D 02, 05, 05] +19BA 1987; [75 05 3A, 05, 05][75 0D 17, 05, 05] -1988; [74 D4 41, 05, 05] -19B5 1988; [74 D4 41, 05, 05][74 D8 8E, 05, 05] -19B6 1988; [74 D4 41, 05, 05][74 DA, 05, 05] -19B7 1988; [74 D4 41, 05, 05][74 DC 02, 05, 05] -19BA 1988; [74 D4 41, 05, 05][74 DC 17, 05, 05] - -1989; [74 D4 48, 05, 05] -19B5 1989; [74 D4 48, 05, 05][74 D8 8E, 05, 05] -19B6 1989; [74 D4 48, 05, 05][74 DA, 05, 05] -19B7 1989; [74 D4 48, 05, 05][74 DC 02, 05, 05] -19BA 1989; [74 D4 48, 05, 05][74 DC 17, 05, 05] - -198A; [74 D4 4F, 05, 05] -19B5 198A; [74 D4 4F, 05, 05][74 D8 8E, 05, 05] -19B6 198A; [74 D4 4F, 05, 05][74 DA, 05, 05] -19B7 198A; [74 D4 4F, 05, 05][74 DC 02, 05, 05] -19BA 198A; [74 D4 4F, 05, 05][74 DC 17, 05, 05] - -198B; [74 D4 56, 05, 05] -19B5 198B; [74 D4 56, 05, 05][74 D8 8E, 05, 05] -19B6 198B; [74 D4 56, 05, 05][74 DA, 05, 05] -19B7 198B; [74 D4 56, 05, 05][74 DC 02, 05, 05] -19BA 198B; [74 D4 56, 05, 05][74 DC 17, 05, 05] - -198C; [74 D4 5D, 05, 05] -19B5 198C; [74 D4 5D, 05, 05][74 D8 8E, 05, 05] -19B6 198C; [74 D4 5D, 05, 05][74 DA, 05, 05] -19B7 198C; [74 D4 5D, 05, 05][74 DC 02, 05, 05] -19BA 198C; [74 D4 5D, 05, 05][74 DC 17, 05, 05] - -198D; [74 D4 64, 05, 05] -19B5 198D; [74 D4 64, 05, 05][74 D8 8E, 05, 05] -19B6 198D; [74 D4 64, 05, 05][74 DA, 05, 05] -19B7 198D; [74 D4 64, 05, 05][74 DC 02, 05, 05] -19BA 198D; [74 D4 64, 05, 05][74 DC 17, 05, 05] - -198E; [74 D4 6B, 05, 05] -19B5 198E; [74 D4 6B, 05, 05][74 D8 8E, 05, 05] -19B6 198E; [74 D4 6B, 05, 05][74 DA, 05, 05] -19B7 198E; [74 D4 6B, 05, 05][74 DC 02, 05, 05] -19BA 198E; [74 D4 6B, 05, 05][74 DC 17, 05, 05] - -198F; [74 D4 72, 05, 05] -19B5 198F; [74 D4 72, 05, 05][74 D8 8E, 05, 05] -19B6 198F; [74 D4 72, 05, 05][74 DA, 05, 05] -19B7 198F; [74 D4 72, 05, 05][74 DC 02, 05, 05] -19BA 198F; [74 D4 72, 05, 05][74 DC 17, 05, 05] - -1990; [74 D4 79, 05, 05] -19B5 1990; [74 D4 79, 05, 05][74 D8 8E, 05, 05] -19B6 1990; [74 D4 79, 05, 05][74 DA, 05, 05] -19B7 1990; [74 D4 79, 05, 05][74 DC 02, 05, 05] -19BA 1990; [74 D4 79, 05, 05][74 DC 17, 05, 05] - -1991; [74 D4 80, 05, 05] -19B5 1991; [74 D4 80, 05, 05][74 D8 8E, 05, 05] -19B6 1991; [74 D4 80, 05, 05][74 DA, 05, 05] -19B7 1991; [74 D4 80, 05, 05][74 DC 02, 05, 05] -19BA 1991; [74 D4 80, 05, 05][74 DC 17, 05, 05] - -1992; [74 D4 87, 05, 05] -19B5 1992; [74 D4 87, 05, 05][74 D8 8E, 05, 05] -19B6 1992; [74 D4 87, 05, 05][74 DA, 05, 05] -19B7 1992; [74 D4 87, 05, 05][74 DC 02, 05, 05] -19BA 1992; [74 D4 87, 05, 05][74 DC 17, 05, 05] - -1993; [74 D4 8E, 05, 05] -19B5 1993; [74 D4 8E, 05, 05][74 D8 8E, 05, 05] -19B6 1993; [74 D4 8E, 05, 05][74 DA, 05, 05] -19B7 1993; [74 D4 8E, 05, 05][74 DC 02, 05, 05] -19BA 1993; [74 D4 8E, 05, 05][74 DC 17, 05, 05] - -1994; [74 D4 95, 05, 05] -19B5 1994; [74 D4 95, 05, 05][74 D8 8E, 05, 05] -19B6 1994; [74 D4 95, 05, 05][74 DA, 05, 05] -19B7 1994; [74 D4 95, 05, 05][74 DC 02, 05, 05] -19BA 1994; [74 D4 95, 05, 05][74 DC 17, 05, 05] - -1995; [74 D4 9C, 05, 05] -19B5 1995; [74 D4 9C, 05, 05][74 D8 8E, 05, 05] -19B6 1995; [74 D4 9C, 05, 05][74 DA, 05, 05] -19B7 1995; [74 D4 9C, 05, 05][74 DC 02, 05, 05] -19BA 1995; [74 D4 9C, 05, 05][74 DC 17, 05, 05] - -1996; [74 D4 A3, 05, 05] -19B5 1996; [74 D4 A3, 05, 05][74 D8 8E, 05, 05] -19B6 1996; [74 D4 A3, 05, 05][74 DA, 05, 05] -19B7 1996; [74 D4 A3, 05, 05][74 DC 02, 05, 05] -19BA 1996; [74 D4 A3, 05, 05][74 DC 17, 05, 05] - -1997; [74 D4 AA, 05, 05] -19B5 1997; [74 D4 AA, 05, 05][74 D8 8E, 05, 05] -19B6 1997; [74 D4 AA, 05, 05][74 DA, 05, 05] -19B7 1997; [74 D4 AA, 05, 05][74 DC 02, 05, 05] -19BA 1997; [74 D4 AA, 05, 05][74 DC 17, 05, 05] - -1998; [74 D4 B1, 05, 05] -19B5 1998; [74 D4 B1, 05, 05][74 D8 8E, 05, 05] -19B6 1998; [74 D4 B1, 05, 05][74 DA, 05, 05] -19B7 1998; [74 D4 B1, 05, 05][74 DC 02, 05, 05] -19BA 1998; [74 D4 B1, 05, 05][74 DC 17, 05, 05] - -1999; [74 D4 B8, 05, 05] -19B5 1999; [74 D4 B8, 05, 05][74 D8 8E, 05, 05] -19B6 1999; [74 D4 B8, 05, 05][74 DA, 05, 05] -19B7 1999; [74 D4 B8, 05, 05][74 DC 02, 05, 05] -19BA 1999; [74 D4 B8, 05, 05][74 DC 17, 05, 05] - -199A; [74 D4 BF, 05, 05] -19B5 199A; [74 D4 BF, 05, 05][74 D8 8E, 05, 05] -19B6 199A; [74 D4 BF, 05, 05][74 DA, 05, 05] -19B7 199A; [74 D4 BF, 05, 05][74 DC 02, 05, 05] -19BA 199A; [74 D4 BF, 05, 05][74 DC 17, 05, 05] - -199B; [74 D4 C6, 05, 05] -19B5 199B; [74 D4 C6, 05, 05][74 D8 8E, 05, 05] -19B6 199B; [74 D4 C6, 05, 05][74 DA, 05, 05] -19B7 199B; [74 D4 C6, 05, 05][74 DC 02, 05, 05] -19BA 199B; [74 D4 C6, 05, 05][74 DC 17, 05, 05] - -199C; [74 D6, 05, 05] -19B5 199C; [74 D6, 05, 05][74 D8 8E, 05, 05] -19B6 199C; [74 D6, 05, 05][74 DA, 05, 05] -19DE; [74 D6, 05, 20][74 DA, 05, 20] -19DF; [74 D6, 05, 20][74 DA, 05, 20][74 DE, 05, 20] -19B7 199C; [74 D6, 05, 05][74 DC 02, 05, 05] -19BA 199C; [74 D6, 05, 05][74 DC 17, 05, 05] - -199D; [74 D8 02, 05, 05] -19B5 199D; [74 D8 02, 05, 05][74 D8 8E, 05, 05] -19B6 199D; [74 D8 02, 05, 05][74 DA, 05, 05] -19B7 199D; [74 D8 02, 05, 05][74 DC 02, 05, 05] -19BA 199D; [74 D8 02, 05, 05][74 DC 17, 05, 05] - -199E; [74 D8 09, 05, 05] -19B5 199E; [74 D8 09, 05, 05][74 D8 8E, 05, 05] -19B6 199E; [74 D8 09, 05, 05][74 DA, 05, 05] -19B7 199E; [74 D8 09, 05, 05][74 DC 02, 05, 05] -19BA 199E; [74 D8 09, 05, 05][74 DC 17, 05, 05] - -199F; [74 D8 10, 05, 05] -19B5 199F; [74 D8 10, 05, 05][74 D8 8E, 05, 05] -19B6 199F; [74 D8 10, 05, 05][74 DA, 05, 05] -19B7 199F; [74 D8 10, 05, 05][74 DC 02, 05, 05] -19BA 199F; [74 D8 10, 05, 05][74 DC 17, 05, 05] - -19A0; [74 D8 17, 05, 05] -19B5 19A0; [74 D8 17, 05, 05][74 D8 8E, 05, 05] -19B6 19A0; [74 D8 17, 05, 05][74 DA, 05, 05] -19B7 19A0; [74 D8 17, 05, 05][74 DC 02, 05, 05] -19BA 19A0; [74 D8 17, 05, 05][74 DC 17, 05, 05] - -19A1; [74 D8 1E, 05, 05] -19B5 19A1; [74 D8 1E, 05, 05][74 D8 8E, 05, 05] -19B6 19A1; [74 D8 1E, 05, 05][74 DA, 05, 05] -19B7 19A1; [74 D8 1E, 05, 05][74 DC 02, 05, 05] -19BA 19A1; [74 D8 1E, 05, 05][74 DC 17, 05, 05] - -19A2; [74 D8 25, 05, 05] -19B5 19A2; [74 D8 25, 05, 05][74 D8 8E, 05, 05] -19B6 19A2; [74 D8 25, 05, 05][74 DA, 05, 05] -19B7 19A2; [74 D8 25, 05, 05][74 DC 02, 05, 05] -19BA 19A2; [74 D8 25, 05, 05][74 DC 17, 05, 05] - -19A3; [74 D8 2C, 05, 05] -19B5 19A3; [74 D8 2C, 05, 05][74 D8 8E, 05, 05] -19B6 19A3; [74 D8 2C, 05, 05][74 DA, 05, 05] -19B7 19A3; [74 D8 2C, 05, 05][74 DC 02, 05, 05] -19BA 19A3; [74 D8 2C, 05, 05][74 DC 17, 05, 05] +1988; [75 05 41, 05, 05] +19B5 1988; [75 05 41, 05, 05][75 09 8E, 05, 05] +19B6 1988; [75 05 41, 05, 05][75 0B, 05, 05] +19B7 1988; [75 05 41, 05, 05][75 0D 02, 05, 05] +19BA 1988; [75 05 41, 05, 05][75 0D 17, 05, 05] + +1989; [75 05 48, 05, 05] +19B5 1989; [75 05 48, 05, 05][75 09 8E, 05, 05] +19B6 1989; [75 05 48, 05, 05][75 0B, 05, 05] +19B7 1989; [75 05 48, 05, 05][75 0D 02, 05, 05] +19BA 1989; [75 05 48, 05, 05][75 0D 17, 05, 05] + +198A; [75 05 4F, 05, 05] +19B5 198A; [75 05 4F, 05, 05][75 09 8E, 05, 05] +19B6 198A; [75 05 4F, 05, 05][75 0B, 05, 05] +19B7 198A; [75 05 4F, 05, 05][75 0D 02, 05, 05] +19BA 198A; [75 05 4F, 05, 05][75 0D 17, 05, 05] + +198B; [75 05 56, 05, 05] +19B5 198B; [75 05 56, 05, 05][75 09 8E, 05, 05] +19B6 198B; [75 05 56, 05, 05][75 0B, 05, 05] +19B7 198B; [75 05 56, 05, 05][75 0D 02, 05, 05] +19BA 198B; [75 05 56, 05, 05][75 0D 17, 05, 05] + +198C; [75 05 5D, 05, 05] +19B5 198C; [75 05 5D, 05, 05][75 09 8E, 05, 05] +19B6 198C; [75 05 5D, 05, 05][75 0B, 05, 05] +19B7 198C; [75 05 5D, 05, 05][75 0D 02, 05, 05] +19BA 198C; [75 05 5D, 05, 05][75 0D 17, 05, 05] + +198D; [75 05 64, 05, 05] +19B5 198D; [75 05 64, 05, 05][75 09 8E, 05, 05] +19B6 198D; [75 05 64, 05, 05][75 0B, 05, 05] +19B7 198D; [75 05 64, 05, 05][75 0D 02, 05, 05] +19BA 198D; [75 05 64, 05, 05][75 0D 17, 05, 05] + +198E; [75 05 6B, 05, 05] +19B5 198E; [75 05 6B, 05, 05][75 09 8E, 05, 05] +19B6 198E; [75 05 6B, 05, 05][75 0B, 05, 05] +19B7 198E; [75 05 6B, 05, 05][75 0D 02, 05, 05] +19BA 198E; [75 05 6B, 05, 05][75 0D 17, 05, 05] + +198F; [75 05 72, 05, 05] +19B5 198F; [75 05 72, 05, 05][75 09 8E, 05, 05] +19B6 198F; [75 05 72, 05, 05][75 0B, 05, 05] +19B7 198F; [75 05 72, 05, 05][75 0D 02, 05, 05] +19BA 198F; [75 05 72, 05, 05][75 0D 17, 05, 05] + +1990; [75 05 79, 05, 05] +19B5 1990; [75 05 79, 05, 05][75 09 8E, 05, 05] +19B6 1990; [75 05 79, 05, 05][75 0B, 05, 05] +19B7 1990; [75 05 79, 05, 05][75 0D 02, 05, 05] +19BA 1990; [75 05 79, 05, 05][75 0D 17, 05, 05] + +1991; [75 05 80, 05, 05] +19B5 1991; [75 05 80, 05, 05][75 09 8E, 05, 05] +19B6 1991; [75 05 80, 05, 05][75 0B, 05, 05] +19B7 1991; [75 05 80, 05, 05][75 0D 02, 05, 05] +19BA 1991; [75 05 80, 05, 05][75 0D 17, 05, 05] + +1992; [75 05 87, 05, 05] +19B5 1992; [75 05 87, 05, 05][75 09 8E, 05, 05] +19B6 1992; [75 05 87, 05, 05][75 0B, 05, 05] +19B7 1992; [75 05 87, 05, 05][75 0D 02, 05, 05] +19BA 1992; [75 05 87, 05, 05][75 0D 17, 05, 05] + +1993; [75 05 8E, 05, 05] +19B5 1993; [75 05 8E, 05, 05][75 09 8E, 05, 05] +19B6 1993; [75 05 8E, 05, 05][75 0B, 05, 05] +19B7 1993; [75 05 8E, 05, 05][75 0D 02, 05, 05] +19BA 1993; [75 05 8E, 05, 05][75 0D 17, 05, 05] + +1994; [75 05 95, 05, 05] +19B5 1994; [75 05 95, 05, 05][75 09 8E, 05, 05] +19B6 1994; [75 05 95, 05, 05][75 0B, 05, 05] +19B7 1994; [75 05 95, 05, 05][75 0D 02, 05, 05] +19BA 1994; [75 05 95, 05, 05][75 0D 17, 05, 05] + +1995; [75 05 9C, 05, 05] +19B5 1995; [75 05 9C, 05, 05][75 09 8E, 05, 05] +19B6 1995; [75 05 9C, 05, 05][75 0B, 05, 05] +19B7 1995; [75 05 9C, 05, 05][75 0D 02, 05, 05] +19BA 1995; [75 05 9C, 05, 05][75 0D 17, 05, 05] + +1996; [75 05 A3, 05, 05] +19B5 1996; [75 05 A3, 05, 05][75 09 8E, 05, 05] +19B6 1996; [75 05 A3, 05, 05][75 0B, 05, 05] +19B7 1996; [75 05 A3, 05, 05][75 0D 02, 05, 05] +19BA 1996; [75 05 A3, 05, 05][75 0D 17, 05, 05] + +1997; [75 05 AA, 05, 05] +19B5 1997; [75 05 AA, 05, 05][75 09 8E, 05, 05] +19B6 1997; [75 05 AA, 05, 05][75 0B, 05, 05] +19B7 1997; [75 05 AA, 05, 05][75 0D 02, 05, 05] +19BA 1997; [75 05 AA, 05, 05][75 0D 17, 05, 05] + +1998; [75 05 B1, 05, 05] +19B5 1998; [75 05 B1, 05, 05][75 09 8E, 05, 05] +19B6 1998; [75 05 B1, 05, 05][75 0B, 05, 05] +19B7 1998; [75 05 B1, 05, 05][75 0D 02, 05, 05] +19BA 1998; [75 05 B1, 05, 05][75 0D 17, 05, 05] + +1999; [75 05 B8, 05, 05] +19B5 1999; [75 05 B8, 05, 05][75 09 8E, 05, 05] +19B6 1999; [75 05 B8, 05, 05][75 0B, 05, 05] +19B7 1999; [75 05 B8, 05, 05][75 0D 02, 05, 05] +19BA 1999; [75 05 B8, 05, 05][75 0D 17, 05, 05] + +199A; [75 05 BF, 05, 05] +19B5 199A; [75 05 BF, 05, 05][75 09 8E, 05, 05] +19B6 199A; [75 05 BF, 05, 05][75 0B, 05, 05] +19B7 199A; [75 05 BF, 05, 05][75 0D 02, 05, 05] +19BA 199A; [75 05 BF, 05, 05][75 0D 17, 05, 05] + +199B; [75 05 C6, 05, 05] +19B5 199B; [75 05 C6, 05, 05][75 09 8E, 05, 05] +19B6 199B; [75 05 C6, 05, 05][75 0B, 05, 05] +19B7 199B; [75 05 C6, 05, 05][75 0D 02, 05, 05] +19BA 199B; [75 05 C6, 05, 05][75 0D 17, 05, 05] + +199C; [75 07, 05, 05] +19B5 199C; [75 07, 05, 05][75 09 8E, 05, 05] +19B6 199C; [75 07, 05, 05][75 0B, 05, 05] +19DE; [75 07, 05, 20][75 0B, 05, 20] +19DF; [75 07, 05, 20][75 0B, 05, 20][75 0F, 05, 20] +19B7 199C; [75 07, 05, 05][75 0D 02, 05, 05] +19BA 199C; [75 07, 05, 05][75 0D 17, 05, 05] + +199D; [75 09 02, 05, 05] +19B5 199D; [75 09 02, 05, 05][75 09 8E, 05, 05] +19B6 199D; [75 09 02, 05, 05][75 0B, 05, 05] +19B7 199D; [75 09 02, 05, 05][75 0D 02, 05, 05] +19BA 199D; [75 09 02, 05, 05][75 0D 17, 05, 05] + +199E; [75 09 09, 05, 05] +19B5 199E; [75 09 09, 05, 05][75 09 8E, 05, 05] +19B6 199E; [75 09 09, 05, 05][75 0B, 05, 05] +19B7 199E; [75 09 09, 05, 05][75 0D 02, 05, 05] +19BA 199E; [75 09 09, 05, 05][75 0D 17, 05, 05] + +199F; [75 09 10, 05, 05] +19B5 199F; [75 09 10, 05, 05][75 09 8E, 05, 05] +19B6 199F; [75 09 10, 05, 05][75 0B, 05, 05] +19B7 199F; [75 09 10, 05, 05][75 0D 02, 05, 05] +19BA 199F; [75 09 10, 05, 05][75 0D 17, 05, 05] + +19A0; [75 09 17, 05, 05] +19B5 19A0; [75 09 17, 05, 05][75 09 8E, 05, 05] +19B6 19A0; [75 09 17, 05, 05][75 0B, 05, 05] +19B7 19A0; [75 09 17, 05, 05][75 0D 02, 05, 05] +19BA 19A0; [75 09 17, 05, 05][75 0D 17, 05, 05] + +19A1; [75 09 1E, 05, 05] +19B5 19A1; [75 09 1E, 05, 05][75 09 8E, 05, 05] +19B6 19A1; [75 09 1E, 05, 05][75 0B, 05, 05] +19B7 19A1; [75 09 1E, 05, 05][75 0D 02, 05, 05] +19BA 19A1; [75 09 1E, 05, 05][75 0D 17, 05, 05] + +19A2; [75 09 25, 05, 05] +19B5 19A2; [75 09 25, 05, 05][75 09 8E, 05, 05] +19B6 19A2; [75 09 25, 05, 05][75 0B, 05, 05] +19B7 19A2; [75 09 25, 05, 05][75 0D 02, 05, 05] +19BA 19A2; [75 09 25, 05, 05][75 0D 17, 05, 05] + +19A3; [75 09 2C, 05, 05] +19B5 19A3; [75 09 2C, 05, 05][75 09 8E, 05, 05] +19B6 19A3; [75 09 2C, 05, 05][75 0B, 05, 05] +19B7 19A3; [75 09 2C, 05, 05][75 0D 02, 05, 05] +19BA 19A3; [75 09 2C, 05, 05][75 0D 17, 05, 05] -19A4; [74 D8 33, 05, 05] -19B5 19A4; [74 D8 33, 05, 05][74 D8 8E, 05, 05] -19B6 19A4; [74 D8 33, 05, 05][74 DA, 05, 05] -19B7 19A4; [74 D8 33, 05, 05][74 DC 02, 05, 05] -19BA 19A4; [74 D8 33, 05, 05][74 DC 17, 05, 05] +19A4; [75 09 33, 05, 05] +19B5 19A4; [75 09 33, 05, 05][75 09 8E, 05, 05] +19B6 19A4; [75 09 33, 05, 05][75 0B, 05, 05] +19B7 19A4; [75 09 33, 05, 05][75 0D 02, 05, 05] +19BA 19A4; [75 09 33, 05, 05][75 0D 17, 05, 05] -19A5; [74 D8 3A, 05, 05] -19B5 19A5; [74 D8 3A, 05, 05][74 D8 8E, 05, 05] -19B6 19A5; [74 D8 3A, 05, 05][74 DA, 05, 05] -19B7 19A5; [74 D8 3A, 05, 05][74 DC 02, 05, 05] -19BA 19A5; [74 D8 3A, 05, 05][74 DC 17, 05, 05] +19A5; [75 09 3A, 05, 05] +19B5 19A5; [75 09 3A, 05, 05][75 09 8E, 05, 05] +19B6 19A5; [75 09 3A, 05, 05][75 0B, 05, 05] +19B7 19A5; [75 09 3A, 05, 05][75 0D 02, 05, 05] +19BA 19A5; [75 09 3A, 05, 05][75 0D 17, 05, 05] -19A6; [74 D8 41, 05, 05] -19B5 19A6; [74 D8 41, 05, 05][74 D8 8E, 05, 05] -19B6 19A6; [74 D8 41, 05, 05][74 DA, 05, 05] -19B7 19A6; [74 D8 41, 05, 05][74 DC 02, 05, 05] -19BA 19A6; [74 D8 41, 05, 05][74 DC 17, 05, 05] +19A6; [75 09 41, 05, 05] +19B5 19A6; [75 09 41, 05, 05][75 09 8E, 05, 05] +19B6 19A6; [75 09 41, 05, 05][75 0B, 05, 05] +19B7 19A6; [75 09 41, 05, 05][75 0D 02, 05, 05] +19BA 19A6; [75 09 41, 05, 05][75 0D 17, 05, 05] -19A7; [74 D8 48, 05, 05] -19B5 19A7; [74 D8 48, 05, 05][74 D8 8E, 05, 05] -19B6 19A7; [74 D8 48, 05, 05][74 DA, 05, 05] -19B7 19A7; [74 D8 48, 05, 05][74 DC 02, 05, 05] -19BA 19A7; [74 D8 48, 05, 05][74 DC 17, 05, 05] +19A7; [75 09 48, 05, 05] +19B5 19A7; [75 09 48, 05, 05][75 09 8E, 05, 05] +19B6 19A7; [75 09 48, 05, 05][75 0B, 05, 05] +19B7 19A7; [75 09 48, 05, 05][75 0D 02, 05, 05] +19BA 19A7; [75 09 48, 05, 05][75 0D 17, 05, 05] -19A8; [74 D8 4F, 05, 05] -19B5 19A8; [74 D8 4F, 05, 05][74 D8 8E, 05, 05] -19B6 19A8; [74 D8 4F, 05, 05][74 DA, 05, 05] -19B7 19A8; [74 D8 4F, 05, 05][74 DC 02, 05, 05] -19BA 19A8; [74 D8 4F, 05, 05][74 DC 17, 05, 05] +19A8; [75 09 4F, 05, 05] +19B5 19A8; [75 09 4F, 05, 05][75 09 8E, 05, 05] +19B6 19A8; [75 09 4F, 05, 05][75 0B, 05, 05] +19B7 19A8; [75 09 4F, 05, 05][75 0D 02, 05, 05] +19BA 19A8; [75 09 4F, 05, 05][75 0D 17, 05, 05] -19A9; [74 D8 56, 05, 05] -19B5 19A9; [74 D8 56, 05, 05][74 D8 8E, 05, 05] -19B6 19A9; [74 D8 56, 05, 05][74 DA, 05, 05] -19B7 19A9; [74 D8 56, 05, 05][74 DC 02, 05, 05] -19BA 19A9; [74 D8 56, 05, 05][74 DC 17, 05, 05] +19A9; [75 09 56, 05, 05] +19B5 19A9; [75 09 56, 05, 05][75 09 8E, 05, 05] +19B6 19A9; [75 09 56, 05, 05][75 0B, 05, 05] +19B7 19A9; [75 09 56, 05, 05][75 0D 02, 05, 05] +19BA 19A9; [75 09 56, 05, 05][75 0D 17, 05, 05] -19AA; [74 D8 5D, 05, 05] -19B5 19AA; [74 D8 5D, 05, 05][74 D8 8E, 05, 05] -19B6 19AA; [74 D8 5D, 05, 05][74 DA, 05, 05] -19B7 19AA; [74 D8 5D, 05, 05][74 DC 02, 05, 05] -19BA 19AA; [74 D8 5D, 05, 05][74 DC 17, 05, 05] +19AA; [75 09 5D, 05, 05] +19B5 19AA; [75 09 5D, 05, 05][75 09 8E, 05, 05] +19B6 19AA; [75 09 5D, 05, 05][75 0B, 05, 05] +19B7 19AA; [75 09 5D, 05, 05][75 0D 02, 05, 05] +19BA 19AA; [75 09 5D, 05, 05][75 0D 17, 05, 05] -19AB; [74 D8 64, 05, 05] -19B5 19AB; [74 D8 64, 05, 05][74 D8 8E, 05, 05] -19B6 19AB; [74 D8 64, 05, 05][74 DA, 05, 05] -19B7 19AB; [74 D8 64, 05, 05][74 DC 02, 05, 05] -19BA 19AB; [74 D8 64, 05, 05][74 DC 17, 05, 05] +19AB; [75 09 64, 05, 05] +19B5 19AB; [75 09 64, 05, 05][75 09 8E, 05, 05] +19B6 19AB; [75 09 64, 05, 05][75 0B, 05, 05] +19B7 19AB; [75 09 64, 05, 05][75 0D 02, 05, 05] +19BA 19AB; [75 09 64, 05, 05][75 0D 17, 05, 05] -19B0; [74 D8 6B, 05, 05] +19B0; [75 09 6B, 05, 05] -19B1; [74 D8 72, 05, 05] +19B1; [75 09 72, 05, 05] -19B2; [74 D8 79, 05, 05] +19B2; [75 09 79, 05, 05] -19B3; [74 D8 80, 05, 05] +19B3; [75 09 80, 05, 05] -19B4; [74 D8 87, 05, 05] +19B4; [75 09 87, 05, 05] -19B5; [74 D8 8E, 05, 05] +19B5; [75 09 8E, 05, 05] -19B6; [74 DA, 05, 05] +19B6; [75 0B, 05, 05] -19B7; [74 DC 02, 05, 05] +19B7; [75 0D 02, 05, 05] -19B8; [74 DC 09, 05, 05] +19B8; [75 0D 09, 05, 05] -19B9; [74 DC 10, 05, 05] +19B9; [75 0D 10, 05, 05] -19BA; [74 DC 17, 05, 05] +19BA; [75 0D 17, 05, 05] -19BB; [74 DC 1E, 05, 05] +19BB; [75 0D 1E, 05, 05] -19BC; [74 DC 25, 05, 05] +19BC; [75 0D 25, 05, 05] -19BD; [74 DC 2C, 05, 05] +19BD; [75 0D 2C, 05, 05] -19BE; [74 DC 33, 05, 05] +19BE; [75 0D 33, 05, 05] -19BF; [74 DC 3A, 05, 05] +19BF; [75 0D 3A, 05, 05] -19C0; [74 DC 41, 05, 05] +19C0; [75 0D 41, 05, 05] -19C1; [74 DE, 05, 05] +19C1; [75 0F, 05, 05] -19C2; [74 E0 02, 05, 05] +19C2; [75 11 02, 05, 05] -19C3; [74 E0 09, 05, 05] +19C3; [75 11 09, 05, 05] -19C4; [74 E0 10, 05, 05] +19C4; [75 11 10, 05, 05] -19C5; [74 E0 17, 05, 05] +19C5; [75 11 17, 05, 05] -19C6; [74 E0 1E, 05, 05] +19C6; [75 11 1E, 05, 05] -19C7; [74 E0 25, 05, 05] +19C7; [75 11 25, 05, 05] -19C8; [74 E0 2C, 05, 05] +19C8; [75 11 2C, 05, 05] -19C9; [74 E0 33, 05, 05] +19C9; [75 11 33, 05, 05] -FDD1 1A20; [74 E1 02, 05, 05] # Tai Tham first primary (compressible) +FDD1 1A20; [75 12 02, 05, 05] # Tai Tham first primary (compressible) -1A20; [74 E1 09, 05, 05] +1A20; [75 12 09, 05, 05] -1A21; [74 E1 10, 05, 05] +1A21; [75 12 10, 05, 05] -1A22; [74 E1 17, 05, 05] +1A22; [75 12 17, 05, 05] -1A23; [74 E1 1E, 05, 05] +1A23; [75 12 1E, 05, 05] -1A24; [74 E1 25, 05, 05] +1A24; [75 12 25, 05, 05] -1A25; [74 E1 2C, 05, 05] +1A25; [75 12 2C, 05, 05] -1A26; [74 E3, 05, 05] -1A58; [74 E3, 05, 20] -1A59; [74 E3, 05, 20] +1A26; [75 14, 05, 05] +1A58; [75 14, 05, 20] +1A59; [75 14, 05, 20] -1A27; [74 E5 02, 05, 05] +1A27; [75 16 02, 05, 05] -1A28; [74 E5 09, 05, 05] +1A28; [75 16 09, 05, 05] -1A29; [74 E5 10, 05, 05] +1A29; [75 16 10, 05, 05] -1A2A; [74 E5 17, 05, 05] +1A2A; [75 16 17, 05, 05] -1A2B; [74 E5 1E, 05, 05] +1A2B; [75 16 1E, 05, 05] -1A2C; [74 E5 25, 05, 05] +1A2C; [75 16 25, 05, 05] -1A2D; [74 E5 2C, 05, 05] +1A2D; [75 16 2C, 05, 05] -1A2E; [74 E5 33, 05, 05] +1A2E; [75 16 33, 05, 05] -1A2F; [74 E5 3A, 05, 05] +1A2F; [75 16 3A, 05, 05] -1A30; [74 E5 41, 05, 05] +1A30; [75 16 41, 05, 05] -1A31; [74 E5 48, 05, 05] +1A31; [75 16 48, 05, 05] -1A32; [74 E5 4F, 05, 05] +1A32; [75 16 4F, 05, 05] -1A33; [74 E5 56, 05, 05] +1A33; [75 16 56, 05, 05] -1A34; [74 E5 5D, 05, 05] +1A34; [75 16 5D, 05, 05] -1A35; [74 E5 64, 05, 05] +1A35; [75 16 64, 05, 05] -1A36; [74 E5 6B, 05, 05] +1A36; [75 16 6B, 05, 05] -1A37; [74 E5 72, 05, 05] +1A37; [75 16 72, 05, 05] -1A38; [74 E5 79, 05, 05] +1A38; [75 16 79, 05, 05] -1A39; [74 E5 80, 05, 05] +1A39; [75 16 80, 05, 05] -1A3A; [74 E5 87, 05, 05] +1A3A; [75 16 87, 05, 05] -1A3B; [74 E7, 05, 05] -1A5A; [74 E7, 05, 20] -1A5B; [74 E7, 05, 20] +1A3B; [75 18, 05, 05] +1A5A; [75 18, 05, 20] +1A5B; [75 18, 05, 20] -1A3C; [74 E9 02, 05, 05] +1A3C; [75 1A 02, 05, 05] -1A3D; [74 E9 09, 05, 05] +1A3D; [75 1A 09, 05, 05] -1A3E; [74 E9 10, 05, 05] +1A3E; [75 1A 10, 05, 05] -1A3F; [74 E9 17, 05, 05] +1A3F; [75 1A 17, 05, 05] -1A40; [74 E9 1E, 05, 05] +1A40; [75 1A 1E, 05, 05] -1A41; [74 E9 25, 05, 05] +1A41; [75 1A 25, 05, 05] -1A42; [74 E9 2C, 05, 05] +1A42; [75 1A 2C, 05, 05] -1A43; [74 E9 33, 05, 05] +1A43; [75 1A 33, 05, 05] -1A44; [74 E9 3A, 05, 05] +1A44; [75 1A 3A, 05, 05] -1A45; [74 E9 41, 05, 05] +1A45; [75 1A 41, 05, 05] -1A46; [74 EB, 05, 05] -1A54; [74 EB, 05, 20][74 F3, 05, 20][74 EB, 05, 20] +1A46; [75 1C, 05, 05] +1A54; [75 1C, 05, 20][75 24, 05, 20][75 1C, 05, 20] -1A47; [74 ED 02, 05, 05] +1A47; [75 1E 02, 05, 05] -1A48; [74 ED 09, 05, 05] +1A48; [75 1E 09, 05, 05] -1A49; [74 ED 10, 05, 05] +1A49; [75 1E 10, 05, 05] -1A4A; [74 ED 17, 05, 05] +1A4A; [75 1E 17, 05, 05] -1A4B; [74 ED 1E, 05, 05] +1A4B; [75 1E 1E, 05, 05] -1A4C; [74 ED 25, 05, 05] +1A4C; [75 1E 25, 05, 05] -1A53; [74 ED 2C, 05, 05] +1A53; [75 1E 2C, 05, 05] -1A6B; [74 ED 33, 05, 05] +1A6B; [75 1E 33, 05, 05] -1A55; [74 ED 3A, 05, 05] +1A55; [75 1E 3A, 05, 05] -1A56; [74 ED 41, 05, 05] +1A56; [75 1E 41, 05, 05] -1A57; [74 ED 48, 05, 05] +1A57; [75 1E 48, 05, 05] -1A5C; [74 ED 4F, 05, 05] +1A5C; [75 1E 4F, 05, 05] -1A5D; [74 ED 56, 05, 05] +1A5D; [75 1E 56, 05, 05] -1A5E; [74 ED 5D, 05, 05] +1A5E; [75 1E 5D, 05, 05] -1A4D; [74 ED 64, 05, 05] +1A4D; [75 1E 64, 05, 05] -1A4E; [74 ED 6B, 05, 05] +1A4E; [75 1E 6B, 05, 05] -1A4F; [74 ED 72, 05, 05] +1A4F; [75 1E 72, 05, 05] -1A50; [74 ED 79, 05, 05] +1A50; [75 1E 79, 05, 05] -1A51; [74 ED 80, 05, 05] +1A51; [75 1E 80, 05, 05] -1A52; [74 ED 87, 05, 05] +1A52; [75 1E 87, 05, 05] -1A61; [74 ED 8E, 05, 05] +1A61; [75 1E 8E, 05, 05] -1A6C; [74 ED 95, 05, 05] +1A6C; [75 1E 95, 05, 05] -1A62; [74 ED 9C, 05, 05] +1A62; [75 1E 9C, 05, 05] -1A63; [74 EF, 05, 05] -1A64; [74 EF, 05, 20] +1A63; [75 20, 05, 05] +1A64; [75 20, 05, 20] -1A65; [74 F1 02, 05, 05] +1A65; [75 22 02, 05, 05] -1A66; [74 F1 09, 05, 05] +1A66; [75 22 09, 05, 05] -1A67; [74 F1 10, 05, 05] +1A67; [75 22 10, 05, 05] -1A68; [74 F1 17, 05, 05] +1A68; [75 22 17, 05, 05] -1A69; [74 F1 1E, 05, 05] +1A69; [75 22 1E, 05, 05] -1A6A; [74 F1 25, 05, 05] +1A6A; [75 22 25, 05, 05] -1A6E; [74 F1 2C, 05, 05] +1A6E; [75 22 2C, 05, 05] -1A6F; [74 F1 33, 05, 05] +1A6F; [75 22 33, 05, 05] -1A73; [74 F1 3A, 05, 05] +1A73; [75 22 3A, 05, 05] -1A70; [74 F1 41, 05, 05] +1A70; [75 22 41, 05, 05] -1A71; [74 F1 48, 05, 05] +1A71; [75 22 48, 05, 05] -1A72; [74 F1 4F, 05, 05] +1A72; [75 22 4F, 05, 05] -1A6D; [74 F1 56, 05, 05] +1A6D; [75 22 56, 05, 05] -1A60; [74 F3, 05, 05] +1A60; [75 24, 05, 05] -FDD1 AA00; [74 F5 02, 05, 05] # Cham first primary (compressible) +FDD1 AA00; [75 26 02, 05, 05] # Cham first primary (compressible) -AA00; [74 F5 09, 05, 05] +AA00; [75 26 09, 05, 05] -AA01; [74 F5 10, 05, 05] +AA01; [75 26 10, 05, 05] -AA02; [74 F5 17, 05, 05] +AA02; [75 26 17, 05, 05] -AA03; [74 F5 1E, 05, 05] +AA03; [75 26 1E, 05, 05] -AA04; [74 F5 25, 05, 05] +AA04; [75 26 25, 05, 05] -AA05; [74 F5 2C, 05, 05] +AA05; [75 26 2C, 05, 05] -AA06; [74 F5 33, 05, 05] +AA06; [75 26 33, 05, 05] -AA07; [74 F5 3A, 05, 05] +AA07; [75 26 3A, 05, 05] -AA08; [74 F5 41, 05, 05] +AA08; [75 26 41, 05, 05] -AA09; [74 F5 48, 05, 05] +AA09; [75 26 48, 05, 05] -AA0A; [74 F5 4F, 05, 05] +AA0A; [75 26 4F, 05, 05] -AA0B; [74 F5 56, 05, 05] +AA0B; [75 26 56, 05, 05] -AA0C; [74 F5 5D, 05, 05] +AA0C; [75 26 5D, 05, 05] -AA0D; [74 F5 64, 05, 05] +AA0D; [75 26 64, 05, 05] -AA0E; [74 F5 6B, 05, 05] +AA0E; [75 26 6B, 05, 05] -AA0F; [74 F5 72, 05, 05] +AA0F; [75 26 72, 05, 05] -AA10; [74 F5 79, 05, 05] +AA10; [75 26 79, 05, 05] -AA11; [74 F5 80, 05, 05] +AA11; [75 26 80, 05, 05] -AA12; [74 F5 87, 05, 05] +AA12; [75 26 87, 05, 05] -AA13; [74 F5 8E, 05, 05] +AA13; [75 26 8E, 05, 05] -AA14; [74 F5 95, 05, 05] +AA14; [75 26 95, 05, 05] -AA15; [74 F5 9C, 05, 05] +AA15; [75 26 9C, 05, 05] -AA16; [74 F5 A3, 05, 05] +AA16; [75 26 A3, 05, 05] -AA17; [74 F5 AA, 05, 05] +AA17; [75 26 AA, 05, 05] -AA18; [74 F5 B1, 05, 05] +AA18; [75 26 B1, 05, 05] -AA19; [74 F5 B8, 05, 05] +AA19; [75 26 B8, 05, 05] -AA1A; [74 F5 BF, 05, 05] +AA1A; [75 26 BF, 05, 05] -AA1B; [74 F5 C6, 05, 05] +AA1B; [75 26 C6, 05, 05] -AA1C; [74 F5 CD, 05, 05] +AA1C; [75 26 CD, 05, 05] -AA1D; [74 F5 D4, 05, 05] +AA1D; [75 26 D4, 05, 05] -AA1E; [74 F5 DB, 05, 05] +AA1E; [75 26 DB, 05, 05] -AA1F; [74 F5 E2, 05, 05] +AA1F; [75 26 E2, 05, 05] -AA20; [74 F5 E9, 05, 05] +AA20; [75 26 E9, 05, 05] -AA21; [74 F5 F0, 05, 05] +AA21; [75 26 F0, 05, 05] -AA22; [74 F5 F7, 05, 05] +AA22; [75 26 F7, 05, 05] -AA23; [74 F5 FE, 05, 05] +AA23; [75 26 FE, 05, 05] -AA24; [74 F6 07, 05, 05] +AA24; [75 27 07, 05, 05] -AA25; [74 F6 0E, 05, 05] +AA25; [75 27 0E, 05, 05] -AA26; [74 F6 15, 05, 05] +AA26; [75 27 15, 05, 05] -AA27; [74 F6 1C, 05, 05] +AA27; [75 27 1C, 05, 05] -AA28; [74 F6 23, 05, 05] +AA28; [75 27 23, 05, 05] -AA33; [74 F6 2A, 05, 05] +AA33; [75 27 2A, 05, 05] -AA34; [74 F6 31, 05, 05] +AA34; [75 27 31, 05, 05] -AA35; [74 F6 38, 05, 05] +AA35; [75 27 38, 05, 05] -AA36; [74 F6 3F, 05, 05] +AA36; [75 27 3F, 05, 05] -AA29; [74 F6 46, 05, 05] +AA29; [75 27 46, 05, 05] -AA2A; [74 F6 4D, 05, 05] +AA2A; [75 27 4D, 05, 05] -AA2B; [74 F6 54, 05, 05] +AA2B; [75 27 54, 05, 05] -AA2C; [74 F6 5B, 05, 05] +AA2C; [75 27 5B, 05, 05] -AA2D; [74 F6 62, 05, 05] +AA2D; [75 27 62, 05, 05] -AA2E; [74 F6 69, 05, 05] +AA2E; [75 27 69, 05, 05] -AA2F; [74 F6 70, 05, 05] +AA2F; [75 27 70, 05, 05] -AA30; [74 F6 77, 05, 05] +AA30; [75 27 77, 05, 05] -AA31; [74 F6 7E, 05, 05] +AA31; [75 27 7E, 05, 05] -AA32; [74 F6 85, 05, 05] +AA32; [75 27 85, 05, 05] -AA40; [74 F6 8C, 05, 05] +AA40; [75 27 8C, 05, 05] -AA41; [74 F6 93, 05, 05] +AA41; [75 27 93, 05, 05] -AA42; [74 F6 9A, 05, 05] +AA42; [75 27 9A, 05, 05] -AA43; [74 F6 A1, 05, 05] +AA43; [75 27 A1, 05, 05] -AA44; [74 F6 A8, 05, 05] +AA44; [75 27 A8, 05, 05] -AA45; [74 F6 AF, 05, 05] +AA45; [75 27 AF, 05, 05] -AA46; [74 F6 B6, 05, 05] +AA46; [75 27 B6, 05, 05] -AA47; [74 F6 BD, 05, 05] +AA47; [75 27 BD, 05, 05] -AA48; [74 F6 C4, 05, 05] +AA48; [75 27 C4, 05, 05] -AA49; [74 F6 CB, 05, 05] +AA49; [75 27 CB, 05, 05] -AA4A; [74 F6 D2, 05, 05] +AA4A; [75 27 D2, 05, 05] -AA4B; [74 F6 D9, 05, 05] +AA4B; [75 27 D9, 05, 05] -AA4C; [74 F6 E0, 05, 05] +AA4C; [75 27 E0, 05, 05] -AA4D; [74 F6 E7, 05, 05] +AA4D; [75 27 E7, 05, 05] -FDD1 1B05; [74 F7 02, 05, 05] # Balinese first primary (compressible) +FDD1 1B05; [75 28 02, 05, 05] # Balinese first primary (compressible) -1B05; [74 F7 09, 05, 05] +1B05; [75 28 09, 05, 05] -1B05 1B35; [74 F7 10, 05, 05] -1B06; [74 F7 10, 05, 05] +1B05 1B35; [75 28 10, 05, 05] +1B06; [75 28 10, 05, 05] -1B07; [74 F7 17, 05, 05] +1B07; [75 28 17, 05, 05] -1B07 1B35; [74 F7 1E, 05, 05] -1B08; [74 F7 1E, 05, 05] +1B07 1B35; [75 28 1E, 05, 05] +1B08; [75 28 1E, 05, 05] -1B09; [74 F7 25, 05, 05] +1B09; [75 28 25, 05, 05] -1B09 1B35; [74 F7 2C, 05, 05] -1B0A; [74 F7 2C, 05, 05] +1B09 1B35; [75 28 2C, 05, 05] +1B0A; [75 28 2C, 05, 05] -1B0B; [74 F7 33, 05, 05] +1B0B; [75 28 33, 05, 05] -1B0B 1B35; [74 F7 3A, 05, 05] -1B0C; [74 F7 3A, 05, 05] +1B0B 1B35; [75 28 3A, 05, 05] +1B0C; [75 28 3A, 05, 05] -1B0D; [74 F7 41, 05, 05] +1B0D; [75 28 41, 05, 05] -1B0D 1B35; [74 F7 48, 05, 05] -1B0E; [74 F7 48, 05, 05] +1B0D 1B35; [75 28 48, 05, 05] +1B0E; [75 28 48, 05, 05] -1B0F; [74 F7 4F, 05, 05] +1B0F; [75 28 4F, 05, 05] -1B10; [74 F7 56, 05, 05] +1B10; [75 28 56, 05, 05] -1B11; [74 F7 5D, 05, 05] +1B11; [75 28 5D, 05, 05] -1B11 1B35; [74 F7 64, 05, 05] -1B12; [74 F7 64, 05, 05] +1B11 1B35; [75 28 64, 05, 05] +1B12; [75 28 64, 05, 05] -1B13; [74 F7 6B, 05, 05] +1B13; [75 28 6B, 05, 05] -1B45; [74 F7 72, 05, 05] +1B45; [75 28 72, 05, 05] -1B46; [74 F7 79, 05, 05] +1B46; [75 28 79, 05, 05] -1B14; [74 F7 80, 05, 05] +1B14; [75 28 80, 05, 05] -1B15; [74 F7 87, 05, 05] +1B15; [75 28 87, 05, 05] -1B16; [74 F7 8E, 05, 05] +1B16; [75 28 8E, 05, 05] -1B17; [74 F7 95, 05, 05] +1B17; [75 28 95, 05, 05] -1B18; [74 F7 9C, 05, 05] +1B18; [75 28 9C, 05, 05] -1B19; [74 F7 A3, 05, 05] +1B19; [75 28 A3, 05, 05] -1B1A; [74 F7 AA, 05, 05] +1B1A; [75 28 AA, 05, 05] -1B1B; [74 F7 B1, 05, 05] +1B1B; [75 28 B1, 05, 05] -1B1C; [74 F7 B8, 05, 05] +1B1C; [75 28 B8, 05, 05] -1B1D; [74 F7 BF, 05, 05] +1B1D; [75 28 BF, 05, 05] -1B1E; [74 F7 C6, 05, 05] +1B1E; [75 28 C6, 05, 05] -1B1F; [74 F7 CD, 05, 05] +1B1F; [75 28 CD, 05, 05] -1B20; [74 F7 D4, 05, 05] +1B20; [75 28 D4, 05, 05] -1B21; [74 F7 DB, 05, 05] +1B21; [75 28 DB, 05, 05] -1B22; [74 F7 E2, 05, 05] +1B22; [75 28 E2, 05, 05] -1B47; [74 F7 E9, 05, 05] +1B47; [75 28 E9, 05, 05] -1B23; [74 F7 F0, 05, 05] +1B23; [75 28 F0, 05, 05] -1B24; [74 F7 F7, 05, 05] +1B24; [75 28 F7, 05, 05] -1B25; [74 F7 FE, 05, 05] +1B25; [75 28 FE, 05, 05] -1B26; [74 F8 07, 05, 05] +1B26; [75 29 07, 05, 05] -1B27; [74 F8 0E, 05, 05] +1B27; [75 29 0E, 05, 05] -1B48; [74 F8 15, 05, 05] +1B48; [75 29 15, 05, 05] -1B28; [74 F8 1C, 05, 05] +1B28; [75 29 1C, 05, 05] -1B29; [74 F8 23, 05, 05] +1B29; [75 29 23, 05, 05] -1B2A; [74 F8 2A, 05, 05] +1B2A; [75 29 2A, 05, 05] -1B2B; [74 F8 31, 05, 05] +1B2B; [75 29 31, 05, 05] -1B2C; [74 F8 38, 05, 05] +1B2C; [75 29 38, 05, 05] -1B2D; [74 F8 3F, 05, 05] +1B2D; [75 29 3F, 05, 05] -1B2E; [74 F8 46, 05, 05] +1B2E; [75 29 46, 05, 05] -1B2F; [74 F8 4D, 05, 05] +1B2F; [75 29 4D, 05, 05] -1B49; [74 F8 54, 05, 05] +1B49; [75 29 54, 05, 05] -1B30; [74 F8 5B, 05, 05] +1B30; [75 29 5B, 05, 05] -1B31; [74 F8 62, 05, 05] +1B31; [75 29 62, 05, 05] -1B32; [74 F8 69, 05, 05] +1B32; [75 29 69, 05, 05] -1B4A; [74 F8 70, 05, 05] +1B4A; [75 29 70, 05, 05] -1B4B; [74 F8 77, 05, 05] +1B4B; [75 29 77, 05, 05] -1B33; [74 F8 7E, 05, 05] +1B33; [75 29 7E, 05, 05] -1B35; [74 F8 85, 05, 05] +1B35; [75 29 85, 05, 05] -1B36; [74 F8 8C, 05, 05] +1B36; [75 29 8C, 05, 05] -1B37; [74 F8 93, 05, 05] +1B37; [75 29 93, 05, 05] -1B38; [74 F8 9A, 05, 05] +1B38; [75 29 9A, 05, 05] -1B39; [74 F8 A1, 05, 05] +1B39; [75 29 A1, 05, 05] -1B3A; [74 F8 A8, 05, 05] +1B3A; [75 29 A8, 05, 05] -1B3A 1B35; [74 F8 AF, 05, 05] -1B3B; [74 F8 AF, 05, 05] +1B3A 1B35; [75 29 AF, 05, 05] +1B3B; [75 29 AF, 05, 05] -1B3C; [74 F8 B6, 05, 05] +1B3C; [75 29 B6, 05, 05] -1B3C 1B35; [74 F8 BD, 05, 05] -1B3D; [74 F8 BD, 05, 05] +1B3C 1B35; [75 29 BD, 05, 05] +1B3D; [75 29 BD, 05, 05] -1B3E; [74 F8 C4, 05, 05] +1B3E; [75 29 C4, 05, 05] -1B3F; [74 F8 CB, 05, 05] +1B3F; [75 29 CB, 05, 05] -1B3E 1B35; [74 F8 D2, 05, 05] -1B40; [74 F8 D2, 05, 05] +1B3E 1B35; [75 29 D2, 05, 05] +1B40; [75 29 D2, 05, 05] -1B3F 1B35; [74 F8 D9, 05, 05] -1B41; [74 F8 D9, 05, 05] +1B3F 1B35; [75 29 D9, 05, 05] +1B41; [75 29 D9, 05, 05] -1B42; [74 F8 E0, 05, 05] +1B42; [75 29 E0, 05, 05] -1B42 1B35; [74 F8 E7, 05, 05] -1B43; [74 F8 E7, 05, 05] +1B42 1B35; [75 29 E7, 05, 05] +1B43; [75 29 E7, 05, 05] -1B44; [74 F8 EE, 05, 05] +1B44; [75 29 EE, 05, 05] -FDD1 A984; [74 F9 02, 05, 05] # Javanese first primary (compressible) +FDD1 A984; [75 2A 02, 05, 05] # Javanese first primary (compressible) -A984; [74 F9 09, 05, 05] +A984; [75 2A 09, 05, 05] -A985; [74 F9 10, 05, 05] +A985; [75 2A 10, 05, 05] -A986; [74 F9 17, 05, 05] +A986; [75 2A 17, 05, 05] -A987; [74 F9 1E, 05, 05] +A987; [75 2A 1E, 05, 05] -A988; [74 F9 25, 05, 05] +A988; [75 2A 25, 05, 05] -A989; [74 F9 2C, 05, 05] +A989; [75 2A 2C, 05, 05] -A98A; [74 F9 33, 05, 05] +A98A; [75 2A 33, 05, 05] -A98B; [74 F9 3A, 05, 05] +A98B; [75 2A 3A, 05, 05] -A98C; [74 F9 41, 05, 05] +A98C; [75 2A 41, 05, 05] -A98D; [74 F9 48, 05, 05] +A98D; [75 2A 48, 05, 05] -A98E; [74 F9 4F, 05, 05] +A98E; [75 2A 4F, 05, 05] -A98F; [74 F9 56, 05, 05] +A98F; [75 2A 56, 05, 05] -A990; [74 F9 5D, 05, 05] +A990; [75 2A 5D, 05, 05] -A991; [74 F9 64, 05, 05] +A991; [75 2A 64, 05, 05] -A992; [74 F9 6B, 05, 05] +A992; [75 2A 6B, 05, 05] -A993; [74 F9 72, 05, 05] +A993; [75 2A 72, 05, 05] -A994; [74 F9 79, 05, 05] +A994; [75 2A 79, 05, 05] -A995; [74 F9 80, 05, 05] +A995; [75 2A 80, 05, 05] -A996; [74 F9 87, 05, 05] +A996; [75 2A 87, 05, 05] -A997; [74 F9 8E, 05, 05] +A997; [75 2A 8E, 05, 05] -A998; [74 F9 95, 05, 05] +A998; [75 2A 95, 05, 05] -A999; [74 F9 9C, 05, 05] +A999; [75 2A 9C, 05, 05] -A99A; [74 F9 A3, 05, 05] +A99A; [75 2A A3, 05, 05] -A99B; [74 F9 AA, 05, 05] +A99B; [75 2A AA, 05, 05] -A99C; [74 F9 B1, 05, 05] +A99C; [75 2A B1, 05, 05] -A99D; [74 F9 B8, 05, 05] +A99D; [75 2A B8, 05, 05] -A99E; [74 F9 BF, 05, 05] +A99E; [75 2A BF, 05, 05] -A99F; [74 F9 C6, 05, 05] +A99F; [75 2A C6, 05, 05] -A9A0; [74 F9 CD, 05, 05] +A9A0; [75 2A CD, 05, 05] -A9A1; [74 F9 D4, 05, 05] +A9A1; [75 2A D4, 05, 05] -A9A2; [74 F9 DB, 05, 05] +A9A2; [75 2A DB, 05, 05] -A9A3; [74 F9 E2, 05, 05] +A9A3; [75 2A E2, 05, 05] -A9A4; [74 F9 E9, 05, 05] +A9A4; [75 2A E9, 05, 05] -A9A5; [74 F9 F0, 05, 05] +A9A5; [75 2A F0, 05, 05] -A9A6; [74 F9 F7, 05, 05] +A9A6; [75 2A F7, 05, 05] -A9A7; [74 F9 FE, 05, 05] +A9A7; [75 2A FE, 05, 05] -A9A8; [74 FA 07, 05, 05] +A9A8; [75 2B 07, 05, 05] -A9A9; [74 FA 0E, 05, 05] +A9A9; [75 2B 0E, 05, 05] -A9AA; [74 FA 15, 05, 05] +A9AA; [75 2B 15, 05, 05] -A9BE; [74 FA 1C, 05, 05] +A9BE; [75 2B 1C, 05, 05] -A9AB; [74 FC, 05, 05] -A9AC; [74 FC, 05, 20] +A9AB; [75 2D, 05, 05] +A9AC; [75 2D, 05, 20] -A9BF; [74 FE 02, 05, 05] +A9BF; [75 2F 02, 05, 05] -A9AD; [74 FE 09, 05, 05] +A9AD; [75 2F 09, 05, 05] -A9AE; [74 FE 10, 05, 05] +A9AE; [75 2F 10, 05, 05] -A9AF; [74 FE 17, 05, 05] +A9AF; [75 2F 17, 05, 05] -A9B0; [74 FE 1E, 05, 05] +A9B0; [75 2F 1E, 05, 05] -A9B1; [74 FE 25, 05, 05] +A9B1; [75 2F 25, 05, 05] -A9B2; [74 FE 2C, 05, 05] +A9B2; [75 2F 2C, 05, 05] -A9B4; [74 FE 33, 05, 05] +A9B4; [75 2F 33, 05, 05] -A9BC; [74 FE 3A, 05, 05] +A9BC; [75 2F 3A, 05, 05] -A9B6; [74 FE 41, 05, 05] +A9B6; [75 2F 41, 05, 05] -A9B7; [74 FE 48, 05, 05] +A9B7; [75 2F 48, 05, 05] -A9B8; [74 FE 4F, 05, 05] +A9B8; [75 2F 4F, 05, 05] -A9B9; [74 FE 56, 05, 05] +A9B9; [75 2F 56, 05, 05] -A9BD; [74 FE 5D, 05, 05] +A9BD; [75 2F 5D, 05, 05] -A9BA; [74 FE 64, 05, 05] +A9BA; [75 2F 64, 05, 05] -A9BB; [74 FE 6B, 05, 05] +A9BB; [75 2F 6B, 05, 05] -A9B5; [74 FE 72, 05, 05] +A9B5; [75 2F 72, 05, 05] -A9C0; [74 FE 79, 05, 05] +A9C0; [75 2F 79, 05, 05] -FDD1 1826; [75 04 02, 05, 05] # MONGOLIAN first primary starts new lead byte (compressible) +FDD1 1826; [75 30 02, 05, 05] # MONGOLIAN first primary (compressible) -1880; [75 04 09, 05, 05] +1880; [75 30 09, 05, 05] -1881; [75 04 10, 05, 05] +1881; [75 30 10, 05, 05] -1882; [75 04 17, 05, 05] +1882; [75 30 17, 05, 05] -1883; [75 04 1E, 05, 05] +1883; [75 30 1E, 05, 05] -1884; [75 04 25, 05, 05] +1884; [75 30 25, 05, 05] -1885; [75 04 2C, 05, 05] +1885; [75 30 2C, 05, 05] -1886; [75 04 33, 05, 05] +1886; [75 30 33, 05, 05] -1843; [75 04 3A, 05, 05] +1843; [75 30 3A, 05, 05] -1820; [75 04 41, 05, 05] +1820; [75 30 41, 05, 05] -1887; [75 04 48, 05, 05] +1887; [75 30 48, 05, 05] -1821; [75 04 4F, 05, 05] +1821; [75 30 4F, 05, 05] -1844; [75 04 56, 05, 05] +1844; [75 30 56, 05, 05] -185D; [75 04 5D, 05, 05] +185D; [75 30 5D, 05, 05] -1822; [75 04 64, 05, 05] +1822; [75 30 64, 05, 05] -1845; [75 04 6B, 05, 05] +1845; [75 30 6B, 05, 05] -185E; [75 04 72, 05, 05] +185E; [75 30 72, 05, 05] -1873; [75 04 79, 05, 05] +1873; [75 30 79, 05, 05] -1888; [75 04 80, 05, 05] +1888; [75 30 80, 05, 05] -185F; [75 04 87, 05, 05] +185F; [75 30 87, 05, 05] -1823; [75 04 8E, 05, 05] +1823; [75 30 8E, 05, 05] -1846; [75 04 95, 05, 05] +1846; [75 30 95, 05, 05] -1824; [75 04 9C, 05, 05] +1824; [75 30 9C, 05, 05] -1847; [75 04 A3, 05, 05] +1847; [75 30 A3, 05, 05] -1861; [75 04 AA, 05, 05] +1861; [75 30 AA, 05, 05] -1825; [75 04 B1, 05, 05] +1825; [75 30 B1, 05, 05] -1848; [75 04 B8, 05, 05] +1848; [75 30 B8, 05, 05] -1826; [75 04 BF, 05, 05] +1826; [75 30 BF, 05, 05] -1849; [75 04 C6, 05, 05] +1849; [75 30 C6, 05, 05] -1860; [75 04 CD, 05, 05] +1860; [75 30 CD, 05, 05] -1827; [75 04 D4, 05, 05] +1827; [75 30 D4, 05, 05] -1828; [75 04 DB, 05, 05] +1828; [75 30 DB, 05, 05] -1829; [75 04 E2, 05, 05] +1829; [75 30 E2, 05, 05] -184A; [75 04 E9, 05, 05] +184A; [75 30 E9, 05, 05] -1862; [75 04 F0, 05, 05] +1862; [75 30 F0, 05, 05] -188A; [75 04 F7, 05, 05] +188A; [75 30 F7, 05, 05] -189B; [75 04 FE, 05, 05] +189B; [75 30 FE, 05, 05] -182A; [75 05 07, 05, 05] +182A; [75 31 07, 05, 05] -184B; [75 05 0E, 05, 05] +184B; [75 31 0E, 05, 05] -182B; [75 05 15, 05, 05] +182B; [75 31 15, 05, 05] -184C; [75 05 1C, 05, 05] +184C; [75 31 1C, 05, 05] -1866; [75 05 23, 05, 05] +1866; [75 31 23, 05, 05] -182C; [75 05 2A, 05, 05] +182C; [75 31 2A, 05, 05] -184D; [75 05 31, 05, 05] +184D; [75 31 31, 05, 05] -182D; [75 05 38, 05, 05] +182D; [75 31 38, 05, 05] -184E; [75 05 3F, 05, 05] +184E; [75 31 3F, 05, 05] -1864; [75 05 46, 05, 05] +1864; [75 31 46, 05, 05] -189A; [75 05 4D, 05, 05] +189A; [75 31 4D, 05, 05] -1865; [75 05 54, 05, 05] +1865; [75 31 54, 05, 05] -182E; [75 05 5B, 05, 05] +182E; [75 31 5B, 05, 05] -184F; [75 05 62, 05, 05] +184F; [75 31 62, 05, 05] -182F; [75 05 69, 05, 05] +182F; [75 31 69, 05, 05] -1830; [75 05 70, 05, 05] +1830; [75 31 70, 05, 05] -1831; [75 05 77, 05, 05] +1831; [75 31 77, 05, 05] -1867; [75 05 7E, 05, 05] +1867; [75 31 7E, 05, 05] -189C; [75 05 85, 05, 05] +189C; [75 31 85, 05, 05] -189D; [75 05 8C, 05, 05] +189D; [75 31 8C, 05, 05] -18A2; [75 05 93, 05, 05] +18A2; [75 31 93, 05, 05] -18A4; [75 05 9A, 05, 05] +18A4; [75 31 9A, 05, 05] -18A5; [75 05 A1, 05, 05] +18A5; [75 31 A1, 05, 05] -1832; [75 05 A8, 05, 05] +1832; [75 31 A8, 05, 05] -1850; [75 05 AF, 05, 05] +1850; [75 31 AF, 05, 05] -1868; [75 05 B6, 05, 05] +1868; [75 31 B6, 05, 05] -1833; [75 05 BD, 05, 05] +1833; [75 31 BD, 05, 05] -1851; [75 05 C4, 05, 05] +1851; [75 31 C4, 05, 05] -1869; [75 05 CB, 05, 05] +1869; [75 31 CB, 05, 05] -1834; [75 05 D2, 05, 05] +1834; [75 31 D2, 05, 05] -1852; [75 05 D9, 05, 05] +1852; [75 31 D9, 05, 05] -1871; [75 05 E0, 05, 05] +1871; [75 31 E0, 05, 05] -185C; [75 05 E7, 05, 05] +185C; [75 31 E7, 05, 05] -188B; [75 05 EE, 05, 05] +188B; [75 31 EE, 05, 05] -1835; [75 05 F5, 05, 05] +1835; [75 31 F5, 05, 05] -1853; [75 05 FC, 05, 05] +1853; [75 31 FC, 05, 05] -186A; [75 06 05, 05, 05] +186A; [75 32 05, 05, 05] -1877; [75 06 0C, 05, 05] +1877; [75 32 0C, 05, 05] -1836; [75 06 13, 05, 05] +1836; [75 32 13, 05, 05] -1855; [75 06 1A, 05, 05] +1855; [75 32 1A, 05, 05] -1872; [75 06 21, 05, 05] +1872; [75 32 21, 05, 05] -1837; [75 06 28, 05, 05] +1837; [75 32 28, 05, 05] -1875; [75 06 2F, 05, 05] +1875; [75 32 2F, 05, 05] -1838; [75 06 36, 05, 05] +1838; [75 32 36, 05, 05] -1856; [75 06 3D, 05, 05] +1856; [75 32 3D, 05, 05] -1839; [75 06 44, 05, 05] +1839; [75 32 44, 05, 05] -186B; [75 06 4B, 05, 05] +186B; [75 32 4B, 05, 05] -1876; [75 06 52, 05, 05] +1876; [75 32 52, 05, 05] -183A; [75 06 59, 05, 05] +183A; [75 32 59, 05, 05] -1857; [75 06 60, 05, 05] +1857; [75 32 60, 05, 05] -1863; [75 06 67, 05, 05] +1863; [75 32 67, 05, 05] -1874; [75 06 6E, 05, 05] +1874; [75 32 6E, 05, 05] -1889; [75 06 75, 05, 05] +1889; [75 32 75, 05, 05] -183B; [75 06 7C, 05, 05] +183B; [75 32 7C, 05, 05] -183C; [75 06 83, 05, 05] +183C; [75 32 83, 05, 05] -1854; [75 06 8A, 05, 05] +1854; [75 32 8A, 05, 05] -186E; [75 06 91, 05, 05] +186E; [75 32 91, 05, 05] -183D; [75 06 98, 05, 05] +183D; [75 32 98, 05, 05] -186F; [75 06 9F, 05, 05] +186F; [75 32 9F, 05, 05] -1858; [75 06 A6, 05, 05] +1858; [75 32 A6, 05, 05] -186C; [75 06 AD, 05, 05] +186C; [75 32 AD, 05, 05] -183E; [75 06 B4, 05, 05] +183E; [75 32 B4, 05, 05] -1859; [75 06 BB, 05, 05] +1859; [75 32 BB, 05, 05] -186D; [75 06 C2, 05, 05] +186D; [75 32 C2, 05, 05] -183F; [75 06 C9, 05, 05] +183F; [75 32 C9, 05, 05] -1840; [75 06 D0, 05, 05] +1840; [75 32 D0, 05, 05] -1841; [75 06 D7, 05, 05] +1841; [75 32 D7, 05, 05] -1842; [75 06 DE, 05, 05] +1842; [75 32 DE, 05, 05] -185A; [75 06 E5, 05, 05] +185A; [75 32 E5, 05, 05] -185B; [75 06 EC, 05, 05] +185B; [75 32 EC, 05, 05] -1870; [75 06 F3, 05, 05] +1870; [75 32 F3, 05, 05] -188C; [75 06 FA, 05, 05] +188C; [75 32 FA, 05, 05] -189E; [75 07 03, 05, 05] +189E; [75 33 03, 05, 05] -188D; [75 07 0A, 05, 05] +188D; [75 33 0A, 05, 05] -188E; [75 07 11, 05, 05] +188E; [75 33 11, 05, 05] -189F; [75 07 18, 05, 05] +189F; [75 33 18, 05, 05] -188F; [75 07 1F, 05, 05] +188F; [75 33 1F, 05, 05] -1890; [75 07 26, 05, 05] +1890; [75 33 26, 05, 05] -1898; [75 07 2D, 05, 05] +1898; [75 33 2D, 05, 05] -18A0; [75 07 34, 05, 05] +18A0; [75 33 34, 05, 05] -1891; [75 07 3B, 05, 05] +1891; [75 33 3B, 05, 05] -18A1; [75 07 42, 05, 05] +18A1; [75 33 42, 05, 05] -1892; [75 07 49, 05, 05] +1892; [75 33 49, 05, 05] -1893; [75 07 50, 05, 05] +1893; [75 33 50, 05, 05] -18A8; [75 07 57, 05, 05] +18A8; [75 33 57, 05, 05] -1894; [75 07 5E, 05, 05] +1894; [75 33 5E, 05, 05] -18A3; [75 07 65, 05, 05] +18A3; [75 33 65, 05, 05] -1895; [75 07 6C, 05, 05] +1895; [75 33 6C, 05, 05] -1899; [75 07 73, 05, 05] +1899; [75 33 73, 05, 05] -1896; [75 07 7A, 05, 05] +1896; [75 33 7A, 05, 05] -1897; [75 07 81, 05, 05] +1897; [75 33 81, 05, 05] -18A6; [75 07 88, 05, 05] +18A6; [75 33 88, 05, 05] -18A7; [75 07 8F, 05, 05] +18A7; [75 33 8F, 05, 05] -18AA; [75 07 96, 05, 05] +18AA; [75 33 96, 05, 05] -18A9; [75 07 9D, 05, 05] +18A9; [75 33 9D, 05, 05] -FDD1 1C5A; [75 08 02, 05, 05] # Ol Chiki first primary (compressible) +FDD1 1C5A; [75 34 02, 05, 05] # Ol Chiki first primary (compressible) -1C5A; [75 08 09, 05, 05] +1C5A; [75 34 09, 05, 05] -1C5B; [75 08 10, 05, 05] +1C5B; [75 34 10, 05, 05] -1C5C; [75 08 17, 05, 05] +1C5C; [75 34 17, 05, 05] -1C5D; [75 08 1E, 05, 05] +1C5D; [75 34 1E, 05, 05] -1C5E; [75 08 25, 05, 05] +1C5E; [75 34 25, 05, 05] -1C5F; [75 08 2C, 05, 05] +1C5F; [75 34 2C, 05, 05] -1C60; [75 08 33, 05, 05] +1C60; [75 34 33, 05, 05] -1C61; [75 08 3A, 05, 05] +1C61; [75 34 3A, 05, 05] -1C62; [75 08 41, 05, 05] +1C62; [75 34 41, 05, 05] -1C63; [75 08 48, 05, 05] +1C63; [75 34 48, 05, 05] -1C64; [75 08 4F, 05, 05] +1C64; [75 34 4F, 05, 05] -1C65; [75 08 56, 05, 05] +1C65; [75 34 56, 05, 05] -1C66; [75 08 5D, 05, 05] +1C66; [75 34 5D, 05, 05] -1C67; [75 08 64, 05, 05] +1C67; [75 34 64, 05, 05] -1C68; [75 08 6B, 05, 05] +1C68; [75 34 6B, 05, 05] -1C69; [75 08 72, 05, 05] +1C69; [75 34 72, 05, 05] -1C6A; [75 08 79, 05, 05] +1C6A; [75 34 79, 05, 05] -1C6B; [75 08 80, 05, 05] +1C6B; [75 34 80, 05, 05] -1C6C; [75 08 87, 05, 05] +1C6C; [75 34 87, 05, 05] -1C6D; [75 08 8E, 05, 05] +1C6D; [75 34 8E, 05, 05] -1C6E; [75 08 95, 05, 05] +1C6E; [75 34 95, 05, 05] -1C6F; [75 08 9C, 05, 05] +1C6F; [75 34 9C, 05, 05] -1C70; [75 08 A3, 05, 05] +1C70; [75 34 A3, 05, 05] -1C71; [75 08 AA, 05, 05] +1C71; [75 34 AA, 05, 05] -1C72; [75 08 B1, 05, 05] +1C72; [75 34 B1, 05, 05] -1C73; [75 08 B8, 05, 05] +1C73; [75 34 B8, 05, 05] -1C74; [75 08 BF, 05, 05] +1C74; [75 34 BF, 05, 05] -1C75; [75 08 C6, 05, 05] +1C75; [75 34 C6, 05, 05] -1C76; [75 08 CD, 05, 05] +1C76; [75 34 CD, 05, 05] -1C77; [75 08 D4, 05, 05] +1C77; [75 34 D4, 05, 05] -1C78; [75 08 DB, 05, 05] +1C78; [75 34 DB, 05, 05] -1C79; [75 08 E2, 05, 05] +1C79; [75 34 E2, 05, 05] -1C7A; [75 08 E9, 05, 05] +1C7A; [75 34 E9, 05, 05] -1C7B; [75 08 F0, 05, 05] +1C7B; [75 34 F0, 05, 05] -1C7C; [75 08 F7, 05, 05] +1C7C; [75 34 F7, 05, 05] -1C7D; [75 08 FE, 05, 05] +1C7D; [75 34 FE, 05, 05] -FDD1 13C4; [75 0A 02, 05, 05] # CHEROKEE first primary (compressible) +FDD1 13C4; [75 36 02, 05, 05] # CHEROKEE first primary (compressible) -AB70; [75 0C, 05, 05] -13A0; [75 0C, 05, A0] +AB70; [75 38, 05, 05] +13A0; [75 38, 05, A0] -AB71; [75 0E, 05, 05] -13A1; [75 0E, 05, A0] +AB71; [75 3A, 05, 05] +13A1; [75 3A, 05, A0] -AB72; [75 10, 05, 05] -13A2; [75 10, 05, A0] +AB72; [75 3C, 05, 05] +13A2; [75 3C, 05, A0] -AB73; [75 12, 05, 05] -13A3; [75 12, 05, A0] +AB73; [75 3E, 05, 05] +13A3; [75 3E, 05, A0] -AB74; [75 14, 05, 05] -13A4; [75 14, 05, A0] +AB74; [75 40, 05, 05] +13A4; [75 40, 05, A0] -AB75; [75 16, 05, 05] -13A5; [75 16, 05, A0] +AB75; [75 42, 05, 05] +13A5; [75 42, 05, A0] -AB76; [75 18, 05, 05] -13A6; [75 18, 05, A0] +AB76; [75 44, 05, 05] +13A6; [75 44, 05, A0] -AB77; [75 1A, 05, 05] -13A7; [75 1A, 05, A0] +AB77; [75 46, 05, 05] +13A7; [75 46, 05, A0] -AB78; [75 1C, 05, 05] -13A8; [75 1C, 05, A0] +AB78; [75 48, 05, 05] +13A8; [75 48, 05, A0] -AB79; [75 1E, 05, 05] -13A9; [75 1E, 05, A0] +AB79; [75 4A, 05, 05] +13A9; [75 4A, 05, A0] -AB7A; [75 20, 05, 05] -13AA; [75 20, 05, A0] +AB7A; [75 4C, 05, 05] +13AA; [75 4C, 05, A0] -AB7B; [75 22, 05, 05] -13AB; [75 22, 05, A0] +AB7B; [75 4E, 05, 05] +13AB; [75 4E, 05, A0] -AB7C; [75 24, 05, 05] -13AC; [75 24, 05, A0] +AB7C; [75 50, 05, 05] +13AC; [75 50, 05, A0] -AB7D; [75 26, 05, 05] -13AD; [75 26, 05, A0] +AB7D; [75 52, 05, 05] +13AD; [75 52, 05, A0] -AB7E; [75 28, 05, 05] -13AE; [75 28, 05, A0] +AB7E; [75 54, 05, 05] +13AE; [75 54, 05, A0] -AB7F; [75 2A, 05, 05] -13AF; [75 2A, 05, A0] +AB7F; [75 56, 05, 05] +13AF; [75 56, 05, A0] -AB80; [75 2C, 05, 05] -13B0; [75 2C, 05, A0] +AB80; [75 58, 05, 05] +13B0; [75 58, 05, A0] -AB81; [75 2E, 05, 05] -13B1; [75 2E, 05, A0] +AB81; [75 5A, 05, 05] +13B1; [75 5A, 05, A0] -AB82; [75 30, 05, 05] -13B2; [75 30, 05, A0] +AB82; [75 5C, 05, 05] +13B2; [75 5C, 05, A0] -AB83; [75 32, 05, 05] -13B3; [75 32, 05, A0] +AB83; [75 5E, 05, 05] +13B3; [75 5E, 05, A0] -AB84; [75 34, 05, 05] -13B4; [75 34, 05, A0] +AB84; [75 60, 05, 05] +13B4; [75 60, 05, A0] -AB85; [75 36, 05, 05] -13B5; [75 36, 05, A0] +AB85; [75 62, 05, 05] +13B5; [75 62, 05, A0] -AB86; [75 38, 05, 05] -13B6; [75 38, 05, A0] +AB86; [75 64, 05, 05] +13B6; [75 64, 05, A0] -AB87; [75 3A, 05, 05] -13B7; [75 3A, 05, A0] +AB87; [75 66, 05, 05] +13B7; [75 66, 05, A0] -AB88; [75 3C, 05, 05] -13B8; [75 3C, 05, A0] +AB88; [75 68, 05, 05] +13B8; [75 68, 05, A0] -AB89; [75 3E, 05, 05] -13B9; [75 3E, 05, A0] +AB89; [75 6A, 05, 05] +13B9; [75 6A, 05, A0] -AB8A; [75 40, 05, 05] -13BA; [75 40, 05, A0] +AB8A; [75 6C, 05, 05] +13BA; [75 6C, 05, A0] -AB8B; [75 42, 05, 05] -13BB; [75 42, 05, A0] +AB8B; [75 6E, 05, 05] +13BB; [75 6E, 05, A0] -AB8C; [75 44, 05, 05] -13BC; [75 44, 05, A0] +AB8C; [75 70, 05, 05] +13BC; [75 70, 05, A0] -AB8D; [75 46, 05, 05] -13BD; [75 46, 05, A0] +AB8D; [75 72, 05, 05] +13BD; [75 72, 05, A0] -AB8E; [75 48, 05, 05] -13BE; [75 48, 05, A0] +AB8E; [75 74, 05, 05] +13BE; [75 74, 05, A0] -AB8F; [75 4A, 05, 05] -13BF; [75 4A, 05, A0] +AB8F; [75 76, 05, 05] +13BF; [75 76, 05, A0] -AB90; [75 4C, 05, 05] -13C0; [75 4C, 05, A0] +AB90; [75 78, 05, 05] +13C0; [75 78, 05, A0] -AB91; [75 4E, 05, 05] -13C1; [75 4E, 05, A0] +AB91; [75 7A, 05, 05] +13C1; [75 7A, 05, A0] -AB92; [75 50, 05, 05] -13C2; [75 50, 05, A0] +AB92; [75 7C, 05, 05] +13C2; [75 7C, 05, A0] -AB93; [75 52, 05, 05] -13C3; [75 52, 05, A0] +AB93; [75 7E, 05, 05] +13C3; [75 7E, 05, A0] -AB94; [75 54, 05, 05] -13C4; [75 54, 05, A0] +AB94; [75 80, 05, 05] +13C4; [75 80, 05, A0] -AB95; [75 56, 05, 05] -13C5; [75 56, 05, A0] +AB95; [75 82, 05, 05] +13C5; [75 82, 05, A0] -AB96; [75 58, 05, 05] -13C6; [75 58, 05, A0] +AB96; [75 84, 05, 05] +13C6; [75 84, 05, A0] -AB97; [75 5A, 05, 05] -13C7; [75 5A, 05, A0] +AB97; [75 86, 05, 05] +13C7; [75 86, 05, A0] -AB98; [75 5C, 05, 05] -13C8; [75 5C, 05, A0] +AB98; [75 88, 05, 05] +13C8; [75 88, 05, A0] -AB99; [75 5E, 05, 05] -13C9; [75 5E, 05, A0] +AB99; [75 8A, 05, 05] +13C9; [75 8A, 05, A0] -AB9A; [75 60, 05, 05] -13CA; [75 60, 05, A0] +AB9A; [75 8C, 05, 05] +13CA; [75 8C, 05, A0] -AB9B; [75 62, 05, 05] -13CB; [75 62, 05, A0] +AB9B; [75 8E, 05, 05] +13CB; [75 8E, 05, A0] -AB9C; [75 64, 05, 05] -13CC; [75 64, 05, A0] +AB9C; [75 90, 05, 05] +13CC; [75 90, 05, A0] -AB9D; [75 66, 05, 05] -13CD; [75 66, 05, A0] +AB9D; [75 92, 05, 05] +13CD; [75 92, 05, A0] -AB9E; [75 68, 05, 05] -13CE; [75 68, 05, A0] +AB9E; [75 94, 05, 05] +13CE; [75 94, 05, A0] -AB9F; [75 6A, 05, 05] -13CF; [75 6A, 05, A0] +AB9F; [75 96, 05, 05] +13CF; [75 96, 05, A0] -ABA0; [75 6C, 05, 05] -13D0; [75 6C, 05, A0] +ABA0; [75 98, 05, 05] +13D0; [75 98, 05, A0] -ABA1; [75 6E, 05, 05] -13D1; [75 6E, 05, A0] +ABA1; [75 9A, 05, 05] +13D1; [75 9A, 05, A0] -ABA2; [75 70, 05, 05] -13D2; [75 70, 05, A0] +ABA2; [75 9C, 05, 05] +13D2; [75 9C, 05, A0] -ABA3; [75 72, 05, 05] -13D3; [75 72, 05, A0] +ABA3; [75 9E, 05, 05] +13D3; [75 9E, 05, A0] -ABA4; [75 74, 05, 05] -13D4; [75 74, 05, A0] +ABA4; [75 A0, 05, 05] +13D4; [75 A0, 05, A0] -ABA5; [75 76, 05, 05] -13D5; [75 76, 05, A0] +ABA5; [75 A2, 05, 05] +13D5; [75 A2, 05, A0] -ABA6; [75 78, 05, 05] -13D6; [75 78, 05, A0] +ABA6; [75 A4, 05, 05] +13D6; [75 A4, 05, A0] -ABA7; [75 7A, 05, 05] -13D7; [75 7A, 05, A0] +ABA7; [75 A6, 05, 05] +13D7; [75 A6, 05, A0] -ABA8; [75 7C, 05, 05] -13D8; [75 7C, 05, A0] +ABA8; [75 A8, 05, 05] +13D8; [75 A8, 05, A0] -ABA9; [75 7E, 05, 05] -13D9; [75 7E, 05, A0] +ABA9; [75 AA, 05, 05] +13D9; [75 AA, 05, A0] -ABAA; [75 80, 05, 05] -13DA; [75 80, 05, A0] +ABAA; [75 AC, 05, 05] +13DA; [75 AC, 05, A0] -ABAB; [75 82, 05, 05] -13DB; [75 82, 05, A0] +ABAB; [75 AE, 05, 05] +13DB; [75 AE, 05, A0] -ABAC; [75 84, 05, 05] -13DC; [75 84, 05, A0] +ABAC; [75 B0, 05, 05] +13DC; [75 B0, 05, A0] -ABAD; [75 86, 05, 05] -13DD; [75 86, 05, A0] +ABAD; [75 B2, 05, 05] +13DD; [75 B2, 05, A0] -ABAE; [75 88, 05, 05] -13DE; [75 88, 05, A0] +ABAE; [75 B4, 05, 05] +13DE; [75 B4, 05, A0] -ABAF; [75 8A, 05, 05] -13DF; [75 8A, 05, A0] +ABAF; [75 B6, 05, 05] +13DF; [75 B6, 05, A0] -ABB0; [75 8C, 05, 05] -13E0; [75 8C, 05, A0] +ABB0; [75 B8, 05, 05] +13E0; [75 B8, 05, A0] -ABB1; [75 8E, 05, 05] -13E1; [75 8E, 05, A0] +ABB1; [75 BA, 05, 05] +13E1; [75 BA, 05, A0] -ABB2; [75 90, 05, 05] -13E2; [75 90, 05, A0] +ABB2; [75 BC, 05, 05] +13E2; [75 BC, 05, A0] -ABB3; [75 92, 05, 05] -13E3; [75 92, 05, A0] +ABB3; [75 BE, 05, 05] +13E3; [75 BE, 05, A0] -ABB4; [75 94, 05, 05] -13E4; [75 94, 05, A0] +ABB4; [75 C0, 05, 05] +13E4; [75 C0, 05, A0] -ABB5; [75 96, 05, 05] -13E5; [75 96, 05, A0] +ABB5; [75 C2, 05, 05] +13E5; [75 C2, 05, A0] -ABB6; [75 98, 05, 05] -13E6; [75 98, 05, A0] +ABB6; [75 C4, 05, 05] +13E6; [75 C4, 05, A0] -ABB7; [75 9A, 05, 05] -13E7; [75 9A, 05, A0] +ABB7; [75 C6, 05, 05] +13E7; [75 C6, 05, A0] -ABB8; [75 9C, 05, 05] -13E8; [75 9C, 05, A0] +ABB8; [75 C8, 05, 05] +13E8; [75 C8, 05, A0] -ABB9; [75 9E, 05, 05] -13E9; [75 9E, 05, A0] +ABB9; [75 CA, 05, 05] +13E9; [75 CA, 05, A0] -ABBA; [75 A0, 05, 05] -13EA; [75 A0, 05, A0] +ABBA; [75 CC, 05, 05] +13EA; [75 CC, 05, A0] -ABBB; [75 A2, 05, 05] -13EB; [75 A2, 05, A0] +ABBB; [75 CE, 05, 05] +13EB; [75 CE, 05, A0] -ABBC; [75 A4, 05, 05] -13EC; [75 A4, 05, A0] +ABBC; [75 D0, 05, 05] +13EC; [75 D0, 05, A0] -ABBD; [75 A6, 05, 05] -13ED; [75 A6, 05, A0] +ABBD; [75 D2, 05, 05] +13ED; [75 D2, 05, A0] -ABBE; [75 A8, 05, 05] -13EE; [75 A8, 05, A0] +ABBE; [75 D4, 05, 05] +13EE; [75 D4, 05, A0] -ABBF; [75 AA, 05, 05] -13EF; [75 AA, 05, A0] +ABBF; [75 D6, 05, 05] +13EF; [75 D6, 05, A0] -13F8; [75 AC, 05, 05] -13F0; [75 AC, 05, A0] +13F8; [75 D8, 05, 05] +13F0; [75 D8, 05, A0] -13F9; [75 AE, 05, 05] -13F1; [75 AE, 05, A0] +13F9; [75 DA, 05, 05] +13F1; [75 DA, 05, A0] -13FA; [75 B0, 05, 05] -13F2; [75 B0, 05, A0] +13FA; [75 DC, 05, 05] +13F2; [75 DC, 05, A0] -13FB; [75 B2, 05, 05] -13F3; [75 B2, 05, A0] +13FB; [75 DE, 05, 05] +13F3; [75 DE, 05, A0] -13FC; [75 B4, 05, 05] -13F4; [75 B4, 05, A0] +13FC; [75 E0, 05, 05] +13F4; [75 E0, 05, A0] -13FD; [75 B6, 05, 05] -13F5; [75 B6, 05, A0] +13FD; [75 E2, 05, 05] +13F5; [75 E2, 05, A0] -FDD1 104B5; [75 B8 02, 05, 05] # Osage first primary (compressible) +FDD1 104B5; [75 E4 02, 05, 05] # Osage first primary (compressible) -104D8; [75 B8 09, 05, 05] -104B0; [75 B8 09, 05, A0] +104D8; [75 E4 09, 05, 05] +104B0; [75 E4 09, 05, A0] -104D9; [75 B8 10, 05, 05] -104B1; [75 B8 10, 05, A0] +104D9; [75 E4 10, 05, 05] +104B1; [75 E4 10, 05, A0] -104DA; [75 B8 17, 05, 05] -104B2; [75 B8 17, 05, A0] +104DA; [75 E4 17, 05, 05] +104B2; [75 E4 17, 05, A0] -104DB; [75 B8 1E, 05, 05] -104B3; [75 B8 1E, 05, A0] +104DB; [75 E4 1E, 05, 05] +104B3; [75 E4 1E, 05, A0] -104DC; [75 B8 25, 05, 05] -104B4; [75 B8 25, 05, A0] +104DC; [75 E4 25, 05, 05] +104B4; [75 E4 25, 05, A0] -104DD; [75 B8 2C, 05, 05] -104B5; [75 B8 2C, 05, A0] +104DD; [75 E4 2C, 05, 05] +104B5; [75 E4 2C, 05, A0] -104DE; [75 B8 33, 05, 05] -104B6; [75 B8 33, 05, A0] +104DE; [75 E4 33, 05, 05] +104B6; [75 E4 33, 05, A0] -104DF; [75 B8 3A, 05, 05] -104B7; [75 B8 3A, 05, A0] +104DF; [75 E4 3A, 05, 05] +104B7; [75 E4 3A, 05, A0] -104E0; [75 B8 41, 05, 05] -104B8; [75 B8 41, 05, A0] +104E0; [75 E4 41, 05, 05] +104B8; [75 E4 41, 05, A0] -104E1; [75 B8 48, 05, 05] -104B9; [75 B8 48, 05, A0] +104E1; [75 E4 48, 05, 05] +104B9; [75 E4 48, 05, A0] -104E2; [75 B8 4F, 05, 05] -104BA; [75 B8 4F, 05, A0] +104E2; [75 E4 4F, 05, 05] +104BA; [75 E4 4F, 05, A0] -104E3; [75 B8 56, 05, 05] -104BB; [75 B8 56, 05, A0] +104E3; [75 E4 56, 05, 05] +104BB; [75 E4 56, 05, A0] -104E4; [75 B8 5D, 05, 05] -104BC; [75 B8 5D, 05, A0] +104E4; [75 E4 5D, 05, 05] +104BC; [75 E4 5D, 05, A0] -104E5; [75 B8 64, 05, 05] -104BD; [75 B8 64, 05, A0] +104E5; [75 E4 64, 05, 05] +104BD; [75 E4 64, 05, A0] -104E6; [75 B8 6B, 05, 05] -104BE; [75 B8 6B, 05, A0] +104E6; [75 E4 6B, 05, 05] +104BE; [75 E4 6B, 05, A0] -104E7; [75 B8 72, 05, 05] -104BF; [75 B8 72, 05, A0] +104E7; [75 E4 72, 05, 05] +104BF; [75 E4 72, 05, A0] -104E8; [75 B8 79, 05, 05] -104C0; [75 B8 79, 05, A0] +104E8; [75 E4 79, 05, 05] +104C0; [75 E4 79, 05, A0] -104E9; [75 B8 80, 05, 05] -104C1; [75 B8 80, 05, A0] +104E9; [75 E4 80, 05, 05] +104C1; [75 E4 80, 05, A0] -104EA; [75 B8 87, 05, 05] -104C2; [75 B8 87, 05, A0] +104EA; [75 E4 87, 05, 05] +104C2; [75 E4 87, 05, A0] -104EB; [75 B8 8E, 05, 05] -104C3; [75 B8 8E, 05, A0] +104EB; [75 E4 8E, 05, 05] +104C3; [75 E4 8E, 05, A0] -104EC; [75 B8 95, 05, 05] -104C4; [75 B8 95, 05, A0] +104EC; [75 E4 95, 05, 05] +104C4; [75 E4 95, 05, A0] -104ED; [75 B8 9C, 05, 05] -104C5; [75 B8 9C, 05, A0] +104ED; [75 E4 9C, 05, 05] +104C5; [75 E4 9C, 05, A0] -104EE; [75 B8 A3, 05, 05] -104C6; [75 B8 A3, 05, A0] +104EE; [75 E4 A3, 05, 05] +104C6; [75 E4 A3, 05, A0] -104EF; [75 B8 AA, 05, 05] -104C7; [75 B8 AA, 05, A0] +104EF; [75 E4 AA, 05, 05] +104C7; [75 E4 AA, 05, A0] -104F0; [75 B8 B1, 05, 05] -104C8; [75 B8 B1, 05, A0] +104F0; [75 E4 B1, 05, 05] +104C8; [75 E4 B1, 05, A0] -104F1; [75 B8 B8, 05, 05] -104C9; [75 B8 B8, 05, A0] +104F1; [75 E4 B8, 05, 05] +104C9; [75 E4 B8, 05, A0] -104F2; [75 B8 BF, 05, 05] -104CA; [75 B8 BF, 05, A0] +104F2; [75 E4 BF, 05, 05] +104CA; [75 E4 BF, 05, A0] -104F3; [75 B8 C6, 05, 05] -104CB; [75 B8 C6, 05, A0] +104F3; [75 E4 C6, 05, 05] +104CB; [75 E4 C6, 05, A0] -104F4; [75 B8 CD, 05, 05] -104CC; [75 B8 CD, 05, A0] +104F4; [75 E4 CD, 05, 05] +104CC; [75 E4 CD, 05, A0] -104F5; [75 B8 D4, 05, 05] -104CD; [75 B8 D4, 05, A0] +104F5; [75 E4 D4, 05, 05] +104CD; [75 E4 D4, 05, A0] -104F6; [75 B8 DB, 05, 05] -104CE; [75 B8 DB, 05, A0] +104F6; [75 E4 DB, 05, 05] +104CE; [75 E4 DB, 05, A0] -104F7; [75 B8 E2, 05, 05] -104CF; [75 B8 E2, 05, A0] +104F7; [75 E4 E2, 05, 05] +104CF; [75 E4 E2, 05, A0] -104F8; [75 B8 E9, 05, 05] -104D0; [75 B8 E9, 05, A0] +104F8; [75 E4 E9, 05, 05] +104D0; [75 E4 E9, 05, A0] -104F9; [75 B8 F0, 05, 05] -104D1; [75 B8 F0, 05, A0] +104F9; [75 E4 F0, 05, 05] +104D1; [75 E4 F0, 05, A0] -104FA; [75 B8 F7, 05, 05] -104D2; [75 B8 F7, 05, A0] +104FA; [75 E4 F7, 05, 05] +104D2; [75 E4 F7, 05, A0] -104FB; [75 B8 FE, 05, 05] -104D3; [75 B8 FE, 05, A0] +104FB; [75 E4 FE, 05, 05] +104D3; [75 E4 FE, 05, A0] -FDD1 14C0; [75 BA 02, 05, 05] # CANADIAN-ABORIGINAL first primary (compressible) +FDD1 14C0; [75 E6 02, 05, 05] # CANADIAN-ABORIGINAL first primary (compressible) -1401; [75 BA 09, 05, 05] +1401; [75 E6 09, 05, 05] -1402; [75 BA 10, 05, 05] +1402; [75 E6 10, 05, 05] -1403; [75 BA 17, 05, 05] +1403; [75 E6 17, 05, 05] -1404; [75 BA 1E, 05, 05] +1404; [75 E6 1E, 05, 05] -1405; [75 BA 25, 05, 05] +1405; [75 E6 25, 05, 05] -1406; [75 BA 2C, 05, 05] +1406; [75 E6 2C, 05, 05] -1407; [75 BA 33, 05, 05] +1407; [75 E6 33, 05, 05] -1408; [75 BA 3A, 05, 05] +1408; [75 E6 3A, 05, 05] -1409; [75 BA 41, 05, 05] +1409; [75 E6 41, 05, 05] -140A; [75 BA 48, 05, 05] +140A; [75 E6 48, 05, 05] -140B; [75 BA 4F, 05, 05] +140B; [75 E6 4F, 05, 05] -140C; [75 BA 56, 05, 05] +140C; [75 E6 56, 05, 05] -140D; [75 BA 5D, 05, 05] +140D; [75 E6 5D, 05, 05] -140E; [75 BA 64, 05, 05] +140E; [75 E6 64, 05, 05] -140F; [75 BA 6B, 05, 05] +140F; [75 E6 6B, 05, 05] -1410; [75 BA 72, 05, 05] +1410; [75 E6 72, 05, 05] -1411; [75 BA 79, 05, 05] +1411; [75 E6 79, 05, 05] -1412; [75 BA 80, 05, 05] +1412; [75 E6 80, 05, 05] -1413; [75 BA 87, 05, 05] +1413; [75 E6 87, 05, 05] -1414; [75 BA 8E, 05, 05] +1414; [75 E6 8E, 05, 05] -1415; [75 BA 95, 05, 05] +1415; [75 E6 95, 05, 05] -1416; [75 BA 9C, 05, 05] +1416; [75 E6 9C, 05, 05] -1417; [75 BA A3, 05, 05] +1417; [75 E6 A3, 05, 05] -1418; [75 BA AA, 05, 05] +1418; [75 E6 AA, 05, 05] -1419; [75 BA B1, 05, 05] +1419; [75 E6 B1, 05, 05] -141A; [75 BA B8, 05, 05] +141A; [75 E6 B8, 05, 05] -141B; [75 BA BF, 05, 05] +141B; [75 E6 BF, 05, 05] -141C; [75 BA C6, 05, 05] +141C; [75 E6 C6, 05, 05] -141D; [75 BA CD, 05, 05] +141D; [75 E6 CD, 05, 05] -141E; [75 BA D4, 05, 05] +141E; [75 E6 D4, 05, 05] -141F; [75 BA DB, 05, 05] +141F; [75 E6 DB, 05, 05] -1420; [75 BA E2, 05, 05] +1420; [75 E6 E2, 05, 05] -1421; [75 BA E9, 05, 05] +1421; [75 E6 E9, 05, 05] -1422; [75 BA F0, 05, 05] +1422; [75 E6 F0, 05, 05] -1423; [75 BA F7, 05, 05] +1423; [75 E6 F7, 05, 05] -1424; [75 BA FE, 05, 05] +1424; [75 E6 FE, 05, 05] -1425; [75 BB 07, 05, 05] +1425; [75 E7 07, 05, 05] -1426; [75 BB 0E, 05, 05] +1426; [75 E7 0E, 05, 05] -1427; [75 BB 15, 05, 05] +1427; [75 E7 15, 05, 05] -1428; [75 BB 1C, 05, 05] +1428; [75 E7 1C, 05, 05] -1429; [75 BB 23, 05, 05] +1429; [75 E7 23, 05, 05] -142A; [75 BB 2A, 05, 05] +142A; [75 E7 2A, 05, 05] -142B; [75 BB 31, 05, 05] +142B; [75 E7 31, 05, 05] -142C; [75 BB 38, 05, 05] +142C; [75 E7 38, 05, 05] -142D; [75 BB 3F, 05, 05] +142D; [75 E7 3F, 05, 05] -142E; [75 BB 46, 05, 05] +142E; [75 E7 46, 05, 05] -142F; [75 BB 4D, 05, 05] +142F; [75 E7 4D, 05, 05] -1430; [75 BB 54, 05, 05] +1430; [75 E7 54, 05, 05] -1431; [75 BB 5B, 05, 05] +1431; [75 E7 5B, 05, 05] -1432; [75 BB 62, 05, 05] +1432; [75 E7 62, 05, 05] -1433; [75 BB 69, 05, 05] +1433; [75 E7 69, 05, 05] -1434; [75 BB 70, 05, 05] +1434; [75 E7 70, 05, 05] -1435; [75 BB 77, 05, 05] +1435; [75 E7 77, 05, 05] -1436; [75 BB 7E, 05, 05] +1436; [75 E7 7E, 05, 05] -1437; [75 BB 85, 05, 05] +1437; [75 E7 85, 05, 05] -1438; [75 BB 8C, 05, 05] +1438; [75 E7 8C, 05, 05] -1439; [75 BB 93, 05, 05] +1439; [75 E7 93, 05, 05] -143A; [75 BB 9A, 05, 05] +143A; [75 E7 9A, 05, 05] -143B; [75 BB A1, 05, 05] +143B; [75 E7 A1, 05, 05] -143C; [75 BB A8, 05, 05] +143C; [75 E7 A8, 05, 05] -143D; [75 BB AF, 05, 05] +143D; [75 E7 AF, 05, 05] -143E; [75 BB B6, 05, 05] +143E; [75 E7 B6, 05, 05] -143F; [75 BB BD, 05, 05] +143F; [75 E7 BD, 05, 05] -1440; [75 BB C4, 05, 05] +1440; [75 E7 C4, 05, 05] -1441; [75 BB CB, 05, 05] +1441; [75 E7 CB, 05, 05] -1442; [75 BB D2, 05, 05] +1442; [75 E7 D2, 05, 05] -1443; [75 BB D9, 05, 05] +1443; [75 E7 D9, 05, 05] -1444; [75 BB E0, 05, 05] +1444; [75 E7 E0, 05, 05] -1445; [75 BB E7, 05, 05] +1445; [75 E7 E7, 05, 05] -1446; [75 BB EE, 05, 05] +1446; [75 E7 EE, 05, 05] -1447; [75 BB F5, 05, 05] +1447; [75 E7 F5, 05, 05] -1448; [75 BB FC, 05, 05] +1448; [75 E7 FC, 05, 05] -1449; [75 BC 05, 05, 05] +1449; [75 E8 05, 05, 05] -144A; [75 BC 0C, 05, 05] +144A; [75 E8 0C, 05, 05] -144B; [75 BC 13, 05, 05] +144B; [75 E8 13, 05, 05] -144C; [75 BC 1A, 05, 05] +144C; [75 E8 1A, 05, 05] -144D; [75 BC 21, 05, 05] +144D; [75 E8 21, 05, 05] -144E; [75 BC 28, 05, 05] +144E; [75 E8 28, 05, 05] -144F; [75 BC 2F, 05, 05] +144F; [75 E8 2F, 05, 05] -1450; [75 BC 36, 05, 05] +1450; [75 E8 36, 05, 05] -1451; [75 BC 3D, 05, 05] +1451; [75 E8 3D, 05, 05] -1452; [75 BC 44, 05, 05] +1452; [75 E8 44, 05, 05] -1453; [75 BC 4B, 05, 05] +1453; [75 E8 4B, 05, 05] -1454; [75 BC 52, 05, 05] +1454; [75 E8 52, 05, 05] -1455; [75 BC 59, 05, 05] +1455; [75 E8 59, 05, 05] -1456; [75 BC 60, 05, 05] +1456; [75 E8 60, 05, 05] -1457; [75 BC 67, 05, 05] +1457; [75 E8 67, 05, 05] -1458; [75 BC 6E, 05, 05] +1458; [75 E8 6E, 05, 05] -1459; [75 BC 75, 05, 05] +1459; [75 E8 75, 05, 05] -145A; [75 BC 7C, 05, 05] +145A; [75 E8 7C, 05, 05] -145B; [75 BC 83, 05, 05] +145B; [75 E8 83, 05, 05] -145C; [75 BC 8A, 05, 05] +145C; [75 E8 8A, 05, 05] -145D; [75 BC 91, 05, 05] +145D; [75 E8 91, 05, 05] -145E; [75 BC 98, 05, 05] +145E; [75 E8 98, 05, 05] -145F; [75 BC 9F, 05, 05] +145F; [75 E8 9F, 05, 05] -1460; [75 BC A6, 05, 05] +1460; [75 E8 A6, 05, 05] -1461; [75 BC AD, 05, 05] +1461; [75 E8 AD, 05, 05] -1462; [75 BC B4, 05, 05] +1462; [75 E8 B4, 05, 05] -1463; [75 BC BB, 05, 05] +1463; [75 E8 BB, 05, 05] -1464; [75 BC C2, 05, 05] +1464; [75 E8 C2, 05, 05] -1465; [75 BC C9, 05, 05] +1465; [75 E8 C9, 05, 05] -1466; [75 BC D0, 05, 05] +1466; [75 E8 D0, 05, 05] -1467; [75 BC D7, 05, 05] +1467; [75 E8 D7, 05, 05] -1468; [75 BC DE, 05, 05] +1468; [75 E8 DE, 05, 05] -1469; [75 BC E5, 05, 05] +1469; [75 E8 E5, 05, 05] -146A; [75 BC EC, 05, 05] +146A; [75 E8 EC, 05, 05] -146B; [75 BC F3, 05, 05] +146B; [75 E8 F3, 05, 05] -146C; [75 BC FA, 05, 05] +146C; [75 E8 FA, 05, 05] -146D; [75 BD 03, 05, 05] +146D; [75 E9 03, 05, 05] -146E; [75 BD 0A, 05, 05] +146E; [75 E9 0A, 05, 05] -146F; [75 BD 11, 05, 05] +146F; [75 E9 11, 05, 05] -1470; [75 BD 18, 05, 05] +1470; [75 E9 18, 05, 05] -1471; [75 BD 1F, 05, 05] +1471; [75 E9 1F, 05, 05] -1472; [75 BD 26, 05, 05] +1472; [75 E9 26, 05, 05] -1473; [75 BD 2D, 05, 05] +1473; [75 E9 2D, 05, 05] -1474; [75 BD 34, 05, 05] +1474; [75 E9 34, 05, 05] -1475; [75 BD 3B, 05, 05] +1475; [75 E9 3B, 05, 05] -1476; [75 BD 42, 05, 05] +1476; [75 E9 42, 05, 05] -1477; [75 BD 49, 05, 05] +1477; [75 E9 49, 05, 05] -1478; [75 BD 50, 05, 05] +1478; [75 E9 50, 05, 05] -1479; [75 BD 57, 05, 05] +1479; [75 E9 57, 05, 05] -147A; [75 BD 5E, 05, 05] +147A; [75 E9 5E, 05, 05] -147B; [75 BD 65, 05, 05] +147B; [75 E9 65, 05, 05] -147C; [75 BD 6C, 05, 05] +147C; [75 E9 6C, 05, 05] -147D; [75 BD 73, 05, 05] +147D; [75 E9 73, 05, 05] -147E; [75 BD 7A, 05, 05] +147E; [75 E9 7A, 05, 05] -147F; [75 BD 81, 05, 05] +147F; [75 E9 81, 05, 05] -1480; [75 BD 88, 05, 05] +1480; [75 E9 88, 05, 05] -1481; [75 BD 8F, 05, 05] +1481; [75 E9 8F, 05, 05] -1482; [75 BD 96, 05, 05] +1482; [75 E9 96, 05, 05] -1483; [75 BD 9D, 05, 05] +1483; [75 E9 9D, 05, 05] -1484; [75 BD A4, 05, 05] +1484; [75 E9 A4, 05, 05] -1485; [75 BD AB, 05, 05] +1485; [75 E9 AB, 05, 05] -1486; [75 BD B2, 05, 05] +1486; [75 E9 B2, 05, 05] -1487; [75 BD B9, 05, 05] +1487; [75 E9 B9, 05, 05] -1488; [75 BD C0, 05, 05] +1488; [75 E9 C0, 05, 05] -1489; [75 BD C7, 05, 05] +1489; [75 E9 C7, 05, 05] -148A; [75 BD CE, 05, 05] +148A; [75 E9 CE, 05, 05] -148B; [75 BD D5, 05, 05] +148B; [75 E9 D5, 05, 05] -148C; [75 BD DC, 05, 05] +148C; [75 E9 DC, 05, 05] -148D; [75 BD E3, 05, 05] +148D; [75 E9 E3, 05, 05] -148E; [75 BD EA, 05, 05] +148E; [75 E9 EA, 05, 05] -148F; [75 BD F1, 05, 05] +148F; [75 E9 F1, 05, 05] -1490; [75 BD F8, 05, 05] +1490; [75 E9 F8, 05, 05] -1491; [75 BD FF, 05, 05] +1491; [75 E9 FF, 05, 05] -1492; [75 BE 08, 05, 05] +1492; [75 EA 08, 05, 05] -1493; [75 BE 0F, 05, 05] +1493; [75 EA 0F, 05, 05] -1494; [75 BE 16, 05, 05] +1494; [75 EA 16, 05, 05] -1495; [75 BE 1D, 05, 05] +1495; [75 EA 1D, 05, 05] -1496; [75 BE 24, 05, 05] +1496; [75 EA 24, 05, 05] -1497; [75 BE 2B, 05, 05] +1497; [75 EA 2B, 05, 05] -1498; [75 BE 32, 05, 05] +1498; [75 EA 32, 05, 05] -1499; [75 BE 39, 05, 05] +1499; [75 EA 39, 05, 05] -149A; [75 BE 40, 05, 05] +149A; [75 EA 40, 05, 05] -149B; [75 BE 47, 05, 05] +149B; [75 EA 47, 05, 05] -149C; [75 BE 4E, 05, 05] +149C; [75 EA 4E, 05, 05] -149D; [75 BE 55, 05, 05] +149D; [75 EA 55, 05, 05] -149E; [75 BE 5C, 05, 05] +149E; [75 EA 5C, 05, 05] -149F; [75 BE 63, 05, 05] +149F; [75 EA 63, 05, 05] -14A0; [75 BE 6A, 05, 05] +14A0; [75 EA 6A, 05, 05] -14A1; [75 BE 71, 05, 05] +14A1; [75 EA 71, 05, 05] -14A2; [75 BE 78, 05, 05] +14A2; [75 EA 78, 05, 05] -14A3; [75 BE 7F, 05, 05] +14A3; [75 EA 7F, 05, 05] -14A4; [75 BE 86, 05, 05] +14A4; [75 EA 86, 05, 05] -14A5; [75 BE 8D, 05, 05] +14A5; [75 EA 8D, 05, 05] -14A6; [75 BE 94, 05, 05] +14A6; [75 EA 94, 05, 05] -14A7; [75 BE 9B, 05, 05] +14A7; [75 EA 9B, 05, 05] -14A8; [75 BE A2, 05, 05] +14A8; [75 EA A2, 05, 05] -14A9; [75 BE A9, 05, 05] +14A9; [75 EA A9, 05, 05] -14AA; [75 BE B0, 05, 05] +14AA; [75 EA B0, 05, 05] -14AB; [75 BE B7, 05, 05] +14AB; [75 EA B7, 05, 05] -14AC; [75 BE BE, 05, 05] +14AC; [75 EA BE, 05, 05] -14AD; [75 BE C5, 05, 05] +14AD; [75 EA C5, 05, 05] -14AE; [75 BE CC, 05, 05] +14AE; [75 EA CC, 05, 05] -14AF; [75 BE D3, 05, 05] +14AF; [75 EA D3, 05, 05] -14B0; [75 BE DA, 05, 05] +14B0; [75 EA DA, 05, 05] -14B1; [75 BE E1, 05, 05] +14B1; [75 EA E1, 05, 05] -14B2; [75 BE E8, 05, 05] +14B2; [75 EA E8, 05, 05] -14B3; [75 BE EF, 05, 05] +14B3; [75 EA EF, 05, 05] -14B4; [75 BE F6, 05, 05] +14B4; [75 EA F6, 05, 05] -14B5; [75 BE FD, 05, 05] +14B5; [75 EA FD, 05, 05] -14B6; [75 BF 06, 05, 05] +14B6; [75 EB 06, 05, 05] -14B7; [75 BF 0D, 05, 05] +14B7; [75 EB 0D, 05, 05] -14B8; [75 BF 14, 05, 05] +14B8; [75 EB 14, 05, 05] -14B9; [75 BF 1B, 05, 05] +14B9; [75 EB 1B, 05, 05] -14BA; [75 BF 22, 05, 05] +14BA; [75 EB 22, 05, 05] -14BB; [75 BF 29, 05, 05] +14BB; [75 EB 29, 05, 05] -14BC; [75 BF 30, 05, 05] +14BC; [75 EB 30, 05, 05] -14BD; [75 BF 37, 05, 05] +14BD; [75 EB 37, 05, 05] -14BE; [75 BF 3E, 05, 05] +14BE; [75 EB 3E, 05, 05] -14BF; [75 BF 45, 05, 05] +14BF; [75 EB 45, 05, 05] -14C0; [75 BF 4C, 05, 05] +14C0; [75 EB 4C, 05, 05] -14C1; [75 BF 53, 05, 05] +14C1; [75 EB 53, 05, 05] -14C2; [75 BF 5A, 05, 05] +14C2; [75 EB 5A, 05, 05] -14C3; [75 BF 61, 05, 05] +14C3; [75 EB 61, 05, 05] -14C4; [75 BF 68, 05, 05] +14C4; [75 EB 68, 05, 05] -14C5; [75 BF 6F, 05, 05] +14C5; [75 EB 6F, 05, 05] -14C6; [75 BF 76, 05, 05] +14C6; [75 EB 76, 05, 05] -14C7; [75 BF 7D, 05, 05] +14C7; [75 EB 7D, 05, 05] -14C8; [75 BF 84, 05, 05] +14C8; [75 EB 84, 05, 05] -14C9; [75 BF 8B, 05, 05] +14C9; [75 EB 8B, 05, 05] -14CA; [75 BF 92, 05, 05] +14CA; [75 EB 92, 05, 05] -14CB; [75 BF 99, 05, 05] +14CB; [75 EB 99, 05, 05] -14CC; [75 BF A0, 05, 05] +14CC; [75 EB A0, 05, 05] -14CD; [75 BF A7, 05, 05] +14CD; [75 EB A7, 05, 05] -14CE; [75 BF AE, 05, 05] +14CE; [75 EB AE, 05, 05] -14CF; [75 BF B5, 05, 05] +14CF; [75 EB B5, 05, 05] -14D0; [75 BF BC, 05, 05] +14D0; [75 EB BC, 05, 05] -14D1; [75 BF C3, 05, 05] +14D1; [75 EB C3, 05, 05] -14D2; [75 BF CA, 05, 05] +14D2; [75 EB CA, 05, 05] -14D3; [75 BF D1, 05, 05] +14D3; [75 EB D1, 05, 05] -14D4; [75 BF D8, 05, 05] +14D4; [75 EB D8, 05, 05] -14D5; [75 BF DF, 05, 05] +14D5; [75 EB DF, 05, 05] -14D6; [75 BF E6, 05, 05] +14D6; [75 EB E6, 05, 05] -14D7; [75 BF ED, 05, 05] +14D7; [75 EB ED, 05, 05] -14D8; [75 BF F4, 05, 05] +14D8; [75 EB F4, 05, 05] -14D9; [75 BF FB, 05, 05] +14D9; [75 EB FB, 05, 05] -14DA; [75 C0 04, 05, 05] +14DA; [75 EC 04, 05, 05] -14DB; [75 C0 0B, 05, 05] +14DB; [75 EC 0B, 05, 05] -14DC; [75 C0 12, 05, 05] +14DC; [75 EC 12, 05, 05] -14DD; [75 C0 19, 05, 05] +14DD; [75 EC 19, 05, 05] -14DE; [75 C0 20, 05, 05] +14DE; [75 EC 20, 05, 05] -14DF; [75 C0 27, 05, 05] +14DF; [75 EC 27, 05, 05] -14E0; [75 C0 2E, 05, 05] +14E0; [75 EC 2E, 05, 05] -14E1; [75 C0 35, 05, 05] +14E1; [75 EC 35, 05, 05] -14E2; [75 C0 3C, 05, 05] +14E2; [75 EC 3C, 05, 05] -14E3; [75 C0 43, 05, 05] +14E3; [75 EC 43, 05, 05] -14E4; [75 C0 4A, 05, 05] +14E4; [75 EC 4A, 05, 05] -14E5; [75 C0 51, 05, 05] +14E5; [75 EC 51, 05, 05] -14E6; [75 C0 58, 05, 05] +14E6; [75 EC 58, 05, 05] -14E7; [75 C0 5F, 05, 05] +14E7; [75 EC 5F, 05, 05] -14E8; [75 C0 66, 05, 05] +14E8; [75 EC 66, 05, 05] -14E9; [75 C0 6D, 05, 05] +14E9; [75 EC 6D, 05, 05] -14EA; [75 C0 74, 05, 05] +14EA; [75 EC 74, 05, 05] -14EB; [75 C0 7B, 05, 05] +14EB; [75 EC 7B, 05, 05] -14EC; [75 C0 82, 05, 05] +14EC; [75 EC 82, 05, 05] -14ED; [75 C0 89, 05, 05] +14ED; [75 EC 89, 05, 05] -14EE; [75 C0 90, 05, 05] +14EE; [75 EC 90, 05, 05] -14EF; [75 C0 97, 05, 05] +14EF; [75 EC 97, 05, 05] -14F0; [75 C0 9E, 05, 05] +14F0; [75 EC 9E, 05, 05] -14F1; [75 C0 A5, 05, 05] +14F1; [75 EC A5, 05, 05] -14F2; [75 C0 AC, 05, 05] +14F2; [75 EC AC, 05, 05] -14F3; [75 C0 B3, 05, 05] +14F3; [75 EC B3, 05, 05] -14F4; [75 C0 BA, 05, 05] +14F4; [75 EC BA, 05, 05] -14F5; [75 C0 C1, 05, 05] +14F5; [75 EC C1, 05, 05] -14F6; [75 C0 C8, 05, 05] +14F6; [75 EC C8, 05, 05] -14F7; [75 C0 CF, 05, 05] +14F7; [75 EC CF, 05, 05] -14F8; [75 C0 D6, 05, 05] +14F8; [75 EC D6, 05, 05] -14F9; [75 C0 DD, 05, 05] +14F9; [75 EC DD, 05, 05] -14FA; [75 C0 E4, 05, 05] +14FA; [75 EC E4, 05, 05] -14FB; [75 C0 EB, 05, 05] +14FB; [75 EC EB, 05, 05] -14FC; [75 C0 F2, 05, 05] +14FC; [75 EC F2, 05, 05] -14FD; [75 C0 F9, 05, 05] +14FD; [75 EC F9, 05, 05] -14FE; [75 C1 02, 05, 05] +14FE; [75 ED 02, 05, 05] -14FF; [75 C1 09, 05, 05] +14FF; [75 ED 09, 05, 05] -1500; [75 C1 10, 05, 05] +1500; [75 ED 10, 05, 05] -1501; [75 C1 17, 05, 05] +1501; [75 ED 17, 05, 05] -1502; [75 C1 1E, 05, 05] +1502; [75 ED 1E, 05, 05] -1503; [75 C1 25, 05, 05] +1503; [75 ED 25, 05, 05] -1504; [75 C1 2C, 05, 05] +1504; [75 ED 2C, 05, 05] -1505; [75 C1 33, 05, 05] +1505; [75 ED 33, 05, 05] -1506; [75 C1 3A, 05, 05] +1506; [75 ED 3A, 05, 05] -1507; [75 C1 41, 05, 05] +1507; [75 ED 41, 05, 05] -1508; [75 C1 48, 05, 05] +1508; [75 ED 48, 05, 05] -1509; [75 C1 4F, 05, 05] +1509; [75 ED 4F, 05, 05] -150A; [75 C1 56, 05, 05] +150A; [75 ED 56, 05, 05] -150B; [75 C1 5D, 05, 05] +150B; [75 ED 5D, 05, 05] -150C; [75 C1 64, 05, 05] +150C; [75 ED 64, 05, 05] -150D; [75 C1 6B, 05, 05] +150D; [75 ED 6B, 05, 05] -150E; [75 C1 72, 05, 05] +150E; [75 ED 72, 05, 05] -150F; [75 C1 79, 05, 05] +150F; [75 ED 79, 05, 05] -1510; [75 C1 80, 05, 05] +1510; [75 ED 80, 05, 05] -1511; [75 C1 87, 05, 05] +1511; [75 ED 87, 05, 05] -1512; [75 C1 8E, 05, 05] +1512; [75 ED 8E, 05, 05] -1513; [75 C1 95, 05, 05] +1513; [75 ED 95, 05, 05] -1514; [75 C1 9C, 05, 05] +1514; [75 ED 9C, 05, 05] -1515; [75 C1 A3, 05, 05] +1515; [75 ED A3, 05, 05] -1516; [75 C1 AA, 05, 05] +1516; [75 ED AA, 05, 05] -1517; [75 C1 B1, 05, 05] +1517; [75 ED B1, 05, 05] -1518; [75 C1 B8, 05, 05] +1518; [75 ED B8, 05, 05] -1519; [75 C1 BF, 05, 05] +1519; [75 ED BF, 05, 05] -151A; [75 C1 C6, 05, 05] +151A; [75 ED C6, 05, 05] -151B; [75 C1 CD, 05, 05] +151B; [75 ED CD, 05, 05] -151C; [75 C1 D4, 05, 05] +151C; [75 ED D4, 05, 05] -151D; [75 C1 DB, 05, 05] +151D; [75 ED DB, 05, 05] -151E; [75 C1 E2, 05, 05] +151E; [75 ED E2, 05, 05] -151F; [75 C1 E9, 05, 05] +151F; [75 ED E9, 05, 05] -1520; [75 C1 F0, 05, 05] +1520; [75 ED F0, 05, 05] -1521; [75 C1 F7, 05, 05] +1521; [75 ED F7, 05, 05] -1522; [75 C1 FE, 05, 05] +1522; [75 ED FE, 05, 05] -1523; [75 C2 07, 05, 05] +1523; [75 EE 07, 05, 05] -1524; [75 C2 0E, 05, 05] +1524; [75 EE 0E, 05, 05] -1525; [75 C2 15, 05, 05] +1525; [75 EE 15, 05, 05] -1526; [75 C2 1C, 05, 05] +1526; [75 EE 1C, 05, 05] -1527; [75 C2 23, 05, 05] +1527; [75 EE 23, 05, 05] -1528; [75 C2 2A, 05, 05] +1528; [75 EE 2A, 05, 05] -1529; [75 C2 31, 05, 05] +1529; [75 EE 31, 05, 05] -152A; [75 C2 38, 05, 05] +152A; [75 EE 38, 05, 05] -152B; [75 C2 3F, 05, 05] +152B; [75 EE 3F, 05, 05] -152C; [75 C2 46, 05, 05] +152C; [75 EE 46, 05, 05] -152D; [75 C2 4D, 05, 05] +152D; [75 EE 4D, 05, 05] -152E; [75 C2 54, 05, 05] +152E; [75 EE 54, 05, 05] -152F; [75 C2 5B, 05, 05] +152F; [75 EE 5B, 05, 05] -1530; [75 C2 62, 05, 05] +1530; [75 EE 62, 05, 05] -1531; [75 C2 69, 05, 05] +1531; [75 EE 69, 05, 05] -1532; [75 C2 70, 05, 05] +1532; [75 EE 70, 05, 05] -1533; [75 C2 77, 05, 05] +1533; [75 EE 77, 05, 05] -1534; [75 C2 7E, 05, 05] +1534; [75 EE 7E, 05, 05] -1535; [75 C2 85, 05, 05] +1535; [75 EE 85, 05, 05] -1536; [75 C2 8C, 05, 05] +1536; [75 EE 8C, 05, 05] -1537; [75 C2 93, 05, 05] +1537; [75 EE 93, 05, 05] -1538; [75 C2 9A, 05, 05] +1538; [75 EE 9A, 05, 05] -1539; [75 C2 A1, 05, 05] +1539; [75 EE A1, 05, 05] -153A; [75 C2 A8, 05, 05] +153A; [75 EE A8, 05, 05] -153B; [75 C2 AF, 05, 05] +153B; [75 EE AF, 05, 05] -153C; [75 C2 B6, 05, 05] +153C; [75 EE B6, 05, 05] -153D; [75 C2 BD, 05, 05] +153D; [75 EE BD, 05, 05] -153E; [75 C2 C4, 05, 05] +153E; [75 EE C4, 05, 05] -153F; [75 C2 CB, 05, 05] +153F; [75 EE CB, 05, 05] -1540; [75 C2 D2, 05, 05] +1540; [75 EE D2, 05, 05] -1541; [75 C2 D9, 05, 05] +1541; [75 EE D9, 05, 05] -1542; [75 C2 E0, 05, 05] +1542; [75 EE E0, 05, 05] -1543; [75 C2 E7, 05, 05] +1543; [75 EE E7, 05, 05] -1544; [75 C2 EE, 05, 05] +1544; [75 EE EE, 05, 05] -1545; [75 C2 F5, 05, 05] +1545; [75 EE F5, 05, 05] -1546; [75 C2 FC, 05, 05] +1546; [75 EE FC, 05, 05] -1547; [75 C3 05, 05, 05] +1547; [75 EF 05, 05, 05] -1548; [75 C3 0C, 05, 05] +1548; [75 EF 0C, 05, 05] -1549; [75 C3 13, 05, 05] +1549; [75 EF 13, 05, 05] -154A; [75 C3 1A, 05, 05] +154A; [75 EF 1A, 05, 05] -154B; [75 C3 21, 05, 05] +154B; [75 EF 21, 05, 05] -154C; [75 C3 28, 05, 05] +154C; [75 EF 28, 05, 05] -154D; [75 C3 2F, 05, 05] +154D; [75 EF 2F, 05, 05] -154E; [75 C3 36, 05, 05] +154E; [75 EF 36, 05, 05] -154F; [75 C3 3D, 05, 05] +154F; [75 EF 3D, 05, 05] -1550; [75 C3 44, 05, 05] +1550; [75 EF 44, 05, 05] -1551; [75 C3 4B, 05, 05] +1551; [75 EF 4B, 05, 05] -1552; [75 C3 52, 05, 05] +1552; [75 EF 52, 05, 05] -1553; [75 C3 59, 05, 05] +1553; [75 EF 59, 05, 05] -1554; [75 C3 60, 05, 05] +1554; [75 EF 60, 05, 05] -1555; [75 C3 67, 05, 05] +1555; [75 EF 67, 05, 05] -1556; [75 C3 6E, 05, 05] +1556; [75 EF 6E, 05, 05] -1557; [75 C3 75, 05, 05] +1557; [75 EF 75, 05, 05] -1558; [75 C3 7C, 05, 05] +1558; [75 EF 7C, 05, 05] -1559; [75 C3 83, 05, 05] +1559; [75 EF 83, 05, 05] -155A; [75 C3 8A, 05, 05] +155A; [75 EF 8A, 05, 05] -155B; [75 C3 91, 05, 05] +155B; [75 EF 91, 05, 05] -155C; [75 C3 98, 05, 05] +155C; [75 EF 98, 05, 05] -155D; [75 C3 9F, 05, 05] +155D; [75 EF 9F, 05, 05] -155E; [75 C3 A6, 05, 05] +155E; [75 EF A6, 05, 05] -155F; [75 C3 AD, 05, 05] +155F; [75 EF AD, 05, 05] -1560; [75 C3 B4, 05, 05] +1560; [75 EF B4, 05, 05] -1561; [75 C3 BB, 05, 05] +1561; [75 EF BB, 05, 05] -1562; [75 C3 C2, 05, 05] +1562; [75 EF C2, 05, 05] -1563; [75 C3 C9, 05, 05] +1563; [75 EF C9, 05, 05] -1564; [75 C3 D0, 05, 05] +1564; [75 EF D0, 05, 05] -1565; [75 C3 D7, 05, 05] +1565; [75 EF D7, 05, 05] -1566; [75 C3 DE, 05, 05] +1566; [75 EF DE, 05, 05] -1567; [75 C3 E5, 05, 05] +1567; [75 EF E5, 05, 05] -1568; [75 C3 EC, 05, 05] +1568; [75 EF EC, 05, 05] -1569; [75 C3 F3, 05, 05] +1569; [75 EF F3, 05, 05] -156A; [75 C3 FA, 05, 05] +156A; [75 EF FA, 05, 05] -156B; [75 C4 03, 05, 05] +156B; [75 F0 03, 05, 05] -156C; [75 C4 0A, 05, 05] +156C; [75 F0 0A, 05, 05] -156D; [75 C4 11, 05, 05] +156D; [75 F0 11, 05, 05] -156E; [75 C4 18, 05, 05] +156E; [75 F0 18, 05, 05] -156F; [75 C4 1F, 05, 05] +156F; [75 F0 1F, 05, 05] -1570; [75 C4 26, 05, 05] +1570; [75 F0 26, 05, 05] -1571; [75 C4 2D, 05, 05] +1571; [75 F0 2D, 05, 05] -1572; [75 C4 34, 05, 05] +1572; [75 F0 34, 05, 05] -1573; [75 C4 3B, 05, 05] +1573; [75 F0 3B, 05, 05] -1574; [75 C4 42, 05, 05] +1574; [75 F0 42, 05, 05] -1575; [75 C4 49, 05, 05] +1575; [75 F0 49, 05, 05] -1576; [75 C4 50, 05, 05] +1576; [75 F0 50, 05, 05] -1577; [75 C4 57, 05, 05] +1577; [75 F0 57, 05, 05] -1578; [75 C4 5E, 05, 05] +1578; [75 F0 5E, 05, 05] -1579; [75 C4 65, 05, 05] +1579; [75 F0 65, 05, 05] -157A; [75 C4 6C, 05, 05] +157A; [75 F0 6C, 05, 05] -157B; [75 C4 73, 05, 05] +157B; [75 F0 73, 05, 05] -157D; [75 C4 7A, 05, 05] +157D; [75 F0 7A, 05, 05] -166F; [75 C4 81, 05, 05] +166F; [75 F0 81, 05, 05] -157E; [75 C4 88, 05, 05] +157E; [75 F0 88, 05, 05] -157F; [75 C4 8F, 05, 05] +157F; [75 F0 8F, 05, 05] -1580; [75 C4 96, 05, 05] +1580; [75 F0 96, 05, 05] -1581; [75 C4 9D, 05, 05] +1581; [75 F0 9D, 05, 05] -1582; [75 C4 A4, 05, 05] +1582; [75 F0 A4, 05, 05] -1583; [75 C4 AB, 05, 05] +1583; [75 F0 AB, 05, 05] -1584; [75 C4 B2, 05, 05] +1584; [75 F0 B2, 05, 05] -1585; [75 C4 B9, 05, 05] +1585; [75 F0 B9, 05, 05] -1586; [75 C4 C0, 05, 05] +1586; [75 F0 C0, 05, 05] -1587; [75 C4 C7, 05, 05] +1587; [75 F0 C7, 05, 05] -1588; [75 C4 CE, 05, 05] +1588; [75 F0 CE, 05, 05] -1589; [75 C4 D5, 05, 05] +1589; [75 F0 D5, 05, 05] -158A; [75 C4 DC, 05, 05] +158A; [75 F0 DC, 05, 05] -158B; [75 C4 E3, 05, 05] +158B; [75 F0 E3, 05, 05] -158C; [75 C4 EA, 05, 05] +158C; [75 F0 EA, 05, 05] -158D; [75 C4 F1, 05, 05] +158D; [75 F0 F1, 05, 05] -1670; [75 C4 F8, 05, 05] +1670; [75 F0 F8, 05, 05] -158E; [75 C4 FF, 05, 05] +158E; [75 F0 FF, 05, 05] -158F; [75 C5 08, 05, 05] +158F; [75 F1 08, 05, 05] -1590; [75 C5 0F, 05, 05] +1590; [75 F1 0F, 05, 05] -1591; [75 C5 16, 05, 05] +1591; [75 F1 16, 05, 05] -1592; [75 C5 1D, 05, 05] +1592; [75 F1 1D, 05, 05] -1593; [75 C5 24, 05, 05] +1593; [75 F1 24, 05, 05] -1594; [75 C5 2B, 05, 05] +1594; [75 F1 2B, 05, 05] -1595; [75 C5 32, 05, 05] +1595; [75 F1 32, 05, 05] -1671; [75 C5 39, 05, 05] +1671; [75 F1 39, 05, 05] -1672; [75 C5 40, 05, 05] +1672; [75 F1 40, 05, 05] -1673; [75 C5 47, 05, 05] +1673; [75 F1 47, 05, 05] -1674; [75 C5 4E, 05, 05] +1674; [75 F1 4E, 05, 05] -1675; [75 C5 55, 05, 05] +1675; [75 F1 55, 05, 05] -1676; [75 C5 5C, 05, 05] +1676; [75 F1 5C, 05, 05] -1596; [75 C5 63, 05, 05] +1596; [75 F1 63, 05, 05] -1597; [75 C5 6A, 05, 05] +1597; [75 F1 6A, 05, 05] -1598; [75 C5 71, 05, 05] +1598; [75 F1 71, 05, 05] -1599; [75 C5 78, 05, 05] +1599; [75 F1 78, 05, 05] -159A; [75 C5 7F, 05, 05] +159A; [75 F1 7F, 05, 05] -159B; [75 C5 86, 05, 05] +159B; [75 F1 86, 05, 05] -159C; [75 C5 8D, 05, 05] +159C; [75 F1 8D, 05, 05] -159D; [75 C5 94, 05, 05] +159D; [75 F1 94, 05, 05] -159E; [75 C5 9B, 05, 05] +159E; [75 F1 9B, 05, 05] -159F; [75 C5 A2, 05, 05] +159F; [75 F1 A2, 05, 05] -15A0; [75 C5 A9, 05, 05] +15A0; [75 F1 A9, 05, 05] -15A1; [75 C5 B0, 05, 05] +15A1; [75 F1 B0, 05, 05] -15A2; [75 C5 B7, 05, 05] +15A2; [75 F1 B7, 05, 05] -15A3; [75 C5 BE, 05, 05] +15A3; [75 F1 BE, 05, 05] -15A4; [75 C5 C5, 05, 05] +15A4; [75 F1 C5, 05, 05] -15A5; [75 C5 CC, 05, 05] +15A5; [75 F1 CC, 05, 05] -15A6; [75 C5 D3, 05, 05] +15A6; [75 F1 D3, 05, 05] -157C; [75 C5 DA, 05, 05] +157C; [75 F1 DA, 05, 05] -15A7; [75 C5 E1, 05, 05] +15A7; [75 F1 E1, 05, 05] -15A8; [75 C5 E8, 05, 05] +15A8; [75 F1 E8, 05, 05] -15A9; [75 C5 EF, 05, 05] +15A9; [75 F1 EF, 05, 05] -15AA; [75 C5 F6, 05, 05] +15AA; [75 F1 F6, 05, 05] -15AB; [75 C5 FD, 05, 05] +15AB; [75 F1 FD, 05, 05] -15AC; [75 C6 06, 05, 05] +15AC; [75 F2 06, 05, 05] -15AD; [75 C6 0D, 05, 05] +15AD; [75 F2 0D, 05, 05] -15AE; [75 C6 14, 05, 05] +15AE; [75 F2 14, 05, 05] -15AF; [75 C6 1B, 05, 05] +15AF; [75 F2 1B, 05, 05] -15B0; [75 C6 22, 05, 05] +15B0; [75 F2 22, 05, 05] -15B1; [75 C6 29, 05, 05] +15B1; [75 F2 29, 05, 05] -15B2; [75 C6 30, 05, 05] +15B2; [75 F2 30, 05, 05] -15B3; [75 C6 37, 05, 05] +15B3; [75 F2 37, 05, 05] -15B4; [75 C6 3E, 05, 05] +15B4; [75 F2 3E, 05, 05] -15B5; [75 C6 45, 05, 05] +15B5; [75 F2 45, 05, 05] -15B6; [75 C6 4C, 05, 05] +15B6; [75 F2 4C, 05, 05] -15B7; [75 C6 53, 05, 05] +15B7; [75 F2 53, 05, 05] -15B8; [75 C6 5A, 05, 05] +15B8; [75 F2 5A, 05, 05] -15B9; [75 C6 61, 05, 05] +15B9; [75 F2 61, 05, 05] -15BA; [75 C6 68, 05, 05] +15BA; [75 F2 68, 05, 05] -15BB; [75 C6 6F, 05, 05] +15BB; [75 F2 6F, 05, 05] -15BC; [75 C6 76, 05, 05] +15BC; [75 F2 76, 05, 05] -15BD; [75 C6 7D, 05, 05] +15BD; [75 F2 7D, 05, 05] -15BE; [75 C6 84, 05, 05] +15BE; [75 F2 84, 05, 05] -15BF; [75 C6 8B, 05, 05] +15BF; [75 F2 8B, 05, 05] -15C0; [75 C6 92, 05, 05] +15C0; [75 F2 92, 05, 05] -15C1; [75 C6 99, 05, 05] +15C1; [75 F2 99, 05, 05] -15C2; [75 C6 A0, 05, 05] +15C2; [75 F2 A0, 05, 05] -15C3; [75 C6 A7, 05, 05] +15C3; [75 F2 A7, 05, 05] -15C4; [75 C6 AE, 05, 05] +15C4; [75 F2 AE, 05, 05] -15C5; [75 C6 B5, 05, 05] +15C5; [75 F2 B5, 05, 05] -15C6; [75 C6 BC, 05, 05] +15C6; [75 F2 BC, 05, 05] -15C7; [75 C6 C3, 05, 05] +15C7; [75 F2 C3, 05, 05] -15C8; [75 C6 CA, 05, 05] +15C8; [75 F2 CA, 05, 05] -15C9; [75 C6 D1, 05, 05] +15C9; [75 F2 D1, 05, 05] -15CA; [75 C6 D8, 05, 05] +15CA; [75 F2 D8, 05, 05] -15CB; [75 C6 DF, 05, 05] +15CB; [75 F2 DF, 05, 05] -15CC; [75 C6 E6, 05, 05] +15CC; [75 F2 E6, 05, 05] -15CD; [75 C6 ED, 05, 05] +15CD; [75 F2 ED, 05, 05] -15CE; [75 C6 F4, 05, 05] +15CE; [75 F2 F4, 05, 05] -15CF; [75 C6 FB, 05, 05] +15CF; [75 F2 FB, 05, 05] -15D0; [75 C7 04, 05, 05] +15D0; [75 F3 04, 05, 05] -15D1; [75 C7 0B, 05, 05] +15D1; [75 F3 0B, 05, 05] -15D2; [75 C7 12, 05, 05] +15D2; [75 F3 12, 05, 05] -15D3; [75 C7 19, 05, 05] +15D3; [75 F3 19, 05, 05] -15D4; [75 C7 20, 05, 05] +15D4; [75 F3 20, 05, 05] -15D5; [75 C7 27, 05, 05] +15D5; [75 F3 27, 05, 05] -15D6; [75 C7 2E, 05, 05] +15D6; [75 F3 2E, 05, 05] -15D7; [75 C7 35, 05, 05] +15D7; [75 F3 35, 05, 05] -15D8; [75 C7 3C, 05, 05] +15D8; [75 F3 3C, 05, 05] -15D9; [75 C7 43, 05, 05] +15D9; [75 F3 43, 05, 05] -15DA; [75 C7 4A, 05, 05] +15DA; [75 F3 4A, 05, 05] -15DB; [75 C7 51, 05, 05] +15DB; [75 F3 51, 05, 05] -15DC; [75 C7 58, 05, 05] +15DC; [75 F3 58, 05, 05] -15DD; [75 C7 5F, 05, 05] +15DD; [75 F3 5F, 05, 05] -15DE; [75 C7 66, 05, 05] +15DE; [75 F3 66, 05, 05] -15DF; [75 C7 6D, 05, 05] +15DF; [75 F3 6D, 05, 05] -15E0; [75 C7 74, 05, 05] +15E0; [75 F3 74, 05, 05] -15E1; [75 C7 7B, 05, 05] +15E1; [75 F3 7B, 05, 05] -15E2; [75 C7 82, 05, 05] +15E2; [75 F3 82, 05, 05] -15E3; [75 C7 89, 05, 05] +15E3; [75 F3 89, 05, 05] -15E4; [75 C7 90, 05, 05] +15E4; [75 F3 90, 05, 05] -15E5; [75 C7 97, 05, 05] +15E5; [75 F3 97, 05, 05] -15E6; [75 C7 9E, 05, 05] +15E6; [75 F3 9E, 05, 05] -15E7; [75 C7 A5, 05, 05] +15E7; [75 F3 A5, 05, 05] -15E8; [75 C7 AC, 05, 05] +15E8; [75 F3 AC, 05, 05] -15E9; [75 C7 B3, 05, 05] +15E9; [75 F3 B3, 05, 05] -15EA; [75 C7 BA, 05, 05] +15EA; [75 F3 BA, 05, 05] -15EB; [75 C7 C1, 05, 05] +15EB; [75 F3 C1, 05, 05] -15EC; [75 C7 C8, 05, 05] +15EC; [75 F3 C8, 05, 05] -15ED; [75 C7 CF, 05, 05] +15ED; [75 F3 CF, 05, 05] -15EE; [75 C7 D6, 05, 05] +15EE; [75 F3 D6, 05, 05] -15EF; [75 C7 DD, 05, 05] +15EF; [75 F3 DD, 05, 05] -15F0; [75 C7 E4, 05, 05] +15F0; [75 F3 E4, 05, 05] -15F1; [75 C7 EB, 05, 05] +15F1; [75 F3 EB, 05, 05] -15F2; [75 C7 F2, 05, 05] +15F2; [75 F3 F2, 05, 05] -15F3; [75 C7 F9, 05, 05] +15F3; [75 F3 F9, 05, 05] -15F4; [75 C8 02, 05, 05] +15F4; [75 F4 02, 05, 05] -15F5; [75 C8 09, 05, 05] +15F5; [75 F4 09, 05, 05] -15F6; [75 C8 10, 05, 05] +15F6; [75 F4 10, 05, 05] -15F7; [75 C8 17, 05, 05] +15F7; [75 F4 17, 05, 05] -15F8; [75 C8 1E, 05, 05] +15F8; [75 F4 1E, 05, 05] -15F9; [75 C8 25, 05, 05] +15F9; [75 F4 25, 05, 05] -15FA; [75 C8 2C, 05, 05] +15FA; [75 F4 2C, 05, 05] -15FB; [75 C8 33, 05, 05] +15FB; [75 F4 33, 05, 05] -15FC; [75 C8 3A, 05, 05] +15FC; [75 F4 3A, 05, 05] -15FD; [75 C8 41, 05, 05] +15FD; [75 F4 41, 05, 05] -15FE; [75 C8 48, 05, 05] +15FE; [75 F4 48, 05, 05] -15FF; [75 C8 4F, 05, 05] +15FF; [75 F4 4F, 05, 05] -1600; [75 C8 56, 05, 05] +1600; [75 F4 56, 05, 05] -1601; [75 C8 5D, 05, 05] +1601; [75 F4 5D, 05, 05] -1602; [75 C8 64, 05, 05] +1602; [75 F4 64, 05, 05] -1603; [75 C8 6B, 05, 05] +1603; [75 F4 6B, 05, 05] -1604; [75 C8 72, 05, 05] +1604; [75 F4 72, 05, 05] -1605; [75 C8 79, 05, 05] +1605; [75 F4 79, 05, 05] -1606; [75 C8 80, 05, 05] +1606; [75 F4 80, 05, 05] -1607; [75 C8 87, 05, 05] +1607; [75 F4 87, 05, 05] -1608; [75 C8 8E, 05, 05] +1608; [75 F4 8E, 05, 05] -1609; [75 C8 95, 05, 05] +1609; [75 F4 95, 05, 05] -160A; [75 C8 9C, 05, 05] +160A; [75 F4 9C, 05, 05] -160B; [75 C8 A3, 05, 05] +160B; [75 F4 A3, 05, 05] -160C; [75 C8 AA, 05, 05] +160C; [75 F4 AA, 05, 05] -160D; [75 C8 B1, 05, 05] +160D; [75 F4 B1, 05, 05] -160E; [75 C8 B8, 05, 05] +160E; [75 F4 B8, 05, 05] -160F; [75 C8 BF, 05, 05] +160F; [75 F4 BF, 05, 05] -1610; [75 C8 C6, 05, 05] +1610; [75 F4 C6, 05, 05] -1611; [75 C8 CD, 05, 05] +1611; [75 F4 CD, 05, 05] -1612; [75 C8 D4, 05, 05] +1612; [75 F4 D4, 05, 05] -1613; [75 C8 DB, 05, 05] +1613; [75 F4 DB, 05, 05] -1614; [75 C8 E2, 05, 05] +1614; [75 F4 E2, 05, 05] -1615; [75 C8 E9, 05, 05] +1615; [75 F4 E9, 05, 05] -1616; [75 C8 F0, 05, 05] +1616; [75 F4 F0, 05, 05] -1617; [75 C8 F7, 05, 05] +1617; [75 F4 F7, 05, 05] -1618; [75 C8 FE, 05, 05] +1618; [75 F4 FE, 05, 05] -1619; [75 C9 07, 05, 05] +1619; [75 F5 07, 05, 05] -161A; [75 C9 0E, 05, 05] +161A; [75 F5 0E, 05, 05] -161B; [75 C9 15, 05, 05] +161B; [75 F5 15, 05, 05] -161C; [75 C9 1C, 05, 05] +161C; [75 F5 1C, 05, 05] -161D; [75 C9 23, 05, 05] +161D; [75 F5 23, 05, 05] -161E; [75 C9 2A, 05, 05] +161E; [75 F5 2A, 05, 05] -161F; [75 C9 31, 05, 05] +161F; [75 F5 31, 05, 05] -1620; [75 C9 38, 05, 05] +1620; [75 F5 38, 05, 05] -1621; [75 C9 3F, 05, 05] +1621; [75 F5 3F, 05, 05] -1622; [75 C9 46, 05, 05] +1622; [75 F5 46, 05, 05] -1623; [75 C9 4D, 05, 05] +1623; [75 F5 4D, 05, 05] -1624; [75 C9 54, 05, 05] +1624; [75 F5 54, 05, 05] -1625; [75 C9 5B, 05, 05] +1625; [75 F5 5B, 05, 05] -1626; [75 C9 62, 05, 05] +1626; [75 F5 62, 05, 05] -1627; [75 C9 69, 05, 05] +1627; [75 F5 69, 05, 05] -1628; [75 C9 70, 05, 05] +1628; [75 F5 70, 05, 05] -1629; [75 C9 77, 05, 05] +1629; [75 F5 77, 05, 05] -162A; [75 C9 7E, 05, 05] +162A; [75 F5 7E, 05, 05] -162B; [75 C9 85, 05, 05] +162B; [75 F5 85, 05, 05] -162C; [75 C9 8C, 05, 05] +162C; [75 F5 8C, 05, 05] -162D; [75 C9 93, 05, 05] +162D; [75 F5 93, 05, 05] -162E; [75 C9 9A, 05, 05] +162E; [75 F5 9A, 05, 05] -162F; [75 C9 A1, 05, 05] +162F; [75 F5 A1, 05, 05] -1630; [75 C9 A8, 05, 05] +1630; [75 F5 A8, 05, 05] -1631; [75 C9 AF, 05, 05] +1631; [75 F5 AF, 05, 05] -1632; [75 C9 B6, 05, 05] +1632; [75 F5 B6, 05, 05] -1633; [75 C9 BD, 05, 05] +1633; [75 F5 BD, 05, 05] -1634; [75 C9 C4, 05, 05] +1634; [75 F5 C4, 05, 05] -1635; [75 C9 CB, 05, 05] +1635; [75 F5 CB, 05, 05] -1636; [75 C9 D2, 05, 05] +1636; [75 F5 D2, 05, 05] -1637; [75 C9 D9, 05, 05] +1637; [75 F5 D9, 05, 05] -1638; [75 C9 E0, 05, 05] +1638; [75 F5 E0, 05, 05] -1639; [75 C9 E7, 05, 05] +1639; [75 F5 E7, 05, 05] -163A; [75 C9 EE, 05, 05] +163A; [75 F5 EE, 05, 05] -163B; [75 C9 F5, 05, 05] +163B; [75 F5 F5, 05, 05] -163C; [75 C9 FC, 05, 05] +163C; [75 F5 FC, 05, 05] -163D; [75 CA 05, 05, 05] +163D; [75 F6 05, 05, 05] -163E; [75 CA 0C, 05, 05] +163E; [75 F6 0C, 05, 05] -163F; [75 CA 13, 05, 05] +163F; [75 F6 13, 05, 05] -1640; [75 CA 1A, 05, 05] +1640; [75 F6 1A, 05, 05] -1641; [75 CA 21, 05, 05] +1641; [75 F6 21, 05, 05] -1642; [75 CA 28, 05, 05] +1642; [75 F6 28, 05, 05] -1643; [75 CA 2F, 05, 05] +1643; [75 F6 2F, 05, 05] -1644; [75 CA 36, 05, 05] +1644; [75 F6 36, 05, 05] -1645; [75 CA 3D, 05, 05] +1645; [75 F6 3D, 05, 05] -1646; [75 CA 44, 05, 05] +1646; [75 F6 44, 05, 05] -1647; [75 CA 4B, 05, 05] +1647; [75 F6 4B, 05, 05] -1648; [75 CA 52, 05, 05] +1648; [75 F6 52, 05, 05] -1649; [75 CA 59, 05, 05] +1649; [75 F6 59, 05, 05] -164A; [75 CA 60, 05, 05] +164A; [75 F6 60, 05, 05] -164B; [75 CA 67, 05, 05] +164B; [75 F6 67, 05, 05] -164C; [75 CA 6E, 05, 05] +164C; [75 F6 6E, 05, 05] -164D; [75 CA 75, 05, 05] +164D; [75 F6 75, 05, 05] -164E; [75 CA 7C, 05, 05] +164E; [75 F6 7C, 05, 05] -164F; [75 CA 83, 05, 05] +164F; [75 F6 83, 05, 05] -1650; [75 CA 8A, 05, 05] +1650; [75 F6 8A, 05, 05] -1651; [75 CA 91, 05, 05] +1651; [75 F6 91, 05, 05] -1652; [75 CA 98, 05, 05] +1652; [75 F6 98, 05, 05] -1653; [75 CA 9F, 05, 05] +1653; [75 F6 9F, 05, 05] -1654; [75 CA A6, 05, 05] +1654; [75 F6 A6, 05, 05] -1655; [75 CA AD, 05, 05] +1655; [75 F6 AD, 05, 05] -1656; [75 CA B4, 05, 05] +1656; [75 F6 B4, 05, 05] -1657; [75 CA BB, 05, 05] +1657; [75 F6 BB, 05, 05] -1658; [75 CA C2, 05, 05] +1658; [75 F6 C2, 05, 05] -1659; [75 CA C9, 05, 05] +1659; [75 F6 C9, 05, 05] -165A; [75 CA D0, 05, 05] +165A; [75 F6 D0, 05, 05] -165B; [75 CA D7, 05, 05] +165B; [75 F6 D7, 05, 05] -165C; [75 CA DE, 05, 05] +165C; [75 F6 DE, 05, 05] -165D; [75 CA E5, 05, 05] +165D; [75 F6 E5, 05, 05] -165E; [75 CA EC, 05, 05] +165E; [75 F6 EC, 05, 05] -165F; [75 CA F3, 05, 05] +165F; [75 F6 F3, 05, 05] -1660; [75 CA FA, 05, 05] +1660; [75 F6 FA, 05, 05] -1661; [75 CB 03, 05, 05] +1661; [75 F7 03, 05, 05] -1662; [75 CB 0A, 05, 05] +1662; [75 F7 0A, 05, 05] -1663; [75 CB 11, 05, 05] +1663; [75 F7 11, 05, 05] -1664; [75 CB 18, 05, 05] +1664; [75 F7 18, 05, 05] -1665; [75 CB 1F, 05, 05] +1665; [75 F7 1F, 05, 05] -1666; [75 CB 26, 05, 05] +1666; [75 F7 26, 05, 05] -1667; [75 CB 2D, 05, 05] +1667; [75 F7 2D, 05, 05] -1668; [75 CB 34, 05, 05] +1668; [75 F7 34, 05, 05] -1669; [75 CB 3B, 05, 05] +1669; [75 F7 3B, 05, 05] -166A; [75 CB 42, 05, 05] +166A; [75 F7 42, 05, 05] -166B; [75 CB 49, 05, 05] +166B; [75 F7 49, 05, 05] -166C; [75 CB 50, 05, 05] +166C; [75 F7 50, 05, 05] -1677; [75 CB 57, 05, 05] +1677; [75 F7 57, 05, 05] -1678; [75 CB 5E, 05, 05] +1678; [75 F7 5E, 05, 05] -1679; [75 CB 65, 05, 05] +1679; [75 F7 65, 05, 05] -167A; [75 CB 6C, 05, 05] +167A; [75 F7 6C, 05, 05] -167B; [75 CB 73, 05, 05] +167B; [75 F7 73, 05, 05] -167C; [75 CB 7A, 05, 05] +167C; [75 F7 7A, 05, 05] -167D; [75 CB 81, 05, 05] +167D; [75 F7 81, 05, 05] -167E; [75 CB 88, 05, 05] +167E; [75 F7 88, 05, 05] -167F; [75 CB 8F, 05, 05] +167F; [75 F7 8F, 05, 05] -18B0; [75 CB 96, 05, 05] +18B0; [75 F7 96, 05, 05] -18B1; [75 CB 9D, 05, 05] +18B1; [75 F7 9D, 05, 05] -18B2; [75 CB A4, 05, 05] +18B2; [75 F7 A4, 05, 05] -18B3; [75 CB AB, 05, 05] +18B3; [75 F7 AB, 05, 05] -18B4; [75 CB B2, 05, 05] +18B4; [75 F7 B2, 05, 05] -18B5; [75 CB B9, 05, 05] +18B5; [75 F7 B9, 05, 05] -18B6; [75 CB C0, 05, 05] +18B6; [75 F7 C0, 05, 05] -18B7; [75 CB C7, 05, 05] +18B7; [75 F7 C7, 05, 05] -18B8; [75 CB CE, 05, 05] +18B8; [75 F7 CE, 05, 05] -18B9; [75 CB D5, 05, 05] +18B9; [75 F7 D5, 05, 05] -18BA; [75 CB DC, 05, 05] +18BA; [75 F7 DC, 05, 05] -18BB; [75 CB E3, 05, 05] +18BB; [75 F7 E3, 05, 05] -18BC; [75 CB EA, 05, 05] +18BC; [75 F7 EA, 05, 05] -18BD; [75 CB F1, 05, 05] +18BD; [75 F7 F1, 05, 05] -18BE; [75 CB F8, 05, 05] +18BE; [75 F7 F8, 05, 05] -18BF; [75 CB FF, 05, 05] +18BF; [75 F7 FF, 05, 05] -18C0; [75 CC 08, 05, 05] +18C0; [75 F8 08, 05, 05] -18C1; [75 CC 0F, 05, 05] +18C1; [75 F8 0F, 05, 05] -18C2; [75 CC 16, 05, 05] +18C2; [75 F8 16, 05, 05] -18C3; [75 CC 1D, 05, 05] +18C3; [75 F8 1D, 05, 05] -18C4; [75 CC 24, 05, 05] +18C4; [75 F8 24, 05, 05] -18C5; [75 CC 2B, 05, 05] +18C5; [75 F8 2B, 05, 05] -18C6; [75 CC 32, 05, 05] +18C6; [75 F8 32, 05, 05] -18C7; [75 CC 39, 05, 05] +18C7; [75 F8 39, 05, 05] -18C8; [75 CC 40, 05, 05] +18C8; [75 F8 40, 05, 05] -18C9; [75 CC 47, 05, 05] +18C9; [75 F8 47, 05, 05] -18CA; [75 CC 4E, 05, 05] +18CA; [75 F8 4E, 05, 05] -18CB; [75 CC 55, 05, 05] +18CB; [75 F8 55, 05, 05] -18CC; [75 CC 5C, 05, 05] +18CC; [75 F8 5C, 05, 05] -18CD; [75 CC 63, 05, 05] +18CD; [75 F8 63, 05, 05] -18CE; [75 CC 6A, 05, 05] +18CE; [75 F8 6A, 05, 05] -18CF; [75 CC 71, 05, 05] +18CF; [75 F8 71, 05, 05] -18D0; [75 CC 78, 05, 05] +18D0; [75 F8 78, 05, 05] -18D1; [75 CC 7F, 05, 05] +18D1; [75 F8 7F, 05, 05] -18D2; [75 CC 86, 05, 05] +18D2; [75 F8 86, 05, 05] -18D3; [75 CC 8D, 05, 05] +18D3; [75 F8 8D, 05, 05] -18D4; [75 CC 94, 05, 05] +18D4; [75 F8 94, 05, 05] -18D5; [75 CC 9B, 05, 05] +18D5; [75 F8 9B, 05, 05] -18D6; [75 CC A2, 05, 05] +18D6; [75 F8 A2, 05, 05] -18D7; [75 CC A9, 05, 05] +18D7; [75 F8 A9, 05, 05] -18D8; [75 CC B0, 05, 05] +18D8; [75 F8 B0, 05, 05] -18D9; [75 CC B7, 05, 05] +18D9; [75 F8 B7, 05, 05] -18DA; [75 CC BE, 05, 05] +18DA; [75 F8 BE, 05, 05] -18DB; [75 CC C5, 05, 05] +18DB; [75 F8 C5, 05, 05] -18DC; [75 CC CC, 05, 05] +18DC; [75 F8 CC, 05, 05] -18DD; [75 CC D3, 05, 05] +18DD; [75 F8 D3, 05, 05] -18DE; [75 CC DA, 05, 05] +18DE; [75 F8 DA, 05, 05] -18DF; [75 CC E1, 05, 05] +18DF; [75 F8 E1, 05, 05] -18E0; [75 CC E8, 05, 05] +18E0; [75 F8 E8, 05, 05] -18E1; [75 CC EF, 05, 05] +18E1; [75 F8 EF, 05, 05] -18E2; [75 CC F6, 05, 05] +18E2; [75 F8 F6, 05, 05] -18E3; [75 CC FD, 05, 05] +18E3; [75 F8 FD, 05, 05] -18E4; [75 CD 06, 05, 05] +18E4; [75 F9 06, 05, 05] -18E5; [75 CD 0D, 05, 05] +18E5; [75 F9 0D, 05, 05] -18E6; [75 CD 14, 05, 05] +18E6; [75 F9 14, 05, 05] -18E7; [75 CD 1B, 05, 05] +18E7; [75 F9 1B, 05, 05] -18E8; [75 CD 22, 05, 05] +18E8; [75 F9 22, 05, 05] -18E9; [75 CD 29, 05, 05] +18E9; [75 F9 29, 05, 05] -18EA; [75 CD 30, 05, 05] +18EA; [75 F9 30, 05, 05] -18EB; [75 CD 37, 05, 05] +18EB; [75 F9 37, 05, 05] -18EC; [75 CD 3E, 05, 05] +18EC; [75 F9 3E, 05, 05] -18ED; [75 CD 45, 05, 05] +18ED; [75 F9 45, 05, 05] -18EE; [75 CD 4C, 05, 05] +18EE; [75 F9 4C, 05, 05] -18EF; [75 CD 53, 05, 05] +18EF; [75 F9 53, 05, 05] -18F0; [75 CD 5A, 05, 05] +18F0; [75 F9 5A, 05, 05] -18F1; [75 CD 61, 05, 05] +18F1; [75 F9 61, 05, 05] -18F2; [75 CD 68, 05, 05] +18F2; [75 F9 68, 05, 05] -18F3; [75 CD 6F, 05, 05] +18F3; [75 F9 6F, 05, 05] -18F4; [75 CD 76, 05, 05] +18F4; [75 F9 76, 05, 05] -18F5; [75 CD 7D, 05, 05] +18F5; [75 F9 7D, 05, 05] -FDD1 168F; [75 CE 02, 05, 05] # OGHAM first primary (compressible) +FDD1 168F; [75 FA 02, 05, 05] # OGHAM first primary (compressible) -1681; [75 CE 09, 05, 05] +1681; [75 FA 09, 05, 05] -1682; [75 CE 10, 05, 05] +1682; [75 FA 10, 05, 05] -1683; [75 CE 17, 05, 05] +1683; [75 FA 17, 05, 05] -1684; [75 CE 1E, 05, 05] +1684; [75 FA 1E, 05, 05] -1685; [75 CE 25, 05, 05] +1685; [75 FA 25, 05, 05] -1686; [75 CE 2C, 05, 05] +1686; [75 FA 2C, 05, 05] -1687; [75 CE 33, 05, 05] +1687; [75 FA 33, 05, 05] -1688; [75 CE 3A, 05, 05] +1688; [75 FA 3A, 05, 05] -1689; [75 CE 41, 05, 05] +1689; [75 FA 41, 05, 05] -168A; [75 CE 48, 05, 05] +168A; [75 FA 48, 05, 05] -168B; [75 CE 4F, 05, 05] +168B; [75 FA 4F, 05, 05] -168C; [75 CE 56, 05, 05] +168C; [75 FA 56, 05, 05] -168D; [75 CE 5D, 05, 05] +168D; [75 FA 5D, 05, 05] -168E; [75 CE 64, 05, 05] +168E; [75 FA 64, 05, 05] -168F; [75 CE 6B, 05, 05] +168F; [75 FA 6B, 05, 05] -1690; [75 CE 72, 05, 05] +1690; [75 FA 72, 05, 05] -1691; [75 CE 79, 05, 05] +1691; [75 FA 79, 05, 05] -1692; [75 CE 80, 05, 05] +1692; [75 FA 80, 05, 05] -1693; [75 CE 87, 05, 05] +1693; [75 FA 87, 05, 05] -1694; [75 CE 8E, 05, 05] +1694; [75 FA 8E, 05, 05] -1695; [75 CE 95, 05, 05] +1695; [75 FA 95, 05, 05] -1696; [75 CE 9C, 05, 05] +1696; [75 FA 9C, 05, 05] -1697; [75 CE A3, 05, 05] +1697; [75 FA A3, 05, 05] -1698; [75 CE AA, 05, 05] +1698; [75 FA AA, 05, 05] -1699; [75 CE B1, 05, 05] +1699; [75 FA B1, 05, 05] -169A; [75 CE B8, 05, 05] +169A; [75 FA B8, 05, 05] FDD1 16A0; [76 04 02, 05, 05] # RUNIC first primary starts new lead byte (compressible) @@ -37901,10 +38523,10 @@ FF67; [79 06, 05, 17] 30A2; [79 06, 05, 9E] FF71; [79 06, 05, A5] 32D0; [79 06, 05, 2C] -3303; [79 06, 05, 33][0D 60, 05, 2E][79 5A, 05, 30] -3300; [79 06, 05, 33][79 3A, 05, 30][, B0, 2E][0D 60, 05, 2E][79 2E, 05, 33] -3301; [79 06, 05, 33][79 5A, 05, 30][79 3E, 05, 30][79 06, 05, 33] -3302; [79 06, 05, 33][79 68, 05, 2C][79 40, 05, 30][, B0, 2E][79 06, 05, 33] +3303; [79 06, 05, 33][0D 62, 05, 2E][79 58, 05, 30] +3300; [79 06, 05, 33][79 3A, 05, 30][, B0, 2E][0D 62, 05, 2E][79 2E, 05, 33] +3301; [79 06, 05, 33][79 58, 05, 30][79 3E, 05, 30][79 06, 05, 33] +3302; [79 06, 05, 33][79 66, 05, 2C][79 40, 05, 30][, B0, 2E][79 06, 05, 33] 3043; [79 08, 05, 03] 3044; [79 08, 05, 85] @@ -37913,8 +38535,8 @@ FF68; [79 08, 05, 17] 30A4; [79 08, 05, 9E] FF72; [79 08, 05, A5] 32D1; [79 08, 05, 2C] -3304; [79 08, 05, 33][79 32, 05, 31][79 68, 05, 2C][79 16, 05, 30][, AE, 2E] -3305; [79 08, 05, 33][79 68, 05, 2C][79 28, 05, 31] +3304; [79 08, 05, 33][79 32, 05, 31][79 66, 05, 2C][79 16, 05, 30][, AE, 2E] +3305; [79 08, 05, 33][79 66, 05, 2C][79 28, 05, 31] 3045; [79 0A, 05, 03] 3046; [79 0A, 05, 85] @@ -37925,7 +38547,7 @@ FF73; [79 0A, 05, A5] 32D2; [79 0A, 05, 2C] 3094; [79 0A, 05, 85][, AE, 05] 30F4; [79 0A, 05, 9E][, AE, 05] -3306; [79 0A, 05, 33][79 10, 05, 33][79 68, 05, 2C] +3306; [79 0A, 05, 33][79 10, 05, 33][79 66, 05, 2C] 1B000; [79 0C, 05, 85] @@ -37936,8 +38558,8 @@ FF6A; [79 0E, 05, 17] 30A8; [79 0E, 05, 9E] FF74; [79 0E, 05, A5] 32D3; [79 0E, 05, 2C] -3308; [79 0E, 05, 33][0D 60, 05, 2E][79 12, 05, 30][0D 60, 05, 2E] -3307; [79 0E, 05, 33][79 20, 05, 30][79 16, 05, 30][0D 60, 05, 2E][79 2E, 05, 33][, AE, 2E] +3308; [79 0E, 05, 33][0D 62, 05, 2E][79 12, 05, 30][0D 62, 05, 2E] +3307; [79 0E, 05, 33][79 20, 05, 30][79 16, 05, 30][0D 62, 05, 2E][79 2E, 05, 33][, AE, 2E] 3049; [79 10, 05, 03] 304A; [79 10, 05, 85] @@ -37946,8 +38568,8 @@ FF6B; [79 10, 05, 17] 30AA; [79 10, 05, 9E] FF75; [79 10, 05, A5] 32D4; [79 10, 05, 2C] -330A; [79 10, 05, 33][0D 60, 05, 2E][79 48, 05, 30] -3309; [79 10, 05, 33][79 68, 05, 2C][79 20, 05, 30] +330A; [79 10, 05, 33][0D 62, 05, 2E][79 48, 05, 30] +3309; [79 10, 05, 33][79 66, 05, 2C][79 20, 05, 30] 3095; [79 12, 05, 03] 304B; [79 12, 05, 85] @@ -37957,11 +38579,11 @@ FF76; [79 12, 05, A0] 32D5; [79 12, 05, 28] 304C; [79 12, 05, 85][, AE, 05] 30AC; [79 12, 05, 98][, AE, 05] -330B; [79 12, 05, 30][79 08, 05, 33][79 58, 05, 33] -330C; [79 12, 05, 30][79 56, 05, 30][79 2A, 05, 33][79 2E, 05, 33] -330D; [79 12, 05, 30][79 5E, 05, 30][79 58, 05, 33][0D 60, 05, 2E] -330E; [79 12, 05, 30][, AE, 2E][79 5E, 05, 30][79 68, 05, 2C] -330F; [79 12, 05, 30][, AE, 2E][79 68, 05, 2C][79 44, 05, 31] +330B; [79 12, 05, 30][79 08, 05, 33][79 56, 05, 33] +330C; [79 12, 05, 30][79 54, 05, 30][79 2A, 05, 33][79 2E, 05, 33] +330D; [79 12, 05, 30][79 5C, 05, 30][79 56, 05, 33][0D 62, 05, 2E] +330E; [79 12, 05, 30][, AE, 2E][79 5C, 05, 30][79 66, 05, 2C] +330F; [79 12, 05, 30][, AE, 2E][79 66, 05, 2C][79 44, 05, 31] 304D; [79 14, 05, 85] 30AD; [79 14, 05, 90] @@ -37970,13 +38592,13 @@ FF77; [79 14, 05, 9B] 304E; [79 14, 05, 85][, AE, 05] 30AE; [79 14, 05, 90][, AE, 05] 3310; [79 14, 05, 31][, AE, 2E][79 12, 05, 30][, AE, 2E] -3311; [79 14, 05, 31][, AE, 2E][79 32, 05, 31][0D 60, 05, 2E] -3312; [79 14, 05, 31][79 50, 05, 33][79 58, 05, 33][0D 60, 05, 2E] -3313; [79 14, 05, 31][, AE, 2E][79 5A, 05, 30][79 26, 05, 31][, AE, 2E][0D 60, 05, 2E] -3314; [79 14, 05, 31][79 5E, 05, 30] -3315; [79 14, 05, 31][79 5E, 05, 30][79 16, 05, 30][, AE, 2E][79 56, 05, 30][79 48, 05, 30] -3316; [79 14, 05, 31][79 5E, 05, 30][79 4A, 05, 31][0D 60, 05, 2E][79 2E, 05, 33][79 5A, 05, 30] -3317; [79 14, 05, 31][79 5E, 05, 30][79 60, 05, 30][79 2A, 05, 33][79 2E, 05, 33] +3311; [79 14, 05, 31][, AE, 2E][79 32, 05, 31][0D 62, 05, 2E] +3312; [79 14, 05, 31][79 50, 05, 33][79 56, 05, 33][0D 62, 05, 2E] +3313; [79 14, 05, 31][, AE, 2E][79 58, 05, 30][79 26, 05, 31][, AE, 2E][0D 62, 05, 2E] +3314; [79 14, 05, 31][79 5C, 05, 30] +3315; [79 14, 05, 31][79 5C, 05, 30][79 16, 05, 30][, AE, 2E][79 54, 05, 30][79 48, 05, 30] +3316; [79 14, 05, 31][79 5C, 05, 30][79 4A, 05, 31][0D 62, 05, 2E][79 2E, 05, 33][79 58, 05, 30] +3317; [79 14, 05, 31][79 5C, 05, 30][79 5E, 05, 30][79 2A, 05, 33][79 2E, 05, 33] 304F; [79 16, 05, 85] 31F0; [79 16, 05, 10] @@ -37985,10 +38607,10 @@ FF78; [79 16, 05, A0] 32D7; [79 16, 05, 28] 3050; [79 16, 05, 85][, AE, 05] 30B0; [79 16, 05, 98][, AE, 05] -3318; [79 16, 05, 30][, AE, 2E][79 56, 05, 30][79 48, 05, 30] -3319; [79 16, 05, 30][, AE, 2E][79 56, 05, 30][79 48, 05, 30][79 2E, 05, 33][79 68, 05, 2C] -331A; [79 16, 05, 30][79 5A, 05, 30][79 22, 05, 31][, AE, 2E][79 08, 05, 33][79 5E, 05, 30] -331B; [79 16, 05, 30][79 5E, 05, 30][0D 60, 05, 2E][79 36, 05, 31] +3318; [79 16, 05, 30][, AE, 2E][79 54, 05, 30][79 48, 05, 30] +3319; [79 16, 05, 30][, AE, 2E][79 54, 05, 30][79 48, 05, 30][79 2E, 05, 33][79 66, 05, 2C] +331A; [79 16, 05, 30][79 58, 05, 30][79 22, 05, 31][, AE, 2E][79 08, 05, 33][79 5C, 05, 30] +331B; [79 16, 05, 30][79 5C, 05, 30][0D 62, 05, 2E][79 36, 05, 31] 3096; [79 18, 05, 03] 3051; [79 18, 05, 85] @@ -37998,7 +38620,7 @@ FF79; [79 18, 05, A0] 32D8; [79 18, 05, 28] 3052; [79 18, 05, 85][, AE, 05] 30B2; [79 18, 05, 98][, AE, 05] -331C; [79 18, 05, 30][0D 60, 05, 2E][79 20, 05, 30] +331C; [79 18, 05, 30][0D 62, 05, 2E][79 20, 05, 30] 3053; [79 1A, 05, 85] 30B3; [79 1A, 05, 90] @@ -38006,10 +38628,10 @@ FF7A; [79 1A, 05, 98] 32D9; [79 1A, 05, 20] 3054; [79 1A, 05, 85][, AE, 05] 30B4; [79 1A, 05, 90][, AE, 05] -331E; [79 1A, 05, 30][0D 60, 05, 2E][79 42, 05, 30][, B0, 2E] +331E; [79 1A, 05, 30][0D 62, 05, 2E][79 42, 05, 30][, B0, 2E] 1F201; [79 1A, 05, 30][79 1A, 05, 30] 30FF; [79 1A, 05, 28][79 2E, 05, 2C] -331D; [79 1A, 05, 30][79 5A, 05, 30][79 30, 05, 31] +331D; [79 1A, 05, 30][79 58, 05, 30][79 30, 05, 31] 3055; [79 1C, 05, 85] 30B5; [79 1C, 05, 90] @@ -38018,8 +38640,8 @@ FF7B; [79 1C, 05, 9B] 1F202; [79 1C, 05, 31] 3056; [79 1C, 05, 85][, AE, 05] 30B6; [79 1C, 05, 90][, AE, 05] -331F; [79 1C, 05, 31][79 08, 05, 33][79 16, 05, 30][79 5A, 05, 30] -3320; [79 1C, 05, 31][79 68, 05, 2C][79 28, 05, 31][0D 60, 05, 2E][79 48, 05, 30] +331F; [79 1C, 05, 31][79 08, 05, 33][79 16, 05, 30][79 58, 05, 30] +3320; [79 1C, 05, 31][79 66, 05, 2C][79 28, 05, 31][0D 62, 05, 2E][79 48, 05, 30] 3057; [79 1E, 05, 85] 31F1; [79 1E, 05, 10] @@ -38029,7 +38651,7 @@ FF7C; [79 1E, 05, A0] 3058; [79 1E, 05, 85][, AE, 05] 30B8; [79 1E, 05, 98][, AE, 05] 3006; [79 1E, 05, 03][79 4A, 05, 03] -3321; [79 1E, 05, 30][79 58, 05, 33][79 68, 05, 2C][79 16, 05, 30][, AE, 2E] +3321; [79 1E, 05, 30][79 56, 05, 33][79 66, 05, 2C][79 16, 05, 30][, AE, 2E] 3059; [79 20, 05, 85] 31F2; [79 20, 05, 10] @@ -38045,8 +38667,8 @@ FF7E; [79 22, 05, 9B] 32DD; [79 22, 05, 26] 305C; [79 22, 05, 85][, AE, 05] 30BC; [79 22, 05, 90][, AE, 05] -3322; [79 22, 05, 31][79 68, 05, 2C][79 28, 05, 31] -3323; [79 22, 05, 31][79 68, 05, 2C][79 2E, 05, 33] +3322; [79 22, 05, 31][79 66, 05, 2C][79 28, 05, 31] +3323; [79 22, 05, 31][79 66, 05, 2C][79 2E, 05, 33] 305D; [79 24, 05, 85] 30BD; [79 24, 05, 90] @@ -38061,7 +38683,7 @@ FF80; [79 26, 05, 9B] 32DF; [79 26, 05, 26] 3060; [79 26, 05, 85][, AE, 05] 30C0; [79 26, 05, 90][, AE, 05] -3324; [79 26, 05, 31][, AE, 2E][0D 60, 05, 2E][79 20, 05, 30] +3324; [79 26, 05, 31][, AE, 2E][0D 62, 05, 2E][79 20, 05, 30] 3061; [79 28, 05, 85] 30C1; [79 28, 05, 90] @@ -38096,8 +38718,8 @@ FF84; [79 2E, 05, 9E] 32E3; [79 2E, 05, 25] 3069; [79 2E, 05, 85][, AE, 05] 30C9; [79 2E, 05, 97][, AE, 05] -3326; [79 2E, 05, 33][, AE, 2E][79 5A, 05, 30] -3327; [79 2E, 05, 33][79 68, 05, 2C] +3326; [79 2E, 05, 33][, AE, 2E][79 58, 05, 30] +3327; [79 2E, 05, 33][79 66, 05, 2C] 306A; [79 30, 05, 85] 30CA; [79 30, 05, 90] @@ -38136,9 +38758,9 @@ FF8A; [79 3A, 05, A0] 30D0; [79 3A, 05, 98][, AE, 05] 3071; [79 3A, 05, 85][, B0, 05] 30D1; [79 3A, 05, 98][, B0, 05] -332B; [79 3A, 05, 30][, B0, 2E][0D 60, 05, 2E][79 22, 05, 31][79 68, 05, 2C][79 2E, 05, 33] -332C; [79 3A, 05, 30][, B0, 2E][0D 60, 05, 2E][79 2A, 05, 33] -332D; [79 3A, 05, 30][, AE, 2E][0D 60, 05, 2E][79 5C, 05, 30][79 5A, 05, 30] +332B; [79 3A, 05, 30][, B0, 2E][0D 62, 05, 2E][79 22, 05, 31][79 66, 05, 2C][79 2E, 05, 33] +332C; [79 3A, 05, 30][, B0, 2E][0D 62, 05, 2E][79 2A, 05, 33] +332D; [79 3A, 05, 30][, AE, 2E][0D 62, 05, 2E][79 5A, 05, 30][79 58, 05, 30] 332A; [79 3A, 05, 30][79 08, 05, 33][79 2A, 05, 33] 3072; [79 3C, 05, 85] @@ -38150,10 +38772,10 @@ FF8B; [79 3C, 05, A0] 30D3; [79 3C, 05, 98][, AE, 05] 3074; [79 3C, 05, 85][, B0, 05] 30D4; [79 3C, 05, 98][, B0, 05] -332E; [79 3C, 05, 30][, B0, 2E][79 06, 05, 33][79 20, 05, 30][79 2E, 05, 33][79 5A, 05, 30] -332F; [79 3C, 05, 30][, B0, 2E][79 16, 05, 30][79 5A, 05, 30] +332E; [79 3C, 05, 30][, B0, 2E][79 06, 05, 33][79 20, 05, 30][79 2E, 05, 33][79 58, 05, 30] +332F; [79 3C, 05, 30][, B0, 2E][79 16, 05, 30][79 58, 05, 30] 3330; [79 3C, 05, 30][, B0, 2E][79 1A, 05, 30] -3331; [79 3C, 05, 30][, AE, 2E][79 5A, 05, 30] +3331; [79 3C, 05, 30][, AE, 2E][79 58, 05, 30] 3075; [79 3E, 05, 85] 31F7; [79 3E, 05, 10] @@ -38164,10 +38786,10 @@ FF8C; [79 3E, 05, A0] 30D6; [79 3E, 05, 98][, AE, 05] 3077; [79 3E, 05, 85][, B0, 05] 30D7; [79 3E, 05, 98][, B0, 05] -3332; [79 3E, 05, 30][79 06, 05, 33][79 56, 05, 30][79 2A, 05, 33][79 2E, 05, 33][, AE, 2E] -3333; [79 3E, 05, 30][79 08, 05, 33][0D 60, 05, 2E][79 2E, 05, 33] -3334; [79 3E, 05, 30][, AE, 2E][79 2A, 05, 33][79 1E, 05, 30][79 0E, 05, 33][79 5A, 05, 30] -3335; [79 3E, 05, 30][79 56, 05, 30][79 68, 05, 2C] +3332; [79 3E, 05, 30][79 06, 05, 33][79 54, 05, 30][79 2A, 05, 33][79 2E, 05, 33][, AE, 2E] +3333; [79 3E, 05, 30][79 08, 05, 33][0D 62, 05, 2E][79 2E, 05, 33] +3334; [79 3E, 05, 30][, AE, 2E][79 2A, 05, 33][79 1E, 05, 30][79 0E, 05, 33][79 58, 05, 30] +3335; [79 3E, 05, 30][79 54, 05, 30][79 66, 05, 2C] 3078; [79 40, 05, 85] 31F8; [79 40, 05, 10] @@ -38178,13 +38800,13 @@ FF8D; [79 40, 05, A0] 30D9; [79 40, 05, 98][, AE, 05] 307A; [79 40, 05, 85][, B0, 05] 30DA; [79 40, 05, 98][, B0, 05] -333B; [79 40, 05, 30][, B0, 2E][0D 60, 05, 2E][79 1E, 05, 30][, AE, 2E] -333C; [79 40, 05, 30][, AE, 2E][0D 60, 05, 2E][79 26, 05, 31] -3336; [79 40, 05, 30][79 16, 05, 30][79 26, 05, 31][0D 60, 05, 2E][79 5A, 05, 30] +333B; [79 40, 05, 30][, B0, 2E][0D 62, 05, 2E][79 1E, 05, 30][, AE, 2E] +333C; [79 40, 05, 30][, AE, 2E][0D 62, 05, 2E][79 26, 05, 31] +3336; [79 40, 05, 30][79 16, 05, 30][79 26, 05, 31][0D 62, 05, 2E][79 58, 05, 30] 3337; [79 40, 05, 30][, B0, 2E][79 24, 05, 31] 3338; [79 40, 05, 30][, B0, 2E][79 32, 05, 31][79 3C, 05, 30] -3339; [79 40, 05, 30][79 5A, 05, 30][79 2A, 05, 33] -333A; [79 40, 05, 30][, B0, 2E][79 68, 05, 2C][79 20, 05, 30] +3339; [79 40, 05, 30][79 58, 05, 30][79 2A, 05, 33] +333A; [79 40, 05, 30][, B0, 2E][79 66, 05, 2C][79 20, 05, 30] 307B; [79 42, 05, 85] 31F9; [79 42, 05, 10] @@ -38195,32 +38817,32 @@ FF8E; [79 42, 05, A0] 30DC; [79 42, 05, 98][, AE, 05] 307D; [79 42, 05, 85][, B0, 05] 30DD; [79 42, 05, 98][, B0, 05] -3341; [79 42, 05, 30][0D 60, 05, 2E][79 5A, 05, 30] -3342; [79 42, 05, 30][0D 60, 05, 2E][79 68, 05, 2C] -333D; [79 42, 05, 30][, B0, 2E][79 08, 05, 33][79 68, 05, 2C][79 2E, 05, 33] +3341; [79 42, 05, 30][0D 62, 05, 2E][79 58, 05, 30] +3342; [79 42, 05, 30][0D 62, 05, 2E][79 66, 05, 2C] +333D; [79 42, 05, 30][, B0, 2E][79 08, 05, 33][79 66, 05, 2C][79 2E, 05, 33] 1F200; [79 42, 05, 30][79 12, 05, 30] -333E; [79 42, 05, 30][, AE, 2E][79 5A, 05, 30][79 2E, 05, 33] -333F; [79 42, 05, 30][79 68, 05, 2C] -3340; [79 42, 05, 30][, B0, 2E][79 68, 05, 2C][79 2E, 05, 33][, AE, 2E] +333E; [79 42, 05, 30][, AE, 2E][79 58, 05, 30][79 2E, 05, 33] +333F; [79 42, 05, 30][79 66, 05, 2C] +3340; [79 42, 05, 30][, B0, 2E][79 66, 05, 2C][79 2E, 05, 33][, AE, 2E] 307E; [79 44, 05, 85] 30DE; [79 44, 05, 90] FF8F; [79 44, 05, 9B] 32EE; [79 44, 05, 26] -3343; [79 44, 05, 31][79 08, 05, 33][79 16, 05, 30][79 5E, 05, 30] -3344; [79 44, 05, 31][79 08, 05, 33][79 5A, 05, 30] +3343; [79 44, 05, 31][79 08, 05, 33][79 16, 05, 30][79 5C, 05, 30] +3344; [79 44, 05, 31][79 08, 05, 33][79 58, 05, 30] 303C; [79 44, 05, 03][79 20, 05, 03] 3345; [79 44, 05, 31][79 2A, 05, 33][79 3A, 05, 30] -3346; [79 44, 05, 31][79 5A, 05, 30][79 16, 05, 30] -3347; [79 44, 05, 31][79 68, 05, 2C][79 1E, 05, 30][79 54, 05, 34][79 68, 05, 2C] +3346; [79 44, 05, 31][79 58, 05, 30][79 16, 05, 30] +3347; [79 44, 05, 31][79 66, 05, 2C][79 1E, 05, 30][79 52, 05, 34][79 66, 05, 2C] 307F; [79 46, 05, 85] 30DF; [79 46, 05, 90] FF90; [79 46, 05, 9B] 32EF; [79 46, 05, 26] -3348; [79 46, 05, 31][79 16, 05, 30][79 5E, 05, 30][79 68, 05, 2C] -3349; [79 46, 05, 31][79 58, 05, 33] -334A; [79 46, 05, 31][79 58, 05, 33][79 3A, 05, 30][, AE, 2E][0D 60, 05, 2E][79 5A, 05, 30] +3348; [79 46, 05, 31][79 16, 05, 30][79 5C, 05, 30][79 66, 05, 2C] +3349; [79 46, 05, 31][79 56, 05, 33] +334A; [79 46, 05, 31][79 56, 05, 33][79 3A, 05, 30][, AE, 2E][0D 62, 05, 2E][79 58, 05, 30] 3080; [79 48, 05, 85] 31FA; [79 48, 05, 10] @@ -38232,9 +38854,9 @@ FF91; [79 48, 05, A0] 30E1; [79 4A, 05, 90] FF92; [79 4A, 05, 9B] 32F1; [79 4A, 05, 26] -334D; [79 4A, 05, 31][0D 60, 05, 2E][79 2E, 05, 33][79 5A, 05, 30] +334D; [79 4A, 05, 31][0D 62, 05, 2E][79 2E, 05, 33][79 58, 05, 30] 334B; [79 4A, 05, 31][79 12, 05, 30][, AE, 2E] -334C; [79 4A, 05, 31][79 12, 05, 30][, AE, 2E][79 2E, 05, 33][79 68, 05, 2C] +334C; [79 4A, 05, 31][79 12, 05, 30][, AE, 2E][79 2E, 05, 33][79 66, 05, 2C] 3082; [79 4C, 05, 85] 30E2; [79 4C, 05, 90] @@ -38248,8 +38870,8 @@ FF6C; [79 4E, 05, 17] 30E4; [79 4E, 05, 9E] FF94; [79 4E, 05, A5] 32F3; [79 4E, 05, 2C] -334E; [79 4E, 05, 33][0D 60, 05, 2E][79 2E, 05, 33][, AE, 2E] -334F; [79 4E, 05, 33][0D 60, 05, 2E][79 5A, 05, 30] +334E; [79 4E, 05, 33][0D 62, 05, 2E][79 2E, 05, 33][, AE, 2E] +334F; [79 4E, 05, 33][0D 62, 05, 2E][79 58, 05, 30] 3085; [79 50, 05, 03] 3086; [79 50, 05, 85] @@ -38258,83 +38880,653 @@ FF6D; [79 50, 05, 17] 30E6; [79 50, 05, 9E] FF95; [79 50, 05, A5] 32F4; [79 50, 05, 2C] -3350; [79 50, 05, 33][79 06, 05, 33][79 68, 05, 2C] - -1B001; [79 52, 05, 85] - -3087; [79 54, 05, 03] -3088; [79 54, 05, 85] -30E7; [79 54, 05, 10] -FF6E; [79 54, 05, 16] -30E8; [79 54, 05, 9C] -FF96; [79 54, 05, A2] -32F5; [79 54, 05, 28] -309F; [79 54, 05, 2E][79 58, 05, 2C] - -3089; [79 56, 05, 85] -31FB; [79 56, 05, 10] -30E9; [79 56, 05, 98] -FF97; [79 56, 05, A0] -32F6; [79 56, 05, 28] - -308A; [79 58, 05, 85] -31FC; [79 58, 05, 10] -30EA; [79 58, 05, 97] -FF98; [79 58, 05, 9E] -32F7; [79 58, 05, 25] -3351; [79 58, 05, 33][79 2A, 05, 33][79 2E, 05, 33][79 5A, 05, 30] -3352; [79 58, 05, 33][79 56, 05, 30] - -308B; [79 5A, 05, 85] -31FD; [79 5A, 05, 10] -30EB; [79 5A, 05, 98] -FF99; [79 5A, 05, A0] -32F8; [79 5A, 05, 28] -3354; [79 5A, 05, 30][0D 60, 05, 2E][79 3E, 05, 30][, AE, 2E][79 5A, 05, 30] -3353; [79 5A, 05, 30][79 3C, 05, 30][, B0, 2E][0D 60, 05, 2E] - -308C; [79 5C, 05, 85] -31FE; [79 5C, 05, 10] -30EC; [79 5C, 05, 98] -FF9A; [79 5C, 05, A0] -32F9; [79 5C, 05, 28] -3355; [79 5C, 05, 30][79 48, 05, 30] -3356; [79 5C, 05, 30][79 68, 05, 2C][79 2E, 05, 33][79 18, 05, 30][, AE, 2E][79 68, 05, 2C] - -308D; [79 5E, 05, 85] -31FF; [79 5E, 05, 10] -30ED; [79 5E, 05, 98] -FF9B; [79 5E, 05, A0] -32FA; [79 5E, 05, 28] - -308E; [79 60, 05, 03] -308F; [79 60, 05, 85] -30EE; [79 60, 05, 10] -30EF; [79 60, 05, 98] -FF9C; [79 60, 05, A0] -32FB; [79 60, 05, 28] -30F7; [79 60, 05, 98][, AE, 05] -3357; [79 60, 05, 30][79 2A, 05, 33][79 2E, 05, 33] - -3090; [79 62, 05, 85] -30F0; [79 62, 05, A0] -32FC; [79 62, 05, 2E] -30F8; [79 62, 05, A0][, AE, 05] - -3091; [79 64, 05, 85] -30F1; [79 64, 05, A0] -32FD; [79 64, 05, 2E] -30F9; [79 64, 05, A0][, AE, 05] - -3092; [79 66, 05, 85] -30F2; [79 66, 05, 90] -FF66; [79 66, 05, 9E] -32FE; [79 66, 05, 2C] -30FA; [79 66, 05, 90][, AE, 05] - -3093; [79 68, 05, 85] -30F3; [79 68, 05, 90] -FF9D; [79 68, 05, 9E] +3350; [79 50, 05, 33][79 06, 05, 33][79 66, 05, 2C] + +3087; [79 52, 05, 03] +3088; [79 52, 05, 85] +30E7; [79 52, 05, 10] +FF6E; [79 52, 05, 16] +30E8; [79 52, 05, 9C] +FF96; [79 52, 05, A2] +32F5; [79 52, 05, 28] +309F; [79 52, 05, 2E][79 56, 05, 2C] + +3089; [79 54, 05, 85] +31FB; [79 54, 05, 10] +30E9; [79 54, 05, 98] +FF97; [79 54, 05, A0] +32F6; [79 54, 05, 28] + +308A; [79 56, 05, 85] +31FC; [79 56, 05, 10] +30EA; [79 56, 05, 97] +FF98; [79 56, 05, 9E] +32F7; [79 56, 05, 25] +3351; [79 56, 05, 33][79 2A, 05, 33][79 2E, 05, 33][79 58, 05, 30] +3352; [79 56, 05, 33][79 54, 05, 30] + +308B; [79 58, 05, 85] +31FD; [79 58, 05, 10] +30EB; [79 58, 05, 98] +FF99; [79 58, 05, A0] +32F8; [79 58, 05, 28] +3354; [79 58, 05, 30][0D 62, 05, 2E][79 3E, 05, 30][, AE, 2E][79 58, 05, 30] +3353; [79 58, 05, 30][79 3C, 05, 30][, B0, 2E][0D 62, 05, 2E] + +308C; [79 5A, 05, 85] +31FE; [79 5A, 05, 10] +30EC; [79 5A, 05, 98] +FF9A; [79 5A, 05, A0] +32F9; [79 5A, 05, 28] +3355; [79 5A, 05, 30][79 48, 05, 30] +3356; [79 5A, 05, 30][79 66, 05, 2C][79 2E, 05, 33][79 18, 05, 30][, AE, 2E][79 66, 05, 2C] + +308D; [79 5C, 05, 85] +31FF; [79 5C, 05, 10] +30ED; [79 5C, 05, 98] +FF9B; [79 5C, 05, A0] +32FA; [79 5C, 05, 28] + +308E; [79 5E, 05, 03] +308F; [79 5E, 05, 85] +30EE; [79 5E, 05, 10] +30EF; [79 5E, 05, 98] +FF9C; [79 5E, 05, A0] +32FB; [79 5E, 05, 28] +30F7; [79 5E, 05, 98][, AE, 05] +3357; [79 5E, 05, 30][79 2A, 05, 33][79 2E, 05, 33] + +3090; [79 60, 05, 85] +30F0; [79 60, 05, A0] +32FC; [79 60, 05, 2E] +30F8; [79 60, 05, A0][, AE, 05] + +3091; [79 62, 05, 85] +30F1; [79 62, 05, A0] +32FD; [79 62, 05, 2E] +30F9; [79 62, 05, A0][, AE, 05] + +3092; [79 64, 05, 85] +30F2; [79 64, 05, 90] +FF66; [79 64, 05, 9E] +32FE; [79 64, 05, 2C] +30FA; [79 64, 05, 90][, AE, 05] + +3093; [79 66, 05, 85] +30F3; [79 66, 05, 90] +FF9D; [79 66, 05, 9E] + +1B002; [79 68 02, 05, 05] + +1B003; [79 68 09, 05, 05] + +1B004; [79 68 10, 05, 05] + +1B005; [79 68 17, 05, 05] + +1B006; [79 68 1E, 05, 05] + +1B007; [79 68 25, 05, 05] + +1B008; [79 68 2C, 05, 05] + +1B009; [79 68 33, 05, 05] + +1B00A; [79 68 3A, 05, 05] + +1B00B; [79 68 41, 05, 05] + +1B00C; [79 68 48, 05, 05] + +1B00D; [79 68 4F, 05, 05] + +1B00E; [79 68 56, 05, 05] + +1B001; [79 68 5D, 05, 05] + +1B00F; [79 68 64, 05, 05] + +1B010; [79 68 6B, 05, 05] + +1B011; [79 68 72, 05, 05] + +1B012; [79 68 79, 05, 05] + +1B013; [79 68 80, 05, 05] + +1B014; [79 68 87, 05, 05] + +1B015; [79 68 8E, 05, 05] + +1B016; [79 68 95, 05, 05] + +1B017; [79 68 9C, 05, 05] + +1B018; [79 68 A3, 05, 05] + +1B019; [79 68 AA, 05, 05] + +1B01A; [79 68 B1, 05, 05] + +1B01B; [79 68 B8, 05, 05] + +1B01C; [79 68 BF, 05, 05] + +1B01D; [79 68 C6, 05, 05] + +1B01E; [79 68 CD, 05, 05] + +1B01F; [79 68 D4, 05, 05] + +1B020; [79 68 DB, 05, 05] + +1B021; [79 68 E2, 05, 05] + +1B022; [79 68 E9, 05, 05] + +1B023; [79 68 F0, 05, 05] + +1B024; [79 68 F7, 05, 05] + +1B025; [79 68 FE, 05, 05] + +1B026; [79 69 07, 05, 05] + +1B027; [79 69 0E, 05, 05] + +1B028; [79 69 15, 05, 05] + +1B029; [79 69 1C, 05, 05] + +1B02A; [79 69 23, 05, 05] + +1B02B; [79 69 2A, 05, 05] + +1B02C; [79 69 31, 05, 05] + +1B02D; [79 69 38, 05, 05] + +1B02E; [79 69 3F, 05, 05] + +1B02F; [79 69 46, 05, 05] + +1B030; [79 69 4D, 05, 05] + +1B031; [79 69 54, 05, 05] + +1B032; [79 69 5B, 05, 05] + +1B033; [79 69 62, 05, 05] + +1B034; [79 69 69, 05, 05] + +1B035; [79 69 70, 05, 05] + +1B036; [79 69 77, 05, 05] + +1B037; [79 69 7E, 05, 05] + +1B038; [79 69 85, 05, 05] + +1B039; [79 69 8C, 05, 05] + +1B03A; [79 69 93, 05, 05] + +1B03B; [79 69 9A, 05, 05] + +1B03C; [79 69 A1, 05, 05] + +1B03D; [79 69 A8, 05, 05] + +1B03E; [79 69 AF, 05, 05] + +1B03F; [79 69 B6, 05, 05] + +1B040; [79 69 BD, 05, 05] + +1B041; [79 69 C4, 05, 05] + +1B042; [79 69 CB, 05, 05] + +1B043; [79 69 D2, 05, 05] + +1B044; [79 69 D9, 05, 05] + +1B045; [79 69 E0, 05, 05] + +1B046; [79 69 E7, 05, 05] + +1B047; [79 69 EE, 05, 05] + +1B048; [79 69 F5, 05, 05] + +1B049; [79 69 FC, 05, 05] + +1B04A; [79 6A 05, 05, 05] + +1B04B; [79 6A 0C, 05, 05] + +1B04C; [79 6A 13, 05, 05] + +1B04D; [79 6A 1A, 05, 05] + +1B04E; [79 6A 21, 05, 05] + +1B04F; [79 6A 28, 05, 05] + +1B050; [79 6A 2F, 05, 05] + +1B051; [79 6A 36, 05, 05] + +1B052; [79 6A 3D, 05, 05] + +1B053; [79 6A 44, 05, 05] + +1B054; [79 6A 4B, 05, 05] + +1B055; [79 6A 52, 05, 05] + +1B056; [79 6A 59, 05, 05] + +1B057; [79 6A 60, 05, 05] + +1B058; [79 6A 67, 05, 05] + +1B059; [79 6A 6E, 05, 05] + +1B05A; [79 6A 75, 05, 05] + +1B05B; [79 6A 7C, 05, 05] + +1B05C; [79 6A 83, 05, 05] + +1B05D; [79 6A 8A, 05, 05] + +1B05E; [79 6A 91, 05, 05] + +1B05F; [79 6A 98, 05, 05] + +1B060; [79 6A 9F, 05, 05] + +1B061; [79 6A A6, 05, 05] + +1B062; [79 6A AD, 05, 05] + +1B063; [79 6A B4, 05, 05] + +1B064; [79 6A BB, 05, 05] + +1B065; [79 6A C2, 05, 05] + +1B066; [79 6A C9, 05, 05] + +1B067; [79 6A D0, 05, 05] + +1B068; [79 6A D7, 05, 05] + +1B069; [79 6A DE, 05, 05] + +1B06A; [79 6A E5, 05, 05] + +1B06B; [79 6A EC, 05, 05] + +1B06C; [79 6A F3, 05, 05] + +1B06D; [79 6A FA, 05, 05] + +1B06E; [79 6B 03, 05, 05] + +1B06F; [79 6B 0A, 05, 05] + +1B070; [79 6B 11, 05, 05] + +1B071; [79 6B 18, 05, 05] + +1B072; [79 6B 1F, 05, 05] + +1B073; [79 6B 26, 05, 05] + +1B074; [79 6B 2D, 05, 05] + +1B075; [79 6B 34, 05, 05] + +1B076; [79 6B 3B, 05, 05] + +1B077; [79 6B 42, 05, 05] + +1B078; [79 6B 49, 05, 05] + +1B079; [79 6B 50, 05, 05] + +1B07A; [79 6B 57, 05, 05] + +1B07B; [79 6B 5E, 05, 05] + +1B07C; [79 6B 65, 05, 05] + +1B07D; [79 6B 6C, 05, 05] + +1B07E; [79 6B 73, 05, 05] + +1B07F; [79 6B 7A, 05, 05] + +1B080; [79 6B 81, 05, 05] + +1B081; [79 6B 88, 05, 05] + +1B082; [79 6B 8F, 05, 05] + +1B083; [79 6B 96, 05, 05] + +1B084; [79 6B 9D, 05, 05] + +1B085; [79 6B A4, 05, 05] + +1B086; [79 6B AB, 05, 05] + +1B087; [79 6B B2, 05, 05] + +1B088; [79 6B B9, 05, 05] + +1B089; [79 6B C0, 05, 05] + +1B08A; [79 6B C7, 05, 05] + +1B08B; [79 6B CE, 05, 05] + +1B08C; [79 6B D5, 05, 05] + +1B08D; [79 6B DC, 05, 05] + +1B08E; [79 6B E3, 05, 05] + +1B08F; [79 6B EA, 05, 05] + +1B090; [79 6B F1, 05, 05] + +1B091; [79 6B F8, 05, 05] + +1B092; [79 6B FF, 05, 05] + +1B093; [79 6C 08, 05, 05] + +1B094; [79 6C 0F, 05, 05] + +1B095; [79 6C 16, 05, 05] + +1B096; [79 6C 1D, 05, 05] + +1B097; [79 6C 24, 05, 05] + +1B098; [79 6C 2B, 05, 05] + +1B099; [79 6C 32, 05, 05] + +1B09A; [79 6C 39, 05, 05] + +1B09B; [79 6C 40, 05, 05] + +1B09C; [79 6C 47, 05, 05] + +1B09D; [79 6C 4E, 05, 05] + +1B09E; [79 6C 55, 05, 05] + +1B09F; [79 6C 5C, 05, 05] + +1B0A0; [79 6C 63, 05, 05] + +1B0A1; [79 6C 6A, 05, 05] + +1B0A2; [79 6C 71, 05, 05] + +1B0A3; [79 6C 78, 05, 05] + +1B0A4; [79 6C 7F, 05, 05] + +1B0A5; [79 6C 86, 05, 05] + +1B0A6; [79 6C 8D, 05, 05] + +1B0A7; [79 6C 94, 05, 05] + +1B0A8; [79 6C 9B, 05, 05] + +1B0A9; [79 6C A2, 05, 05] + +1B0AA; [79 6C A9, 05, 05] + +1B0AB; [79 6C B0, 05, 05] + +1B0AC; [79 6C B7, 05, 05] + +1B0AD; [79 6C BE, 05, 05] + +1B0AE; [79 6C C5, 05, 05] + +1B0AF; [79 6C CC, 05, 05] + +1B0B0; [79 6C D3, 05, 05] + +1B0B1; [79 6C DA, 05, 05] + +1B0B2; [79 6C E1, 05, 05] + +1B0B3; [79 6C E8, 05, 05] + +1B0B4; [79 6C EF, 05, 05] + +1B0B5; [79 6C F6, 05, 05] + +1B0B6; [79 6C FD, 05, 05] + +1B0B7; [79 6D 06, 05, 05] + +1B0B8; [79 6D 0D, 05, 05] + +1B0B9; [79 6D 14, 05, 05] + +1B0BA; [79 6D 1B, 05, 05] + +1B0BB; [79 6D 22, 05, 05] + +1B0BC; [79 6D 29, 05, 05] + +1B0BD; [79 6D 30, 05, 05] + +1B0BE; [79 6D 37, 05, 05] + +1B0BF; [79 6D 3E, 05, 05] + +1B0C0; [79 6D 45, 05, 05] + +1B0C1; [79 6D 4C, 05, 05] + +1B0C2; [79 6D 53, 05, 05] + +1B0C3; [79 6D 5A, 05, 05] + +1B0C4; [79 6D 61, 05, 05] + +1B0C5; [79 6D 68, 05, 05] + +1B0C6; [79 6D 6F, 05, 05] + +1B0C7; [79 6D 76, 05, 05] + +1B0C8; [79 6D 7D, 05, 05] + +1B0C9; [79 6D 84, 05, 05] + +1B0CA; [79 6D 8B, 05, 05] + +1B0CB; [79 6D 92, 05, 05] + +1B0CC; [79 6D 99, 05, 05] + +1B0CD; [79 6D A0, 05, 05] + +1B0CE; [79 6D A7, 05, 05] + +1B0CF; [79 6D AE, 05, 05] + +1B0D0; [79 6D B5, 05, 05] + +1B0D1; [79 6D BC, 05, 05] + +1B0D2; [79 6D C3, 05, 05] + +1B0D3; [79 6D CA, 05, 05] + +1B0D4; [79 6D D1, 05, 05] + +1B0D5; [79 6D D8, 05, 05] + +1B0D6; [79 6D DF, 05, 05] + +1B0D7; [79 6D E6, 05, 05] + +1B0D8; [79 6D ED, 05, 05] + +1B0D9; [79 6D F4, 05, 05] + +1B0DA; [79 6D FB, 05, 05] + +1B0DB; [79 6E 04, 05, 05] + +1B0DC; [79 6E 0B, 05, 05] + +1B0DD; [79 6E 12, 05, 05] + +1B0DE; [79 6E 19, 05, 05] + +1B0DF; [79 6E 20, 05, 05] + +1B0E0; [79 6E 27, 05, 05] + +1B0E1; [79 6E 2E, 05, 05] + +1B0E2; [79 6E 35, 05, 05] + +1B0E3; [79 6E 3C, 05, 05] + +1B0E4; [79 6E 43, 05, 05] + +1B0E5; [79 6E 4A, 05, 05] + +1B0E6; [79 6E 51, 05, 05] + +1B0E7; [79 6E 58, 05, 05] + +1B0E8; [79 6E 5F, 05, 05] + +1B0E9; [79 6E 66, 05, 05] + +1B0EA; [79 6E 6D, 05, 05] + +1B0EB; [79 6E 74, 05, 05] + +1B0EC; [79 6E 7B, 05, 05] + +1B0ED; [79 6E 82, 05, 05] + +1B0EE; [79 6E 89, 05, 05] + +1B0EF; [79 6E 90, 05, 05] + +1B0F0; [79 6E 97, 05, 05] + +1B0F1; [79 6E 9E, 05, 05] + +1B0F2; [79 6E A5, 05, 05] + +1B0F3; [79 6E AC, 05, 05] + +1B0F4; [79 6E B3, 05, 05] + +1B0F5; [79 6E BA, 05, 05] + +1B0F6; [79 6E C1, 05, 05] + +1B0F7; [79 6E C8, 05, 05] + +1B0F8; [79 6E CF, 05, 05] + +1B0F9; [79 6E D6, 05, 05] + +1B0FA; [79 6E DD, 05, 05] + +1B0FB; [79 6E E4, 05, 05] + +1B0FC; [79 6E EB, 05, 05] + +1B0FD; [79 6E F2, 05, 05] + +1B0FE; [79 6E F9, 05, 05] + +1B0FF; [79 6F 02, 05, 05] + +1B100; [79 6F 09, 05, 05] + +1B101; [79 6F 10, 05, 05] + +1B102; [79 6F 17, 05, 05] + +1B103; [79 6F 1E, 05, 05] + +1B104; [79 6F 25, 05, 05] + +1B105; [79 6F 2C, 05, 05] + +1B106; [79 6F 33, 05, 05] + +1B107; [79 6F 3A, 05, 05] + +1B108; [79 6F 41, 05, 05] + +1B109; [79 6F 48, 05, 05] + +1B10A; [79 6F 4F, 05, 05] + +1B10B; [79 6F 56, 05, 05] + +1B10C; [79 6F 5D, 05, 05] + +1B10D; [79 6F 64, 05, 05] + +1B10E; [79 6F 6B, 05, 05] + +1B10F; [79 6F 72, 05, 05] + +1B110; [79 6F 79, 05, 05] + +1B111; [79 6F 80, 05, 05] + +1B112; [79 6F 87, 05, 05] + +1B113; [79 6F 8E, 05, 05] + +1B114; [79 6F 95, 05, 05] + +1B115; [79 6F 9C, 05, 05] + +1B116; [79 6F A3, 05, 05] + +1B117; [79 6F AA, 05, 05] + +1B118; [79 6F B1, 05, 05] + +1B119; [79 6F B8, 05, 05] + +1B11A; [79 6F BF, 05, 05] + +1B11B; [79 6F C6, 05, 05] + +1B11C; [79 6F CD, 05, 05] + +1B11D; [79 6F D4, 05, 05] + +1B11E; [79 6F DB, 05, 05] FDD1 3105; [7A 04 02, 05, 05] # BOPOMOFO first primary starts new lead byte (compressible) @@ -38411,6 +39603,7 @@ FDD1 3105; [7A 04 02, 05, 05] # BOPOMOFO first primary starts new lead byte (com 31A6; [7A 42, 05, 05] 311C; [7A 44, 05, 05] +312E; [7A 44, 05, 20] 311D; [7A 46, 05, 05] @@ -41825,6 +43018,12 @@ FDD1 10300; [7A EC 02, 05, 05] # OLD_ITALIC first primary (compressible) 1031E; [7A EC E2, 05, 05] +1032D; [7A EC E9, 05, 05] + +1032E; [7A EC F0, 05, 05] + +1032F; [7A EC F7, 05, 05] + FDD1 10330; [7A ED 02, 05, 05] # GOTHIC first primary (compressible) 10330; [7A ED 09, 05, 05] @@ -57261,6 +58460,405 @@ FDD1 18229; [7C 46 02, 05, 05] # Tangut first primary (compressible) 18AF1; [7C 7C 2C, 05, 05] 18AF2; [7C 7C 2E, 05, 05] +FDD1 1B1C4; [7C 7D 02, 05, 05] # Nushu first primary (compressible) + +1B170; [7C 7D 09, 05, 05] +1B171; [7C 7D 10, 05, 05] +1B172; [7C 7D 17, 05, 05] +1B173; [7C 7D 1E, 05, 05] +1B174; [7C 7D 25, 05, 05] +1B175; [7C 7D 2C, 05, 05] +1B176; [7C 7D 33, 05, 05] +1B177; [7C 7D 3A, 05, 05] +1B178; [7C 7D 41, 05, 05] +1B179; [7C 7D 48, 05, 05] +1B17A; [7C 7D 4F, 05, 05] +1B17B; [7C 7D 56, 05, 05] +1B17C; [7C 7D 5D, 05, 05] +1B17D; [7C 7D 64, 05, 05] +1B17E; [7C 7D 6B, 05, 05] +1B17F; [7C 7D 72, 05, 05] +1B180; [7C 7D 79, 05, 05] +1B181; [7C 7D 80, 05, 05] +1B182; [7C 7D 87, 05, 05] +1B183; [7C 7D 8E, 05, 05] +1B184; [7C 7D 95, 05, 05] +1B185; [7C 7D 9C, 05, 05] +1B186; [7C 7D A3, 05, 05] +1B187; [7C 7D AA, 05, 05] +1B188; [7C 7D B1, 05, 05] +1B189; [7C 7D B8, 05, 05] +1B18A; [7C 7D BF, 05, 05] +1B18B; [7C 7D C6, 05, 05] +1B18C; [7C 7D CD, 05, 05] +1B18D; [7C 7D D4, 05, 05] +1B18E; [7C 7D DB, 05, 05] +1B18F; [7C 7D E2, 05, 05] +1B190; [7C 7D E9, 05, 05] +1B191; [7C 7D F0, 05, 05] +1B192; [7C 7D F7, 05, 05] +1B193; [7C 7D FE, 05, 05] +1B194; [7C 7E 07, 05, 05] +1B195; [7C 7E 0E, 05, 05] +1B196; [7C 7E 15, 05, 05] +1B197; [7C 7E 1C, 05, 05] +1B198; [7C 7E 23, 05, 05] +1B199; [7C 7E 2A, 05, 05] +1B19A; [7C 7E 31, 05, 05] +1B19B; [7C 7E 38, 05, 05] +1B19C; [7C 7E 3F, 05, 05] +1B19D; [7C 7E 46, 05, 05] +1B19E; [7C 7E 4D, 05, 05] +1B19F; [7C 7E 54, 05, 05] +1B1A0; [7C 7E 5B, 05, 05] +1B1A1; [7C 7E 62, 05, 05] +1B1A2; [7C 7E 69, 05, 05] +1B1A3; [7C 7E 70, 05, 05] +1B1A4; [7C 7E 77, 05, 05] +1B1A5; [7C 7E 7E, 05, 05] +1B1A6; [7C 7E 85, 05, 05] +1B1A7; [7C 7E 8C, 05, 05] +1B1A8; [7C 7E 93, 05, 05] +1B1A9; [7C 7E 9A, 05, 05] +1B1AA; [7C 7E A1, 05, 05] +1B1AB; [7C 7E A8, 05, 05] +1B1AC; [7C 7E AF, 05, 05] +1B1AD; [7C 7E B6, 05, 05] +1B1AE; [7C 7E BD, 05, 05] +1B1AF; [7C 7E C4, 05, 05] +1B1B0; [7C 7E CB, 05, 05] +1B1B1; [7C 7E D2, 05, 05] +1B1B2; [7C 7E D9, 05, 05] +1B1B3; [7C 7E E0, 05, 05] +1B1B4; [7C 7E E7, 05, 05] +1B1B5; [7C 7E EE, 05, 05] +1B1B6; [7C 7E F5, 05, 05] +1B1B7; [7C 7E FC, 05, 05] +1B1B8; [7C 7F 05, 05, 05] +1B1B9; [7C 7F 0C, 05, 05] +1B1BA; [7C 7F 13, 05, 05] +1B1BB; [7C 7F 1A, 05, 05] +1B1BC; [7C 7F 21, 05, 05] +1B1BD; [7C 7F 28, 05, 05] +1B1BE; [7C 7F 2F, 05, 05] +1B1BF; [7C 7F 36, 05, 05] +1B1C0; [7C 7F 3D, 05, 05] +1B1C1; [7C 7F 44, 05, 05] +1B1C2; [7C 7F 4B, 05, 05] +1B1C3; [7C 7F 52, 05, 05] +1B1C4; [7C 7F 59, 05, 05] +1B1C5; [7C 7F 60, 05, 05] +1B1C6; [7C 7F 67, 05, 05] +1B1C7; [7C 7F 6E, 05, 05] +1B1C8; [7C 7F 75, 05, 05] +1B1C9; [7C 7F 7C, 05, 05] +1B1CA; [7C 7F 83, 05, 05] +1B1CB; [7C 7F 8A, 05, 05] +1B1CC; [7C 7F 91, 05, 05] +1B1CD; [7C 7F 98, 05, 05] +1B1CE; [7C 7F 9F, 05, 05] +1B1CF; [7C 7F A6, 05, 05] +1B1D0; [7C 7F AD, 05, 05] +1B1D1; [7C 7F B4, 05, 05] +1B1D2; [7C 7F BB, 05, 05] +1B1D3; [7C 7F C2, 05, 05] +1B1D4; [7C 7F C9, 05, 05] +1B1D5; [7C 7F D0, 05, 05] +1B1D6; [7C 7F D7, 05, 05] +1B1D7; [7C 7F DE, 05, 05] +1B1D8; [7C 7F E5, 05, 05] +1B1D9; [7C 7F EC, 05, 05] +1B1DA; [7C 7F F3, 05, 05] +1B1DB; [7C 7F FA, 05, 05] +1B1DC; [7C 80 03, 05, 05] +1B1DD; [7C 80 0A, 05, 05] +1B1DE; [7C 80 11, 05, 05] +1B1DF; [7C 80 18, 05, 05] +1B1E0; [7C 80 1F, 05, 05] +1B1E1; [7C 80 26, 05, 05] +1B1E2; [7C 80 2D, 05, 05] +1B1E3; [7C 80 34, 05, 05] +1B1E4; [7C 80 3B, 05, 05] +1B1E5; [7C 80 42, 05, 05] +1B1E6; [7C 80 49, 05, 05] +1B1E7; [7C 80 50, 05, 05] +1B1E8; [7C 80 57, 05, 05] +1B1E9; [7C 80 5E, 05, 05] +1B1EA; [7C 80 65, 05, 05] +1B1EB; [7C 80 6C, 05, 05] +1B1EC; [7C 80 73, 05, 05] +1B1ED; [7C 80 7A, 05, 05] +1B1EE; [7C 80 81, 05, 05] +1B1EF; [7C 80 88, 05, 05] +1B1F0; [7C 80 8F, 05, 05] +1B1F1; [7C 80 96, 05, 05] +1B1F2; [7C 80 9D, 05, 05] +1B1F3; [7C 80 A4, 05, 05] +1B1F4; [7C 80 AB, 05, 05] +1B1F5; [7C 80 B2, 05, 05] +1B1F6; [7C 80 B9, 05, 05] +1B1F7; [7C 80 C0, 05, 05] +1B1F8; [7C 80 C7, 05, 05] +1B1F9; [7C 80 CE, 05, 05] +1B1FA; [7C 80 D5, 05, 05] +1B1FB; [7C 80 DC, 05, 05] +1B1FC; [7C 80 E3, 05, 05] +1B1FD; [7C 80 EA, 05, 05] +1B1FE; [7C 80 F1, 05, 05] +1B1FF; [7C 80 F8, 05, 05] +1B200; [7C 80 FF, 05, 05] +1B201; [7C 81 08, 05, 05] +1B202; [7C 81 0F, 05, 05] +1B203; [7C 81 16, 05, 05] +1B204; [7C 81 1D, 05, 05] +1B205; [7C 81 24, 05, 05] +1B206; [7C 81 2B, 05, 05] +1B207; [7C 81 32, 05, 05] +1B208; [7C 81 39, 05, 05] +1B209; [7C 81 40, 05, 05] +1B20A; [7C 81 47, 05, 05] +1B20B; [7C 81 4E, 05, 05] +1B20C; [7C 81 55, 05, 05] +1B20D; [7C 81 5C, 05, 05] +1B20E; [7C 81 63, 05, 05] +1B20F; [7C 81 6A, 05, 05] +1B210; [7C 81 71, 05, 05] +1B211; [7C 81 78, 05, 05] +1B212; [7C 81 7F, 05, 05] +1B213; [7C 81 86, 05, 05] +1B214; [7C 81 8D, 05, 05] +1B215; [7C 81 94, 05, 05] +1B216; [7C 81 9B, 05, 05] +1B217; [7C 81 A2, 05, 05] +1B218; [7C 81 A9, 05, 05] +1B219; [7C 81 B0, 05, 05] +1B21A; [7C 81 B7, 05, 05] +1B21B; [7C 81 BE, 05, 05] +1B21C; [7C 81 C5, 05, 05] +1B21D; [7C 81 CC, 05, 05] +1B21E; [7C 81 D3, 05, 05] +1B21F; [7C 81 DA, 05, 05] +1B220; [7C 81 E1, 05, 05] +1B221; [7C 81 E8, 05, 05] +1B222; [7C 81 EF, 05, 05] +1B223; [7C 81 F6, 05, 05] +1B224; [7C 81 FD, 05, 05] +1B225; [7C 82 06, 05, 05] +1B226; [7C 82 0D, 05, 05] +1B227; [7C 82 14, 05, 05] +1B228; [7C 82 1B, 05, 05] +1B229; [7C 82 22, 05, 05] +1B22A; [7C 82 29, 05, 05] +1B22B; [7C 82 30, 05, 05] +1B22C; [7C 82 37, 05, 05] +1B22D; [7C 82 3E, 05, 05] +1B22E; [7C 82 45, 05, 05] +1B22F; [7C 82 4C, 05, 05] +1B230; [7C 82 53, 05, 05] +1B231; [7C 82 5A, 05, 05] +1B232; [7C 82 61, 05, 05] +1B233; [7C 82 68, 05, 05] +1B234; [7C 82 6F, 05, 05] +1B235; [7C 82 76, 05, 05] +1B236; [7C 82 7D, 05, 05] +1B237; [7C 82 84, 05, 05] +1B238; [7C 82 8B, 05, 05] +1B239; [7C 82 92, 05, 05] +1B23A; [7C 82 99, 05, 05] +1B23B; [7C 82 A0, 05, 05] +1B23C; [7C 82 A7, 05, 05] +1B23D; [7C 82 AE, 05, 05] +1B23E; [7C 82 B5, 05, 05] +1B23F; [7C 82 BC, 05, 05] +1B240; [7C 82 C3, 05, 05] +1B241; [7C 82 CA, 05, 05] +1B242; [7C 82 D1, 05, 05] +1B243; [7C 82 D8, 05, 05] +1B244; [7C 82 DF, 05, 05] +1B245; [7C 82 E6, 05, 05] +1B246; [7C 82 ED, 05, 05] +1B247; [7C 82 F4, 05, 05] +1B248; [7C 82 FB, 05, 05] +1B249; [7C 83 04, 05, 05] +1B24A; [7C 83 0B, 05, 05] +1B24B; [7C 83 12, 05, 05] +1B24C; [7C 83 19, 05, 05] +1B24D; [7C 83 20, 05, 05] +1B24E; [7C 83 27, 05, 05] +1B24F; [7C 83 2E, 05, 05] +1B250; [7C 83 35, 05, 05] +1B251; [7C 83 3C, 05, 05] +1B252; [7C 83 43, 05, 05] +1B253; [7C 83 4A, 05, 05] +1B254; [7C 83 51, 05, 05] +1B255; [7C 83 58, 05, 05] +1B256; [7C 83 5F, 05, 05] +1B257; [7C 83 66, 05, 05] +1B258; [7C 83 6D, 05, 05] +1B259; [7C 83 74, 05, 05] +1B25A; [7C 83 7B, 05, 05] +1B25B; [7C 83 82, 05, 05] +1B25C; [7C 83 89, 05, 05] +1B25D; [7C 83 90, 05, 05] +1B25E; [7C 83 97, 05, 05] +1B25F; [7C 83 9E, 05, 05] +1B260; [7C 83 A5, 05, 05] +1B261; [7C 83 AC, 05, 05] +1B262; [7C 83 B3, 05, 05] +1B263; [7C 83 BA, 05, 05] +1B264; [7C 83 C1, 05, 05] +1B265; [7C 83 C8, 05, 05] +1B266; [7C 83 CF, 05, 05] +1B267; [7C 83 D6, 05, 05] +1B268; [7C 83 DD, 05, 05] +1B269; [7C 83 E4, 05, 05] +1B26A; [7C 83 EB, 05, 05] +1B26B; [7C 83 F2, 05, 05] +1B26C; [7C 83 F9, 05, 05] +1B26D; [7C 84 02, 05, 05] +1B26E; [7C 84 09, 05, 05] +1B26F; [7C 84 10, 05, 05] +1B270; [7C 84 17, 05, 05] +1B271; [7C 84 1E, 05, 05] +1B272; [7C 84 25, 05, 05] +1B273; [7C 84 2C, 05, 05] +1B274; [7C 84 33, 05, 05] +1B275; [7C 84 3A, 05, 05] +1B276; [7C 84 41, 05, 05] +1B277; [7C 84 48, 05, 05] +1B278; [7C 84 4F, 05, 05] +1B279; [7C 84 56, 05, 05] +1B27A; [7C 84 5D, 05, 05] +1B27B; [7C 84 64, 05, 05] +1B27C; [7C 84 6B, 05, 05] +1B27D; [7C 84 72, 05, 05] +1B27E; [7C 84 79, 05, 05] +1B27F; [7C 84 80, 05, 05] +1B280; [7C 84 87, 05, 05] +1B281; [7C 84 8E, 05, 05] +1B282; [7C 84 95, 05, 05] +1B283; [7C 84 9C, 05, 05] +1B284; [7C 84 A3, 05, 05] +1B285; [7C 84 AA, 05, 05] +1B286; [7C 84 B1, 05, 05] +1B287; [7C 84 B8, 05, 05] +1B288; [7C 84 BF, 05, 05] +1B289; [7C 84 C6, 05, 05] +1B28A; [7C 84 CD, 05, 05] +1B28B; [7C 84 D4, 05, 05] +1B28C; [7C 84 DB, 05, 05] +1B28D; [7C 84 E2, 05, 05] +1B28E; [7C 84 E9, 05, 05] +1B28F; [7C 84 F0, 05, 05] +1B290; [7C 84 F7, 05, 05] +1B291; [7C 84 FE, 05, 05] +1B292; [7C 85 07, 05, 05] +1B293; [7C 85 0E, 05, 05] +1B294; [7C 85 15, 05, 05] +1B295; [7C 85 1C, 05, 05] +1B296; [7C 85 23, 05, 05] +1B297; [7C 85 2A, 05, 05] +1B298; [7C 85 31, 05, 05] +1B299; [7C 85 38, 05, 05] +1B29A; [7C 85 3F, 05, 05] +1B29B; [7C 85 46, 05, 05] +1B29C; [7C 85 4D, 05, 05] +1B29D; [7C 85 54, 05, 05] +1B29E; [7C 85 5B, 05, 05] +1B29F; [7C 85 62, 05, 05] +1B2A0; [7C 85 69, 05, 05] +1B2A1; [7C 85 70, 05, 05] +1B2A2; [7C 85 77, 05, 05] +1B2A3; [7C 85 7E, 05, 05] +1B2A4; [7C 85 85, 05, 05] +1B2A5; [7C 85 8C, 05, 05] +1B2A6; [7C 85 93, 05, 05] +1B2A7; [7C 85 9A, 05, 05] +1B2A8; [7C 85 A1, 05, 05] +1B2A9; [7C 85 A8, 05, 05] +1B2AA; [7C 85 AF, 05, 05] +1B2AB; [7C 85 B6, 05, 05] +1B2AC; [7C 85 BD, 05, 05] +1B2AD; [7C 85 C4, 05, 05] +1B2AE; [7C 85 CB, 05, 05] +1B2AF; [7C 85 D2, 05, 05] +1B2B0; [7C 85 D9, 05, 05] +1B2B1; [7C 85 E0, 05, 05] +1B2B2; [7C 85 E7, 05, 05] +1B2B3; [7C 85 EE, 05, 05] +1B2B4; [7C 85 F5, 05, 05] +1B2B5; [7C 85 FC, 05, 05] +1B2B6; [7C 86 05, 05, 05] +1B2B7; [7C 86 0C, 05, 05] +1B2B8; [7C 86 13, 05, 05] +1B2B9; [7C 86 1A, 05, 05] +1B2BA; [7C 86 21, 05, 05] +1B2BB; [7C 86 28, 05, 05] +1B2BC; [7C 86 2F, 05, 05] +1B2BD; [7C 86 36, 05, 05] +1B2BE; [7C 86 3D, 05, 05] +1B2BF; [7C 86 44, 05, 05] +1B2C0; [7C 86 4B, 05, 05] +1B2C1; [7C 86 52, 05, 05] +1B2C2; [7C 86 59, 05, 05] +1B2C3; [7C 86 60, 05, 05] +1B2C4; [7C 86 67, 05, 05] +1B2C5; [7C 86 6E, 05, 05] +1B2C6; [7C 86 75, 05, 05] +1B2C7; [7C 86 7C, 05, 05] +1B2C8; [7C 86 83, 05, 05] +1B2C9; [7C 86 8A, 05, 05] +1B2CA; [7C 86 91, 05, 05] +1B2CB; [7C 86 98, 05, 05] +1B2CC; [7C 86 9F, 05, 05] +1B2CD; [7C 86 A6, 05, 05] +1B2CE; [7C 86 AD, 05, 05] +1B2CF; [7C 86 B4, 05, 05] +1B2D0; [7C 86 BB, 05, 05] +1B2D1; [7C 86 C2, 05, 05] +1B2D2; [7C 86 C9, 05, 05] +1B2D3; [7C 86 D0, 05, 05] +1B2D4; [7C 86 D7, 05, 05] +1B2D5; [7C 86 DE, 05, 05] +1B2D6; [7C 86 E5, 05, 05] +1B2D7; [7C 86 EC, 05, 05] +1B2D8; [7C 86 F3, 05, 05] +1B2D9; [7C 86 FA, 05, 05] +1B2DA; [7C 87 03, 05, 05] +1B2DB; [7C 87 0A, 05, 05] +1B2DC; [7C 87 11, 05, 05] +1B2DD; [7C 87 18, 05, 05] +1B2DE; [7C 87 1F, 05, 05] +1B2DF; [7C 87 26, 05, 05] +1B2E0; [7C 87 2D, 05, 05] +1B2E1; [7C 87 34, 05, 05] +1B2E2; [7C 87 3B, 05, 05] +1B2E3; [7C 87 42, 05, 05] +1B2E4; [7C 87 49, 05, 05] +1B2E5; [7C 87 50, 05, 05] +1B2E6; [7C 87 57, 05, 05] +1B2E7; [7C 87 5E, 05, 05] +1B2E8; [7C 87 65, 05, 05] +1B2E9; [7C 87 6C, 05, 05] +1B2EA; [7C 87 73, 05, 05] +1B2EB; [7C 87 7A, 05, 05] +1B2EC; [7C 87 81, 05, 05] +1B2ED; [7C 87 88, 05, 05] +1B2EE; [7C 87 8F, 05, 05] +1B2EF; [7C 87 96, 05, 05] +1B2F0; [7C 87 9D, 05, 05] +1B2F1; [7C 87 A4, 05, 05] +1B2F2; [7C 87 AB, 05, 05] +1B2F3; [7C 87 B2, 05, 05] +1B2F4; [7C 87 B9, 05, 05] +1B2F5; [7C 87 C0, 05, 05] +1B2F6; [7C 87 C7, 05, 05] +1B2F7; [7C 87 CE, 05, 05] +1B2F8; [7C 87 D5, 05, 05] +1B2F9; [7C 87 DC, 05, 05] +1B2FA; [7C 87 E3, 05, 05] +1B2FB; [7C 87 EA, 05, 05] + FDD1 5B57; [7D 02 02, 05, 05] # HAN first primary starts new lead byte 2F00; [U+4E00, 10] @@ -58770,12 +60368,12 @@ FDD0 0050; [, , 3D 02] # CONSTRUCTED FAKE SECONDARY-IGNORABLE [first secondary in primary non-ignorable [X, 05, X]] # U+0009 [last secondary in primary non-ignorable [X, 7C, X]] # U+16AE RUNIC LETTER O [first primary ignorable [, 82, 05]] # U+0332 COMBINING LOW LINE -[last primary ignorable [, FB 92, 05]] # U+00B7 MIDDLE DOT +[last primary ignorable [, FB B4, 05]] # U+00B7 MIDDLE DOT [first variable [03 04, 05, 05]] # U+0009 -[last variable [0B 63 4B, 05, 05]] # U+10A7F OLD SOUTH ARABIAN NUMERIC INDICATOR +[last variable [0B 6D 4B, 05, 05]] # U+10A7F OLD SOUTH ARABIAN NUMERIC INDICATOR [variable top = 0B FF FF FF] [first regular [0C 04, 05, 05]] # U+0060 GRAVE ACCENT -[last regular [7C 7C 2E, 05, 05]] # U+18AF2 TANGUT COMPONENT-755 +[last regular [7C 87 EA, 05, 05]] # U+1B2FB NUSHU CHARACTER-1B2FB [first implicit [E0, 05, 05]] # CONSTRUCTED [last implicit [E4, 05, 05]] # CONSTRUCTED [first trailing [EF FD, 05, 05]] # U+FFFD REPLACEMENT CHARACTER @@ -58789,21 +60387,21 @@ FDD0 0050; [, , 3D 02] # CONSTRUCTED FAKE SECONDARY-IGNORABLE [reorderingTokens Armi 7B=23 ] [reorderingTokens Armn 63=83 ] [reorderingTokens Avst 7B=55 ] -[reorderingTokens Bali 74=61 ] +[reorderingTokens Bali 75=61 ] [reorderingTokens Bamu 77=640 ] [reorderingTokens Bass 77=31 ] [reorderingTokens Batk 74=39 ] -[reorderingTokens Beng 68=55 ] +[reorderingTokens Beng 68=56 ] [reorderingTokens Bhks 70=48 ] -[reorderingTokens Bopo 7A=69 ] +[reorderingTokens Bopo 7A=70 ] [reorderingTokens Brah 70=54 ] -[reorderingTokens Bugi 73=24 ] -[reorderingTokens Buhd 73=19 ] +[reorderingTokens Bugi 74=24 ] +[reorderingTokens Buhd 74=19 ] [reorderingTokens CURRENCY 0D=1 ] [reorderingTokens Cakm 74=37 ] [reorderingTokens Cans 75=708 ] [reorderingTokens Cari 7A=50 ] -[reorderingTokens Cham 74=53 ] +[reorderingTokens Cham 75=53 ] [reorderingTokens Cher 75=173 ] [reorderingTokens Copt 5F=122 ] [reorderingTokens Cprt 7B=56 ] @@ -58818,6 +60416,7 @@ FDD0 0050; [, , 3D 02] # CONSTRUCTED FAKE SECONDARY-IGNORABLE [reorderingTokens FIELD-SEPARATOR 02=1 ] [reorderingTokens Geor 62=128 ] [reorderingTokens Glag 61=95 ] +[reorderingTokens Gonm 70=49 ] [reorderingTokens Goth 7A=26 ] [reorderingTokens Gran 70=54 ] [reorderingTokens Grek 5F=645 ] @@ -58825,7 +60424,7 @@ FDD0 0050; [, , 3D 02] # CONSTRUCTED FAKE SECONDARY-IGNORABLE [reorderingTokens Guru 69=52 ] [reorderingTokens Hang 78=535 ] [reorderingTokens Hani 5D=1 5E=1 7D=1 7E=1 7F=1 80=1 81=1 82=1 83=1 84=1 85=1 86=1 87=1 88=1 89=1 8A=1 8B=1 8C=1 8D=1 8E=1 8F=1 90=1 91=1 92=1 93=1 94=1 95=1 96=1 97=1 98=1 99=1 9A=1 9B=1 9C=1 9D=1 9E=1 9F=1 A0=1 A1=1 A2=1 A3=1 A4=1 A5=1 A6=1 A7=1 A8=1 A9=1 AA=1 AB=1 AC=1 AD=1 AE=1 AF=1 B0=1 B1=1 B2=1 B3=1 B4=1 B5=1 B6=1 B7=1 B8=1 B9=1 BA=1 BB=1 BC=1 BD=1 BE=1 BF=1 C0=1 C1=1 C2=1 C3=1 C4=1 C5=1 C6=1 C7=1 C8=1 C9=1 CA=1 CB=1 CC=1 CD=1 CE=1 CF=1 D0=1 D1=1 D2=1 D3=1 D4=1 D5=1 D6=1 D7=1 D8=1 D9=1 DA=1 DB=1 DC=1 DD=1 DE=1 DF=1 ] -[reorderingTokens Hano 73=19 ] +[reorderingTokens Hano 74=19 ] [reorderingTokens Hans 5D=1 5E=1 7D=1 7E=1 7F=1 80=1 81=1 82=1 83=1 84=1 85=1 86=1 87=1 88=1 89=1 8A=1 8B=1 8C=1 8D=1 8E=1 8F=1 90=1 91=1 92=1 93=1 94=1 95=1 96=1 97=1 98=1 99=1 9A=1 9B=1 9C=1 9D=1 9E=1 9F=1 A0=1 A1=1 A2=1 A3=1 A4=1 A5=1 A6=1 A7=1 A8=1 A9=1 AA=1 AB=1 AC=1 AD=1 AE=1 AF=1 B0=1 B1=1 B2=1 B3=1 B4=1 B5=1 B6=1 B7=1 B8=1 B9=1 BA=1 BB=1 BC=1 BD=1 BE=1 BF=1 C0=1 C1=1 C2=1 C3=1 C4=1 C5=1 C6=1 C7=1 C8=1 C9=1 CA=1 CB=1 CC=1 CD=1 CE=1 CF=1 D0=1 D1=1 D2=1 D3=1 D4=1 D5=1 D6=1 D7=1 D8=1 D9=1 DA=1 DB=1 DC=1 DD=1 DE=1 DF=1 ] [reorderingTokens Hant 5D=1 5E=1 7D=1 7E=1 7F=1 80=1 81=1 82=1 83=1 84=1 85=1 86=1 87=1 88=1 89=1 8A=1 8B=1 8C=1 8D=1 8E=1 8F=1 90=1 91=1 92=1 93=1 94=1 95=1 96=1 97=1 98=1 99=1 9A=1 9B=1 9C=1 9D=1 9E=1 9F=1 A0=1 A1=1 A2=1 A3=1 A4=1 A5=1 A6=1 A7=1 A8=1 A9=1 AA=1 AB=1 AC=1 AD=1 AE=1 AF=1 B0=1 B1=1 B2=1 B3=1 B4=1 B5=1 B6=1 B7=1 B8=1 B9=1 BA=1 BB=1 BC=1 BD=1 BE=1 BF=1 C0=1 C1=1 C2=1 C3=1 C4=1 C5=1 C6=1 C7=1 C8=1 C9=1 CA=1 CB=1 CC=1 CD=1 CE=1 CF=1 D0=1 D1=1 D2=1 D3=1 D4=1 D5=1 D6=1 D7=1 D8=1 D9=1 DA=1 DB=1 DC=1 DD=1 DE=1 DF=1 ] [reorderingTokens Hatr 7B=22 ] @@ -58836,21 +60435,21 @@ FDD0 0050; [, , 3D 02] # CONSTRUCTED FAKE SECONDARY-IGNORABLE [reorderingTokens Hrkt 79=1 ] [reorderingTokens Hung 76=103 ] [reorderingTokens IMPLICIT E0=5 E1=5 E2=5 E3=5 E4=5 ] -[reorderingTokens Ital 7A=33 ] -[reorderingTokens Java 74=48 ] +[reorderingTokens Ital 7A=36 ] +[reorderingTokens Java 75=48 ] [reorderingTokens Kali 74=29 ] -[reorderingTokens Kana 79=391 ] +[reorderingTokens Kana 79=676 ] [reorderingTokens Khar 70=36 ] [reorderingTokens Khmr 74=54 ] [reorderingTokens Khoj 70=44 ] [reorderingTokens Knda 6E=57 ] [reorderingTokens Kthi 70=46 ] [reorderingTokens LEVEL-SEPARATOR 01=1 ] -[reorderingTokens Lana 74=54 ] +[reorderingTokens Lana 75=54 ] [reorderingTokens Laoo 72=196 ] [reorderingTokens Latn 28=2231 29=2231 2A=2231 2B=2231 2C=2231 2D=2231 2E=2231 2F=2231 30=2231 31=2231 32=2231 33=2231 34=2231 35=2231 36=2231 37=2231 38=2231 39=2231 3A=2231 3B=2231 3C=2231 3D=2231 3E=2231 3F=2231 40=2231 41=2231 42=2231 43=2231 44=2231 45=2231 46=2231 47=2231 48=2231 49=2231 4A=2231 4B=2231 4C=2231 4D=2231 4E=2231 4F=2231 50=2231 51=2231 52=2231 53=2231 54=2231 55=2231 56=2231 57=2231 58=2231 59=2231 5A=2231 5B=2231 5C=2231 ] -[reorderingTokens Lepc 73=40 ] -[reorderingTokens Limb 73=32 ] +[reorderingTokens Lepc 74=40 ] +[reorderingTokens Limb 74=32 ] [reorderingTokens Lina 7B=342 ] [reorderingTokens Linb 7B=212 ] [reorderingTokens Lisu 7A=41 ] @@ -58859,7 +60458,7 @@ FDD0 0050; [, , 3D 02] # CONSTRUCTED FAKE SECONDARY-IGNORABLE [reorderingTokens Mahj 70=37 ] [reorderingTokens Mand 66=26 ] [reorderingTokens Mani 7B=37 ] -[reorderingTokens Marc 73=31 ] +[reorderingTokens Marc 74=31 ] [reorderingTokens Mend 77=198 ] [reorderingTokens Merc 7C=27 ] [reorderingTokens Mero 7C=32 ] @@ -58874,6 +60473,7 @@ FDD0 0050; [, , 3D 02] # CONSTRUCTED FAKE SECONDARY-IGNORABLE [reorderingTokens Nbat 7B=32 ] [reorderingTokens Newa 70=58 ] [reorderingTokens Nkoo 66=34 ] +[reorderingTokens Nshu 7C=1 ] [reorderingTokens Ogam 75=27 ] [reorderingTokens Olck 75=31 ] [reorderingTokens Orkh 76=74 ] @@ -58884,7 +60484,7 @@ FDD0 0050; [, , 3D 02] # CONSTRUCTED FAKE SECONDARY-IGNORABLE [reorderingTokens Palm 7B=24 ] [reorderingTokens Pauc 7A=58 ] [reorderingTokens Perm 61=39 ] -[reorderingTokens Phag 73=53 ] +[reorderingTokens Phag 74=53 ] [reorderingTokens Phli 7B=20 ] [reorderingTokens Phlp 7B=19 ] [reorderingTokens Phnx 64=23 ] @@ -58904,21 +60504,22 @@ FDD0 0050; [, , 3D 02] # CONSTRUCTED FAKE SECONDARY-IGNORABLE [reorderingTokens Sind 70=48 ] [reorderingTokens Sinh 70=60 ] [reorderingTokens Sora 7B=26 ] +[reorderingTokens Soyo 73=46 ] [reorderingTokens Sund 70=39 ] [reorderingTokens Sylo 70=33 ] -[reorderingTokens Syrc 66=35 ] +[reorderingTokens Syrc 66=46 ] [reorderingTokens TERMINATOR 00=1 ] [reorderingTokens TRAILING E5=11 E6=11 E7=11 E8=11 E9=11 EA=11 EB=11 EC=11 ED=11 EE=11 EF=11 ] -[reorderingTokens Tagb 73=17 ] +[reorderingTokens Tagb 74=17 ] [reorderingTokens Takr 70=44 ] -[reorderingTokens Tale 74=36 ] -[reorderingTokens Talu 74=247 ] +[reorderingTokens Tale 75=36 ] +[reorderingTokens Talu 75=247 ] [reorderingTokens Taml 6C=39 ] [reorderingTokens Tang 7C=1 ] [reorderingTokens Tavt 72=301 ] [reorderingTokens Telu 6D=57 ] [reorderingTokens Tfng 66=58 ] -[reorderingTokens Tglg 73=18 ] +[reorderingTokens Tglg 74=18 ] [reorderingTokens Thaa 66=40 ] [reorderingTokens Thai 71=286 ] [reorderingTokens Tibt 73=51 ] @@ -58929,28 +60530,29 @@ FDD0 0050; [, , 3D 02] # CONSTRUCTED FAKE SECONDARY-IGNORABLE [reorderingTokens Xpeo 7B=45 ] [reorderingTokens Xsux 7B=1119 ] [reorderingTokens Yiii 7A=1165 ] +[reorderingTokens Zanb 73=43 ] # General Categories => Top Byte [categories Cc 03{SPACE}=6 ] -[categories Lm 0C{SYMBOL}=24 0D{CURRENCY}=29 28{Latn}=12 29{Latn}=12 2A{Latn}=12 2B{Latn}=12 2C{Latn}=12 2D{Latn}=12 2E{Latn}=12 2F{Latn}=12 30{Latn}=12 31{Latn}=12 32{Latn}=12 33{Latn}=12 34{Latn}=12 35{Latn}=12 36{Latn}=12 37{Latn}=12 38{Latn}=12 39{Latn}=12 3A{Latn}=12 3B{Latn}=12 3C{Latn}=12 3D{Latn}=12 3E{Latn}=12 3F{Latn}=12 40{Latn}=12 41{Latn}=12 42{Latn}=12 43{Latn}=12 44{Latn}=12 45{Latn}=12 46{Latn}=12 47{Latn}=12 48{Latn}=12 49{Latn}=12 4A{Latn}=12 4B{Latn}=12 4C{Latn}=12 4D{Latn}=12 4E{Latn}=12 4F{Latn}=12 50{Latn}=12 51{Latn}=12 52{Latn}=12 53{Latn}=12 54{Latn}=12 55{Latn}=12 56{Latn}=12 57{Latn}=12 58{Latn}=12 59{Latn}=12 5A{Latn}=12 5B{Latn}=12 5C{Latn}=12 60{Cyrl}=2 63{Armn}=1 64{Hebr Phnx Samr}=1 65{Arab}=2 66{Syrc Mand Thaa Nkoo Tfng Ethi}=2 75{Mong Olck Cher Osge Cans Ogam}=7 77{Vaii Bamu Bass Mend Adlm}=1 7A{Bopo Yiii Lisu Plrd Wara Pauc Hmng Lyci Cari Lydi Ital Goth}=22 ] +[categories Lm 0C{SYMBOL}=24 0D{CURRENCY}=30 28{Latn}=12 29{Latn}=12 2A{Latn}=12 2B{Latn}=12 2C{Latn}=12 2D{Latn}=12 2E{Latn}=12 2F{Latn}=12 30{Latn}=12 31{Latn}=12 32{Latn}=12 33{Latn}=12 34{Latn}=12 35{Latn}=12 36{Latn}=12 37{Latn}=12 38{Latn}=12 39{Latn}=12 3A{Latn}=12 3B{Latn}=12 3C{Latn}=12 3D{Latn}=12 3E{Latn}=12 3F{Latn}=12 40{Latn}=12 41{Latn}=12 42{Latn}=12 43{Latn}=12 44{Latn}=12 45{Latn}=12 46{Latn}=12 47{Latn}=12 48{Latn}=12 49{Latn}=12 4A{Latn}=12 4B{Latn}=12 4C{Latn}=12 4D{Latn}=12 4E{Latn}=12 4F{Latn}=12 50{Latn}=12 51{Latn}=12 52{Latn}=12 53{Latn}=12 54{Latn}=12 55{Latn}=12 56{Latn}=12 57{Latn}=12 58{Latn}=12 59{Latn}=12 5A{Latn}=12 5B{Latn}=12 5C{Latn}=12 60{Cyrl}=2 63{Armn}=1 64{Hebr Phnx Samr}=1 65{Arab}=2 66{Syrc Mand Thaa Nkoo Tfng Ethi}=2 75{Tale Talu Lana Cham Bali Java Mong Olck Cher Osge Cans Ogam}=7 77{Vaii Bamu Bass Mend Adlm}=1 7A{Bopo Yiii Lisu Plrd Wara Pauc Hmng Lyci Cari Lydi Ital Goth}=22 ] [categories Lo 67{Deva}=10 79{Hira Hrkt Kana}=2 ] -[categories Mc 67{Deva}=10 68{Beng}=10 69{Guru}=3 6A{Gujr}=6 6B{Orya}=10 6C{Taml}=14 6D{Telu}=4 6E{Knda}=7 6F{Mlym}=13 70{Sinh Mtei Sylo Saur Kthi Mahj Shrd Khoj Sind Mult Gran Newa Tirh Sidd Modi Takr Ahom Sund Brah Khar Bhks}=123 73{Tibt Marc Lepc Phag Limb Tglg Hano Buhd Tagb Bugi}=30 74{Batk Rjng Kali Mymr Cakm Khmr Tale Talu Lana Cham Bali Java}=82 7A{Bopo Yiii Lisu Plrd Wara Pauc Hmng Lyci Cari Lydi Ital Goth}=46 ] -[categories Mn 28{Latn}=49 29{Latn}=49 2A{Latn}=49 2B{Latn}=49 2C{Latn}=49 2D{Latn}=49 2E{Latn}=49 2F{Latn}=49 30{Latn}=49 31{Latn}=49 32{Latn}=49 33{Latn}=49 34{Latn}=49 35{Latn}=49 36{Latn}=49 37{Latn}=49 38{Latn}=49 39{Latn}=49 3A{Latn}=49 3B{Latn}=49 3C{Latn}=49 3D{Latn}=49 3E{Latn}=49 3F{Latn}=49 40{Latn}=49 41{Latn}=49 42{Latn}=49 43{Latn}=49 44{Latn}=49 45{Latn}=49 46{Latn}=49 47{Latn}=49 48{Latn}=49 49{Latn}=49 4A{Latn}=49 4B{Latn}=49 4C{Latn}=49 4D{Latn}=49 4E{Latn}=49 4F{Latn}=49 50{Latn}=49 51{Latn}=49 52{Latn}=49 53{Latn}=49 54{Latn}=49 55{Latn}=49 56{Latn}=49 57{Latn}=49 58{Latn}=49 59{Latn}=49 5A{Latn}=49 5B{Latn}=49 5C{Latn}=49 60{Cyrl}=42 61{Glag Perm}=43 64{Hebr Phnx Samr}=3 66{Syrc Mand Thaa Nkoo Tfng Ethi}=11 67{Deva}=15 68{Beng}=7 69{Guru}=9 6A{Gujr}=10 6B{Orya}=9 6C{Taml}=2 6D{Telu}=15 6E{Knda}=17 6F{Mlym}=7 70{Sinh Mtei Sylo Saur Kthi Mahj Shrd Khoj Sind Mult Gran Newa Tirh Sidd Modi Takr Ahom Sund Brah Khar Bhks}=137 71{Thai}=10 72{Laoo Tavt}=18 73{Tibt Marc Lepc Phag Limb Tglg Hano Buhd Tagb Bugi}=141 74{Batk Rjng Kali Mymr Cakm Khmr Tale Talu Lana Cham Bali Java}=122 75{Mong Olck Cher Osge Cans Ogam}=3 7A{Bopo Yiii Lisu Plrd Wara Pauc Hmng Lyci Cari Lydi Ital Goth}=4 ] -[categories Nd 0E{DIGIT}=1 0F{DIGIT}=1 12{DIGIT}=65 14{DIGIT}=119 16{DIGIT}=94 18{DIGIT}=81 1A{DIGIT}=77 1C{DIGIT}=69 1E{DIGIT}=66 20{DIGIT}=67 22{DIGIT}=66 24{DIGIT}=66 ] +[categories Mc 67{Deva}=10 68{Beng}=10 69{Guru}=3 6A{Gujr}=6 6B{Orya}=10 6C{Taml}=14 6D{Telu}=4 6E{Knda}=7 6F{Mlym}=13 70{Sinh Mtei Sylo Saur Kthi Mahj Shrd Khoj Sind Mult Gran Newa Tirh Sidd Modi Takr Ahom Gonm Sund Brah Khar Bhks}=123 73{Tibt Zanb Soyo}=4 74{Marc Lepc Phag Limb Tglg Hano Buhd Tagb Bugi Batk Rjng Kali Mymr Cakm Khmr}=80 75{Tale Talu Lana Cham Bali Java Mong Olck Cher Osge Cans Ogam}=32 7A{Bopo Yiii Lisu Plrd Wara Pauc Hmng Lyci Cari Lydi Ital Goth}=46 ] +[categories Mn 28{Latn}=49 29{Latn}=49 2A{Latn}=49 2B{Latn}=49 2C{Latn}=49 2D{Latn}=49 2E{Latn}=49 2F{Latn}=49 30{Latn}=49 31{Latn}=49 32{Latn}=49 33{Latn}=49 34{Latn}=49 35{Latn}=49 36{Latn}=49 37{Latn}=49 38{Latn}=49 39{Latn}=49 3A{Latn}=49 3B{Latn}=49 3C{Latn}=49 3D{Latn}=49 3E{Latn}=49 3F{Latn}=49 40{Latn}=49 41{Latn}=49 42{Latn}=49 43{Latn}=49 44{Latn}=49 45{Latn}=49 46{Latn}=49 47{Latn}=49 48{Latn}=49 49{Latn}=49 4A{Latn}=49 4B{Latn}=49 4C{Latn}=49 4D{Latn}=49 4E{Latn}=49 4F{Latn}=49 50{Latn}=49 51{Latn}=49 52{Latn}=49 53{Latn}=49 54{Latn}=49 55{Latn}=49 56{Latn}=49 57{Latn}=49 58{Latn}=49 59{Latn}=49 5A{Latn}=49 5B{Latn}=49 5C{Latn}=49 60{Cyrl}=42 61{Glag Perm}=43 64{Hebr Phnx Samr}=3 66{Syrc Mand Thaa Nkoo Tfng Ethi}=11 67{Deva}=15 68{Beng}=7 69{Guru}=9 6A{Gujr}=10 6B{Orya}=9 6C{Taml}=2 6D{Telu}=15 6E{Knda}=17 6F{Mlym}=9 70{Sinh Mtei Sylo Saur Kthi Mahj Shrd Khoj Sind Mult Gran Newa Tirh Sidd Modi Takr Ahom Gonm Sund Brah Khar Bhks}=150 71{Thai}=10 72{Laoo Tavt}=18 73{Tibt Zanb Soyo}=118 74{Marc Lepc Phag Limb Tglg Hano Buhd Tagb Bugi Batk Rjng Kali Mymr Cakm Khmr}=132 75{Tale Talu Lana Cham Bali Java Mong Olck Cher Osge Cans Ogam}=52 7A{Bopo Yiii Lisu Plrd Wara Pauc Hmng Lyci Cari Lydi Ital Goth}=4 ] +[categories Nd 0E{DIGIT}=1 0F{DIGIT}=1 12{DIGIT}=66 14{DIGIT}=120 16{DIGIT}=95 18{DIGIT}=82 1A{DIGIT}=78 1C{DIGIT}=70 1E{DIGIT}=67 20{DIGIT}=68 22{DIGIT}=67 24{DIGIT}=67 ] [categories Nl 10{DIGIT}=18 11{DIGIT}=48 12{DIGIT}=1 14{DIGIT}=12 16{DIGIT}=16 18{DIGIT}=16 1A{DIGIT}=17 1C{DIGIT}=18 1E{DIGIT}=10 20{DIGIT}=10 22{DIGIT}=9 24{DIGIT}=11 76{Runr Hung Orkh}=3 77{Vaii Bamu Bass Mend Adlm}=10 7A{Bopo Yiii Lisu Plrd Wara Pauc Hmng Lyci Cari Lydi Ital Goth}=2 ] [categories No 10{DIGIT}=113 11{DIGIT}=174 12{DIGIT}=7 14{DIGIT}=47 16{DIGIT}=28 18{DIGIT}=27 1A{DIGIT}=24 1C{DIGIT}=23 1E{DIGIT}=17 20{DIGIT}=17 22{DIGIT}=17 24{DIGIT}=16 ] [categories Pc 05{PUNCTUATION}=7 0A{PUNCTUATION}=3 ] -[categories Pd 05{PUNCTUATION}=22 0A{PUNCTUATION}=2 ] +[categories Pd 05{PUNCTUATION}=22 0A{PUNCTUATION}=1 0B{PUNCTUATION}=1 ] [categories Pe 09{PUNCTUATION}=42 0A{PUNCTUATION}=31 ] [categories Pf 09{PUNCTUATION}=4 0A{PUNCTUATION}=6 ] [categories Pi 05{PUNCTUATION}=1 09{PUNCTUATION}=6 0A{PUNCTUATION}=6 ] -[categories Po 05{PUNCTUATION}=6 06{PUNCTUATION}=4 07{PUNCTUATION}=105 08{PUNCTUATION}=8 09{PUNCTUATION}=148 0A{PUNCTUATION}=87 0B{PUNCTUATION}=179 ] +[categories Po 05{PUNCTUATION}=6 06{PUNCTUATION}=4 07{PUNCTUATION}=106 08{PUNCTUATION}=8 09{PUNCTUATION}=148 0A{PUNCTUATION}=88 0B{PUNCTUATION}=199 ] [categories Ps 09{PUNCTUATION}=184 0A{PUNCTUATION}=40 ] -[categories Sc 0D{CURRENCY}=52 ] +[categories Sc 0D{CURRENCY}=53 ] [categories Sk 0C{SYMBOL}=87 0D{CURRENCY}=5 ] [categories Sm 0C{SYMBOL}=947 ] -[categories So 0C{SYMBOL}=2771 0D{CURRENCY}=1913 14{DIGIT}=1 16{DIGIT}=3 18{DIGIT}=1 1A{DIGIT}=1 1C{DIGIT}=1 1E{DIGIT}=1 20{DIGIT}=1 22{DIGIT}=1 28{Latn}=77 29{Latn}=77 2A{Latn}=77 2B{Latn}=77 2C{Latn}=77 2D{Latn}=77 2E{Latn}=77 2F{Latn}=77 30{Latn}=77 31{Latn}=77 32{Latn}=77 33{Latn}=77 34{Latn}=77 35{Latn}=77 36{Latn}=77 37{Latn}=77 38{Latn}=77 39{Latn}=77 3A{Latn}=77 3B{Latn}=77 3C{Latn}=77 3D{Latn}=77 3E{Latn}=77 3F{Latn}=77 40{Latn}=77 41{Latn}=77 42{Latn}=77 43{Latn}=77 44{Latn}=77 45{Latn}=77 46{Latn}=77 47{Latn}=77 48{Latn}=77 49{Latn}=77 4A{Latn}=77 4B{Latn}=77 4C{Latn}=77 4D{Latn}=77 4E{Latn}=77 4F{Latn}=77 50{Latn}=77 51{Latn}=77 52{Latn}=77 53{Latn}=77 54{Latn}=77 55{Latn}=77 56{Latn}=77 57{Latn}=77 58{Latn}=77 59{Latn}=77 5A{Latn}=77 5B{Latn}=77 5C{Latn}=77 65{Arab}=2 74{Batk Rjng Kali Mymr Cakm Khmr Tale Talu Lana Cham Bali Java}=2 7B{Dsrt Shaw Dupl Osma Elba Aghb Sora Mroo Linb Lina Cprt Sarb Narb Avst Palm Nbat Hatr Armi Prti Phli Phlp Mani Ugar Xpeo Xsux Egyp}=1 E5{TRAILING}=1 E6{TRAILING}=1 E7{TRAILING}=1 E8{TRAILING}=1 E9{TRAILING}=1 EA{TRAILING}=1 EB{TRAILING}=1 EC{TRAILING}=1 ED{TRAILING}=1 EE{TRAILING}=1 EF{TRAILING}=1 ] +[categories So 0C{SYMBOL}=2772 0D{CURRENCY}=1990 14{DIGIT}=1 16{DIGIT}=3 18{DIGIT}=1 1A{DIGIT}=1 1C{DIGIT}=1 1E{DIGIT}=1 20{DIGIT}=1 22{DIGIT}=1 28{Latn}=77 29{Latn}=77 2A{Latn}=77 2B{Latn}=77 2C{Latn}=77 2D{Latn}=77 2E{Latn}=77 2F{Latn}=77 30{Latn}=77 31{Latn}=77 32{Latn}=77 33{Latn}=77 34{Latn}=77 35{Latn}=77 36{Latn}=77 37{Latn}=77 38{Latn}=77 39{Latn}=77 3A{Latn}=77 3B{Latn}=77 3C{Latn}=77 3D{Latn}=77 3E{Latn}=77 3F{Latn}=77 40{Latn}=77 41{Latn}=77 42{Latn}=77 43{Latn}=77 44{Latn}=77 45{Latn}=77 46{Latn}=77 47{Latn}=77 48{Latn}=77 49{Latn}=77 4A{Latn}=77 4B{Latn}=77 4C{Latn}=77 4D{Latn}=77 4E{Latn}=77 4F{Latn}=77 50{Latn}=77 51{Latn}=77 52{Latn}=77 53{Latn}=77 54{Latn}=77 55{Latn}=77 56{Latn}=77 57{Latn}=77 58{Latn}=77 59{Latn}=77 5A{Latn}=77 5B{Latn}=77 5C{Latn}=77 65{Arab}=2 75{Tale Talu Lana Cham Bali Java Mong Olck Cher Osge Cans Ogam}=2 7B{Dsrt Shaw Dupl Osma Elba Aghb Sora Mroo Linb Lina Cprt Sarb Narb Avst Palm Nbat Hatr Armi Prti Phli Phlp Mani Ugar Xpeo Xsux Egyp}=1 E5{TRAILING}=1 E6{TRAILING}=1 E7{TRAILING}=1 E8{TRAILING}=1 E9{TRAILING}=1 EA{TRAILING}=1 EB{TRAILING}=1 EC{TRAILING}=1 ED{TRAILING}=1 EE{TRAILING}=1 EF{TRAILING}=1 ] [categories Zl 03{SPACE}=1 ] [categories Zp 03{SPACE}=1 ] [categories Zs 03{SPACE}=1 04{SPACE}=17 05{PUNCTUATION}=6 0C{SYMBOL}=29 5F{Grek Copt}=1 ] diff --git a/Build/source/libs/icu/icu-src/source/data/unidata/NormalizationCorrections.txt b/Build/source/libs/icu/icu-src/source/data/unidata/NormalizationCorrections.txt index 836d29c1006..f7fc35e52c2 100644 --- a/Build/source/libs/icu/icu-src/source/data/unidata/NormalizationCorrections.txt +++ b/Build/source/libs/icu/icu-src/source/data/unidata/NormalizationCorrections.txt @@ -1,6 +1,6 @@ -# NormalizationCorrections-9.0.0.txt -# Date: 2016-01-21, 22:00:00 GMT [KW, LI] -# © 2016 Unicode®, Inc. +# NormalizationCorrections-10.0.0.txt +# Date: 2017-04-13, 01:00:00 GMT [KW, LI] +# © 2017 Unicode®, Inc. # For terms of use, see http://www.unicode.org/terms_of_use.html # # Unicode Character Database @@ -27,7 +27,7 @@ # # Currently this list has exactly six entries in it, one for the # typo found and corrected in Corrigendum #3, and five for -# the typos and misidentifications found and corrected in +# the typos and misidentifications found and corrected in # Corrigendum #4. All efforts # will be made to keep the entries limited to just those fixes. # @@ -37,7 +37,7 @@ # Field 2: Corrected decomposition # Field 3: Version of Unicode for which the correction was # entered into UnicodeData.txt, in n.n.n format. -# Comment: Indicates the Unicode Corrigendum which documents +# Comment: Indicates the Unicode Corrigendum which documents # the correction # # For more information, see UAX #15, Unicode Normalization Forms. diff --git a/Build/source/libs/icu/icu-src/source/data/unidata/NormalizationTest.txt b/Build/source/libs/icu/icu-src/source/data/unidata/NormalizationTest.txt index 8e5132670a4..08b1b337654 100644 --- a/Build/source/libs/icu/icu-src/source/data/unidata/NormalizationTest.txt +++ b/Build/source/libs/icu/icu-src/source/data/unidata/NormalizationTest.txt @@ -1,6 +1,6 @@ -# NormalizationTest-9.0.0.txt -# Date: 2016-04-04, 11:41:55 GMT -# © 2016 Unicode®, Inc. +# NormalizationTest-10.0.0.txt +# Date: 2017-03-08, 08:41:55 GMT +# © 2017 Unicode®, Inc. # Unicode and the Unicode Logo are registered trademarks of Unicode, Inc. in the U.S. and other countries. # For terms of use, see http://www.unicode.org/terms_of_use.html # @@ -17653,6 +17653,10 @@ FFEE;FFEE;FFEE;25CB;25CB; 0061 0CBC 3099 093C 0334 0062;0061 0334 0CBC 093C 3099 0062;0061 0334 0CBC 093C 3099 0062;0061 0334 0CBC 093C 3099 0062;0061 0334 0CBC 093C 3099 0062; 0061 05B0 094D 3099 0CCD 0062;0061 3099 094D 0CCD 05B0 0062;0061 3099 094D 0CCD 05B0 0062;0061 3099 094D 0CCD 05B0 0062;0061 3099 094D 0CCD 05B0 0062; 0061 0CCD 05B0 094D 3099 0062;0061 3099 0CCD 094D 05B0 0062;0061 3099 0CCD 094D 05B0 0062;0061 3099 0CCD 094D 05B0 0062;0061 3099 0CCD 094D 05B0 0062; +0061 05B0 094D 3099 0D3B 0062;0061 3099 094D 0D3B 05B0 0062;0061 3099 094D 0D3B 05B0 0062;0061 3099 094D 0D3B 05B0 0062;0061 3099 094D 0D3B 05B0 0062; +0061 0D3B 05B0 094D 3099 0062;0061 3099 0D3B 094D 05B0 0062;0061 3099 0D3B 094D 05B0 0062;0061 3099 0D3B 094D 05B0 0062;0061 3099 0D3B 094D 05B0 0062; +0061 05B0 094D 3099 0D3C 0062;0061 3099 094D 0D3C 05B0 0062;0061 3099 094D 0D3C 05B0 0062;0061 3099 094D 0D3C 05B0 0062;0061 3099 094D 0D3C 05B0 0062; +0061 0D3C 05B0 094D 3099 0062;0061 3099 0D3C 094D 05B0 0062;0061 3099 0D3C 094D 05B0 0062;0061 3099 0D3C 094D 05B0 0062;0061 3099 0D3C 094D 05B0 0062; 0061 05B0 094D 3099 0D4D 0062;0061 3099 094D 0D4D 05B0 0062;0061 3099 094D 0D4D 05B0 0062;0061 3099 094D 0D4D 05B0 0062;0061 3099 094D 0D4D 05B0 0062; 0061 0D4D 05B0 094D 3099 0062;0061 3099 0D4D 094D 05B0 0062;0061 3099 0D4D 094D 05B0 0062;0061 3099 0D4D 094D 05B0 0062;0061 3099 0D4D 094D 05B0 0062; 0061 05B0 094D 3099 0DCA 0062;0061 3099 094D 0DCA 05B0 0062;0061 3099 094D 0DCA 05B0 0062;0061 3099 094D 0DCA 05B0 0062;0061 3099 094D 0DCA 05B0 0062; @@ -17999,6 +18003,14 @@ FFEE;FFEE;FFEE;25CB;25CB; 0061 1DF4 0315 0300 05AE 0062;0061 05AE 1DF4 0300 0315 0062;0061 05AE 1DF4 0300 0315 0062;0061 05AE 1DF4 0300 0315 0062;0061 05AE 1DF4 0300 0315 0062; 0061 0315 0300 05AE 1DF5 0062;00E0 05AE 1DF5 0315 0062;0061 05AE 0300 1DF5 0315 0062;00E0 05AE 1DF5 0315 0062;0061 05AE 0300 1DF5 0315 0062; 0061 1DF5 0315 0300 05AE 0062;0061 05AE 1DF5 0300 0315 0062;0061 05AE 1DF5 0300 0315 0062;0061 05AE 1DF5 0300 0315 0062;0061 05AE 1DF5 0300 0315 0062; +0061 035C 0315 0300 1DF6 0062;00E0 0315 1DF6 035C 0062;0061 0300 0315 1DF6 035C 0062;00E0 0315 1DF6 035C 0062;0061 0300 0315 1DF6 035C 0062; +0061 1DF6 035C 0315 0300 0062;00E0 1DF6 0315 035C 0062;0061 0300 1DF6 0315 035C 0062;00E0 1DF6 0315 035C 0062;0061 0300 1DF6 0315 035C 0062; +0061 0300 05AE 1D16D 1DF7 0062;00E0 1D16D 05AE 1DF7 0062;0061 1D16D 05AE 1DF7 0300 0062;00E0 1D16D 05AE 1DF7 0062;0061 1D16D 05AE 1DF7 0300 0062; +0061 1DF7 0300 05AE 1D16D 0062;00E0 1D16D 1DF7 05AE 0062;0061 1D16D 1DF7 05AE 0300 0062;00E0 1D16D 1DF7 05AE 0062;0061 1D16D 1DF7 05AE 0300 0062; +0061 0300 05AE 1D16D 1DF8 0062;00E0 1D16D 05AE 1DF8 0062;0061 1D16D 05AE 1DF8 0300 0062;00E0 1D16D 05AE 1DF8 0062;0061 1D16D 05AE 1DF8 0300 0062; +0061 1DF8 0300 05AE 1D16D 0062;00E0 1D16D 1DF8 05AE 0062;0061 1D16D 1DF8 05AE 0300 0062;00E0 1D16D 1DF8 05AE 0062;0061 1D16D 1DF8 05AE 0300 0062; +0061 059A 0316 302A 1DF9 0062;0061 302A 0316 1DF9 059A 0062;0061 302A 0316 1DF9 059A 0062;0061 302A 0316 1DF9 059A 0062;0061 302A 0316 1DF9 059A 0062; +0061 1DF9 059A 0316 302A 0062;0061 302A 1DF9 0316 059A 0062;0061 302A 1DF9 0316 059A 0062;0061 302A 1DF9 0316 059A 0062;0061 302A 1DF9 0316 059A 0062; 0061 0315 0300 05AE 1DFB 0062;00E0 05AE 1DFB 0315 0062;0061 05AE 0300 1DFB 0315 0062;00E0 05AE 1DFB 0315 0062;0061 05AE 0300 1DFB 0315 0062; 0061 1DFB 0315 0300 05AE 0062;0061 05AE 1DFB 0300 0315 0062;0061 05AE 1DFB 0300 0315 0062;0061 05AE 1DFB 0300 0315 0062;0061 05AE 1DFB 0300 0315 0062; 0061 035D 035C 0315 1DFC 0062;0061 0315 035C 1DFC 035D 0062;0061 0315 035C 1DFC 035D 0062;0061 0315 035C 1DFC 035D 0062;0061 0315 035C 1DFC 035D 0062; @@ -18397,8 +18409,20 @@ FFEE;FFEE;FFEE;25CB;25CB; 0061 116B7 3099 093C 0334 0062;0061 0334 116B7 093C 3099 0062;0061 0334 116B7 093C 3099 0062;0061 0334 116B7 093C 3099 0062;0061 0334 116B7 093C 3099 0062; 0061 05B0 094D 3099 1172B 0062;0061 3099 094D 1172B 05B0 0062;0061 3099 094D 1172B 05B0 0062;0061 3099 094D 1172B 05B0 0062;0061 3099 094D 1172B 05B0 0062; 0061 1172B 05B0 094D 3099 0062;0061 3099 1172B 094D 05B0 0062;0061 3099 1172B 094D 05B0 0062;0061 3099 1172B 094D 05B0 0062;0061 3099 1172B 094D 05B0 0062; +0061 05B0 094D 3099 11A34 0062;0061 3099 094D 11A34 05B0 0062;0061 3099 094D 11A34 05B0 0062;0061 3099 094D 11A34 05B0 0062;0061 3099 094D 11A34 05B0 0062; +0061 11A34 05B0 094D 3099 0062;0061 3099 11A34 094D 05B0 0062;0061 3099 11A34 094D 05B0 0062;0061 3099 11A34 094D 05B0 0062;0061 3099 11A34 094D 05B0 0062; +0061 05B0 094D 3099 11A47 0062;0061 3099 094D 11A47 05B0 0062;0061 3099 094D 11A47 05B0 0062;0061 3099 094D 11A47 05B0 0062;0061 3099 094D 11A47 05B0 0062; +0061 11A47 05B0 094D 3099 0062;0061 3099 11A47 094D 05B0 0062;0061 3099 11A47 094D 05B0 0062;0061 3099 11A47 094D 05B0 0062;0061 3099 11A47 094D 05B0 0062; +0061 05B0 094D 3099 11A99 0062;0061 3099 094D 11A99 05B0 0062;0061 3099 094D 11A99 05B0 0062;0061 3099 094D 11A99 05B0 0062;0061 3099 094D 11A99 05B0 0062; +0061 11A99 05B0 094D 3099 0062;0061 3099 11A99 094D 05B0 0062;0061 3099 11A99 094D 05B0 0062;0061 3099 11A99 094D 05B0 0062;0061 3099 11A99 094D 05B0 0062; 0061 05B0 094D 3099 11C3F 0062;0061 3099 094D 11C3F 05B0 0062;0061 3099 094D 11C3F 05B0 0062;0061 3099 094D 11C3F 05B0 0062;0061 3099 094D 11C3F 05B0 0062; 0061 11C3F 05B0 094D 3099 0062;0061 3099 11C3F 094D 05B0 0062;0061 3099 11C3F 094D 05B0 0062;0061 3099 11C3F 094D 05B0 0062;0061 3099 11C3F 094D 05B0 0062; +0061 3099 093C 0334 11D42 0062;0061 0334 093C 11D42 3099 0062;0061 0334 093C 11D42 3099 0062;0061 0334 093C 11D42 3099 0062;0061 0334 093C 11D42 3099 0062; +0061 11D42 3099 093C 0334 0062;0061 0334 11D42 093C 3099 0062;0061 0334 11D42 093C 3099 0062;0061 0334 11D42 093C 3099 0062;0061 0334 11D42 093C 3099 0062; +0061 05B0 094D 3099 11D44 0062;0061 3099 094D 11D44 05B0 0062;0061 3099 094D 11D44 05B0 0062;0061 3099 094D 11D44 05B0 0062;0061 3099 094D 11D44 05B0 0062; +0061 11D44 05B0 094D 3099 0062;0061 3099 11D44 094D 05B0 0062;0061 3099 11D44 094D 05B0 0062;0061 3099 11D44 094D 05B0 0062;0061 3099 11D44 094D 05B0 0062; +0061 05B0 094D 3099 11D45 0062;0061 3099 094D 11D45 05B0 0062;0061 3099 094D 11D45 05B0 0062;0061 3099 094D 11D45 05B0 0062;0061 3099 094D 11D45 05B0 0062; +0061 11D45 05B0 094D 3099 0062;0061 3099 11D45 094D 05B0 0062;0061 3099 11D45 094D 05B0 0062;0061 3099 11D45 094D 05B0 0062;0061 3099 11D45 094D 05B0 0062; 0061 093C 0334 16AF0 0062;0061 0334 16AF0 093C 0062;0061 0334 16AF0 093C 0062;0061 0334 16AF0 093C 0062;0061 0334 16AF0 093C 0062; 0061 16AF0 093C 0334 0062;0061 16AF0 0334 093C 0062;0061 16AF0 0334 093C 0062;0061 16AF0 0334 093C 0062;0061 16AF0 0334 093C 0062; 0061 093C 0334 16AF1 0062;0061 0334 16AF1 093C 0062;0061 0334 16AF1 093C 0062;0061 0334 16AF1 093C 0062;0061 0334 16AF1 093C 0062; diff --git a/Build/source/libs/icu/icu-src/source/data/unidata/SpecialCasing.txt b/Build/source/libs/icu/icu-src/source/data/unidata/SpecialCasing.txt index b23fa7f7680..b9ba0d81c16 100644 --- a/Build/source/libs/icu/icu-src/source/data/unidata/SpecialCasing.txt +++ b/Build/source/libs/icu/icu-src/source/data/unidata/SpecialCasing.txt @@ -1,6 +1,6 @@ -# SpecialCasing-9.0.0.txt -# Date: 2016-03-02, 18:55:13 GMT -# © 2016 Unicode®, Inc. +# SpecialCasing-10.0.0.txt +# Date: 2017-04-14, 05:40:43 GMT +# © 2017 Unicode®, Inc. # Unicode and the Unicode Logo are registered trademarks of Unicode, Inc. in the U.S. and other countries. # For terms of use, see http://www.unicode.org/terms_of_use.html # @@ -197,7 +197,7 @@ FB17; FB17; 0544 056D; 0544 053D; # ARMENIAN SMALL LIGATURE MEN XEH # ================================================================================ # Conditional Mappings -# The remainder of this file provides conditional casing data used to produce +# The remainder of this file provides conditional casing data used to produce # full case mappings. # ================================================================================ # Language-Insensitive Mappings diff --git a/Build/source/libs/icu/icu-src/source/data/unidata/UCARules.txt b/Build/source/libs/icu/icu-src/source/data/unidata/UCARules.txt index 57dbcb2fceb..6591dc543de 100644 --- a/Build/source/libs/icu/icu-src/source/data/unidata/UCARules.txt +++ b/Build/source/libs/icu/icu-src/source/data/unidata/UCARules.txt @@ -1,12 +1,10 @@ # UCA_Rules_SHORT.txt -# Copyright (C) 2016 and later: Unicode, Inc. and others. -# License & terms of use: http://www.unicode.org/copyright.html -# Date: 2016-06-03, 18:30:56 GMT -# © 2016 Unicode®, Inc. +# Date: 2017-06-05, 23:16:51 GMT +# © 2017 Unicode®, Inc. # Unicode and the Unicode Logo are registered trademarks of Unicode, Inc. in the U.S. and other countries. # For terms of use, see http://www.unicode.org/terms_of_use.html -# UCA Version: 9.0.0 -# UCD Version: 9.0.0 +# UCA Version: 10.0.0 +# UCD Version: 10.0.0 # For a description of the format and usage, see # http://www.unicode.org/reports/tr35/tr35-collation.html#Root_Data_Files @@ -170,7 +168,7 @@ = ࣟ = ࣠ = ࣡ - = ࣢ + = '\u08E2' = ࣪ = ࣫ = ࣬ @@ -235,6 +233,7 @@ = ᳧ = ᳨ = ᳴ + = ᳷ = ᳸ = ᳹ = '\u200B' @@ -924,6 +923,9 @@ = ᷎ = ᷑ = ᷵ + = ᷶ + = ᷷ + = ᷸ = ᷻ = ᷾ = ⃰ @@ -979,6 +981,7 @@ = ᷂ = ᷏ = ᷐ + = ᷹ = ᷼ = ᷽ = ᷿ @@ -1115,15 +1118,18 @@ << ࣦ << ࣶ << ّ + = ૻ = 𑈷 <<< ‎ﹽ‎ <<< ‎ﹼ‎ <<< ‎ﱣ‎ / ٰ << ْ + = ૺ = 𑈾 <<< ‎ﹿ‎ <<< ‎ﹾ‎ << ٓ + = ૼ << ٔ << ٕ << ٟ @@ -1193,6 +1199,9 @@ = ় = ਼ = ઼ + = ૽ + = ૾ + = ૿ = ଼ = ಼ = ᬴ @@ -1209,6 +1218,8 @@ = 𑓃 = 𑗀 = 𑚷 + = 𑨳 + = 𑵂 << ऀ = ँ = ঁ @@ -1232,8 +1243,12 @@ = 𑒿 = 𑖼 = 𑙀 + = 𑨵 + = 𑨶 + = 𑨷 = 𑰼 = 𑲶 + = 𑵃 << ं = ং = ਂ @@ -1242,6 +1257,7 @@ = ஂ = ం = ಂ + = ഀ = ം = ං = ཾ @@ -1268,8 +1284,11 @@ = 𑖽 = 𑘽 = 𑚫 + = 𑨸 + = 𑪖 = 𑰽 = 𑲵 + = 𑵀 << ः = ঃ = ਃ @@ -1299,7 +1318,10 @@ = 𑖾 = 𑘾 = 𑚬 + = 𑨹 + = 𑪗 = 𑰾 + = 𑵁 << ੰ << ੱ << ᬃ @@ -1311,6 +1333,7 @@ << 𐨺 << 𑇋 << 𑇌 + << 𑪘 << ๎ << ็ << ่ @@ -1475,6 +1498,7 @@ < ⁏ < ⸵ < ꛶ + < ⹉ < ':' <<< : <<< ⩴ / ':=' @@ -2108,6 +2132,10 @@ < ⸞ < ⸟ < ⹄ + < ⹅ + < ⹆ + < ⹇ + < ⹈ < ꙾ < ՚ < ՛ @@ -2142,6 +2170,7 @@ < ꣹ < ꣺ < ꣼ + < ৽ < ૰ < ෴ < ๏ @@ -2172,6 +2201,22 @@ < ࿔ < ࿙ < ࿚ + < 𑨿 + < 𑩀 + < 𑩁 + < 𑩂 + < 𑩃 + < 𑩄 + < 𑩅 + < 𑩆 + < 𑪚 + < 𑪛 + < 𑪜 + < 𑪞 + < 𑪟 + < 𑪠 + < 𑪡 + < 𑪢 < 𑱰 < 𑱱 < ᰽ @@ -3212,6 +3257,7 @@ < ⏼ < ⏽ < ⏾ + < ⏿ < ␀ < ␁ < ␂ @@ -4667,6 +4713,7 @@ < ⯏ < ⯐ < ⯑ + < ⯒ < ⯬ < ⯭ < ⯮ @@ -5970,6 +6017,12 @@ < 🃳 < 🃴 < 🃵 + < 🉠 + < 🉡 + < 🉢 + < 🉣 + < 🉤 + < 🉥 < 🌀 < 🌁 < 🌂 @@ -6738,6 +6791,18 @@ < 🗽 < 🗾 < 🗿 + < 🤀 + < 🤁 + < 🤂 + < 🤃 + < 🤄 + < 🤅 + < 🤆 + < 🤇 + < 🤈 + < 🤉 + < 🤊 + < 🤋 < 🤐 < 🤑 < 🤒 @@ -6753,6 +6818,7 @@ < 🤜 < 🤝 < 🤞 + < 🤟 < 🤠 < 🤡 < 🤢 @@ -6761,7 +6827,17 @@ < 🤥 < 🤦 < 🤧 + < 🤨 + < 🤩 + < 🤪 + < 🤫 + < 🤬 + < 🤭 + < 🤮 + < 🤯 < 🤰 + < 🤱 + < 🤲 < 🤳 < 🤴 < 🤵 @@ -6786,6 +6862,7 @@ < 🥉 < 🥊 < 🥋 + < 🥌 < 🥐 < 🥑 < 🥒 @@ -6801,6 +6878,19 @@ < 🥜 < 🥝 < 🥞 + < 🥟 + < 🥠 + < 🥡 + < 🥢 + < 🥣 + < 🥤 + < 🥥 + < 🥦 + < 🥧 + < 🥨 + < 🥩 + < 🥪 + < 🥫 < 🦀 < 🦁 < 🦂 @@ -6819,7 +6909,36 @@ < 🦏 < 🦐 < 🦑 + < 🦒 + < 🦓 + < 🦔 + < 🦕 + < 🦖 + < 🦗 < 🧀 + < 🧐 + < 🧑 + < 🧒 + < 🧓 + < 🧔 + < 🧕 + < 🧖 + < 🧗 + < 🧘 + < 🧙 + < 🧚 + < 🧛 + < 🧜 + < 🧝 + < 🧞 + < 🧟 + < 🧠 + < 🧡 + < 🧢 + < 🧣 + < 🧤 + < 🧥 + < 🧦 < 😀 < 😁 < 😂 @@ -7031,6 +7150,8 @@ < 🛐 < 🛑 < 🛒 + < 🛓 + < 🛔 < 🛠 < 🛡 < 🛢 @@ -7051,6 +7172,8 @@ < 🛴 < 🛵 < 🛶 + < 🛷 + < 🛸 < 🜀 < 🜁 < 🜂 @@ -8018,6 +8141,7 @@ < 々 < 〻 < 𖿠 + < 𖿡 < 〱 <<< 〲 / ゙ < 〳 @@ -8079,6 +8203,7 @@ < ₼ < ₽ < ₾ + < ₿ < ₨ < ‎﷼‎ &[last regular] # TODO: digits & letters from here @@ -8488,6 +8613,7 @@ = 𑜰 = 𑣠 = 𑱐 + = 𑵐 = 𖩠 = 𖭐 = ‎𞥐‎ @@ -8589,6 +8715,7 @@ = 𑣡 = 𑱑 = 𑱚 + = 𑵑 = 𒐕 = 𒐞 = 𒐬 @@ -8761,6 +8888,7 @@ = 𑣢 = 𑱒 = 𑱛 + = 𑵒 = 𒐀 = 𒐖 = 𒐟 @@ -8897,6 +9025,7 @@ = 𑣣 = 𑱓 = 𑱜 + = 𑵓 = 𒐁 = 𒐈 = 𒐗 @@ -9019,6 +9148,7 @@ = 𑣤 = 𑱔 = 𑱝 + = 𑵔 = 𒐂 = 𒐉 = 𒐏 @@ -9142,6 +9272,7 @@ = 𑣥 = 𑱕 = 𑱞 + = 𑵕 = 𒐃 = 𒐊 = 𒐐 @@ -9243,6 +9374,7 @@ = 𑣦 = 𑱖 = 𑱟 + = 𑵖 = 𒐄 = 𒐋 = 𒐑 @@ -9336,6 +9468,7 @@ = 𑣧 = 𑱗 = 𑱠 + = 𑵗 = 𒐅 = 𒐌 = 𒐒 @@ -9431,6 +9564,7 @@ = 𑣨 = 𑱘 = 𑱡 + = 𑵘 = 𒐆 = 𒐍 = 𒐓 @@ -9524,6 +9658,7 @@ = 𑣩 = 𑱙 = 𑱢 + = 𑵙 = 𒐇 = 𒐎 = 𒐔 @@ -13921,6 +14056,17 @@ < ‎ܪ‎ < ‎ܫ‎ < ‎ܬ‎ + < ‎ࡠ‎ + < ‎ࡡ‎ + < ‎ࡢ‎ + < ‎ࡣ‎ + < ‎ࡤ‎ + < ‎ࡥ‎ + < ‎ࡦ‎ + < ‎ࡧ‎ + < ‎ࡨ‎ + < ‎ࡩ‎ + < ‎ࡪ‎ < ‎ࡀ‎ < ‎ࡁ‎ < ‎ࡂ‎ @@ -14719,6 +14865,7 @@ < ৌ < ্ < ৗ + < ৼ < ੴ < ੳ < ਉ @@ -15194,6 +15341,8 @@ < ൌ < ൗ < ് + <<< ഻ + = ഼ < අ < ආ < ඇ @@ -16171,6 +16320,67 @@ < 𑜝 < 𑜞 < 𑜟 + < 𑴀 + < 𑴁 + < 𑴂 + < 𑴃 + < 𑴄 + < 𑴅 + < 𑴆 + < 𑴈 + < 𑴉 + < 𑴋 + < 𑴌 + < 𑴍 + < 𑴎 + < 𑴏 + < 𑴐 + < 𑴑 + < 𑴒 + < 𑴓 + < 𑴔 + < 𑴕 + < 𑴖 + < 𑴗 + < 𑴘 + < 𑴙 + < 𑴚 + < 𑴛 + < 𑴜 + < 𑴝 + < 𑴞 + < 𑴟 + < 𑴠 + < 𑴡 + < 𑴢 + < 𑴣 + < 𑴤 + < 𑴥 + < 𑴦 + <<< 𑵆 + <<< 𑵇 + < 𑴧 + < 𑴨 + < 𑴩 + < 𑴪 + < 𑴫 + < 𑴬 + < 𑴭 + < 𑴮 + < 𑴯 + < 𑴰 + < 𑴱 + < 𑴲 + < 𑴳 + < 𑴴 + < 𑴵 + < 𑴶 + < 𑴺 + < 𑴼 + < 𑴽 + < 𑴿 + < 𑵄 + < 𑵅 < ᮃ <<< ᮺ < ᮄ @@ -16661,7 +16871,7 @@ < ཧ < ྷ < ཨ - <<< ༀ / ོ𑲵 + <<< ༀ / ོ𑵀 < ྸ < ྈ < ྍ @@ -16691,6 +16901,133 @@ < ོ < ཽ < ྄ + < 𑨋 + < 𑨲 + < 𑨌 + < 𑨍 + < 𑨎 + < 𑨏 + < 𑨐 + < 𑨑 + < 𑨒 + < 𑨓 + < 𑨔 + < 𑨕 + < 𑨖 + < 𑨗 + < 𑨘 + < 𑨙 + < 𑨚 + < 𑨛 + < 𑨜 + < 𑨝 + < 𑨞 + < 𑨟 + < 𑨠 + < 𑨡 + < 𑨢 + < 𑨣 + < 𑨤 + < 𑨥 + < 𑨦 + < 𑨧 + < 𑨨 + < 𑨩 + < 𑨪 + <<< 𑨻 + < 𑨫 + <<< 𑨺 + <<< 𑨼 + < 𑨬 + <<< 𑨽 + < 𑨭 + <<< 𑨾 + < 𑨮 + < 𑨯 + < 𑨰 + < 𑨱 + < 𑨀 + < 𑨁 + < 𑨂 + < 𑨃 + < 𑨄 + < 𑨅 + < 𑨆 + < 𑨇 + < 𑨈 + < 𑨉 + < 𑨊 + < 𑨴 + < 𑩇 + < 𑩐 + < 𑩑 + < 𑩒 + < 𑩓 + < 𑩙 + < 𑩚 + < 𑩔 + < 𑩖 + < 𑩕 + < 𑩗 + < 𑩘 + < 𑩛 + < 𑩜 + <<< 𑪊 + < 𑪃 + < 𑩝 + <<< 𑪋 + < 𑩞 + < 𑩟 + < 𑩠 + <<< 𑪌 + < 𑩡 + < 𑩢 + < 𑩣 + < 𑩤 + < 𑩥 + < 𑩦 + < 𑩧 + < 𑩨 + < 𑩩 + < 𑩪 + < 𑩫 + <<< 𑪍 + < 𑩬 + < 𑩭 + < 𑩮 + < 𑩯 + <<< 𑪎 + < 𑩰 + <<< 𑪏 + < 𑩱 + < 𑩲 + < 𑩳 + < 𑩴 + <<< 𑪐 + < 𑩵 + < 𑩶 + < 𑩷 + < 𑩸 + < 𑩹 + < 𑩺 + <<< 𑪕 + < 𑩻 + < 𑩼 + <<< 𑪆 + <<< 𑪑 + < 𑩽 + <<< 𑪇 + <<< 𑪒 + < 𑩾 + < 𑩿 + <<< 𑪈 + <<< 𑪓 + < 𑪀 + < 𑪁 + <<< 𑪉 + <<< 𑪔 + < 𑪂 + < 𑪙 < 𑱲 < 𑲒 < 𑱳 @@ -21276,7 +21613,6 @@ <<< ユ <<< ㋴ <<< ㍐ / あん - < 𛀁 < ょ <<< よ <<< ョ @@ -21336,6 +21672,292 @@ < ん <<< ン <<< ン + < 𛀂 + < 𛀃 + < 𛀄 + < 𛀅 + < 𛀆 + < 𛀇 + < 𛀈 + < 𛀉 + < 𛀊 + < 𛀋 + < 𛀌 + < 𛀍 + < 𛀎 + < 𛀁 + < 𛀏 + < 𛀐 + < 𛀑 + < 𛀒 + < 𛀓 + < 𛀔 + < 𛀕 + < 𛀖 + < 𛀗 + < 𛀘 + < 𛀙 + < 𛀚 + < 𛀛 + < 𛀜 + < 𛀝 + < 𛀞 + < 𛀟 + < 𛀠 + < 𛀡 + < 𛀢 + < 𛀣 + < 𛀤 + < 𛀥 + < 𛀦 + < 𛀧 + < 𛀨 + < 𛀩 + < 𛀪 + < 𛀫 + < 𛀬 + < 𛀭 + < 𛀮 + < 𛀯 + < 𛀰 + < 𛀱 + < 𛀲 + < 𛀳 + < 𛀴 + < 𛀵 + < 𛀶 + < 𛀷 + < 𛀸 + < 𛀹 + < 𛀺 + < 𛀻 + < 𛀼 + < 𛀽 + < 𛀾 + < 𛀿 + < 𛁀 + < 𛁁 + < 𛁂 + < 𛁃 + < 𛁄 + < 𛁅 + < 𛁆 + < 𛁇 + < 𛁈 + < 𛁉 + < 𛁊 + < 𛁋 + < 𛁌 + < 𛁍 + < 𛁎 + < 𛁏 + < 𛁐 + < 𛁑 + < 𛁒 + < 𛁓 + < 𛁔 + < 𛁕 + < 𛁖 + < 𛁗 + < 𛁘 + < 𛁙 + < 𛁚 + < 𛁛 + < 𛁜 + < 𛁝 + < 𛁞 + < 𛁟 + < 𛁠 + < 𛁡 + < 𛁢 + < 𛁣 + < 𛁤 + < 𛁥 + < 𛁦 + < 𛁧 + < 𛁨 + < 𛁩 + < 𛁪 + < 𛁫 + < 𛁬 + < 𛁭 + < 𛁮 + < 𛁯 + < 𛁰 + < 𛁱 + < 𛁲 + < 𛁳 + < 𛁴 + < 𛁵 + < 𛁶 + < 𛁷 + < 𛁸 + < 𛁹 + < 𛁺 + < 𛁻 + < 𛁼 + < 𛁽 + < 𛁾 + < 𛁿 + < 𛂀 + < 𛂁 + < 𛂂 + < 𛂃 + < 𛂄 + < 𛂅 + < 𛂆 + < 𛂇 + < 𛂈 + < 𛂉 + < 𛂊 + < 𛂋 + < 𛂌 + < 𛂍 + < 𛂎 + < 𛂏 + < 𛂐 + < 𛂑 + < 𛂒 + < 𛂓 + < 𛂔 + < 𛂕 + < 𛂖 + < 𛂗 + < 𛂘 + < 𛂙 + < 𛂚 + < 𛂛 + < 𛂜 + < 𛂝 + < 𛂞 + < 𛂟 + < 𛂠 + < 𛂡 + < 𛂢 + < 𛂣 + < 𛂤 + < 𛂥 + < 𛂦 + < 𛂧 + < 𛂨 + < 𛂩 + < 𛂪 + < 𛂫 + < 𛂬 + < 𛂭 + < 𛂮 + < 𛂯 + < 𛂰 + < 𛂱 + < 𛂲 + < 𛂳 + < 𛂴 + < 𛂵 + < 𛂶 + < 𛂷 + < 𛂸 + < 𛂹 + < 𛂺 + < 𛂻 + < 𛂼 + < 𛂽 + < 𛂾 + < 𛂿 + < 𛃀 + < 𛃁 + < 𛃂 + < 𛃃 + < 𛃄 + < 𛃅 + < 𛃆 + < 𛃇 + < 𛃈 + < 𛃉 + < 𛃊 + < 𛃋 + < 𛃌 + < 𛃍 + < 𛃎 + < 𛃏 + < 𛃐 + < 𛃑 + < 𛃒 + < 𛃓 + < 𛃔 + < 𛃕 + < 𛃖 + < 𛃗 + < 𛃘 + < 𛃙 + < 𛃚 + < 𛃛 + < 𛃜 + < 𛃝 + < 𛃞 + < 𛃟 + < 𛃠 + < 𛃡 + < 𛃢 + < 𛃣 + < 𛃤 + < 𛃥 + < 𛃦 + < 𛃧 + < 𛃨 + < 𛃩 + < 𛃪 + < 𛃫 + < 𛃬 + < 𛃭 + < 𛃮 + < 𛃯 + < 𛃰 + < 𛃱 + < 𛃲 + < 𛃳 + < 𛃴 + < 𛃵 + < 𛃶 + < 𛃷 + < 𛃸 + < 𛃹 + < 𛃺 + < 𛃻 + < 𛃼 + < 𛃽 + < 𛃾 + < 𛃿 + < 𛄀 + < 𛄁 + < 𛄂 + < 𛄃 + < 𛄄 + < 𛄅 + < 𛄆 + < 𛄇 + < 𛄈 + < 𛄉 + < 𛄊 + < 𛄋 + < 𛄌 + < 𛄍 + < 𛄎 + < 𛄏 + < 𛄐 + < 𛄑 + < 𛄒 + < 𛄓 + < 𛄔 + < 𛄕 + < 𛄖 + < 𛄗 + < 𛄘 + < 𛄙 + < 𛄚 + < 𛄛 + < 𛄜 + < 𛄝 + < 𛄞 < ㄅ << ㆠ < ㄆ @@ -21378,6 +22000,7 @@ << ㆧ < ㆦ < ㄜ + <<< ㄮ < ㄝ < ㆤ << ㆥ @@ -23096,6 +23719,9 @@ < 𐌜 < 𐌝 < 𐌞 + < 𐌭 + < 𐌮 + < 𐌯 < 𐌰 < 𐌱 < 𐌲 diff --git a/Build/source/libs/icu/icu-src/source/data/unidata/UnicodeData.txt b/Build/source/libs/icu/icu-src/source/data/unidata/UnicodeData.txt index a756976461b..d89c64f526a 100644 --- a/Build/source/libs/icu/icu-src/source/data/unidata/UnicodeData.txt +++ b/Build/source/libs/icu/icu-src/source/data/unidata/UnicodeData.txt @@ -2072,6 +2072,17 @@ 085A;MANDAIC VOCALIZATION MARK;Mn;220;NSM;;;;;N;;;;; 085B;MANDAIC GEMINATION MARK;Mn;220;NSM;;;;;N;;;;; 085E;MANDAIC PUNCTUATION;Po;0;R;;;;;N;;;;; +0860;SYRIAC LETTER MALAYALAM NGA;Lo;0;AL;;;;;N;;;;; +0861;SYRIAC LETTER MALAYALAM JA;Lo;0;AL;;;;;N;;;;; +0862;SYRIAC LETTER MALAYALAM NYA;Lo;0;AL;;;;;N;;;;; +0863;SYRIAC LETTER MALAYALAM TTA;Lo;0;AL;;;;;N;;;;; +0864;SYRIAC LETTER MALAYALAM NNA;Lo;0;AL;;;;;N;;;;; +0865;SYRIAC LETTER MALAYALAM NNNA;Lo;0;AL;;;;;N;;;;; +0866;SYRIAC LETTER MALAYALAM BHA;Lo;0;AL;;;;;N;;;;; +0867;SYRIAC LETTER MALAYALAM RA;Lo;0;AL;;;;;N;;;;; +0868;SYRIAC LETTER MALAYALAM LLA;Lo;0;AL;;;;;N;;;;; +0869;SYRIAC LETTER MALAYALAM LLLA;Lo;0;AL;;;;;N;;;;; +086A;SYRIAC LETTER MALAYALAM SSA;Lo;0;AL;;;;;N;;;;; 08A0;ARABIC LETTER BEH WITH SMALL V BELOW;Lo;0;AL;;;;;N;;;;; 08A1;ARABIC LETTER BEH WITH HAMZA ABOVE;Lo;0;AL;;;;;N;;;;; 08A2;ARABIC LETTER JEEM WITH TWO DOTS ABOVE;Lo;0;AL;;;;;N;;;;; @@ -2366,6 +2377,8 @@ 09F9;BENGALI CURRENCY DENOMINATOR SIXTEEN;No;0;L;;;;16;N;;;;; 09FA;BENGALI ISSHAR;So;0;L;;;;;N;;;;; 09FB;BENGALI GANDA MARK;Sc;0;ET;;;;;N;;;;; +09FC;BENGALI LETTER VEDIC ANUSVARA;Lo;0;L;;;;;N;;;;; +09FD;BENGALI ABBREVIATION SIGN;Po;0;L;;;;;N;;;;; 0A01;GURMUKHI SIGN ADAK BINDI;Mn;0;NSM;;;;;N;;;;; 0A02;GURMUKHI SIGN BINDI;Mn;0;NSM;;;;;N;;;;; 0A03;GURMUKHI SIGN VISARGA;Mc;0;L;;;;;N;;;;; @@ -2530,6 +2543,12 @@ 0AF0;GUJARATI ABBREVIATION SIGN;Po;0;L;;;;;N;;;;; 0AF1;GUJARATI RUPEE SIGN;Sc;0;ET;;;;;N;;;;; 0AF9;GUJARATI LETTER ZHA;Lo;0;L;;;;;N;;;;; +0AFA;GUJARATI SIGN SUKUN;Mn;0;NSM;;;;;N;;;;; +0AFB;GUJARATI SIGN SHADDA;Mn;0;NSM;;;;;N;;;;; +0AFC;GUJARATI SIGN MADDAH;Mn;0;NSM;;;;;N;;;;; +0AFD;GUJARATI SIGN THREE-DOT NUKTA ABOVE;Mn;0;NSM;;;;;N;;;;; +0AFE;GUJARATI SIGN CIRCLE NUKTA ABOVE;Mn;0;NSM;;;;;N;;;;; +0AFF;GUJARATI SIGN TWO-CIRCLE NUKTA ABOVE;Mn;0;NSM;;;;;N;;;;; 0B01;ORIYA SIGN CANDRABINDU;Mn;0;NSM;;;;;N;;;;; 0B02;ORIYA SIGN ANUSVARA;Mc;0;L;;;;;N;;;;; 0B03;ORIYA SIGN VISARGA;Mc;0;L;;;;;N;;;;; @@ -2876,6 +2895,7 @@ 0CEF;KANNADA DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; 0CF1;KANNADA SIGN JIHVAMULIYA;Lo;0;L;;;;;N;;;;; 0CF2;KANNADA SIGN UPADHMANIYA;Lo;0;L;;;;;N;;;;; +0D00;MALAYALAM SIGN COMBINING ANUSVARA ABOVE;Mn;0;NSM;;;;;N;;;;; 0D01;MALAYALAM SIGN CANDRABINDU;Mn;0;NSM;;;;;N;;;;; 0D02;MALAYALAM SIGN ANUSVARA;Mc;0;L;;;;;N;;;;; 0D03;MALAYALAM SIGN VISARGA;Mc;0;L;;;;;N;;;;; @@ -2931,6 +2951,8 @@ 0D38;MALAYALAM LETTER SA;Lo;0;L;;;;;N;;;;; 0D39;MALAYALAM LETTER HA;Lo;0;L;;;;;N;;;;; 0D3A;MALAYALAM LETTER TTTA;Lo;0;L;;;;;N;;;;; +0D3B;MALAYALAM SIGN VERTICAL BAR VIRAMA;Mn;9;NSM;;;;;N;;;;; +0D3C;MALAYALAM SIGN CIRCULAR VIRAMA;Mn;9;NSM;;;;;N;;;;; 0D3D;MALAYALAM SIGN AVAGRAHA;Lo;0;L;;;;;N;;;;; 0D3E;MALAYALAM VOWEL SIGN AA;Mc;0;L;;;;;N;;;;; 0D3F;MALAYALAM VOWEL SIGN I;Mc;0;L;;;;;N;;;;; @@ -6413,6 +6435,7 @@ 1CF4;VEDIC TONE CANDRA ABOVE;Mn;230;NSM;;;;;N;;;;; 1CF5;VEDIC SIGN JIHVAMULIYA;Lo;0;L;;;;;N;;;;; 1CF6;VEDIC SIGN UPADHMANIYA;Lo;0;L;;;;;N;;;;; +1CF7;VEDIC SIGN ATIKRAMA;Mc;0;L;;;;;N;;;;; 1CF8;VEDIC TONE RING ABOVE;Mn;230;NSM;;;;;N;;;;; 1CF9;VEDIC TONE DOUBLE RING ABOVE;Mn;230;NSM;;;;;N;;;;; 1D00;LATIN LETTER SMALL CAPITAL A;Ll;0;L;;;;;N;;;;; @@ -6661,6 +6684,10 @@ 1DF3;COMBINING LATIN SMALL LETTER O WITH DIAERESIS;Mn;230;NSM;;;;;N;;;;; 1DF4;COMBINING LATIN SMALL LETTER U WITH DIAERESIS;Mn;230;NSM;;;;;N;;;;; 1DF5;COMBINING UP TACK ABOVE;Mn;230;NSM;;;;;N;;;;; +1DF6;COMBINING KAVYKA ABOVE RIGHT;Mn;232;NSM;;;;;N;;;;; +1DF7;COMBINING KAVYKA ABOVE LEFT;Mn;228;NSM;;;;;N;;;;; +1DF8;COMBINING DOT ABOVE LEFT;Mn;228;NSM;;;;;N;;;;; +1DF9;COMBINING WIDE INVERTED BRIDGE BELOW;Mn;220;NSM;;;;;N;;;;; 1DFB;COMBINING DELETION MARK;Mn;230;NSM;;;;;N;;;;; 1DFC;COMBINING DOUBLE INVERTED BREVE BELOW;Mn;233;NSM;;;;;N;;;;; 1DFD;COMBINING ALMOST EQUAL TO BELOW;Mn;220;NSM;;;;;N;;;;; @@ -7339,6 +7366,7 @@ 20BC;MANAT SIGN;Sc;0;ET;;;;;N;;;;; 20BD;RUBLE SIGN;Sc;0;ET;;;;;N;;;;; 20BE;LARI SIGN;Sc;0;ET;;;;;N;;;;; +20BF;BITCOIN SIGN;Sc;0;ET;;;;;N;;;;; 20D0;COMBINING LEFT HARPOON ABOVE;Mn;230;NSM;;;;;N;NON-SPACING LEFT HARPOON ABOVE;;;; 20D1;COMBINING RIGHT HARPOON ABOVE;Mn;230;NSM;;;;;N;NON-SPACING RIGHT HARPOON ABOVE;;;; 20D2;COMBINING LONG VERTICAL LINE OVERLAY;Mn;1;NSM;;;;;N;NON-SPACING LONG VERTICAL BAR OVERLAY;;;; @@ -8135,6 +8163,7 @@ 23FC;POWER ON-OFF SYMBOL;So;0;ON;;;;;N;;;;; 23FD;POWER ON SYMBOL;So;0;ON;;;;;N;;;;; 23FE;POWER SLEEP SYMBOL;So;0;ON;;;;;N;;;;; +23FF;OBSERVER EYE SYMBOL;So;0;ON;;;;;N;;;;; 2400;SYMBOL FOR NULL;So;0;ON;;;;;N;GRAPHIC FOR NULL;;;; 2401;SYMBOL FOR START OF HEADING;So;0;ON;;;;;N;GRAPHIC FOR START OF HEADING;;;; 2402;SYMBOL FOR START OF TEXT;So;0;ON;;;;;N;GRAPHIC FOR START OF TEXT;;;; @@ -10083,6 +10112,7 @@ 2BCF;ROTATED WHITE FOUR POINTED CUSP;So;0;ON;;;;;N;;;;; 2BD0;SQUARE POSITION INDICATOR;So;0;ON;;;;;N;;;;; 2BD1;UNCERTAINTY SIGN;So;0;ON;;;;;N;;;;; +2BD2;GROUP MARK;So;0;ON;;;;;N;;;;; 2BEC;LEFTWARDS TWO-HEADED ARROW WITH TRIANGLE ARROWHEADS;So;0;ON;;;;;N;;;;; 2BED;UPWARDS TWO-HEADED ARROW WITH TRIANGLE ARROWHEADS;So;0;ON;;;;;N;;;;; 2BEE;RIGHTWARDS TWO-HEADED ARROW WITH TRIANGLE ARROWHEADS;So;0;ON;;;;;N;;;;; @@ -10615,6 +10645,11 @@ 2E42;DOUBLE LOW-REVERSED-9 QUOTATION MARK;Ps;0;ON;;;;;N;;;;; 2E43;DASH WITH LEFT UPTURN;Po;0;ON;;;;;N;;;;; 2E44;DOUBLE SUSPENSION MARK;Po;0;ON;;;;;N;;;;; +2E45;INVERTED LOW KAVYKA;Po;0;ON;;;;;N;;;;; +2E46;INVERTED LOW KAVYKA WITH KAVYKA ABOVE;Po;0;ON;;;;;N;;;;; +2E47;LOW KAVYKA;Po;0;ON;;;;;N;;;;; +2E48;LOW KAVYKA WITH DOT;Po;0;ON;;;;;N;;;;; +2E49;DOUBLE STACKED COMMA;Po;0;ON;;;;;N;;;;; 2E80;CJK RADICAL REPEAT;So;0;ON;;;;;N;;;;; 2E81;CJK RADICAL CLIFF;So;0;ON;;;;;N;;;;; 2E82;CJK RADICAL SECOND ONE;So;0;ON;;;;;N;;;;; @@ -11250,6 +11285,7 @@ 312B;BOPOMOFO LETTER NG;Lo;0;L;;;;;N;;;;; 312C;BOPOMOFO LETTER GN;Lo;0;L;;;;;N;;;;; 312D;BOPOMOFO LETTER IH;Lo;0;L;;;;;N;;;;; +312E;BOPOMOFO LETTER O WITH DOT ABOVE;Lo;0;L;;;;;N;;;;; 3131;HANGUL LETTER KIYEOK;Lo;0;L; 1100;;;;N;HANGUL LETTER GIYEOG;;;; 3132;HANGUL LETTER SSANGKIYEOK;Lo;0;L; 1101;;;;N;HANGUL LETTER SSANG GIYEOG;;;; 3133;HANGUL LETTER KIYEOK-SIOS;Lo;0;L; 11AA;;;;N;HANGUL LETTER GIYEOG SIOS;;;; @@ -12016,7 +12052,7 @@ 4DFE;HEXAGRAM FOR AFTER COMPLETION;So;0;ON;;;;;N;;;;; 4DFF;HEXAGRAM FOR BEFORE COMPLETION;So;0;ON;;;;;N;;;;; 4E00;;Lo;0;L;;;;;N;;;;; -9FD5;;Lo;0;L;;;;;N;;;;; +9FEA;;Lo;0;L;;;;;N;;;;; A000;YI SYLLABLE IT;Lo;0;L;;;;;N;;;;; A001;YI SYLLABLE IX;Lo;0;L;;;;;N;;;;; A002;YI SYLLABLE I;Lo;0;L;;;;;N;;;;; @@ -17093,6 +17129,9 @@ FFFD;REPLACEMENT CHARACTER;So;0;ON;;;;;N;;;;; 10321;OLD ITALIC NUMERAL FIVE;No;0;L;;;;5;N;;;;; 10322;OLD ITALIC NUMERAL TEN;No;0;L;;;;10;N;;;;; 10323;OLD ITALIC NUMERAL FIFTY;No;0;L;;;;50;N;;;;; +1032D;OLD ITALIC LETTER YE;Lo;0;L;;;;;N;;;;; +1032E;OLD ITALIC LETTER NORTHERN TSE;Lo;0;L;;;;;N;;;;; +1032F;OLD ITALIC LETTER SOUTHERN TSE;Lo;0;L;;;;;N;;;;; 10330;GOTHIC LETTER AHSA;Lo;0;L;;;;;N;;;;; 10331;GOTHIC LETTER BAIRKAN;Lo;0;L;;;;;N;;;;; 10332;GOTHIC LETTER GIBA;Lo;0;L;;;;;N;;;;; @@ -20068,6 +20107,158 @@ FFFD;REPLACEMENT CHARACTER;So;0;ON;;;;;N;;;;; 118F1;WARANG CITI NUMBER EIGHTY;No;0;L;;;;80;N;;;;; 118F2;WARANG CITI NUMBER NINETY;No;0;L;;;;90;N;;;;; 118FF;WARANG CITI OM;Lo;0;L;;;;;N;;;;; +11A00;ZANABAZAR SQUARE LETTER A;Lo;0;L;;;;;N;;;;; +11A01;ZANABAZAR SQUARE VOWEL SIGN I;Mn;0;NSM;;;;;N;;;;; +11A02;ZANABAZAR SQUARE VOWEL SIGN UE;Mn;0;NSM;;;;;N;;;;; +11A03;ZANABAZAR SQUARE VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;; +11A04;ZANABAZAR SQUARE VOWEL SIGN E;Mn;0;NSM;;;;;N;;;;; +11A05;ZANABAZAR SQUARE VOWEL SIGN OE;Mn;0;NSM;;;;;N;;;;; +11A06;ZANABAZAR SQUARE VOWEL SIGN O;Mn;0;NSM;;;;;N;;;;; +11A07;ZANABAZAR SQUARE VOWEL SIGN AI;Mc;0;L;;;;;N;;;;; +11A08;ZANABAZAR SQUARE VOWEL SIGN AU;Mc;0;L;;;;;N;;;;; +11A09;ZANABAZAR SQUARE VOWEL SIGN REVERSED I;Mn;0;NSM;;;;;N;;;;; +11A0A;ZANABAZAR SQUARE VOWEL LENGTH MARK;Mn;0;NSM;;;;;N;;;;; +11A0B;ZANABAZAR SQUARE LETTER KA;Lo;0;L;;;;;N;;;;; +11A0C;ZANABAZAR SQUARE LETTER KHA;Lo;0;L;;;;;N;;;;; +11A0D;ZANABAZAR SQUARE LETTER GA;Lo;0;L;;;;;N;;;;; +11A0E;ZANABAZAR SQUARE LETTER GHA;Lo;0;L;;;;;N;;;;; +11A0F;ZANABAZAR SQUARE LETTER NGA;Lo;0;L;;;;;N;;;;; +11A10;ZANABAZAR SQUARE LETTER CA;Lo;0;L;;;;;N;;;;; +11A11;ZANABAZAR SQUARE LETTER CHA;Lo;0;L;;;;;N;;;;; +11A12;ZANABAZAR SQUARE LETTER JA;Lo;0;L;;;;;N;;;;; +11A13;ZANABAZAR SQUARE LETTER NYA;Lo;0;L;;;;;N;;;;; +11A14;ZANABAZAR SQUARE LETTER TTA;Lo;0;L;;;;;N;;;;; +11A15;ZANABAZAR SQUARE LETTER TTHA;Lo;0;L;;;;;N;;;;; +11A16;ZANABAZAR SQUARE LETTER DDA;Lo;0;L;;;;;N;;;;; +11A17;ZANABAZAR SQUARE LETTER DDHA;Lo;0;L;;;;;N;;;;; +11A18;ZANABAZAR SQUARE LETTER NNA;Lo;0;L;;;;;N;;;;; +11A19;ZANABAZAR SQUARE LETTER TA;Lo;0;L;;;;;N;;;;; +11A1A;ZANABAZAR SQUARE LETTER THA;Lo;0;L;;;;;N;;;;; +11A1B;ZANABAZAR SQUARE LETTER DA;Lo;0;L;;;;;N;;;;; +11A1C;ZANABAZAR SQUARE LETTER DHA;Lo;0;L;;;;;N;;;;; +11A1D;ZANABAZAR SQUARE LETTER NA;Lo;0;L;;;;;N;;;;; +11A1E;ZANABAZAR SQUARE LETTER PA;Lo;0;L;;;;;N;;;;; +11A1F;ZANABAZAR SQUARE LETTER PHA;Lo;0;L;;;;;N;;;;; +11A20;ZANABAZAR SQUARE LETTER BA;Lo;0;L;;;;;N;;;;; +11A21;ZANABAZAR SQUARE LETTER BHA;Lo;0;L;;;;;N;;;;; +11A22;ZANABAZAR SQUARE LETTER MA;Lo;0;L;;;;;N;;;;; +11A23;ZANABAZAR SQUARE LETTER TSA;Lo;0;L;;;;;N;;;;; +11A24;ZANABAZAR SQUARE LETTER TSHA;Lo;0;L;;;;;N;;;;; +11A25;ZANABAZAR SQUARE LETTER DZA;Lo;0;L;;;;;N;;;;; +11A26;ZANABAZAR SQUARE LETTER DZHA;Lo;0;L;;;;;N;;;;; +11A27;ZANABAZAR SQUARE LETTER ZHA;Lo;0;L;;;;;N;;;;; +11A28;ZANABAZAR SQUARE LETTER ZA;Lo;0;L;;;;;N;;;;; +11A29;ZANABAZAR SQUARE LETTER -A;Lo;0;L;;;;;N;;;;; +11A2A;ZANABAZAR SQUARE LETTER YA;Lo;0;L;;;;;N;;;;; +11A2B;ZANABAZAR SQUARE LETTER RA;Lo;0;L;;;;;N;;;;; +11A2C;ZANABAZAR SQUARE LETTER LA;Lo;0;L;;;;;N;;;;; +11A2D;ZANABAZAR SQUARE LETTER VA;Lo;0;L;;;;;N;;;;; +11A2E;ZANABAZAR SQUARE LETTER SHA;Lo;0;L;;;;;N;;;;; +11A2F;ZANABAZAR SQUARE LETTER SSA;Lo;0;L;;;;;N;;;;; +11A30;ZANABAZAR SQUARE LETTER SA;Lo;0;L;;;;;N;;;;; +11A31;ZANABAZAR SQUARE LETTER HA;Lo;0;L;;;;;N;;;;; +11A32;ZANABAZAR SQUARE LETTER KSSA;Lo;0;L;;;;;N;;;;; +11A33;ZANABAZAR SQUARE FINAL CONSONANT MARK;Mn;0;NSM;;;;;N;;;;; +11A34;ZANABAZAR SQUARE SIGN VIRAMA;Mn;9;NSM;;;;;N;;;;; +11A35;ZANABAZAR SQUARE SIGN CANDRABINDU;Mn;0;NSM;;;;;N;;;;; +11A36;ZANABAZAR SQUARE SIGN CANDRABINDU WITH ORNAMENT;Mn;0;NSM;;;;;N;;;;; +11A37;ZANABAZAR SQUARE SIGN CANDRA WITH ORNAMENT;Mn;0;NSM;;;;;N;;;;; +11A38;ZANABAZAR SQUARE SIGN ANUSVARA;Mn;0;NSM;;;;;N;;;;; +11A39;ZANABAZAR SQUARE SIGN VISARGA;Mc;0;L;;;;;N;;;;; +11A3A;ZANABAZAR SQUARE CLUSTER-INITIAL LETTER RA;Lo;0;L;;;;;N;;;;; +11A3B;ZANABAZAR SQUARE CLUSTER-FINAL LETTER YA;Mn;0;NSM;;;;;N;;;;; +11A3C;ZANABAZAR SQUARE CLUSTER-FINAL LETTER RA;Mn;0;NSM;;;;;N;;;;; +11A3D;ZANABAZAR SQUARE CLUSTER-FINAL LETTER LA;Mn;0;NSM;;;;;N;;;;; +11A3E;ZANABAZAR SQUARE CLUSTER-FINAL LETTER VA;Mn;0;NSM;;;;;N;;;;; +11A3F;ZANABAZAR SQUARE INITIAL HEAD MARK;Po;0;L;;;;;N;;;;; +11A40;ZANABAZAR SQUARE CLOSING HEAD MARK;Po;0;L;;;;;N;;;;; +11A41;ZANABAZAR SQUARE MARK TSHEG;Po;0;L;;;;;N;;;;; +11A42;ZANABAZAR SQUARE MARK SHAD;Po;0;L;;;;;N;;;;; +11A43;ZANABAZAR SQUARE MARK DOUBLE SHAD;Po;0;L;;;;;N;;;;; +11A44;ZANABAZAR SQUARE MARK LONG TSHEG;Po;0;L;;;;;N;;;;; +11A45;ZANABAZAR SQUARE INITIAL DOUBLE-LINED HEAD MARK;Po;0;L;;;;;N;;;;; +11A46;ZANABAZAR SQUARE CLOSING DOUBLE-LINED HEAD MARK;Po;0;L;;;;;N;;;;; +11A47;ZANABAZAR SQUARE SUBJOINER;Mn;9;NSM;;;;;N;;;;; +11A50;SOYOMBO LETTER A;Lo;0;L;;;;;N;;;;; +11A51;SOYOMBO VOWEL SIGN I;Mn;0;NSM;;;;;N;;;;; +11A52;SOYOMBO VOWEL SIGN UE;Mn;0;NSM;;;;;N;;;;; +11A53;SOYOMBO VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;; +11A54;SOYOMBO VOWEL SIGN E;Mn;0;NSM;;;;;N;;;;; +11A55;SOYOMBO VOWEL SIGN O;Mn;0;NSM;;;;;N;;;;; +11A56;SOYOMBO VOWEL SIGN OE;Mn;0;NSM;;;;;N;;;;; +11A57;SOYOMBO VOWEL SIGN AI;Mc;0;L;;;;;N;;;;; +11A58;SOYOMBO VOWEL SIGN AU;Mc;0;L;;;;;N;;;;; +11A59;SOYOMBO VOWEL SIGN VOCALIC R;Mn;0;NSM;;;;;N;;;;; +11A5A;SOYOMBO VOWEL SIGN VOCALIC L;Mn;0;NSM;;;;;N;;;;; +11A5B;SOYOMBO VOWEL LENGTH MARK;Mn;0;NSM;;;;;N;;;;; +11A5C;SOYOMBO LETTER KA;Lo;0;L;;;;;N;;;;; +11A5D;SOYOMBO LETTER KHA;Lo;0;L;;;;;N;;;;; +11A5E;SOYOMBO LETTER GA;Lo;0;L;;;;;N;;;;; +11A5F;SOYOMBO LETTER GHA;Lo;0;L;;;;;N;;;;; +11A60;SOYOMBO LETTER NGA;Lo;0;L;;;;;N;;;;; +11A61;SOYOMBO LETTER CA;Lo;0;L;;;;;N;;;;; +11A62;SOYOMBO LETTER CHA;Lo;0;L;;;;;N;;;;; +11A63;SOYOMBO LETTER JA;Lo;0;L;;;;;N;;;;; +11A64;SOYOMBO LETTER JHA;Lo;0;L;;;;;N;;;;; +11A65;SOYOMBO LETTER NYA;Lo;0;L;;;;;N;;;;; +11A66;SOYOMBO LETTER TTA;Lo;0;L;;;;;N;;;;; +11A67;SOYOMBO LETTER TTHA;Lo;0;L;;;;;N;;;;; +11A68;SOYOMBO LETTER DDA;Lo;0;L;;;;;N;;;;; +11A69;SOYOMBO LETTER DDHA;Lo;0;L;;;;;N;;;;; +11A6A;SOYOMBO LETTER NNA;Lo;0;L;;;;;N;;;;; +11A6B;SOYOMBO LETTER TA;Lo;0;L;;;;;N;;;;; +11A6C;SOYOMBO LETTER THA;Lo;0;L;;;;;N;;;;; +11A6D;SOYOMBO LETTER DA;Lo;0;L;;;;;N;;;;; +11A6E;SOYOMBO LETTER DHA;Lo;0;L;;;;;N;;;;; +11A6F;SOYOMBO LETTER NA;Lo;0;L;;;;;N;;;;; +11A70;SOYOMBO LETTER PA;Lo;0;L;;;;;N;;;;; +11A71;SOYOMBO LETTER PHA;Lo;0;L;;;;;N;;;;; +11A72;SOYOMBO LETTER BA;Lo;0;L;;;;;N;;;;; +11A73;SOYOMBO LETTER BHA;Lo;0;L;;;;;N;;;;; +11A74;SOYOMBO LETTER MA;Lo;0;L;;;;;N;;;;; +11A75;SOYOMBO LETTER TSA;Lo;0;L;;;;;N;;;;; +11A76;SOYOMBO LETTER TSHA;Lo;0;L;;;;;N;;;;; +11A77;SOYOMBO LETTER DZA;Lo;0;L;;;;;N;;;;; +11A78;SOYOMBO LETTER ZHA;Lo;0;L;;;;;N;;;;; +11A79;SOYOMBO LETTER ZA;Lo;0;L;;;;;N;;;;; +11A7A;SOYOMBO LETTER -A;Lo;0;L;;;;;N;;;;; +11A7B;SOYOMBO LETTER YA;Lo;0;L;;;;;N;;;;; +11A7C;SOYOMBO LETTER RA;Lo;0;L;;;;;N;;;;; +11A7D;SOYOMBO LETTER LA;Lo;0;L;;;;;N;;;;; +11A7E;SOYOMBO LETTER VA;Lo;0;L;;;;;N;;;;; +11A7F;SOYOMBO LETTER SHA;Lo;0;L;;;;;N;;;;; +11A80;SOYOMBO LETTER SSA;Lo;0;L;;;;;N;;;;; +11A81;SOYOMBO LETTER SA;Lo;0;L;;;;;N;;;;; +11A82;SOYOMBO LETTER HA;Lo;0;L;;;;;N;;;;; +11A83;SOYOMBO LETTER KSSA;Lo;0;L;;;;;N;;;;; +11A86;SOYOMBO CLUSTER-INITIAL LETTER RA;Lo;0;L;;;;;N;;;;; +11A87;SOYOMBO CLUSTER-INITIAL LETTER LA;Lo;0;L;;;;;N;;;;; +11A88;SOYOMBO CLUSTER-INITIAL LETTER SHA;Lo;0;L;;;;;N;;;;; +11A89;SOYOMBO CLUSTER-INITIAL LETTER SA;Lo;0;L;;;;;N;;;;; +11A8A;SOYOMBO FINAL CONSONANT SIGN G;Mn;0;NSM;;;;;N;;;;; +11A8B;SOYOMBO FINAL CONSONANT SIGN K;Mn;0;NSM;;;;;N;;;;; +11A8C;SOYOMBO FINAL CONSONANT SIGN NG;Mn;0;NSM;;;;;N;;;;; +11A8D;SOYOMBO FINAL CONSONANT SIGN D;Mn;0;NSM;;;;;N;;;;; +11A8E;SOYOMBO FINAL CONSONANT SIGN N;Mn;0;NSM;;;;;N;;;;; +11A8F;SOYOMBO FINAL CONSONANT SIGN B;Mn;0;NSM;;;;;N;;;;; +11A90;SOYOMBO FINAL CONSONANT SIGN M;Mn;0;NSM;;;;;N;;;;; +11A91;SOYOMBO FINAL CONSONANT SIGN R;Mn;0;NSM;;;;;N;;;;; +11A92;SOYOMBO FINAL CONSONANT SIGN L;Mn;0;NSM;;;;;N;;;;; +11A93;SOYOMBO FINAL CONSONANT SIGN SH;Mn;0;NSM;;;;;N;;;;; +11A94;SOYOMBO FINAL CONSONANT SIGN S;Mn;0;NSM;;;;;N;;;;; +11A95;SOYOMBO FINAL CONSONANT SIGN -A;Mn;0;NSM;;;;;N;;;;; +11A96;SOYOMBO SIGN ANUSVARA;Mn;0;NSM;;;;;N;;;;; +11A97;SOYOMBO SIGN VISARGA;Mc;0;L;;;;;N;;;;; +11A98;SOYOMBO GEMINATION MARK;Mn;0;NSM;;;;;N;;;;; +11A99;SOYOMBO SUBJOINER;Mn;9;NSM;;;;;N;;;;; +11A9A;SOYOMBO MARK TSHEG;Po;0;L;;;;;N;;;;; +11A9B;SOYOMBO MARK SHAD;Po;0;L;;;;;N;;;;; +11A9C;SOYOMBO MARK DOUBLE SHAD;Po;0;L;;;;;N;;;;; +11A9E;SOYOMBO HEAD MARK WITH MOON AND SUN AND TRIPLE FLAME;Po;0;L;;;;;N;;;;; +11A9F;SOYOMBO HEAD MARK WITH MOON AND SUN AND FLAME;Po;0;L;;;;;N;;;;; +11AA0;SOYOMBO HEAD MARK WITH MOON AND SUN;Po;0;L;;;;;N;;;;; +11AA1;SOYOMBO TERMINAL MARK-1;Po;0;L;;;;;N;;;;; +11AA2;SOYOMBO TERMINAL MARK-2;Po;0;L;;;;;N;;;;; 11AC0;PAU CIN HAU LETTER PA;Lo;0;L;;;;;N;;;;; 11AC1;PAU CIN HAU LETTER KA;Lo;0;L;;;;;N;;;;; 11AC2;PAU CIN HAU LETTER LA;Lo;0;L;;;;;N;;;;; @@ -20290,6 +20481,81 @@ FFFD;REPLACEMENT CHARACTER;So;0;ON;;;;;N;;;;; 11CB4;MARCHEN VOWEL SIGN O;Mc;0;L;;;;;N;;;;; 11CB5;MARCHEN SIGN ANUSVARA;Mn;0;NSM;;;;;N;;;;; 11CB6;MARCHEN SIGN CANDRABINDU;Mn;0;NSM;;;;;N;;;;; +11D00;MASARAM GONDI LETTER A;Lo;0;L;;;;;N;;;;; +11D01;MASARAM GONDI LETTER AA;Lo;0;L;;;;;N;;;;; +11D02;MASARAM GONDI LETTER I;Lo;0;L;;;;;N;;;;; +11D03;MASARAM GONDI LETTER II;Lo;0;L;;;;;N;;;;; +11D04;MASARAM GONDI LETTER U;Lo;0;L;;;;;N;;;;; +11D05;MASARAM GONDI LETTER UU;Lo;0;L;;;;;N;;;;; +11D06;MASARAM GONDI LETTER E;Lo;0;L;;;;;N;;;;; +11D08;MASARAM GONDI LETTER AI;Lo;0;L;;;;;N;;;;; +11D09;MASARAM GONDI LETTER O;Lo;0;L;;;;;N;;;;; +11D0B;MASARAM GONDI LETTER AU;Lo;0;L;;;;;N;;;;; +11D0C;MASARAM GONDI LETTER KA;Lo;0;L;;;;;N;;;;; +11D0D;MASARAM GONDI LETTER KHA;Lo;0;L;;;;;N;;;;; +11D0E;MASARAM GONDI LETTER GA;Lo;0;L;;;;;N;;;;; +11D0F;MASARAM GONDI LETTER GHA;Lo;0;L;;;;;N;;;;; +11D10;MASARAM GONDI LETTER NGA;Lo;0;L;;;;;N;;;;; +11D11;MASARAM GONDI LETTER CA;Lo;0;L;;;;;N;;;;; +11D12;MASARAM GONDI LETTER CHA;Lo;0;L;;;;;N;;;;; +11D13;MASARAM GONDI LETTER JA;Lo;0;L;;;;;N;;;;; +11D14;MASARAM GONDI LETTER JHA;Lo;0;L;;;;;N;;;;; +11D15;MASARAM GONDI LETTER NYA;Lo;0;L;;;;;N;;;;; +11D16;MASARAM GONDI LETTER TTA;Lo;0;L;;;;;N;;;;; +11D17;MASARAM GONDI LETTER TTHA;Lo;0;L;;;;;N;;;;; +11D18;MASARAM GONDI LETTER DDA;Lo;0;L;;;;;N;;;;; +11D19;MASARAM GONDI LETTER DDHA;Lo;0;L;;;;;N;;;;; +11D1A;MASARAM GONDI LETTER NNA;Lo;0;L;;;;;N;;;;; +11D1B;MASARAM GONDI LETTER TA;Lo;0;L;;;;;N;;;;; +11D1C;MASARAM GONDI LETTER THA;Lo;0;L;;;;;N;;;;; +11D1D;MASARAM GONDI LETTER DA;Lo;0;L;;;;;N;;;;; +11D1E;MASARAM GONDI LETTER DHA;Lo;0;L;;;;;N;;;;; +11D1F;MASARAM GONDI LETTER NA;Lo;0;L;;;;;N;;;;; +11D20;MASARAM GONDI LETTER PA;Lo;0;L;;;;;N;;;;; +11D21;MASARAM GONDI LETTER PHA;Lo;0;L;;;;;N;;;;; +11D22;MASARAM GONDI LETTER BA;Lo;0;L;;;;;N;;;;; +11D23;MASARAM GONDI LETTER BHA;Lo;0;L;;;;;N;;;;; +11D24;MASARAM GONDI LETTER MA;Lo;0;L;;;;;N;;;;; +11D25;MASARAM GONDI LETTER YA;Lo;0;L;;;;;N;;;;; +11D26;MASARAM GONDI LETTER RA;Lo;0;L;;;;;N;;;;; +11D27;MASARAM GONDI LETTER LA;Lo;0;L;;;;;N;;;;; +11D28;MASARAM GONDI LETTER VA;Lo;0;L;;;;;N;;;;; +11D29;MASARAM GONDI LETTER SHA;Lo;0;L;;;;;N;;;;; +11D2A;MASARAM GONDI LETTER SSA;Lo;0;L;;;;;N;;;;; +11D2B;MASARAM GONDI LETTER SA;Lo;0;L;;;;;N;;;;; +11D2C;MASARAM GONDI LETTER HA;Lo;0;L;;;;;N;;;;; +11D2D;MASARAM GONDI LETTER LLA;Lo;0;L;;;;;N;;;;; +11D2E;MASARAM GONDI LETTER KSSA;Lo;0;L;;;;;N;;;;; +11D2F;MASARAM GONDI LETTER JNYA;Lo;0;L;;;;;N;;;;; +11D30;MASARAM GONDI LETTER TRA;Lo;0;L;;;;;N;;;;; +11D31;MASARAM GONDI VOWEL SIGN AA;Mn;0;NSM;;;;;N;;;;; +11D32;MASARAM GONDI VOWEL SIGN I;Mn;0;NSM;;;;;N;;;;; +11D33;MASARAM GONDI VOWEL SIGN II;Mn;0;NSM;;;;;N;;;;; +11D34;MASARAM GONDI VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;; +11D35;MASARAM GONDI VOWEL SIGN UU;Mn;0;NSM;;;;;N;;;;; +11D36;MASARAM GONDI VOWEL SIGN VOCALIC R;Mn;0;NSM;;;;;N;;;;; +11D3A;MASARAM GONDI VOWEL SIGN E;Mn;0;NSM;;;;;N;;;;; +11D3C;MASARAM GONDI VOWEL SIGN AI;Mn;0;NSM;;;;;N;;;;; +11D3D;MASARAM GONDI VOWEL SIGN O;Mn;0;NSM;;;;;N;;;;; +11D3F;MASARAM GONDI VOWEL SIGN AU;Mn;0;NSM;;;;;N;;;;; +11D40;MASARAM GONDI SIGN ANUSVARA;Mn;0;NSM;;;;;N;;;;; +11D41;MASARAM GONDI SIGN VISARGA;Mn;0;NSM;;;;;N;;;;; +11D42;MASARAM GONDI SIGN NUKTA;Mn;7;NSM;;;;;N;;;;; +11D43;MASARAM GONDI SIGN CANDRA;Mn;0;NSM;;;;;N;;;;; +11D44;MASARAM GONDI SIGN HALANTA;Mn;9;NSM;;;;;N;;;;; +11D45;MASARAM GONDI VIRAMA;Mn;9;NSM;;;;;N;;;;; +11D46;MASARAM GONDI REPHA;Lo;0;L;;;;;N;;;;; +11D47;MASARAM GONDI RA-KARA;Mn;0;NSM;;;;;N;;;;; +11D50;MASARAM GONDI DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; +11D51;MASARAM GONDI DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; +11D52;MASARAM GONDI DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; +11D53;MASARAM GONDI DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; +11D54;MASARAM GONDI DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; +11D55;MASARAM GONDI DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; +11D56;MASARAM GONDI DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; +11D57;MASARAM GONDI DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; +11D58;MASARAM GONDI DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; +11D59;MASARAM GONDI DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; 12000;CUNEIFORM SIGN A;Lo;0;L;;;;;N;;;;; 12001;CUNEIFORM SIGN A TIMES A;Lo;0;L;;;;;N;;;;; 12002;CUNEIFORM SIGN A TIMES BAD;Lo;0;L;;;;;N;;;;; @@ -24087,6 +24353,7 @@ FFFD;REPLACEMENT CHARACTER;So;0;ON;;;;;N;;;;; 16F9E;MIAO LETTER REFORMED TONE-6;Lm;0;L;;;;;N;;;;; 16F9F;MIAO LETTER REFORMED TONE-8;Lm;0;L;;;;;N;;;;; 16FE0;TANGUT ITERATION MARK;Lm;0;L;;;;;N;;;;; +16FE1;NUSHU ITERATION MARK;Lm;0;L;;;;;N;;;;; 17000;;Lo;0;L;;;;;N;;;;; 187EC;;Lo;0;L;;;;;N;;;;; 18800;TANGUT COMPONENT-001;Lo;0;L;;;;;N;;;;; @@ -24846,6 +25113,687 @@ FFFD;REPLACEMENT CHARACTER;So;0;ON;;;;;N;;;;; 18AF2;TANGUT COMPONENT-755;Lo;0;L;;;;;N;;;;; 1B000;KATAKANA LETTER ARCHAIC E;Lo;0;L;;;;;N;;;;; 1B001;HIRAGANA LETTER ARCHAIC YE;Lo;0;L;;;;;N;;;;; +1B002;HENTAIGANA LETTER A-1;Lo;0;L;;;;;N;;;;; +1B003;HENTAIGANA LETTER A-2;Lo;0;L;;;;;N;;;;; +1B004;HENTAIGANA LETTER A-3;Lo;0;L;;;;;N;;;;; +1B005;HENTAIGANA LETTER A-WO;Lo;0;L;;;;;N;;;;; +1B006;HENTAIGANA LETTER I-1;Lo;0;L;;;;;N;;;;; +1B007;HENTAIGANA LETTER I-2;Lo;0;L;;;;;N;;;;; +1B008;HENTAIGANA LETTER I-3;Lo;0;L;;;;;N;;;;; +1B009;HENTAIGANA LETTER I-4;Lo;0;L;;;;;N;;;;; +1B00A;HENTAIGANA LETTER U-1;Lo;0;L;;;;;N;;;;; +1B00B;HENTAIGANA LETTER U-2;Lo;0;L;;;;;N;;;;; +1B00C;HENTAIGANA LETTER U-3;Lo;0;L;;;;;N;;;;; +1B00D;HENTAIGANA LETTER U-4;Lo;0;L;;;;;N;;;;; +1B00E;HENTAIGANA LETTER U-5;Lo;0;L;;;;;N;;;;; +1B00F;HENTAIGANA LETTER E-2;Lo;0;L;;;;;N;;;;; +1B010;HENTAIGANA LETTER E-3;Lo;0;L;;;;;N;;;;; +1B011;HENTAIGANA LETTER E-4;Lo;0;L;;;;;N;;;;; +1B012;HENTAIGANA LETTER E-5;Lo;0;L;;;;;N;;;;; +1B013;HENTAIGANA LETTER E-6;Lo;0;L;;;;;N;;;;; +1B014;HENTAIGANA LETTER O-1;Lo;0;L;;;;;N;;;;; +1B015;HENTAIGANA LETTER O-2;Lo;0;L;;;;;N;;;;; +1B016;HENTAIGANA LETTER O-3;Lo;0;L;;;;;N;;;;; +1B017;HENTAIGANA LETTER KA-1;Lo;0;L;;;;;N;;;;; +1B018;HENTAIGANA LETTER KA-2;Lo;0;L;;;;;N;;;;; +1B019;HENTAIGANA LETTER KA-3;Lo;0;L;;;;;N;;;;; +1B01A;HENTAIGANA LETTER KA-4;Lo;0;L;;;;;N;;;;; +1B01B;HENTAIGANA LETTER KA-5;Lo;0;L;;;;;N;;;;; +1B01C;HENTAIGANA LETTER KA-6;Lo;0;L;;;;;N;;;;; +1B01D;HENTAIGANA LETTER KA-7;Lo;0;L;;;;;N;;;;; +1B01E;HENTAIGANA LETTER KA-8;Lo;0;L;;;;;N;;;;; +1B01F;HENTAIGANA LETTER KA-9;Lo;0;L;;;;;N;;;;; +1B020;HENTAIGANA LETTER KA-10;Lo;0;L;;;;;N;;;;; +1B021;HENTAIGANA LETTER KA-11;Lo;0;L;;;;;N;;;;; +1B022;HENTAIGANA LETTER KA-KE;Lo;0;L;;;;;N;;;;; +1B023;HENTAIGANA LETTER KI-1;Lo;0;L;;;;;N;;;;; +1B024;HENTAIGANA LETTER KI-2;Lo;0;L;;;;;N;;;;; +1B025;HENTAIGANA LETTER KI-3;Lo;0;L;;;;;N;;;;; +1B026;HENTAIGANA LETTER KI-4;Lo;0;L;;;;;N;;;;; +1B027;HENTAIGANA LETTER KI-5;Lo;0;L;;;;;N;;;;; +1B028;HENTAIGANA LETTER KI-6;Lo;0;L;;;;;N;;;;; +1B029;HENTAIGANA LETTER KI-7;Lo;0;L;;;;;N;;;;; +1B02A;HENTAIGANA LETTER KI-8;Lo;0;L;;;;;N;;;;; +1B02B;HENTAIGANA LETTER KU-1;Lo;0;L;;;;;N;;;;; +1B02C;HENTAIGANA LETTER KU-2;Lo;0;L;;;;;N;;;;; +1B02D;HENTAIGANA LETTER KU-3;Lo;0;L;;;;;N;;;;; +1B02E;HENTAIGANA LETTER KU-4;Lo;0;L;;;;;N;;;;; +1B02F;HENTAIGANA LETTER KU-5;Lo;0;L;;;;;N;;;;; +1B030;HENTAIGANA LETTER KU-6;Lo;0;L;;;;;N;;;;; +1B031;HENTAIGANA LETTER KU-7;Lo;0;L;;;;;N;;;;; +1B032;HENTAIGANA LETTER KE-1;Lo;0;L;;;;;N;;;;; +1B033;HENTAIGANA LETTER KE-2;Lo;0;L;;;;;N;;;;; +1B034;HENTAIGANA LETTER KE-3;Lo;0;L;;;;;N;;;;; +1B035;HENTAIGANA LETTER KE-4;Lo;0;L;;;;;N;;;;; +1B036;HENTAIGANA LETTER KE-5;Lo;0;L;;;;;N;;;;; +1B037;HENTAIGANA LETTER KE-6;Lo;0;L;;;;;N;;;;; +1B038;HENTAIGANA LETTER KO-1;Lo;0;L;;;;;N;;;;; +1B039;HENTAIGANA LETTER KO-2;Lo;0;L;;;;;N;;;;; +1B03A;HENTAIGANA LETTER KO-3;Lo;0;L;;;;;N;;;;; +1B03B;HENTAIGANA LETTER KO-KI;Lo;0;L;;;;;N;;;;; +1B03C;HENTAIGANA LETTER SA-1;Lo;0;L;;;;;N;;;;; +1B03D;HENTAIGANA LETTER SA-2;Lo;0;L;;;;;N;;;;; +1B03E;HENTAIGANA LETTER SA-3;Lo;0;L;;;;;N;;;;; +1B03F;HENTAIGANA LETTER SA-4;Lo;0;L;;;;;N;;;;; +1B040;HENTAIGANA LETTER SA-5;Lo;0;L;;;;;N;;;;; +1B041;HENTAIGANA LETTER SA-6;Lo;0;L;;;;;N;;;;; +1B042;HENTAIGANA LETTER SA-7;Lo;0;L;;;;;N;;;;; +1B043;HENTAIGANA LETTER SA-8;Lo;0;L;;;;;N;;;;; +1B044;HENTAIGANA LETTER SI-1;Lo;0;L;;;;;N;;;;; +1B045;HENTAIGANA LETTER SI-2;Lo;0;L;;;;;N;;;;; +1B046;HENTAIGANA LETTER SI-3;Lo;0;L;;;;;N;;;;; +1B047;HENTAIGANA LETTER SI-4;Lo;0;L;;;;;N;;;;; +1B048;HENTAIGANA LETTER SI-5;Lo;0;L;;;;;N;;;;; +1B049;HENTAIGANA LETTER SI-6;Lo;0;L;;;;;N;;;;; +1B04A;HENTAIGANA LETTER SU-1;Lo;0;L;;;;;N;;;;; +1B04B;HENTAIGANA LETTER SU-2;Lo;0;L;;;;;N;;;;; +1B04C;HENTAIGANA LETTER SU-3;Lo;0;L;;;;;N;;;;; +1B04D;HENTAIGANA LETTER SU-4;Lo;0;L;;;;;N;;;;; +1B04E;HENTAIGANA LETTER SU-5;Lo;0;L;;;;;N;;;;; +1B04F;HENTAIGANA LETTER SU-6;Lo;0;L;;;;;N;;;;; +1B050;HENTAIGANA LETTER SU-7;Lo;0;L;;;;;N;;;;; +1B051;HENTAIGANA LETTER SU-8;Lo;0;L;;;;;N;;;;; +1B052;HENTAIGANA LETTER SE-1;Lo;0;L;;;;;N;;;;; +1B053;HENTAIGANA LETTER SE-2;Lo;0;L;;;;;N;;;;; +1B054;HENTAIGANA LETTER SE-3;Lo;0;L;;;;;N;;;;; +1B055;HENTAIGANA LETTER SE-4;Lo;0;L;;;;;N;;;;; +1B056;HENTAIGANA LETTER SE-5;Lo;0;L;;;;;N;;;;; +1B057;HENTAIGANA LETTER SO-1;Lo;0;L;;;;;N;;;;; +1B058;HENTAIGANA LETTER SO-2;Lo;0;L;;;;;N;;;;; +1B059;HENTAIGANA LETTER SO-3;Lo;0;L;;;;;N;;;;; +1B05A;HENTAIGANA LETTER SO-4;Lo;0;L;;;;;N;;;;; +1B05B;HENTAIGANA LETTER SO-5;Lo;0;L;;;;;N;;;;; +1B05C;HENTAIGANA LETTER SO-6;Lo;0;L;;;;;N;;;;; +1B05D;HENTAIGANA LETTER SO-7;Lo;0;L;;;;;N;;;;; +1B05E;HENTAIGANA LETTER TA-1;Lo;0;L;;;;;N;;;;; +1B05F;HENTAIGANA LETTER TA-2;Lo;0;L;;;;;N;;;;; +1B060;HENTAIGANA LETTER TA-3;Lo;0;L;;;;;N;;;;; +1B061;HENTAIGANA LETTER TA-4;Lo;0;L;;;;;N;;;;; +1B062;HENTAIGANA LETTER TI-1;Lo;0;L;;;;;N;;;;; +1B063;HENTAIGANA LETTER TI-2;Lo;0;L;;;;;N;;;;; +1B064;HENTAIGANA LETTER TI-3;Lo;0;L;;;;;N;;;;; +1B065;HENTAIGANA LETTER TI-4;Lo;0;L;;;;;N;;;;; +1B066;HENTAIGANA LETTER TI-5;Lo;0;L;;;;;N;;;;; +1B067;HENTAIGANA LETTER TI-6;Lo;0;L;;;;;N;;;;; +1B068;HENTAIGANA LETTER TI-7;Lo;0;L;;;;;N;;;;; +1B069;HENTAIGANA LETTER TU-1;Lo;0;L;;;;;N;;;;; +1B06A;HENTAIGANA LETTER TU-2;Lo;0;L;;;;;N;;;;; +1B06B;HENTAIGANA LETTER TU-3;Lo;0;L;;;;;N;;;;; +1B06C;HENTAIGANA LETTER TU-4;Lo;0;L;;;;;N;;;;; +1B06D;HENTAIGANA LETTER TU-TO;Lo;0;L;;;;;N;;;;; +1B06E;HENTAIGANA LETTER TE-1;Lo;0;L;;;;;N;;;;; +1B06F;HENTAIGANA LETTER TE-2;Lo;0;L;;;;;N;;;;; +1B070;HENTAIGANA LETTER TE-3;Lo;0;L;;;;;N;;;;; +1B071;HENTAIGANA LETTER TE-4;Lo;0;L;;;;;N;;;;; +1B072;HENTAIGANA LETTER TE-5;Lo;0;L;;;;;N;;;;; +1B073;HENTAIGANA LETTER TE-6;Lo;0;L;;;;;N;;;;; +1B074;HENTAIGANA LETTER TE-7;Lo;0;L;;;;;N;;;;; +1B075;HENTAIGANA LETTER TE-8;Lo;0;L;;;;;N;;;;; +1B076;HENTAIGANA LETTER TE-9;Lo;0;L;;;;;N;;;;; +1B077;HENTAIGANA LETTER TO-1;Lo;0;L;;;;;N;;;;; +1B078;HENTAIGANA LETTER TO-2;Lo;0;L;;;;;N;;;;; +1B079;HENTAIGANA LETTER TO-3;Lo;0;L;;;;;N;;;;; +1B07A;HENTAIGANA LETTER TO-4;Lo;0;L;;;;;N;;;;; +1B07B;HENTAIGANA LETTER TO-5;Lo;0;L;;;;;N;;;;; +1B07C;HENTAIGANA LETTER TO-6;Lo;0;L;;;;;N;;;;; +1B07D;HENTAIGANA LETTER TO-RA;Lo;0;L;;;;;N;;;;; +1B07E;HENTAIGANA LETTER NA-1;Lo;0;L;;;;;N;;;;; +1B07F;HENTAIGANA LETTER NA-2;Lo;0;L;;;;;N;;;;; +1B080;HENTAIGANA LETTER NA-3;Lo;0;L;;;;;N;;;;; +1B081;HENTAIGANA LETTER NA-4;Lo;0;L;;;;;N;;;;; +1B082;HENTAIGANA LETTER NA-5;Lo;0;L;;;;;N;;;;; +1B083;HENTAIGANA LETTER NA-6;Lo;0;L;;;;;N;;;;; +1B084;HENTAIGANA LETTER NA-7;Lo;0;L;;;;;N;;;;; +1B085;HENTAIGANA LETTER NA-8;Lo;0;L;;;;;N;;;;; +1B086;HENTAIGANA LETTER NA-9;Lo;0;L;;;;;N;;;;; +1B087;HENTAIGANA LETTER NI-1;Lo;0;L;;;;;N;;;;; +1B088;HENTAIGANA LETTER NI-2;Lo;0;L;;;;;N;;;;; +1B089;HENTAIGANA LETTER NI-3;Lo;0;L;;;;;N;;;;; +1B08A;HENTAIGANA LETTER NI-4;Lo;0;L;;;;;N;;;;; +1B08B;HENTAIGANA LETTER NI-5;Lo;0;L;;;;;N;;;;; +1B08C;HENTAIGANA LETTER NI-6;Lo;0;L;;;;;N;;;;; +1B08D;HENTAIGANA LETTER NI-7;Lo;0;L;;;;;N;;;;; +1B08E;HENTAIGANA LETTER NI-TE;Lo;0;L;;;;;N;;;;; +1B08F;HENTAIGANA LETTER NU-1;Lo;0;L;;;;;N;;;;; +1B090;HENTAIGANA LETTER NU-2;Lo;0;L;;;;;N;;;;; +1B091;HENTAIGANA LETTER NU-3;Lo;0;L;;;;;N;;;;; +1B092;HENTAIGANA LETTER NE-1;Lo;0;L;;;;;N;;;;; +1B093;HENTAIGANA LETTER NE-2;Lo;0;L;;;;;N;;;;; +1B094;HENTAIGANA LETTER NE-3;Lo;0;L;;;;;N;;;;; +1B095;HENTAIGANA LETTER NE-4;Lo;0;L;;;;;N;;;;; +1B096;HENTAIGANA LETTER NE-5;Lo;0;L;;;;;N;;;;; +1B097;HENTAIGANA LETTER NE-6;Lo;0;L;;;;;N;;;;; +1B098;HENTAIGANA LETTER NE-KO;Lo;0;L;;;;;N;;;;; +1B099;HENTAIGANA LETTER NO-1;Lo;0;L;;;;;N;;;;; +1B09A;HENTAIGANA LETTER NO-2;Lo;0;L;;;;;N;;;;; +1B09B;HENTAIGANA LETTER NO-3;Lo;0;L;;;;;N;;;;; +1B09C;HENTAIGANA LETTER NO-4;Lo;0;L;;;;;N;;;;; +1B09D;HENTAIGANA LETTER NO-5;Lo;0;L;;;;;N;;;;; +1B09E;HENTAIGANA LETTER HA-1;Lo;0;L;;;;;N;;;;; +1B09F;HENTAIGANA LETTER HA-2;Lo;0;L;;;;;N;;;;; +1B0A0;HENTAIGANA LETTER HA-3;Lo;0;L;;;;;N;;;;; +1B0A1;HENTAIGANA LETTER HA-4;Lo;0;L;;;;;N;;;;; +1B0A2;HENTAIGANA LETTER HA-5;Lo;0;L;;;;;N;;;;; +1B0A3;HENTAIGANA LETTER HA-6;Lo;0;L;;;;;N;;;;; +1B0A4;HENTAIGANA LETTER HA-7;Lo;0;L;;;;;N;;;;; +1B0A5;HENTAIGANA LETTER HA-8;Lo;0;L;;;;;N;;;;; +1B0A6;HENTAIGANA LETTER HA-9;Lo;0;L;;;;;N;;;;; +1B0A7;HENTAIGANA LETTER HA-10;Lo;0;L;;;;;N;;;;; +1B0A8;HENTAIGANA LETTER HA-11;Lo;0;L;;;;;N;;;;; +1B0A9;HENTAIGANA LETTER HI-1;Lo;0;L;;;;;N;;;;; +1B0AA;HENTAIGANA LETTER HI-2;Lo;0;L;;;;;N;;;;; +1B0AB;HENTAIGANA LETTER HI-3;Lo;0;L;;;;;N;;;;; +1B0AC;HENTAIGANA LETTER HI-4;Lo;0;L;;;;;N;;;;; +1B0AD;HENTAIGANA LETTER HI-5;Lo;0;L;;;;;N;;;;; +1B0AE;HENTAIGANA LETTER HI-6;Lo;0;L;;;;;N;;;;; +1B0AF;HENTAIGANA LETTER HI-7;Lo;0;L;;;;;N;;;;; +1B0B0;HENTAIGANA LETTER HU-1;Lo;0;L;;;;;N;;;;; +1B0B1;HENTAIGANA LETTER HU-2;Lo;0;L;;;;;N;;;;; +1B0B2;HENTAIGANA LETTER HU-3;Lo;0;L;;;;;N;;;;; +1B0B3;HENTAIGANA LETTER HE-1;Lo;0;L;;;;;N;;;;; +1B0B4;HENTAIGANA LETTER HE-2;Lo;0;L;;;;;N;;;;; +1B0B5;HENTAIGANA LETTER HE-3;Lo;0;L;;;;;N;;;;; +1B0B6;HENTAIGANA LETTER HE-4;Lo;0;L;;;;;N;;;;; +1B0B7;HENTAIGANA LETTER HE-5;Lo;0;L;;;;;N;;;;; +1B0B8;HENTAIGANA LETTER HE-6;Lo;0;L;;;;;N;;;;; +1B0B9;HENTAIGANA LETTER HE-7;Lo;0;L;;;;;N;;;;; +1B0BA;HENTAIGANA LETTER HO-1;Lo;0;L;;;;;N;;;;; +1B0BB;HENTAIGANA LETTER HO-2;Lo;0;L;;;;;N;;;;; +1B0BC;HENTAIGANA LETTER HO-3;Lo;0;L;;;;;N;;;;; +1B0BD;HENTAIGANA LETTER HO-4;Lo;0;L;;;;;N;;;;; +1B0BE;HENTAIGANA LETTER HO-5;Lo;0;L;;;;;N;;;;; +1B0BF;HENTAIGANA LETTER HO-6;Lo;0;L;;;;;N;;;;; +1B0C0;HENTAIGANA LETTER HO-7;Lo;0;L;;;;;N;;;;; +1B0C1;HENTAIGANA LETTER HO-8;Lo;0;L;;;;;N;;;;; +1B0C2;HENTAIGANA LETTER MA-1;Lo;0;L;;;;;N;;;;; +1B0C3;HENTAIGANA LETTER MA-2;Lo;0;L;;;;;N;;;;; +1B0C4;HENTAIGANA LETTER MA-3;Lo;0;L;;;;;N;;;;; +1B0C5;HENTAIGANA LETTER MA-4;Lo;0;L;;;;;N;;;;; +1B0C6;HENTAIGANA LETTER MA-5;Lo;0;L;;;;;N;;;;; +1B0C7;HENTAIGANA LETTER MA-6;Lo;0;L;;;;;N;;;;; +1B0C8;HENTAIGANA LETTER MA-7;Lo;0;L;;;;;N;;;;; +1B0C9;HENTAIGANA LETTER MI-1;Lo;0;L;;;;;N;;;;; +1B0CA;HENTAIGANA LETTER MI-2;Lo;0;L;;;;;N;;;;; +1B0CB;HENTAIGANA LETTER MI-3;Lo;0;L;;;;;N;;;;; +1B0CC;HENTAIGANA LETTER MI-4;Lo;0;L;;;;;N;;;;; +1B0CD;HENTAIGANA LETTER MI-5;Lo;0;L;;;;;N;;;;; +1B0CE;HENTAIGANA LETTER MI-6;Lo;0;L;;;;;N;;;;; +1B0CF;HENTAIGANA LETTER MI-7;Lo;0;L;;;;;N;;;;; +1B0D0;HENTAIGANA LETTER MU-1;Lo;0;L;;;;;N;;;;; +1B0D1;HENTAIGANA LETTER MU-2;Lo;0;L;;;;;N;;;;; +1B0D2;HENTAIGANA LETTER MU-3;Lo;0;L;;;;;N;;;;; +1B0D3;HENTAIGANA LETTER MU-4;Lo;0;L;;;;;N;;;;; +1B0D4;HENTAIGANA LETTER ME-1;Lo;0;L;;;;;N;;;;; +1B0D5;HENTAIGANA LETTER ME-2;Lo;0;L;;;;;N;;;;; +1B0D6;HENTAIGANA LETTER ME-MA;Lo;0;L;;;;;N;;;;; +1B0D7;HENTAIGANA LETTER MO-1;Lo;0;L;;;;;N;;;;; +1B0D8;HENTAIGANA LETTER MO-2;Lo;0;L;;;;;N;;;;; +1B0D9;HENTAIGANA LETTER MO-3;Lo;0;L;;;;;N;;;;; +1B0DA;HENTAIGANA LETTER MO-4;Lo;0;L;;;;;N;;;;; +1B0DB;HENTAIGANA LETTER MO-5;Lo;0;L;;;;;N;;;;; +1B0DC;HENTAIGANA LETTER MO-6;Lo;0;L;;;;;N;;;;; +1B0DD;HENTAIGANA LETTER YA-1;Lo;0;L;;;;;N;;;;; +1B0DE;HENTAIGANA LETTER YA-2;Lo;0;L;;;;;N;;;;; +1B0DF;HENTAIGANA LETTER YA-3;Lo;0;L;;;;;N;;;;; +1B0E0;HENTAIGANA LETTER YA-4;Lo;0;L;;;;;N;;;;; +1B0E1;HENTAIGANA LETTER YA-5;Lo;0;L;;;;;N;;;;; +1B0E2;HENTAIGANA LETTER YA-YO;Lo;0;L;;;;;N;;;;; +1B0E3;HENTAIGANA LETTER YU-1;Lo;0;L;;;;;N;;;;; +1B0E4;HENTAIGANA LETTER YU-2;Lo;0;L;;;;;N;;;;; +1B0E5;HENTAIGANA LETTER YU-3;Lo;0;L;;;;;N;;;;; +1B0E6;HENTAIGANA LETTER YU-4;Lo;0;L;;;;;N;;;;; +1B0E7;HENTAIGANA LETTER YO-1;Lo;0;L;;;;;N;;;;; +1B0E8;HENTAIGANA LETTER YO-2;Lo;0;L;;;;;N;;;;; +1B0E9;HENTAIGANA LETTER YO-3;Lo;0;L;;;;;N;;;;; +1B0EA;HENTAIGANA LETTER YO-4;Lo;0;L;;;;;N;;;;; +1B0EB;HENTAIGANA LETTER YO-5;Lo;0;L;;;;;N;;;;; +1B0EC;HENTAIGANA LETTER YO-6;Lo;0;L;;;;;N;;;;; +1B0ED;HENTAIGANA LETTER RA-1;Lo;0;L;;;;;N;;;;; +1B0EE;HENTAIGANA LETTER RA-2;Lo;0;L;;;;;N;;;;; +1B0EF;HENTAIGANA LETTER RA-3;Lo;0;L;;;;;N;;;;; +1B0F0;HENTAIGANA LETTER RA-4;Lo;0;L;;;;;N;;;;; +1B0F1;HENTAIGANA LETTER RI-1;Lo;0;L;;;;;N;;;;; +1B0F2;HENTAIGANA LETTER RI-2;Lo;0;L;;;;;N;;;;; +1B0F3;HENTAIGANA LETTER RI-3;Lo;0;L;;;;;N;;;;; +1B0F4;HENTAIGANA LETTER RI-4;Lo;0;L;;;;;N;;;;; +1B0F5;HENTAIGANA LETTER RI-5;Lo;0;L;;;;;N;;;;; +1B0F6;HENTAIGANA LETTER RI-6;Lo;0;L;;;;;N;;;;; +1B0F7;HENTAIGANA LETTER RI-7;Lo;0;L;;;;;N;;;;; +1B0F8;HENTAIGANA LETTER RU-1;Lo;0;L;;;;;N;;;;; +1B0F9;HENTAIGANA LETTER RU-2;Lo;0;L;;;;;N;;;;; +1B0FA;HENTAIGANA LETTER RU-3;Lo;0;L;;;;;N;;;;; +1B0FB;HENTAIGANA LETTER RU-4;Lo;0;L;;;;;N;;;;; +1B0FC;HENTAIGANA LETTER RU-5;Lo;0;L;;;;;N;;;;; +1B0FD;HENTAIGANA LETTER RU-6;Lo;0;L;;;;;N;;;;; +1B0FE;HENTAIGANA LETTER RE-1;Lo;0;L;;;;;N;;;;; +1B0FF;HENTAIGANA LETTER RE-2;Lo;0;L;;;;;N;;;;; +1B100;HENTAIGANA LETTER RE-3;Lo;0;L;;;;;N;;;;; +1B101;HENTAIGANA LETTER RE-4;Lo;0;L;;;;;N;;;;; +1B102;HENTAIGANA LETTER RO-1;Lo;0;L;;;;;N;;;;; +1B103;HENTAIGANA LETTER RO-2;Lo;0;L;;;;;N;;;;; +1B104;HENTAIGANA LETTER RO-3;Lo;0;L;;;;;N;;;;; +1B105;HENTAIGANA LETTER RO-4;Lo;0;L;;;;;N;;;;; +1B106;HENTAIGANA LETTER RO-5;Lo;0;L;;;;;N;;;;; +1B107;HENTAIGANA LETTER RO-6;Lo;0;L;;;;;N;;;;; +1B108;HENTAIGANA LETTER WA-1;Lo;0;L;;;;;N;;;;; +1B109;HENTAIGANA LETTER WA-2;Lo;0;L;;;;;N;;;;; +1B10A;HENTAIGANA LETTER WA-3;Lo;0;L;;;;;N;;;;; +1B10B;HENTAIGANA LETTER WA-4;Lo;0;L;;;;;N;;;;; +1B10C;HENTAIGANA LETTER WA-5;Lo;0;L;;;;;N;;;;; +1B10D;HENTAIGANA LETTER WI-1;Lo;0;L;;;;;N;;;;; +1B10E;HENTAIGANA LETTER WI-2;Lo;0;L;;;;;N;;;;; +1B10F;HENTAIGANA LETTER WI-3;Lo;0;L;;;;;N;;;;; +1B110;HENTAIGANA LETTER WI-4;Lo;0;L;;;;;N;;;;; +1B111;HENTAIGANA LETTER WI-5;Lo;0;L;;;;;N;;;;; +1B112;HENTAIGANA LETTER WE-1;Lo;0;L;;;;;N;;;;; +1B113;HENTAIGANA LETTER WE-2;Lo;0;L;;;;;N;;;;; +1B114;HENTAIGANA LETTER WE-3;Lo;0;L;;;;;N;;;;; +1B115;HENTAIGANA LETTER WE-4;Lo;0;L;;;;;N;;;;; +1B116;HENTAIGANA LETTER WO-1;Lo;0;L;;;;;N;;;;; +1B117;HENTAIGANA LETTER WO-2;Lo;0;L;;;;;N;;;;; +1B118;HENTAIGANA LETTER WO-3;Lo;0;L;;;;;N;;;;; +1B119;HENTAIGANA LETTER WO-4;Lo;0;L;;;;;N;;;;; +1B11A;HENTAIGANA LETTER WO-5;Lo;0;L;;;;;N;;;;; +1B11B;HENTAIGANA LETTER WO-6;Lo;0;L;;;;;N;;;;; +1B11C;HENTAIGANA LETTER WO-7;Lo;0;L;;;;;N;;;;; +1B11D;HENTAIGANA LETTER N-MU-MO-1;Lo;0;L;;;;;N;;;;; +1B11E;HENTAIGANA LETTER N-MU-MO-2;Lo;0;L;;;;;N;;;;; +1B170;NUSHU CHARACTER-1B170;Lo;0;L;;;;;N;;;;; +1B171;NUSHU CHARACTER-1B171;Lo;0;L;;;;;N;;;;; +1B172;NUSHU CHARACTER-1B172;Lo;0;L;;;;;N;;;;; +1B173;NUSHU CHARACTER-1B173;Lo;0;L;;;;;N;;;;; +1B174;NUSHU CHARACTER-1B174;Lo;0;L;;;;;N;;;;; +1B175;NUSHU CHARACTER-1B175;Lo;0;L;;;;;N;;;;; +1B176;NUSHU CHARACTER-1B176;Lo;0;L;;;;;N;;;;; +1B177;NUSHU CHARACTER-1B177;Lo;0;L;;;;;N;;;;; +1B178;NUSHU CHARACTER-1B178;Lo;0;L;;;;;N;;;;; +1B179;NUSHU CHARACTER-1B179;Lo;0;L;;;;;N;;;;; +1B17A;NUSHU CHARACTER-1B17A;Lo;0;L;;;;;N;;;;; +1B17B;NUSHU CHARACTER-1B17B;Lo;0;L;;;;;N;;;;; +1B17C;NUSHU CHARACTER-1B17C;Lo;0;L;;;;;N;;;;; +1B17D;NUSHU CHARACTER-1B17D;Lo;0;L;;;;;N;;;;; +1B17E;NUSHU CHARACTER-1B17E;Lo;0;L;;;;;N;;;;; +1B17F;NUSHU CHARACTER-1B17F;Lo;0;L;;;;;N;;;;; +1B180;NUSHU CHARACTER-1B180;Lo;0;L;;;;;N;;;;; +1B181;NUSHU CHARACTER-1B181;Lo;0;L;;;;;N;;;;; +1B182;NUSHU CHARACTER-1B182;Lo;0;L;;;;;N;;;;; +1B183;NUSHU CHARACTER-1B183;Lo;0;L;;;;;N;;;;; +1B184;NUSHU CHARACTER-1B184;Lo;0;L;;;;;N;;;;; +1B185;NUSHU CHARACTER-1B185;Lo;0;L;;;;;N;;;;; +1B186;NUSHU CHARACTER-1B186;Lo;0;L;;;;;N;;;;; +1B187;NUSHU CHARACTER-1B187;Lo;0;L;;;;;N;;;;; +1B188;NUSHU CHARACTER-1B188;Lo;0;L;;;;;N;;;;; +1B189;NUSHU CHARACTER-1B189;Lo;0;L;;;;;N;;;;; +1B18A;NUSHU CHARACTER-1B18A;Lo;0;L;;;;;N;;;;; +1B18B;NUSHU CHARACTER-1B18B;Lo;0;L;;;;;N;;;;; +1B18C;NUSHU CHARACTER-1B18C;Lo;0;L;;;;;N;;;;; +1B18D;NUSHU CHARACTER-1B18D;Lo;0;L;;;;;N;;;;; +1B18E;NUSHU CHARACTER-1B18E;Lo;0;L;;;;;N;;;;; +1B18F;NUSHU CHARACTER-1B18F;Lo;0;L;;;;;N;;;;; +1B190;NUSHU CHARACTER-1B190;Lo;0;L;;;;;N;;;;; +1B191;NUSHU CHARACTER-1B191;Lo;0;L;;;;;N;;;;; +1B192;NUSHU CHARACTER-1B192;Lo;0;L;;;;;N;;;;; +1B193;NUSHU CHARACTER-1B193;Lo;0;L;;;;;N;;;;; +1B194;NUSHU CHARACTER-1B194;Lo;0;L;;;;;N;;;;; +1B195;NUSHU CHARACTER-1B195;Lo;0;L;;;;;N;;;;; +1B196;NUSHU CHARACTER-1B196;Lo;0;L;;;;;N;;;;; +1B197;NUSHU CHARACTER-1B197;Lo;0;L;;;;;N;;;;; +1B198;NUSHU CHARACTER-1B198;Lo;0;L;;;;;N;;;;; +1B199;NUSHU CHARACTER-1B199;Lo;0;L;;;;;N;;;;; +1B19A;NUSHU CHARACTER-1B19A;Lo;0;L;;;;;N;;;;; +1B19B;NUSHU CHARACTER-1B19B;Lo;0;L;;;;;N;;;;; +1B19C;NUSHU CHARACTER-1B19C;Lo;0;L;;;;;N;;;;; +1B19D;NUSHU CHARACTER-1B19D;Lo;0;L;;;;;N;;;;; +1B19E;NUSHU CHARACTER-1B19E;Lo;0;L;;;;;N;;;;; +1B19F;NUSHU CHARACTER-1B19F;Lo;0;L;;;;;N;;;;; +1B1A0;NUSHU CHARACTER-1B1A0;Lo;0;L;;;;;N;;;;; +1B1A1;NUSHU CHARACTER-1B1A1;Lo;0;L;;;;;N;;;;; +1B1A2;NUSHU CHARACTER-1B1A2;Lo;0;L;;;;;N;;;;; +1B1A3;NUSHU CHARACTER-1B1A3;Lo;0;L;;;;;N;;;;; +1B1A4;NUSHU CHARACTER-1B1A4;Lo;0;L;;;;;N;;;;; +1B1A5;NUSHU CHARACTER-1B1A5;Lo;0;L;;;;;N;;;;; +1B1A6;NUSHU CHARACTER-1B1A6;Lo;0;L;;;;;N;;;;; +1B1A7;NUSHU CHARACTER-1B1A7;Lo;0;L;;;;;N;;;;; +1B1A8;NUSHU CHARACTER-1B1A8;Lo;0;L;;;;;N;;;;; +1B1A9;NUSHU CHARACTER-1B1A9;Lo;0;L;;;;;N;;;;; +1B1AA;NUSHU CHARACTER-1B1AA;Lo;0;L;;;;;N;;;;; +1B1AB;NUSHU CHARACTER-1B1AB;Lo;0;L;;;;;N;;;;; +1B1AC;NUSHU CHARACTER-1B1AC;Lo;0;L;;;;;N;;;;; +1B1AD;NUSHU CHARACTER-1B1AD;Lo;0;L;;;;;N;;;;; +1B1AE;NUSHU CHARACTER-1B1AE;Lo;0;L;;;;;N;;;;; +1B1AF;NUSHU CHARACTER-1B1AF;Lo;0;L;;;;;N;;;;; +1B1B0;NUSHU CHARACTER-1B1B0;Lo;0;L;;;;;N;;;;; +1B1B1;NUSHU CHARACTER-1B1B1;Lo;0;L;;;;;N;;;;; +1B1B2;NUSHU CHARACTER-1B1B2;Lo;0;L;;;;;N;;;;; +1B1B3;NUSHU CHARACTER-1B1B3;Lo;0;L;;;;;N;;;;; +1B1B4;NUSHU CHARACTER-1B1B4;Lo;0;L;;;;;N;;;;; +1B1B5;NUSHU CHARACTER-1B1B5;Lo;0;L;;;;;N;;;;; +1B1B6;NUSHU CHARACTER-1B1B6;Lo;0;L;;;;;N;;;;; +1B1B7;NUSHU CHARACTER-1B1B7;Lo;0;L;;;;;N;;;;; +1B1B8;NUSHU CHARACTER-1B1B8;Lo;0;L;;;;;N;;;;; +1B1B9;NUSHU CHARACTER-1B1B9;Lo;0;L;;;;;N;;;;; +1B1BA;NUSHU CHARACTER-1B1BA;Lo;0;L;;;;;N;;;;; +1B1BB;NUSHU CHARACTER-1B1BB;Lo;0;L;;;;;N;;;;; +1B1BC;NUSHU CHARACTER-1B1BC;Lo;0;L;;;;;N;;;;; +1B1BD;NUSHU CHARACTER-1B1BD;Lo;0;L;;;;;N;;;;; +1B1BE;NUSHU CHARACTER-1B1BE;Lo;0;L;;;;;N;;;;; +1B1BF;NUSHU CHARACTER-1B1BF;Lo;0;L;;;;;N;;;;; +1B1C0;NUSHU CHARACTER-1B1C0;Lo;0;L;;;;;N;;;;; +1B1C1;NUSHU CHARACTER-1B1C1;Lo;0;L;;;;;N;;;;; +1B1C2;NUSHU CHARACTER-1B1C2;Lo;0;L;;;;;N;;;;; +1B1C3;NUSHU CHARACTER-1B1C3;Lo;0;L;;;;;N;;;;; +1B1C4;NUSHU CHARACTER-1B1C4;Lo;0;L;;;;;N;;;;; +1B1C5;NUSHU CHARACTER-1B1C5;Lo;0;L;;;;;N;;;;; +1B1C6;NUSHU CHARACTER-1B1C6;Lo;0;L;;;;;N;;;;; +1B1C7;NUSHU CHARACTER-1B1C7;Lo;0;L;;;;;N;;;;; +1B1C8;NUSHU CHARACTER-1B1C8;Lo;0;L;;;;;N;;;;; +1B1C9;NUSHU CHARACTER-1B1C9;Lo;0;L;;;;;N;;;;; +1B1CA;NUSHU CHARACTER-1B1CA;Lo;0;L;;;;;N;;;;; +1B1CB;NUSHU CHARACTER-1B1CB;Lo;0;L;;;;;N;;;;; +1B1CC;NUSHU CHARACTER-1B1CC;Lo;0;L;;;;;N;;;;; +1B1CD;NUSHU CHARACTER-1B1CD;Lo;0;L;;;;;N;;;;; +1B1CE;NUSHU CHARACTER-1B1CE;Lo;0;L;;;;;N;;;;; +1B1CF;NUSHU CHARACTER-1B1CF;Lo;0;L;;;;;N;;;;; +1B1D0;NUSHU CHARACTER-1B1D0;Lo;0;L;;;;;N;;;;; +1B1D1;NUSHU CHARACTER-1B1D1;Lo;0;L;;;;;N;;;;; +1B1D2;NUSHU CHARACTER-1B1D2;Lo;0;L;;;;;N;;;;; +1B1D3;NUSHU CHARACTER-1B1D3;Lo;0;L;;;;;N;;;;; +1B1D4;NUSHU CHARACTER-1B1D4;Lo;0;L;;;;;N;;;;; +1B1D5;NUSHU CHARACTER-1B1D5;Lo;0;L;;;;;N;;;;; +1B1D6;NUSHU CHARACTER-1B1D6;Lo;0;L;;;;;N;;;;; +1B1D7;NUSHU CHARACTER-1B1D7;Lo;0;L;;;;;N;;;;; +1B1D8;NUSHU CHARACTER-1B1D8;Lo;0;L;;;;;N;;;;; +1B1D9;NUSHU CHARACTER-1B1D9;Lo;0;L;;;;;N;;;;; +1B1DA;NUSHU CHARACTER-1B1DA;Lo;0;L;;;;;N;;;;; +1B1DB;NUSHU CHARACTER-1B1DB;Lo;0;L;;;;;N;;;;; +1B1DC;NUSHU CHARACTER-1B1DC;Lo;0;L;;;;;N;;;;; +1B1DD;NUSHU CHARACTER-1B1DD;Lo;0;L;;;;;N;;;;; +1B1DE;NUSHU CHARACTER-1B1DE;Lo;0;L;;;;;N;;;;; +1B1DF;NUSHU CHARACTER-1B1DF;Lo;0;L;;;;;N;;;;; +1B1E0;NUSHU CHARACTER-1B1E0;Lo;0;L;;;;;N;;;;; +1B1E1;NUSHU CHARACTER-1B1E1;Lo;0;L;;;;;N;;;;; +1B1E2;NUSHU CHARACTER-1B1E2;Lo;0;L;;;;;N;;;;; +1B1E3;NUSHU CHARACTER-1B1E3;Lo;0;L;;;;;N;;;;; +1B1E4;NUSHU CHARACTER-1B1E4;Lo;0;L;;;;;N;;;;; +1B1E5;NUSHU CHARACTER-1B1E5;Lo;0;L;;;;;N;;;;; +1B1E6;NUSHU CHARACTER-1B1E6;Lo;0;L;;;;;N;;;;; +1B1E7;NUSHU CHARACTER-1B1E7;Lo;0;L;;;;;N;;;;; +1B1E8;NUSHU CHARACTER-1B1E8;Lo;0;L;;;;;N;;;;; +1B1E9;NUSHU CHARACTER-1B1E9;Lo;0;L;;;;;N;;;;; +1B1EA;NUSHU CHARACTER-1B1EA;Lo;0;L;;;;;N;;;;; +1B1EB;NUSHU CHARACTER-1B1EB;Lo;0;L;;;;;N;;;;; +1B1EC;NUSHU CHARACTER-1B1EC;Lo;0;L;;;;;N;;;;; +1B1ED;NUSHU CHARACTER-1B1ED;Lo;0;L;;;;;N;;;;; +1B1EE;NUSHU CHARACTER-1B1EE;Lo;0;L;;;;;N;;;;; +1B1EF;NUSHU CHARACTER-1B1EF;Lo;0;L;;;;;N;;;;; +1B1F0;NUSHU CHARACTER-1B1F0;Lo;0;L;;;;;N;;;;; +1B1F1;NUSHU CHARACTER-1B1F1;Lo;0;L;;;;;N;;;;; +1B1F2;NUSHU CHARACTER-1B1F2;Lo;0;L;;;;;N;;;;; +1B1F3;NUSHU CHARACTER-1B1F3;Lo;0;L;;;;;N;;;;; +1B1F4;NUSHU CHARACTER-1B1F4;Lo;0;L;;;;;N;;;;; +1B1F5;NUSHU CHARACTER-1B1F5;Lo;0;L;;;;;N;;;;; +1B1F6;NUSHU CHARACTER-1B1F6;Lo;0;L;;;;;N;;;;; +1B1F7;NUSHU CHARACTER-1B1F7;Lo;0;L;;;;;N;;;;; +1B1F8;NUSHU CHARACTER-1B1F8;Lo;0;L;;;;;N;;;;; +1B1F9;NUSHU CHARACTER-1B1F9;Lo;0;L;;;;;N;;;;; +1B1FA;NUSHU CHARACTER-1B1FA;Lo;0;L;;;;;N;;;;; +1B1FB;NUSHU CHARACTER-1B1FB;Lo;0;L;;;;;N;;;;; +1B1FC;NUSHU CHARACTER-1B1FC;Lo;0;L;;;;;N;;;;; +1B1FD;NUSHU CHARACTER-1B1FD;Lo;0;L;;;;;N;;;;; +1B1FE;NUSHU CHARACTER-1B1FE;Lo;0;L;;;;;N;;;;; +1B1FF;NUSHU CHARACTER-1B1FF;Lo;0;L;;;;;N;;;;; +1B200;NUSHU CHARACTER-1B200;Lo;0;L;;;;;N;;;;; +1B201;NUSHU CHARACTER-1B201;Lo;0;L;;;;;N;;;;; +1B202;NUSHU CHARACTER-1B202;Lo;0;L;;;;;N;;;;; +1B203;NUSHU CHARACTER-1B203;Lo;0;L;;;;;N;;;;; +1B204;NUSHU CHARACTER-1B204;Lo;0;L;;;;;N;;;;; +1B205;NUSHU CHARACTER-1B205;Lo;0;L;;;;;N;;;;; +1B206;NUSHU CHARACTER-1B206;Lo;0;L;;;;;N;;;;; +1B207;NUSHU CHARACTER-1B207;Lo;0;L;;;;;N;;;;; +1B208;NUSHU CHARACTER-1B208;Lo;0;L;;;;;N;;;;; +1B209;NUSHU CHARACTER-1B209;Lo;0;L;;;;;N;;;;; +1B20A;NUSHU CHARACTER-1B20A;Lo;0;L;;;;;N;;;;; +1B20B;NUSHU CHARACTER-1B20B;Lo;0;L;;;;;N;;;;; +1B20C;NUSHU CHARACTER-1B20C;Lo;0;L;;;;;N;;;;; +1B20D;NUSHU CHARACTER-1B20D;Lo;0;L;;;;;N;;;;; +1B20E;NUSHU CHARACTER-1B20E;Lo;0;L;;;;;N;;;;; +1B20F;NUSHU CHARACTER-1B20F;Lo;0;L;;;;;N;;;;; +1B210;NUSHU CHARACTER-1B210;Lo;0;L;;;;;N;;;;; +1B211;NUSHU CHARACTER-1B211;Lo;0;L;;;;;N;;;;; +1B212;NUSHU CHARACTER-1B212;Lo;0;L;;;;;N;;;;; +1B213;NUSHU CHARACTER-1B213;Lo;0;L;;;;;N;;;;; +1B214;NUSHU CHARACTER-1B214;Lo;0;L;;;;;N;;;;; +1B215;NUSHU CHARACTER-1B215;Lo;0;L;;;;;N;;;;; +1B216;NUSHU CHARACTER-1B216;Lo;0;L;;;;;N;;;;; +1B217;NUSHU CHARACTER-1B217;Lo;0;L;;;;;N;;;;; +1B218;NUSHU CHARACTER-1B218;Lo;0;L;;;;;N;;;;; +1B219;NUSHU CHARACTER-1B219;Lo;0;L;;;;;N;;;;; +1B21A;NUSHU CHARACTER-1B21A;Lo;0;L;;;;;N;;;;; +1B21B;NUSHU CHARACTER-1B21B;Lo;0;L;;;;;N;;;;; +1B21C;NUSHU CHARACTER-1B21C;Lo;0;L;;;;;N;;;;; +1B21D;NUSHU CHARACTER-1B21D;Lo;0;L;;;;;N;;;;; +1B21E;NUSHU CHARACTER-1B21E;Lo;0;L;;;;;N;;;;; +1B21F;NUSHU CHARACTER-1B21F;Lo;0;L;;;;;N;;;;; +1B220;NUSHU CHARACTER-1B220;Lo;0;L;;;;;N;;;;; +1B221;NUSHU CHARACTER-1B221;Lo;0;L;;;;;N;;;;; +1B222;NUSHU CHARACTER-1B222;Lo;0;L;;;;;N;;;;; +1B223;NUSHU CHARACTER-1B223;Lo;0;L;;;;;N;;;;; +1B224;NUSHU CHARACTER-1B224;Lo;0;L;;;;;N;;;;; +1B225;NUSHU CHARACTER-1B225;Lo;0;L;;;;;N;;;;; +1B226;NUSHU CHARACTER-1B226;Lo;0;L;;;;;N;;;;; +1B227;NUSHU CHARACTER-1B227;Lo;0;L;;;;;N;;;;; +1B228;NUSHU CHARACTER-1B228;Lo;0;L;;;;;N;;;;; +1B229;NUSHU CHARACTER-1B229;Lo;0;L;;;;;N;;;;; +1B22A;NUSHU CHARACTER-1B22A;Lo;0;L;;;;;N;;;;; +1B22B;NUSHU CHARACTER-1B22B;Lo;0;L;;;;;N;;;;; +1B22C;NUSHU CHARACTER-1B22C;Lo;0;L;;;;;N;;;;; +1B22D;NUSHU CHARACTER-1B22D;Lo;0;L;;;;;N;;;;; +1B22E;NUSHU CHARACTER-1B22E;Lo;0;L;;;;;N;;;;; +1B22F;NUSHU CHARACTER-1B22F;Lo;0;L;;;;;N;;;;; +1B230;NUSHU CHARACTER-1B230;Lo;0;L;;;;;N;;;;; +1B231;NUSHU CHARACTER-1B231;Lo;0;L;;;;;N;;;;; +1B232;NUSHU CHARACTER-1B232;Lo;0;L;;;;;N;;;;; +1B233;NUSHU CHARACTER-1B233;Lo;0;L;;;;;N;;;;; +1B234;NUSHU CHARACTER-1B234;Lo;0;L;;;;;N;;;;; +1B235;NUSHU CHARACTER-1B235;Lo;0;L;;;;;N;;;;; +1B236;NUSHU CHARACTER-1B236;Lo;0;L;;;;;N;;;;; +1B237;NUSHU CHARACTER-1B237;Lo;0;L;;;;;N;;;;; +1B238;NUSHU CHARACTER-1B238;Lo;0;L;;;;;N;;;;; +1B239;NUSHU CHARACTER-1B239;Lo;0;L;;;;;N;;;;; +1B23A;NUSHU CHARACTER-1B23A;Lo;0;L;;;;;N;;;;; +1B23B;NUSHU CHARACTER-1B23B;Lo;0;L;;;;;N;;;;; +1B23C;NUSHU CHARACTER-1B23C;Lo;0;L;;;;;N;;;;; +1B23D;NUSHU CHARACTER-1B23D;Lo;0;L;;;;;N;;;;; +1B23E;NUSHU CHARACTER-1B23E;Lo;0;L;;;;;N;;;;; +1B23F;NUSHU CHARACTER-1B23F;Lo;0;L;;;;;N;;;;; +1B240;NUSHU CHARACTER-1B240;Lo;0;L;;;;;N;;;;; +1B241;NUSHU CHARACTER-1B241;Lo;0;L;;;;;N;;;;; +1B242;NUSHU CHARACTER-1B242;Lo;0;L;;;;;N;;;;; +1B243;NUSHU CHARACTER-1B243;Lo;0;L;;;;;N;;;;; +1B244;NUSHU CHARACTER-1B244;Lo;0;L;;;;;N;;;;; +1B245;NUSHU CHARACTER-1B245;Lo;0;L;;;;;N;;;;; +1B246;NUSHU CHARACTER-1B246;Lo;0;L;;;;;N;;;;; +1B247;NUSHU CHARACTER-1B247;Lo;0;L;;;;;N;;;;; +1B248;NUSHU CHARACTER-1B248;Lo;0;L;;;;;N;;;;; +1B249;NUSHU CHARACTER-1B249;Lo;0;L;;;;;N;;;;; +1B24A;NUSHU CHARACTER-1B24A;Lo;0;L;;;;;N;;;;; +1B24B;NUSHU CHARACTER-1B24B;Lo;0;L;;;;;N;;;;; +1B24C;NUSHU CHARACTER-1B24C;Lo;0;L;;;;;N;;;;; +1B24D;NUSHU CHARACTER-1B24D;Lo;0;L;;;;;N;;;;; +1B24E;NUSHU CHARACTER-1B24E;Lo;0;L;;;;;N;;;;; +1B24F;NUSHU CHARACTER-1B24F;Lo;0;L;;;;;N;;;;; +1B250;NUSHU CHARACTER-1B250;Lo;0;L;;;;;N;;;;; +1B251;NUSHU CHARACTER-1B251;Lo;0;L;;;;;N;;;;; +1B252;NUSHU CHARACTER-1B252;Lo;0;L;;;;;N;;;;; +1B253;NUSHU CHARACTER-1B253;Lo;0;L;;;;;N;;;;; +1B254;NUSHU CHARACTER-1B254;Lo;0;L;;;;;N;;;;; +1B255;NUSHU CHARACTER-1B255;Lo;0;L;;;;;N;;;;; +1B256;NUSHU CHARACTER-1B256;Lo;0;L;;;;;N;;;;; +1B257;NUSHU CHARACTER-1B257;Lo;0;L;;;;;N;;;;; +1B258;NUSHU CHARACTER-1B258;Lo;0;L;;;;;N;;;;; +1B259;NUSHU CHARACTER-1B259;Lo;0;L;;;;;N;;;;; +1B25A;NUSHU CHARACTER-1B25A;Lo;0;L;;;;;N;;;;; +1B25B;NUSHU CHARACTER-1B25B;Lo;0;L;;;;;N;;;;; +1B25C;NUSHU CHARACTER-1B25C;Lo;0;L;;;;;N;;;;; +1B25D;NUSHU CHARACTER-1B25D;Lo;0;L;;;;;N;;;;; +1B25E;NUSHU CHARACTER-1B25E;Lo;0;L;;;;;N;;;;; +1B25F;NUSHU CHARACTER-1B25F;Lo;0;L;;;;;N;;;;; +1B260;NUSHU CHARACTER-1B260;Lo;0;L;;;;;N;;;;; +1B261;NUSHU CHARACTER-1B261;Lo;0;L;;;;;N;;;;; +1B262;NUSHU CHARACTER-1B262;Lo;0;L;;;;;N;;;;; +1B263;NUSHU CHARACTER-1B263;Lo;0;L;;;;;N;;;;; +1B264;NUSHU CHARACTER-1B264;Lo;0;L;;;;;N;;;;; +1B265;NUSHU CHARACTER-1B265;Lo;0;L;;;;;N;;;;; +1B266;NUSHU CHARACTER-1B266;Lo;0;L;;;;;N;;;;; +1B267;NUSHU CHARACTER-1B267;Lo;0;L;;;;;N;;;;; +1B268;NUSHU CHARACTER-1B268;Lo;0;L;;;;;N;;;;; +1B269;NUSHU CHARACTER-1B269;Lo;0;L;;;;;N;;;;; +1B26A;NUSHU CHARACTER-1B26A;Lo;0;L;;;;;N;;;;; +1B26B;NUSHU CHARACTER-1B26B;Lo;0;L;;;;;N;;;;; +1B26C;NUSHU CHARACTER-1B26C;Lo;0;L;;;;;N;;;;; +1B26D;NUSHU CHARACTER-1B26D;Lo;0;L;;;;;N;;;;; +1B26E;NUSHU CHARACTER-1B26E;Lo;0;L;;;;;N;;;;; +1B26F;NUSHU CHARACTER-1B26F;Lo;0;L;;;;;N;;;;; +1B270;NUSHU CHARACTER-1B270;Lo;0;L;;;;;N;;;;; +1B271;NUSHU CHARACTER-1B271;Lo;0;L;;;;;N;;;;; +1B272;NUSHU CHARACTER-1B272;Lo;0;L;;;;;N;;;;; +1B273;NUSHU CHARACTER-1B273;Lo;0;L;;;;;N;;;;; +1B274;NUSHU CHARACTER-1B274;Lo;0;L;;;;;N;;;;; +1B275;NUSHU CHARACTER-1B275;Lo;0;L;;;;;N;;;;; +1B276;NUSHU CHARACTER-1B276;Lo;0;L;;;;;N;;;;; +1B277;NUSHU CHARACTER-1B277;Lo;0;L;;;;;N;;;;; +1B278;NUSHU CHARACTER-1B278;Lo;0;L;;;;;N;;;;; +1B279;NUSHU CHARACTER-1B279;Lo;0;L;;;;;N;;;;; +1B27A;NUSHU CHARACTER-1B27A;Lo;0;L;;;;;N;;;;; +1B27B;NUSHU CHARACTER-1B27B;Lo;0;L;;;;;N;;;;; +1B27C;NUSHU CHARACTER-1B27C;Lo;0;L;;;;;N;;;;; +1B27D;NUSHU CHARACTER-1B27D;Lo;0;L;;;;;N;;;;; +1B27E;NUSHU CHARACTER-1B27E;Lo;0;L;;;;;N;;;;; +1B27F;NUSHU CHARACTER-1B27F;Lo;0;L;;;;;N;;;;; +1B280;NUSHU CHARACTER-1B280;Lo;0;L;;;;;N;;;;; +1B281;NUSHU CHARACTER-1B281;Lo;0;L;;;;;N;;;;; +1B282;NUSHU CHARACTER-1B282;Lo;0;L;;;;;N;;;;; +1B283;NUSHU CHARACTER-1B283;Lo;0;L;;;;;N;;;;; +1B284;NUSHU CHARACTER-1B284;Lo;0;L;;;;;N;;;;; +1B285;NUSHU CHARACTER-1B285;Lo;0;L;;;;;N;;;;; +1B286;NUSHU CHARACTER-1B286;Lo;0;L;;;;;N;;;;; +1B287;NUSHU CHARACTER-1B287;Lo;0;L;;;;;N;;;;; +1B288;NUSHU CHARACTER-1B288;Lo;0;L;;;;;N;;;;; +1B289;NUSHU CHARACTER-1B289;Lo;0;L;;;;;N;;;;; +1B28A;NUSHU CHARACTER-1B28A;Lo;0;L;;;;;N;;;;; +1B28B;NUSHU CHARACTER-1B28B;Lo;0;L;;;;;N;;;;; +1B28C;NUSHU CHARACTER-1B28C;Lo;0;L;;;;;N;;;;; +1B28D;NUSHU CHARACTER-1B28D;Lo;0;L;;;;;N;;;;; +1B28E;NUSHU CHARACTER-1B28E;Lo;0;L;;;;;N;;;;; +1B28F;NUSHU CHARACTER-1B28F;Lo;0;L;;;;;N;;;;; +1B290;NUSHU CHARACTER-1B290;Lo;0;L;;;;;N;;;;; +1B291;NUSHU CHARACTER-1B291;Lo;0;L;;;;;N;;;;; +1B292;NUSHU CHARACTER-1B292;Lo;0;L;;;;;N;;;;; +1B293;NUSHU CHARACTER-1B293;Lo;0;L;;;;;N;;;;; +1B294;NUSHU CHARACTER-1B294;Lo;0;L;;;;;N;;;;; +1B295;NUSHU CHARACTER-1B295;Lo;0;L;;;;;N;;;;; +1B296;NUSHU CHARACTER-1B296;Lo;0;L;;;;;N;;;;; +1B297;NUSHU CHARACTER-1B297;Lo;0;L;;;;;N;;;;; +1B298;NUSHU CHARACTER-1B298;Lo;0;L;;;;;N;;;;; +1B299;NUSHU CHARACTER-1B299;Lo;0;L;;;;;N;;;;; +1B29A;NUSHU CHARACTER-1B29A;Lo;0;L;;;;;N;;;;; +1B29B;NUSHU CHARACTER-1B29B;Lo;0;L;;;;;N;;;;; +1B29C;NUSHU CHARACTER-1B29C;Lo;0;L;;;;;N;;;;; +1B29D;NUSHU CHARACTER-1B29D;Lo;0;L;;;;;N;;;;; +1B29E;NUSHU CHARACTER-1B29E;Lo;0;L;;;;;N;;;;; +1B29F;NUSHU CHARACTER-1B29F;Lo;0;L;;;;;N;;;;; +1B2A0;NUSHU CHARACTER-1B2A0;Lo;0;L;;;;;N;;;;; +1B2A1;NUSHU CHARACTER-1B2A1;Lo;0;L;;;;;N;;;;; +1B2A2;NUSHU CHARACTER-1B2A2;Lo;0;L;;;;;N;;;;; +1B2A3;NUSHU CHARACTER-1B2A3;Lo;0;L;;;;;N;;;;; +1B2A4;NUSHU CHARACTER-1B2A4;Lo;0;L;;;;;N;;;;; +1B2A5;NUSHU CHARACTER-1B2A5;Lo;0;L;;;;;N;;;;; +1B2A6;NUSHU CHARACTER-1B2A6;Lo;0;L;;;;;N;;;;; +1B2A7;NUSHU CHARACTER-1B2A7;Lo;0;L;;;;;N;;;;; +1B2A8;NUSHU CHARACTER-1B2A8;Lo;0;L;;;;;N;;;;; +1B2A9;NUSHU CHARACTER-1B2A9;Lo;0;L;;;;;N;;;;; +1B2AA;NUSHU CHARACTER-1B2AA;Lo;0;L;;;;;N;;;;; +1B2AB;NUSHU CHARACTER-1B2AB;Lo;0;L;;;;;N;;;;; +1B2AC;NUSHU CHARACTER-1B2AC;Lo;0;L;;;;;N;;;;; +1B2AD;NUSHU CHARACTER-1B2AD;Lo;0;L;;;;;N;;;;; +1B2AE;NUSHU CHARACTER-1B2AE;Lo;0;L;;;;;N;;;;; +1B2AF;NUSHU CHARACTER-1B2AF;Lo;0;L;;;;;N;;;;; +1B2B0;NUSHU CHARACTER-1B2B0;Lo;0;L;;;;;N;;;;; +1B2B1;NUSHU CHARACTER-1B2B1;Lo;0;L;;;;;N;;;;; +1B2B2;NUSHU CHARACTER-1B2B2;Lo;0;L;;;;;N;;;;; +1B2B3;NUSHU CHARACTER-1B2B3;Lo;0;L;;;;;N;;;;; +1B2B4;NUSHU CHARACTER-1B2B4;Lo;0;L;;;;;N;;;;; +1B2B5;NUSHU CHARACTER-1B2B5;Lo;0;L;;;;;N;;;;; +1B2B6;NUSHU CHARACTER-1B2B6;Lo;0;L;;;;;N;;;;; +1B2B7;NUSHU CHARACTER-1B2B7;Lo;0;L;;;;;N;;;;; +1B2B8;NUSHU CHARACTER-1B2B8;Lo;0;L;;;;;N;;;;; +1B2B9;NUSHU CHARACTER-1B2B9;Lo;0;L;;;;;N;;;;; +1B2BA;NUSHU CHARACTER-1B2BA;Lo;0;L;;;;;N;;;;; +1B2BB;NUSHU CHARACTER-1B2BB;Lo;0;L;;;;;N;;;;; +1B2BC;NUSHU CHARACTER-1B2BC;Lo;0;L;;;;;N;;;;; +1B2BD;NUSHU CHARACTER-1B2BD;Lo;0;L;;;;;N;;;;; +1B2BE;NUSHU CHARACTER-1B2BE;Lo;0;L;;;;;N;;;;; +1B2BF;NUSHU CHARACTER-1B2BF;Lo;0;L;;;;;N;;;;; +1B2C0;NUSHU CHARACTER-1B2C0;Lo;0;L;;;;;N;;;;; +1B2C1;NUSHU CHARACTER-1B2C1;Lo;0;L;;;;;N;;;;; +1B2C2;NUSHU CHARACTER-1B2C2;Lo;0;L;;;;;N;;;;; +1B2C3;NUSHU CHARACTER-1B2C3;Lo;0;L;;;;;N;;;;; +1B2C4;NUSHU CHARACTER-1B2C4;Lo;0;L;;;;;N;;;;; +1B2C5;NUSHU CHARACTER-1B2C5;Lo;0;L;;;;;N;;;;; +1B2C6;NUSHU CHARACTER-1B2C6;Lo;0;L;;;;;N;;;;; +1B2C7;NUSHU CHARACTER-1B2C7;Lo;0;L;;;;;N;;;;; +1B2C8;NUSHU CHARACTER-1B2C8;Lo;0;L;;;;;N;;;;; +1B2C9;NUSHU CHARACTER-1B2C9;Lo;0;L;;;;;N;;;;; +1B2CA;NUSHU CHARACTER-1B2CA;Lo;0;L;;;;;N;;;;; +1B2CB;NUSHU CHARACTER-1B2CB;Lo;0;L;;;;;N;;;;; +1B2CC;NUSHU CHARACTER-1B2CC;Lo;0;L;;;;;N;;;;; +1B2CD;NUSHU CHARACTER-1B2CD;Lo;0;L;;;;;N;;;;; +1B2CE;NUSHU CHARACTER-1B2CE;Lo;0;L;;;;;N;;;;; +1B2CF;NUSHU CHARACTER-1B2CF;Lo;0;L;;;;;N;;;;; +1B2D0;NUSHU CHARACTER-1B2D0;Lo;0;L;;;;;N;;;;; +1B2D1;NUSHU CHARACTER-1B2D1;Lo;0;L;;;;;N;;;;; +1B2D2;NUSHU CHARACTER-1B2D2;Lo;0;L;;;;;N;;;;; +1B2D3;NUSHU CHARACTER-1B2D3;Lo;0;L;;;;;N;;;;; +1B2D4;NUSHU CHARACTER-1B2D4;Lo;0;L;;;;;N;;;;; +1B2D5;NUSHU CHARACTER-1B2D5;Lo;0;L;;;;;N;;;;; +1B2D6;NUSHU CHARACTER-1B2D6;Lo;0;L;;;;;N;;;;; +1B2D7;NUSHU CHARACTER-1B2D7;Lo;0;L;;;;;N;;;;; +1B2D8;NUSHU CHARACTER-1B2D8;Lo;0;L;;;;;N;;;;; +1B2D9;NUSHU CHARACTER-1B2D9;Lo;0;L;;;;;N;;;;; +1B2DA;NUSHU CHARACTER-1B2DA;Lo;0;L;;;;;N;;;;; +1B2DB;NUSHU CHARACTER-1B2DB;Lo;0;L;;;;;N;;;;; +1B2DC;NUSHU CHARACTER-1B2DC;Lo;0;L;;;;;N;;;;; +1B2DD;NUSHU CHARACTER-1B2DD;Lo;0;L;;;;;N;;;;; +1B2DE;NUSHU CHARACTER-1B2DE;Lo;0;L;;;;;N;;;;; +1B2DF;NUSHU CHARACTER-1B2DF;Lo;0;L;;;;;N;;;;; +1B2E0;NUSHU CHARACTER-1B2E0;Lo;0;L;;;;;N;;;;; +1B2E1;NUSHU CHARACTER-1B2E1;Lo;0;L;;;;;N;;;;; +1B2E2;NUSHU CHARACTER-1B2E2;Lo;0;L;;;;;N;;;;; +1B2E3;NUSHU CHARACTER-1B2E3;Lo;0;L;;;;;N;;;;; +1B2E4;NUSHU CHARACTER-1B2E4;Lo;0;L;;;;;N;;;;; +1B2E5;NUSHU CHARACTER-1B2E5;Lo;0;L;;;;;N;;;;; +1B2E6;NUSHU CHARACTER-1B2E6;Lo;0;L;;;;;N;;;;; +1B2E7;NUSHU CHARACTER-1B2E7;Lo;0;L;;;;;N;;;;; +1B2E8;NUSHU CHARACTER-1B2E8;Lo;0;L;;;;;N;;;;; +1B2E9;NUSHU CHARACTER-1B2E9;Lo;0;L;;;;;N;;;;; +1B2EA;NUSHU CHARACTER-1B2EA;Lo;0;L;;;;;N;;;;; +1B2EB;NUSHU CHARACTER-1B2EB;Lo;0;L;;;;;N;;;;; +1B2EC;NUSHU CHARACTER-1B2EC;Lo;0;L;;;;;N;;;;; +1B2ED;NUSHU CHARACTER-1B2ED;Lo;0;L;;;;;N;;;;; +1B2EE;NUSHU CHARACTER-1B2EE;Lo;0;L;;;;;N;;;;; +1B2EF;NUSHU CHARACTER-1B2EF;Lo;0;L;;;;;N;;;;; +1B2F0;NUSHU CHARACTER-1B2F0;Lo;0;L;;;;;N;;;;; +1B2F1;NUSHU CHARACTER-1B2F1;Lo;0;L;;;;;N;;;;; +1B2F2;NUSHU CHARACTER-1B2F2;Lo;0;L;;;;;N;;;;; +1B2F3;NUSHU CHARACTER-1B2F3;Lo;0;L;;;;;N;;;;; +1B2F4;NUSHU CHARACTER-1B2F4;Lo;0;L;;;;;N;;;;; +1B2F5;NUSHU CHARACTER-1B2F5;Lo;0;L;;;;;N;;;;; +1B2F6;NUSHU CHARACTER-1B2F6;Lo;0;L;;;;;N;;;;; +1B2F7;NUSHU CHARACTER-1B2F7;Lo;0;L;;;;;N;;;;; +1B2F8;NUSHU CHARACTER-1B2F8;Lo;0;L;;;;;N;;;;; +1B2F9;NUSHU CHARACTER-1B2F9;Lo;0;L;;;;;N;;;;; +1B2FA;NUSHU CHARACTER-1B2FA;Lo;0;L;;;;;N;;;;; +1B2FB;NUSHU CHARACTER-1B2FB;Lo;0;L;;;;;N;;;;; 1BC00;DUPLOYAN LETTER H;Lo;0;L;;;;;N;;;;; 1BC01;DUPLOYAN LETTER X;Lo;0;L;;;;;N;;;;; 1BC02;DUPLOYAN LETTER P;Lo;0;L;;;;;N;;;;; @@ -28269,6 +29217,12 @@ FFFD;REPLACEMENT CHARACTER;So;0;ON;;;;;N;;;;; 1F248;TORTOISE SHELL BRACKETED CJK UNIFIED IDEOGRAPH-6557;So;0;L; 3014 6557 3015;;;;N;;;;; 1F250;CIRCLED IDEOGRAPH ADVANTAGE;So;0;L; 5F97;;;;N;;;;; 1F251;CIRCLED IDEOGRAPH ACCEPT;So;0;L; 53EF;;;;N;;;;; +1F260;ROUNDED SYMBOL FOR FU;So;0;ON;;;;;N;;;;; +1F261;ROUNDED SYMBOL FOR LU;So;0;ON;;;;;N;;;;; +1F262;ROUNDED SYMBOL FOR SHOU;So;0;ON;;;;;N;;;;; +1F263;ROUNDED SYMBOL FOR XI;So;0;ON;;;;;N;;;;; +1F264;ROUNDED SYMBOL FOR SHUANGXI;So;0;ON;;;;;N;;;;; +1F265;ROUNDED SYMBOL FOR CAI;So;0;ON;;;;;N;;;;; 1F300;CYCLONE;So;0;ON;;;;;N;;;;; 1F301;FOGGY;So;0;ON;;;;;N;;;;; 1F302;CLOSED UMBRELLA;So;0;ON;;;;;N;;;;; @@ -29248,6 +30202,8 @@ FFFD;REPLACEMENT CHARACTER;So;0;ON;;;;;N;;;;; 1F6D0;PLACE OF WORSHIP;So;0;ON;;;;;N;;;;; 1F6D1;OCTAGONAL SIGN;So;0;ON;;;;;N;;;;; 1F6D2;SHOPPING TROLLEY;So;0;ON;;;;;N;;;;; +1F6D3;STUPA;So;0;ON;;;;;N;;;;; +1F6D4;PAGODA;So;0;ON;;;;;N;;;;; 1F6E0;HAMMER AND WRENCH;So;0;ON;;;;;N;;;;; 1F6E1;SHIELD;So;0;ON;;;;;N;;;;; 1F6E2;OIL DRUM;So;0;ON;;;;;N;;;;; @@ -29268,6 +30224,8 @@ FFFD;REPLACEMENT CHARACTER;So;0;ON;;;;;N;;;;; 1F6F4;SCOOTER;So;0;ON;;;;;N;;;;; 1F6F5;MOTOR SCOOTER;So;0;ON;;;;;N;;;;; 1F6F6;CANOE;So;0;ON;;;;;N;;;;; +1F6F7;SLED;So;0;ON;;;;;N;;;;; +1F6F8;FLYING SAUCER;So;0;ON;;;;;N;;;;; 1F700;ALCHEMICAL SYMBOL FOR QUINTESSENCE;So;0;ON;;;;;N;;;;; 1F701;ALCHEMICAL SYMBOL FOR AIR;So;0;ON;;;;;N;;;;; 1F702;ALCHEMICAL SYMBOL FOR FIRE;So;0;ON;;;;;N;;;;; @@ -29617,6 +30575,18 @@ FFFD;REPLACEMENT CHARACTER;So;0;ON;;;;;N;;;;; 1F8AB;RIGHTWARDS FRONT-TILTED SHADOWED WHITE ARROW;So;0;ON;;;;;N;;;;; 1F8AC;WHITE ARROW SHAFT WIDTH ONE;So;0;ON;;;;;N;;;;; 1F8AD;WHITE ARROW SHAFT WIDTH TWO THIRDS;So;0;ON;;;;;N;;;;; +1F900;CIRCLED CROSS FORMEE WITH FOUR DOTS;So;0;ON;;;;;N;;;;; +1F901;CIRCLED CROSS FORMEE WITH TWO DOTS;So;0;ON;;;;;N;;;;; +1F902;CIRCLED CROSS FORMEE;So;0;ON;;;;;N;;;;; +1F903;LEFT HALF CIRCLE WITH FOUR DOTS;So;0;ON;;;;;N;;;;; +1F904;LEFT HALF CIRCLE WITH THREE DOTS;So;0;ON;;;;;N;;;;; +1F905;LEFT HALF CIRCLE WITH TWO DOTS;So;0;ON;;;;;N;;;;; +1F906;LEFT HALF CIRCLE WITH DOT;So;0;ON;;;;;N;;;;; +1F907;LEFT HALF CIRCLE;So;0;ON;;;;;N;;;;; +1F908;DOWNWARD FACING HOOK;So;0;ON;;;;;N;;;;; +1F909;DOWNWARD FACING NOTCHED HOOK;So;0;ON;;;;;N;;;;; +1F90A;DOWNWARD FACING HOOK WITH DOT;So;0;ON;;;;;N;;;;; +1F90B;DOWNWARD FACING NOTCHED HOOK WITH DOT;So;0;ON;;;;;N;;;;; 1F910;ZIPPER-MOUTH FACE;So;0;ON;;;;;N;;;;; 1F911;MONEY-MOUTH FACE;So;0;ON;;;;;N;;;;; 1F912;FACE WITH THERMOMETER;So;0;ON;;;;;N;;;;; @@ -29632,6 +30602,7 @@ FFFD;REPLACEMENT CHARACTER;So;0;ON;;;;;N;;;;; 1F91C;RIGHT-FACING FIST;So;0;ON;;;;;N;;;;; 1F91D;HANDSHAKE;So;0;ON;;;;;N;;;;; 1F91E;HAND WITH INDEX AND MIDDLE FINGERS CROSSED;So;0;ON;;;;;N;;;;; +1F91F;I LOVE YOU HAND SIGN;So;0;ON;;;;;N;;;;; 1F920;FACE WITH COWBOY HAT;So;0;ON;;;;;N;;;;; 1F921;CLOWN FACE;So;0;ON;;;;;N;;;;; 1F922;NAUSEATED FACE;So;0;ON;;;;;N;;;;; @@ -29640,7 +30611,17 @@ FFFD;REPLACEMENT CHARACTER;So;0;ON;;;;;N;;;;; 1F925;LYING FACE;So;0;ON;;;;;N;;;;; 1F926;FACE PALM;So;0;ON;;;;;N;;;;; 1F927;SNEEZING FACE;So;0;ON;;;;;N;;;;; +1F928;FACE WITH ONE EYEBROW RAISED;So;0;ON;;;;;N;;;;; +1F929;GRINNING FACE WITH STAR EYES;So;0;ON;;;;;N;;;;; +1F92A;GRINNING FACE WITH ONE LARGE AND ONE SMALL EYE;So;0;ON;;;;;N;;;;; +1F92B;FACE WITH FINGER COVERING CLOSED LIPS;So;0;ON;;;;;N;;;;; +1F92C;SERIOUS FACE WITH SYMBOLS COVERING MOUTH;So;0;ON;;;;;N;;;;; +1F92D;SMILING FACE WITH SMILING EYES AND HAND COVERING MOUTH;So;0;ON;;;;;N;;;;; +1F92E;FACE WITH OPEN MOUTH VOMITING;So;0;ON;;;;;N;;;;; +1F92F;SHOCKED FACE WITH EXPLODING HEAD;So;0;ON;;;;;N;;;;; 1F930;PREGNANT WOMAN;So;0;ON;;;;;N;;;;; +1F931;BREAST-FEEDING;So;0;ON;;;;;N;;;;; +1F932;PALMS UP TOGETHER;So;0;ON;;;;;N;;;;; 1F933;SELFIE;So;0;ON;;;;;N;;;;; 1F934;PRINCE;So;0;ON;;;;;N;;;;; 1F935;MAN IN TUXEDO;So;0;ON;;;;;N;;;;; @@ -29665,6 +30646,7 @@ FFFD;REPLACEMENT CHARACTER;So;0;ON;;;;;N;;;;; 1F949;THIRD PLACE MEDAL;So;0;ON;;;;;N;;;;; 1F94A;BOXING GLOVE;So;0;ON;;;;;N;;;;; 1F94B;MARTIAL ARTS UNIFORM;So;0;ON;;;;;N;;;;; +1F94C;CURLING STONE;So;0;ON;;;;;N;;;;; 1F950;CROISSANT;So;0;ON;;;;;N;;;;; 1F951;AVOCADO;So;0;ON;;;;;N;;;;; 1F952;CUCUMBER;So;0;ON;;;;;N;;;;; @@ -29680,6 +30662,19 @@ FFFD;REPLACEMENT CHARACTER;So;0;ON;;;;;N;;;;; 1F95C;PEANUTS;So;0;ON;;;;;N;;;;; 1F95D;KIWIFRUIT;So;0;ON;;;;;N;;;;; 1F95E;PANCAKES;So;0;ON;;;;;N;;;;; +1F95F;DUMPLING;So;0;ON;;;;;N;;;;; +1F960;FORTUNE COOKIE;So;0;ON;;;;;N;;;;; +1F961;TAKEOUT BOX;So;0;ON;;;;;N;;;;; +1F962;CHOPSTICKS;So;0;ON;;;;;N;;;;; +1F963;BOWL WITH SPOON;So;0;ON;;;;;N;;;;; +1F964;CUP WITH STRAW;So;0;ON;;;;;N;;;;; +1F965;COCONUT;So;0;ON;;;;;N;;;;; +1F966;BROCCOLI;So;0;ON;;;;;N;;;;; +1F967;PIE;So;0;ON;;;;;N;;;;; +1F968;PRETZEL;So;0;ON;;;;;N;;;;; +1F969;CUT OF MEAT;So;0;ON;;;;;N;;;;; +1F96A;SANDWICH;So;0;ON;;;;;N;;;;; +1F96B;CANNED FOOD;So;0;ON;;;;;N;;;;; 1F980;CRAB;So;0;ON;;;;;N;;;;; 1F981;LION FACE;So;0;ON;;;;;N;;;;; 1F982;SCORPION;So;0;ON;;;;;N;;;;; @@ -29698,7 +30693,36 @@ FFFD;REPLACEMENT CHARACTER;So;0;ON;;;;;N;;;;; 1F98F;RHINOCEROS;So;0;ON;;;;;N;;;;; 1F990;SHRIMP;So;0;ON;;;;;N;;;;; 1F991;SQUID;So;0;ON;;;;;N;;;;; +1F992;GIRAFFE FACE;So;0;ON;;;;;N;;;;; +1F993;ZEBRA FACE;So;0;ON;;;;;N;;;;; +1F994;HEDGEHOG;So;0;ON;;;;;N;;;;; +1F995;SAUROPOD;So;0;ON;;;;;N;;;;; +1F996;T-REX;So;0;ON;;;;;N;;;;; +1F997;CRICKET;So;0;ON;;;;;N;;;;; 1F9C0;CHEESE WEDGE;So;0;ON;;;;;N;;;;; +1F9D0;FACE WITH MONOCLE;So;0;ON;;;;;N;;;;; +1F9D1;ADULT;So;0;ON;;;;;N;;;;; +1F9D2;CHILD;So;0;ON;;;;;N;;;;; +1F9D3;OLDER ADULT;So;0;ON;;;;;N;;;;; +1F9D4;BEARDED PERSON;So;0;ON;;;;;N;;;;; +1F9D5;PERSON WITH HEADSCARF;So;0;ON;;;;;N;;;;; +1F9D6;PERSON IN STEAMY ROOM;So;0;ON;;;;;N;;;;; +1F9D7;PERSON CLIMBING;So;0;ON;;;;;N;;;;; +1F9D8;PERSON IN LOTUS POSITION;So;0;ON;;;;;N;;;;; +1F9D9;MAGE;So;0;ON;;;;;N;;;;; +1F9DA;FAIRY;So;0;ON;;;;;N;;;;; +1F9DB;VAMPIRE;So;0;ON;;;;;N;;;;; +1F9DC;MERPERSON;So;0;ON;;;;;N;;;;; +1F9DD;ELF;So;0;ON;;;;;N;;;;; +1F9DE;GENIE;So;0;ON;;;;;N;;;;; +1F9DF;ZOMBIE;So;0;ON;;;;;N;;;;; +1F9E0;BRAIN;So;0;ON;;;;;N;;;;; +1F9E1;ORANGE HEART;So;0;ON;;;;;N;;;;; +1F9E2;BILLED CAP;So;0;ON;;;;;N;;;;; +1F9E3;SCARF;So;0;ON;;;;;N;;;;; +1F9E4;GLOVES;So;0;ON;;;;;N;;;;; +1F9E5;COAT;So;0;ON;;;;;N;;;;; +1F9E6;SOCKS;So;0;ON;;;;;N;;;;; 20000;;Lo;0;L;;;;;N;;;;; 2A6D6;;Lo;0;L;;;;;N;;;;; 2A700;;Lo;0;L;;;;;N;;;;; @@ -29707,6 +30731,8 @@ FFFD;REPLACEMENT CHARACTER;So;0;ON;;;;;N;;;;; 2B81D;;Lo;0;L;;;;;N;;;;; 2B820;;Lo;0;L;;;;;N;;;;; 2CEA1;;Lo;0;L;;;;;N;;;;; +2CEB0;;Lo;0;L;;;;;N;;;;; +2EBE0;;Lo;0;L;;;;;N;;;;; 2F800;CJK COMPATIBILITY IDEOGRAPH-2F800;Lo;0;L;4E3D;;;;N;;;;; 2F801;CJK COMPATIBILITY IDEOGRAPH-2F801;Lo;0;L;4E38;;;;N;;;;; 2F802;CJK COMPATIBILITY IDEOGRAPH-2F802;Lo;0;L;4E41;;;;N;;;;; diff --git a/Build/source/libs/icu/icu-src/source/data/unidata/changes.txt b/Build/source/libs/icu/icu-src/source/data/unidata/changes.txt index 74425830ccb..ef717b12c19 100644 --- a/Build/source/libs/icu/icu-src/source/data/unidata/changes.txt +++ b/Build/source/libs/icu/icu-src/source/data/unidata/changes.txt @@ -12,6 +12,15 @@ * created by: Markus W. Scherer * * change log for Unicode updates +* +* For each new Unicode version, during the beta period, +* I copy the change log for the previous version to the top of this file. +* I adjust the versions, tickets, URLs, and paths. +* I work my way through the steps listed in the log, top to bottom, +* adjusting the log as necessary. +* I report problems to the UTC and/or CLDR and/or ICU. +* Before the data is final, I "turn the crank" several more times, +* using appropriate subsets of the steps. ---------------------------------------------------------------------------- *** @@ -40,6 +49,485 @@ For new script codes see http://www.unicode.org/iso15924/codechanges.html ---------------------------------------------------------------------------- *** +Unicode 10.0 update for ICU 60 + +http://www.unicode.org/versions/Unicode10.0.0/ +http://www.unicode.org/versions/beta-10.0.0.html +http://blog.unicode.org/2017/03/unicode-100-beta-review.html +http://www.unicode.org/review/pri350/ +http://www.unicode.org/reports/uax-proposed-updates.html +http://www.unicode.org/reports/tr44/tr44-19.html + +* Command-line environment setup + +UNICODE_DATA=~/unidata/uni10/20170605 +CLDR_SRC=~/svn.cldr/uni10 +ICU_ROOT=~/svn.icu/uni10 +ICU_SRC=$ICU_ROOT/src +ICUDT=icudt60b +ICU4C_DATA_IN=$ICU_SRC/icu4c/source/data/in +ICU4C_UNIDATA=$ICU_SRC/icu4c/source/data/unidata +export LD_LIBRARY_PATH=$ICU_ROOT/dbg/icu4c/lib + +*** ICU Trac + +- ticket:12985: Unicode 10 +- ticket:13061: undo hacks from emoji 5.0 update +- ticket:13062: add Emoji_Component property +- ^/branches/markus/uni10 + +*** CLDR Trac + +- cldrbug 10055: Unicode 10 +- cldrbug 9882: Unicode 10 script metadata +- cldrbug 10219: numbering systems for Unicode 10 + +*** Unicode version numbers +- makedata.mak +- uchar.h +- com.ibm.icu.util.VersionInfo +- com.ibm.icu.dev.test.lang.UCharacterTest.VERSION_ + +- Run ICU4C "configure" _after_ updating the Unicode version number in uchar.h + so that the makefiles see the new version number. + +*** data files & enums & parser code + +* download files +- mkdir -p $UNICODE_DATA +- download Unicode 10.0 files into $UNICODE_DATA + + subfolders: ucd, uca, idna, security + + inside ucd: extract Unihan.zip to "here" (.../ucd/Unihan/*.txt), delete Unihan.zip +- download emoji 5.0 files into $UNICODE_DATA/emoji + +* for manual diffs: remove version suffixes from the file names + ~$ unidata/desuffixucd.py $UNICODE_DATA + (see https://sites.google.com/site/unicodetools/inputdata) + +* process and/or copy files +- $ICU_SRC/tools/unicode$ py/preparseucd.py $UNICODE_DATA $ICU_SRC + + This writes files (especially ppucd.txt) to the ICU4C unidata and testdata subfolders. + + For debugging, and tweaking how ppucd.txt is written, + the tool has an --only_ppucd option: + py/preparseucd.py $UNICODE_DATA --only_ppucd path/to/ppucd/outputfile + +- cp $UNICODE_DATA/security/confusables.txt $ICU4C_UNIDATA + +* build ICU (make install) + so that the tools build can pick up the new definitions from the installed header files. + + $ICU_ROOT/dbg/icu4c$ echo;echo; make -j7 install > out.txt 2>&1 ; tail -n 30 out.txt ; date + +* preparseucd.py changes +- remove or add new Unicode scripts from/to the + only-in-ISO-15924 list according to the error messages: + ValueError: remove ['Nshu'] from _scripts_only_in_iso15924 + -> adjust _scripts_only_in_iso15924 as indicated +- fix other errors + Exception: no default values (@missing lines) for some Catalog or Enumerated properties: [u'vo'] + -> add vo=Vertical_Orientation to _ignored_properties + -> later removed again, parsing the file, even though we do not yet store data for runtime use + +* new constants for new property values +- preparseucd.py error: + ValueError: missing uchar.h enum constants for some property values: + [(u'blk', set([u'Zanabazar_Square', u'Nushu', u'CJK_Ext_F', + u'Kana_Ext_A', u'Syriac_Sup', u'Masaram_Gondi', u'Soyombo'])), + (u'jg', set([u'Malayalam_Bha', u'Malayalam_Llla', u'Malayalam_Nya', u'Malayalam_Lla', + u'Malayalam_Nga', u'Malayalam_Ssa', u'Malayalam_Tta', u'Malayalam_Ra', + u'Malayalam_Nna', u'Malayalam_Ja', u'Malayalam_Nnna'])), + (u'sc', set([u'Soyo', u'Gonm', u'Zanb']))] + = PropertyValueAliases.txt new property values (diff old & new .txt files) + blk; CJK_Ext_F ; CJK_Unified_Ideographs_Extension_F + blk; Kana_Ext_A ; Kana_Extended_A + blk; Masaram_Gondi ; Masaram_Gondi + blk; Nushu ; Nushu + blk; Soyombo ; Soyombo + blk; Syriac_Sup ; Syriac_Supplement + blk; Zanabazar_Square ; Zanabazar_Square + -> add to uchar.h + use long property names for enum constants, + for the trailing comment get the block start code point: diff old & new Blocks.txt + -> add to UCharacter.UnicodeBlock IDs + Eclipse find UBLOCK_([^ ]+) = ([0-9]+), (/.+) + replace public static final int \1_ID = \2; \3 + -> add to UCharacter.UnicodeBlock objects + Eclipse find UBLOCK_([^ ]+) = [0-9]+, (/.+) + replace public static final UnicodeBlock \1 = new UnicodeBlock("\1", \1_ID); \2 + + jg ; Malayalam_Bha ; Malayalam_Bha + jg ; Malayalam_Ja ; Malayalam_Ja + jg ; Malayalam_Lla ; Malayalam_Lla + jg ; Malayalam_Llla ; Malayalam_Llla + jg ; Malayalam_Nga ; Malayalam_Nga + jg ; Malayalam_Nna ; Malayalam_Nna + jg ; Malayalam_Nnna ; Malayalam_Nnna + jg ; Malayalam_Nya ; Malayalam_Nya + jg ; Malayalam_Ra ; Malayalam_Ra + jg ; Malayalam_Ssa ; Malayalam_Ssa + jg ; Malayalam_Tta ; Malayalam_Tta + -> uchar.h & UCharacter.JoiningGroup + + sc ; Gonm ; Masaram_Gondi + sc ; Nshu ; Nushu + sc ; Soyo ; Soyombo + sc ; Zanb ; Zanabazar_Square + -> uscript.h & com.ibm.icu.lang.UScript + -> Nushu had been added already + -> fix expectedLong names in cucdapi.c/TestUScriptCodeAPI() + and in com.ibm.icu.dev.test.lang.TestUScript.java + +* New properties as shown in PropertyValueAliases.txt changes +- boolean Emoji_Component from emoji 5 + -> uchar.h & UProperty.java +- boolean + # Regional_Indicator (RI) + + RI ; N ; No ; F ; False + RI ; Y ; Yes ; T ; True + -> uchar.h & UProperty.java + -> single immutable range, to be hardcoded +- boolean + # Prepended_Concatenation_Mark (PCM) + + PCM; N ; No ; F ; False + PCM; Y ; Yes ; T ; True + -> was new in Unicode 9 + -> uchar.h & UProperty.java +- enumerated + # Vertical_Orientation (vo) + + vo ; R ; Rotated + vo ; Tr ; Transformed_Rotated + vo ; Tu ; Transformed_Upright + vo ; U ; Upright + -> only pre-parsed for now, but not yet stored for runtime use + +* update Script metadata: SCRIPT_PROPS[] in uscript_props.cpp & UScript.ScriptMetadata + (not strictly necessary for NOT_ENCODED scripts) + $ICU_SRC/tools/unicode$ py/parsescriptmetadata.py $ICU_SRC/icu4c/source/common/unicode/uscript.h $CLDR_SRC/common/properties/scriptMetadata.txt + +* generate normalization data files + cd $ICU_ROOT/dbg/icu4c + bin/gennorm2 -o $ICU_SRC/icu4c/source/common/norm2_nfc_data.h -s $ICU4C_UNIDATA/norm2 nfc.txt --csource + bin/gennorm2 -o $ICU4C_DATA_IN/nfc.nrm -s $ICU4C_UNIDATA/norm2 nfc.txt + bin/gennorm2 -o $ICU4C_DATA_IN/nfkc.nrm -s $ICU4C_UNIDATA/norm2 nfc.txt nfkc.txt + bin/gennorm2 -o $ICU4C_DATA_IN/nfkc_cf.nrm -s $ICU4C_UNIDATA/norm2 nfc.txt nfkc.txt nfkc_cf.txt + bin/gennorm2 -o $ICU4C_DATA_IN/uts46.nrm -s $ICU4C_UNIDATA/norm2 nfc.txt uts46.txt + +* build ICU (make install) + so that the tools build can pick up the new definitions from the installed header files. + + $ICU_ROOT/dbg/icu4c$ echo;echo; make -j7 install > out.txt 2>&1 ; tail -n 30 out.txt ; date + +* build Unicode tools using CMake+make + +$ICU_SRC/tools/unicode/c/icudefs.txt: + +# Location (--prefix) of where ICU was installed. +set(ICU_INST_DIR /usr/local/google/home/mscherer/svn.icu/trunk/inst/icu4c) +# Location of the ICU4C source tree. +set(ICU4C_SRC_DIR /usr/local/google/home/mscherer/svn.icu/uni10/src/icu4c) + + $ICU_ROOT/dbg/tools/unicode/c$ + cmake ../../../../src/tools/unicode/c + make + +* generate core properties data files + $ICU_ROOT/dbg/tools/unicode/c$ + genprops/genprops $ICU_SRC/icu4c + genuca/genuca --hanOrder implicit $ICU_SRC/icu4c + genuca/genuca --hanOrder radical-stroke $ICU_SRC/icu4c +- rebuild ICU (make install) & tools + +* update uts46test.cpp and UTS46Test.java if there are new characters that are equivalent to + sequences with non-LDH ASCII (that is, their decompositions contain '=' or similar) +- grep IdnaMappingTable.txt or uts46.txt for "disallowed_STD3_valid" on non-ASCII characters +- Unicode 6.0..10.0: U+2260, U+226E, U+226F +- nothing new in this Unicode version, no test file to update + +* run & fix ICU4C tests +- Andy handles RBBI & spoof check test failures + +* collation: CLDR collation root, UCA DUCET + +- UCA DUCET goes into Mark's Unicode tools, see + https://sites.google.com/site/unicodetools/home#TOC-UCA +- CLDR root data files are checked into $CLDR_SRC/common/uca/ + cp (Unicode Tools UCA generated)/CollationAuxiliary/* $CLDR_SRC/common/uca/ + +- update source/data/unidata/FractionalUCA.txt with FractionalUCA_SHORT.txt + cp $CLDR_SRC/common/uca/FractionalUCA_SHORT.txt $ICU4C_UNIDATA/FractionalUCA.txt +- update source/data/unidata/UCARules.txt with UCA_Rules_SHORT.txt + cp $ICU4C_UNIDATA/UCARules.txt /tmp/UCARules-old.txt + (note removing the underscore before "Rules") + cp $CLDR_SRC/common/uca/UCA_Rules_SHORT.txt $ICU4C_UNIDATA/UCARules.txt +- restore TODO diffs in UCARules.txt + meld /tmp/UCARules-old.txt $ICU4C_UNIDATA/UCARules.txt +- update (ICU4C)/source/test/testdata/CollationTest_*.txt + and (ICU4J)/main/tests/collate/src/com/ibm/icu/dev/data/CollationTest_*.txt + from the CLDR root files (..._CLDR_..._SHORT.txt) + cp $CLDR_SRC/common/uca/CollationTest_CLDR_NON_IGNORABLE_SHORT.txt $ICU_SRC/icu4c/source/test/testdata/CollationTest_NON_IGNORABLE_SHORT.txt + cp $CLDR_SRC/common/uca/CollationTest_CLDR_SHIFTED_SHORT.txt $ICU_SRC/icu4c/source/test/testdata/CollationTest_SHIFTED_SHORT.txt + cp $ICU_SRC/icu4c/source/test/testdata/CollationTest_*.txt $ICU_SRC/icu4j/main/tests/collate/src/com/ibm/icu/dev/data +- if CLDR common/uca/unihan-index.txt changes, then update + CLDR common/collation/root.xml + and regenerate (or update in parallel) $ICU_SRC/icu4c/source/data/coll/root.txt + +- run genuca, see command line above; + deal with + Error: Unknown script for first-primary sample character U+11D10 on line 28117 of /usr/local/google/home/mscherer/svn.icu/uni10/src/icu4c/source/data/unidata/FractionalUCA.txt: + FDD1 11D10; [70 D5 02, 05, 05] # Masaram_Gondi first primary (compressible) + (add the character to genuca.cpp sampleCharsToScripts[]) + + look up the USCRIPT_ code for the new sample characters + (should be obvious from the comment in the error output) + + *add* mappings to sampleCharsToScripts[], do not replace them + (in case the script sample characters flip-flop) + + insert new scripts in DUCET script order, see the top_byte table + at the beginning of FractionalUCA.txt +- rebuild ICU4C + +* Unihan collators + https://sites.google.com/site/unicodetools/unihan +- run Unicode Tools + org.unicode.draft.GenerateUnihanCollators + with VM arguments + -ea + -DSVN_WORKSPACE=/usr/local/google/home/mscherer/svn.unitools/trunk + -DOTHER_WORKSPACE=/usr/local/google/home/mscherer/svn.unitools + -DUCD_DIR=/usr/local/google/home/mscherer/svn.unitools/trunk/data + -DCLDR_DIR=/usr/local/google/home/mscherer/svn.cldr/uni10 + -DUVERSION=10.0.0 +- run Unicode Tools + org.unicode.draft.GenerateUnihanCollatorFiles + with the same arguments +- check CLDR diffs + cd $CLDR_SRC + meld common/collation/zh.xml ../Generated/cldr/han/replace/zh.xml + meld common/transforms/Han-Latin.xml ../Generated/cldr/han/replace/Han-Latin.xml +- copy to CLDR + cd $CLDR_SRC + cp ../Generated/cldr/han/replace/zh.xml common/collation/zh.xml + cp ../Generated/cldr/han/replace/Han-Latin.xml common/transforms/Han-Latin.xml +- run CLDR unit tests, commit to CLDR +- generate ICU zh collation data: run CLDR + org.unicode.cldr.icu.NewLdml2IcuConverter + with program arguments + -t collation + -s /usr/local/google/home/mscherer/svn.cldr/uni10/common/collation + -m /usr/local/google/home/mscherer/svn.cldr/uni10/common/supplemental + -d /usr/local/google/home/mscherer/svn.icu/uni10/src/icu4c/source/data/coll + -p /usr/local/google/home/mscherer/svn.icu/uni10/src/icu4c/source/data/xml/collation + zh + and VM arguments + -ea + -DCLDR_DIR=/usr/local/google/home/mscherer/svn.cldr/uni10 +- rebuild ICU4C + +* run & fix ICU4C tests, now with new CLDR collation root data +- run all tests with the collation test data *_SHORT.txt or the full files + (the full ones have comments, useful for debugging) +- note on intltest: if collate/UCAConformanceTest fails, then + utility/MultithreadTest/TestCollators will fail as well; + fix the conformance test before looking into the multi-thread test + +* update Java data files +- refresh just the UCD/UCA-related/derived files, just to be safe +- see (ICU4C)/source/data/icu4j-readme.txt +- mkdir -p /tmp/icu4j/com/ibm/icu/impl/data/$ICUDT +- $ICU_ROOT/dbg/icu4c$ make ICU4J_ROOT=/tmp/icu4j icu4j-data-install + output: + ... + Unicode .icu files built to ./out/build/icudt60l + echo timestamp > uni-core-data + mkdir -p ./out/icu4j/com/ibm/icu/impl/data/icudt60b + mkdir -p ./out/icu4j/tzdata/com/ibm/icu/impl/data/icudt60b + echo pnames.icu uprops.icu ucase.icu ubidi.icu nfc.nrm > ./out/icu4j/add.txt + LD_LIBRARY_PATH=../lib:../stubdata:../tools/ctestfw:$LD_LIBRARY_PATH ../bin/icupkg ./out/tmp/icudt60l.dat ./out/icu4j/icudt60b.dat -a ./out/icu4j/add.txt -s ./out/build/icudt60l -x '*' -tb -d ./out/icu4j/com/ibm/icu/impl/data/icudt60b + mv ./out/icu4j/"com/ibm/icu/impl/data/icudt60b/zoneinfo64.res" ./out/icu4j/"com/ibm/icu/impl/data/icudt60b/metaZones.res" ./out/icu4j/"com/ibm/icu/impl/data/icudt60b/timezoneTypes.res" ./out/icu4j/"com/ibm/icu/impl/data/icudt60b/windowsZones.res" "./out/icu4j/tzdata/com/ibm/icu/impl/data/icudt60b" + jar cf ./out/icu4j/icudata.jar -C ./out/icu4j com/ibm/icu/impl/data/icudt60b/ + mkdir -p /tmp/icu4j/main/shared/data + cp ./out/icu4j/icudata.jar /tmp/icu4j/main/shared/data + jar cf ./out/icu4j/icutzdata.jar -C ./out/icu4j/tzdata com/ibm/icu/impl/data/icudt60b/ + mkdir -p /tmp/icu4j/main/shared/data + cp ./out/icu4j/icutzdata.jar /tmp/icu4j/main/shared/data + make[1]: Leaving directory `/usr/local/google/home/mscherer/svn.icu/uni10/dbg/icu4c/data' +- copy the big-endian Unicode data files to another location, + separate from the other data files, + and then refresh ICU4J + cd $ICU_ROOT/dbg/icu4c/data/out/icu4j + mkdir -p /tmp/icu4j/com/ibm/icu/impl/data/$ICUDT/coll + mkdir -p /tmp/icu4j/com/ibm/icu/impl/data/$ICUDT/brkitr + cp com/ibm/icu/impl/data/$ICUDT/confusables.cfu /tmp/icu4j/com/ibm/icu/impl/data/$ICUDT + cp com/ibm/icu/impl/data/$ICUDT/*.icu /tmp/icu4j/com/ibm/icu/impl/data/$ICUDT + rm /tmp/icu4j/com/ibm/icu/impl/data/$ICUDT/cnvalias.icu + cp com/ibm/icu/impl/data/$ICUDT/*.nrm /tmp/icu4j/com/ibm/icu/impl/data/$ICUDT + cp com/ibm/icu/impl/data/$ICUDT/coll/* /tmp/icu4j/com/ibm/icu/impl/data/$ICUDT/coll + cp com/ibm/icu/impl/data/$ICUDT/brkitr/* /tmp/icu4j/com/ibm/icu/impl/data/$ICUDT/brkitr + jar uvf $ICU_SRC/icu4j/main/shared/data/icudata.jar -C /tmp/icu4j com/ibm/icu/impl/data/$ICUDT + +* When refreshing all of ICU4J data from ICU4C +- $ICU_ROOT/dbg/icu4c$ make ICU4J_ROOT=/tmp/icu4j icu4j-data-install +- cp /tmp/icu4j/main/shared/data/icudata.jar $ICU_SRC/icu4j/main/shared/data +or +- $ICU_ROOT/dbg/icu4c$ make ICU4J_ROOT=$ICU_SRC/icu4j icu4j-data-install + +* update CollationFCD.java + + copy & paste the initializers of lcccIndex[] etc. from + ICU4C/source/i18n/collationfcd.cpp to + ICU4J/main/classes/collate/src/com/ibm/icu/impl/coll/CollationFCD.java + +* refresh Java test .txt files +- copy new .txt files into ICU4J's main/tests/core/src/com/ibm/icu/dev/data/unicode + cd $ICU_SRC/icu4c/source/data/unidata + cp confusables.txt confusablesWholeScript.txt NormalizationCorrections.txt NormalizationTest.txt SpecialCasing.txt UnicodeData.txt $ICU_SRC/icu4j/main/tests/core/src/com/ibm/icu/dev/data/unicode + cd ../../test/testdata + cp BidiCharacterTest.txt BidiTest.txt IdnaTest.txt $ICU_SRC/icu4j/main/tests/core/src/com/ibm/icu/dev/data/unicode + cp $UNICODE_DATA/ucd/CompositionExclusions.txt $ICU_SRC/icu4j/main/tests/core/src/com/ibm/icu/dev/data/unicode + +* run & fix ICU4J tests + +*** API additions +- send notice to icu-design about new born-@stable API (enum constants etc.) + +*** CLDR numbering systems +- look for new sets of decimal digits (gc=ND & nv=4) and submit a CLDR ticket + Unicode 10: http://unicode.org/cldr/trac/ticket/10219 + Unicode 9: http://unicode.org/cldr/trac/ticket/9692 + +*** merge the Unicode update branches back onto the trunk +- do not merge the icudata.jar and testdata.jar, + instead rebuild them from merged & tested ICU4C +- make sure that changes to Unicode tools are checked in: + http://www.unicode.org/utility/trac/log/trunk/unicodetools + +---------------------------------------------------------------------------- *** + +Emoji 5.0 update for ICU 59 +- ICU 59 mostly remains on Unicode 9.0 +- except updates bidi and segmentation data to Unicode 10 beta + +First run of tools on combined icu4c/icu4j/tools trunk after svn repository reorg. + +* Command-line environment setup + +ICU_ROOT=~/svn.icu/trunk +ICU_SRC_DIR=$ICU_ROOT/src +ICU4C_SRC_DIR=$ICU_SRC_DIR/icu4c +ICUDT=icudt59b +export LD_LIBRARY_PATH=$ICU_ROOT/dbg/lib +SRC_DATA_IN=$ICU4C_SRC_DIR/source/data/in +UNIDATA=$ICU4C_SRC_DIR/source/data/unidata + +*** ICU Trac + +- ticket:12900: take Emoji 5.0 properties data into ICU 59 once it's released +- changes directly on trunk + +*** data files & enums & parser code + +* download files + +- download Unicode 9.0 files into a uni90e50 folder: ucd, idna, security (skip uca) +- download emoji 5.0 beta files into the same uni90e50 folder +- download Unicode 10.0 beta files: ucd + + copy Unicode 10 bidi files to the uni90e50/ucd folder: + BidiBrackets.txt + BidiCharacterTest.txt + BidiMirroring.txt + BidiTest.txt + extracted/DerivedBidiClass.txt + + copy Unicode 10 segmentation files to the uni90e50/ucd folder: + LineBreak.txt + auxiliary/* + +* preparseucd.py changes +- adjust for combined trunks +- write new copyright lines +- ignore new Emoji_Component property for now + +* process and/or copy files +- ~/svn.icu/trunk/src/tools/unicode$ py/preparseucd.py ~/unidata/uni90e50/20170322 $ICU_SRC_DIR + + This writes files (especially ppucd.txt) to the ICU4C unidata and testdata subfolders. + +- cp ~/unidata/uni90e50/20170322/security/confusables.txt $UNIDATA + +* build ICU (make install) + so that the tools build can pick up the new definitions from the installed header files. + + $ICU_ROOT/dbg/icu4c$ echo;echo; make -j7 install > out.txt 2>&1 ; tail -n 30 out.txt ; date + +* build Unicode tools using CMake+make + +~/svn.icu/trunk/src/tools/unicode/c/icudefs.txt: + +# Location (--prefix) of where ICU was installed. +set(ICU_INST_DIR /usr/local/google/home/mscherer/svn.icu/trunk/inst/icu4c) +# Location of the ICU4C source tree. +set(ICU4C_SRC_DIR /usr/local/google/home/mscherer/svn.icu/trunk/src/icu4c) + + ~/svn.icu/trunk/dbg/tools/unicode/c$ + cmake ../../../../src/tools/unicode/c + make + +* generate core properties data files + ~/svn.icu/trunk/dbg/tools/unicode/c$ + genprops/genprops $ICU4C_SRC_DIR +- rebuild ICU (make install) & tools + +* run & fix ICU4C tests +- Andy handles RBBI & spoof check test failures + +* update Java data files +- refresh just the UCD/UCA-related/derived files, just to be safe +- see (ICU4C)/source/data/icu4j-readme.txt +- mkdir /tmp/icu4j +- ~/svn.icu/trunk/dbg/icu4c$ make ICU4J_ROOT=/tmp/icu4j icu4j-data-install + output: + ... + Unicode .icu files built to ./out/build/icudt59l + echo timestamp > uni-core-data + mkdir -p ./out/icu4j/com/ibm/icu/impl/data/icudt59b + mkdir -p ./out/icu4j/tzdata/com/ibm/icu/impl/data/icudt59b + echo pnames.icu uprops.icu ucase.icu ubidi.icu nfc.nrm > ./out/icu4j/add.txt + LD_LIBRARY_PATH=../lib:../stubdata:../tools/ctestfw:$LD_LIBRARY_PATH ../bin/icupkg ./out/tmp/icudt59l.dat ./out/icu4j/icudt59b.dat -a ./out/icu4j/add.txt -s ./out/build/icudt59l -x '*' -tb -d ./out/icu4j/com/ibm/icu/impl/data/icudt59b + mv ./out/icu4j/"com/ibm/icu/impl/data/icudt59b/zoneinfo64.res" ./out/icu4j/"com/ibm/icu/impl/data/icudt59b/metaZones.res" ./out/icu4j/"com/ibm/icu/impl/data/icudt59b/timezoneTypes.res" ./out/icu4j/"com/ibm/icu/impl/data/icudt59b/windowsZones.res" "./out/icu4j/tzdata/com/ibm/icu/impl/data/icudt59b" + jar cf ./out/icu4j/icudata.jar -C ./out/icu4j com/ibm/icu/impl/data/icudt59b/ + mkdir -p /tmp/icu4j/main/shared/data + cp ./out/icu4j/icudata.jar /tmp/icu4j/main/shared/data + jar cf ./out/icu4j/icutzdata.jar -C ./out/icu4j/tzdata com/ibm/icu/impl/data/icudt59b/ + mkdir -p /tmp/icu4j/main/shared/data + cp ./out/icu4j/icutzdata.jar /tmp/icu4j/main/shared/data + make[1]: Leaving directory `/usr/local/google/home/mscherer/svn.icu/trunk/dbg/icu4c/data' +- copy the big-endian Unicode data files to another location, + separate from the other data files, + and then refresh ICU4J + cd ~/svn.icu/trunk/dbg/icu4c/data/out/icu4j + mkdir -p /tmp/icu4j/com/ibm/icu/impl/data/$ICUDT/brkitr + cp com/ibm/icu/impl/data/$ICUDT/confusables.cfu /tmp/icu4j/com/ibm/icu/impl/data/$ICUDT + cp com/ibm/icu/impl/data/$ICUDT/*.icu /tmp/icu4j/com/ibm/icu/impl/data/$ICUDT + rm /tmp/icu4j/com/ibm/icu/impl/data/$ICUDT/cnvalias.icu + cp com/ibm/icu/impl/data/$ICUDT/brkitr/* /tmp/icu4j/com/ibm/icu/impl/data/$ICUDT/brkitr + jar uvf ~/svn.icu/trunk/src/icu4j/main/shared/data/icudata.jar -C /tmp/icu4j com/ibm/icu/impl/data/$ICUDT + +* When refreshing all of ICU4J data from ICU4C +- ~/svn.icu/trunk/dbg/icu4c$ make ICU4J_ROOT=/tmp/icu4j icu4j-data-install +- cp /tmp/icu4j/main/shared/data/icudata.jar ~/svn.icu/trunk/src/icu4j/main/shared/data +or +- ~/svn.icu/trunk/dbg/icu4c$ make ICU4J_ROOT=~/svn.icu/trunk/src/icu4j icu4j-data-install + +* refresh Java test .txt files +- copy new .txt files into ICU4J's main/tests/core/src/com/ibm/icu/dev/data/unicode + cd $ICU4C_SRC_DIR/source/data/unidata + cp confusables.txt confusablesWholeScript.txt NormalizationCorrections.txt NormalizationTest.txt SpecialCasing.txt UnicodeData.txt ~/svn.icu/trunk/src/icu4j/main/tests/core/src/com/ibm/icu/dev/data/unicode + cd ../../test/testdata + cp BidiCharacterTest.txt BidiTest.txt ~/svn.icu/trunk/src/icu4j/main/tests/core/src/com/ibm/icu/dev/data/unicode + cp ~/unidata/uni90e50/20170322/ucd/CompositionExclusions.txt ~/svn.icu/trunk/src/icu4j/main/tests/core/src/com/ibm/icu/dev/data/unicode + +* run & fix ICU4J tests + +---------------------------------------------------------------------------- *** + Unicode 9.0 update for ICU 58 * Command-line environment setup diff --git a/Build/source/libs/icu/icu-src/source/data/unidata/confusables.txt b/Build/source/libs/icu/icu-src/source/data/unidata/confusables.txt index acef24afccb..947fa7b4ca8 100644 --- a/Build/source/libs/icu/icu-src/source/data/unidata/confusables.txt +++ b/Build/source/libs/icu/icu-src/source/data/unidata/confusables.txt @@ -1,13 +1,11 @@ # confusables.txt -# Date: 2016-04-05, 11:47:12 GMT -# Copyright (C) 2016 and later: Unicode, Inc. and others. -# License & terms of use: http://www.unicode.org/copyright.html -# © 2016 Unicode®, Inc. +# Date: 2017-04-08, 16:13:41 GMT +# © 2017 Unicode®, Inc. # Unicode and the Unicode Logo are registered trademarks of Unicode, Inc. in the U.S. and other countries. # For terms of use, see http://www.unicode.org/terms_of_use.html # # Unicode Security Mechanisms for UTR #39 -# Version: 9.0.0 +# Version: 10.0.0 # # For documentation and usage, see http://www.unicode.org/reports/tr39 # @@ -76,6 +74,7 @@ A6F0 ; 0302 ; MA # ( ꛰ → ̂ ) BAMUM COMBINING MARK KOQNDON → COMBINING CIR 0E4D ; 030A ; MA # ( ํ → ̊ ) THAI CHARACTER NIKHAHIT → COMBINING RING ABOVE # 0ECD ; 030A ; MA # ( ໍ → ̊ ) LAO NIGGAHITA → COMBINING RING ABOVE # 0366 ; 030A ; MA # ( ͦ → ̊ ) COMBINING LATIN SMALL LETTER O → COMBINING RING ABOVE # +2DEA ; 030A ; MA # ( ⷪ → ̊ ) COMBINING CYRILLIC LETTER O → COMBINING RING ABOVE # →ͦ→ 08EB ; 0308 ; MA # ( ࣫ → ̈ ) ARABIC TONE TWO DOTS ABOVE → COMBINING DIAERESIS # 07F3 ; 0308 ; MA # ( ߳ → ̈ ) NKO COMBINING DOUBLE DOT ABOVE → COMBINING DIAERESIS # @@ -162,6 +161,7 @@ A6F1 ; 0304 ; MA # ( ꛱ → ̄ ) BAMUM COMBINING MARK TUKWENTIS → COMBINING M 08EE ; 0324 ; MA # ( ࣮ → ̤ ) ARABIC TONE TWO DOTS BELOW → COMBINING DIAERESIS BELOW # 1CDE ; 0324 ; MA # ( ᳞ → ̤ ) VEDIC TONE TWO DOTS BELOW → COMBINING DIAERESIS BELOW # +0F37 ; 0325 ; MA # ( ༷ → ̥ ) TIBETAN MARK NGAS BZUNG SGOR RTAGS → COMBINING RING BELOW # 302D ; 0325 ; MA # ( 〭 → ̥ ) IDEOGRAPHIC ENTERING TONE MARK → COMBINING RING BELOW # 0327 ; 0326 ; MA # ( ̧ → ̦ ) COMBINING CEDILLA → COMBINING COMMA BELOW # →̡→ @@ -456,6 +456,14 @@ A78F ; 00B7 ; MA # ( ꞏ → · ) LATIN LETTER SINOLOGICAL DOT → MIDDLE DOT # 14C9 ; 00B7 14C0 ; MA # ( ᓉ → ·ᓀ ) CANADIAN SYLLABICS NWE → MIDDLE DOT, CANADIAN SYLLABICS NE # →ᐧᓀ→ +18C6 ; 00B7 14C2 ; MA # ( ᣆ → ·ᓂ ) CANADIAN SYLLABICS NWI → MIDDLE DOT, CANADIAN SYLLABICS NI # →ᐧᓂ→ + +18C8 ; 00B7 14C3 ; MA # ( ᣈ → ·ᓃ ) CANADIAN SYLLABICS NWII → MIDDLE DOT, CANADIAN SYLLABICS NII # →ᐧᓃ→ + +18CA ; 00B7 14C4 ; MA # ( ᣊ → ·ᓄ ) CANADIAN SYLLABICS NWO → MIDDLE DOT, CANADIAN SYLLABICS NO # →ᐧᓄ→ + +18CC ; 00B7 14C5 ; MA # ( ᣌ → ·ᓅ ) CANADIAN SYLLABICS NWOO → MIDDLE DOT, CANADIAN SYLLABICS NOO # →ᐧᓅ→ + 14CB ; 00B7 14C7 ; MA # ( ᓋ → ·ᓇ ) CANADIAN SYLLABICS NWA → MIDDLE DOT, CANADIAN SYLLABICS NA # →ᐧᓇ→ 14CD ; 00B7 14C8 ; MA # ( ᓍ → ·ᓈ ) CANADIAN SYLLABICS NWAA → MIDDLE DOT, CANADIAN SYLLABICS NAA # →ᐧᓈ→ @@ -514,6 +522,18 @@ A78F ; 00B7 ; MA # ( ꞏ → · ) LATIN LETTER SINOLOGICAL DOT → MIDDLE DOT # 153B ; 00B7 152E ; MA # ( ᔻ → ·ᔮ ) CANADIAN SYLLABICS YWAA → MIDDLE DOT, CANADIAN SYLLABICS YAA # →ᐧᔮ→ +18CE ; 00B7 1543 ; MA # ( ᣎ → ·ᕃ ) CANADIAN SYLLABICS RWEE → MIDDLE DOT, CANADIAN SYLLABICS R-CREE RE # →ᐧᕃ→ + +18CF ; 00B7 1546 ; MA # ( ᣏ → ·ᕆ ) CANADIAN SYLLABICS RWI → MIDDLE DOT, CANADIAN SYLLABICS RI # →ᐧᕆ→ + +18D0 ; 00B7 1547 ; MA # ( ᣐ → ·ᕇ ) CANADIAN SYLLABICS RWII → MIDDLE DOT, CANADIAN SYLLABICS RII # →ᐧᕇ→ + +18D1 ; 00B7 1548 ; MA # ( ᣑ → ·ᕈ ) CANADIAN SYLLABICS RWO → MIDDLE DOT, CANADIAN SYLLABICS RO # →ᐧᕈ→ + +18D2 ; 00B7 1549 ; MA # ( ᣒ → ·ᕉ ) CANADIAN SYLLABICS RWOO → MIDDLE DOT, CANADIAN SYLLABICS ROO # →ᐧᕉ→ + +18D3 ; 00B7 154B ; MA # ( ᣓ → ·ᕋ ) CANADIAN SYLLABICS RWA → MIDDLE DOT, CANADIAN SYLLABICS RA # →ᐧᕋ→ + 154E ; 00B7 154C ; MA # ( ᕎ → ·ᕌ ) CANADIAN SYLLABICS RWAA → MIDDLE DOT, CANADIAN SYLLABICS RAA # →ᐧᕌ→ 155B ; 00B7 155A ; MA # ( ᕛ → ·ᕚ ) CANADIAN SYLLABICS FWAA → MIDDLE DOT, CANADIAN SYLLABICS FAA # →ᐧᕚ→ @@ -544,6 +564,12 @@ A830 ; 0964 ; MA #* ( ꠰ → । ) NORTH INDIC FRACTION ONE QUARTER → DEVANAG 10A57 ; 10A56 10A56 ; MA #* ( ‎𐩗‎ → ‎𐩖𐩖‎ ) KHAROSHTHI PUNCTUATION DOUBLE DANDA → KHAROSHTHI PUNCTUATION DANDA, KHAROSHTHI PUNCTUATION DANDA # +1144C ; 1144B 1144B ; MA #* ( 𑑌 → 𑑋𑑋 ) NEWA DOUBLE DANDA → NEWA DANDA, NEWA DANDA # + +11642 ; 11641 11641 ; MA #* ( 𑙂 → 𑙁𑙁 ) MODI DOUBLE DANDA → MODI DANDA, MODI DANDA # + +11C42 ; 11C41 11C41 ; MA #* ( 𑱂 → 𑱁𑱁 ) BHAIKSUKI DOUBLE DANDA → BHAIKSUKI DANDA, BHAIKSUKI DANDA # + 1C7F ; 1C7E 1C7E ; MA #* ( ᱿ → ᱾᱾ ) OL CHIKI PUNCTUATION DOUBLE MUCAAD → OL CHIKI PUNCTUATION MUCAAD, OL CHIKI PUNCTUATION MUCAAD # 055D ; 0027 ; MA #* ( ՝ → ' ) ARMENIAN COMMA → APOSTROPHE # →ˋ→→`→→‘→ @@ -580,6 +606,8 @@ A78C ; 0027 ; MA # ( ꞌ → ' ) LATIN SMALL LETTER SALTILLO → APOSTROPHE # 07F5 ; 0027 ; MA # ( ‎ߵ‎ → ' ) NKO LOW TONE APOSTROPHE → APOSTROPHE # →‘→ 144A ; 0027 ; MA # ( ᑊ → ' ) CANADIAN SYLLABICS WEST-CREE P → APOSTROPHE # →ˈ→ 16CC ; 0027 ; MA # ( ᛌ → ' ) RUNIC LETTER SHORT-TWIG-SOL S → APOSTROPHE # +16F51 ; 0027 ; MA # ( 𖽑 → ' ) MIAO SIGN ASPIRATION → APOSTROPHE # →ʼ→→′→ +16F52 ; 0027 ; MA # ( 𖽒 → ' ) MIAO SIGN REFORMED VOICING → APOSTROPHE # →ʻ→→‘→ 1CD3 ; 0027 0027 ; MA #* ( ᳓ → '' ) VEDIC SIGN NIHSHVASA → APOSTROPHE, APOSTROPHE # →″→→"→ 0022 ; 0027 0027 ; MA #* ( " → '' ) QUOTATION MARK → APOSTROPHE, APOSTROPHE # @@ -622,7 +650,7 @@ FD3E ; 0028 ; MA #* ( ﴾ → ( ) ORNATE LEFT PARENTHESIS → LEFT PARENTHESIS # 2E28 ; 0028 0028 ; MA #* ( ⸨ → (( ) LEFT DOUBLE PARENTHESIS → LEFT PARENTHESIS, LEFT PARENTHESIS # -3220 ; 0028 30FC 0029 ; MA #* ( ㈠ → (ー) ) PARENTHESIZED IDEOGRAPH ONE → LEFT PARENTHESIS, KATAKANA-HIRAGANA PROLONGED SOUND MARK, RIGHT PARENTHESIS # →(一)→→(⼀)→ +3220 ; 0028 30FC 0029 ; MA #* ( ㈠ → (ー) ) PARENTHESIZED IDEOGRAPH ONE → LEFT PARENTHESIS, KATAKANA-HIRAGANA PROLONGED SOUND MARK, RIGHT PARENTHESIS # →(一)→ 2475 ; 0028 0032 0029 ; MA #* ( ⑵ → (2) ) PARENTHESIZED DIGIT TWO → LEFT PARENTHESIS, DIGIT TWO, RIGHT PARENTHESIS # @@ -751,7 +779,7 @@ FD3E ; 0028 ; MA #* ( ﴾ → ( ) ORNATE LEFT PARENTHESIS → LEFT PARENTHESIS # 1F125 ; 0028 0056 0029 ; MA #* ( 🄥 → (V) ) PARENTHESIZED LATIN CAPITAL LETTER V → LEFT PARENTHESIS, LATIN CAPITAL LETTER V, RIGHT PARENTHESIS # -24B2 ; 0028 0076 0076 0029 ; MA #* ( ⒲ → (vv) ) PARENTHESIZED LATIN SMALL LETTER W → LEFT PARENTHESIS, LATIN SMALL LETTER V, LATIN SMALL LETTER V, RIGHT PARENTHESIS # →(w)→ +24B2 ; 0028 0077 0029 ; MA #* ( ⒲ → (w) ) PARENTHESIZED LATIN SMALL LETTER W → LEFT PARENTHESIS, LATIN SMALL LETTER W, RIGHT PARENTHESIS # 1F126 ; 0028 0057 0029 ; MA #* ( 🄦 → (W) ) PARENTHESIZED LATIN CAPITAL LETTER W → LEFT PARENTHESIS, LATIN CAPITAL LETTER W, RIGHT PARENTHESIS # @@ -1043,9 +1071,9 @@ A714 ; 02EB ; MA #* ( ꜔ → ˫ ) MODIFIER LETTER MID LEFT-STEM TONE BAR → MO 25CB ; 00B0 ; MA #* ( ○ → ° ) WHITE CIRCLE → DEGREE SIGN # →◦→→∘→ 25E6 ; 00B0 ; MA #* ( ◦ → ° ) WHITE BULLET → DEGREE SIGN # →∘→ -235C ; 00B0 0332 ; MA #* ( ⍜ → °̲ ) APL FUNCTIONAL SYMBOL CIRCLE UNDERBAR → DEGREE SIGN, COMBINING LOW LINE # →○̲→ +235C ; 00B0 0332 ; MA #* ( ⍜ → °̲ ) APL FUNCTIONAL SYMBOL CIRCLE UNDERBAR → DEGREE SIGN, COMBINING LOW LINE # →○̲→→∘̲→ -2364 ; 00B0 0308 ; MA #* ( ⍤ → °̈ ) APL FUNCTIONAL SYMBOL JOT DIAERESIS → DEGREE SIGN, COMBINING DIAERESIS # →◦̈→ +2364 ; 00B0 0308 ; MA #* ( ⍤ → °̈ ) APL FUNCTIONAL SYMBOL JOT DIAERESIS → DEGREE SIGN, COMBINING DIAERESIS # →◦̈→→∘̈→ 2103 ; 00B0 0043 ; MA #* ( ℃ → °C ) DEGREE CELSIUS → DEGREE SIGN, LATIN CAPITAL LETTER C # @@ -1174,6 +1202,7 @@ A4FF ; 003D ; MA #* ( ꓿ → = ) LISU PUNCTUATION FULL STOP → EQUALS SIGN # 02C3 ; 003E ; MA #* ( ˃ → > ) MODIFIER LETTER RIGHT ARROWHEAD → GREATER-THAN SIGN # 1D237 ; 003E ; MA #* ( 𝈷 → > ) GREEK INSTRUMENTAL NOTATION SYMBOL-42 → GREATER-THAN SIGN # 1433 ; 003E ; MA # ( ᐳ → > ) CANADIAN SYLLABICS PO → GREATER-THAN SIGN # +16F3F ; 003E ; MA # ( 𖼿 → > ) MIAO LETTER ARCHAIC ZZA → GREATER-THAN SIGN # 1441 ; 003E 00B7 ; MA # ( ᑁ → >· ) CANADIAN SYLLABICS WEST-CREE PWO → GREATER-THAN SIGN, MIDDLE DOT # →ᐳᐧ→ @@ -1191,8 +1220,8 @@ A4FF ; 003D ; MA #* ( ꓿ → = ) LISU PUNCTUATION FULL STOP → EQUALS SIGN # 2368 ; 007E 0308 ; MA #* ( ⍨ → ~̈ ) APL FUNCTIONAL SYMBOL TILDE DIAERESIS → TILDE, COMBINING DIAERESIS # -2E1E ; 007E 0307 ; MA #* ( ⸞ → ~̇ ) TILDE WITH DOT ABOVE → TILDE, COMBINING DOT ABOVE # →⩪→→∼̇→ -2A6A ; 007E 0307 ; MA #* ( ⩪ → ~̇ ) TILDE OPERATOR WITH DOT ABOVE → TILDE, COMBINING DOT ABOVE # →∼̇→ +2E1E ; 007E 0307 ; MA #* ( ⸞ → ~̇ ) TILDE WITH DOT ABOVE → TILDE, COMBINING DOT ABOVE # →⩪→→∼̇→→⁓̇→ +2A6A ; 007E 0307 ; MA #* ( ⩪ → ~̇ ) TILDE OPERATOR WITH DOT ABOVE → TILDE, COMBINING DOT ABOVE # →∼̇→→⁓̇→ 2E1F ; 007E 0323 ; MA #* ( ⸟ → ~̣ ) TILDE WITH DOT BELOW → TILDE, COMBINING DOT BELOW # @@ -1287,6 +1316,8 @@ FE3A ; 23E1 ; MA #* ( ︺ → ⏡ ) PRESENTATION FORM FOR VERTICAL RIGHT TORTOIS 25B1 ; 23E5 ; MA #* ( ▱ → ⏥ ) WHITE PARALLELOGRAM → FLATNESS # +23FC ; 23FB ; MA #* ( ⏼ → ⏻ ) POWER ON-OFF SYMBOL → POWER SYMBOL # + FE31 ; 2502 ; MA #* ( ︱ → │ ) PRESENTATION FORM FOR VERTICAL EM DASH → BOX DRAWINGS LIGHT VERTICAL # →|→ FF5C ; 2502 ; MA #* ( | → │ ) FULLWIDTH VERTICAL LINE → BOX DRAWINGS LIGHT VERTICAL # 2503 ; 2502 ; MA #* ( ┃ → │ ) BOX DRAWINGS HEAVY VERTICAL → BOX DRAWINGS LIGHT VERTICAL # @@ -1315,8 +1346,8 @@ FFED ; 25AA ; MA #* ( ■ → ▪ ) HALFWIDTH BLACK SQUARE → BLACK SMALL SQUAR 1F312 ; 263D ; MA #* ( 🌒 → ☽ ) WAXING CRESCENT MOON SYMBOL → FIRST QUARTER MOON # 1F319 ; 263D ; MA #* ( 🌙 → ☽ ) CRESCENT MOON → FIRST QUARTER MOON # -1F318 ; 263E ; MA #* ( 🌘 → ☾ ) WANING CRESCENT MOON SYMBOL → LAST QUARTER MOON # 23FE ; 263E ; MA #* ( ⏾ → ☾ ) POWER SLEEP SYMBOL → LAST QUARTER MOON # +1F318 ; 263E ; MA #* ( 🌘 → ☾ ) WANING CRESCENT MOON SYMBOL → LAST QUARTER MOON # 29D9 ; 299A ; MA #* ( ⧙ → ⦚ ) RIGHT WIGGLY FENCE → VERTICAL ZIGZAG LINE # @@ -1324,6 +1355,8 @@ FFED ; 25AA ; MA #* ( ■ → ▪ ) HALFWIDTH BLACK SQUARE → BLACK SMALL SQUAR 2A3E ; 2A1F ; MA #* ( ⨾ → ⨟ ) Z NOTATION RELATIONAL COMPOSITION → Z NOTATION SCHEMA COMPOSITION # +101A0 ; 2CE8 ; MA #* ( 𐆠 → ⳨ ) GREEK SYMBOL TAU RHO → COPTIC SYMBOL TAU RO # + 2669 ; 1D158 1D165 ; MA #* ( ♩ → 𝅘𝅥 ) QUARTER NOTE → MUSICAL SYMBOL NOTEHEAD BLACK, MUSICAL SYMBOL COMBINING STEM # 266A ; 1D158 1D165 1D16E ; MA #* ( ♪ → 𝅘𝅥𝅮 ) EIGHTH NOTE → MUSICAL SYMBOL NOTEHEAD BLACK, MUSICAL SYMBOL COMBINING STEM, MUSICAL SYMBOL COMBINING FLAG-1 # @@ -1465,6 +1498,7 @@ A76A ; 0033 ; MA # ( Ꝫ → 3 ) LATIN CAPITAL LETTER ET → DIGIT THREE # 2CCC ; 0033 ; MA # ( Ⳍ → 3 ) COPTIC CAPITAL LETTER OLD COPTIC HORI → DIGIT THREE # →Ȝ→→Ʒ→ 0417 ; 0033 ; MA # ( З → 3 ) CYRILLIC CAPITAL LETTER ZE → DIGIT THREE # 04E0 ; 0033 ; MA # ( Ӡ → 3 ) CYRILLIC CAPITAL LETTER ABKHASIAN DZE → DIGIT THREE # →Ʒ→ +16F3B ; 0033 ; MA # ( 𖼻 → 3 ) MIAO LETTER ZA → DIGIT THREE # →Ʒ→ 118CA ; 0033 ; MA # ( 𑣊 → 3 ) WARANG CITI SMALL LETTER ANG → DIGIT THREE # 06F3 ; 0663 ; MA # ( ۳ → ‎٣‎ ) EXTENDED ARABIC-INDIC DIGIT THREE → ARABIC-INDIC DIGIT THREE # @@ -1568,6 +1602,7 @@ A76A ; 0033 ; MA # ( Ꝫ → 3 ) LATIN CAPITAL LETTER ET → DIGIT THREE # 1D7E9 ; 0037 ; MA # ( 𝟩 → 7 ) MATHEMATICAL SANS-SERIF DIGIT SEVEN → DIGIT SEVEN # 1D7F3 ; 0037 ; MA # ( 𝟳 → 7 ) MATHEMATICAL SANS-SERIF BOLD DIGIT SEVEN → DIGIT SEVEN # 1D7FD ; 0037 ; MA # ( 𝟽 → 7 ) MATHEMATICAL MONOSPACE DIGIT SEVEN → DIGIT SEVEN # +104D2 ; 0037 ; MA # ( 𐓒 → 7 ) OSAGE CAPITAL LETTER ZA → DIGIT SEVEN # 118C6 ; 0037 ; MA # ( 𑣆 → 7 ) WARANG CITI SMALL LETTER II → DIGIT SEVEN # 2466 ; 2786 ; MA #* ( ⑦ → ➆ ) CIRCLED DIGIT SEVEN → DINGBAT CIRCLED SANS-SERIF DIGIT SEVEN # @@ -1666,6 +1701,8 @@ FF41 ; 0061 ; MA # ( a → a ) FULLWIDTH LATIN SMALL LETTER A → LATIN SMALL 1D7AA ; 0061 ; MA # ( 𝞪 → a ) MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL ALPHA → LATIN SMALL LETTER A # →α→ 0430 ; 0061 ; MA # ( а → a ) CYRILLIC SMALL LETTER A → LATIN SMALL LETTER A # +2DF6 ; 0363 ; MA # ( ⷶ → ͣ ) COMBINING CYRILLIC LETTER A → COMBINING LATIN SMALL LETTER A # + FF21 ; 0041 ; MA # ( A → A ) FULLWIDTH LATIN CAPITAL LETTER A → LATIN CAPITAL LETTER A # →А→ 1D400 ; 0041 ; MA # ( 𝐀 → A ) MATHEMATICAL BOLD CAPITAL A → LATIN CAPITAL LETTER A # 1D434 ; 0041 ; MA # ( 𝐴 → A ) MATHEMATICAL ITALIC CAPITAL A → LATIN CAPITAL LETTER A # @@ -1680,7 +1717,6 @@ FF21 ; 0041 ; MA # ( A → A ) FULLWIDTH LATIN CAPITAL LETTER A → LATIN CAPI 1D608 ; 0041 ; MA # ( 𝘈 → A ) MATHEMATICAL SANS-SERIF ITALIC CAPITAL A → LATIN CAPITAL LETTER A # 1D63C ; 0041 ; MA # ( 𝘼 → A ) MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL A → LATIN CAPITAL LETTER A # 1D670 ; 0041 ; MA # ( 𝙰 → A ) MATHEMATICAL MONOSPACE CAPITAL A → LATIN CAPITAL LETTER A # -1D00 ; 0041 ; MA # ( ᴀ → A ) LATIN LETTER SMALL CAPITAL A → LATIN CAPITAL LETTER A # 0391 ; 0041 ; MA # ( Α → A ) GREEK CAPITAL LETTER ALPHA → LATIN CAPITAL LETTER A # 1D6A8 ; 0041 ; MA # ( 𝚨 → A ) MATHEMATICAL BOLD CAPITAL ALPHA → LATIN CAPITAL LETTER A # →𝐀→ 1D6E2 ; 0041 ; MA # ( 𝛢 → A ) MATHEMATICAL ITALIC CAPITAL ALPHA → LATIN CAPITAL LETTER A # →Α→ @@ -1691,6 +1727,7 @@ FF21 ; 0041 ; MA # ( A → A ) FULLWIDTH LATIN CAPITAL LETTER A → LATIN CAPI 13AA ; 0041 ; MA # ( Ꭺ → A ) CHEROKEE LETTER GO → LATIN CAPITAL LETTER A # 15C5 ; 0041 ; MA # ( ᗅ → A ) CANADIAN SYLLABICS CARRIER GHO → LATIN CAPITAL LETTER A # A4EE ; 0041 ; MA # ( ꓮ → A ) LISU LETTER A → LATIN CAPITAL LETTER A # +16F40 ; 0041 ; MA # ( 𖽀 → A ) MIAO LETTER ZZYA → LATIN CAPITAL LETTER A # 102A0 ; 0041 ; MA # ( 𐊠 → A ) CARIAN LETTER A → LATIN CAPITAL LETTER A # 2376 ; 0061 0332 ; MA #* ( ⍶ → a̲ ) APL FUNCTIONAL SYMBOL ALPHA UNDERBAR → LATIN SMALL LETTER A, COMBINING LOW LINE # →α̲→→ɑ̲→ @@ -1739,6 +1776,8 @@ A73D ; 0061 0079 ; MA # ( ꜽ → ay ) LATIN SMALL LETTER AY → LATIN SMALL LET A73C ; 0041 0059 ; MA # ( Ꜽ → AY ) LATIN CAPITAL LETTER AY → LATIN CAPITAL LETTER A, LATIN CAPITAL LETTER Y # +AB7A ; 1D00 ; MA # ( ꭺ → ᴀ ) CHEROKEE SMALL LETTER GO → LATIN LETTER SMALL CAPITAL A # + 2200 ; 2C6F ; MA #* ( ∀ → Ɐ ) FOR ALL → LATIN CAPITAL LETTER TURNED A # 1D217 ; 2C6F ; MA #* ( 𝈗 → Ɐ ) GREEK VOCAL NOTATION SYMBOL-24 → LATIN CAPITAL LETTER TURNED A # 15C4 ; 2C6F ; MA # ( ᗄ → Ɐ ) CANADIAN SYLLABICS CARRIER GHU → LATIN CAPITAL LETTER TURNED A # →∀→ @@ -1808,6 +1847,7 @@ A4D0 ; 0042 ; MA # ( ꓐ → B ) LISU LETTER BA → LATIN CAPITAL LETTER B # 042B ; 0062 006C ; MA # ( Ы → bl ) CYRILLIC CAPITAL LETTER YERU → LATIN SMALL LETTER B, LATIN SMALL LETTER L # →ЬІ→→Ь1→ 0432 ; 0299 ; MA # ( в → ʙ ) CYRILLIC SMALL LETTER VE → LATIN LETTER SMALL CAPITAL B # +13FC ; 0299 ; MA # ( ᏼ → ʙ ) CHEROKEE SMALL LETTER YV → LATIN LETTER SMALL CAPITAL B # FF43 ; 0063 ; MA # ( c → c ) FULLWIDTH LATIN SMALL LETTER C → LATIN SMALL LETTER C # →с→ 217D ; 0063 ; MA # ( ⅽ → c ) SMALL ROMAN NUMERAL ONE HUNDRED → LATIN SMALL LETTER C # @@ -1828,8 +1868,11 @@ FF43 ; 0063 ; MA # ( c → c ) FULLWIDTH LATIN SMALL LETTER C → LATIN SMALL 03F2 ; 0063 ; MA # ( ϲ → c ) GREEK LUNATE SIGMA SYMBOL → LATIN SMALL LETTER C # 2CA5 ; 0063 ; MA # ( ⲥ → c ) COPTIC SMALL LETTER SIMA → LATIN SMALL LETTER C # →ϲ→ 0441 ; 0063 ; MA # ( с → c ) CYRILLIC SMALL LETTER ES → LATIN SMALL LETTER C # +ABAF ; 0063 ; MA # ( ꮯ → c ) CHEROKEE SMALL LETTER TLI → LATIN SMALL LETTER C # →ᴄ→ 1043D ; 0063 ; MA # ( 𐐽 → c ) DESERET SMALL LETTER CHEE → LATIN SMALL LETTER C # +2DED ; 0368 ; MA # ( ⷭ → ͨ ) COMBINING CYRILLIC LETTER ES → COMBINING LATIN SMALL LETTER C # + 1F74C ; 0043 ; MA #* ( 🝌 → C ) ALCHEMICAL SYMBOL FOR CALX → LATIN CAPITAL LETTER C # 118F2 ; 0043 ; MA #* ( 𑣲 → C ) WARANG CITI NUMBER NINETY → LATIN CAPITAL LETTER C # 118E9 ; 0043 ; MA # ( 𑣩 → C ) WARANG CITI DIGIT NINE → LATIN CAPITAL LETTER C # @@ -1892,6 +1935,7 @@ A4DA ; 0043 ; MA # ( ꓚ → C ) LISU LETTER CA → LATIN CAPITAL LETTER C # 2C89 ; A793 ; MA # ( ⲉ → ꞓ ) COPTIC SMALL LETTER EIE → LATIN SMALL LETTER C WITH BAR # →є→ 0454 ; A793 ; MA # ( є → ꞓ ) CYRILLIC SMALL LETTER UKRAINIAN IE → LATIN SMALL LETTER C WITH BAR # 0511 ; A793 ; MA # ( ԑ → ꞓ ) CYRILLIC SMALL LETTER REVERSED ZE → LATIN SMALL LETTER C WITH BAR # →ε→→є→ +AB9B ; A793 ; MA # ( ꮛ → ꞓ ) CHEROKEE SMALL LETTER QUV → LATIN SMALL LETTER C WITH BAR # →ɛ→→є→ 118CE ; A793 ; MA # ( 𑣎 → ꞓ ) WARANG CITI SMALL LETTER YUJ → LATIN SMALL LETTER C WITH BAR # →ε→→є→ 10429 ; A793 ; MA # ( 𐐩 → ꞓ ) DESERET SMALL LETTER LONG E → LATIN SMALL LETTER C WITH BAR # →ɛ→→є→ @@ -1982,6 +2026,8 @@ A77A ; A779 ; MA # ( ꝺ → Ꝺ ) LATIN SMALL LETTER INSULAR D → LATIN CAPITA 02A5 ; 0064 0291 ; MA # ( ʥ → dʑ ) LATIN SMALL LETTER DZ DIGRAPH WITH CURL → LATIN SMALL LETTER D, LATIN SMALL LETTER Z WITH CURL # +AB70 ; 1D05 ; MA # ( ꭰ → ᴅ ) CHEROKEE SMALL LETTER A → LATIN LETTER SMALL CAPITAL D # + 2E39 ; 1E9F ; MA #* ( ⸹ → ẟ ) TOP HALF SECTION SIGN → LATIN SMALL LETTER DELTA # →δ→ 03B4 ; 1E9F ; MA # ( δ → ẟ ) GREEK SMALL LETTER DELTA → LATIN SMALL LETTER DELTA # 1D6C5 ; 1E9F ; MA # ( 𝛅 → ẟ ) MATHEMATICAL BOLD SMALL DELTA → LATIN SMALL LETTER DELTA # →δ→ @@ -2012,6 +2058,8 @@ AB32 ; 0065 ; MA # ( ꬲ → e ) LATIN SMALL LETTER BLACKLETTER E → LATIN SMAL 0435 ; 0065 ; MA # ( е → e ) CYRILLIC SMALL LETTER IE → LATIN SMALL LETTER E # 04BD ; 0065 ; MA # ( ҽ → e ) CYRILLIC SMALL LETTER ABKHASIAN CHE → LATIN SMALL LETTER E # +2DF7 ; 0364 ; MA # ( ⷷ → ͤ ) COMBINING CYRILLIC LETTER IE → COMBINING LATIN SMALL LETTER E # + 22FF ; 0045 ; MA #* ( ⋿ → E ) Z NOTATION BAG MEMBERSHIP → LATIN CAPITAL LETTER E # FF25 ; 0045 ; MA # ( E → E ) FULLWIDTH LATIN CAPITAL LETTER E → LATIN CAPITAL LETTER E # →Ε→ 2130 ; 0045 ; MA # ( ℰ → E ) SCRIPT CAPITAL E → LATIN CAPITAL LETTER E # @@ -2051,6 +2099,8 @@ A4F0 ; 0045 ; MA # ( ꓰ → E ) LISU LETTER E → LATIN CAPITAL LETTER E # 04BF ; 0065 0328 ; MA # ( ҿ → ę ) CYRILLIC SMALL LETTER ABKHASIAN CHE WITH DESCENDER → LATIN SMALL LETTER E, COMBINING OGONEK # →ҽ̢→ +AB7C ; 1D07 ; MA # ( ꭼ → ᴇ ) CHEROKEE SMALL LETTER GV → LATIN LETTER SMALL CAPITAL E # + 0259 ; 01DD ; MA # ( ə → ǝ ) LATIN SMALL LETTER SCHWA → LATIN SMALL LETTER TURNED E # 04D9 ; 01DD ; MA # ( ә → ǝ ) CYRILLIC SMALL LETTER SCHWA → LATIN SMALL LETTER TURNED E # @@ -2072,6 +2122,7 @@ AB42 ; 01DD 006F 0335 ; MA # ( ꭂ → ǝo̵ ) LATIN SMALL LETTER TURNED OE WITH 2107 ; 0190 ; MA # ( ℇ → Ɛ ) EULER CONSTANT → LATIN CAPITAL LETTER OPEN E # 0510 ; 0190 ; MA # ( Ԑ → Ɛ ) CYRILLIC CAPITAL LETTER REVERSED ZE → LATIN CAPITAL LETTER OPEN E # 13CB ; 0190 ; MA # ( Ꮛ → Ɛ ) CHEROKEE LETTER QUV → LATIN CAPITAL LETTER OPEN E # +16F2D ; 0190 ; MA # ( 𖼭 → Ɛ ) MIAO LETTER NYHA → LATIN CAPITAL LETTER OPEN E # 10401 ; 0190 ; MA # ( 𐐁 → Ɛ ) DESERET CAPITAL LETTER LONG E → LATIN CAPITAL LETTER OPEN E # 1D9F ; 1D4B ; MA # ( ᶟ → ᵋ ) MODIFIER LETTER SMALL REVERSED OPEN E → MODIFIER LETTER SMALL OPEN E # @@ -2210,6 +2261,8 @@ A4D6 ; 0047 ; MA # ( ꓖ → G ) LISU LETTER GA → LATIN CAPITAL LETTER G # 0193 ; 0047 0027 ; MA # ( Ɠ → G' ) LATIN CAPITAL LETTER G WITH HOOK → LATIN CAPITAL LETTER G, APOSTROPHE # →Gʽ→ 050D ; 0262 ; MA # ( ԍ → ɢ ) CYRILLIC SMALL LETTER KOMI SJE → LATIN LETTER SMALL CAPITAL G # +AB90 ; 0262 ; MA # ( ꮐ → ɢ ) CHEROKEE SMALL LETTER NAH → LATIN LETTER SMALL CAPITAL G # +13FB ; 0262 ; MA # ( ᏻ → ɢ ) CHEROKEE SMALL LETTER YU → LATIN LETTER SMALL CAPITAL G # FF48 ; 0068 ; MA # ( h → h ) FULLWIDTH LATIN SMALL LETTER H → LATIN SMALL LETTER H # →һ→ 210E ; 0068 ; MA # ( ℎ → h ) PLANCK CONSTANT → LATIN SMALL LETTER H # @@ -2275,6 +2328,7 @@ A695 ; 0068 0314 ; MA # ( ꚕ → h̔ ) CYRILLIC SMALL LETTER HWE → LATIN SMAL 04C7 ; 0048 0326 ; MA # ( Ӈ → H̦ ) CYRILLIC CAPITAL LETTER EN WITH HOOK → LATIN CAPITAL LETTER H, COMBINING COMMA BELOW # →Н̡→ 043D ; 029C ; MA # ( н → ʜ ) CYRILLIC SMALL LETTER EN → LATIN LETTER SMALL CAPITAL H # +AB8B ; 029C ; MA # ( ꮋ → ʜ ) CHEROKEE SMALL LETTER MI → LATIN LETTER SMALL CAPITAL H # 04A3 ; 029C 0329 ; MA # ( ң → ʜ̩ ) CYRILLIC SMALL LETTER EN WITH DESCENDER → LATIN LETTER SMALL CAPITAL H, COMBINING VERTICAL LINE BELOW # →н̩→ @@ -2283,6 +2337,8 @@ A695 ; 0068 0314 ; MA # ( ꚕ → h̔ ) CYRILLIC SMALL LETTER HWE → LATIN SMAL 050A ; 01F6 ; MA # ( Ԋ → Ƕ ) CYRILLIC CAPITAL LETTER KOMI NJE → LATIN CAPITAL LETTER HWAIR # +AB80 ; 2C76 ; MA # ( ꮀ → ⱶ ) CHEROKEE SMALL LETTER HO → LATIN SMALL LETTER HALF H # + 0370 ; 2C75 ; MA # ( Ͱ → Ⱶ ) GREEK CAPITAL LETTER HETA → LATIN CAPITAL LETTER HALF H # →Ꮀ→ 13A8 ; 2C75 ; MA # ( Ꭸ → Ⱶ ) CHEROKEE LETTER GE → LATIN CAPITAL LETTER HALF H # →Ͱ→→Ꮀ→ 13B0 ; 2C75 ; MA # ( Ꮀ → Ⱶ ) CHEROKEE LETTER HO → LATIN CAPITAL LETTER HALF H # @@ -2324,6 +2380,7 @@ FF49 ; 0069 ; MA # ( i → i ) FULLWIDTH LATIN SMALL LETTER I → LATIN SMALL 0456 ; 0069 ; MA # ( і → i ) CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I → LATIN SMALL LETTER I # A647 ; 0069 ; MA # ( ꙇ → i ) CYRILLIC SMALL LETTER IOTA → LATIN SMALL LETTER I # →ι→ 04CF ; 0069 ; MA # ( ӏ → i ) CYRILLIC SMALL LETTER PALOCHKA → LATIN SMALL LETTER I # →ı→ +AB75 ; 0069 ; MA # ( ꭵ → i ) CHEROKEE SMALL LETTER V → LATIN SMALL LETTER I # 13A5 ; 0069 ; MA # ( Ꭵ → i ) CHEROKEE LETTER V → LATIN SMALL LETTER I # 118C3 ; 0069 ; MA # ( 𑣃 → i ) WARANG CITI SMALL LETTER YU → LATIN SMALL LETTER I # →ι→ @@ -2397,6 +2454,8 @@ A4D9 ; 004A ; MA # ( ꓙ → J ) LISU LETTER JA → LATIN CAPITAL LETTER J # 1D6A5 ; 0237 ; MA # ( 𝚥 → ȷ ) MATHEMATICAL ITALIC SMALL DOTLESS J → LATIN SMALL LETTER DOTLESS J # 0575 ; 0237 ; MA # ( յ → ȷ ) ARMENIAN SMALL LETTER YI → LATIN SMALL LETTER DOTLESS J # +AB7B ; 1D0A ; MA # ( ꭻ → ᴊ ) CHEROKEE SMALL LETTER GU → LATIN LETTER SMALL CAPITAL J # + 1D424 ; 006B ; MA # ( 𝐤 → k ) MATHEMATICAL BOLD SMALL K → LATIN SMALL LETTER K # 1D458 ; 006B ; MA # ( 𝑘 → k ) MATHEMATICAL ITALIC SMALL K → LATIN SMALL LETTER K # 1D48C ; 006B ; MA # ( 𝒌 → k ) MATHEMATICAL BOLD ITALIC SMALL K → LATIN SMALL LETTER K # @@ -2410,22 +2469,6 @@ A4D9 ; 004A ; MA # ( ꓙ → J ) LISU LETTER JA → LATIN CAPITAL LETTER J # 1D62C ; 006B ; MA # ( 𝘬 → k ) MATHEMATICAL SANS-SERIF ITALIC SMALL K → LATIN SMALL LETTER K # 1D660 ; 006B ; MA # ( 𝙠 → k ) MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL K → LATIN SMALL LETTER K # 1D694 ; 006B ; MA # ( 𝚔 → k ) MATHEMATICAL MONOSPACE SMALL K → LATIN SMALL LETTER K # -1D0B ; 006B ; MA # ( ᴋ → k ) LATIN LETTER SMALL CAPITAL K → LATIN SMALL LETTER K # →к→ -0138 ; 006B ; MA # ( ĸ → k ) LATIN SMALL LETTER KRA → LATIN SMALL LETTER K # →к→ -03BA ; 006B ; MA # ( κ → k ) GREEK SMALL LETTER KAPPA → LATIN SMALL LETTER K # →к→ -03F0 ; 006B ; MA # ( ϰ → k ) GREEK KAPPA SYMBOL → LATIN SMALL LETTER K # →κ→→к→ -1D6CB ; 006B ; MA # ( 𝛋 → k ) MATHEMATICAL BOLD SMALL KAPPA → LATIN SMALL LETTER K # →κ→→к→ -1D6DE ; 006B ; MA # ( 𝛞 → k ) MATHEMATICAL BOLD KAPPA SYMBOL → LATIN SMALL LETTER K # →κ→→к→ -1D705 ; 006B ; MA # ( 𝜅 → k ) MATHEMATICAL ITALIC SMALL KAPPA → LATIN SMALL LETTER K # →κ→→к→ -1D718 ; 006B ; MA # ( 𝜘 → k ) MATHEMATICAL ITALIC KAPPA SYMBOL → LATIN SMALL LETTER K # →κ→→к→ -1D73F ; 006B ; MA # ( 𝜿 → k ) MATHEMATICAL BOLD ITALIC SMALL KAPPA → LATIN SMALL LETTER K # →κ→→к→ -1D752 ; 006B ; MA # ( 𝝒 → k ) MATHEMATICAL BOLD ITALIC KAPPA SYMBOL → LATIN SMALL LETTER K # →κ→→к→ -1D779 ; 006B ; MA # ( 𝝹 → k ) MATHEMATICAL SANS-SERIF BOLD SMALL KAPPA → LATIN SMALL LETTER K # →κ→→к→ -1D78C ; 006B ; MA # ( 𝞌 → k ) MATHEMATICAL SANS-SERIF BOLD KAPPA SYMBOL → LATIN SMALL LETTER K # →κ→→к→ -1D7B3 ; 006B ; MA # ( 𝞳 → k ) MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL KAPPA → LATIN SMALL LETTER K # →κ→→к→ -1D7C6 ; 006B ; MA # ( 𝟆 → k ) MATHEMATICAL SANS-SERIF BOLD ITALIC KAPPA SYMBOL → LATIN SMALL LETTER K # →κ→→к→ -2C95 ; 006B ; MA # ( ⲕ → k ) COPTIC SMALL LETTER KAPA → LATIN SMALL LETTER K # →κ→→к→ -043A ; 006B ; MA # ( к → k ) CYRILLIC SMALL LETTER KA → LATIN SMALL LETTER K # 212A ; 004B ; MA # ( K → K ) KELVIN SIGN → LATIN CAPITAL LETTER K # FF2B ; 004B ; MA # ( K → K ) FULLWIDTH LATIN CAPITAL LETTER K → LATIN CAPITAL LETTER K # →Κ→ @@ -2457,13 +2500,9 @@ A4D7 ; 004B ; MA # ( ꓗ → K ) LISU LETTER KA → LATIN CAPITAL LETTER K # 0199 ; 006B 0314 ; MA # ( ƙ → k̔ ) LATIN SMALL LETTER K WITH HOOK → LATIN SMALL LETTER K, COMBINING REVERSED COMMA ABOVE # -049B ; 006B 0329 ; MA # ( қ → k̩ ) CYRILLIC SMALL LETTER KA WITH DESCENDER → LATIN SMALL LETTER K, COMBINING VERTICAL LINE BELOW # →к̩→ - 2C69 ; 004B 0329 ; MA # ( Ⱪ → K̩ ) LATIN CAPITAL LETTER K WITH DESCENDER → LATIN CAPITAL LETTER K, COMBINING VERTICAL LINE BELOW # →Қ→→К̩→ 049A ; 004B 0329 ; MA # ( Қ → K̩ ) CYRILLIC CAPITAL LETTER KA WITH DESCENDER → LATIN CAPITAL LETTER K, COMBINING VERTICAL LINE BELOW # →К̩→ -049F ; 006B 0335 ; MA # ( ҟ → k̵ ) CYRILLIC SMALL LETTER KA WITH STROKE → LATIN SMALL LETTER K, COMBINING SHORT STROKE OVERLAY # →к̵→ - 20AD ; 004B 0335 ; MA #* ( ₭ → K̵ ) KIP SIGN → LATIN CAPITAL LETTER K, COMBINING SHORT STROKE OVERLAY # →K̶→ A740 ; 004B 0335 ; MA # ( Ꝁ → K̵ ) LATIN CAPITAL LETTER K WITH STROKE → LATIN CAPITAL LETTER K, COMBINING SHORT STROKE OVERLAY # →Ҟ→→К̵→ 049E ; 004B 0335 ; MA # ( Ҟ → K̵ ) CYRILLIC CAPITAL LETTER KA WITH STROKE → LATIN CAPITAL LETTER K, COMBINING SHORT STROKE OVERLAY # →К̵→ @@ -2473,6 +2512,7 @@ A740 ; 004B 0335 ; MA # ( Ꝁ → K̵ ) LATIN CAPITAL LETTER K WITH STROKE → L 05C0 ; 006C ; MA #* ( ‎׀‎ → l ) HEBREW PUNCTUATION PASEQ → LATIN SMALL LETTER L # →|→ 007C ; 006C ; MA #* ( | → l ) VERTICAL LINE → LATIN SMALL LETTER L # 2223 ; 006C ; MA #* ( ∣ → l ) DIVIDES → LATIN SMALL LETTER L # →ǀ→ +23FD ; 006C ; MA #* ( ⏽ → l ) POWER ON SYMBOL → LATIN SMALL LETTER L # →I→ FFE8 ; 006C ; MA #* ( │ → l ) HALFWIDTH FORMS LIGHT VERTICAL → LATIN SMALL LETTER L # →|→ 0031 ; 006C ; MA # ( 1 → l ) DIGIT ONE → LATIN SMALL LETTER L # 0661 ; 006C ; MA # ( ‎١‎ → l ) ARABIC-INDIC DIGIT ONE → LATIN SMALL LETTER L # →1→ @@ -2538,9 +2578,9 @@ FE8D ; 006C ; MA # ( ‎ﺍ‎ → l ) ARABIC LETTER ALEF ISOLATED FORM → LATI 2D4F ; 006C ; MA # ( ⵏ → l ) TIFINAGH LETTER YAN → LATIN SMALL LETTER L # →Ӏ→ 16C1 ; 006C ; MA # ( ᛁ → l ) RUNIC LETTER ISAZ IS ISS I → LATIN SMALL LETTER L # →I→ A4F2 ; 006C ; MA # ( ꓲ → l ) LISU LETTER I → LATIN SMALL LETTER L # →I→ +16F28 ; 006C ; MA # ( 𖼨 → l ) MIAO LETTER GHA → LATIN SMALL LETTER L # →I→ 1028A ; 006C ; MA # ( 𐊊 → l ) LYCIAN LETTER J → LATIN SMALL LETTER L # →I→ 10309 ; 006C ; MA # ( 𐌉 → l ) OLD ITALIC LETTER I → LATIN SMALL LETTER L # →I→ -23FD ; 006C ; MA #* ( ⏽ → l ) POWER ON SYMBOL → LATIN SMALL LETTER L # →I→ 1D22A ; 004C ; MA #* ( 𝈪 → L ) GREEK INSTRUMENTAL NOTATION SYMBOL-23 → LATIN CAPITAL LETTER L # 216C ; 004C ; MA # ( Ⅼ → L ) ROMAN NUMERAL FIFTY → LATIN CAPITAL LETTER L # @@ -2561,6 +2601,7 @@ A4F2 ; 006C ; MA # ( ꓲ → l ) LISU LETTER I → LATIN SMALL LETTER L # →I 13DE ; 004C ; MA # ( Ꮮ → L ) CHEROKEE LETTER TLE → LATIN CAPITAL LETTER L # 14AA ; 004C ; MA # ( ᒪ → L ) CANADIAN SYLLABICS MA → LATIN CAPITAL LETTER L # A4E1 ; 004C ; MA # ( ꓡ → L ) LISU LETTER LA → LATIN CAPITAL LETTER L # +16F16 ; 004C ; MA # ( 𖼖 → L ) MIAO LETTER LA → LATIN CAPITAL LETTER L # 118A3 ; 004C ; MA # ( 𑢣 → L ) WARANG CITI CAPITAL LETTER YU → LATIN CAPITAL LETTER L # 118B2 ; 004C ; MA # ( 𑢲 → L ) WARANG CITI CAPITAL LETTER TTE → LATIN CAPITAL LETTER L # 1041B ; 004C ; MA # ( 𐐛 → L ) DESERET CAPITAL LETTER ETH → LATIN CAPITAL LETTER L # @@ -2659,10 +2700,14 @@ FE87 ; 006C 0655 ; MA # ( ‎ﺇ‎ → lٕ ) ARABIC LETTER ALEF WITH HAMZA BELO 01C1 ; 006C 006C ; MA # ( ǁ → ll ) LATIN LETTER LATERAL CLICK → LATIN SMALL LETTER L, LATIN SMALL LETTER L # →‖→→∥→→||→ 05F0 ; 006C 006C ; MA # ( ‎װ‎ → ll ) HEBREW LIGATURE YIDDISH DOUBLE VAV → LATIN SMALL LETTER L, LATIN SMALL LETTER L # →‎וו‎→ +10199 ; 006C 0335 006C 0335 ; MA #* ( 𐆙 → l̵l̵ ) ROMAN DUPONDIUS SIGN → LATIN SMALL LETTER L, COMBINING SHORT STROKE OVERLAY, LATIN SMALL LETTER L, COMBINING SHORT STROKE OVERLAY # →I̶I̶→ + 2492 ; 006C 006C 002E ; MA #* ( ⒒ → ll. ) NUMBER ELEVEN FULL STOP → LATIN SMALL LETTER L, LATIN SMALL LETTER L, FULL STOP # →11.→ 2162 ; 006C 006C 006C ; MA # ( Ⅲ → lll ) ROMAN NUMERAL THREE → LATIN SMALL LETTER L, LATIN SMALL LETTER L, LATIN SMALL LETTER L # →III→ +10198 ; 006C 0335 006C 0335 0053 0335 ; MA #* ( 𐆘 → l̵l̵S̵ ) ROMAN SESTERTIUS SIGN → LATIN SMALL LETTER L, COMBINING SHORT STROKE OVERLAY, LATIN SMALL LETTER L, COMBINING SHORT STROKE OVERLAY, LATIN CAPITAL LETTER S, COMBINING SHORT STROKE OVERLAY # →I̶I̶S̶→ + 33EA ; 006C 006C 65E5 ; MA #* ( ㏪ → ll日 ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY ELEVEN → LATIN SMALL LETTER L, LATIN SMALL LETTER L, CJK UNIFIED IDEOGRAPH-65E5 # →11日→ 32CA ; 006C 006C 6708 ; MA #* ( ㋊ → ll月 ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR NOVEMBER → LATIN SMALL LETTER L, LATIN SMALL LETTER L, CJK UNIFIED IDEOGRAPH-6708 # →11月→ @@ -2708,6 +2753,7 @@ FDF2 ; 006C 0644 0644 0651 0670 006F ; MA # ( ‎ﷲ‎ → ‎lللّٰo‎ ) A 3359 ; 006C 70B9 ; MA #* ( ㍙ → l点 ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR ONE → LATIN SMALL LETTER L, CJK UNIFIED IDEOGRAPH-70B9 # →1点→ 2CD1 ; 029F ; MA # ( ⳑ → ʟ ) COPTIC SMALL LETTER L-SHAPED HA → LATIN LETTER SMALL CAPITAL L # +ABAE ; 029F ; MA # ( ꮮ → ʟ ) CHEROKEE SMALL LETTER TLE → LATIN LETTER SMALL CAPITAL L # 10443 ; 029F ; MA # ( 𐑃 → ʟ ) DESERET SMALL LETTER ETH → LATIN LETTER SMALL CAPITAL L # FF2D ; 004D ; MA # ( M → M ) FULLWIDTH LATIN CAPITAL LETTER M → LATIN CAPITAL LETTER M # →Μ→ @@ -2760,21 +2806,6 @@ A4DF ; 004D ; MA # ( ꓟ → M ) LISU LETTER MA → LATIN CAPITAL LETTER M # 1D62F ; 006E ; MA # ( 𝘯 → n ) MATHEMATICAL SANS-SERIF ITALIC SMALL N → LATIN SMALL LETTER N # 1D663 ; 006E ; MA # ( 𝙣 → n ) MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL N → LATIN SMALL LETTER N # 1D697 ; 006E ; MA # ( 𝚗 → n ) MATHEMATICAL MONOSPACE SMALL N → LATIN SMALL LETTER N # -03C0 ; 006E ; MA # ( π → n ) GREEK SMALL LETTER PI → LATIN SMALL LETTER N # -03D6 ; 006E ; MA # ( ϖ → n ) GREEK PI SYMBOL → LATIN SMALL LETTER N # →π→ -213C ; 006E ; MA # ( ℼ → n ) DOUBLE-STRUCK SMALL PI → LATIN SMALL LETTER N # →π→ -1D6D1 ; 006E ; MA # ( 𝛑 → n ) MATHEMATICAL BOLD SMALL PI → LATIN SMALL LETTER N # →π→ -1D6E1 ; 006E ; MA # ( 𝛡 → n ) MATHEMATICAL BOLD PI SYMBOL → LATIN SMALL LETTER N # →π→ -1D70B ; 006E ; MA # ( 𝜋 → n ) MATHEMATICAL ITALIC SMALL PI → LATIN SMALL LETTER N # →π→ -1D71B ; 006E ; MA # ( 𝜛 → n ) MATHEMATICAL ITALIC PI SYMBOL → LATIN SMALL LETTER N # →π→ -1D745 ; 006E ; MA # ( 𝝅 → n ) MATHEMATICAL BOLD ITALIC SMALL PI → LATIN SMALL LETTER N # →π→ -1D755 ; 006E ; MA # ( 𝝕 → n ) MATHEMATICAL BOLD ITALIC PI SYMBOL → LATIN SMALL LETTER N # →π→ -1D77F ; 006E ; MA # ( 𝝿 → n ) MATHEMATICAL SANS-SERIF BOLD SMALL PI → LATIN SMALL LETTER N # →π→ -1D78F ; 006E ; MA # ( 𝞏 → n ) MATHEMATICAL SANS-SERIF BOLD PI SYMBOL → LATIN SMALL LETTER N # →π→ -1D7B9 ; 006E ; MA # ( 𝞹 → n ) MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL PI → LATIN SMALL LETTER N # →π→ -1D7C9 ; 006E ; MA # ( 𝟉 → n ) MATHEMATICAL SANS-SERIF BOLD ITALIC PI SYMBOL → LATIN SMALL LETTER N # →π→ -1D28 ; 006E ; MA # ( ᴨ → n ) GREEK LETTER SMALL CAPITAL PI → LATIN SMALL LETTER N # →п→ -043F ; 006E ; MA # ( п → n ) CYRILLIC SMALL LETTER PE → LATIN SMALL LETTER N # 0578 ; 006E ; MA # ( ո → n ) ARMENIAN SMALL LETTER VO → LATIN SMALL LETTER N # 057C ; 006E ; MA # ( ռ → n ) ARMENIAN SMALL LETTER RA → LATIN SMALL LETTER N # @@ -2802,6 +2833,8 @@ FF2E ; 004E ; MA # ( N → N ) FULLWIDTH LATIN CAPITAL LETTER N → LATIN CAPI A4E0 ; 004E ; MA # ( ꓠ → N ) LISU LETTER NA → LATIN CAPITAL LETTER N # 10513 ; 004E ; MA # ( 𐔓 → N ) ELBASAN LETTER NE → LATIN CAPITAL LETTER N # +1018E ; 004E 030A ; MA #* ( 𐆎 → N̊ ) NOMISMA SIGN → LATIN CAPITAL LETTER N, COMBINING RING ABOVE # →Νͦ→ + 0273 ; 006E 0328 ; MA # ( ɳ → n̨ ) LATIN SMALL LETTER N WITH RETROFLEX HOOK → LATIN SMALL LETTER N, COMBINING OGONEK # →n̢→ 019E ; 006E 0329 ; MA # ( ƞ → n̩ ) LATIN SMALL LETTER N WITH LONG RIGHT LEG → LATIN SMALL LETTER N, COMBINING VERTICAL LINE BELOW # @@ -2901,6 +2934,7 @@ FBA6 ; 006F ; MA # ( ‎ﮦ‎ → o ) ARABIC LETTER HEH GOAL ISOLATED FORM → 06D5 ; 006F ; MA # ( ‎ە‎ → o ) ARABIC LETTER AE → LATIN SMALL LETTER O # →‎ه‎→ 0D20 ; 006F ; MA # ( ഠ → o ) MALAYALAM LETTER TTHA → LATIN SMALL LETTER O # 101D ; 006F ; MA # ( ဝ → o ) MYANMAR LETTER WA → LATIN SMALL LETTER O # +104EA ; 006F ; MA # ( 𐓪 → o ) OSAGE SMALL LETTER O → LATIN SMALL LETTER O # 118C8 ; 006F ; MA # ( 𑣈 → o ) WARANG CITI SMALL LETTER E → LATIN SMALL LETTER O # 118D7 ; 006F ; MA # ( 𑣗 → o ) WARANG CITI SMALL LETTER BU → LATIN SMALL LETTER O # 1042C ; 006F ; MA # ( 𐐬 → o ) DESERET SMALL LETTER LONG O → LATIN SMALL LETTER O # @@ -2943,6 +2977,7 @@ FF2F ; 004F ; MA # ( O → O ) FULLWIDTH LATIN CAPITAL LETTER O → LATIN CAPI 2D54 ; 004F ; MA # ( ⵔ → O ) TIFINAGH LETTER YAR → LATIN CAPITAL LETTER O # 12D0 ; 004F ; MA # ( ዐ → O ) ETHIOPIC SYLLABLE PHARYNGEAL A → LATIN CAPITAL LETTER O # →Օ→ 0B20 ; 004F ; MA # ( ଠ → O ) ORIYA LETTER TTHA → LATIN CAPITAL LETTER O # →୦→→0→ +104C2 ; 004F ; MA # ( 𐓂 → O ) OSAGE CAPITAL LETTER O → LATIN CAPITAL LETTER O # A4F3 ; 004F ; MA # ( ꓳ → O ) LISU LETTER O → LATIN CAPITAL LETTER O # 118B5 ; 004F ; MA # ( 𑢵 → O ) WARANG CITI CAPITAL LETTER AT → LATIN CAPITAL LETTER O # 10292 ; 004F ; MA # ( 𐊒 → O ) LYCIAN LETTER U → LATIN CAPITAL LETTER O # @@ -2971,6 +3006,8 @@ AB3E ; 006F 0338 ; MA # ( ꬾ → o̸ ) LATIN SMALL LETTER BLACKLETTER O WITH ST A74B ; 006F 0335 ; MA # ( ꝋ → o̵ ) LATIN SMALL LETTER O WITH LONG STROKE OVERLAY → LATIN SMALL LETTER O, COMBINING SHORT STROKE OVERLAY # →o̶→ 04E9 ; 006F 0335 ; MA # ( ө → o̵ ) CYRILLIC SMALL LETTER BARRED O → LATIN SMALL LETTER O, COMBINING SHORT STROKE OVERLAY # →ѳ→ 0473 ; 006F 0335 ; MA # ( ѳ → o̵ ) CYRILLIC SMALL LETTER FITA → LATIN SMALL LETTER O, COMBINING SHORT STROKE OVERLAY # +AB8E ; 006F 0335 ; MA # ( ꮎ → o̵ ) CHEROKEE SMALL LETTER NA → LATIN SMALL LETTER O, COMBINING SHORT STROKE OVERLAY # →ɵ→ +ABBB ; 006F 0335 ; MA # ( ꮻ → o̵ ) CHEROKEE SMALL LETTER WI → LATIN SMALL LETTER O, COMBINING SHORT STROKE OVERLAY # →ѳ→ 2296 ; 004F 0335 ; MA #* ( ⊖ → O̵ ) CIRCLED MINUS → LATIN CAPITAL LETTER O, COMBINING SHORT STROKE OVERLAY # →θ→→Ꮎ→ 229D ; 004F 0335 ; MA #* ( ⊝ → O̵ ) CIRCLED DASH → LATIN CAPITAL LETTER O, COMBINING SHORT STROKE OVERLAY # →⊖→→θ→→Ꮎ→ @@ -3009,6 +3046,8 @@ A74A ; 004F 0335 ; MA # ( Ꝋ → O̵ ) LATIN CAPITAL LETTER O WITH LONG STROKE 13BE ; 004F 0335 ; MA # ( Ꮎ → O̵ ) CHEROKEE LETTER NA → LATIN CAPITAL LETTER O, COMBINING SHORT STROKE OVERLAY # 13EB ; 004F 0335 ; MA # ( Ꮻ → O̵ ) CHEROKEE LETTER WI → LATIN CAPITAL LETTER O, COMBINING SHORT STROKE OVERLAY # →Ѳ→→О̵→ +AB74 ; 006F 031B ; MA # ( ꭴ → ơ ) CHEROKEE SMALL LETTER U → LATIN SMALL LETTER O, COMBINING HORN # + FCD9 ; 006F 0670 ; MA # ( ‎ﳙ‎ → oٰ ) ARABIC LIGATURE HEH WITH SUPERSCRIPT ALEF INITIAL FORM → LATIN SMALL LETTER O, ARABIC LETTER SUPERSCRIPT ALEF # →‎هٰ‎→ 1F101 ; 004F 002C ; MA #* ( 🄁 → O, ) DIGIT ZERO COMMA → LATIN CAPITAL LETTER O, COMMA # →0,→ @@ -3074,6 +3113,8 @@ A4DB ; 0186 ; MA # ( ꓛ → Ɔ ) LISU LETTER CHA → LATIN CAPITAL LETTER OPEN AB3F ; 0254 0338 ; MA # ( ꬿ → ɔ̸ ) LATIN SMALL LETTER OPEN O WITH STROKE → LATIN SMALL LETTER OPEN O, COMBINING LONG SOLIDUS OVERLAY # +AB62 ; 0254 0065 ; MA # ( ꭢ → ɔe ) LATIN SMALL LETTER OPEN OE → LATIN SMALL LETTER OPEN O, LATIN SMALL LETTER E # + 1043F ; 0277 ; MA # ( 𐐿 → ɷ ) DESERET SMALL LETTER KAY → LATIN SMALL LETTER CLOSED OMEGA # 2374 ; 0070 ; MA #* ( ⍴ → p ) APL FUNCTIONAL SYMBOL RHO → LATIN SMALL LETTER P # →ρ→ @@ -3142,6 +3183,7 @@ A4D1 ; 0050 ; MA # ( ꓑ → P ) LISU LETTER PA → LATIN CAPITAL LETTER P # 1486 ; 0050 0027 ; MA # ( ᒆ → P' ) CANADIAN SYLLABICS SOUTH-SLAVEY KIH → LATIN CAPITAL LETTER P, APOSTROPHE # →ᑭᑊ→ 1D29 ; 1D18 ; MA # ( ᴩ → ᴘ ) GREEK LETTER SMALL CAPITAL RHO → LATIN LETTER SMALL CAPITAL P # +ABB2 ; 1D18 ; MA # ( ꮲ → ᴘ ) CHEROKEE SMALL LETTER TLV → LATIN LETTER SMALL CAPITAL P # 03C6 ; 0278 ; MA # ( φ → ɸ ) GREEK SMALL LETTER PHI → LATIN SMALL LETTER PHI # 03D5 ; 0278 ; MA # ( ϕ → ɸ ) GREEK PHI SYMBOL → LATIN SMALL LETTER PHI # @@ -3196,6 +3238,27 @@ A4D1 ; 0050 ; MA # ( ꓑ → P ) LISU LETTER PA → LATIN CAPITAL LETTER P # 1D90 ; 024B ; MA # ( ᶐ → ɋ ) LATIN SMALL LETTER ALPHA WITH RETROFLEX HOOK → LATIN SMALL LETTER Q WITH HOOK TAIL # +1D0B ; 0138 ; MA # ( ᴋ → ĸ ) LATIN LETTER SMALL CAPITAL K → LATIN SMALL LETTER KRA # +03BA ; 0138 ; MA # ( κ → ĸ ) GREEK SMALL LETTER KAPPA → LATIN SMALL LETTER KRA # +03F0 ; 0138 ; MA # ( ϰ → ĸ ) GREEK KAPPA SYMBOL → LATIN SMALL LETTER KRA # →κ→ +1D6CB ; 0138 ; MA # ( 𝛋 → ĸ ) MATHEMATICAL BOLD SMALL KAPPA → LATIN SMALL LETTER KRA # →κ→ +1D6DE ; 0138 ; MA # ( 𝛞 → ĸ ) MATHEMATICAL BOLD KAPPA SYMBOL → LATIN SMALL LETTER KRA # →κ→ +1D705 ; 0138 ; MA # ( 𝜅 → ĸ ) MATHEMATICAL ITALIC SMALL KAPPA → LATIN SMALL LETTER KRA # →κ→ +1D718 ; 0138 ; MA # ( 𝜘 → ĸ ) MATHEMATICAL ITALIC KAPPA SYMBOL → LATIN SMALL LETTER KRA # →κ→ +1D73F ; 0138 ; MA # ( 𝜿 → ĸ ) MATHEMATICAL BOLD ITALIC SMALL KAPPA → LATIN SMALL LETTER KRA # →κ→ +1D752 ; 0138 ; MA # ( 𝝒 → ĸ ) MATHEMATICAL BOLD ITALIC KAPPA SYMBOL → LATIN SMALL LETTER KRA # →κ→ +1D779 ; 0138 ; MA # ( 𝝹 → ĸ ) MATHEMATICAL SANS-SERIF BOLD SMALL KAPPA → LATIN SMALL LETTER KRA # →κ→ +1D78C ; 0138 ; MA # ( 𝞌 → ĸ ) MATHEMATICAL SANS-SERIF BOLD KAPPA SYMBOL → LATIN SMALL LETTER KRA # →κ→ +1D7B3 ; 0138 ; MA # ( 𝞳 → ĸ ) MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL KAPPA → LATIN SMALL LETTER KRA # →κ→ +1D7C6 ; 0138 ; MA # ( 𝟆 → ĸ ) MATHEMATICAL SANS-SERIF BOLD ITALIC KAPPA SYMBOL → LATIN SMALL LETTER KRA # →κ→ +2C95 ; 0138 ; MA # ( ⲕ → ĸ ) COPTIC SMALL LETTER KAPA → LATIN SMALL LETTER KRA # →κ→ +043A ; 0138 ; MA # ( к → ĸ ) CYRILLIC SMALL LETTER KA → LATIN SMALL LETTER KRA # +ABB6 ; 0138 ; MA # ( ꮶ → ĸ ) CHEROKEE SMALL LETTER TSO → LATIN SMALL LETTER KRA # →ᴋ→ + +049B ; 0138 0329 ; MA # ( қ → ĸ̩ ) CYRILLIC SMALL LETTER KA WITH DESCENDER → LATIN SMALL LETTER KRA, COMBINING VERTICAL LINE BELOW # →к̩→ + +049F ; 0138 0335 ; MA # ( ҟ → ĸ̵ ) CYRILLIC SMALL LETTER KA WITH STROKE → LATIN SMALL LETTER KRA, COMBINING SHORT STROKE OVERLAY # →к̵→ + 1D42B ; 0072 ; MA # ( 𝐫 → r ) MATHEMATICAL BOLD SMALL R → LATIN SMALL LETTER R # 1D45F ; 0072 ; MA # ( 𝑟 → r ) MATHEMATICAL ITALIC SMALL R → LATIN SMALL LETTER R # 1D493 ; 0072 ; MA # ( 𝒓 → r ) MATHEMATICAL BOLD ITALIC SMALL R → LATIN SMALL LETTER R # @@ -3214,6 +3277,7 @@ AB48 ; 0072 ; MA # ( ꭈ → r ) LATIN SMALL LETTER DOUBLE R → LATIN SMALL LET 1D26 ; 0072 ; MA # ( ᴦ → r ) GREEK LETTER SMALL CAPITAL GAMMA → LATIN SMALL LETTER R # →г→ 2C85 ; 0072 ; MA # ( ⲅ → r ) COPTIC SMALL LETTER GAMMA → LATIN SMALL LETTER R # →г→ 0433 ; 0072 ; MA # ( г → r ) CYRILLIC SMALL LETTER GHE → LATIN SMALL LETTER R # +AB81 ; 0072 ; MA # ( ꮁ → r ) CHEROKEE SMALL LETTER HU → LATIN SMALL LETTER R # →ᴦ→→г→ 1D216 ; 0052 ; MA #* ( 𝈖 → R ) GREEK VOCAL NOTATION SYMBOL-23 → LATIN CAPITAL LETTER R # 211B ; 0052 ; MA # ( ℛ → R ) SCRIPT CAPITAL R → LATIN CAPITAL LETTER R # @@ -3232,8 +3296,10 @@ AB48 ; 0072 ; MA # ( ꭈ → r ) LATIN SMALL LETTER DOUBLE R → LATIN SMALL LET 01A6 ; 0052 ; MA # ( Ʀ → R ) LATIN LETTER YR → LATIN CAPITAL LETTER R # 13A1 ; 0052 ; MA # ( Ꭱ → R ) CHEROKEE LETTER E → LATIN CAPITAL LETTER R # 13D2 ; 0052 ; MA # ( Ꮢ → R ) CHEROKEE LETTER SV → LATIN CAPITAL LETTER R # +104B4 ; 0052 ; MA # ( 𐒴 → R ) OSAGE CAPITAL LETTER BRA → LATIN CAPITAL LETTER R # →Ʀ→ 1587 ; 0052 ; MA # ( ᖇ → R ) CANADIAN SYLLABICS TLHI → LATIN CAPITAL LETTER R # A4E3 ; 0052 ; MA # ( ꓣ → R ) LISU LETTER ZHA → LATIN CAPITAL LETTER R # +16F35 ; 0052 ; MA # ( 𖼵 → R ) MIAO LETTER ZHA → LATIN CAPITAL LETTER R # 027D ; 0072 0328 ; MA # ( ɽ → r̨ ) LATIN SMALL LETTER R WITH TAIL → LATIN SMALL LETTER R, COMBINING OGONEK # @@ -3262,21 +3328,19 @@ A4E3 ; 0052 ; MA # ( ꓣ → R ) LISU LETTER ZHA → LATIN CAPITAL LETTER R # 1D62E ; 0072 006E ; MA # ( 𝘮 → rn ) MATHEMATICAL SANS-SERIF ITALIC SMALL M → LATIN SMALL LETTER R, LATIN SMALL LETTER N # →m→ 1D662 ; 0072 006E ; MA # ( 𝙢 → rn ) MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL M → LATIN SMALL LETTER R, LATIN SMALL LETTER N # →m→ 1D696 ; 0072 006E ; MA # ( 𝚖 → rn ) MATHEMATICAL MONOSPACE SMALL M → LATIN SMALL LETTER R, LATIN SMALL LETTER N # →m→ -1D0D ; 0072 006E ; MA # ( ᴍ → rn ) LATIN LETTER SMALL CAPITAL M → LATIN SMALL LETTER R, LATIN SMALL LETTER N # →м→→m→ -AB51 ; 0072 006E ; MA # ( ꭑ → rn ) LATIN SMALL LETTER TURNED UI → LATIN SMALL LETTER R, LATIN SMALL LETTER N # →m→ -028D ; 0072 006E ; MA # ( ʍ → rn ) LATIN SMALL LETTER TURNED W → LATIN SMALL LETTER R, LATIN SMALL LETTER N # →m→ -043C ; 0072 006E ; MA # ( м → rn ) CYRILLIC SMALL LETTER EM → LATIN SMALL LETTER R, LATIN SMALL LETTER N # →m→ 11700 ; 0072 006E ; MA # ( 𑜀 → rn ) AHOM LETTER KA → LATIN SMALL LETTER R, LATIN SMALL LETTER N # →m→ 20A5 ; 0072 006E 0338 ; MA #* ( ₥ → rn̸ ) MILL SIGN → LATIN SMALL LETTER R, LATIN SMALL LETTER N, COMBINING LONG SOLIDUS OVERLAY # →m̷→ 0271 ; 0072 006E 0326 ; MA # ( ɱ → rn̦ ) LATIN SMALL LETTER M WITH HOOK → LATIN SMALL LETTER R, LATIN SMALL LETTER N, COMBINING COMMA BELOW # →m̡→ -04CE ; 0072 006E 0326 ; MA # ( ӎ → rn̦ ) CYRILLIC SMALL LETTER EM WITH TAIL → LATIN SMALL LETTER R, LATIN SMALL LETTER N, COMBINING COMMA BELOW # →м̡→ 1D6F ; 0072 006E 0334 ; MA # ( ᵯ → rn̴ ) LATIN SMALL LETTER M WITH MIDDLE TILDE → LATIN SMALL LETTER R, LATIN SMALL LETTER N, COMBINING TILDE OVERLAY # →m̴→ 20A8 ; 0052 0073 ; MA #* ( ₨ → Rs ) RUPEE SIGN → LATIN CAPITAL LETTER R, LATIN SMALL LETTER S # +AB71 ; 0280 ; MA # ( ꭱ → ʀ ) CHEROKEE SMALL LETTER E → LATIN LETTER SMALL CAPITAL R # +ABA2 ; 0280 ; MA # ( ꮢ → ʀ ) CHEROKEE SMALL LETTER SV → LATIN LETTER SMALL CAPITAL R # + 044F ; 1D19 ; MA # ( я → ᴙ ) CYRILLIC SMALL LETTER YA → LATIN LETTER SMALL CAPITAL REVERSED R # 1D73 ; 027E 0334 ; MA # ( ᵳ → ɾ̴ ) LATIN SMALL LETTER R WITH FISHHOOK AND MIDDLE TILDE → LATIN SMALL LETTER R WITH FISHHOOK, COMBINING TILDE OVERLAY # @@ -3300,6 +3364,7 @@ FF53 ; 0073 ; MA # ( s → s ) FULLWIDTH LATIN SMALL LETTER S → LATIN SMALL A731 ; 0073 ; MA # ( ꜱ → s ) LATIN LETTER SMALL CAPITAL S → LATIN SMALL LETTER S # 01BD ; 0073 ; MA # ( ƽ → s ) LATIN SMALL LETTER TONE FIVE → LATIN SMALL LETTER S # 0455 ; 0073 ; MA # ( ѕ → s ) CYRILLIC SMALL LETTER DZE → LATIN SMALL LETTER S # +ABAA ; 0073 ; MA # ( ꮪ → s ) CHEROKEE SMALL LETTER DU → LATIN SMALL LETTER S # →ꜱ→ 118C1 ; 0073 ; MA # ( 𑣁 → s ) WARANG CITI SMALL LETTER A → LATIN SMALL LETTER S # 10448 ; 0073 ; MA # ( 𐑈 → s ) DESERET SMALL LETTER ZHEE → LATIN SMALL LETTER S # @@ -3322,6 +3387,7 @@ FF33 ; 0053 ; MA # ( S → S ) FULLWIDTH LATIN CAPITAL LETTER S → LATIN CAPI 13D5 ; 0053 ; MA # ( Ꮥ → S ) CHEROKEE LETTER DE → LATIN CAPITAL LETTER S # 13DA ; 0053 ; MA # ( Ꮪ → S ) CHEROKEE LETTER DU → LATIN CAPITAL LETTER S # A4E2 ; 0053 ; MA # ( ꓢ → S ) LISU LETTER SA → LATIN CAPITAL LETTER S # +16F3A ; 0053 ; MA # ( 𖼺 → S ) MIAO LETTER SA → LATIN CAPITAL LETTER S # 10296 ; 0053 ; MA # ( 𐊖 → S ) LYCIAN LETTER S → LATIN CAPITAL LETTER S # 10420 ; 0053 ; MA # ( 𐐠 → S ) DESERET CAPITAL LETTER ZHEE → LATIN CAPITAL LETTER S # @@ -3375,14 +3441,6 @@ AB4D ; 0283 ; MA # ( ꭍ → ʃ ) LATIN SMALL LETTER BASELINE ESH → LATIN SMAL 1D635 ; 0074 ; MA # ( 𝘵 → t ) MATHEMATICAL SANS-SERIF ITALIC SMALL T → LATIN SMALL LETTER T # 1D669 ; 0074 ; MA # ( 𝙩 → t ) MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL T → LATIN SMALL LETTER T # 1D69D ; 0074 ; MA # ( 𝚝 → t ) MATHEMATICAL MONOSPACE SMALL T → LATIN SMALL LETTER T # -1D1B ; 0074 ; MA # ( ᴛ → t ) LATIN LETTER SMALL CAPITAL T → LATIN SMALL LETTER T # →т→→τ→ -03C4 ; 0074 ; MA # ( τ → t ) GREEK SMALL LETTER TAU → LATIN SMALL LETTER T # -1D6D5 ; 0074 ; MA # ( 𝛕 → t ) MATHEMATICAL BOLD SMALL TAU → LATIN SMALL LETTER T # →τ→ -1D70F ; 0074 ; MA # ( 𝜏 → t ) MATHEMATICAL ITALIC SMALL TAU → LATIN SMALL LETTER T # →τ→ -1D749 ; 0074 ; MA # ( 𝝉 → t ) MATHEMATICAL BOLD ITALIC SMALL TAU → LATIN SMALL LETTER T # →τ→ -1D783 ; 0074 ; MA # ( 𝞃 → t ) MATHEMATICAL SANS-SERIF BOLD SMALL TAU → LATIN SMALL LETTER T # →τ→ -1D7BD ; 0074 ; MA # ( 𝞽 → t ) MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL TAU → LATIN SMALL LETTER T # →τ→ -0442 ; 0074 ; MA # ( т → t ) CYRILLIC SMALL LETTER TE → LATIN SMALL LETTER T # →τ→ 22A4 ; 0054 ; MA #* ( ⊤ → T ) DOWN TACK → LATIN CAPITAL LETTER T # 27D9 ; 0054 ; MA #* ( ⟙ → T ) LARGE DOWN TACK → LATIN CAPITAL LETTER T # @@ -3411,6 +3469,7 @@ FF34 ; 0054 ; MA # ( T → T ) FULLWIDTH LATIN CAPITAL LETTER T → LATIN CAPI 0422 ; 0054 ; MA # ( Т → T ) CYRILLIC CAPITAL LETTER TE → LATIN CAPITAL LETTER T # 13A2 ; 0054 ; MA # ( Ꭲ → T ) CHEROKEE LETTER I → LATIN CAPITAL LETTER T # A4D4 ; 0054 ; MA # ( ꓔ → T ) LISU LETTER TA → LATIN CAPITAL LETTER T # +16F0A ; 0054 ; MA # ( 𖼊 → T ) MIAO LETTER TA → LATIN CAPITAL LETTER T # 118BC ; 0054 ; MA # ( 𑢼 → T ) WARANG CITI CAPITAL LETTER HAR → LATIN CAPITAL LETTER T # 10297 ; 0054 ; MA # ( 𐊗 → T ) LYCIAN LETTER T → LATIN CAPITAL LETTER T # 102B1 ; 0054 ; MA # ( 𐊱 → T ) CARIAN LETTER C-18 → LATIN CAPITAL LETTER T # @@ -3426,8 +3485,6 @@ A4D4 ; 0054 ; MA # ( ꓔ → T ) LISU LETTER TA → LATIN CAPITAL LETTER T # 01AE ; 0054 0328 ; MA # ( Ʈ → T̨ ) LATIN CAPITAL LETTER T WITH RETROFLEX HOOK → LATIN CAPITAL LETTER T, COMBINING OGONEK # -04AD ; 0074 0329 ; MA # ( ҭ → t̩ ) CYRILLIC SMALL LETTER TE WITH DESCENDER → LATIN SMALL LETTER T, COMBINING VERTICAL LINE BELOW # →т̩→ - 04AC ; 0054 0329 ; MA # ( Ҭ → T̩ ) CYRILLIC CAPITAL LETTER TE WITH DESCENDER → LATIN CAPITAL LETTER T, COMBINING VERTICAL LINE BELOW # →Т̩→ 20AE ; 0054 20EB ; MA #* ( ₮ → T⃫ ) TUGRIK SIGN → LATIN CAPITAL LETTER T, COMBINING LONG DOUBLE SOLIDUS OVERLAY # →Т⃫→ @@ -3454,6 +3511,17 @@ A777 ; 0074 0066 ; MA # ( ꝷ → tf ) LATIN SMALL LETTER TUM → LATIN SMALL LE A729 ; 0074 021D ; MA # ( ꜩ → tȝ ) LATIN SMALL LETTER TZ → LATIN SMALL LETTER T, LATIN SMALL LETTER YOGH # +03C4 ; 1D1B ; MA # ( τ → ᴛ ) GREEK SMALL LETTER TAU → LATIN LETTER SMALL CAPITAL T # +1D6D5 ; 1D1B ; MA # ( 𝛕 → ᴛ ) MATHEMATICAL BOLD SMALL TAU → LATIN LETTER SMALL CAPITAL T # +1D70F ; 1D1B ; MA # ( 𝜏 → ᴛ ) MATHEMATICAL ITALIC SMALL TAU → LATIN LETTER SMALL CAPITAL T # +1D749 ; 1D1B ; MA # ( 𝝉 → ᴛ ) MATHEMATICAL BOLD ITALIC SMALL TAU → LATIN LETTER SMALL CAPITAL T # +1D783 ; 1D1B ; MA # ( 𝞃 → ᴛ ) MATHEMATICAL SANS-SERIF BOLD SMALL TAU → LATIN LETTER SMALL CAPITAL T # +1D7BD ; 1D1B ; MA # ( 𝞽 → ᴛ ) MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL TAU → LATIN LETTER SMALL CAPITAL T # +0442 ; 1D1B ; MA # ( т → ᴛ ) CYRILLIC SMALL LETTER TE → LATIN LETTER SMALL CAPITAL T # +AB72 ; 1D1B ; MA # ( ꭲ → ᴛ ) CHEROKEE SMALL LETTER I → LATIN LETTER SMALL CAPITAL T # + +04AD ; 1D1B 0329 ; MA # ( ҭ → ᴛ̩ ) CYRILLIC SMALL LETTER TE WITH DESCENDER → LATIN LETTER SMALL CAPITAL T, COMBINING VERTICAL LINE BELOW # →т̩→ + 0163 ; 01AB ; MA # ( ţ → ƫ ) LATIN SMALL LETTER T WITH CEDILLA → LATIN SMALL LETTER T WITH PALATAL HOOK # 021B ; 01AB ; MA # ( ț → ƫ ) LATIN SMALL LETTER T WITH COMMA BELOW → LATIN SMALL LETTER T WITH PALATAL HOOK # →ţ→ 13BF ; 01AB ; MA # ( Ꮏ → ƫ ) CHEROKEE LETTER HNA → LATIN SMALL LETTER T WITH PALATAL HOOK # @@ -3482,8 +3550,8 @@ AB52 ; 0075 ; MA # ( ꭒ → u ) LATIN SMALL LETTER U WITH LEFT HOOK → LATIN S 1D74A ; 0075 ; MA # ( 𝝊 → u ) MATHEMATICAL BOLD ITALIC SMALL UPSILON → LATIN SMALL LETTER U # →υ→→ʋ→ 1D784 ; 0075 ; MA # ( 𝞄 → u ) MATHEMATICAL SANS-SERIF BOLD SMALL UPSILON → LATIN SMALL LETTER U # →υ→→ʋ→ 1D7BE ; 0075 ; MA # ( 𝞾 → u ) MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL UPSILON → LATIN SMALL LETTER U # →υ→→ʋ→ -0446 ; 0075 ; MA # ( ц → u ) CYRILLIC SMALL LETTER TSE → LATIN SMALL LETTER U # 057D ; 0075 ; MA # ( ս → u ) ARMENIAN SMALL LETTER SEH → LATIN SMALL LETTER U # +104F6 ; 0075 ; MA # ( 𐓶 → u ) OSAGE SMALL LETTER U → LATIN SMALL LETTER U # →ᴜ→ 118D8 ; 0075 ; MA # ( 𑣘 → u ) WARANG CITI SMALL LETTER PU → LATIN SMALL LETTER U # →υ→→ʋ→ 222A ; 0055 ; MA #* ( ∪ → U ) UNION → LATIN CAPITAL LETTER U # →ᑌ→ @@ -3503,8 +3571,10 @@ AB52 ; 0075 ; MA # ( ꭒ → u ) LATIN SMALL LETTER U WITH LEFT HOOK → LATIN S 1D684 ; 0055 ; MA # ( 𝚄 → U ) MATHEMATICAL MONOSPACE CAPITAL U → LATIN CAPITAL LETTER U # 054D ; 0055 ; MA # ( Ս → U ) ARMENIAN CAPITAL LETTER SEH → LATIN CAPITAL LETTER U # 1200 ; 0055 ; MA # ( ሀ → U ) ETHIOPIC SYLLABLE HA → LATIN CAPITAL LETTER U # →Ս→ +104CE ; 0055 ; MA # ( 𐓎 → U ) OSAGE CAPITAL LETTER U → LATIN CAPITAL LETTER U # 144C ; 0055 ; MA # ( ᑌ → U ) CANADIAN SYLLABICS TE → LATIN CAPITAL LETTER U # A4F4 ; 0055 ; MA # ( ꓴ → U ) LISU LETTER U → LATIN CAPITAL LETTER U # +16F42 ; 0055 ; MA # ( 𖽂 → U ) MIAO LETTER WA → LATIN CAPITAL LETTER U # 118B8 ; 0055 ; MA # ( 𑢸 → U ) WARANG CITI CAPITAL LETTER PU → LATIN CAPITAL LETTER U # 01D4 ; 016D ; MA # ( ǔ → ŭ ) LATIN SMALL LETTER U WITH CARON → LATIN SMALL LETTER U WITH BREVE # @@ -3512,6 +3582,7 @@ A4F4 ; 0055 ; MA # ( ꓴ → U ) LISU LETTER U → LATIN CAPITAL LETTER U # 01D3 ; 016C ; MA # ( Ǔ → Ŭ ) LATIN CAPITAL LETTER U WITH CARON → LATIN CAPITAL LETTER U WITH BREVE # 1D7E ; 0075 0335 ; MA # ( ᵾ → u̵ ) LATIN SMALL CAPITAL LETTER U WITH STROKE → LATIN SMALL LETTER U, COMBINING SHORT STROKE OVERLAY # →ᴜ̵→ +AB9C ; 0075 0335 ; MA # ( ꮜ → u̵ ) CHEROKEE SMALL LETTER SA → LATIN SMALL LETTER U, COMBINING SHORT STROKE OVERLAY # →ᴜ̵→ 0244 ; 0055 0335 ; MA # ( Ʉ → U̵ ) LATIN CAPITAL LETTER U BAR → LATIN CAPITAL LETTER U, COMBINING SHORT STROKE OVERLAY # →U̶→ 13CC ; 0055 0335 ; MA # ( Ꮜ → U̵ ) CHEROKEE LETTER SA → LATIN CAPITAL LETTER U, COMBINING SHORT STROKE OVERLAY # →Ʉ→→U̶→ @@ -3522,6 +3593,10 @@ A4F4 ; 0055 ; MA # ( ꓴ → U ) LISU LETTER U → LATIN CAPITAL LETTER U # 1D6B ; 0075 0065 ; MA # ( ᵫ → ue ) LATIN SMALL LETTER UE → LATIN SMALL LETTER U, LATIN SMALL LETTER E # +AB63 ; 0075 006F ; MA # ( ꭣ → uo ) LATIN SMALL LETTER UO → LATIN SMALL LETTER U, LATIN SMALL LETTER O # + +1E43 ; AB51 ; MA # ( ṃ → ꭑ ) LATIN SMALL LETTER M WITH DOT BELOW → LATIN SMALL LETTER TURNED UI # + 057A ; 0270 ; MA # ( պ → ɰ ) ARMENIAN SMALL LETTER PEH → LATIN SMALL LETTER TURNED M WITH LONG LEG # 1223 ; 0270 ; MA # ( ሣ → ɰ ) ETHIOPIC SYLLABLE SZAA → LATIN SMALL LETTER TURNED M WITH LONG LEG # →պ→ @@ -3557,6 +3632,8 @@ FF56 ; 0076 ; MA # ( v → v ) FULLWIDTH LATIN SMALL LETTER V → LATIN SMALL 1D7B6 ; 0076 ; MA # ( 𝞶 → v ) MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL NU → LATIN SMALL LETTER V # →ν→ 0475 ; 0076 ; MA # ( ѵ → v ) CYRILLIC SMALL LETTER IZHITSA → LATIN SMALL LETTER V # 05D8 ; 0076 ; MA # ( ‎ט‎ → v ) HEBREW LETTER TET → LATIN SMALL LETTER V # +11706 ; 0076 ; MA # ( 𑜆 → v ) AHOM LETTER PA → LATIN SMALL LETTER V # +ABA9 ; 0076 ; MA # ( ꮩ → v ) CHEROKEE SMALL LETTER DO → LATIN SMALL LETTER V # →ᴠ→ 118C0 ; 0076 ; MA # ( 𑣀 → v ) WARANG CITI SMALL LETTER NGAA → LATIN SMALL LETTER V # 1D20D ; 0056 ; MA #* ( 𝈍 → V ) GREEK VOCAL NOTATION SYMBOL-14 → LATIN CAPITAL LETTER V # @@ -3582,9 +3659,12 @@ FF56 ; 0076 ; MA # ( v → v ) FULLWIDTH LATIN SMALL LETTER V → LATIN SMALL 142F ; 0056 ; MA # ( ᐯ → V ) CANADIAN SYLLABICS PE → LATIN CAPITAL LETTER V # A6DF ; 0056 ; MA # ( ꛟ → V ) BAMUM LETTER KO → LATIN CAPITAL LETTER V # A4E6 ; 0056 ; MA # ( ꓦ → V ) LISU LETTER HA → LATIN CAPITAL LETTER V # +16F08 ; 0056 ; MA # ( 𖼈 → V ) MIAO LETTER VA → LATIN CAPITAL LETTER V # 118A0 ; 0056 ; MA # ( 𑢠 → V ) WARANG CITI CAPITAL LETTER NGAA → LATIN CAPITAL LETTER V # 1051D ; 0056 ; MA # ( 𐔝 → V ) ELBASAN LETTER TE → LATIN CAPITAL LETTER V # +10197 ; 0056 0335 ; MA #* ( 𐆗 → V̵ ) ROMAN QUINARIUS SIGN → LATIN CAPITAL LETTER V, COMBINING SHORT STROKE OVERLAY # →V̶→ + 143B ; 0056 00B7 ; MA # ( ᐻ → V· ) CANADIAN SYLLABICS WEST-CREE PWE → LATIN CAPITAL LETTER V, MIDDLE DOT # →ᐯᐧ→ 1F76C ; 0056 0042 ; MA #* ( 🝬 → VB ) ALCHEMICAL SYMBOL FOR BATH OF VAPOURS → LATIN CAPITAL LETTER V, LATIN CAPITAL LETTER B # @@ -3603,35 +3683,8 @@ A4E6 ; 0056 ; MA # ( ꓦ → V ) LISU LETTER HA → LATIN CAPITAL LETTER V # 1F708 ; 0056 1DE4 ; MA #* ( 🜈 → Vᷤ ) ALCHEMICAL SYMBOL FOR AQUA VITAE → LATIN CAPITAL LETTER V, COMBINING LATIN SMALL LETTER S # -026F ; 0076 0076 ; MA # ( ɯ → vv ) LATIN SMALL LETTER TURNED M → LATIN SMALL LETTER V, LATIN SMALL LETTER V # →w→ -0077 ; 0076 0076 ; MA # ( w → vv ) LATIN SMALL LETTER W → LATIN SMALL LETTER V, LATIN SMALL LETTER V # -1D430 ; 0076 0076 ; MA # ( 𝐰 → vv ) MATHEMATICAL BOLD SMALL W → LATIN SMALL LETTER V, LATIN SMALL LETTER V # →w→ -1D464 ; 0076 0076 ; MA # ( 𝑤 → vv ) MATHEMATICAL ITALIC SMALL W → LATIN SMALL LETTER V, LATIN SMALL LETTER V # →w→ -1D498 ; 0076 0076 ; MA # ( 𝒘 → vv ) MATHEMATICAL BOLD ITALIC SMALL W → LATIN SMALL LETTER V, LATIN SMALL LETTER V # →w→ -1D4CC ; 0076 0076 ; MA # ( 𝓌 → vv ) MATHEMATICAL SCRIPT SMALL W → LATIN SMALL LETTER V, LATIN SMALL LETTER V # →w→ -1D500 ; 0076 0076 ; MA # ( 𝔀 → vv ) MATHEMATICAL BOLD SCRIPT SMALL W → LATIN SMALL LETTER V, LATIN SMALL LETTER V # →w→ -1D534 ; 0076 0076 ; MA # ( 𝔴 → vv ) MATHEMATICAL FRAKTUR SMALL W → LATIN SMALL LETTER V, LATIN SMALL LETTER V # →w→ -1D568 ; 0076 0076 ; MA # ( 𝕨 → vv ) MATHEMATICAL DOUBLE-STRUCK SMALL W → LATIN SMALL LETTER V, LATIN SMALL LETTER V # →w→ -1D59C ; 0076 0076 ; MA # ( 𝖜 → vv ) MATHEMATICAL BOLD FRAKTUR SMALL W → LATIN SMALL LETTER V, LATIN SMALL LETTER V # →w→ -1D5D0 ; 0076 0076 ; MA # ( 𝗐 → vv ) MATHEMATICAL SANS-SERIF SMALL W → LATIN SMALL LETTER V, LATIN SMALL LETTER V # →w→ -1D604 ; 0076 0076 ; MA # ( 𝘄 → vv ) MATHEMATICAL SANS-SERIF BOLD SMALL W → LATIN SMALL LETTER V, LATIN SMALL LETTER V # →w→ -1D638 ; 0076 0076 ; MA # ( 𝘸 → vv ) MATHEMATICAL SANS-SERIF ITALIC SMALL W → LATIN SMALL LETTER V, LATIN SMALL LETTER V # →w→ -1D66C ; 0076 0076 ; MA # ( 𝙬 → vv ) MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL W → LATIN SMALL LETTER V, LATIN SMALL LETTER V # →w→ -1D6A0 ; 0076 0076 ; MA # ( 𝚠 → vv ) MATHEMATICAL MONOSPACE SMALL W → LATIN SMALL LETTER V, LATIN SMALL LETTER V # →w→ -1D21 ; 0076 0076 ; MA # ( ᴡ → vv ) LATIN LETTER SMALL CAPITAL W → LATIN SMALL LETTER V, LATIN SMALL LETTER V # →w→ -0461 ; 0076 0076 ; MA # ( ѡ → vv ) CYRILLIC SMALL LETTER OMEGA → LATIN SMALL LETTER V, LATIN SMALL LETTER V # →w→ -051D ; 0076 0076 ; MA # ( ԝ → vv ) CYRILLIC SMALL LETTER WE → LATIN SMALL LETTER V, LATIN SMALL LETTER V # →w→ -0561 ; 0076 0076 ; MA # ( ա → vv ) ARMENIAN SMALL LETTER AYB → LATIN SMALL LETTER V, LATIN SMALL LETTER V # →ɯ→→w→ -1170E ; 0076 0076 ; MA # ( 𑜎 → vv ) AHOM LETTER LA → LATIN SMALL LETTER V, LATIN SMALL LETTER V # →w→ -1170F ; 0076 0076 ; MA # ( 𑜏 → vv ) AHOM LETTER SA → LATIN SMALL LETTER V, LATIN SMALL LETTER V # →w→ - -047D ; 0076 0076 0486 0487 ; MA # ( ѽ → vv҆҇ ) CYRILLIC SMALL LETTER OMEGA WITH TITLO → LATIN SMALL LETTER V, LATIN SMALL LETTER V, COMBINING CYRILLIC PSILI PNEUMATA, COMBINING CYRILLIC POKRYTIE # →ѡ҆҇→ - -114C5 ; 0076 0076 0307 ; MA # ( 𑓅 → vv̇ ) TIRHUTA GVANG → LATIN SMALL LETTER V, LATIN SMALL LETTER V, COMBINING DOT ABOVE # →ẇ→ - -A761 ; 0076 0079 ; MA # ( ꝡ → vy ) LATIN SMALL LETTER VY → LATIN SMALL LETTER V, LATIN SMALL LETTER Y # - 1D27 ; 028C ; MA # ( ᴧ → ʌ ) GREEK LETTER SMALL CAPITAL LAMDA → LATIN SMALL LETTER TURNED V # +104D8 ; 028C ; MA # ( 𐓘 → ʌ ) OSAGE SMALL LETTER A → LATIN SMALL LETTER TURNED V # 0668 ; 0245 ; MA # ( ‎٨‎ → Ʌ ) ARABIC-INDIC DIGIT EIGHT → LATIN CAPITAL LETTER TURNED V # →Λ→ 06F8 ; 0245 ; MA # ( ۸ → Ʌ ) EXTENDED ARABIC-INDIC DIGIT EIGHT → LATIN CAPITAL LETTER TURNED V # →‎٨‎→→Λ→ @@ -3643,15 +3696,40 @@ A761 ; 0076 0079 ; MA # ( ꝡ → vy ) LATIN SMALL LETTER VY → LATIN SMALL LET 1D79A ; 0245 ; MA # ( 𝞚 → Ʌ ) MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL LAMDA → LATIN CAPITAL LETTER TURNED V # →Λ→ 041B ; 0245 ; MA # ( Л → Ʌ ) CYRILLIC CAPITAL LETTER EL → LATIN CAPITAL LETTER TURNED V # →Λ→ 2D37 ; 0245 ; MA # ( ⴷ → Ʌ ) TIFINAGH LETTER YAD → LATIN CAPITAL LETTER TURNED V # +104B0 ; 0245 ; MA # ( 𐒰 → Ʌ ) OSAGE CAPITAL LETTER A → LATIN CAPITAL LETTER TURNED V # 1431 ; 0245 ; MA # ( ᐱ → Ʌ ) CANADIAN SYLLABICS PI → LATIN CAPITAL LETTER TURNED V # A6CE ; 0245 ; MA # ( ꛎ → Ʌ ) BAMUM LETTER MI → LATIN CAPITAL LETTER TURNED V # →Λ→ A4E5 ; 0245 ; MA # ( ꓥ → Ʌ ) LISU LETTER NGA → LATIN CAPITAL LETTER TURNED V # +16F3D ; 0245 ; MA # ( 𖼽 → Ʌ ) MIAO LETTER ZZA → LATIN CAPITAL LETTER TURNED V # 1028D ; 0245 ; MA # ( 𐊍 → Ʌ ) LYCIAN LETTER L → LATIN CAPITAL LETTER TURNED V # →Λ→ 04C5 ; 0245 0326 ; MA # ( Ӆ → Ʌ̦ ) CYRILLIC CAPITAL LETTER EL WITH TAIL → LATIN CAPITAL LETTER TURNED V, COMBINING COMMA BELOW # →Л̡→ 143D ; 0245 00B7 ; MA # ( ᐽ → Ʌ· ) CANADIAN SYLLABICS WEST-CREE PWI → LATIN CAPITAL LETTER TURNED V, MIDDLE DOT # →ᐱᐧ→→ᐱ·→ +026F ; 0077 ; MA # ( ɯ → w ) LATIN SMALL LETTER TURNED M → LATIN SMALL LETTER W # +1D430 ; 0077 ; MA # ( 𝐰 → w ) MATHEMATICAL BOLD SMALL W → LATIN SMALL LETTER W # +1D464 ; 0077 ; MA # ( 𝑤 → w ) MATHEMATICAL ITALIC SMALL W → LATIN SMALL LETTER W # +1D498 ; 0077 ; MA # ( 𝒘 → w ) MATHEMATICAL BOLD ITALIC SMALL W → LATIN SMALL LETTER W # +1D4CC ; 0077 ; MA # ( 𝓌 → w ) MATHEMATICAL SCRIPT SMALL W → LATIN SMALL LETTER W # +1D500 ; 0077 ; MA # ( 𝔀 → w ) MATHEMATICAL BOLD SCRIPT SMALL W → LATIN SMALL LETTER W # +1D534 ; 0077 ; MA # ( 𝔴 → w ) MATHEMATICAL FRAKTUR SMALL W → LATIN SMALL LETTER W # +1D568 ; 0077 ; MA # ( 𝕨 → w ) MATHEMATICAL DOUBLE-STRUCK SMALL W → LATIN SMALL LETTER W # +1D59C ; 0077 ; MA # ( 𝖜 → w ) MATHEMATICAL BOLD FRAKTUR SMALL W → LATIN SMALL LETTER W # +1D5D0 ; 0077 ; MA # ( 𝗐 → w ) MATHEMATICAL SANS-SERIF SMALL W → LATIN SMALL LETTER W # +1D604 ; 0077 ; MA # ( 𝘄 → w ) MATHEMATICAL SANS-SERIF BOLD SMALL W → LATIN SMALL LETTER W # +1D638 ; 0077 ; MA # ( 𝘸 → w ) MATHEMATICAL SANS-SERIF ITALIC SMALL W → LATIN SMALL LETTER W # +1D66C ; 0077 ; MA # ( 𝙬 → w ) MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL W → LATIN SMALL LETTER W # +1D6A0 ; 0077 ; MA # ( 𝚠 → w ) MATHEMATICAL MONOSPACE SMALL W → LATIN SMALL LETTER W # +1D21 ; 0077 ; MA # ( ᴡ → w ) LATIN LETTER SMALL CAPITAL W → LATIN SMALL LETTER W # +0461 ; 0077 ; MA # ( ѡ → w ) CYRILLIC SMALL LETTER OMEGA → LATIN SMALL LETTER W # +051D ; 0077 ; MA # ( ԝ → w ) CYRILLIC SMALL LETTER WE → LATIN SMALL LETTER W # +0561 ; 0077 ; MA # ( ա → w ) ARMENIAN SMALL LETTER AYB → LATIN SMALL LETTER W # →ɯ→ +1170A ; 0077 ; MA # ( 𑜊 → w ) AHOM LETTER JA → LATIN SMALL LETTER W # +1170E ; 0077 ; MA # ( 𑜎 → w ) AHOM LETTER LA → LATIN SMALL LETTER W # +1170F ; 0077 ; MA # ( 𑜏 → w ) AHOM LETTER SA → LATIN SMALL LETTER W # +AB83 ; 0077 ; MA # ( ꮃ → w ) CHEROKEE SMALL LETTER LA → LATIN SMALL LETTER W # →ᴡ→ + 118EF ; 0057 ; MA #* ( 𑣯 → W ) WARANG CITI NUMBER SIXTY → LATIN CAPITAL LETTER W # 118E6 ; 0057 ; MA # ( 𑣦 → W ) WARANG CITI DIGIT SIX → LATIN CAPITAL LETTER W # 1D416 ; 0057 ; MA # ( 𝐖 → W ) MATHEMATICAL BOLD CAPITAL W → LATIN CAPITAL LETTER W # @@ -3672,8 +3750,20 @@ A4E5 ; 0245 ; MA # ( ꓥ → Ʌ ) LISU LETTER NGA → LATIN CAPITAL LETTER TURNE 13D4 ; 0057 ; MA # ( Ꮤ → W ) CHEROKEE LETTER TA → LATIN CAPITAL LETTER W # A4EA ; 0057 ; MA # ( ꓪ → W ) LISU LETTER WA → LATIN CAPITAL LETTER W # +047D ; 0077 0486 0487 ; MA # ( ѽ → w҆҇ ) CYRILLIC SMALL LETTER OMEGA WITH TITLO → LATIN SMALL LETTER W, COMBINING CYRILLIC PSILI PNEUMATA, COMBINING CYRILLIC POKRYTIE # →ѡ҆҇→ + +114C5 ; 0077 0307 ; MA # ( 𑓅 → ẇ ) TIRHUTA GVANG → LATIN SMALL LETTER W, COMBINING DOT ABOVE # + 20A9 ; 0057 0335 ; MA #* ( ₩ → W̵ ) WON SIGN → LATIN CAPITAL LETTER W, COMBINING SHORT STROKE OVERLAY # +A761 ; 0077 0326 ; MA # ( ꝡ → w̦ ) LATIN SMALL LETTER VY → LATIN SMALL LETTER W, COMBINING COMMA BELOW # →w̡→ + +1D0D ; 028D ; MA # ( ᴍ → ʍ ) LATIN LETTER SMALL CAPITAL M → LATIN SMALL LETTER TURNED W # →м→ +043C ; 028D ; MA # ( м → ʍ ) CYRILLIC SMALL LETTER EM → LATIN SMALL LETTER TURNED W # +AB87 ; 028D ; MA # ( ꮇ → ʍ ) CHEROKEE SMALL LETTER LU → LATIN SMALL LETTER TURNED W # →ᴍ→→м→ + +04CE ; 028D 0326 ; MA # ( ӎ → ʍ̦ ) CYRILLIC SMALL LETTER EM WITH TAIL → LATIN SMALL LETTER TURNED W, COMBINING COMMA BELOW # →м̡→ + 166E ; 0078 ; MA #* ( ᙮ → x ) CANADIAN SYLLABICS FULL STOP → LATIN SMALL LETTER X # 00D7 ; 0078 ; MA #* ( × → x ) MULTIPLICATION SIGN → LATIN SMALL LETTER X # 292B ; 0078 ; MA #* ( ⤫ → x ) RISING DIAGONAL CROSSING FALLING DIAGONAL → LATIN SMALL LETTER X # @@ -3698,6 +3788,8 @@ FF58 ; 0078 ; MA # ( x → x ) FULLWIDTH LATIN SMALL LETTER X → LATIN SMALL 1541 ; 0078 ; MA # ( ᕁ → x ) CANADIAN SYLLABICS SAYISI YI → LATIN SMALL LETTER X # →᙮→ 157D ; 0078 ; MA # ( ᕽ → x ) CANADIAN SYLLABICS HK → LATIN SMALL LETTER X # →ᕁ→→᙮→ +2DEF ; 036F ; MA # ( ⷯ → ͯ ) COMBINING CYRILLIC LETTER HA → COMBINING LATIN SMALL LETTER X # + 166D ; 0058 ; MA #* ( ᙭ → X ) CANADIAN SYLLABICS CHI SIGN → LATIN CAPITAL LETTER X # 2573 ; 0058 ; MA #* ( ╳ → X ) BOX DRAWINGS LIGHT DIAGONAL CROSS → LATIN CAPITAL LETTER X # 10322 ; 0058 ; MA #* ( 𐌢 → X ) OLD ITALIC NUMERAL TEN → LATIN CAPITAL LETTER X # →𐌗→ @@ -3738,6 +3830,8 @@ A4EB ; 0058 ; MA # ( ꓫ → X ) LISU LETTER SHA → LATIN CAPITAL LETTER X # 04B2 ; 0058 0329 ; MA # ( Ҳ → X̩ ) CYRILLIC CAPITAL LETTER HA WITH DESCENDER → LATIN CAPITAL LETTER X, COMBINING VERTICAL LINE BELOW # →Х̩→ +10196 ; 0058 0335 ; MA #* ( 𐆖 → X̵ ) ROMAN DENARIUS SIGN → LATIN CAPITAL LETTER X, COMBINING SHORT STROKE OVERLAY # →X̶→ + 217A ; 0078 0069 ; MA # ( ⅺ → xi ) SMALL ROMAN NUMERAL ELEVEN → LATIN SMALL LETTER X, LATIN SMALL LETTER I # 217B ; 0078 0069 0069 ; MA # ( ⅻ → xii ) SMALL ROMAN NUMERAL TWELVE → LATIN SMALL LETTER X, LATIN SMALL LETTER I, LATIN SMALL LETTER I # @@ -3799,10 +3893,12 @@ FF39 ; 0059 ; MA # ( Y → Y ) FULLWIDTH LATIN CAPITAL LETTER Y → LATIN CAPI 1D76A ; 0059 ; MA # ( 𝝪 → Y ) MATHEMATICAL SANS-SERIF BOLD CAPITAL UPSILON → LATIN CAPITAL LETTER Y # →Υ→ 1D7A4 ; 0059 ; MA # ( 𝞤 → Y ) MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL UPSILON → LATIN CAPITAL LETTER Y # →Υ→ 2CA8 ; 0059 ; MA # ( Ⲩ → Y ) COPTIC CAPITAL LETTER UA → LATIN CAPITAL LETTER Y # +0423 ; 0059 ; MA # ( У → Y ) CYRILLIC CAPITAL LETTER U → LATIN CAPITAL LETTER Y # 04AE ; 0059 ; MA # ( Ү → Y ) CYRILLIC CAPITAL LETTER STRAIGHT U → LATIN CAPITAL LETTER Y # 13A9 ; 0059 ; MA # ( Ꭹ → Y ) CHEROKEE LETTER GI → LATIN CAPITAL LETTER Y # 13BD ; 0059 ; MA # ( Ꮍ → Y ) CHEROKEE LETTER MU → LATIN CAPITAL LETTER Y # →Ꭹ→ A4EC ; 0059 ; MA # ( ꓬ → Y ) LISU LETTER YA → LATIN CAPITAL LETTER Y # +16F43 ; 0059 ; MA # ( 𖽃 → Y ) MIAO LETTER AH → LATIN CAPITAL LETTER Y # 118A4 ; 0059 ; MA # ( 𑢤 → Y ) WARANG CITI CAPITAL LETTER YA → LATIN CAPITAL LETTER Y # 102B2 ; 0059 ; MA # ( 𐊲 → Y ) CARIAN LETTER U → LATIN CAPITAL LETTER Y # @@ -3835,6 +3931,7 @@ A76B ; 021D ; MA # ( ꝫ → ȝ ) LATIN SMALL LETTER ET → LATIN SMALL LETTER Y 1D66F ; 007A ; MA # ( 𝙯 → z ) MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL Z → LATIN SMALL LETTER Z # 1D6A3 ; 007A ; MA # ( 𝚣 → z ) MATHEMATICAL MONOSPACE SMALL Z → LATIN SMALL LETTER Z # 1D22 ; 007A ; MA # ( ᴢ → z ) LATIN LETTER SMALL CAPITAL Z → LATIN SMALL LETTER Z # +AB93 ; 007A ; MA # ( ꮓ → z ) CHEROKEE SMALL LETTER NO → LATIN SMALL LETTER Z # →ᴢ→ 118C4 ; 007A ; MA # ( 𑣄 → z ) WARANG CITI SMALL LETTER YA → LATIN SMALL LETTER Z # 102F5 ; 005A ; MA #* ( 𐋵 → Z ) COPTIC EPACT NUMBER THREE HUNDRED → LATIN CAPITAL LETTER Z # @@ -3879,6 +3976,7 @@ A4DC ; 005A ; MA # ( ꓜ → Z ) LISU LETTER DZA → LATIN CAPITAL LETTER Z # 03F8 ; 00FE ; MA # ( ϸ → þ ) GREEK SMALL LETTER SHO → LATIN SMALL LETTER THORN # 03F7 ; 00DE ; MA # ( Ϸ → Þ ) GREEK CAPITAL LETTER SHO → LATIN CAPITAL LETTER THORN # +104C4 ; 00DE ; MA # ( 𐓄 → Þ ) OSAGE CAPITAL LETTER PA → LATIN CAPITAL LETTER THORN # 2079 ; A770 ; MA #* ( ⁹ → ꝰ ) SUPERSCRIPT NINE → MODIFIER LETTER US # @@ -3887,9 +3985,12 @@ A4DC ; 005A ; MA # ( ꓜ → Z ) LISU LETTER DZA → LATIN CAPITAL LETTER Z # A645 ; 01A8 ; MA # ( ꙅ → ƨ ) CYRILLIC SMALL LETTER REVERSED DZE → LATIN SMALL LETTER TONE TWO # 044C ; 0185 ; MA # ( ь → ƅ ) CYRILLIC SMALL LETTER SOFT SIGN → LATIN SMALL LETTER TONE SIX # +AB9F ; 0185 ; MA # ( ꮟ → ƅ ) CHEROKEE SMALL LETTER SI → LATIN SMALL LETTER TONE SIX # →ь→ 044B ; 0185 0069 ; MA # ( ы → ƅi ) CYRILLIC SMALL LETTER YERU → LATIN SMALL LETTER TONE SIX, LATIN SMALL LETTER I # →ьı→ +AB7E ; 0242 ; MA # ( ꭾ → ɂ ) CHEROKEE SMALL LETTER HE → LATIN SMALL LETTER GLOTTAL STOP # + 02E4 ; 02C1 ; MA # ( ˤ → ˁ ) MODIFIER LETTER SMALL REVERSED GLOTTAL STOP → MODIFIER LETTER REVERSED GLOTTAL STOP # A6CD ; 02A1 ; MA # ( ꛍ → ʡ ) BAMUM LETTER LU → LATIN LETTER GLOTTAL STOP WITH STROKE # @@ -3899,6 +4000,7 @@ A6CD ; 02A1 ; MA # ( ꛍ → ʡ ) BAMUM LETTER LU → LATIN LETTER GLOTTAL STOP 2A00 ; 0298 ; MA #* ( ⨀ → ʘ ) N-ARY CIRCLED DOT OPERATOR → LATIN LETTER BILABIAL CLICK # →⊙→ A668 ; 0298 ; MA # ( Ꙩ → ʘ ) CYRILLIC CAPITAL LETTER MONOCULAR O → LATIN LETTER BILABIAL CLICK # 2D59 ; 0298 ; MA # ( ⵙ → ʘ ) TIFINAGH LETTER YAS → LATIN LETTER BILABIAL CLICK # →⊙→ +104C3 ; 0298 ; MA # ( 𐓃 → ʘ ) OSAGE CAPITAL LETTER OIN → LATIN LETTER BILABIAL CLICK # →Ꙩ→ 213E ; 0393 ; MA # ( ℾ → Γ ) DOUBLE-STRUCK CAPITAL GAMMA → GREEK CAPITAL LETTER GAMMA # 1D6AA ; 0393 ; MA # ( 𝚪 → Γ ) MATHEMATICAL BOLD CAPITAL GAMMA → GREEK CAPITAL LETTER GAMMA # @@ -3910,6 +4012,7 @@ A668 ; 0298 ; MA # ( Ꙩ → ʘ ) CYRILLIC CAPITAL LETTER MONOCULAR O → LATIN 0413 ; 0393 ; MA # ( Г → Γ ) CYRILLIC CAPITAL LETTER GHE → GREEK CAPITAL LETTER GAMMA # 13B1 ; 0393 ; MA # ( Ꮁ → Γ ) CHEROKEE LETTER HU → GREEK CAPITAL LETTER GAMMA # 14A5 ; 0393 ; MA # ( ᒥ → Γ ) CANADIAN SYLLABICS MI → GREEK CAPITAL LETTER GAMMA # +16F07 ; 0393 ; MA # ( 𖼇 → Γ ) MIAO LETTER FA → GREEK CAPITAL LETTER GAMMA # 0492 ; 0393 0335 ; MA # ( Ғ → Γ̵ ) CYRILLIC CAPITAL LETTER GHE WITH STROKE → GREEK CAPITAL LETTER GAMMA, COMBINING SHORT STROKE OVERLAY # →Г̵→ @@ -3928,6 +4031,7 @@ A668 ; 0298 ; MA # ( Ꙩ → ʘ ) CYRILLIC CAPITAL LETTER MONOCULAR O → LATIN 2C86 ; 0394 ; MA # ( Ⲇ → Δ ) COPTIC CAPITAL LETTER DALDA → GREEK CAPITAL LETTER DELTA # 2D60 ; 0394 ; MA # ( ⵠ → Δ ) TIFINAGH LETTER YAV → GREEK CAPITAL LETTER DELTA # 1403 ; 0394 ; MA # ( ᐃ → Δ ) CANADIAN SYLLABICS I → GREEK CAPITAL LETTER DELTA # +16F1A ; 0394 ; MA # ( 𖼚 → Δ ) MIAO LETTER TLHA → GREEK CAPITAL LETTER DELTA # 10285 ; 0394 ; MA # ( 𐊅 → Δ ) LYCIAN LETTER D → GREEK CAPITAL LETTER DELTA # 102A3 ; 0394 ; MA # ( 𐊣 → Δ ) CARIAN LETTER L → GREEK CAPITAL LETTER DELTA # @@ -3953,6 +4057,7 @@ A668 ; 0298 ; MA # ( Ꙩ → ʘ ) CYRILLIC CAPITAL LETTER MONOCULAR O → LATIN 1D77A ; 03BB ; MA # ( 𝝺 → λ ) MATHEMATICAL SANS-SERIF BOLD SMALL LAMDA → GREEK SMALL LETTER LAMDA # 1D7B4 ; 03BB ; MA # ( 𝞴 → λ ) MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL LAMDA → GREEK SMALL LETTER LAMDA # 2C96 ; 03BB ; MA # ( Ⲗ → λ ) COPTIC CAPITAL LETTER LAULA → GREEK SMALL LETTER LAMDA # +104DB ; 03BB ; MA # ( 𐓛 → λ ) OSAGE SMALL LETTER AH → GREEK SMALL LETTER LAMDA # 00B5 ; 03BC ; MA # ( µ → μ ) MICRO SIGN → GREEK SMALL LETTER MU # 1D6CD ; 03BC ; MA # ( 𝛍 → μ ) MATHEMATICAL BOLD SMALL MU → GREEK SMALL LETTER MU # @@ -3973,6 +4078,21 @@ A668 ; 0298 ; MA # ( Ꙩ → ʘ ) CYRILLIC CAPITAL LETTER MONOCULAR O → LATIN 1D763 ; 039E ; MA # ( 𝝣 → Ξ ) MATHEMATICAL SANS-SERIF BOLD CAPITAL XI → GREEK CAPITAL LETTER XI # 1D79D ; 039E ; MA # ( 𝞝 → Ξ ) MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL XI → GREEK CAPITAL LETTER XI # +03D6 ; 03C0 ; MA # ( ϖ → π ) GREEK PI SYMBOL → GREEK SMALL LETTER PI # +213C ; 03C0 ; MA # ( ℼ → π ) DOUBLE-STRUCK SMALL PI → GREEK SMALL LETTER PI # +1D6D1 ; 03C0 ; MA # ( 𝛑 → π ) MATHEMATICAL BOLD SMALL PI → GREEK SMALL LETTER PI # +1D6E1 ; 03C0 ; MA # ( 𝛡 → π ) MATHEMATICAL BOLD PI SYMBOL → GREEK SMALL LETTER PI # +1D70B ; 03C0 ; MA # ( 𝜋 → π ) MATHEMATICAL ITALIC SMALL PI → GREEK SMALL LETTER PI # +1D71B ; 03C0 ; MA # ( 𝜛 → π ) MATHEMATICAL ITALIC PI SYMBOL → GREEK SMALL LETTER PI # +1D745 ; 03C0 ; MA # ( 𝝅 → π ) MATHEMATICAL BOLD ITALIC SMALL PI → GREEK SMALL LETTER PI # +1D755 ; 03C0 ; MA # ( 𝝕 → π ) MATHEMATICAL BOLD ITALIC PI SYMBOL → GREEK SMALL LETTER PI # +1D77F ; 03C0 ; MA # ( 𝝿 → π ) MATHEMATICAL SANS-SERIF BOLD SMALL PI → GREEK SMALL LETTER PI # +1D78F ; 03C0 ; MA # ( 𝞏 → π ) MATHEMATICAL SANS-SERIF BOLD PI SYMBOL → GREEK SMALL LETTER PI # +1D7B9 ; 03C0 ; MA # ( 𝞹 → π ) MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL PI → GREEK SMALL LETTER PI # +1D7C9 ; 03C0 ; MA # ( 𝟉 → π ) MATHEMATICAL SANS-SERIF BOLD ITALIC PI SYMBOL → GREEK SMALL LETTER PI # +1D28 ; 03C0 ; MA # ( ᴨ → π ) GREEK LETTER SMALL CAPITAL PI → GREEK SMALL LETTER PI # →п→ +043F ; 03C0 ; MA # ( п → π ) CYRILLIC SMALL LETTER PE → GREEK SMALL LETTER PI # + 220F ; 03A0 ; MA #* ( ∏ → Π ) N-ARY PRODUCT → GREEK CAPITAL LETTER PI # 213F ; 03A0 ; MA # ( ℿ → Π ) DOUBLE-STRUCK CAPITAL PI → GREEK CAPITAL LETTER PI # 1D6B7 ; 03A0 ; MA # ( 𝚷 → Π ) MATHEMATICAL BOLD CAPITAL PI → GREEK CAPITAL LETTER PI # @@ -4021,6 +4141,7 @@ AB55 ; 03C7 ; MA # ( ꭕ → χ ) LATIN SMALL LETTER CHI WITH LOW LEFT SERIF → 1D787 ; 03C8 ; MA # ( 𝞇 → ψ ) MATHEMATICAL SANS-SERIF BOLD SMALL PSI → GREEK SMALL LETTER PSI # 1D7C1 ; 03C8 ; MA # ( 𝟁 → ψ ) MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL PSI → GREEK SMALL LETTER PSI # 0471 ; 03C8 ; MA # ( ѱ → ψ ) CYRILLIC SMALL LETTER PSI → GREEK SMALL LETTER PSI # +104F9 ; 03C8 ; MA # ( 𐓹 → ψ ) OSAGE SMALL LETTER GHA → GREEK SMALL LETTER PSI # 1D6BF ; 03A8 ; MA # ( 𝚿 → Ψ ) MATHEMATICAL BOLD CAPITAL PSI → GREEK CAPITAL LETTER PSI # 1D6F9 ; 03A8 ; MA # ( 𝛹 → Ψ ) MATHEMATICAL ITALIC CAPITAL PSI → GREEK CAPITAL LETTER PSI # @@ -4029,6 +4150,7 @@ AB55 ; 03C7 ; MA # ( ꭕ → χ ) LATIN SMALL LETTER CHI WITH LOW LEFT SERIF → 1D7A7 ; 03A8 ; MA # ( 𝞧 → Ψ ) MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL PSI → GREEK CAPITAL LETTER PSI # 2CAE ; 03A8 ; MA # ( Ⲯ → Ψ ) COPTIC CAPITAL LETTER PSI → GREEK CAPITAL LETTER PSI # 0470 ; 03A8 ; MA # ( Ѱ → Ψ ) CYRILLIC CAPITAL LETTER PSI → GREEK CAPITAL LETTER PSI # +104D1 ; 03A8 ; MA # ( 𐓑 → Ψ ) OSAGE CAPITAL LETTER GHA → GREEK CAPITAL LETTER PSI # 16D8 ; 03A8 ; MA # ( ᛘ → Ψ ) RUNIC LETTER LONG-BRANCH-MADR M → GREEK CAPITAL LETTER PSI # 102B5 ; 03A8 ; MA # ( 𐊵 → Ψ ) CARIAN LETTER N → GREEK CAPITAL LETTER PSI # @@ -4077,12 +4199,20 @@ A6A1 ; 0418 ; MA # ( ꚡ → И ) BAMUM LETTER KA → CYRILLIC CAPITAL LETTER I 048B ; 0439 0326 ; MA # ( ҋ → й̦ ) CYRILLIC SMALL LETTER SHORT I WITH TAIL → CYRILLIC SMALL LETTER SHORT I, COMBINING COMMA BELOW # →й̡→ +104BC ; 04C3 ; MA # ( 𐒼 → Ӄ ) OSAGE CAPITAL LETTER KA → CYRILLIC CAPITAL LETTER KA WITH HOOK # + 1D2B ; 043B ; MA # ( ᴫ → л ) CYRILLIC LETTER SMALL CAPITAL EL → CYRILLIC SMALL LETTER EL # 04C6 ; 043B 0326 ; MA # ( ӆ → л̦ ) CYRILLIC SMALL LETTER EL WITH TAIL → CYRILLIC SMALL LETTER EL, COMBINING COMMA BELOW # →л̡→ AB60 ; 0459 ; MA # ( ꭠ → љ ) LATIN SMALL LETTER SAKHA YAT → CYRILLIC SMALL LETTER LJE # +104EB ; A669 ; MA # ( 𐓫 → ꙩ ) OSAGE SMALL LETTER OIN → CYRILLIC SMALL LETTER MONOCULAR O # + +1DEE ; 2DEC ; MA # ( ᷮ → ⷬ ) COMBINING LATIN SMALL LETTER P → COMBINING CYRILLIC LETTER ER # + +104CD ; 040B ; MA # ( 𐓍 → Ћ ) OSAGE CAPITAL LETTER DHA → CYRILLIC CAPITAL LETTER TSHE # + 1D202 ; 04FE ; MA #* ( 𝈂 → Ӿ ) GREEK VOCAL NOTATION SYMBOL-3 → CYRILLIC CAPITAL LETTER HA WITH STROKE # 1D222 ; 0460 ; MA #* ( 𝈢 → Ѡ ) GREEK INSTRUMENTAL NOTATION SYMBOL-8 → CYRILLIC CAPITAL LETTER OMEGA # @@ -4110,6 +4240,7 @@ A650 ; 042A 006C ; MA # ( Ꙑ → Ъl ) CYRILLIC CAPITAL LETTER YERU WITH BACK Y 2108 ; 042D ; MA #* ( ℈ → Э ) SCRUPLE → CYRILLIC CAPITAL LETTER E # 1F701 ; A658 ; MA #* ( 🜁 → Ꙙ ) ALCHEMICAL SYMBOL FOR AIR → CYRILLIC CAPITAL LETTER CLOSED LITTLE YUS # +16F1C ; A658 ; MA # ( 𖼜 → Ꙙ ) MIAO LETTER TLHYA → CYRILLIC CAPITAL LETTER CLOSED LITTLE YUS # A992 ; 2C3F ; MA # ( ꦒ → ⰿ ) JAVANESE LETTER GA → GLAGOLITIC SMALL LETTER MYSLITE # @@ -4201,6 +4332,8 @@ FE8F ; 0628 ; MA # ( ‎ﺏ‎ → ‎ب‎ ) ARABIC LETTER BEH ISOLATED FORM 0751 ; 0628 06DB ; MA # ( ‎ݑ‎ → ‎بۛ‎ ) ARABIC LETTER BEH WITH DOT BELOW AND THREE DOTS ABOVE → ARABIC LETTER BEH, ARABIC SMALL HIGH THREE DOTS # +08B6 ; 0628 06E2 ; MA # ( ‎ࢶ‎ → ‎بۢ‎ ) ARABIC LETTER BEH WITH SMALL MEEM ABOVE → ARABIC LETTER BEH, ARABIC SMALL HIGH MEEM ISOLATED FORM # + 08A1 ; 0628 0654 ; MA # ( ‎ࢡ‎ → ‎بٔ‎ ) ARABIC LETTER BEH WITH HAMZA ABOVE → ARABIC LETTER BEH, ARABIC HAMZA ABOVE # FCA0 ; 0628 006F ; MA # ( ‎ﲠ‎ → ‎بo‎ ) ARABIC LIGATURE BEH WITH HEH INITIAL FORM → ARABIC LETTER BEH, LATIN SMALL LETTER O # →‎به‎→ @@ -4492,6 +4625,8 @@ FB8A ; 0631 06DB ; MA # ( ‎ﮊ‎ → ‎رۛ‎ ) ARABIC LETTER JEH ISOLATED 0692 ; 0631 0306 ; MA # ( ‎ڒ‎ → ‎ر̆‎ ) ARABIC LETTER REH WITH SMALL V → ARABIC LETTER REH, COMBINING BREVE # →‎رٚ‎→ +08B9 ; 0631 0306 0307 ; MA # ( ‎ࢹ‎ → ‎ر̆̇‎ ) ARABIC LETTER REH WITH SMALL NOON ABOVE → ARABIC LETTER REH, COMBINING BREVE, COMBINING DOT ABOVE # →‎رۨ‎→ + 06EF ; 0631 0302 ; MA # ( ‎ۯ‎ → ‎ر̂‎ ) ARABIC LETTER REH WITH INVERTED V → ARABIC LETTER REH, COMBINING CIRCUMFLEX ACCENT # →‎رٛ‎→ 076C ; 0631 0654 ; MA # ( ‎ݬ‎ → ‎رٔ‎ ) ARABIC LETTER REH WITH HAMZA ABOVE → ARABIC LETTER REH, ARABIC HAMZA ABOVE # @@ -4849,9 +4984,11 @@ FC32 ; 0641 0649 ; MA # ( ‎ﰲ‎ → ‎فى‎ ) ARABIC LIGATURE FEH WITH YE 1EE1E ; 06A1 ; MA # ( ‎𞸞‎ → ‎ڡ‎ ) ARABIC MATHEMATICAL DOTLESS FEH → ARABIC LETTER DOTLESS FEH # 1EE7E ; 06A1 ; MA # ( ‎𞹾‎ → ‎ڡ‎ ) ARABIC MATHEMATICAL STRETCHED DOTLESS FEH → ARABIC LETTER DOTLESS FEH # +08BB ; 06A1 ; MA # ( ‎ࢻ‎ → ‎ڡ‎ ) ARABIC LETTER AFRICAN FEH → ARABIC LETTER DOTLESS FEH # 066F ; 06A1 ; MA # ( ‎ٯ‎ → ‎ڡ‎ ) ARABIC LETTER DOTLESS QAF → ARABIC LETTER DOTLESS FEH # 1EE1F ; 06A1 ; MA # ( ‎𞸟‎ → ‎ڡ‎ ) ARABIC MATHEMATICAL DOTLESS QAF → ARABIC LETTER DOTLESS FEH # →‎ٯ‎→ 1EE5F ; 06A1 ; MA # ( ‎𞹟‎ → ‎ڡ‎ ) ARABIC MATHEMATICAL TAILED DOTLESS QAF → ARABIC LETTER DOTLESS FEH # →‎ٯ‎→ +08BC ; 06A1 ; MA # ( ‎ࢼ‎ → ‎ڡ‎ ) ARABIC LETTER AFRICAN QAF → ARABIC LETTER DOTLESS FEH # →‎ٯ‎→ 06A4 ; 06A1 06DB ; MA # ( ‎ڤ‎ → ‎ڡۛ‎ ) ARABIC LETTER VEH → ARABIC LETTER DOTLESS FEH, ARABIC SMALL HIGH THREE DOTS # FB6C ; 06A1 06DB ; MA # ( ‎ﭬ‎ → ‎ڡۛ‎ ) ARABIC LETTER VEH INITIAL FORM → ARABIC LETTER DOTLESS FEH, ARABIC SMALL HIGH THREE DOTS # →‎ڤ‎→ @@ -5206,6 +5343,7 @@ FBE0 ; 06C5 ; MA # ( ‎ﯠ‎ → ‎ۅ‎ ) ARABIC LETTER KIRGHIZ OE ISOLATED 1EE5D ; 0649 ; MA # ( ‎𞹝‎ → ‎ى‎ ) ARABIC MATHEMATICAL TAILED DOTLESS NOON → ARABIC LETTER ALEF MAKSURA # →‎ں‎→ FB9F ; 0649 ; MA # ( ‎ﮟ‎ → ‎ى‎ ) ARABIC LETTER NOON GHUNNA FINAL FORM → ARABIC LETTER ALEF MAKSURA # →‎ں‎→ FB9E ; 0649 ; MA # ( ‎ﮞ‎ → ‎ى‎ ) ARABIC LETTER NOON GHUNNA ISOLATED FORM → ARABIC LETTER ALEF MAKSURA # →‎ں‎→ +08BD ; 0649 ; MA # ( ‎ࢽ‎ → ‎ى‎ ) ARABIC LETTER AFRICAN NOON → ARABIC LETTER ALEF MAKSURA # →‎ں‎→ FBE8 ; 0649 ; MA # ( ‎ﯨ‎ → ‎ى‎ ) ARABIC LETTER UIGHUR KAZAKH KIRGHIZ ALEF MAKSURA INITIAL FORM → ARABIC LETTER ALEF MAKSURA # FBE9 ; 0649 ; MA # ( ‎ﯩ‎ → ‎ى‎ ) ARABIC LETTER UIGHUR KAZAKH KIRGHIZ ALEF MAKSURA MEDIAL FORM → ARABIC LETTER ALEF MAKSURA # FEF0 ; 0649 ; MA # ( ‎ﻰ‎ → ‎ى‎ ) ARABIC LETTER ALEF MAKSURA FINAL FORM → ARABIC LETTER ALEF MAKSURA # @@ -5260,9 +5398,13 @@ FE99 ; 0649 06DB ; MA # ( ‎ﺙ‎ → ‎ىۛ‎ ) ARABIC LETTER THEH ISOLATED 06D1 ; 0649 06DB ; MA # ( ‎ۑ‎ → ‎ىۛ‎ ) ARABIC LETTER YEH WITH THREE DOTS BELOW → ARABIC LETTER ALEF MAKSURA, ARABIC SMALL HIGH THREE DOTS # →‎پ‎→→‎ڽ‎→→‎ںۛ‎→ 063F ; 0649 06DB ; MA # ( ‎ؿ‎ → ‎ىۛ‎ ) ARABIC LETTER FARSI YEH WITH THREE DOTS ABOVE → ARABIC LETTER ALEF MAKSURA, ARABIC SMALL HIGH THREE DOTS # →‎یۛ‎→ +08B7 ; 0649 06DB 06E2 ; MA # ( ‎ࢷ‎ → ‎ىۛۢ‎ ) ARABIC LETTER PEH WITH SMALL MEEM ABOVE → ARABIC LETTER ALEF MAKSURA, ARABIC SMALL HIGH THREE DOTS, ARABIC SMALL HIGH MEEM ISOLATED FORM # →‎پۢ‎→ + 0756 ; 0649 0306 ; MA # ( ‎ݖ‎ → ‎ى̆‎ ) ARABIC LETTER BEH WITH SMALL V → ARABIC LETTER ALEF MAKSURA, COMBINING BREVE # →‎ٮٚ‎→ 06CE ; 0649 0306 ; MA # ( ‎ێ‎ → ‎ى̆‎ ) ARABIC LETTER YEH WITH SMALL V → ARABIC LETTER ALEF MAKSURA, COMBINING BREVE # →‎یٚ‎→ +08BA ; 0649 0306 0307 ; MA # ( ‎ࢺ‎ → ‎ى̆̇‎ ) ARABIC LETTER YEH WITH TWO DOTS BELOW AND SMALL NOON ABOVE → ARABIC LETTER ALEF MAKSURA, COMBINING BREVE, COMBINING DOT ABOVE # →‎يۨ‎→ + 063D ; 0649 0302 ; MA # ( ‎ؽ‎ → ‎ى̂‎ ) ARABIC LETTER FARSI YEH WITH INVERTED V → ARABIC LETTER ALEF MAKSURA, COMBINING CIRCUMFLEX ACCENT # →‎یٛ‎→ 08A8 ; 0649 0654 ; MA # ( ‎ࢨ‎ → ‎ىٔ‎ ) ARABIC LETTER YEH WITH TWO DOTS BELOW AND HAMZA ABOVE → ARABIC LETTER ALEF MAKSURA, ARABIC HAMZA ABOVE # →‎ئ‎→ @@ -5683,6 +5825,18 @@ FE19 ; 2D57 ; MA #* ( ︙ → ⵗ ) PRESENTATION FORM FOR VERTICAL HORIZONTAL EL 0DEB ; 0DAF ; MA # ( ෫ → ද ) SINHALA LITH DIGIT FIVE → SINHALA LETTER ALPAPRAANA DAYANNA # +11413 ; 11434 11442 11412 ; MA # ( 𑐓 → 𑐴𑑂𑐒 ) NEWA LETTER NGHA → NEWA LETTER HA, NEWA SIGN VIRAMA, NEWA LETTER NGA # + +11419 ; 11434 11442 11418 ; MA # ( 𑐙 → 𑐴𑑂𑐘 ) NEWA LETTER NYHA → NEWA LETTER HA, NEWA SIGN VIRAMA, NEWA LETTER NYA # + +11424 ; 11434 11442 11423 ; MA # ( 𑐤 → 𑐴𑑂𑐣 ) NEWA LETTER NHA → NEWA LETTER HA, NEWA SIGN VIRAMA, NEWA LETTER NA # + +1142A ; 11434 11442 11429 ; MA # ( 𑐪 → 𑐴𑑂𑐩 ) NEWA LETTER MHA → NEWA LETTER HA, NEWA SIGN VIRAMA, NEWA LETTER MA # + +1142D ; 11434 11442 1142C ; MA # ( 𑐭 → 𑐴𑑂𑐬 ) NEWA LETTER RHA → NEWA LETTER HA, NEWA SIGN VIRAMA, NEWA LETTER RA # + +1142F ; 11434 11442 1142E ; MA # ( 𑐯 → 𑐴𑑂𑐮 ) NEWA LETTER LHA → NEWA LETTER HA, NEWA SIGN VIRAMA, NEWA LETTER LA # + 115D8 ; 11582 ; MA # ( 𑗘 → 𑖂 ) SIDDHAM LETTER THREE-CIRCLE ALTERNATE I → SIDDHAM LETTER I # 115D9 ; 11582 ; MA # ( 𑗙 → 𑖂 ) SIDDHAM LETTER TWO-CIRCLE ALTERNATE I → SIDDHAM LETTER I # @@ -5749,6 +5903,10 @@ FE19 ; 2D57 ; MA #* ( ︙ → ⵗ ) PRESENTATION FORM FOR VERTICAL HORIZONTAL EL 0EB3 ; 030A 0EB2 ; MA # ( ຳ → ̊າ ) LAO VOWEL SIGN AM → COMBINING RING ABOVE, LAO VOWEL SIGN AA # →ໍາ→ +0F02 ; 0F60 0F74 0F82 0F7F ; MA #* ( ༂ → འུྂཿ ) TIBETAN MARK GTER YIG MGO -UM RNAM BCAD MA → TIBETAN LETTER -A, TIBETAN VOWEL SIGN U, TIBETAN SIGN NYI ZLA NAA DA, TIBETAN SIGN RNAM BCAD # + +0F03 ; 0F60 0F74 0F82 0F14 ; MA #* ( ༃ → འུྂ༔ ) TIBETAN MARK GTER YIG MGO -UM GTER TSHEG MA → TIBETAN LETTER -A, TIBETAN VOWEL SIGN U, TIBETAN SIGN NYI ZLA NAA DA, TIBETAN MARK GTER TSHEG # + 0F6A ; 0F62 ; MA # ( ཪ → ར ) TIBETAN LETTER FIXED-FORM RA → TIBETAN LETTER RA # 0F00 ; 0F68 0F7C 0F7E ; MA # ( ༀ → ཨོཾ ) TIBETAN SYLLABLE OM → TIBETAN LETTER A, TIBETAN VOWEL SIGN O, TIBETAN SIGN RJES SU NGA RO # @@ -5757,6 +5915,8 @@ FE19 ; 2D57 ; MA #* ( ︙ → ⵗ ) PRESENTATION FORM FOR VERTICAL HORIZONTAL EL 0F79 ; 0FB3 0F71 0F80 ; MA # ( ཹ → ླཱྀ ) TIBETAN VOWEL SIGN VOCALIC LL → TIBETAN SUBJOINED LETTER LA, TIBETAN VOWEL SIGN AA, TIBETAN VOWEL SIGN REVERSED I # +11CB2 ; 11CAA ; MA # ( 𑲲 → 𑲪 ) MARCHEN VOWEL SIGN U → MARCHEN SUBJOINED LETTER RA # + 1081 ; 1002 103E ; MA # ( ႁ → ဂှ ) MYANMAR LETTER SHAN HA → MYANMAR LETTER GA, MYANMAR CONSONANT SIGN MEDIAL HA # 1000 ; 1002 102C ; MA # ( က → ဂာ ) MYANMAR LETTER KA → MYANMAR LETTER GA, MYANMAR VOWEL SIGN AA # @@ -5769,7 +5929,11 @@ FE19 ; 2D57 ; MA #* ( ︙ → ⵗ ) PRESENTATION FORM FOR VERTICAL HORIZONTAL EL 106F ; 1015 102C 103E ; MA # ( ၯ → ပာှ ) MYANMAR LETTER EASTERN PWO KAREN YWA → MYANMAR LETTER PA, MYANMAR VOWEL SIGN AA, MYANMAR CONSONANT SIGN MEDIAL HA # →ဟှ→ -102A ; 1029 1031 102C 103A ; MA # ( ဪ → ဩော် ) MYANMAR LETTER AU → MYANMAR LETTER O, MYANMAR VOWEL SIGN E, MYANMAR VOWEL SIGN AA, MYANMAR SIGN ASAT # +107E ; 107D 103E ; MA # ( ၾ → ၽှ ) MYANMAR LETTER SHAN FA → MYANMAR LETTER SHAN PHA, MYANMAR CONSONANT SIGN MEDIAL HA # + +1029 ; 101E 103C ; MA # ( ဩ → သြ ) MYANMAR LETTER O → MYANMAR LETTER SA, MYANMAR CONSONANT SIGN MEDIAL RA # + +102A ; 101E 103C 1031 102C 103A ; MA # ( ဪ → သြော် ) MYANMAR LETTER AU → MYANMAR LETTER SA, MYANMAR CONSONANT SIGN MEDIAL RA, MYANMAR VOWEL SIGN E, MYANMAR VOWEL SIGN AA, MYANMAR SIGN ASAT # →ဩော်→ 109E ; 1083 030A ; MA #* ( ႞ → ႃ̊ ) MYANMAR SYMBOL SHAN ONE → MYANMAR VOWEL SIGN SHAN AA, COMBINING RING ABOVE # →ႃံ→ @@ -5818,6 +5982,8 @@ A9A3 ; A99D ; MA # ( ꦣ → ꦝ ) JAVANESE LETTER DA MAHAPRANA → JAVANESE LET 141A ; 140B 00B7 ; MA # ( ᐚ → ᐋ· ) CANADIAN SYLLABICS WEST-CREE WAA → CANADIAN SYLLABICS AA, MIDDLE DOT # →ᐋᐧ→ +18DD ; 141E 18DF ; MA # ( ᣝ → ᐞᣟ ) CANADIAN SYLLABICS WESTERN W → CANADIAN SYLLABICS GLOTTAL STOP, CANADIAN SYLLABICS FINAL RAISED DOT # + 14D1 ; 1421 ; MA # ( ᓑ → ᐡ ) CANADIAN SYLLABICS CARRIER NG → CANADIAN SYLLABICS FINAL BOTTOM HALF RING # 1540 ; 1429 ; MA # ( ᕀ → ᐩ ) CANADIAN SYLLABICS WEST-CREE Y → CANADIAN SYLLABICS FINAL PLUS # @@ -5896,6 +6062,14 @@ A9A3 ; A99D ; MA # ( ꦣ → ꦝ ) JAVANESE LETTER DA MAHAPRANA → JAVANESE LET 14CA ; 14C0 00B7 ; MA # ( ᓊ → ᓀ· ) CANADIAN SYLLABICS WEST-CREE NWE → CANADIAN SYLLABICS NE, MIDDLE DOT # →ᓀᐧ→ +18C7 ; 14C2 00B7 ; MA # ( ᣇ → ᓂ· ) CANADIAN SYLLABICS OJIBWAY NWI → CANADIAN SYLLABICS NI, MIDDLE DOT # →ᓂᐧ→ + +18C9 ; 14C3 00B7 ; MA # ( ᣉ → ᓃ· ) CANADIAN SYLLABICS OJIBWAY NWII → CANADIAN SYLLABICS NII, MIDDLE DOT # →ᓃᐧ→ + +18CB ; 14C4 00B7 ; MA # ( ᣋ → ᓄ· ) CANADIAN SYLLABICS OJIBWAY NWO → CANADIAN SYLLABICS NO, MIDDLE DOT # →ᓄᐧ→ + +18CD ; 14C5 00B7 ; MA # ( ᣍ → ᓅ· ) CANADIAN SYLLABICS OJIBWAY NWOO → CANADIAN SYLLABICS NOO, MIDDLE DOT # →ᓅᐧ→ + 14CC ; 14C7 00B7 ; MA # ( ᓌ → ᓇ· ) CANADIAN SYLLABICS WEST-CREE NWA → CANADIAN SYLLABICS NA, MIDDLE DOT # →ᓇᐧ→ 14CE ; 14C8 00B7 ; MA # ( ᓎ → ᓈ· ) CANADIAN SYLLABICS WEST-CREE NWAA → CANADIAN SYLLABICS NAA, MIDDLE DOT # →ᓈᐧ→ @@ -6064,11 +6238,18 @@ A4F7 ; 15E1 ; MA # ( ꓷ → ᗡ ) LISU LETTER OE → CANADIAN SYLLABICS CARRIER A4ED ; 1660 ; MA # ( ꓭ → ᙠ ) LISU LETTER GHA → CANADIAN SYLLABICS CARRIER TSA # +1DBA ; 18D4 ; MA # ( ᶺ → ᣔ ) MODIFIER LETTER SMALL TURNED V → CANADIAN SYLLABICS OJIBWAY P # + +1D3E ; 18D6 ; MA # ( ᴾ → ᣖ ) MODIFIER LETTER CAPITAL P → CANADIAN SYLLABICS OJIBWAY K # + +18DC ; 18DF 141E ; MA # ( ᣜ → ᣟᐞ ) CANADIAN SYLLABICS EASTERN W → CANADIAN SYLLABICS FINAL RAISED DOT, CANADIAN SYLLABICS GLOTTAL STOP # + 02E1 ; 18F3 ; MA # ( ˡ → ᣳ ) MODIFIER LETTER SMALL L → CANADIAN SYLLABICS BEAVER DENE L # 02B3 ; 18F4 ; MA # ( ʳ → ᣴ ) MODIFIER LETTER SMALL R → CANADIAN SYLLABICS BEAVER DENE R # 02E2 ; 18F5 ; MA # ( ˢ → ᣵ ) MODIFIER LETTER SMALL S → CANADIAN SYLLABICS CARRIER DENTAL S # +18DB ; 18F5 ; MA # ( ᣛ → ᣵ ) CANADIAN SYLLABICS OJIBWAY SH → CANADIAN SYLLABICS CARRIER DENTAL S # →ˢ→ A6B0 ; 16B9 ; MA # ( ꚰ → ᚹ ) BAMUM LETTER TAA → RUNIC LETTER WUNJO WYNN W # @@ -6105,8 +6286,14 @@ A6B0 ; 16B9 ; MA # ( ꚰ → ᚹ ) BAMUM LETTER TAA → RUNIC LETTER WUNJO WYNN 22C8 ; 16DE ; MA #* ( ⋈ → ᛞ ) BOWTIE → RUNIC LETTER DAGAZ DAEG D # 2A1D ; 16DE ; MA #* ( ⨝ → ᛞ ) JOIN → RUNIC LETTER DAGAZ DAEG D # →⋈→ +104D0 ; 16E6 ; MA # ( 𐓐 → ᛦ ) OSAGE CAPITAL LETTER KHA → RUNIC LETTER LONG-BRANCH-YR # + 2195 ; 16E8 ; MA #* ( ↕ → ᛨ ) UP DOWN ARROW → RUNIC LETTER ICELANDIC-YR # +10CFC ; 10C82 ; MA #* ( ‎𐳼‎ → ‎𐲂‎ ) OLD HUNGARIAN NUMBER TEN → OLD HUNGARIAN CAPITAL LETTER EB # + +10CFA ; 10CA5 ; MA #* ( ‎𐳺‎ → ‎𐲥‎ ) OLD HUNGARIAN NUMBER ONE → OLD HUNGARIAN CAPITAL LETTER ESZ # + 3131 ; 1100 ; MA # ( ㄱ → ᄀ ) HANGUL LETTER KIYEOK → HANGUL CHOSEONG KIYEOK # 11A8 ; 1100 ; MA # ( ᆨ → ᄀ ) HANGUL JONGSEONG KIYEOK → HANGUL CHOSEONG KIYEOK # @@ -6790,8 +6977,37 @@ A79E ; A4E4 ; MA # ( Ꞟ → ꓤ ) LATIN CAPITAL LETTER VOLAPUK UE → LISU LETT 2142 ; A4F6 ; MA #* ( ⅂ → ꓶ ) TURNED SANS-SERIF CAPITAL L → LISU LETTER UH # 1D215 ; A4F6 ; MA #* ( 𝈕 → ꓶ ) GREEK VOCAL NOTATION SYMBOL-22 → LISU LETTER UH # →⅂→ 1D22B ; A4F6 ; MA #* ( 𝈫 → ꓶ ) GREEK INSTRUMENTAL NOTATION SYMBOL-24 → LISU LETTER UH # →𝈕→→⅂→ +16F26 ; A4F6 ; MA # ( 𖼦 → ꓶ ) MIAO LETTER HA → LISU LETTER UH # →⅂→ 10411 ; A4F6 ; MA # ( 𐐑 → ꓶ ) DESERET CAPITAL LETTER PEE → LISU LETTER UH # →⅂→ +2143 ; 16F00 ; MA #* ( ⅃ → 𖼀 ) REVERSED SANS-SERIF CAPITAL L → MIAO LETTER PA # + +11AE6 ; 11AE5 11AEF ; MA # ( 𑫦 → 𑫥𑫯 ) PAU CIN HAU RISING TONE → PAU CIN HAU RISING TONE LONG, PAU CIN HAU MID-LEVEL TONE # + +11AE8 ; 11AE5 11AE5 ; MA # ( 𑫨 → 𑫥𑫥 ) PAU CIN HAU RISING TONE LONG FINAL → PAU CIN HAU RISING TONE LONG, PAU CIN HAU RISING TONE LONG # + +11AE9 ; 11AE5 11AE5 11AEF ; MA # ( 𑫩 → 𑫥𑫥𑫯 ) PAU CIN HAU RISING TONE FINAL → PAU CIN HAU RISING TONE LONG, PAU CIN HAU RISING TONE LONG, PAU CIN HAU MID-LEVEL TONE # →𑫥𑫦→ + +11AEA ; 11AE5 11AE5 11AF0 ; MA # ( 𑫪 → 𑫥𑫥𑫰 ) PAU CIN HAU SANDHI GLOTTAL STOP FINAL → PAU CIN HAU RISING TONE LONG, PAU CIN HAU RISING TONE LONG, PAU CIN HAU GLOTTAL STOP VARIANT # →𑫥𑫧→ + +11AE7 ; 11AE5 11AF0 ; MA # ( 𑫧 → 𑫥𑫰 ) PAU CIN HAU SANDHI GLOTTAL STOP → PAU CIN HAU RISING TONE LONG, PAU CIN HAU GLOTTAL STOP VARIANT # + +11AF4 ; 11AF3 11AEF ; MA # ( 𑫴 → 𑫳𑫯 ) PAU CIN HAU LOW-FALLING TONE → PAU CIN HAU LOW-FALLING TONE LONG, PAU CIN HAU MID-LEVEL TONE # + +11AF6 ; 11AF3 11AF3 ; MA # ( 𑫶 → 𑫳𑫳 ) PAU CIN HAU LOW-FALLING TONE LONG FINAL → PAU CIN HAU LOW-FALLING TONE LONG, PAU CIN HAU LOW-FALLING TONE LONG # + +11AF7 ; 11AF3 11AF3 11AEF ; MA # ( 𑫷 → 𑫳𑫳𑫯 ) PAU CIN HAU LOW-FALLING TONE FINAL → PAU CIN HAU LOW-FALLING TONE LONG, PAU CIN HAU LOW-FALLING TONE LONG, PAU CIN HAU MID-LEVEL TONE # →𑫳𑫴→ + +11AF8 ; 11AF3 11AF3 11AF0 ; MA # ( 𑫸 → 𑫳𑫳𑫰 ) PAU CIN HAU GLOTTAL STOP FINAL → PAU CIN HAU LOW-FALLING TONE LONG, PAU CIN HAU LOW-FALLING TONE LONG, PAU CIN HAU GLOTTAL STOP VARIANT # →𑫳𑫵→ + +11AF5 ; 11AF3 11AF0 ; MA # ( 𑫵 → 𑫳𑫰 ) PAU CIN HAU GLOTTAL STOP → PAU CIN HAU LOW-FALLING TONE LONG, PAU CIN HAU GLOTTAL STOP VARIANT # + +11AEC ; 11AEB 11AEF ; MA # ( 𑫬 → 𑫫𑫯 ) PAU CIN HAU SANDHI TONE → PAU CIN HAU SANDHI TONE LONG, PAU CIN HAU MID-LEVEL TONE # + +11AED ; 11AEB 11AEB ; MA # ( 𑫭 → 𑫫𑫫 ) PAU CIN HAU SANDHI TONE LONG FINAL → PAU CIN HAU SANDHI TONE LONG, PAU CIN HAU SANDHI TONE LONG # + +11AEE ; 11AEB 11AEB 11AEF ; MA # ( 𑫮 → 𑫫𑫫𑫯 ) PAU CIN HAU SANDHI TONE FINAL → PAU CIN HAU SANDHI TONE LONG, PAU CIN HAU SANDHI TONE LONG, PAU CIN HAU MID-LEVEL TONE # →𑫫𑫬→ + 2295 ; 102A8 ; MA #* ( ⊕ → 𐊨 ) CIRCLED PLUS → CARIAN LETTER Q # 2A01 ; 102A8 ; MA #* ( ⨁ → 𐊨 ) N-ARY CIRCLED PLUS OPERATOR → CARIAN LETTER Q # →⊕→ 1F728 ; 102A8 ; MA #* ( 🜨 → 𐊨 ) ALCHEMICAL SYMBOL FOR VERDIGRIS → CARIAN LETTER Q # →⊕→ @@ -9395,19 +9611,5 @@ FACE ; 9F9C ; MA # ( 龜 → 龜 ) CJK COMPATIBILITY IDEOGRAPH-FACE → CJK UNIF 2FD5 ; 9FA0 ; MA #* ( ⿕ → 龠 ) KANGXI RADICAL FLUTE → CJK UNIFIED IDEOGRAPH-9FA0 # -23FC ; 23FB ; MA #* ( ⏼ → ⏻ ) POWER ON-OFF SYMBOL → POWER SYMBOL # - -11413 ; 11434 11442 11412 ; MA # ( 𑐓 → 𑐴𑑂𑐒 ) NEWA LETTER NGHA → NEWA LETTER HA, NEWA SIGN VIRAMA, NEWA LETTER NGA # - -11419 ; 11434 11442 11418 ; MA # ( 𑐙 → 𑐴𑑂𑐘 ) NEWA LETTER NYHA → NEWA LETTER HA, NEWA SIGN VIRAMA, NEWA LETTER NYA # - -11424 ; 11434 11442 11423 ; MA # ( 𑐤 → 𑐴𑑂𑐣 ) NEWA LETTER NHA → NEWA LETTER HA, NEWA SIGN VIRAMA, NEWA LETTER NA # - -1142A ; 11434 11442 11429 ; MA # ( 𑐪 → 𑐴𑑂𑐩 ) NEWA LETTER MHA → NEWA LETTER HA, NEWA SIGN VIRAMA, NEWA LETTER MA # - -1142D ; 11434 11442 1142C ; MA # ( 𑐭 → 𑐴𑑂𑐬 ) NEWA LETTER RHA → NEWA LETTER HA, NEWA SIGN VIRAMA, NEWA LETTER RA # - -1142F ; 11434 11442 1142E ; MA # ( 𑐯 → 𑐴𑑂𑐮 ) NEWA LETTER LHA → NEWA LETTER HA, NEWA SIGN VIRAMA, NEWA LETTER LA # - -# total: 6167 +# total: 6294 diff --git a/Build/source/libs/icu/icu-src/source/data/unidata/norm2/nfc.txt b/Build/source/libs/icu/icu-src/source/data/unidata/norm2/nfc.txt index e4159d61950..d2c9a0a1734 100644 --- a/Build/source/libs/icu/icu-src/source/data/unidata/norm2/nfc.txt +++ b/Build/source/libs/icu/icu-src/source/data/unidata/norm2/nfc.txt @@ -1,3 +1,5 @@ +# Copyright (C) 2016 and later: Unicode, Inc. and others. +# License & terms of use: http://www.unicode.org/copyright.html # Copyright (C) 1999-2016, International Business Machines # Corporation and others. All Rights Reserved. # @@ -7,7 +9,7 @@ # # Complete data for Unicode NFC normalization. -* Unicode 9.0.0 +* Unicode 10.0.0 # Canonical_Combining_Class (ccc) values 0300..0314:230 @@ -164,6 +166,7 @@ 0C56:91 0CBC:7 0CCD:9 +0D3B..0D3C:9 0D4D:9 0DCA:9 0E38..0E39:103 @@ -234,6 +237,9 @@ 1DCF:220 1DD0:202 1DD1..1DF5:230 +1DF6:232 +1DF7..1DF8:228 +1DF9:220 1DFB:230 1DFC:233 1DFD:220 @@ -322,7 +328,12 @@ FE2E..FE2F:230 116B6:9 116B7:7 1172B:9 +11A34:9 +11A47:9 +11A99:9 11C3F:9 +11D42:7 +11D44..11D45:9 16AF0..16AF4:1 16B30..16B36:230 1BC9E:1 diff --git a/Build/source/libs/icu/icu-src/source/data/unidata/norm2/nfkc.txt b/Build/source/libs/icu/icu-src/source/data/unidata/norm2/nfkc.txt index f51fa5db4b7..8b71727f89f 100644 --- a/Build/source/libs/icu/icu-src/source/data/unidata/norm2/nfkc.txt +++ b/Build/source/libs/icu/icu-src/source/data/unidata/norm2/nfkc.txt @@ -1,3 +1,5 @@ +# Copyright (C) 2016 and later: Unicode, Inc. and others. +# License & terms of use: http://www.unicode.org/copyright.html # Copyright (C) 1999-2016, International Business Machines # Corporation and others. All Rights Reserved. # @@ -11,7 +13,7 @@ # to NFKC one-way mappings. # Use this file as the second gennorm2 input file after nfc.txt. -* Unicode 9.0.0 +* Unicode 10.0.0 00A0>0020 00A8>0020 0308 diff --git a/Build/source/libs/icu/icu-src/source/data/unidata/norm2/nfkc_cf.txt b/Build/source/libs/icu/icu-src/source/data/unidata/norm2/nfkc_cf.txt index 7f33df58c84..726c5b5adce 100644 --- a/Build/source/libs/icu/icu-src/source/data/unidata/norm2/nfkc_cf.txt +++ b/Build/source/libs/icu/icu-src/source/data/unidata/norm2/nfkc_cf.txt @@ -1,7 +1,7 @@ -# Unicode Character Database -# Copyright (c) 1991-2016 Unicode, Inc. -# For terms of use, see http://www.unicode.org/terms_of_use.html -# For documentation, see http://www.unicode.org/reports/tr44/ +# Copyright (C) 2016 and later: Unicode, Inc. and others. +# License & terms of use: http://www.unicode.org/copyright.html +# Copyright (C) 1999-2016, International Business Machines +# Corporation and others. All Rights Reserved. # # file name: nfkc_cf.txt # @@ -12,7 +12,7 @@ # and reformatted into syntax for the gennorm2 Normalizer2 data generator tool. # Use this file as the third gennorm2 input file after nfc.txt and nfkc.txt. -* Unicode 9.0.0 +* Unicode 10.0.0 0041>0061 0042>0062 diff --git a/Build/source/libs/icu/icu-src/source/data/unidata/norm2/uts46.txt b/Build/source/libs/icu/icu-src/source/data/unidata/norm2/uts46.txt index 174695396be..efbe3c02cd2 100644 --- a/Build/source/libs/icu/icu-src/source/data/unidata/norm2/uts46.txt +++ b/Build/source/libs/icu/icu-src/source/data/unidata/norm2/uts46.txt @@ -1,7 +1,7 @@ # Original file: -# IdnaMappingTable-9.0.0.txt -# Date: 2016-06-16, 13:35:01 GMT -# © 2016 Unicode®, Inc. +# IdnaMappingTable-10.0.0.txt +# Date: 2017-02-23, 14:18:32 GMT +# © 2017 Unicode®, Inc. # Unicode and the Unicode Logo are registered trademarks of Unicode, Inc. in the U.S. and other countries. # For terms of use, see http://www.unicode.org/terms_of_use.html # @@ -981,7 +981,9 @@ # 0840..085B valid # 6.0 MANDAIC LETTER HALQA..MANDAIC GEMINATION MARK 085C..085D >FFFD # NA .. # 085E valid # 6.0 MANDAIC PUNCTUATION -085F..089F >FFFD # NA .. +085F >FFFD # NA +# 0860..086A valid # 10.0 SYRIAC LETTER MALAYALAM NGA..SYRIAC LETTER MALAYALAM SSA +086B..089F >FFFD # NA .. # 08A0 valid # 6.1 ARABIC LETTER BEH WITH SMALL V BELOW # 08A1 valid # 7.0 ARABIC LETTER BEH WITH HAMZA ABOVE # 08A2..08AC valid # 6.1 ARABIC LETTER JEEM WITH TWO DOTS ABOVE..ARABIC LETTER ROHINGYA YEH @@ -1060,7 +1062,9 @@ # 09E6..09F1 valid # 1.1 BENGALI DIGIT ZERO..BENGALI LETTER RA WITH LOWER DIAGONAL # 09F2..09FA valid # 1.1 BENGALI RUPEE MARK..BENGALI ISSHAR # 09FB valid # 5.2 BENGALI GANDA MARK -09FC..0A00 >FFFD # NA .. +# 09FC valid # 10.0 BENGALI LETTER VEDIC ANUSVARA +# 09FD valid # 10.0 BENGALI ABBREVIATION SIGN +09FE..0A00 >FFFD # NA .. # 0A01 valid # 4.0 GURMUKHI SIGN ADAK BINDI # 0A02 valid # 1.1 GURMUKHI SIGN BINDI # 0A03 valid # 4.0 GURMUKHI SIGN VISARGA @@ -1133,7 +1137,8 @@ # 0AF1 valid # 4.0 GUJARATI RUPEE SIGN 0AF2..0AF8 >FFFD # NA .. # 0AF9 valid # 8.0 GUJARATI LETTER ZHA -0AFA..0B00 >FFFD # NA .. +# 0AFA..0AFF valid # 10.0 GUJARATI SIGN SUKUN..GUJARATI SIGN TWO-CIRCLE NUKTA ABOVE +0B00 >FFFD # NA # 0B01..0B03 valid # 1.1 ORIYA SIGN CANDRABINDU..ORIYA SIGN VISARGA 0B04 >FFFD # NA # 0B05..0B0C valid # 1.1 ORIYA LETTER A..ORIYA LETTER VOCALIC L @@ -1268,7 +1273,8 @@ # 0CE6..0CEF valid # 1.1 KANNADA DIGIT ZERO..KANNADA DIGIT NINE 0CF0 >FFFD # NA # 0CF1..0CF2 valid # 5.0 KANNADA SIGN JIHVAMULIYA..KANNADA SIGN UPADHMANIYA -0CF3..0D00 >FFFD # NA .. +0CF3..0CFF >FFFD # NA .. +# 0D00 valid # 10.0 MALAYALAM SIGN COMBINING ANUSVARA ABOVE # 0D01 valid # 7.0 MALAYALAM SIGN CANDRABINDU # 0D02..0D03 valid # 1.1 MALAYALAM SIGN ANUSVARA..MALAYALAM SIGN VISARGA 0D04 >FFFD # NA @@ -1280,7 +1286,7 @@ # 0D29 valid # 6.0 MALAYALAM LETTER NNNA # 0D2A..0D39 valid # 1.1 MALAYALAM LETTER PA..MALAYALAM LETTER HA # 0D3A valid # 6.0 MALAYALAM LETTER TTTA -0D3B..0D3C >FFFD # NA .. +# 0D3B..0D3C valid # 10.0 MALAYALAM SIGN VERTICAL BAR VIRAMA..MALAYALAM SIGN CIRCULAR VIRAMA # 0D3D valid # 5.1 MALAYALAM SIGN AVAGRAHA # 0D3E..0D43 valid # 1.1 MALAYALAM VOWEL SIGN AA..MALAYALAM VOWEL SIGN VOCALIC R # 0D44 valid # 5.1 MALAYALAM VOWEL SIGN VOCALIC RR @@ -1694,7 +1700,7 @@ # 1CD3 valid # 5.2 VEDIC SIGN NIHSHVASA # 1CD4..1CF2 valid # 5.2 VEDIC SIGN YAJURVEDIC MIDLINE SVARITA..VEDIC SIGN ARDHAVISARGA # 1CF3..1CF6 valid # 6.1 VEDIC SIGN ROTATED ARDHAVISARGA..VEDIC SIGN UPADHMANIYA -1CF7 >FFFD # NA +# 1CF7 valid # 10.0 VEDIC SIGN ATIKRAMA # 1CF8..1CF9 valid # 7.0 VEDIC TONE RING ABOVE..VEDIC TONE DOUBLE RING ABOVE 1CFA..1CFF >FFFD # NA .. # 1D00..1D2B valid # 4.0 LATIN LETTER SMALL CAPITAL A..CYRILLIC LETTER SMALL CAPITAL EL @@ -1806,7 +1812,8 @@ # 1DC4..1DCA valid # 5.0 COMBINING MACRON-ACUTE..COMBINING LATIN SMALL LETTER R BELOW # 1DCB..1DE6 valid # 5.1 COMBINING BREVE-MACRON..COMBINING LATIN SMALL LETTER Z # 1DE7..1DF5 valid # 7.0 COMBINING LATIN SMALL LETTER ALPHA..COMBINING UP TACK ABOVE -1DF6..1DFA >FFFD # NA .. +# 1DF6..1DF9 valid # 10.0 COMBINING KAVYKA ABOVE RIGHT..COMBINING WIDE INVERTED BRIDGE BELOW +1DFA >FFFD # NA # 1DFB valid # 9.0 COMBINING DELETION MARK # 1DFC valid # 6.0 COMBINING DOUBLE INVERTED BREVE BELOW # 1DFD valid # 5.2 COMBINING ALMOST EQUAL TO BELOW @@ -2355,7 +2362,8 @@ # 20BA valid # 6.2 TURKISH LIRA SIGN # 20BB..20BD valid # 7.0 NORDIC MARK SIGN..RUBLE SIGN # 20BE valid # 8.0 LARI SIGN -20BF..20CF >FFFD # NA .. +# 20BF valid # 10.0 BITCOIN SIGN +20C0..20CF >FFFD # NA .. # 20D0..20E1 valid # 1.1 COMBINING LEFT HARPOON ABOVE..COMBINING LEFT RIGHT ARROW ABOVE # 20E2..20E3 valid # 3.0 COMBINING ENCLOSING SCREEN..COMBINING ENCLOSING KEYCAP # 20E4..20EA valid # 3.2 COMBINING ENCLOSING UPWARD POINTING TRIANGLE..COMBINING LEFTWARDS ARROW OVERLAY @@ -2514,7 +2522,7 @@ # 23E9..23F3 valid # 6.0 BLACK RIGHT-POINTING DOUBLE TRIANGLE..HOURGLASS WITH FLOWING SAND # 23F4..23FA valid # 7.0 BLACK MEDIUM LEFT-POINTING TRIANGLE..BLACK CIRCLE FOR RECORD # 23FB..23FE valid # 9.0 POWER SYMBOL..POWER SLEEP SYMBOL -23FF >FFFD # NA +# 23FF valid # 10.0 OBSERVER EYE SYMBOL # 2400..2424 valid # 1.1 SYMBOL FOR NULL..SYMBOL FOR NEWLINE # 2425..2426 valid # 3.0 SYMBOL FOR DELETE FORM TWO..SYMBOL FOR SUBSTITUTE FORM TWO 2427..243F >FFFD # NA .. @@ -2736,7 +2744,8 @@ # 2BBD..2BC8 valid # 7.0 BALLOT BOX WITH LIGHT X..BLACK MEDIUM RIGHT-POINTING TRIANGLE CENTRED 2BC9 >FFFD # NA # 2BCA..2BD1 valid # 7.0 TOP HALF BLACK CIRCLE..UNCERTAINTY SIGN -2BD2..2BEB >FFFD # NA .. +# 2BD2 valid # 10.0 GROUP MARK +2BD3..2BEB >FFFD # NA .. # 2BEC..2BEF valid # 8.0 LEFTWARDS TWO-HEADED ARROW WITH TRIANGLE ARROWHEADS..DOWNWARDS TWO-HEADED ARROW WITH TRIANGLE ARROWHEADS 2BF0..2BFF >FFFD # NA .. 2C00 >2C30 # 4.1 GLAGOLITIC CAPITAL LETTER AZU @@ -2967,7 +2976,8 @@ # 2E32..2E3B valid # 6.1 TURNED COMMA..THREE-EM DASH # 2E3C..2E42 valid # 7.0 STENOGRAPHIC FULL STOP..DOUBLE LOW-REVERSED-9 QUOTATION MARK # 2E43..2E44 valid # 9.0 DASH WITH LEFT UPTURN..DOUBLE SUSPENSION MARK -2E45..2E7F >FFFD # NA .. +# 2E45..2E49 valid # 10.0 INVERTED LOW KAVYKA..DOUBLE STACKED COMMA +2E4A..2E7F >FFFD # NA .. # 2E80..2E99 valid # 3.0 CJK RADICAL REPEAT..CJK RADICAL RAP 2E9A >FFFD # NA # 2E9B..2E9E valid # 3.0 CJK RADICAL CHOKE..CJK RADICAL DEATH @@ -3225,7 +3235,8 @@ 3100..3104 >FFFD # NA .. # 3105..312C valid # 1.1 BOPOMOFO LETTER B..BOPOMOFO LETTER GN # 312D valid # 5.1 BOPOMOFO LETTER IH -312E..3130 >FFFD # NA .. +# 312E valid # 10.0 BOPOMOFO LETTER O WITH DOT ABOVE +312F..3130 >FFFD # NA .. 3131 >1100 # 1.1 HANGUL LETTER KIYEOK 3132 >1101 # 1.1 HANGUL LETTER SSANGKIYEOK 3133 >11AA # 1.1 HANGUL LETTER KIYEOK-SIOS @@ -3857,7 +3868,8 @@ # 9FC4..9FCB valid # 5.2 CJK UNIFIED IDEOGRAPH-9FC4..CJK UNIFIED IDEOGRAPH-9FCB # 9FCC valid # 6.1 CJK UNIFIED IDEOGRAPH-9FCC # 9FCD..9FD5 valid # 8.0 CJK UNIFIED IDEOGRAPH-9FCD..CJK UNIFIED IDEOGRAPH-9FD5 -9FD6..9FFF >FFFD # NA .. +# 9FD6..9FEA valid # 10.0 CJK UNIFIED IDEOGRAPH-9FD6..CJK UNIFIED IDEOGRAPH-9FEA +9FEB..9FFF >FFFD # NA .. # A000..A48C valid # 3.0 YI SYLLABLE IT..YI SYLLABLE YYR A48D..A48F >FFFD # NA .. # A490..A4A1 valid # 3.0 YI RADICAL QOT..YI RADICAL GA @@ -5704,7 +5716,8 @@ FFFE..FFFF >FFFD # 1.1 ..FFFD # NA .. +10324..1032C >FFFD # NA .. +# 1032D..1032Fvalid # 10.0 OLD ITALIC LETTER YE..OLD ITALIC LETTER SOUTHERN TSE # 10330..10340valid # 3.1 GOTHIC LETTER AHSA..GOTHIC LETTER PAIRTHRA # 10341 valid # 3.1 GOTHIC LETTER NINETY # 10342..10349valid # 3.1 GOTHIC LETTER RAIDA..GOTHIC LETTER OTHAL @@ -6127,7 +6140,18 @@ FFFE..FFFF >FFFD # 1.1 ..FFFD # NA .. # 118FF valid # 7.0 WARANG CITI OM -11900..11ABF >FFFD # NA .. +11900..119FF >FFFD # NA .. +# 11A00..11A3Evalid # 10.0 ZANABAZAR SQUARE LETTER A..ZANABAZAR SQUARE CLUSTER-FINAL LETTER VA +# 11A3F..11A46valid # 10.0 ZANABAZAR SQUARE INITIAL HEAD MARK..ZANABAZAR SQUARE CLOSING DOUBLE-LINED HEAD MARK +# 11A47 valid # 10.0 ZANABAZAR SQUARE SUBJOINER +11A48..11A4F >FFFD # NA .. +# 11A50..11A83valid # 10.0 SOYOMBO LETTER A..SOYOMBO LETTER KSSA +11A84..11A85 >FFFD # NA .. +# 11A86..11A99valid # 10.0 SOYOMBO CLUSTER-INITIAL LETTER RA..SOYOMBO SUBJOINER +# 11A9A..11A9Cvalid # 10.0 SOYOMBO MARK TSHEG..SOYOMBO MARK DOUBLE SHAD +11A9D >FFFD # NA +# 11A9E..11AA2valid # 10.0 SOYOMBO HEAD MARK WITH MOON AND SUN AND TRIPLE FLAME..SOYOMBO TERMINAL MARK-2 +11AA3..11ABF >FFFD # NA .. # 11AC0..11AF8valid # 7.0 PAU CIN HAU LETTER PA..PAU CIN HAU GLOTTAL STOP FINAL 11AF9..11BFF >FFFD # NA .. # 11C00..11C08valid # 9.0 BHAIKSUKI LETTER A..BHAIKSUKI LETTER VOCALIC L @@ -6146,7 +6170,21 @@ FFFE..FFFF >FFFD # 1.1 ..FFFD # NA # 11CA9..11CB6valid # 9.0 MARCHEN SUBJOINED LETTER YA..MARCHEN SIGN CANDRABINDU -11CB7..11FFF >FFFD # NA .. +11CB7..11CFF >FFFD # NA .. +# 11D00..11D06valid # 10.0 MASARAM GONDI LETTER A..MASARAM GONDI LETTER E +11D07 >FFFD # NA +# 11D08..11D09valid # 10.0 MASARAM GONDI LETTER AI..MASARAM GONDI LETTER O +11D0A >FFFD # NA +# 11D0B..11D36valid # 10.0 MASARAM GONDI LETTER AU..MASARAM GONDI VOWEL SIGN VOCALIC R +11D37..11D39 >FFFD # NA .. +# 11D3A valid # 10.0 MASARAM GONDI VOWEL SIGN E +11D3B >FFFD # NA +# 11D3C..11D3Dvalid # 10.0 MASARAM GONDI VOWEL SIGN AI..MASARAM GONDI VOWEL SIGN O +11D3E >FFFD # NA +# 11D3F..11D47valid # 10.0 MASARAM GONDI VOWEL SIGN AU..MASARAM GONDI RA-KARA +11D48..11D4F >FFFD # NA .. +# 11D50..11D59valid # 10.0 MASARAM GONDI DIGIT ZERO..MASARAM GONDI DIGIT NINE +11D5A..11FFF >FFFD # NA .. # 12000..1236Evalid # 5.0 CUNEIFORM SIGN A..CUNEIFORM SIGN ZUM # 1236F..12398valid # 7.0 CUNEIFORM SIGN KAP ELAMITE..CUNEIFORM SIGN UM TIMES ME # 12399 valid # 8.0 CUNEIFORM SIGN U U @@ -6196,13 +6234,17 @@ FFFE..FFFF >FFFD # 1.1 ..FFFD # NA .. # 16FE0 valid # 9.0 TANGUT ITERATION MARK -16FE1..16FFF >FFFD # NA .. +# 16FE1 valid # 10.0 NUSHU ITERATION MARK +16FE2..16FFF >FFFD # NA .. # 17000..187ECvalid # 9.0 TANGUT IDEOGRAPH-17000..TANGUT IDEOGRAPH-187EC 187ED..187FF >FFFD # NA .. # 18800..18AF2valid # 9.0 TANGUT COMPONENT-001..TANGUT COMPONENT-755 18AF3..1AFFF >FFFD # NA .. # 1B000..1B001valid # 6.0 KATAKANA LETTER ARCHAIC E..HIRAGANA LETTER ARCHAIC YE -1B002..1BBFF >FFFD # NA .. +# 1B002..1B11Evalid # 10.0 HENTAIGANA LETTER A-1..HENTAIGANA LETTER N-MU-MO-2 +1B11F..1B16F >FFFD # NA .. +# 1B170..1B2FBvalid # 10.0 NUSHU CHARACTER-1B170..NUSHU CHARACTER-1B2FB +1B2FC..1BBFF >FFFD # NA .. # 1BC00..1BC6Avalid # 7.0 DUPLOYAN LETTER H..DUPLOYAN LETTER VOCALIC M 1BC6B..1BC6F >FFFD # NA .. # 1BC70..1BC7Cvalid # 7.0 DUPLOYAN AFFIX LEFT HORIZONTAL SECANT..DUPLOYAN AFFIX ATTACHED TANGENT HOOK @@ -7676,7 +7718,9 @@ FFFE..FFFF >FFFD # 1.1 ..FFFD # NA .. 1F250 >5F97 # 6.0 CIRCLED IDEOGRAPH ADVANTAGE 1F251 >53EF # 6.0 CIRCLED IDEOGRAPH ACCEPT -1F252..1F2FF >FFFD # NA .. +1F252..1F25F >FFFD # NA .. +# 1F260..1F265valid # 10.0 ROUNDED SYMBOL FOR FU..ROUNDED SYMBOL FOR CAI +1F266..1F2FF >FFFD # NA .. # 1F300..1F320valid # 6.0 CYCLONE..SHOOTING STAR # 1F321..1F32Cvalid # 7.0 THERMOMETER..WIND BLOWING FACE # 1F32D..1F32Fvalid # 8.0 HOT DOG..BURRITO @@ -7747,12 +7791,14 @@ FFFE..FFFF >FFFD # 1.1 ..FFFD # NA .. +# 1F6D3..1F6D4valid # 10.0 STUPA..PAGODA +1F6D5..1F6DF >FFFD # NA .. # 1F6E0..1F6ECvalid # 7.0 HAMMER AND WRENCH..AIRPLANE ARRIVING 1F6ED..1F6EF >FFFD # NA .. # 1F6F0..1F6F3valid # 7.0 SATELLITE..PASSENGER SHIP # 1F6F4..1F6F6valid # 9.0 SCOOTER..CANOE -1F6F7..1F6FF >FFFD # NA .. +# 1F6F7..1F6F8valid # 10.0 SLED..FLYING SAUCER +1F6F9..1F6FF >FFFD # NA .. # 1F700..1F773valid # 6.0 ALCHEMICAL SYMBOL FOR QUINTESSENCE..ALCHEMICAL SYMBOL FOR HALF OUNCE 1F774..1F77F >FFFD # NA .. # 1F780..1F7D4valid # 7.0 BLACK LEFT-POINTING ISOSCELES RIGHT TRIANGLE..HEAVY TWELVE POINTED PINWHEEL STAR @@ -7766,25 +7812,32 @@ FFFE..FFFF >FFFD # 1.1 ..FFFD # NA .. # 1F890..1F8ADvalid # 7.0 LEFTWARDS TRIANGLE ARROWHEAD..WHITE ARROW SHAFT WIDTH TWO THIRDS -1F8AE..1F90F >FFFD # NA .. +1F8AE..1F8FF >FFFD # NA .. +# 1F900..1F90Bvalid # 10.0 CIRCLED CROSS FORMEE WITH FOUR DOTS..DOWNWARD FACING NOTCHED HOOK WITH DOT +1F90C..1F90F >FFFD # NA .. # 1F910..1F918valid # 8.0 ZIPPER-MOUTH FACE..SIGN OF THE HORNS # 1F919..1F91Evalid # 9.0 CALL ME HAND..HAND WITH INDEX AND MIDDLE FINGERS CROSSED -1F91F >FFFD # NA +# 1F91F valid # 10.0 I LOVE YOU HAND SIGN # 1F920..1F927valid # 9.0 FACE WITH COWBOY HAT..SNEEZING FACE -1F928..1F92F >FFFD # NA .. +# 1F928..1F92Fvalid # 10.0 FACE WITH ONE EYEBROW RAISED..SHOCKED FACE WITH EXPLODING HEAD # 1F930 valid # 9.0 PREGNANT WOMAN -1F931..1F932 >FFFD # NA .. +# 1F931..1F932valid # 10.0 BREAST-FEEDING..PALMS UP TOGETHER # 1F933..1F93Evalid # 9.0 SELFIE..HANDBALL 1F93F >FFFD # NA # 1F940..1F94Bvalid # 9.0 WILTED FLOWER..MARTIAL ARTS UNIFORM -1F94C..1F94F >FFFD # NA .. +# 1F94C valid # 10.0 CURLING STONE +1F94D..1F94F >FFFD # NA .. # 1F950..1F95Evalid # 9.0 CROISSANT..PANCAKES -1F95F..1F97F >FFFD # NA .. +# 1F95F..1F96Bvalid # 10.0 DUMPLING..CANNED FOOD +1F96C..1F97F >FFFD # NA .. # 1F980..1F984valid # 8.0 CRAB..UNICORN FACE # 1F985..1F991valid # 9.0 EAGLE..SQUID -1F992..1F9BF >FFFD # NA .. +# 1F992..1F997valid # 10.0 GIRAFFE FACE..CRICKET +1F998..1F9BF >FFFD # NA .. # 1F9C0 valid # 8.0 CHEESE WEDGE -1F9C1..1FFFD >FFFD # NA .. +1F9C1..1F9CF >FFFD # NA .. +# 1F9D0..1F9E6valid # 10.0 FACE WITH MONOCLE..SOCKS +1F9E7..1FFFD >FFFD # NA .. 1FFFE..1FFFF >FFFD # 2.0 .. # 20000..2A6D6valid # 3.1 CJK UNIFIED IDEOGRAPH-20000..CJK UNIFIED IDEOGRAPH-2A6D6 2A6D7..2A6FF >FFFD # NA .. @@ -7793,7 +7846,9 @@ FFFE..FFFF >FFFD # 1.1 ..FFFD # NA .. # 2B820..2CEA1valid # 8.0 CJK UNIFIED IDEOGRAPH-2B820..CJK UNIFIED IDEOGRAPH-2CEA1 -2CEA2..2F7FF >FFFD # NA .. +2CEA2..2CEAF >FFFD # NA .. +# 2CEB0..2EBE0valid # 10.0 CJK UNIFIED IDEOGRAPH-2CEB0..CJK UNIFIED IDEOGRAPH-2EBE0 +2EBE1..2F7FF >FFFD # NA .. 2F800 >4E3D # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F800 2F801 >4E38 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F801 2F802 >4E41 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F802 diff --git a/Build/source/libs/icu/icu-src/source/data/unidata/ppucd.txt b/Build/source/libs/icu/icu-src/source/data/unidata/ppucd.txt index 9a8d5de936c..b9e404523b6 100644 --- a/Build/source/libs/icu/icu-src/source/data/unidata/ppucd.txt +++ b/Build/source/libs/icu/icu-src/source/data/unidata/ppucd.txt @@ -1,7 +1,7 @@ # Preparsed UCD generated by ICU preparseucd.py -# Copyright (c) 1991-2016 Unicode, Inc. -# For terms of use, see http://www.unicode.org/terms_of_use.html -ucd;9.0.0 +# Copyright (C) 1991 and later: Unicode, Inc. and others. +# License & terms of use: http://www.unicode.org/copyright.html +ucd;10.0.0 property;Catalog;age;Age property;Binary;AHex;ASCII_Hex_Digit @@ -35,6 +35,7 @@ property;String;dm;Decomposition_Mapping property;Enumerated;dt;Decomposition_Type property;Enumerated;ea;East_Asian_Width property;Binary;Emoji;Emoji +property;Binary;Emoji_Component;Emoji_Component property;Binary;Emoji_Modifier;Emoji_Modifier property;Binary;Emoji_Modifier_Base;Emoji_Modifier_Base property;Binary;Emoji_Presentation;Emoji_Presentation @@ -88,6 +89,7 @@ property;Binary;PCM;Prepended_Concatenation_Mark property;Binary;;print property;Binary;QMark;Quotation_Mark property;Binary;Radical;Radical +property;Binary;RI;Regional_Indicator property;Enumerated;SB;Sentence_Break property;Catalog;sc;Script property;String;scf;Simple_Case_Folding;sfc @@ -106,6 +108,7 @@ property;String;Turkic_Case_Folding;Turkic_Case_Folding property;String;uc;Uppercase_Mapping property;Binary;UIdeo;Unified_Ideograph property;Binary;Upper;Uppercase +property;Enumerated;vo;Vertical_Orientation property;Binary;VS;Variation_Selector property;Enumerated;WB;Word_Break property;Binary;WSpace;White_Space;space @@ -116,6 +119,7 @@ property;Binary;XIDS;XID_Start binary;N;No;F;False binary;Y;Yes;T;True value;age;1.1;V1_1 +value;age;10.0;V10_0 value;age;2.0;V2_0 value;age;2.1;V2_1 value;age;3.0;V3_0 @@ -202,6 +206,7 @@ value;blk;CJK_Ext_B;CJK_Unified_Ideographs_Extension_B value;blk;CJK_Ext_C;CJK_Unified_Ideographs_Extension_C value;blk;CJK_Ext_D;CJK_Unified_Ideographs_Extension_D value;blk;CJK_Ext_E;CJK_Unified_Ideographs_Extension_E +value;blk;CJK_Ext_F;CJK_Unified_Ideographs_Extension_F value;blk;CJK_Radicals_Sup;CJK_Radicals_Supplement value;blk;CJK_Strokes;CJK_Strokes value;blk;CJK_Symbols;CJK_Symbols_And_Punctuation @@ -280,6 +285,7 @@ value;blk;Jamo_Ext_A;Hangul_Jamo_Extended_A value;blk;Jamo_Ext_B;Hangul_Jamo_Extended_B value;blk;Javanese;Javanese value;blk;Kaithi;Kaithi +value;blk;Kana_Ext_A;Kana_Extended_A value;blk;Kana_Sup;Kana_Supplement value;blk;Kanbun;Kanbun value;blk;Kangxi;Kangxi_Radicals @@ -316,6 +322,7 @@ value;blk;Malayalam;Malayalam value;blk;Mandaic;Mandaic value;blk;Manichaean;Manichaean value;blk;Marchen;Marchen +value;blk;Masaram_Gondi;Masaram_Gondi value;blk;Math_Alphanum;Mathematical_Alphanumeric_Symbols value;blk;Math_Operators;Mathematical_Operators value;blk;Meetei_Mayek;Meetei_Mayek @@ -347,6 +354,7 @@ value;blk;Nabataean;Nabataean value;blk;New_Tai_Lue;New_Tai_Lue value;blk;Newa;Newa value;blk;Number_Forms;Number_Forms +value;blk;Nushu;Nushu value;blk;OCR;Optical_Character_Recognition value;blk;Ogham;Ogham value;blk;Ol_Chiki;Ol_Chiki @@ -386,6 +394,7 @@ value;blk;Sinhala;Sinhala value;blk;Sinhala_Archaic_Numbers;Sinhala_Archaic_Numbers value;blk;Small_Forms;Small_Form_Variants value;blk;Sora_Sompeng;Sora_Sompeng +value;blk;Soyombo;Soyombo value;blk;Specials;Specials value;blk;Sundanese;Sundanese value;blk;Sundanese_Sup;Sundanese_Supplement @@ -401,6 +410,7 @@ value;blk;Super_And_Sub;Superscripts_And_Subscripts value;blk;Sutton_SignWriting;Sutton_SignWriting value;blk;Syloti_Nagri;Syloti_Nagri value;blk;Syriac;Syriac +value;blk;Syriac_Sup;Syriac_Supplement value;blk;Tagalog;Tagalog value;blk;Tagbanwa;Tagbanwa value;blk;Tags;Tags @@ -431,6 +441,7 @@ value;blk;Warang_Citi;Warang_Citi value;blk;Yi_Radicals;Yi_Radicals value;blk;Yi_Syllables;Yi_Syllables value;blk;Yijing;Yijing_Hexagram_Symbols +value;blk;Zanabazar_Square;Zanabazar_Square value;bpt;c;Close value;bpt;n;None value;bpt;o;Open @@ -616,6 +627,7 @@ value;hst;NA;Not_Applicable value;hst;T;Trailing_Jamo value;hst;V;Vowel_Jamo value;InPC;Bottom;Bottom +value;InPC;Bottom_And_Left;Bottom_And_Left value;InPC;Bottom_And_Right;Bottom_And_Right value;InPC;Left;Left value;InPC;Left_And_Right;Left_And_Right @@ -693,6 +705,17 @@ value;jg;Khaph;Khaph value;jg;Knotted_Heh;Knotted_Heh value;jg;Lam;Lam value;jg;Lamadh;Lamadh +value;jg;Malayalam_Bha;Malayalam_Bha +value;jg;Malayalam_Ja;Malayalam_Ja +value;jg;Malayalam_Lla;Malayalam_Lla +value;jg;Malayalam_Llla;Malayalam_Llla +value;jg;Malayalam_Nga;Malayalam_Nga +value;jg;Malayalam_Nna;Malayalam_Nna +value;jg;Malayalam_Nnna;Malayalam_Nnna +value;jg;Malayalam_Nya;Malayalam_Nya +value;jg;Malayalam_Ra;Malayalam_Ra +value;jg;Malayalam_Ssa;Malayalam_Ssa +value;jg;Malayalam_Tta;Malayalam_Tta value;jg;Manichaean_Aleph;Manichaean_Aleph value;jg;Manichaean_Ayin;Manichaean_Ayin value;jg;Manichaean_Beth;Manichaean_Beth @@ -929,6 +952,7 @@ value;sc;Ethi;Ethiopic value;sc;Geok;Geok value;sc;Geor;Georgian value;sc;Glag;Glagolitic +value;sc;Gonm;Masaram_Gondi value;sc;Goth;Gothic value;sc;Gran;Grantha value;sc;Grek;Greek @@ -996,7 +1020,7 @@ value;sc;Nbat;Nabataean value;sc;Newa;Newa value;sc;Nkgb;Nkgb value;sc;Nkoo;Nko -value;sc;Nshu;Nshu +value;sc;Nshu;Nushu value;sc;Ogam;Ogham value;sc;Olck;Ol_Chiki value;sc;Orkh;Old_Turkic @@ -1027,6 +1051,7 @@ value;sc;Sidd;Siddham value;sc;Sind;Khudawadi value;sc;Sinh;Sinhala value;sc;Sora;Sora_Sompeng +value;sc;Soyo;Soyombo value;sc;Sund;Sundanese value;sc;Sylo;Syloti_Nagri value;sc;Syrc;Syriac @@ -1056,6 +1081,7 @@ value;sc;Wole;Wole value;sc;Xpeo;Old_Persian value;sc;Xsux;Cuneiform value;sc;Yiii;Yi +value;sc;Zanb;Zanabazar_Square value;sc;Zinh;Inherited;Qaai value;sc;Zmth;Zmth value;sc;Zsye;Zsye @@ -1120,6 +1146,10 @@ value;tccc;8;KV;Kana_Voicing value;tccc;84;CCC84;CCC84 value;tccc;9;VR;Virama value;tccc;91;CCC91;CCC91 +value;vo;R;Rotated +value;vo;Tr;Transformed_Rotated +value;vo;Tu;Transformed_Upright +value;vo;U;Upright value;WB;CR;CR value;WB;DQ;Double_Quote value;WB;EB;E_Base @@ -1143,7 +1173,7 @@ value;WB;SQ;Single_Quote value;WB;XX;Other value;WB;ZWJ;ZWJ -defaults;0000..10FFFF;age=NA;bc=L;blk=NB;bpt=n;cf=;dm=;dt=None;ea=N;FC_NFKC=;gc=Cn;GCB=XX;gcm=Cn;hst=NA;InPC=NA;InSC=Other;jg=No_Joining_Group;jt=U;lb=XX;lc=;NFC_QC=Y;NFD_QC=Y;NFKC_CF=;NFKC_QC=Y;NFKD_QC=Y;nt=None;SB=XX;sc=Zzzz;scf=;scx=